dwww Home | Show directory contents | Find package

SQLite format 3@    e.c
£2À]
þ
©
FÏ_ö‘       ‚
…[tablechangechangeCREATE VIRTUAL TABLE change USING fts5(
          url UNINDEXED,          -- Path to document
          version UNINDEXED,      -- SQLite version number
          idx UNINDEXED,          -- Bullet point number
          text,                   -- Text of change log entry
          tokenize='html stoken unicode61 tokenchars _' -- Tokenizer definition
      )ƒu‡OtablepagepageCREATE VIRTUAL TABLE page USING fts5(
        apis,                               -- C APIs 
        keywords,                           -- Keywords
        title1,                             -- Document title
        title2,                             -- Heading title, if any
        content,                            -- Document text

        url UNINDEXED,                      -- Indexed URL
        tokenize='stoken unicode61 tokenchars _' -- Tokenizer definition
      )c''tablechange_configchange_configCREATE TABLE 'change_config'(k PRIMARY KEY, v) WITHOUT ROWIDg
))  tablechange_docsizechange_docsizeCREATE TABLE 'change_docsize'(id INTEGER PRIMARY KEY, sz BLOB)n       ))tablechange_contentchange_content
CREATE TABLE 'change_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3)!!5tablechange_idxchange_idx   CREATE TABLE 'change_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWIDa##    tablechange_datachange_datCREATE TABLE 'change_data'(id INTEGER PRIMARY KEY, block BLOB)StableweightweightCREATE TABLE weight(id INTEGER PRIMARY KEY, percent FLOAT)]##tablepage_configpage_configCREATE TABLE 'page_config'(k PRIMARY KEY, v) WITHOUT ROWIDa%%tablepage_docsizepage_docsizeCREATE TABLE 'page_docsize'(id INTEGER PRIMARY KEY, sz BLOB)p%%#tablepage_contentpage_contentCREATE TABLE 'page_content'(id INTEGER PRIMARY KEY, c0, c1, c2, c3, c4, c5)o1tablepage_idxpage_idxCREATE TABLE 'page_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID[tablepage_datapage_dataCREATE TABLE 'page_data'(id INTEGER PRIMARY KEY, block BLOB)ödöñçÝÓÉ¿µ«¡—ƒyoe[QG=3)÷íãÙÏÅ»±§“‰ukaWMC9/%
ý
ó
é
ß
Õ
Ë
Á
·
-
£
™

…
{
q
g
]
S
I
?
5
+
!



ùïåÛÑÇ½³©Ÿ•‹wmcYOE;1'        ÿõëá×Íù¯¥›‘‡}si_UKA7-#
û
ñ
ç
Ý
Ó
É
¿
µ
«
¡
—

ƒ
y
o
e
[
Q
G
=
3
)



       ÷       í       ã       Ù       Ï       Å       »       ±       §              “       ‰              u       k       a       W       M       C       9       /       %                     ùïåÛÑǽ³©Ÿ•‹wmcYOE;1'      ÿõëá×Íù¯¥›‘‡}si_UKA7-#ûñçÝÓÉ¿µ«¡—ƒyoe[QG=3)÷íãÙÏÅ»±§“‰ukaWMC9/%ýóéßÕËÁ·-£™…{qg]SI?5+!
ùïåÛÑǽ`˜€€€‚S_˜€€€‚R^˜€€€‚Q]˜€€€‚P\˜€€€‚O[˜€€€‚NZ˜€€€‚MY˜€€€‚LX˜€€€‚KW˜€€€‚JV˜€€€‚IU˜€€€‚HT˜€€€‚GS˜€€€‚FR˜€€€‚EQ˜€€€‚DP˜€€€‚CO˜€€€‚BN˜€€€‚AM˜€€€‚@L˜€€€‚?K˜€€€‚>J˜€€€‚=I˜€€€‚<H˜€€€‚;G˜€€€‚:F˜€€€‚9E˜€€€‚8D˜€€€‚7C˜€€€‚6B˜€€€‚5A˜€€€‚4@˜€€€‚3?˜€€€‚2>˜€€€‚1=˜€€€‚0<˜€€€‚/;˜€€€‚.:˜€€€‚-9˜€€€‚,8˜€€€‚+7˜€€€‚*6˜€€€‚)5˜€€€‚(4˜€€€‚'3˜€€€‚&2˜€€€‚%1˜€€€‚$0˜€€€‚#/˜€€€‚".˜€€€‚!-˜€€€‚ ,˜€€€‚+˜€€€‚*˜€€€‚)˜€€€‚(˜€€€‚'˜€€€‚&˜€€€‚%˜€€€‚$˜€€€‚#˜€€€‚"˜€€€‚!˜€€€‚ ˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚
˜€€€‚˜€€€‚˜€€€‚
˜€€€‚       ˜€€€˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚
˜€€€‚˜€€€˜€€€~
˜€€€}       ˜€€€|˜€€€{˜€€€z˜€€€y˜€€€x˜€€€w˜€€€v˜€€€u˜€€€t˜€€€sÿ˜€€€rþ˜€€€qý˜€€€pü˜€€€oû˜€€€nú˜€€€mù˜€€€lø˜€€€k÷˜€€€jö˜€€€iõ˜€€€hô˜€€€g󘀀€fò˜€€€eñ˜€€€d𘀀€c€€b€€a혀€€`였€€_똀€€^ꘀ€€]阀€€\蘀€€[瘀€€Z昀€€Y嘀€€X䘀€€W㘀€€V☀€€Uᘀ€€Tà˜€€€Sߘ€€€RÞ˜€€€Qݘ€€€Pܘ€€€OÛ˜€€€NÚ˜€€€MÙ˜€€€Lؘ€€€Kט€€€JÖ˜€€€IÕ˜€€€HÔ˜€€€GÓ˜€€€FÒ˜€€€Eј€€€DИ€€€CϘ€€€BΘ€€€A͘€€€@̘€€€?˘€€€>ʘ€€€=ɘ€€€<Ș€€€;ǘ€€€:Ƙ€€€9Ř€€€8Ę€€€7Ø€€€6˜€€€5Á˜€€€4À˜€€€3¿˜€€€2¾˜€€€1½˜€€€0¼˜€€€/»˜€€€.º˜€€€-¹˜€€€,¸˜€€€+·˜€€€*¶˜€€€)µ˜€€€(´˜€€€'³˜€€€&²˜€€€%±˜€€€$°˜€€€#¯˜€€€"®˜€€€!-˜€€€ ¬˜€€€«˜€€€ª˜€€€©˜€€€¨˜€€€§˜€€€¦˜€€€¥˜€€€¤˜€€€£˜€€€¢˜€€€¡˜€€€ ˜€€€Ÿ˜€€€ž˜€€€˜€€€œ˜€€€›˜€€€š˜€€€
™˜€€€˜˜€€€—˜€€€
–˜€€€       •˜€€€”˜€€€“˜€€€’˜€€€‘˜€€€˜€€€˜€€€Ž˜€€€˜€€€Œ˜€€€€‹˜€€€€~Š˜€€€€}‰˜€€€€|ˆ˜€€€€{‡˜€€€€z†˜€€€€y…˜€€€€x„˜€€€€wƒ˜€€€€v‚˜€€€€u˜€€€€t€˜€€€€s˜€€€€r~˜€€€€q}˜€€€€p|˜€€€€o{˜€€€€nz˜€€€€my˜€€€€lx˜€€€€kw˜€€€€jv˜€€€€iu˜€€€€ht˜€€€€gs˜€€€€fr˜€€€€eq˜€€€€dp˜€€€€co˜€€€€bn˜€€€€am˜€€€€`l˜€€€€_k˜€€€€^j˜€€€€]i˜€€€€\h˜€€€€[g˜€€€€Zf˜€€€€Ye˜€€€€Xd˜€€€€Wc˜€€€€Vb˜€€€€Ua˜€€€€T`˜€€€€S_˜€€€€R^˜€€€€Q]˜€€€€P\˜€€€€O[˜€€€€NZ˜€€€€MY˜€€€€LX˜€€€€KW˜€€€€JV˜€€€€IU˜€€€€HT˜€€€€GS˜€€€€FR˜€€€€EQ˜€€€€DP˜€€€€CO˜€€€€BN˜€€€€AM˜€€€€@L˜€€€€?K˜€€€€>J˜€€€€=I˜€€€€<H˜€€€€;G˜€€€€:F˜€€€€9E˜€€€€8D˜€€€€7C˜€€€€6B˜€€€€5A˜€€€€4@˜€€€€3?˜€€€€2>˜€€€€1=˜€€€€0<˜€€€€/;˜€€€€.:˜€€€€-9˜€€€€,8˜€€€€+7˜€€€€*6˜€€€€)5˜€€€€(4˜€€€€'3˜€€€€&2˜€€€€%1˜€€€€$0˜€€€€#/˜€€€€".˜€€€€!-˜€€€€ ,˜€€€€+˜€€€€*˜€€€€)˜€€€€(˜€€€€'˜€€€€&˜€€€€%˜€€€€$˜€€€€#˜€€€€"˜€€€€!˜€€€€ ˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€
˜€€€€˜€€€€˜€€€€
˜€€€€       ˜€€€˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€˜c˜€€€‚ð@ðØ̶« •Š€sg\PF;0&ûðåØÎÀµ¡”‰~peZN@5'
ú
ï
ã
Ô
Ä
¸
«

‘
ƒ
w
k
_
P
E
:
.
"

ùìÝÏ¾³¦™Œ€rg[M@3%øçÒŶ¨˜‰xhXI:(
ø
ç
Ö
È
»
ª

’
ƒ
u
d
Y
K
:
+

       ý       î       á       Ï              µ       §       —       ˆ       x       l       Z       M       ?       (                     ûîàÑô©œƒui\N?1#ÿóáÖǼ°¤–ˆznbVK@3'ûïâÓƶ¦–‰zk[N@-!
üñå×Ƹ«p`RD6)öæÙ̾°¡‘„seXL>&üîâÔÈ»-¡•…xk]PE8)0offŽ0occurrƒ0obse€
0o1~0nume|
0null_z0nowhx0not_v0normalip0nomn0no_l
0next_j0new_h0netf
0needld0nbyb
0namecU
0n1R
0mustbP0multipliN,0moz_items_annosL
0mostlJ0mosH0moduF
0modelD0minimum_B0migr@0methodo>0memory<
0medic:
0meani80math60mapl40malloc62
0maked00mail.0mag,0ltc*0loop(
0logik&
0locat$
0listl"0linearl 0limit_0license
0lesse
0leftm0lazi
0last_0language
0knowl0ken
0jw
0json1

0je0ita0is_"0ioerr_shmsó
0involð0intrî0interfcê0interbè0integeæ0int2ä0installâ0insertaà0informiÞ0induÜ0index_Ú0incoÖ0in5Ô
0inË"0implementoÈ
0immerÆ0ifdÄ0idx1¾
0i1¼
0hrº0hou¸0hip¶0her´
0headq²
0have_°
0hard_®0hal¬0habª
0gu¨0graphi¦
0gl¤ 0geopoly_w¢0gco  0functionež 0function_œ
0full_š
0fts4a˜0fruits–
0fromc”0frea0fouŽ
0formaŒ0foraŠ0foo‚0folk€
0fk~0first_|
0findfz0file_ox
0file1v0feedr0fastertp
0failon0extractel0extensij
0exploh0exitf0excud0excb0exag`
0every^
0evenl\0error_Z
0erX
0entryV0enlT0end_R0enable_nP0embeddN
0elL
0econoJ0eagH
0e6F*0dsqlite_omit_sD
0downsB0does@ 0document_>0do_<0disting:0discov80directo6
0diffi40devi20dete0 0descripto.0depi,0delete*0defini(0default_&
0decep$0db_rel"0database 
0data0
0d10current_
0criti0create
0cr0coun0correcto0coor

0contr0content_0containe$0constraint_0consta0consþ 0configuraü0concesú0compliø0compileö0compariô0commentaò0commanð0column1î
0codecê0clearlæ0clanä&0checkpoint_tâ0characteà0changeÞ0certainlÜ0cautÚ
0case_Ø0canoÖ0cancÔ
0callaÐ0cabÎ
0c0Ì
0byteaÊ0bypÈ0buttÂ0busyÀ0bugg¾
0bp¼0booleaneº
0blob_¸0binary¶0betw´0behaviou²0beg°0bef®0bea¬0bag¤
0b0¢
0aw 0automož0audœ0attš0ata˜
0assor–0asc”
0arranŽ0argvŒ0arbŠ0applica‚0applia€0api_~
0anq|
0annz0andex
0anam
0amef
0altertd
0altb
0allow_`0alld^
0aliZ
0ageX
0afterwV
0adeT
0adaR0activP&0access_readwN
0absL
0abort_J        0a0H096086;
08698
07806
06874      0602
05200
04ki.      040,
0390*
0322(      030&02684"
0220 02021020000     020
01ki
0168
0141
012001000  01000x08

00500000    ?0offŽùYùöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[VQLGB=83.)$ü÷òíçáÛÕÏÉý·±«¥Ÿ™“‡{uoic]WQKE?93-'!   
ý
÷
ñ
ë
å
ß
Ù
Ó
Í
Ç
Á
»
µ
¯
©
£

—
‘
‹
…

y
s
m
g
a
[
U
O
I
C
=
7
1
+
%






ûõïéãÝ×ÑËÅ¿¹³-§¡›•‰ƒ}wqke_YSMGA;5/)#ÿùóíçáÛÕÏÉý·±«¥Ÿ™“‡{uoic]WQKE?93-'! 
ý
÷
ñ
ë
ä
Ý
Ö
Ï
È
Á
º
³
¬
¥
ž
—

‰
‚
{
t
m
f
_
X
Q
J
C
<
5
.
'
 



       ý       ö       ï       è       á       Ú       Ó       Ì       Å       ¾       ·       °       ©       ¢       ›       ”              †              x       q       j       c       \       U       N       G       @       9       2       +       $                            þ÷ðéâÛÔÍÆ¿¸±ª£œ•Ž‡€yrkd]VOHA:3,%        ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)"
ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-&
üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖU”÷YS”èP”èO”èN”è
M”èL”è        K”à,J”à+I”à*G”à)F”à&E”à%D”à#C”ØKA”ØG@”ØF?”ØE>”ØB=”ØA<”Ø@;”Ø>:”Ø;9”©J8”¡d7”¡b6”š
5”š4”š3”™{2”’1”’0”‚F/”‚B.“ú[-“Ûh,“Ûf+“Ûc*“Û`)“Û_(“Û^'“Û\&“ÛZ%“ÛX$“ÛW#“ÛT"“ÛP!“ÛL “ÛG“ÛE“ÛB“Û>“Û;“Û9“Ó`“Ó^“ÓZ“ÓX“ÓV“ÓU“ÓT“ÓR“Ëk“¬R“¬Q
“¬N“¬K“¬J
“¬I  “œ~“œ}“œy“…F“…E“…D’ý]’ýZ’õr’îÿ’îþ’î
ý’ÖQü’Îjû’Îiú’ˆFù’ˆDø’ˆB÷’€_ö’€\õ’€Yô‘ÙRó‘º:ò‘º7ñ‘º3ð‘²Lecë‘¢zꑛ鑛葛瑓,æ‘“*å‘‹fä‘‹cã‘‹aâ‘‹]á‘‹Zà‘‹Yß‘‹WÞ‘‹UÝ‘‹PÜ‘‹MÛ‘‹JÚ‘‹FÙ‘‹CØ‘‹B×û|ÖûzÑûxËûvÉûuÃûsÁûqÀô¿ô¾ô½ô        ¼ì"»Ü_ºÜ[¹ÜZ¸ÜX·ÜT¶ÜRµÔk¢Ôj¥|œ¥y›ŽCšŽB™ŽA˜†n—†m–†j•†g”†e“†d’†c‘†`†\Œÿ‹ÿŠÿˆÿ‡ÿ„ÿƒÿ‚ÿ€ÿ~ÿ}ÿzÿvþ~uþ|tþ{sþzpþyoþwmþulþtkþsjþriþqh÷
g÷  fï/eï,dï+cï)bï$aï!KßYIßXHßUGßSFÐ
EÐCÐBÈ AÈ?È>È=È<Àp;Ào:Àk9Àf7Àe6Àb5À`3À^0À].À\,ÀZ+ÀY*ÀU)ÀS(ÀP'ÀN&ÀM%ÀK$ÀI#ÀG"ÀF!ÀD ÀBÀ@À?À<À:À8À5À2¸[¸Z¸X¸V¸T¸P¸M¸L¸I¨~
¨}¨z
™/  ™.™+‘C‘A‰Z‰YyxvÿtþrýqüŽúûŽúúŽúùŽúøŽú÷Žú
öŽúõŽúôŽú    îƒëƒêƒèƒçƒæƒ
ÞƒÙƒ׃   ´ƒ²ƒ¡ƒƒ›ƒe‚a‚}^‚zZ‚yU‚xT‚wJ‚vG‚uE‚t/‚s.‚r+‚q#‚p‚n‚l‚k‚j‚i‚h‚gò‚fè‚dà‚bÚ‚aׂ^Ö‚]Ó‚\Ç‚[Ä‚YÁ‚X»‚W¥‚Uœ‚T—‚S‚R‚QŒ‚P‹‚NŠ‚M…‚Lƒ‚I|‚H{‚Fv‚Eu‚Dt‚Ce‚B^‚A\‚@Q‚?O‚=K‚<I‚;G‚:F‚9E‚8B‚7?‚6=‚4:‚38‚16‚/5‚.3‚-2‚,(‚+"‚*‚(‚&
‚$‚!‚‚ý‚ü‚ú‚õ‚ô‚ã‚΂É‚Æ‚¯‚©‚¦‚
¥‚¡‚œ‚
™‚   •“‚l‚j‚f‚I‚@"}|zy
w   vuûtúrøp÷löjõgóeòcîbêaé]èZçYæXãVÞTÝRÚNÙJØI×GÖEÔDÏBÎ@Í>Ë:É8È4Ç0Å-Ä*Â(Á%À$¿#¾"½!¼»¹·µ´³±°¯®¬«ª©¨~§|¦z¥y¤x£u¢r¡n kŸiœg›dša™^˜[—X–T•R”O“J’F‘C@>Ž=;Œ:‹6Š2‰/ˆ,…*„'ƒ&%z#v"t!l jfeca_SNLI
H
F    DX¸ZÞ^úóìåÞ¡•‰~rfZOC7, üðäÙÍÁµ©‘…ymaUI=1%

ö
ë
à
Ô
È
¼
±
¦
›

„
y
n
c
X
L
@
4
(


úîâ×ËÀ´©’‡|qfZOC7+      ýñåÚÏĸ-¡–Šsg[OD8-"
ÿ
ó
è
Ü
Ñ
Å
¹
-
¢
—
‹

s
g
[
O
C
7
*


       ö       é       Ü       Ð       à       ·       «       ž       ‘       …       x       l       `       S       G       :       -                      úíàÓǺ®¡”ˆ|obUH;/#
ýðãÖɽ°£—Š}pdWK>2&ÿòåØ˾±¥˜ŒsfYL?3&
õèÜÏöªž’…xk^QD7*õèÛÎÀ³¦™‹~qdWJ=0# üïâÕÈ»®¡”‡zm`SF
‚ƒ1
‚ŒA
‚ƒk
‚ˆU
‚‚E
‚–W
‚„0
‚¹
‚›8
‚Þ
‚’x
‚…W
‚Q
‚“9
‚»E
‚n
‚™:
‚p
‚
‚w
‚“?
‚š@
‚
B
‚       ‘4
ŠV
‚£‚¥F
‚‡Q
‚”
‚‹‚‘<
‚†
‚‹p
ŸG~˜T
}¥
|
{
z-R
y‰k
x‰z
w„$
vœ*
u£8
t…6
s
‚>  r5     q!5     p Y
o„d    nb
m‚    l\
kƒB      j
8     iS
h      g{
f‰    e\
d ƒ~
c
b#
a    `H
_‚    ^
H
]1    \t
[X
Z
Y„

XB
WŠ
V
ƒ
U
T”

S‚(    R}     Q*
P‚      OX
N ‰    M3
L
V
K      
J„    I{
H ‚
Gƒ@    F:
EŠ
D‚X
C)”X
B‚N
A

@|    ?W     >     = .
<h
;
 
:…g
9‚E
8…j    7s       6 K
5S
4T    3 
2
?    1S
0<
/B
.      -"
,†N
+‚    * 2
)ƒ
(…
'
&2
%‚t
$L
#„J
"‚"    !      S

‚<
@    %
 ‚r
‚Y
…d
|
…)
‡X
d
‚
h    O
'    4     N
‡    z

d
B         
2
          ƒ4    *

‚V

ˆ
‚|

‚
‚C
ƒ(    /
C
~‚(
} 
|  *
{    ‚~
z  l
y
„U    xa      wX
vL
u       
t‚$       sg
r     q  &
pQ
o     n!-
m:     l}      kG
jƒL     i
2
h
|
gw
f
‰
eW     d=
c‚w     b  q
a     `%
_‚     ^  E     ]~      \  [
[
ZK
YP
X  '    Wp        V6
U.
Tk
Sr     R
Q     Pl        OY      N=      MY      L.
K1       JC
IB       H  }
G0     F5
E‚
D     C
B
A‚        @9
?  „1
>ƒ
=7
<‚j     ;Kq      :7      9      8-      7c
6  ‚+    5J      4  -     3*
2"
1
0     /<      .9
-ƒ       ,  "
+‚ 
*„a
)„|
(‚
'ƒA
&„8
%…S
$£C
#’u
"‰:
!‚u
 †       
 
†
„q
F
‚f     0
‡^
„^
‡Q
…G
ª8
–{     {
5
˜y     L
ˆ
‹/

R     .
‚L

Š
        „o


ƒz
Š
‚d     ]—z\•¶[’ÖTZÐY‚
ÓßÓversion ?rankbm25(10.0,10.0,20.0,20.0)
ùù‚0L

«ûñçÝÓÉ¿µ«¡—ƒyoe[QG=3)÷íãÙÏÅ»±§“‰ukaWMC9/%
ý
ó
é
ß
Õ
Ë
Á
·
-
£
™

…
{
q
g
]
S
I
?
5
+
!


ª„€€€€K©„€€€€J¨„€€€€I§„€€€€H¦„€€€€G¥„€€€€F¤„€€€€E£„€€€€D¢„€€€€C¡„€€€€B „€€€€AŸ„€€€€@ž„€€€€?„€€€€>œ„€€€€=›„€€€€<š„€€€€;™„€€€€:˜„€€€€9—„€€€€8–„€€€€7•„€€€€6”„€€€€5“„€€€€4’„€€€€3‘„€€€€2„€€€€1„€€€€0Ž„€€€€/„€€€€.Œ„€€€€-‹„€€€€,Š„€€€€+‰„€€€€*ˆ„€€€€)‡„€€€€(†„€€€€'…„€€€€&„„€€€€%ƒ„€€€€$‚„€€€€#„€€€€"€„€€€€!„€€€€ ~„€€€€}„€€€€|„€€€€{„€€€€z„€€€€y„€€€€x„€€€€w„€€€€v„€€€€u„€€€€t„€€€€s„€€€€r„€€€€q„€€€€p„€€€€o„€€€€n„€€€€m„€€€€l„€€€€
k„€€€€j„€€€€i„€€€€
h„€€€€ g„€€€f„€€€€e„€€€€d„€€€€c„€€€€b„€€€€a„€€€€`„€€€€

HÄúðæÜÒÈ¿µª –Œ‚xmcWJ>0#    ûòèÝÓÊÀµ¥˜Œ‚ug]QC5)
ö
ì
à
Õ
Ê
À
´
«
¡
“
Š
y
b
O
D
8
-
!

ÿôéÜÏÄ
       0xfi˜      0withi–    0whene”
       0ves’
       0usa      0unixŽ
       0togŒ
       0tigˆ      0thei†
       0the€      0table|
       0subdz      &0sqlite_stmtjx      .0sqlite_default_cv  "0sqlite3_lo  0sqr
        0smallesp            0ses 0rtl        0replij              0ranh
       0procf
       0postd      0page_b              0ord`       0opera^              0onc\        0off 0nrX         0newV       0miscoT
     0malloc6R
   0limit_wP   0json_N              0isnL
       0interfeJ   0index_H             0inaF       0impliD     0handleB     0function_@
       0forc>               0foo 0fk:         0fam8
       0exit6               0ens 0e72
        0disable0   $0dbstatus_st.       0d, 0contex*
    0compile(   0collo&     0change$    0callb"              0byp 
       0bitv               0bal        0asc        0app        0ani        0alt
       0addi               0acc 0a1         091c        0657
               039          0250        0120       °ç   \ûöñìçâÝ×ÑËÅ¿¹³-§¡›•‰ƒ}wqke_YSMGA;5/)#ÿùóíçáÛÕÏÉý·±«¥Ÿ™“‡{uoic]WQKE?93-'!      
ý
÷
ñ
ë
å
ß
Ù
Ó
Í
Ç
Á
»
µ
¯
©
£

—
‘
‹
…

y
s
m
g
a
[
U
O
I
C
=
7
1
+
%






ûõïéãÝ×ÑËÅ¿¹³-§¡›•‰ƒ}wqke_YSMGA;5/)#ÿùóíçhtml3.40.1 Change the algorithm used by SQLite's built-in pseudo-random number generator (PRNG)
     from RC4 to Chacha20.
H
9‚Ureleaselog/3_40_1.html3.40.1
 Provide the new <a href="../compile.html#max_allocation_size">SQLITE_MAX_ALLOCATION_SIZE</a> compile-time option for limiting
     the size of memory allocations.
‚       9„releaselog/3_40_1.html3.40.1      Enhance the <a href="../c3ref/strglob.html">sqlite3_strglob()</a> and <a href="../c3ref/strlike.html">sqlite3_strlike()</a> APIs so that they are able
     to accept NULL pointers for their string parameters and still generate a sensible
     result.
9‚{releaselog/3_40_1.html3.40. Enhance the <a href="../lang_vacuum.html#vacuuminto">VACUUM INTO</a> statement so that it honors the
     <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous</a> setting.
„9‡yreleaselog/3_40_1.html3.40.1 Enhancements to the <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> statement:
     <ol type="a">
     <li> Columns in non-STRICT tables with TEXT affinity should not contain numeric values.
     </li><li> Columns in non-STRICT tables with NUMERIC affinity should not
          contain TEXT values that could be converted into numbers.
     </li><li> Verify that the rows of a <a href="../withoutrowid.html">WITHOUT ROWID</a> table are in the correct order.
     </li></ol>
‚J9„Yreleaselog/3_40_1.html3.40.1 Security enhancement: <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigdefensive">SQLITE_DBCONFIG_DEFENSIVE</a> is augmented to prohibit
     changing the <a href="../pragma.html#pragma_schema_version">schema_version</a>.  The schema_version
     becomes read-only in defensive mode.
x95releaselog/3_40_1.html3.40.1 Add the <a href="../c3ref/value_blob.html">sqlite3_value_encoding()</a> interface.
ƒ%9†releaselog/3_40_1.html3.40.1 A new typedef named <a href="../c3ref/filename.html">sqlite3_filename</a> is added and used to represent
     the name of a database file.  Various interfaces are
     modified to use the new typedef instead of "char*".  This interface
     change should be fully backwards compatible, though it might cause
     (harmless) compiler warnings when rebuilding some legacy applications.
‡79Ž3releaselog/3_40_1.html3.40.1 Query planner enhancements:
     <ol type="a">
     <li> Recognize <a href="../queryplanner.html#covidx">covering indexes</a> on tables with more than 63 columns where
          columns beyond the 63rd column are used in the query and/or are
          referenced by the index.
     </li><li> Extract the values of expressions contained within <a href="../expridx.html">expression ind    [–   Z–W   Y–3   X–   W•o   V•J   U•/   T•   S•   R”h   Q”L   P”1   O”   N”            M“o   L“S   K“:   J“'   I“   H“   G’o   F’]   E’I   D’2   C’!   B’   A‘}   @‘f   ?‘R   >‘:   =‘"   <‘
   ;t   :a   9L   8>   7.   6   5   4q   3\   2G   14   0    /   .Žv   -Žb   ,ŽM   +Ž:   *Ž'  )Ž   (Ž            'v   &g   %X   $G   #8   "'   !    Œ}   Œl   ŒY   ŒJ   Œ5   Œ#   Œ   Œ   ‹o   ‹Z   ‹G   ‹1   ‹   ‹            Šv   Šd   ŠV   ŠG   Š7   
Š(   Š        
‰v            ‰d   ‰S     ‰A   ‰.   ‰   ‰
   ˆx   ˆc   ˆS   ˆ?ÿˆ.þˆýˆ
ü‡}û‡jú‡Yù‡Fø‡5÷‡$ö‡õ‡ô‡ó†tò†nñ†eð†Zï†Nî†Ií†@ì†?ë†6ê†*é†)è†ç†æ…zå…oä…aã…Uâ…Fá…9à…+ß…Þ…Ý…
Ü„~Û„rÚ„gÙ„`Ø„SׄBÖ„4Õ„'Ô„Ó„Òƒ|уmЃ`σT΃E̓7̃.˃'ʃɃȃÇ‚~Æ‚rÅ‚jÄ‚ZÂR‚DÁ‚5À‚/¿‚¾‚½}¼m»cºW¹H¸=·2¶%µ´³²o±]°M¯=®,-¬
Ð   eúôîèâÜÖД‹‚ypg^ULC:1(
ûòéà×Îż³ª¡˜†}tkbYPG>5,#
ÿ
ö
í
ä
Û
Ò
É
À
·
®
¥
œ
“
Š

x
o
f
]
T
K
B
9
0
'



úñèßÖÍÄ»²© —Ž…|sjaXOF=4+"þõìãÚÑÈ¿¶-¤›’‰ukaWMC9/%
ý
ó
é
ß
Õ
Ë
Á
·
-
£
™

…
{
q
g
]
S
I
?
5
+
!


       ù       ï       å       Û       Ñ       Ç       ½       ³       ©       Ÿ       •       ‹              w       m       c       Y       O       E       ;       1       '                            ûñçÝÓÉ¿µ«¡—ƒyoe[QG=3)÷íãÙÏÅ»±§“‰ukaWMC9/%ýóéßÕËÁ·-£™…{qg]SI?5+!
ùïåÛÑǽ³©Ÿ•Š€vlbXND:0&þôêàÖ̸®¤š†|rh^TJ?5+!
ùïåÛÑÇ‚_‚^‚]‚\'‚["‚Z‚Y‚X‚W‚V‚UH‚T‚SE‚R&‚Q#‚P ‚O‚N‚M‚L‚K‚J‚I
‚H‚G‚F‚E
‚D‚C*‚B‚A‚@‚?
‚>‚=‚<‚;'‚:"‚9‚8‚7‚6‚5‚4H‚3‚2E‚1&‚0#‚/ ‚.‚-‚,‚+‚*‚)‚(  ‚'
‚&‚%‚$ ‚#/‚"‚!
‚ ‚‚‚‚‚-‚‚‚‚;‚‚)‚‚‚‚ ‚      ‚‚#‚
‚‚‚
-‚       ‚‚;‚‚)‚‚‚‚    &~+}   |       {z#yxwv-utsr;qp)onmlk!j4i9hgfe'dcba` _^]\[!Z4Y9XWVU'TSRQP0ON MLKJI!H4G9FEDC'BA@?>-=<0;: 98765!4439210/'.-,+*0)(-'&0%$ #"! !49'0-0
 
       !49'~
}|{0zyxw
vut
srqpon.m
lkj0ihgf
edcba
`_^]\[.Z
YXW0VUTS
RQP
ONMLK
JIHGFE.D
CBA0@?>=
<;:98765
43210
/.-,+*.)
('&0%$#"
! 
41q*

        
4 d•+   c’W   b   a/   `Š[   _ˆ   ^…3   ]‚_
ôôversion
ÓîÓ
8…I„/&Œ†·,-Z¶¡

""ŸV˜€€€€¿0Ñ00‚7`†/pg‚Q‚>V4P‚‚0%ƒrMR†9;„L‰
„V‚<O
=‚X)‚
‡;‚T†4s/ƒ;:…R{d
ƒ>FO‚ /w"~  @+‚„
ƒ8„OB‘P1„!TI‚qRm„'QE#
T]. 1E
%   NUK!!‚'(5‡

E|bƒH\
R5:bQ#aaG#[bƒtWƒgLz
ƒ\;†8KŒo
LE  ˆbGxy{‚„]…J
‚@.R‚( <.=.Jh1Io`o,‚#,k
†8‚@‚<‘p…‡L*„*j‰…ƒ‚!(7‚Kƒ#‚rx<_ƒ60!~       
*BŽ
[
‚
w:M„Cˆˆ(T@n…$
ˆc%…4(8$((‚0r†:•K‚.ƒQˆF?
YQ1‚„U‚%P       |ƒm9
t;@ƒP†}‚†Vh„%    ˆaN…RN…NW
‚#‚p7!ƒa}I „
5"n†$‚\`ƒ…QƒŠD>ŠA2‡$5‚<„j‚…

3.
9{491$"4‚Wc ƒ@y9„J/…†ƒ8e
C/‰Y„(!‚D„6JYL qy†g†#bƒ4Z"‚g;y      n‡cƒ$Zb…^s‚z‚;’Zq\‚2‚Kª(d#/^‰
    $WQ‚0
H„1RJ             
       –}(Œ‰'=
…CF35   ‚$‚;v
21„v4‚‚Wƒ6
*\ :    3ƒ…1#F       ƒŠb          =h‡e‚Cwhˆ&>#7''''*'''''''''GN''''''''C'''''''#NZ7>'''''ˆAI…`ƒ~@‚‚^ Ku‰
&.ƒJ‚!v†-^Š"‚
    E#%
,<<)
-
-
)

-
<
-
:
-
-
-
-



@J?@J>I$$')
-
-





)


-
-





@%'>??I,
A
A?-

-
‡s









 …Dˆ$3&+B95,A(‚<DE$7‚^h),E?rG
NV†r-T; 
\9(42„-‚j<‰ 9/TY2qK=>xY ŠO‡A‘e,‚MRB-‚;…v
 /
,‚(3(‘[$(m(#34N=*P‚CG…7%hb%†Q9…<Žm3T„6ƒ‚C†'ˆ
t†{Lƒ3‡AIƒc…8F<v‚*‡f–F9ƒs5‚<g        ;8."%0D,DP &&3  dC‡9]    ‚"„(Nƒ\ƒM‚Pƒ'/.~a‚_'‚Q 6`3$0:R_3b';|7[7:95; ''7Z
A9 A       KI6,20I
~#
&,9@ZdW‡"6m$„w‘u…†zˆw‚Tl%+h K%974‚r†H„b!‚B‚&ƒ6‚*ƒ)4‚b<‡/
ƒb
ƒX\&%L.ƒ|)L{
%*‹<au"Y„…"ƒ…3$‚.=Œt+M‚)K+-XZˆy,C‚†NQ
9            ‚?5N4Aƒq†„<%‹R,†|
)@†Š/q;…Dl†x1J‚J
#c*a/
Z%C )


&

X.[
+ƒ‚$*Tˆeƒt„p. nHy‚s‡7ˆR‡™\cy
‡D…rMS‚       :=}?NXd…‰sŠ3$ˆYŒE“c;6%-U'˜2oŽƒRv†ZŠ>„ƒ~†Z$a









„^‚†#uH*‹5‚]K„Jy„|P
Y";2k        "'NˆWf4c[k^.‚"A‚…ejQ'-ƒƒ …`6-‚





ˆ%‚]…Qrƒƒ‚n
„yFŠO[/fT$‚ƒ„o‰ ƒ‹0‚.ƒci*‚\&†#&;…S.!"‚n+OOPdT\V(„MoL::ˆ‰`…Y9<ˆ9NW‚0%_ƒg‰…="4‚@‰SƒVŠ,
ƒƒ   5C:     8<      ;       6=8B    :       <F     5C#?B  3&b  C       65Oe    
!      N       &f

"!‚k
 <8      98AA    ;G=B    <       
     <Z      98Ok    ;Gl   <       ‚|
              ?       0                      †
           5                
                                     :
          \2h        o      S       $       &ƒ[                             ‚6    5D      9>AG~   7       <G      9       7B      8H      7E      9       A:      @:D7CB  ;       :       <       Q‡/6  5D      8@      ;       7       2       2      2       9       >:      $7      9       >|ArB>7        ;       :       <       e       ra|A‚`
 <8      98D     u;9     |       :     :       :F{     B<      @ƒb6   5D      8=      m       ;       6@A=7B B:      <       „K
     7741    98D     tEF‚ :H~A  B<      |
     <8      98EF    ;D@     :C8     AG      A       =FAB    <       ƒ~
     :%F66   97EF    @8E     :       :       :D      @96G98G >@      ?FD     ?<G     <       „!
     :%F66   97EF    :       
!!ŸW˜€€€€¿2‘Ï@8E  :       :       :D      @96G98G >EF   :AD     ?<G     <       ‚:     9A      nO8C6      ;7      8=E@          :F<F    <       ‚;N     n    ?      6       ;7      8=E<        :F<F    <       ƒ?F  oG;    8       9       r8E    6     7E      ?<F     <       ƒƒeHƒ(/$
U<Q~86›QQ‡t/wH‹g1‘eŠ•‹t‡^…7‚TƒB‚F       ˆ
Špƒ1’C-Ž+‹P9‰]{_~„Z„+
ˆ1e$KŠ<„~(ƒB!‚T
x:†}8w  {+"‚\:T,‚.&‚M2Žös‚<
*„;‡Zb*j…ch}‚!(
‚I
x‡e]*.`0!~ 
'Ÿ&
„$
I%Z(8$((n‡ZY"‚.fi?
YQ1‚%Pw|‚49
S;(A;$
…hƒ8   ƒ  N…RN„NW
‚!7!
‚>qI    ƒ5"n0=`j‡8#ƒl
„_‡_A25MH
3.
9{491$"4p@c ƒ@y9„J/…†ƒ8e
C/‰Y„(!‚D„6JYL qy†g†#bƒ4Z"‚g;y    n‡cƒ$Zb…^s‚z‚;U‡[‡h
H
8(d#/*<‚j
      $WQ‚0
H‚WRJ         
       M(   †=
‚ F35       
‚
tvw21.‚O4‚‚Wƒ6
*\ ‡?
3
"#F                 ‡Y‚

—7h…r&>#7''''*'''''''''GN''''''''C'''''''#NZ7>'''''®oŠ B     E#%
,<<)
-
-
)

-
<
-
:
-
-
-
-



@J?@J>I$$')
-
-





)


-
-





@%'>??I,
A
A?-

-
‡s









‡ƒ        
A3&+Ÿ2G
NV
„-6; 
\9(42„-‚j<‚A9/TY2q$CK=>xY ŠO
v‘eHS-o~
 /
‡N      B3‡k(…b[$(m(#34N—4$‡gK
E&
5%٤    
B¾D
P,;Ny?Ÿ"
‚/®PKe3N?/.Ÿ}"6mO‚"wc        
ž`!‡‚@hT64][)
‡f9s_
N‡8¶[
‚2@
["       
‚3‚n„6‡[ƒi+1‚K+-‡ƒ8‚J,C‚‚7Q
9               5I‡Q*NI:.X
ec—r‡!<—3T‚$‡^[…^;6%-J‡S'3
‚n‡W.„&-Z$a









h‚‚@uH*
' v]KlJ‡MD‡P
§f4cV=‚"A‚ƒ^jQ'-‚p‚4‡]6-Lgb„$KƒƒU
JcO4/aT$g‚j+,F‚.
'c-4
‚6&žy‡ƒƒy"4‚:-—‚RV‡dF=(//
0U‡k
gQZ‡3
SƒhMb/H       j—/C‡eC

m       zR M        l‰cƒ1‚.CF‚u
9‚
{_Zž~

S
(!‡H;E000
Š‡O4ooK
ƒAƒp4„…„> ^† Œ=?:<E{@GDl;@”
B„Pdd‹glqnll`
qqŠ5llkqf
qqqq9 „N‰±]XŽ
        
      






…_
‚Œ9‡      ‡±pk–aŸ
Xƒ ¦} L?:<E{@GDl;@å;Bƒdd‹glqnll`
qqŠ5llkqf
qqqq9    åIFŸÃƒ>âL'‚bXƒ5
        
      






§7¾@‚i—:VÝE0’Zg„.@;

'„,ƒ3ƒ‹=Œ—m
Ÿ%‚       &©“bƒ3r
…
h.Dˆ7…„tŽ,4@;

'‡h%
o,„²;špƒ<
!!ŸW˜€€€€¿2¥        •ôf6Œ_gIåEa
h.D>—7:00000‚a‡(…9{µnv†ã|00…&†vŽ,ˆÕ‚V
0000000001‚
‰L‘¸Xbc614e…301‚†‘¸'95367431640625‚‚
‘¸]1….†wŽ4ˆÕ‚W1126‚
‘¸2…6†xŽ<ˆÕ‚X12‚!”ÕA3457ƒ
S˜Ø1‚‚ “É0‚A
‚+“É)
 0‚A
‚&“É)
23‚j…_–‰);25‚‚/“É$50‚‚4“É)1‚7\
„QW709‚ˆ>”Õ      2a‚È/ü‚R4‚‘0000‚r
‰Y–Çd
„1‚‚88ƒ'—ÄPO1ƒ0‚U‰…D„Z6mpe‚ƒ_=
    „&…›‡
ƒn‚0“*a…n„

„<ÏUiA‡Q‰J
>“;™>…WpD
¯       T„$‡m›5TDƒ34NˆQƒgu…2ˆ3…%hV>       3H              H   pHˆ…HK‰g2ˆ;ƒd,‚n}„T„BqAƒ|1T†:+7‹6N$‚4‹qƒ…hˆmJ…oRšVŠ‚vŒŠ0:„‡hD#‚^%Y‡D†4VŽk {‹7”U«*¹>¨]Š8ƒA…b†-¹ŽCe9
ŠN ‡(Ÿ3“‘*’n³9‚|<ƒ>MŒ9‚fu‡{„RŽö‚.
,
>—+
‚VˆJ'       X…xA—6—ƒz]Æ—s—‚[Q}D
“†N„$‡mŸ…#Dƒ34N‡*§
:í0       ‡eGUiÕ‰TŸ!U‡mpK^‚H„‚t‡nŸ‚9H‡‚‡ƒsGR®pŸ†-‚0m¦Vƒbe9
å‚n‡p
#X
‰\Ÿ$!X‚6‡H>23456789 l¾Cj5‚“Z6ƒ …—û$3874d252ac44861‚
•)£q
“2‚
•-£q
“2[‚`ƒv‚H*NˆH4wª7‡Z,‚b‰~„:†

†‚q†
‚f¡Qƒj—œ&‚‚ƒQ&ýx‚“m…|X‡_’w±$q˜Œ
?ˆ„Yƒ!ZP3IN:m   BjQ8n    †Œ}ˆ
(ˆ‚Tˆk.m„B‚Oƒ~†'R&‘x      –36„$9¥Uœ)‡N7ƒZ„K‚k‚B”W†.
^0…]’iQŸlˆ
‡xŽ4ŠkŽöƒh„‡‡`
      ‚®q&§…5Ÿ‚"‡I
ÎO“m‡i;C—0‡c†{q†MŒ„e‚]΄Ÿ#
«~LÆ `ù†.§
„}0§5Ÿ8¶]Ÿ-[‚>—
ƒ100‚‚130‚‚S4ƒ…s—ãSd7be94d7‘(¶53† X
‡Rˆ)ˆž
$†kƒE‡O
‚3±2†’R
*fT              "     $&m    ƒ
(‡4*‚!"0’‚2†3V(‚i„GƒPi:k;c`‚†=„…3„R™2$’F‘
n.Ž      ’l    …Á ‰;ŠWOJ8
bUf:–3s
%¦Aô‡c
Õ‹D§‡        †…JÚ[q»@|P0Ýg#‚;ÆÆ‚®luH¦_‚nJ8
bUf‡m‡>Õ—!u50‚‚K4ˆ
1Z‡P‡†‚¡WPŒ[‚‚
X‡qƒP¡L…!
Nˆ‡M…ÀWŠVj†o‚l„c…{XŒjM’t»P    9fˆ
“h99&
9ieSP+Y             '(!‚>ˆ4†+BƒF4ƒƒ-†&;ˆX‚B‚O^!-
‘uƒR„„ª-Jƒw‹v(†d”#KJˆ„„7@‚VE.V‚_*‰eŒt”T’v
‚5¤KŸ;§]‚zŠ±ZˆLk„n+,+D
‚Œ6½_‹3‡Mß_x…H'žg„Šm†D
‚OV2Ÿ%ƒ‡gI=§‡K
 Õk…$‚l„c‡i:
-—-‡‘'„gýGœI¾60ND§§…Ÿ$Ý‚W§4s.¦f
‚2kƒ@+,+L>¾\d— L—:'
.x*wc
 he‡MK4701‚ˆG”Õ6‚¬ÒªI8‚‡G‘þH5?†D„tˆA–5œ*„Ç"Ž¤`S»O¢F&¨]„,‘n$(4H#.
  ƒOLI]              1wC   -               j-nh
„Q @$ƒrOmˆ@†$†l4~†j!‰Ðla*šo‚02sL™[Œ3H‹eB+"!!

‡a
!…ƒ\†
((ŸP˜€€€€¿$˜–20‡ „y™‚yÒO$       ‰„A„&ƒ(qƒ3k„f%o‚…J„)#Ž„$iŽþ#—4.åEÕk£S§‘&ƒfFu‡E‡j†=$(4H#‡c,œ#GÝ]®s6>„;œƒÝWŸ‚/‡T
[
‚0k‚lf%o‚j¾9!¶=r¾500500}’t¶VG8029‚ˆC”Õ9872‚ˆ,”Õkwf43be8fdda9f‚—ù‹(6<Š
ƒw’@‡M‡…k7ŒZ‚Šj‹÷!£š<
d    –a£Y¯.‘A…ŒA       Œr-G‡(Z,        &'m
1\9     \s 7J%hD‰GT,…2‚~Sƒ%KŠL‚(*9„#ˆb,‚h† „„Rˆ$†?†‘?‹L‘a†Y8‡^ƒ…/…52…1ˆYU5S(¨^¥l‡
5NŠ;†*.}     









´fC8"›Š     ‚V
…IN˜)†5Ìy
¯…C‡‚DŸ˜®o”@a£Y§…JU†…Ÿ(Æ‚`í/>—4    Œ)Æ-
/΂—0  ¾ƒt.Ÿ"MPVŸ@-¶=¾5
U— ‡wd‡XQ‡fPŸ‚7¦…50„~—6H287‚‡”ÕkJ1‚…|25Šj53…,—6v44‚Žhù‚u7y
…+—u8‚‘[7ƒzŠ˜u† ˆ‰6]E0@„`… ‚„E¢d‚Hq
Ž0…T’u½~ 
'Œi‚¡>0‚        ‚F AcJ‚†
‚TB  ‰„cŒSƒ!‰f…j‚4'6i¿Dƒ„p‚U†&‡|’jr‚AVƒv„pz–†{¯y
ŠFƒ‹f‚5²'‚R]‹VË|ƒ—#Žö|
=„ZÕx‚z¢d‚Hq‡p
D‚X‡.‡“UƒcO
G8³„‡/Bƃ<®m3Õ‚JÝg$í‚JOÝ‚l¦F„‚5íB‡TM‡"n      žnU4734‚ˆ5”Õt08†8
„8„^„u†
Š=’q‡@œ‡nÏT‰‚l†
‘8”
¥B‰I=TB“?‚s‚EˆUƒk
-n…6‡P…)VKeKI  AJ5O‰k"Œ|†~†,‡{@Pm8‚8ƒ‚L{ˆqªTBƒx‰d& 1‚‹ˆbP‡Y…G…;""†s…ZŽo ?Ÿ‹;!ƒD7«.
W¼9z‹3
Š<ƒE       ¬dœ^rƒ1ŠRj›Š ‡L#éa&p xeµƒˆI/üj
ƒyT”‚‡‡.®#ýmõY—8]:Æ1k¶.Ÿ—2    
7‡‚=H‡hU‚p‡Y

<Îil¦…-Æ$U§c#‚J%vK
\fd‡(9„Q‹+˜y…F„m†  ‰7
P;V     O{
˜PŸC
Mˆ……Aƒ#
ŽP*ŠU‹[…SŸC       ‡*Jv0j19c&xP',&s[b

Œz‘Uƒa‘S3Œu1†ƒ
ĩ9
©z]F‚x„X“g…„7ž&ƒvŠq‡tƒGXV„†C$„`«WÆDÈ%‚2
‡ÄrŠSƒ‹dd[…`„*
ÕY    ‰w¢¥tE—„[‡…‡_H<®J§      ƒ#ƒ#®Š—‚W‚À„å-—‚J¯]퟇6¾)
8o{C¦3d[§8Ö   Ÿ!a—'‚Œ
lwai‚©ù†challeng~ƒ
¾h
ndeli~
ƒ¾documentú¾WeˆI¶ƒl9‚Ekab1ac75‚•n£“P
9‚•j£“L1f‚–B£”$
511‚•n£q’xnd‚•n£q’tng‚–F£”(
nonorecommend‚”Sùˆ`psow‚ŠQ•»‚ithe‚
x$‡?•-—b
—ÄW
;00˜Gm‹X?-Q1“œ$
     ˆ½]
‰a?žt™1ýâ:…¿]00000000000001‚‰9‘¸E1~
Ò#
£8¸$¾6
#ž
Žj2Ò£(#%·¾žŽZ4Ò ¾8Ò#¾80‚„2Ý1~…j…|Çi
?œGvˆ½]ƒs…|ž³Ÿc†œLqâN^2‚Çn•/fŠUr
¿d¤(ˆfÜQ³ •/fŠU†úr
ƒ£u‰nˆf3…V4‚Çrݳ$5ƒ       ¤7‡.9³D—û8‰}‡.9‚‚;…D

„&…y„A  
%X)'QB     
""ŸV˜€€€€¿0®00x08‚Çu—"ÝX³'—"Aƒ¤F‡:!—û8Š‡:!c‚
5PdüYdƒ    ¤U†H~—û8Š†H~10‚Çx—RÝX³*—R000‚¿G–ׂq234‡‚ed9øz¾g¾‡20‚
`“à^ü‚œ‡l†ã‚5f‚…•»$P30‚“‘˜‡j77f0682ƒ   ç-‚8—û19
3ƒ     ç/‚*—û3-41‚l|–˜uw63ƒ       à`—û‚7903a0‚±*‡ŒSˆb700‚±^ˆ‹W‰^1380‚æ0f1ac0‚®afffeff‚¤%„ù7‚σfff‚
‡žBÝò5œ’O8000000000000000‡a0‚
4ýX1ƒà_—û‚c1‚lu–˜upd5ƒà[—û‚7ƒ  àa—û‚9ƒ  àZ—û‚f9ƒ à]—û‚e†h8
•.ýff‚
”ýQf†i87‡p„ü[~fƒ
„
e‚t
¿!–×X
‚K1tS4^7jˆz‚*„:ƒpƒZ‚
"†„†>>6‚*ƒ#3)Š1"ƒQ7†h’P†6‚[.‚sR‚`#
5ƒ
„CLb„Jhˆ
 ‚U‰ Y      3‚3
      g
W…0Y,ˆ6(„]+%„#)‡lz]lyq:[
,")%zm9‚x
B<
T
„om   O3      ‚0^
B‚7‚_.8†?AŒ=
F†gƒWy  ‚;ŒE‚{‚[g„$‡ 0‚HXP)"I`h:‚/$!'K…I\1<R`
ƒ,‚V‚D‹’)M‚*‚6Jˆ'ˆX‚}k6*0†;*aO†a„Na:Œ
lRZ †1!tƒ@mw„'8%@(!„W3‚o8!‚†.ƒ&…qˆƒr;KA      ,-ƒy1ƒ…K…t    [G`‚„^ƒmƒPPˆNN†qƒ=Uƒb+‹!
%‚g%_2W#ZhJ'> .U7†-HŠ"#1„‚ …‰…2…$3lEd‚%5.<}tu …lƒL!|‚4To„/hR‚
!!
5%cO‚Ww‚{†2…=@wˆU&…l†p  ‚N"†e„#
ƒ‚]"‚S!„1'#5…A*aŠUƒ!†4…C@<8+ƒQ…j‚e~„4Gƒ9`‚B‚%rbƒTƒ}>ƒ)/MŽ}‡z/8„M(ƒ‚$>*
!ƒpI‚&Z†ƒ4gE]‰
…m ‚~‚h0‚9Qs‚u‹/#(
Š„!\"
(‚ &n*‚Z
o                    
K„ ƒ;
                      HP>„6ƒR
-FD‚o
[M‚8q7#3''''.''''''''''"7''''''''7''''''''77'''''''ƒ,'‚d†t'ƒ*s
ˆO/
„HHJ7'
*0K5"2%.„ir[‚"vƒ`+,‚*W
1



 
`!
!k
6
6
6


6
D6+X:qq!
6

6
3\
1
#j

6
DUq7<qqqUG
$
3
ˆ










…>1‚9‡‚!$ƒF0'‚7ƒ„9|‚[‰ ;n#'U?      E"ƒ     ‡0…V)ƒ09N3.1 uV'!…#††1„e$‚„V…)FMƒ‚M‡lJa‚\f†$ƒ6*C‰n‡s#o(%D…'‹-‚
=
J…=
:6=ri}VeP‚b
       
dj‚|JG‡"‘Yƒ`(WW       .—‘‡)K„K;/vƒVC(b&r„A       
ƒd0c„7sGed9‹6Wˆ‰Z &,    #$       )
f
<{{w‚'!Y…L5Š;„8Ybd_‚BMƒ)3
„b
‚C9t‚g?‚Rh75Eu4ƒ           6‚%‚
%ƒMT
yI{n
h‰ …>fgg}ƒpƒ@‚qX„^„?„^4Œ=Œ…Z†‡|$‡M‰{‡`_     J‚rr‡ƒ0S@m…m‚<‚1s‡~ƒfƒE.    !B'
n…:ƒ+`.ƒza  &[     8‚K\Mˆ%
…]kƒxC‡o‚.^G>}ˆ(‚LYW.VZ2‚HK†B‚‚K‚
9"eƒ4f        
m…Xa?'‚s[ƒHƒ+c…„Bzƒ/‚
‚„-"DC ‚Kk†5-y„>I'*.‡<J+ƒ'ƒ…)R‡;‚Me*+%

E
   
-dR„7-dQA I     PDaƒ0`n„q‚4mi‡ˆƒ„  X‚
j=)‡`‚vƒ‚‚~ƒ0ƒ~'fD=',"XnGƒgSTuPo@NR81@ƒcZƒ*‹kƒ‚%J)$I+|JV206‚R[‡[…Ybf„…
9f‰
c\„$;<<?‹4…?ƒDƒ+g\,†‚\‰;‚w„„X*‚NZ%\S!…@$uN%%@„HEU…Vƒ‚;3s‚m8G„3ƒ0‚}lˆEJ.HD1"
!
%#5

""ŸV˜€€€€¿0
ÒƒpM†V‚ild$        7
‡B
Z‚4ƒ  ƒ
Po1Nu‚‚B$%4#xD‚z„5„*6†DZUoiŠH‚ƒ„*‚ƒ;l‚b9‚ „?2v™h-0!‰L‹mŒq$T^D>Y  Š".B:;m g‚P(J& t7c<Uq‚.ƒZ-†
ƒ7ˆ),‚7!‹Fƒ`1#‚ S3„K‚
ƒVPƒ ‡K‚0ƒ|R .>|T/ƒ        Q(&)oƒV"ƒ   ƒ7Eƒ+‚:E.„$Hƒ>ƒg
‚xƒP
ƒR†

‚5.‡
2Z‚4
i2O„†E3‚H|ˆy„‡.3…ƒ_6A2…96Aƒ!
‚3pCFy„r3‚=s= 6A{†
ƒzEE A>:A  yF‚~
ƒA‰D
wƒ‚F{G6~‚B„[ƒ

wƒ#>‚F{G6~‚{…xzF ~AFGv‚|„K  ,‚E}‚9B‚K‚^,}{A       7@G|6ƒ~‚!3ƒ
‚K…GDB W‚q‚ˆD?&‚8ŠOŠw†Š> ƒ„O‘?ƒoF‚Y)(=-ƒ„gw5‡hR    ˆPƒ"‚U‚8sf‚‚„…wGD‚
5,ƒu2v6zI‚BU
Z*B7#221",>B3M|~@`G<$?
    C$&E#S^I1}<
wƒtz%bƒ~(‡TU‚P‚,‚?‚g…E‚z‚wI‚z†G
Oƒn‚%†K„Jf$E|ƒ7„y‡C\^6^-Bf
:ƒˆM„ƒ
…@„R(iL‚!ƒ-W(
†…†U*f‚cƒ;Žös‚T \M‡Y‚(
$J
ƒG‡e‡h5X‡e+G6*JP' p-['8%@(!- Y8!‡UFKA    ,-:
q1K      [G*
CP
.ƒ:U‚\‹!2…N
%"{2WZhJ'
% 7†-H
 M#1‡)Nƒm„s‡_-K6 V!|‚4THR„/hR‚
!!
5%cO‚Ww‚{†2…=@wˆU&…l†p  ‚N"†e„#
ƒ‚]"‚S!„1'#5…A*aŠUƒ!†4…C@<8+G.‡^g
?9`‡dl‚{9ƒ)//8\„MHs(ƒ‚$>*
!.‚I‚&Zc
ƒ…Z     ‚c0
‚ Q‚rjˆ„!\"
(‡>Nk*_
b                      
@‚cp
               3‡R
‚y
B—6
M‚8q7#3''''.''''''''''"7''''''''7''''''''77'''''''®mƒ\,‚*W
1



 
`!
!k
6
6
6


6
D6+X:qq!
6

6
3\
1
#j

6
DUq7<qqqUG
$
3
ˆ










‡f1i‚eF‡h F0=9‡_v2;n#'U?       E"ƒ     ‡0…V)‚C9N3.1 $EV'!…#††1„e$t„V…)H‚M|*s‚C‡F%‡e…!‚‡c‡hZ‡e!‡g86
       Ÿ§yC‡b&/ ¶S 7M‡f—6
!‡d‡h‡ex—2LJ.Ÿ‡gcxk;Tw‡X
žvQ‡f_<
LgI‡e@v^[‡V‡h®p1?y
>„B‚‡V‡`‚GW.U2‚       „'46L9"eƒ4f            
m‚3a?'F‡[D=    I @:.XI‚'&Lf=)>‡]CK‡fa'f—3S‚z(‚J)$I+|JV
n‡^‚L[
c…
bƒƒB9J‡a;<<?…=ƒƒ+g\,/
5‡P
M…=$%
""ŸV˜€€€€¿0Î<•ügƒ‚;q‚m8Gƒ#3ƒ0
rl
(5J.HD1"
MI‡E7]$   7‡fLOE‡e%@fz„#6ƒR
PU‡X,iNK‚b9‚ <
v3Ht--
v0!‚ƒ*
$TC~?>Y     
‚:.BžWY#‡f1O‚:ƒ‡dxl‡^wR .>|TƒQ"—49fO,‡b
.D-‡c3

&Y‡_`
‚/ —

Rs5‡aaD-,ƒu2‡T‡iFP
Z*#2*"7BA<$?
   $@E*x<
wƒtz%bƒ~(‚I‚<M
I\
O?‚'„Ff$
0 ‚IM6E(‡IHM‚;N…—7010‚9\‚ai
‚@+OIxª4‚Z-‚c„YkH      Aƒ0†‚r…(L–`Œb
ƒ9!:j†0
„M"¡x›|„z‡[˜M>†<ƒz„7‚"2¥e#…p;Žf¯m„„.… g‰Rƒ)¼4Ä
\ƒ4„<šydáY’<„,"]:‚W†)™S‘1L…B…0ƒ,‡
…#„S‚?%Œ=„@'‚‡u†Yƒ&
ˆTqIˆu–I}šV›4$¤W
!o‚B
,n72Œx…
‡O    ƒ‚yƒ.rH    D             :               *J8D@  =0PK
6…†&X5<‡&|ˆ2h„.+)…g —k†;‹=˜|†v…`By0…qŽ‚CŒ2pƒ"‡2~!O-[6‚WƒpA†…KŒF†.Šs‡‰)ƒ3w‚Q„N‡\y„'6Mƒ7ˆI7†‚:‹K @ˆ&XŒ7Q‚j 7‚DB‚PZŒf
‹‹8Ša.<‹Ž9‚/ƒ‰Oˆd4*†\‡!‡6Šs(a

„h‚.”=‡{1—-‚z
‰=ˆO£ƒL‚KŠt‰„Lg„‚+„X6ƒ…sƒf…d‡^Ž8’.…R”o†6ˆW†\ˆ*eŒ‡a‰>‹u‰
„‚sˆk‡6ˆglƒJ
‡G’6RŒs<|C(LN‚)^†'’
›       ‚s…*Šzƒd˜…,P]“•5œ:Wp4s]ƒ“L„4ƒ6
‚
‚LŒ
ƒ|†7
‚*Ž÷‡b—/Ÿ$ƒ"‡V     a=
{2
ƒ]#‚3; :%ƒK‡

‡jP‚aƒ)¸]Ä—/Yƒ‡iv
…#d‚ ‚"]:‚W†)‡OÎ0a‡
…#„S‚?%Œ=„@'‚‡l`—m‡f~IˆuƒI}Q
D‡D 
¶Z§    
P    œ"A¶Tg6‡c

N‚%=¦‚A—GåC
H‚9®o>—:
e7‚0B‚7#x‡[+TF
‡c
%„b‚FV
L4‡U0…+‚(a

1‚.
Îm‚3r¦;…x.¶W;‡i
'‡lT‡_
O{<|C(LN‚)@k
U—(
;ƒ=d‡q$‚wOY
Š‚EtW
A4]‚Kž8


#‡*Ÿ…70H†Pƒƒ

ƒ2-Šh'ˆ./‰,xŒì6Bcˆ   .…Iƒu‚‚‚%¡iµ?FVYT“        v5ƒyc'0„pk„)‰‘V
†]b„•†gˆ8
”ZÊ?.*‡3„9ŒiSƒf"…%n{A5ZŸD©‚…
¦Šr›(ˆs¢z‰E ‰Q†(áƒtŠ-
šƒ
…0-ˆ;‰@„w…ƒjn—"†t# žŽöƒ0‡kƒ-,'K
_/‡Ÿ~¾:ˆ
jBÕ]
A‚%§  
•v’yIT

v5
D'%
~
ZÍ®7”:b®ƒ‡L§Ÿ-f¾BŸ¦~—L
)"§„\—?‚
‡e
3¶‚6
„>¦1!p¦f
~A
‚(¶Weˆ—LƒF—`0-A‡…"‚!<†t# Ÿ"L‰{Ž?
""ŸV˜€€€¿0s01000J…/'&?<szC9…y†x‚2†!D
ÌIˆO†L
ŠO‰5Œl™X…G^†;ˆ)ˆuÔ¬o›JŽ÷a‚(‚2
D‡`
ƒ2¾bF»ƒc‡sƒž
4‚™H§3GW“0v˜R2%‚ŽÿF2‚ׂ¡

00‚œ{+
…)Xï(ù‚Ïv
„X0ˆ#\0‚ƒ 0‚„“Ƀ
0‚b…N“É„C0000ee0000004765e03ba8‚‚b12c000000a8ed96bfd9‚‚Uf40000018c595a5a3d‚‚L4760000034223eacefd‚‚k1‚‚}292‚—W¡}ÒZ–¡}5059‚‚d7870†—P961‚‰–þ‚}k‚+
‚y[$…‚G

E              ‚o0P—ãn{‚G

E              do0Pb‚”
"
ƒ°?—ë‡  mb‚athƒ{1‚‰X†o‰M ƒ5ш
†ã&063‚ˆ@”Õ66‚©aaÒZ¨a24†w-<9IPY‚J‚   [±<ç;„[Ñ«q§ !…Þ/'=?0‚‡wü`1‚‚/6‚ˆ’û'723‚–@Ò”u3‚›%–°„U2ƒ…e—µd4ƒ…Ža—µŽ8‚‚b„%‘ˆT†¬C$4‚Ž;›+–°„[0‚…•£p616644‚Œc3ƒ„Cw—µBŽD64256‚ŒV8‚ˆ
•³=5ƒ…z—µ14994‚ŒI
6751991167Š7‚›,–°„\19‚’e3741823‚
4”›s•~ø‡‚K
2335ƒ   –—û64‚ƒI‘¸{5‚Œ‘¸i8‚›2–°„b158‚”lÒ“!59‚©XhÒZ¨
h85‚§zjÒZ¦/j7‚§“KÒZ¥@“K9‚¨i=ÒZ§=91‚¥-q„-Ž.ÒZ£bq„-Ž.4‚£Z‘Rƒ#ÒZ¢‘Rƒ#9‚ž)‡]Òœ^«^2941466b55‚µ)Ò³^61006‚ƒ)g‚ƒS‘‰‚Ek‚…‹S  w—ãn}‚ 20k50k100k200k500k1m‚‚.b‚lN;1P‚<     —ão‚T1P‚
       xffffffffffffffff0xff‚
6ýZ1ƒ8‚T„k–y…C„g„?m.„q…(M†i„f—L ‚_ƒg—ˆM‰g~Ž$Í=Ž       §R•:Š^‘;’\s÷"†U§R‘     Š*
ŽQ*l…[…!Lƒ(%J†  ƒH\[@…x†…b‚%ƒ‹\‚
…,q’vŽ1ˆšsŒ!œ9„¶jƒ;‰
Bi`V    G8j$
z=           N)~!…Fˆ<…*v‡s†t„EŒ;#Oƒ)‰/‹5Š(‡'–P~.…|d‚G†‚GJmš„o˜?h     ‡$‰Z“h‚yXƒ&˜/‡M2$…-W…j(‚n†<ƒ+B:‰dŸ’u|…„lšq¯„†x·
„A„|‡Ÿ8ÄsˆZˆHk‡c‹4ˆ~„0ˆ9ˆ…J‚   †.ƒ+‚V‚=Œ_(˜”pƒR‚D[‡VT…,ˆ‹SA‡_v‡Hˆ‡+ˆh„W‚jƒ2…@¯Y™5tm§1m›ct‚{ƒ„Žöƒe„;ŸRQHK
ƒJ    

!
„_


†JV
‡[ˆ…D‚
‡J
‚p    ÎL]%J†     ƒH\[@…x†…b‚%ƒ‹\‚
‡ƒ)—/‡`‚>ˆ†xŒ!ƒbj®M$»8E‡kFÎ2‡z‡‰S(žyb‡‚E,‡t¾J4)„o8I
h—0¶S
#‚"‡ƒ2
„q—C„‡[L‡B‡®7ŸND
)
J¦A
‚.k†1¶X#‚|—F   ®"
[mžo‡jG0‡Mˆ[–ƒ6280772‚p‘¸@91898‚n‘¸>1‚g†(›3ôÝ„]…Þ„c1ƒÃ]—Ì‚X6‚êY2‚›9–°„i117‚
ŒTÒZ
‹     4‚…s3‚¢f‘‰u5‚›:–°„j2693165‚
m‘¸=4360‚†LÒ…6‚›@–°„p3‚é55‚“c‘˜ˆ26‚“B‘˜ˆ7‡V—ƒ 1‚èO9‚o
›3–°8
„@397‚’k9‚’rread‚Šs–°‚7e5‚
¢v„h
‚ichang‚‰O–°th‚V
í2Y’„s
‡S ‚AQ6„`„…™
$d…(K‰9_Š~˜;……O…jmˆ3!W…a-N}¥ÛNª      
ƒ‰#…;ƒ+‚$…ÀJ›_‘0‰
‰yFƒ „[„#†]‚$19‚%‚;Œ‚O‹ ‚†SŒ5P•HYš¨{”;£S‘…@
‚A
+NtAŒnƒpnE3
\[;*


7+f
)!( )('Š2+





""ŸV˜€€€€   ¿01ƒw      X)         ?
:QCT'K$>‚S‘W8‡ZC‚Fcˆ;Ž&@i‘*›\?ŠE.†<ƒQ
^&ƒS¨{Vd‡MX†„s‚jˆƒcP‡‚‰iˆ[‚|‚Kƒ2K†I(B„‡('Ž’„so“˜H„qšq{ „v›{’L
‚_$—§s“F„B„~. 









Á‰:ˆcQ‚M;’yn‹s%ˆmƒt–‚r…D…ƒ<‹ƒ.˜
”p†@M†<N„uˆy‹1ˆF“Om{,ƒ_‡F‘-¢
¢…†‹4’ Wx‰o_!Q
ŠjU‚v†J=z„QŽ÷
=®iGƒˆƒW
ƒ^‡7
† —"2#…;X—D‡Y

‡lÍFU„[„#†]‚$19‚%‚;Œ‚O‹ ‚‡j 
Ÿ‰UY‡RZ/…d…@‡d
~Ý‚\„c§„§‚u‡p'¾‡\1Æ/„m{m—3
<'‚:w‡‚®A‡ƒ7
„q—4O†„      ‡x    
ƒ‡C—‚®nuE¦_‚p‚M;‡q®gP‡&ƒV}—n<—@ˆ;x‰o_!Q
‚}jq‚2žbi=‡H=0120
†
‚Ÿ'0‹ƒ›:˜;–°‚K>»Xx0ƒŸVz—ëb-z0‚’k‚_^bƒ
Ÿu^—ëL^z†1‚ŒTŽ–°5A15‚‰F®HÒZ‡{®H2ƒH,416‚©]pÒZ¨p406‚¤*‘ÒZ¢_‘12037‚ˆo£†Q75‚
‹&ÒZ
‰[928‚Ž2<†0ŽŽÿƒ8Ò„e…Þ9D3œ[Y…      Þ¡Q

ƒzI1…IŽ
ŽwÁ@‚l
‡    µ7
$Æ8†{†Œ/Y§H—5
O…;åQ00000œ^4‚
ƒ
Š{#Ú=

Ÿ 
„#56ƒ
T    ˜Ø   78  9‚ƒH
01234567890ƒ
‰21ƒ
‰<eœUread‚›!–°„Q4‚Ž#ç<–°LË2@read‚›(–°„X5‚YèsŽ'
Žq–°+PÎ   „2‚ŒÒŠS6‚™-Ò—bread‚›/–°„_6‚Ž+–°5T439‚…xÒ„-read‚›6–°„f7ugŠ$‘1„GŠ‰\®3?„Žƒ)àQ½6Q
Z”*‡9\®3‚×O‚È‚]¾‚LXread‚›=–°„m8‚
ò=!ˆ~O‹[ŸE%ü_!Õ‡3…Þ‚V      »F
%0642‚„zÒƒ/8ƒ…_—µ^90ƒ…?—µŽ]4ƒ„(—µ'9ƒ„FU—µE%gb‚ƒ\‘‰‚Nisinit‚‰W–°kƒ‹T—ãomoc‚·Sü…`3>
‹-˜\
Šh5’-”÷œ!‘6ƒ‚dƒDˆA‚''(aƒp<6†TOˆl’
gƒq8'‚@?‚KQ,‚}V‚U
„t™}…4 ’y‚-‚l
]…4‚‚-(§H’•*Œ8ƒ+ˆ=‹}…{vƒt†[]“„ušq³;†/¿H„‚3
ˆmˆMk‡LZ¯%‚m†\‰Ž˜   ”x†)ˆZ†mˆ„‰WŠt‰‘Iƒv‡ˆV1ƒA…O’k´a
‚S“ ‘6•rU>Í5‡<…A‡]Í~6Q‚dƒDˆA‚''(aƒp<6‡j!—âF0ý.
8ŒA—kÝG‡ƒ;
„q—„‡o‚åH
‚3k
†¶X2ƒ:‡u¦N‡wŠƒU\0‚ˆb00‚še›7ÒZ™›713‚‚[215‚”ÕkS482‚”dÒ“1Q“QŽÿƒMÒ’072‚Œ#ÒŠX53‚…+79‚©9wÒZ§nw2‚‹&–°‚jnbackfillattempt‚‹–°‚W3‚)ô($682‚‡v”ÕkA4…g±£$Ž(–1§ƒ
”¡Y3‚u‘‰+g4‚’|‘˜‡K88‚”+Ò’`5‚’c‘˜‡25‚“T
checkpoint‚ˆh–°2,6‚o‡Um‚iƒu–°1t
‚i`30‚’1‘˜‡1‚’‘˜†Z2‚‘i‘˜†85ƒÃU—Ì‚P871‚‘S‘˜†"986‚ˆpÒ‡%bigendcksum‚‰c–°'4‚:„mj‚Q‚A     –x‚[Ÿ†1Jœ'‰j-O†=½•’b‹8·AlÉDœS„‘2ˆY‘k‚u,‚-‚$‰‚X[Œ9†.…!‡vÞ!o–T‚Š/’5Š+…‚p’Nl
5x   #              L G‚‚
&A#+†ƒ
$Œ}•9Q3
ƒE‰’Vƒ^©‰DM‚3sƒ
ˆfNo¤    H„œv…8' Š1„y/“ˆ'B

       -
#

      #*|L„y
 !3
"
!!ŸW˜€€€€
¿2™‚’ˆ'Q4“…,…W•Mº†]ŽUƒz-G‚4‰uŒL¬eŠUˆv¨g–c…ah¯;‚Y†l‰Ž.—q•Ž>^„†A„1„s‡D.ŠG‰•C‡ ˆN+†|‚]‚oƒ,f¨
…     “s…L‰x
cƒ:jŽþe —U§

v‡N—‡qR
…Nl‚'‡\Ÿ†;®o*b‚$‰‚X[Œ9†.…!‡lŸƒd—-
‡‹#Ÿb  &Ÿ§=΄‡ipõ4‡lu‡b
,^P~üb
1§
ŸxŸ?—M‡`
ƒ],,…y—G‡V1…,¶9§j¦ml§9Q—:®k¦w&I¶U014159‚ †+•:„W+*+26535897931159979634685441851615905761718752‚‚T ZÒZ   Z3261‚ª("ÒZ¨]"4‚«GÒ©|2264‚‰#–þƒ       53‚ƒü}k‚‚õ1640‚š›zÒZ˜A›z7       ƒE‚¤"Jø4†Ëu5ƒxfˆ‚W„yD‰8
P‡Aš6Qƒk—„"
‡-D
…C‹m†“$="¢5„H¶TIƒy£X$ˆX‚tn8‚\r‡"4ƒl—\LW
7ŠA
ƒ=±
7~’i
ƒ9ƒ$>;s             Z+4};‚mD,&A†…Jˆ,‹7‹K‰?

&,„(”CÂZƒ6†!ƒT©{Bv‘z$
0      "¨!†7‹E‹p…:
ˆ#’S‚
ƒ†d´D‹      È&‚?„C…Š=¤M‡}ˆˆKh…XX…^V¯Q‚)-†p„+„kŽZ—k‡X=Ž:b„S‰
“v•;l0‚‡#ƒk…’j&¢H”tƒ44C        )M‚RŽ}-”žl†6‚-Žöƒi„‚'®s
‚PDˆƒL
ˆ+Ÿ
]„H‚#‚*      ‡>"Ÿ†:®o8r‡"4ƒl—\LW
7ŠAŸ
=‡†|¾~”„I‡kHÕ{}ˆ‚Œ4—
¾;;—:gS‡…*—I‡7‡D—‚RO‡‚Y΂1h„,X§6Q\ƒt9‡}9—‡‚yTŸ%¦…60v˜N#¡sŽÿB#†úƒi0‚*)^„i12‚š=›CÒZ˜r›C4‚ˆj–þ‚P784‚¨r6ÒZ§'61‚"‘‰) 67‚Œ'ÒŠ\213‚¥}’[ÒZ¤2’[358‚‘<‘˜†613‚¤8Ò¢m4‚†2ƒ
£8)—ÌB
m)320‚’5Òj4ƒ…h—µg46‚ˆ”ÕkL6ƒ…Dk—µC9969‚„4Ò‚i5‚Š1Òˆf0ƒ„4—µ35ƒ„L‘—µKY65‚ŠpÒ‰%7‚‰?•³K8‚?Ò›t63‚˜= ÒZ–r 5‚–_£      ÒZ•£       9‚—N¢ÒZ–¢73‚• 6ƒ{ÒZ“A 6ƒ{84‚µ?Ò³t924•w€e7‚˜¡>ÒZ–S¡>7‚—†szpage‚‰v–°:6Š‹.ˆˆw‡~‰z‡   .?+]ƒA!‚`u
H._!        F‚%6~S@W„eƒ-P(Àk;‹4¯ Q†Q‚{„ì "‚Y¥     2*£…B*ƒ‰p4„a…;‚g‹9‚h+P“6T‡Q{ƒY2Š\Ž;ÆS‚’;–U„8v“>NkJ           K      C:SYr!lcˆ…G   &wCˆ\[„'-
—.ƒ:2x
\!sb…‚]‚BF†@‚\…i„'©;¨&Z"†<ŒRŠ!(vb‹–p‰#ƒ=„bx‡m%…1qJ‚{A‡,Šd
Ÿ“C‹hŸuÁ@…
¡z#šW9‚8Š<‰%b9ƒK†*Š+
B‰¨X‘;’{p¯g‰?V‚†aV‚w‹„6’#‡FOŽ7e
‚y‰G“v•5v„‚8‰\ˆw‚Wƒ8ƒ}%Œe½`ƒ&”H‹2Š$‚…    6T‚(ŠI„9Ÿm§k„7ƒ>¢IH   ‚H–U1§‚        I

LQƒN‚
„]ždzŸ:
T"2*‡‚FŸƒ$®o*N‰p4„a…;‚g‹9‚h+P‡t*—+
\2‡‚HG‚Tx‹$Ÿ ³Z‡eFÝgZ¾+‡  ‡‚I¶‚
G„o&E—9Ÿ%
/¶ƒ     Ÿ*‡ƒ
„V#ŸR9^RN‡ib     K¦†*+
B¦†Z‡q®g)5%‚.‡|e—K-—38    Tkoj‚:Ÿ+1823‚ˆ.”Õky2‚Œ^…
—û$;36¾‚x83‚I4‚‚y0‚Šuš?q„-Ž.ÒZ‰*š?q„-Ž.2‚‚O4‚‘xxç@        Ñ-‡©kD 5‚…Z7395‚ª6Ò¨k9‚Š'•³„Z13&‡\$
‰`
$
$

!!ŸW˜€€€€¿2€‚30168‚£n’Ò ¢#0‚Š(•³‚477‚r‡L…–ÇuJbeŸU†Y‚ˆJ3Ž9„w2+
I'†JµAV‡¡'£x
+gibƒ
‹—ã+leŸX†\‚ˆO3Ž<„q/#ƒ /
E#†CµAY†ã
:/%¾#£q
$oc‚
·Blüx
…Olth‚‚I‘¸‡Q„o†™@†Q‚s‰xÛO‰·H/CŽlˆzm2‚6ƒ7†R[4†7"‚OŠ)…>vpD„[ŽŒ«1†0¹‚oWlƒ/“]

:<.nBvGn,\‚[2>‹ƒŒQ„
„…"
˜WGÐmƒ=†1`‹s„HOq}
‚h,‹NŒb„s ›)‘(Œ†m‡U
ˆ
xÃOx@½m
¤LVÓL‰„PƒzYX®xˆ6‰7‡'Uq‡IPŽ8gU’G.•4w†Šƒw†rÄA•LÂ*‚%‚M‹P
Ž5mŠlŽ‚)¯ƒX-®u…U/CC¦†\®o0kƒ7†R[4†7"‚OŠ)…>vpDŸ‚^
1‡`†0px‡VW
‚À:Gˆ?¦`rL}*ÎõŸ4‡@¶I
‚X¦|FMž‚1‡j‚oƒz+¶Wh„s—S®dBž9       ;p¾507‚9‚ƒ9–þe21059N836‚ˆ7”Õ652‚Òƒ=30‚‚B5‚ˆM6…—6U7‚‡}6Ž"8‚¶x…FŽ˜/76‚››ÒZ™K›b‚‰--.i8
‚|”ô`,‚‰(d‚´•ò„|8†ƒ|Š˜wª8A’s£AŽw¢K
‘:
¥D
š=
ŽN
e    "‚Y‚$(…&\“%k¯/›6
‘Bx–7Œp
-H‡)8i>b b7 a2,t‚M7
‰Hˆ@„S*Šƒ%‰ „ ‚J†/™[ƒ>†8š‘vƒ ‚1(œ„&§N;“hue<ƒrW AŽ!˜zˆ3¤ÌN‡
6N:†+Ÿ<
Äp#‰
‘0PT-i‚,‰:‰7;—`‡\‚B‹‚]‹`fƒŠEˆ[‹•.z-ƒz9~ÄDˆF‡2Å6›^…J‰y§„†8Ž÷RåülŸ¦a
˜®o"‚$(…&\“%k§…Ÿ
†å‚^í?OJÕ~;Æ0JÆ  ”…†S‡n§‡kWŸA#¦Y
†OLJ§k—4
6V!®N!2
‚LŸ‚A‡KHŸ…80‚g•)ER•ñx5ER2ƒ…—µcm‚••ñ+1ƒ…)—û$W1ƒ„R‘—µQm20912‚¤QÒ£3‚¤i…BÒZ£…B38131‚£c‘KÒZ¢‘K4‚‡H46744073709551615G6‚u6‚”SÝX7‚£r‘,ÒZ¡Jr‘,71‚Š°eÒZˆT°e a53540aa3‚_Š%Bs•³=‚1Bs9=„o†       ‚¢M‰i-QŸEzƒ~‡s…U
‚_—Y…ƒ#:‚uMq$G‚;,bzKŒ|
…(Š0RG  =    2›{ƒB†D6˜mŽ…sŽ{‚'…r„>vƒ1„rŒv«X‹lÆEÌy
Š?<‡¡I¿X‰"ƒ)qˆ6ƒ$…t=°*‰"‚‡eˆ E}…a}#†{ƒ'„Y‰cf`3‚hŠ]ˆ@‹B•2ƒoŠv=o„F‚]ƒ/ˆ$Ê:,²Aˆ`‡Ån¨„SŽ÷    TŸT®…ŒI„=ƒ~‡l‚Y΂™*â…Ÿ‡Z
)l—‡o®TQ‡e‡;p_^3L¦U
\‚mƒ$kA …]—U—*‡~%A#%Ÿ‚B1ƒ      …4—û$b2œo¾Bv317‚–0‘˜Š4œq¾Bx5˜|&…# @‰=[-u‚w—m§>”*‡r[-u‚w6‚’bÒ‘000‚§“DÒZ¥I“D46‚•d‘˜Š3608‚—S¢ÒZ¢7‚ˆS0lqp‡‚V.,„;…Y†]¬FµIU¶Z^í/*¤…Î2‚‰w®ÒZˆ,®4ƒ¦—ëe46†—J80ƒ‘h—ÄX74‚&&.”Õ,583082‚‘7–þ†V67‚†F’†90‚†Wg’…s*‚Ïe2‚&+†HŠ’†3‚•N‘˜Š4‚•8‘˜Š5‚•‘˜‰U6‚”p‘˜‰?3‚‡(’†{4‚59‚”?‘˜‰9Ÿi‚†
mxframe‚Š–°Ja‚ƒ&c2x„k9

'Jq9

'doú¾Xe12‚c41379c9c1e400‚7£qŒr71‚7£qŒv7nglish wgb‚oŽ—P—ヶghzƒ‹—ão4kƒ«—ëXh…e


        <…n

"…A
U  

#%
""ŸV˜€€€€¿0É01kib‚ŒM“ƒmb‚nibƒƒ—ãm'noy‚”Qùˆ^s~ÜE$(¾^„N$(t'?*‚$9*Ø*5   ?<(az%8   ž6‚Y…¾(35  ?<(az%8ÆBƒ¥]6the‚
Àuse‚©ù†!2|P‚X $‚=aL<8
ƒm70.=‚Hˆ`Zƒ ƒ‰[*u]‡"<†ƒ}^
‚pk‚]‚a
2ƒkW‰,‡vƒ.ˆ#oO4‚$=Rm\1‹„4V- -.‚Yq
'„T„{
…h
TˆƒN
ˆ2†VK
†3)*‚X"!%„†zŒhƒ3ƒ91ˆAwƒsb8#'*†!$$hJŠM<(-X;‡M?„N‚r@f04@L„y1fFˆ8Z
ƒ+U‚‡RŠ^‚>ƒƒ(…y‡+…H‚‹Xe’M#:ƒb=‚HgrRm  ‚U\!:LQcu+Š,
4„-sƒ/C†5ƒ{(ƒ*‚nJ.*KG
‚(jdi
)‚aJX‚m!f'ƒU!Šd‡’%‰~¥ŒV‡m,‚h‚a‰J=ƒp:…I…q^„:‚L„3b†R†m#
ƒk‰@i.‚iƒF†0‚h‚f~„'G…eeGƒk‚w‰XZ‚S‚}Œ‚6‚e…†]'U…NN‚'‰p†0Z‹…tZsR‚'ƒ~d                      
}

      

ƒ>
                     
      
                                            
,     {
         



Wƒ2ŠƒsI’xƒm‡<7thW
+.K5"2%$
%1       +1C'R-",(53    *‚‚       QBJ   <‚FP
‚
V‚F‚E
‚Kq--I]qn

m
‚
ƒ+
‚7A]S q^q]‚ˆDtZ
n…D,Q&
t+.‡O+0[ !\6[n……1Bb%Š%…d0j3…?
ˆg%(@4-ƒSNž0*
o_Zƒˆ      ‡
†Ž
‚)2 ƒ‚ƒ=‚z=…w‚ƒs
4*‚L<sz T
VIN{qH…›&ƒZ¹.;
ƒ%Sˆ|0ƒe/‚McdŒm‰Z‹T0ƒ/ƒ.n‚$&,,8 > &"#$0"n'`@'>n(8
k|
*^wƒƒƒUƒ+5~&zIƒ7$‚5‚p'R„ƒ ‚Z‚`…Puc„CƒcooQ‚l†‚I.ƒ^U‹mƒƒH‚>ƒ
‚T0a‹_Ž!ƒ<†`‡=
K‰o‘ƒU‚!4Ir,881D!…*‚hJ0
^ƒ{‚c%‚){ y-
‚W†E‚yaOƒ
C-N…!Sj  „B“ƒ#‰M‚%5ƒ‚[†x^‚N4$Xl1s 7‚C‚„R$z   ˆK4mr
cƒ-ƒ…ƒ2‚‚36ƒ‚ƒ„Rƒ
‡Iˆ‚Ddmt,CŠƒ!o‚`‚8ƒ=En‡At
(Z"A&
#z0„D+ ‚1l$b/RUƒiZ„9JQjC               

      L;
‚…V
ƒ2
U8+‰aˆT2T:„O‚‚`‚;‚),Xƒt„E†…    ‚m
h…J8 ƒ       AH   |J+

J$DPBC`?>;‚)…‚‘U#%,'>0„4…q‹ˆcW;,„]Š:ƒ;<<?„iz/
MX!!~…2„N‚M…Iƒt„FSdƒ
wFSƒY„^9D|‚FmEp‚%3nk&S;Vp      @B‚e6!2ƒƒxc_/-3O5>r%‚(„*‚FFD*„s]‚y1vH
xoGg„g‚`Cr";‚~…*F/2Š&~–|„
‚D¢lZ†@'(tƒtƒ‚, W" ‚s<            1ƒ$„8ˆ0‚!„;„ƒ!Œ
X
‚Hv$‚‚‚s&u5‚4†e|S…     o,‚ƒƒk‚q‚ „QƒiU$#„4ƒƒu
‚-…m
Sƒ‚|…FŽ‰B|Œx…l=FA(F„!PFA(ƒ/‡,‡ƒly‡x
ŽVƒ@ƒ†,‡TƒKzZ„w‰‚H‚Bz…Š^ƒ)zA‚G†,…x…@<@~F
a‚e
W„h0‚J/NB~`„<
Hez&$‚\‰)‹>†wŒ<‚*Ž‘(-?4†J&‚+
ƒl*„1…'„@‰eŽo„
`ƒR(>I2 ƒ
X0tP
x…x#G‚9 …'‚[   Eˆa@'       Š\5j4ƒ
1‚WsL3I‚p„H`I‚B„9A‚JW_=    ‚lTƒ5\‚3TbL…:w‚C`…0‚S@ƒd
={‚"*N-‚.ƒ>Žö‚V
V^‡Z.ƒ#‡f‡h‡hZKP(b04@‡„u0W
%U

2E‚ƒBXe …W#:5{gr&‚U\!:LQcu+
Y
‡*?ƒs‡aE.J‚!f'ƒU!2ˆr‡’%‰~¥ŒV‡m,‚h‚aH0r‡]B:‡dm‚|„n#
‡i.od‚f~ƒG…eeG‚‚w‚x
3Rb

""ŸV˜€€€€
¿0̃ÿ†5'U
ƒ‚$;ˆ)…t‡?M$`c                     
s

      

‚
                     
.  
                                            
# r
             d


‡X—7®qD        <‚FP
‚
V‚F‚E
‚Kq--I]qn

m
‚
ƒ+
‚7A]S q^q]‚ˆDtZ‡gM‡g2[y‡` A…d0j3…?
3%(@4-
-N†Jl_Z‡L 2‡g6=…wM\‡f-‡ioC>Ÿ‡g¶UP‡g—7‡d‡i‡f—4LŸ‡f
sUlWz‡Y
 
8žt‡gM
z‡;‡V7‡f®pH;‡W‡_‚I Xlm ‚„Ou‡VK4mJ      ‡TO0>           

      L6

A[
JN‚",‡_‚tK‡f—5
"…h#%,:‡]/
ƒ(ƒ|WK‡a;<<?ƒ8z/
MX!?‡^…GorFS„Z9D$‚FmE‚3=‚e6!2J‡F<‡gQP‡f"C
soG„^‡ZM1/K
~{
Z4
(tžb‡gt‡h‡_ƒQ|S
ƒZ—6)Q5‡e$‡er/@t&‡a‚[U  —+&‚+‡d9`ƒ‡T‡j0 _
X00
f
S#G! B$     Eˆa@'       5ƒ
3O_7!Qk!/@‚4‡HKNP—8020]‚b‚J,PJy–{ª6„[.‚d’F†l†…P‡:ˆaƒ
'      „F†Œ3ÏQÁY‹H‡*'_±6…ŠS?“<n…-Œ}ˆJŠ/„-ƒ5¡r¹UˆRƒhƒ1™H…3‡R…&ƒ:83*\      bO‚:&L
A‰)‘V…>Œl  Œm-ƒN‚j†Lu9‚Hƒƒ)D„5‡@0 A$t„†%97œ!•ŠsŽl‰b‹8Z—(Ž>«+
À4Ί9ƒBŠ‡
Y‰<‰*„•$<ŠOT¹7Dˆu„
ŒE—e‡\k‹UœF”•/„Z‰w2„N%ˆS‚jƒP.ZŒs<|E&LN‚-‡®>O/„^"‡   ‚nB†“  ³Š 2Ž?‚$      ‰_Žþ[
'  ‚9„¶[rˆFužmW‡*'d    ‰KFE^Æ&ƒbŒ}ˆJŠ/„-ƒ5§•sw…$‡+®%ýj§
„§
N¦|
9‡‚FSZ)

‡K¾‚^§H®q—‚9z‡‚:H‡N4‡s3S§U‡9ŸŸ‚0‡H‡k‡@A—4
W}<|E&LN‚-m(—
-l—   <B
‰5
‚C2Ÿ>s\"0F
?hµWƒGŒR‚-"Œ˜Y^(‰f&
ã(Žþv¤
?åiLùõNŸ-j»;~^(Q‚©
„?(0¥?„c“@‡…'
ƒS'ˆ@
ƒk
¶} ”0ˆ~'
!!ŸW˜€€€€¿2ª‚
‚
‘y
„(ƒ[Õt
BŸ!4ˆ@‚¡‚׆'åF_íH
020000‚G‚
“ø
2
2‚&g
"|å%?‚4?
Ž/Žu-cŒŽ
4ì75$49rCU5i*>(4        ‡
4N†)
¥–‰®rUÃ#OŸ2z5Šu
ƒ,åJZ""'n.zE²4"
P$ø„øƒ‚‰~$37‚–NÒ•6ƒ99


QĪ
àK5V2#)#%Y‘)Ìx#®vý|‡‚W7
~%UN;
LˆŠTŠx
 …,K)WT@^82E.8$D#’”hÌzG;®I…Ÿv‚Ï?1212‚>8 
…($$‡  ÂX,Ï52$(+Pdb(? ƒ”r†&Š     ™0 (“Ø‚ƒ¥2íIbm‚#150x000000000003106f0xef‚
3ýW9‰
ŽO*‡tœ\(         
‰at” ÆC6z‚:LU80‰c

‹yÄqƒ    ŠyÕXžfÌ|ŒN„²Î*Ÿ$        Þ
B¦E,åG—\Ÿmb‚‡\1ƒ …?—û$m0E\ƒD?„a‚%…ÊK     „n39" ¼(‚    :KGd$tƒu¯x²&‡K#…r×Pš"‡mxxŽö|
        <Õjl®Xý…I—…Ç‚k”+
#!!Ÿ
T ec1‚S?k†ÅeŽ0¯T                  ‹4 ®9K‚QL‚Zƒ!KJ)
ÎGNIƒÕ_n‚zŸkdûsü‚=“†L‚߉RâG¾b-ê—^#ŸZW2ƒD†jŠi÷ Ž9&"¡qP‚3I/`‚
H'´E2‰9„5ƒ>Ì  ¯…Bü‚F„øwå‚3’…iÇ!
‰H=½l                 R)?¢x
‚B
(Ž+‡[‚*&&!x'|
 “K
V¼9W×r‚%o^‹SŒV‚jûDƒxí“C‚‰L{œ
0³V     ŸT‚oå7¤-@ž[^      <q"#4‡?‡m‚rŽxˆg†   "„.                                                   
ƒ#m˜;,‡LXf      A‚*w<c`|”S0p       









‰c‚tµƒÒ~9õ
‚×.ƒ–
®`5‚8   ‚?‡
†/†;•%!#N      …    ƒ-                           ƒ"  O;6L81zoR‡K†[!Ž6
ˆIk‹½,‡m     ÃE‡^
         Æ)ƒ¥s_ü/!…*„c
‚/kåI06
h‚Y^ƒi—ýw…@ƒ#
g(¡T#.@\38+7„'
h‚7z‚/‡Oˆ™*4ÁŠR‚Q‰vLŠjŽöƒg„„‚!¦kƒ"ƒ#Õ{
†zUƒÔWŸ$c¾;=¾F        ƒrÝGŒ'!NL§‡]'7†‰|zÏS-q©0  
†
‚SBˆ
&™b#,=*9(4~5|1TƒƒO„o
¢l9
„U·7#   †,Ã!
‡w¥qD—H»ƒH’ZÒ„‡.B—:¤\Q/³a5—,
‚y‡y å†,6kŒÎƒ08X„s‚'
    I¡ŒY‚/“*^œ%‚‚‰fƒO
…zX»N‘H„+
-‚‚
ˆ…E„P”~(3F';!     ‹pšƒƒQ„–2©y
z”s¹=È$Ÿ7´eƒ'qˆ6ƒ{…B„#Žö‚-
+:‡‡`
‚QŸ$¤      9Ÿ‘%V‡_
M+}ÝõDŒUo§‚I®x
    ‡i_‡hÎsŸ)Ÿ‚‡5‡AÆkm,¦S
Z‚kƒ{iI<9…š%
‚D    
Ž.½}4”(34NŒyW5;u.mª,
Œs¤J§[‚z   ½^
ƒÅ     …”9
BŸ“TTYHˆw34NƒÌ~„ý‚V§2q®XÆ;cÍm2ƒÃ[—Ì‚V0Z;‚_†CƒK„7…_‚G)MG0v‰+‚a„l†    …‚p‰5ƒmN2A,qs*WlF‚9[‚4‚ƒl
""ŸV˜€€€€¿0¢x…m„
š;Ž
i»@L›3D‘)#/C34N)ŸŒm-‘TŒ+86KF@:}‘tŸ   x…a‰£M±Y„
‚Œ5
I†~Ÿ2
yƒ!„PhŽ.     ‚&”˜®¹uÆ+D…c)#/C34Nå‚[í/=¾„í:H„-œ
ŸVhŸ‚.Æ&G%®{    ¶I<F¶U02021„Mƒ
W‡C…B
‡Q
ž$†„e…N’[A
r3‘/k……R’s¯-Ž83w-5>t¡~   …
ˆ^DH($4"0Ðj‚gc„FO©8yŽ„|ƒnÒ’x
NŽ7ÄS…–2¦@µ¶f    
‡Z
3åƒ
‚V‡,‡…Ÿƒ3w-5>í"Ó<žqa—;{(Æ‚Ÿg—‚8—‚®t¶‚¾z(®@‡[H=¾4
T!—¶8‚”)‘˜ˆx2      „j‹*˜t–vª3‡L„YA ˆmŠ£>-M¥
˜O‹kƒ’ü‹‡L
¥A
”}ŠQ=“:“4³ª~
¸iŒOTGˆUˆPƒfŒ<…1e…$ƒoƒ 44ˆ;J‰‰f*sa#!D1mCK*6-Ÿ_‰£‚3…gnˆlªSóyŽj >‹6«V«)–ÆCÒMŠ7ƒ@‚1Š:‡
á   ŠM…\’hÕG²>ñK…G$
§s
†4Ž3µƒˆ„Z!
Wü—5ˆ‡?      
‚C‡V\Î(ŸˆiƒaE&t/eOTGˆU‡‡#Ÿ)åHF¾BE‡jh—ƒ;®m1‡v5¦yT§‚GÆ0j—7"¾<—‡‚8~‡‡ƒ2QŸ L6ŸeIÍI4Ÿ7ˆ
|Ÿ"‚I%tj
‚5
¦…40407a‚ìÝ×B3‚‘‘˜…_7‚O‘˜…30‚‚‘‘d74ƒ   çI—ûMM8000‚.ù;…Þ3h2‚‚750‚
pŠf-„nŠL„?0ƒ‘
DĊ6
/8ƒ…G—µF6221‚–h£ÒZ•£4384‚£_‘ZÒZ¢‘Z7ƒ„U‘*—µT 7‚„d†Òƒ8233‚‡x”ÕkC813‚‡d”Õk/97152‚PandŒuoc‚·I/Cüx…V/CsetŒvth‚Œ7“ƒy1„PŠ…E„\‡[ …Q ^0…h
‹”ŠT@š>“=p ˆq‹Xr]?‘AyŒB†“8-o”<ŒjˆSƒiŒ>šm…4‡Q…'-Iƒ"ƒR!‚„Cƒ9„Ew‰IM‰i„•VŸ 
ƒQ\†R‚6‚L
ˆo–6Æ \|ƒk|ƒwŠx„q‹9«,·5¡=



-kŠ:ƒC2~    









œ¯z±&‰0Ž:ˆ,’zŠPDºŒ}Œq—e‡\1ŒœœQ‡' Œ@•/„
‹`)ƒSˆaË'¥Œ+^×Pš$Žö|Ÿ2ÖŸ_—˜ ®o ‡&‹Xr]?‘AyŒB†‡t,ŸƒFW[9‡‡%Ÿ,®$¶VJ®s@—9kΦ{W‡‚JÝkc—jÆŸ‚;—C‡bƒ3



2T΂m'K¦ƒYm‡n®gD†>—WŸ0#!
Ÿ
V0‚’%   866760000‹Y1ƒ      …M—û${792‚q
Š831‚‚m227‚Ž‘˜‚O8‚¬zÒ«/3‚‰&–þƒ0‚ˆ|•³8‚ˆ}•³      47483391‚„“Ƀ646‚’t‚)—û#`
7{
* ƒY
œsPl
=
¡?ƒTø^‘P†Ëe
h¶h
†c?5–‡XŽÿr‚þY616‚¦l’.ÒZ¥!’.708‚Ÿ937‚‹OªcÒZŠªc981‚¥Ò£;2†E‰ˆoƒoR‚-“&Œ`…o„
¥ŸG‹p‹y
‚6‚h Ž†?‚B}ŒF‚Ž/“7³&‘o$(#34NœP
‚C v'‡@r‰ƒQ@Qhb6u${$b>q_ˆ†m5‰ƒo
¡‚?†X‹r™9ƒ–5*©L™;||ŠS‚ Œmr$ 
x
¹;%…c‰‰6DgHº#Œ}—a‡\7¥D‚d‚3š†!d•Cz"ƒƒ ƒVKÌUŸ4¹§~Žö|
‚+
)>—+‚(§ƒ!… ‡¦‡h
‡h‚h      ΄t‚B}ŒF‚Ž/‡t+ŸˆkŸ&†>$(#34N¾<
ƒ
„†Q   "
D†

H 
%%ŸS˜€€€€¿*rC’€A7¾>I”®gqÕ~
‚,‚j‡ebÕm
q¾S
‚
ÆŸX§„3Dg¶XG‡dIvŸ
dŸ‚@0220–ƒdŽÿt507†—O1‚    ‚c…UÑb4  ‚c‡©3‚†728‚ˆ”Õk\812‚ˆI”Õ972‚ˆY”Õ$4œpµ½=wˆ765e5¦468‚ˆP”Õ71‚ˆ”Õk^655‚ˆ[”Õ&6œs‰½Gz‡À‚7 B¾C@203‚ˆR”Õ8ƒ†—ãa9376‚¨nEÒZ§#E  †   ….„†
‚t¡K
ƒ,
…¬ƒM†
q£‘$‚1‚ZO…,ˆ(…c    Š<…x
ÊE›7xƒ…ˆƒYƒP ‚„       ;      †zJ;/ˆ˜lƒY†bƒ„#
Àw‚¯

…{B= –ÎIŠ‰@
;Pº9Œ}A—M„*ƒ4¤,E„nf“R‡†Z$•Cz&„lƒ&Š
Í'ƒF‡n¦p_!Q
™u…6ƒ^W
‡z
W4–NŸ"Æ‚+‡‚HÍ|"f‚ZO…,ˆ(…c   Š<‡i7Ÿ%
…GEJj‡í3¾>H¾BI«‚L”7
9®‚h/3ýk‡?‡:—Y®M;”"_!Q
Ÿ'gD—
ƒ31‚ƒV¿…]—û4ƒ…)—µ(2ƒ  ‚—û#M3ƒ„X‘:—µW3‚‚6404‚‘˜„k55920‚‡m”Õk86916‚ˆ
”ÕkU7383‚¨cÒZ¦8c43‚žO™OÒZ™O8009259‚‰£†r640‚”zÒ“/k‚‚õ,93‚«ÒZ<«npage‚Š–°V4@V‡Hl‰ˆRŒW…„Y„(
˜Q”
°@<£ˆy†^‘Q’m-sN"‚&‚} „Œ~ŽL…k„#‚7"·]ƒ\„³Œ$£S‚=”u·9„DŠ´cŽ`‚e ?@Õ2”|‚Y…¥‡3œMƒƒ)    -•DNCk(ƒ>Ó-²C$‹Ok«r§x…(‚C–[SŸBˆ„\®M
P<‡‚EŸ†[®o…‘Q’m§ƒJ‚ß‚ügüŸ*E®^§%*¦gƒ‚e L9§/—^Ÿ'D}u‚Rb01‚‚Hkb‚ñu134‚ª )ÒZ¨U)8‚ÜP3…i—322‚…S4ƒ     …dáq—ûW0587Ž_56572†7647‚ˆn£†P56‚‰£†q6…—6P1147‚†Ò„670‚‚58‚Ž5Y$54‚;‘˜‚
996‚b
Ž     |7‚‡8‚ˆ+9‚b‡&…c55„n}Š; „S„#†Aƒ<™/ƒi–*’1„`tƒL
’i„Pž3„U       4-2BJƒ#F‚w‚76…‰/…V
     7'(

…ƒg
‚`©w$„'‹„·\'‘“+¡uŒ|™5À0
JÕq…*(’±KœJ†3†o†M“ekw‰„s{Ž'Rƒ ƒn‰W†‚(í0/‡‚‡w5ŸK®o”_’1¶V
htx>
‡8ŸHÆ‚e
‚^§ ‚N¾J”ƒk‚33݃Z¦^
4¶[_‡O0ƒ#Š7jE ¡…Hù•"00‚b‡3c,=ƒ|*DG3069‚‚HÒZ}8257‚…ÒƒTeƒ&—ÄPNkibƒƒ—ãm%2188‚£2Ò¡g
3402300799‹[4‚“m7‚U¬+ÒZŒ
¬+5)b=‹y>ƒ3Çy
®C
®[_!Q
µF
8>ƒó|p‚Ð
‚d”!_!Q
1‚‚a6•7‡n
‘Ž7
žE;~„"ø^O…\ˆE
µ«[ˆ@ûW‡Š&o
J"®[ˆ+—9Ÿ‚%
1‚‚`mb‚ƒ]7ƒ„d—µc0ƒ…—µ
9ƒ„O‘^—µN788672‚¤MÒ£eƒ—ÄPE6_‚d„l‚L.RL{ª50‚_@+‰=5ƒFJŠEŸD  Š     ™D„]Ê
ŸE8|‚y=M‡‰‡5ƒLŠ£ƒ
‚A
‘%ŠY³P{Ÿ 
"–
X¼9ŽK‚T4Ö,‚t”g±KœN‹ˆY‘[ƒt{Ž6qƒ\„#ŒeŽ÷<¾BE‡[r‡…Æ#Æ&—y„]§…K‚¡ƒ@¶c7Î
/Öi§2¶K 
—‚‡^V‚qŒ?ƒj‚T¶XM9#‚01ƒ„Š`—µ‰1‚‚@2‚‘R…P—µO4‚tt…k‰>—µj‰36ƒ…,—µ+14‚--;ÒZ‹b-;7ƒ„aŠu—µ`‰`273‚˜F xÒZ–{ x801‚Ž_«GÒZ«G    '
„b

„



ƒH*
X

ƒ-
 
""ŸV˜€€€€¿0
0268435456‚‡6‚ÚD96‚†u\[ÒZ…*\[7‹,C„p
š9„g…[‹4‡+t‚B     …‰c      ]%$?&ƒ7(Jh„v  ….†l‚~…N„       1 “0·_ƒm”e™  
\Éy)†‡% Œws‚
˜aÆG„|
Ò(Öh—YÎ…-ŽCXƒq ƒbŠ“oµ Œ>
 \–%Ÿ¶‡[å@®hU‚Ђž~c»…ŸM)Ÿ—ÎJ*Ý'S‡n—†
        ~ÎY0‚ŒK„1—µ023Žÿ…/560‚ˆ#”Õkn309‚«m‰%ÒZª"‰%5…\„7‹@–&ˆžW6Š6207‚ˆ”Õke40‚™6Ò—k8…/—6y9ƒ„—µ8†—g%$…X  ƒ’±B"ƒ‚…6Š%„Gˆ`N…VÞ¡.,      V ƒ$„CT#G8$Œ{’7‰‚G)  ƒ–4ª*²S¾MŠTŽÑI…f—PÎ"“q…Qƒ}½\
²@ŒE–"Æ#YŸ‚RÕn"J‚…6Š%„Gˆ`—‚Zƒe‚Ïp5Ý‚K¶ba‡hA‚™„¶Xn—PaŸ$E
1‚R5     cŽ3ƒk!E"
‚1    —ûh   474‚‘s215‚‡^”Õk)6‚‡g”Õk27‚‡p”Õk;2‚ØM6‚‡y”ÕkD7‚ˆ”ÕkM44‚ˆ”ÕkV6ƒ„v—µu2‚ˆ”Õk_9‚„ˆ)        ”Õkh$)        70‚ˆ&”Õkq3‚ˆ/”Õkz7‚ˆ8”Õ8‚ˆA”Õ80‚ˆJ”Õ2‚ˆS”Õ3ƒ…YŠ1—µXŠ05‚q‘˜„@2‚Ø%5ƒ„I‘x—µHK4ƒ…q   …há|—´pÆf530‚…ÒƒK92
ˆM‹‚%‡H„š-‚ŽH±3ŒJ2–V/¢
"Dc8Y]„^Whƒ
„R
!ˆtƒŽ7”_ƒxšrj©:ªX(š2ƒ`È$†/Œu”'†|Á!<>×i—TÎ$„4<¥|FÎ     EÝa…}„š-‚‡\Ÿ‡
ŒJR‹%‡c-úƒ=»‚      H…Ÿ‚U§PÞ   I¦…[B057‚”£NÒZ’;£N21‚‚R74‚Ž«tÒZŒ;«t428‚8ªXÒZmªX912‚§“SÒZ¥E“S6‡—‚`0‚‚Z7367‚‡f”Õk1630‚’P¤fÒZ‘¤fa‡gs>2‚ƒ(b†l‚,cˆo‚ƒ*docuú¾Ze‚‘ƒƒc
‘¸O
gb‚Œmƒ>8‚
‹X“‚/„é
ibƒ‹:—ãoSk‚“[…«„L•Ò‚ ‚‘3‡yV„Lbƒ
-g1—ëf
„11mb‚‚   ib‚
…Lnd'2S\X'Z     l!!‚uÑ` ž$-„l…g     †&:“>I.ÙO½\YÆKƒ¥]Elthe‚
Àuse‚©ù†-yesno‚”Oùˆ\3‚5H‚P'‚ /e‚Qƒj‚<…R
T„]–A4„`5‚&‚`!-
pŒ
Œ'Ž`<‚V‚Q†3d;‡‚k„DOƒ5ƒ#ƒ‚/„T)|,‚t%u
ƒM/wvƒ(…L44.|    @+‚&‚d‚:…H>–ƒ8>6R
*‚,
…
‚       
ƒj#   …f59$]        J
1ˆg    ˆ`F ƒFˆ‚$,
ƒ,0‚<†b…
^{ƒ …‚m„a„re•`„[
        ƒDr{‚*†&'oE£  xZEh/c`F38i=ARƒJ‹i(4W
†8‚ }Hz/      ,‚n†f‚„p?KG•8ˆkŒy‹j7`ƒ%’J.‹P„P+‚+„;…‹<„-}‚z-,
@2*‚.ƒPq     1%j56
J     (2%c1H2ƒ‚m„u‚6%!‚¡]®}™f‰t&‚D"HOX†F{‚?oƒ0*…„L‰w.…E:ŠJ&"‚~†<‚w‚~‚m‚1†YER>ƒM:1%„uˆk†Yƒ|‡N„        „B’
 (
t/+,‚S
      h                      ƒ
‚p              ƒ=    

       b…M‚‚!‚A‹\UŒv8‰7>‚ƒ*M     +3B'R-",(5N&ƒO‚        ‚*‚M!x‚VS[#ƒ2/Aƒ[„N%7kEˆ
‚|61X*>
*‚&a*o‹p."‚ƒ
'<:cb…+k*H45,8(‚<DE$7‚^h)y?r‚|F"‚t4
)>#P@]ƒ(]qzlO=f†P…&_B„g%&†Xƒ H>z*; „†/ŒECŒ>*‚2‚dJ‚‚ƒ
‚Uˆ.†~ˆ…V      ,'-a[J/\@‰p?:ƒmC.$(4H#34N„(‚ˆp‚+:Q…"—9
 u'˜R…|EH†+
.ˆO‰N<+v‚-…J‚‰>/„&ƒ(;8."%,9!„8
                                                                      
ƒ!(‚Q0
(
'‚m
 12n

""ŸV˜€€€€¿0¢Ò                                     L,,P286‚‚%‡Q‚\ˆ
u……O
"O1…‚ƒ3<‚C"†‚5‚r&>ƒfM]M-5'   
C4& )?3$!%
6&31- 
(
6H/
(17q   1  7'(

A"      8#"      20w'
i

&
!&3
@.)+) …5„X‘MM3‚QHƒ]w…<T;‚gjq?Dƒ ‚JY9\Z‚‚       #pX,q:<;%„jGC${Lw4'‚T‚‚†uƒA2%97=.‚;$u…‚fLA`…nqC}g‚:a)q(†%jx $%G792AR„1
      ^&/„cEQP‚%"+
J9&W‚ZU‚^„ƒRL~‚
‚)„oD"‚,†A‚:„-=Z‚P[Zc   .‚M‡3S.6‡c
†^r0.5ˆ>A     ([63,6>j*3x‚%-}
/?3#Q&/
r3Kz
J, vN$
0      "HEn
"1
‚U.
‚#
%‚D1‚
-[*JZU@
*)@^|>('P;'\38' (0`364#$4/2/7^$
3Xn.T@^8l%!$          ##9)-U"("
X0&<Z"?'
#E+%
(
 

Z%C )


&
X.[+:$‚WJ„O3NL‚   
      5B

{oP‚=%ƒr†f‚|(      #%HzŽVƒV‡w‡_Š%2/†o‚[mkTew
‚&‚ e8>.>$>…?Aƒ8ƒl(‡YYƒƒ4‚"WL0;„=I&&„,l75…t‡90‚c…4S'ƒD;<<?>šKa…‹*‚tƒR†)1 †,@@†yƒu„ct!a









‚wƒrn9Gz‚1m(oYo“J†%RƒrP
Y
‚b1k "(‰m,‚=LŠ/J
‡„m‚ZƒfƒT‚6-"1i‚)…*L†)‚n„A‚]‘†‚z‚ƒ„o‰ ƒƒT#‡E+…cH„_ƒI:!ƒ+$X!O@deB„„C8l-U43?‚„e&†‚1k1Zƒv] :†z…9$#nTZ>‰(%<ƒ„ Tƒx‚`OT†}*…k†_<ˆ0,‚;m†,‚ƒ,…P"ˆ.U„z‚^†E†I8†(‹ƒTŒ|
}h<1ŽX‚‚V1•#‡   ˆu…IŠm‚[‚5
F-‹)‚(‚Y&4Yˆ"’\œ/(‹/+‰mƒ„(TŒ:0"‚S‚8sfy‚=c„s‚`„sƒ}d‚=‚ „==
65/$ez/M|$\@`Q0!:C,&fSƒd1Š3ƒg‹
ŠC†m        U‚%„$„yl~…K„2‚w,ƒ6
l‚Ht}†‚M $A‚t„;.Bƒ>m14@!
‚25bnS‚#„E
M)
„‚Žös‚<(„9‡8,Ha‡jw‚*L

)!,c`;k(4W‡V*  ,
XEG
      EƒA7`
…cQƒ`+‚+‡‡_@2*G.15‚2%!P¡]®}™fIt‡[~‡h
F„z.c"z
l‚~,‚1†YE>ƒMƒ:1%…?‚‚(†N
     ‡?(
"+a
d                       ‚p           t4     e

    )‡X‚
—6®pxS[#ƒ2/Aƒ[„N%7kEˆ
‚|61X*>
*‚&a*o‹p.‡hƒ6.k*H‡f 4
)>f{j=‡…k"_B„g%&††0G H>z*; „†/…EECŒH
*m
B‚‡I'-a"J/‡i>4ƒmC.$(4H#34NN‡g‡nŸ
§  @‡h¶T
*9!—9—:‡d‡i‡e—3§}‡Y*]w…<<  Y':ak
H&<;%
  ŸX˜€€€€¿4³GC“Û[
{q4
‚ žt^‡jKY)      q‡j)A‡Z‚¶W+
2aLL‚
'„o‡Z‡^‚K#Zc 
d.‚„BO‡^
„Ur0
5I‡Y(? 
      57
      JOs2/g‡_p‡h:—3ƒN‡;ƒKI&&
'l…mJ
‡Q';<<?†Q‚Vƒ&
‚l‡W, 
…k,@…'.p!a









ƒon9G‚1m(o2*LP
OR‡KEG
„e‡\
6-M†)S‚.me‚h)*D+%6-¦I‚,kZƒv)‡c8j‡8—+%QY'‡bD‡l]Q‡1
Q`—
)3ƒ‡e_Uƒ}d‡T‡f9
6*$L0!(j"Š3ƒg;  
„ul#4x9
n 
#.
]&
)@       !

5‡%NO030ˆ8’… ¡  †&‘4o“>†n5•1†0‘:$]‚M‚w‚k‚
W}…V‰"‡<1ŒX£
ƒ|2”‚M„7
‡O…„r¹Z1œv‹‰rŸ9§X‚zØ)—SÎ"ƒB-„X’m‚P?ƒ iq–$®¶@‚7…@&Õm…#5•1†0‘:‚þw9®‚K$Ò…/ní<‡‚M
…     ?
HŸ@®b]0œgì8Bž0….3üC
lBÕœe¶„ ƒŽE
]000}
ˆV    ¶P
ƒy    27b613b4‚ 7000‚‰Dç5–°Ë98002†# n•ù‚d9000†B o•ù‚ekib‚
…31‚œn™ÒZ›#™0000‚ r•ù‚h3‚„‘‰ƒ04‚ŠP°.ÒZ‰°.475c820dc5ab8a8‚ˆ’û'8‚
?‚8‘¸:'2ƒ…&—µ%447‚• /ÒZ“J /9…Z—$1ƒ„=’%—µ<lghzƒ‹—ão1ˆ‰ˆ*ƒ„
ƒk#…kÿ1™ƒ7ºiA0’6‡d¹„-”34N
$o„ v‚5‚=7H/
„‚|ƒU×0‹?‡-…q‚…_6#-‰"[’}ØhâEƒ6“oƒ„%Ž4¯‚V„^¾‚
…VA0Õlk‡d¶|v‡E‡jˆd34N‚ç‚OýA&»;6#-Ÿ`§„'[‡q®g¶d3‚*‹F/[[[§1ƒOCÒZ*‰{/[[[§1ƒOC
2333435363738…38dca7e‚Å6‚‘L852‚¥Ò£C8‚‹9923‚-‹ÒZ«N‹61‚Ÿ(›lÒZ]›laframecksum‚Š–°_2†A 
t‚ns!‚}:œq@ÿ&7ƒ@)°,IŸt„;3g(¸w„%K?8‚Ÿs˜„9e(2„D„*³‚_‘>$(4H#&
‚2„2&4/      
7
”1¦O‹„Žm5y
„Xƒx
‡kŠv…`
Œ[C¡‰&^71‚$ŒŒM‰7´8„!_-¿ “mm<GŠd‡{B‰u¡‚\H…\       …ƒE‹g‰D‰V~\‰©>,‚~u(!\9ƒŽöA‡_ƒ<¾o
‚3&-ž#)ŸCIŸt—1
3g‡t/„%K?8‚Y
ˆ1Õ[‚y„§‚‚‡HF‡k†
$(4H#Ÿ!òo¯<ƒ:¾3
$y
‡8¶W
O
.ŸB—6
C탶Sj^M„6¦T+ž‚3‡j„~-¶ŽO‚rF#ƒ4


!!ŸW˜€€€€¿2k<—¿iE‡D;§O‚\@

        '‚m
‰D‰V~\‚„#,u!0322‚h”Õf07‚¤"‘ÒZ¢W‘56‚«mÒZ©Lm357‚‡n¯nÒZ†#¯n8‚ˆG¯+ÒZ†|¯+79‚œF™ÒZš{™4‚C‚8†[…u‘·(>+^†Ã#35‚˜KÒZ›T˜K4032‚…ÒƒP73‚¨B+ÒZ¦w+516‚™ @ÒZ—: @81‚§S“ÒZ“96‚—'¢JÒZ•\¢J632‚‡k–°
51‚©1~ÒZ§f~64‚“~£UÒZ’3£U8‚•TŸwÒZ”       Ÿw76‚“¤.ÒZ‘D¤.93‚h¥ZÒZ¥Z8‚‘A¥ÒZv¥702‚˜¡EÒZ–K¡E11‚¥u’bÒZ¤*’b4‚¦d’5ÒZ¥’57‚«tÒZ©Dt41‚¬$!ŠWÒZªY!ŠW60‚ TK”„(ÒZŸ   K”„(6,Ž7‚…48‚x…C[2[2/[[[2[ˆ~[2[2[0+Y‰XXe‡\DDHD^ ‡O.‡rZu‚%…‚HÑb~-…C[2[2/[[[2[ˆ~[2[2[0+Y‰XXe‡\DDHD…Þ5
n.SrZu‚%K00‚–d£ÒZ•£1‚‚W888‚
™cÒZ
˜gibƒ‹/—ãoHk‚Nib‚Â3^‚cƒy„5‚K-QKz/‚e
      
¦{›i!
‚S7¬aP!]
ÓJ
‡²
¥xIÝd
‚r    Î¥0†…f¦j…o!]ýo0‚ƒ0‚‚41‚i”Õg88‚r‡G…–ÇpH2765‚‘jÒ3‚î8ƒ„m—µl4‚|1‚‚J545‚§[“ÒZ¦“90‚‚b4–BŽ7…”@ŸFÚ6‚I  
QC‚D
Œ!&„-.‚  









{
Ô    wÅ…¶‚7Õf~Æ+
… C‡‚…Þ…¤:0‡=±‚>–ƒ§ƒ1‚œ™EÒZšJ™E5‚„}7393‚Žto35‚Û
5
ŠU
‡Ož
/wjDƒG
›V
ˆwŠK‘„b
ƒAr‘X(ˆ\`|%
„”!…~ƒK{…ld‡c                                                                                      "1‚T„<m‚Þ]+(5
ÔK‡J62†…#®<b¦>‚BìX—·,ŠK‘‚È„åB y‚L¶Z<.                                                                                            ]"1Z‚KmO‚¨j„=(5¾*§2ƒg‚A—H”bŸ00‚g %>•ñz…3%>0‚†,459‚†6Ò„k65‚Žkib‚
…d1‚‚"ü35‚“?¤
ÒZ‘t¤
2‚VÒœ3‚‘qÒ&5‚‡=°%ÒZ…r°%737‚Œd„1‘˜38341‚gÕò
<94ƒ„y’—µx‘th‚‹2”Õ‚(o36‚Ô6„R…G±Fª#‰b…3¯+k
Š
©<.L
Žf‹,„l½‚4¾‚VÕn¨G#‰b…3§…‚×k:„j
‚ü»9F¾@
®{0‚M¦uJ¶U0448‚§rÒZ¦4r1…—6i2‚Šq4‚)…~—û,5‚‡Q1‡{.R‘þR‚þk$.R9043‚¢}Ò¡26‚8uˆ¯bÒZ†K¯b90‚Ž|‘˜ƒK7825‚‡o”Õk:9y‡ 
—6‚L        
7„cþ}‹o’YpB
ƒ†1‹ˆ%%…„/

ˆ?'?D‚ka…k„|P
pŒZÒ
Ð\„sÉ       
§qµˆ‚"Ÿ$‡[PLÎM†1‹ˆ%%‡¶Y§'‚À_§‚Kê
P
ÎI&ô}΂3104‚ŠyÒ‰.2‚Š{0‚‚=3‚…m7747‚ˆ”Õkg85‚S‰h"ˆGm‚”Õl
^"‚LmP9‚«T‰GÒZª       ‰G8„]ˆkþt      3ŒRŠUA“>
œ([
³ ˆTƒj…5…(†N‰j&…C5'      
C6&‚7    ˆpŽn‹:t«-¡e
°fŠ;ƒD‘/ŠQ
Ö½‚Åw
3‡``Æ&
š][§
ˆg ®‡-õ„¶]lõXÃ,—N‡‚<Ÿ%
ƒ[
ƒ     2Uõ†N1‚‹303‚•jÒ”3‚o‘]1‚(–°6ƒ#1‚(4‚\\™qµ Ñhœ\™q†úd;50ƒ… —µ705‚ƒ9‚Ì:9˜xšfBŒf ƒ]M0ŠPšá!
ŽU"
<Ñhv.)
F
      E




1%


ƒe
f
%‚%


0‚\
%

""ŸV˜€€€€¿0
½™B‘‹A5…˜‚[§BN¦B
ƒt"Î9
Y0390‚ˆg‡WÒ‡«X1‚¤$ù629‚Ën3216‚’L…xž‚
ÒZ‘…xž‚
86‡*‚4•»#97696‚…}Ò„2asalt‚Š&–°j_35_3‚”D4‚”I5‚”N
create_col‚“ealwai‚©'ù†9f‚†•»4ivers‚‰<–°oc‚·8ü…Erd'
GN>}„"$1‚„T\ƒz…6Ýt“5&b“©7nƒ®`sƒ
K—ÄYxxyy00ƒ{zzƒ
yesyesdefault‚”Nùˆ[4
U‚"„†4ˆp†*DQ‡†!‡ “Gƒ6"‚„Xƒ
eˆ/ƒsjBŽQ“EŠ„|ƒ]/„cA‡I^ƒ
ƒU[(‡:U‡,      
ƒ>„\9To‚F‹s;S52*‚(=…‚8Ei‚p@‚8‚nƒ ƒ!’e„/ˆ[¥n†(‡e .‚h@Z_ƒ)Pv#A'Ek   =*&K"'
Œk‚C„
ˆ-6 ‡D†:!$„¢†‚>Lƒzƒ‚ƒUx…‰CŠ{’ƒ‚\+{‚{‚N‡
‚Y„h‚q™_ƒ#<
MR('Wzg?’2ƒZ8†}6'gjy


              
(‚"
        
+
                                                                    
*.G,D4„‰t‚ŠH.ƒj‚}T‚u NI*0„Eƒp‚f>    ˆ~
…kq"GI5K"zI!…J&„><X:!R!2gXV1‚‹,..‡Q"#ƒ?0K†„?N9m‹nJ##G”LŽ@2P-Jb
‚Zf‚,*‰Œ>‡P‚QA‚8†[†nºm‡rNKŠ7œ)…m0ƒ^&>ƒ>6                      U'28‹:‚z…?ƒ‚/5.
„:Š„_   nSaFBE
Kv0V†„B%ƒ‰^†rˆ]
g…A‡ƒ0‚6‰‹B„h‚…*„=0‚
ƒƒYueQƒˆ`„&„kOƒr•RF„<\i   <‚P†}‚‚OˆT5†FH$(
|†%„K„O3#Q/ŽŠLz7’|3:ƒ‚<ƒ.82l…D‚[6‚/`„7‡!„3'‚#

Kxƒ‚ƒUˆ\†(ƒH‚[‡"8ˆ‰z‡…o‹'"…lW]M_„L-V$‘L<‚g‚kˆ&     vgj‡>Œ„b“‡uªŽ8’^“H‚f…~E.„^„i4o‚2
Œ=I†2q>ZW
›†l‡^C—Jb‹<’sˆVˆy{…"hˆ‡#‡{†4†s?ˆ‰k…F!ƒ4‹˜/Ž†`;
Œ7ˆA†6y“n•(1
ƒƒƒiŠF
6-”›0e„.= q2„+ƒgD_ƒtB†ƒ3‚xv
b#DV%mJ‚0q&‚>‹E@‚a$9$+<%#~[a‚„8†YL;
3
‚9\ƒ1*!‚|‚j‚K…8‡"‰B.kŠlƒR‚$U8†Žö|‡Bƒ„aAP‡e\ƒ&LN*„"        
4t;S5‡\
$=„‚"6…[L$.‚h@Z_0P
?#Ak   =*&K"'
‡-ƒ  ‚C        ‡i
Mƒ!$¢M‡=‡We‚Wv‚{‚Y0‚q
5/R(!W
g?
‚LŒY‡Dbe"u


              
 ‚
        
2
                                                                    %vB‡V—7®op>   ˆ~
…kq"GI5K"zI!…J&„><X:!R!2gXV1‚‹,..‡l—2!c0Kw?9k‡`C##G‡/QŸ‡g‡e<)\Æ%¾=Æ+—6T§'  
Sa
‡]   #%
ƒX‚7¦`N‡l‡X¶WXB‡e‡^
&\i
[<‚!„1=
‡fT5„QH$(
O‡XP

K:5KNDTu‡b—6—:4ˆ& ‡\i
†E>S‡c‚e‡^ƒ
A§         4?K
ƒj=IƒU
j>—0
2W
Y=¦|‡h‡_—7Q‡g‡g!‡d—}6‡i;_C
v#Qq&(‚)‹E@‚a$9$+<%#~[aW
‚4‚
3
&‚QB"!

U
%%ŸS˜€€€€¿*[˜Z‡N040‰z„f—R(8%)(#$ƒ’i\[„† Š…
  Mœ`       ‚RKƒ!‡_„EŠHŒgÇ5Œ…@ TÊ(Nƒ‰zŽ‚+§Q(8%)(#$¦QõŽ\[„† Š…
ƒ-‚P—êF®‚§5¦5‡guå+Mu
yƒ0
;‚ ‰S    ’J3
*‘‰ƒŽr0~†-„|,‚D  ¾<„$-„|k‚ƒ12‚ˆf4‚Ÿ      †Ñ>‡©27‚œ'Òš\50‚›MÒš4‚Ò›56‚“'2‚ol%@–°6cl%@72ÌQ¾XN9‚o
ˆ –°1
?25‚ˆ%”Õkp8‚89‚Šb5‚
•PWù^
‰]W6‚’2-ƒQ‡xW"‚ 2{QÁ(     ˆ
„*Qø†?‚ßFo‡x‚×k
x{Q§)P2‚‚?kbƒ°2—ë†|1y
…=0-R‚X‡\Š.Q‰„$
ŒxC= ŽDS–6
0»<
‡\Š.‚ȃ?‚™…˃cS0‚56ƒ„|’%—µ{‘+128‚—/¢CÒZ•d¢C5‚„|80‚6
M¦Q'cƒMa’ò_„ÙU
‚j')/õ        a9™    $2ˆn
‡P™1ˆ{‡P‘d‚k†f†rqŒqƒV}      Š>
„ Ž„UŠoµF6¾>Z7Ÿ†]®o†‘d‚k†f†rq«‚_„ªVP΂2‡ƒ7169‚ŽK‘˜ƒ5984‚• >ÒZ“F >94967294‚?‚—û#L
5ƒ†˜Á…3þuˆ|†{5Œu’6&‡+ƒ”X“z½‚å†^®o…05Œu’6&ƒÔ‚M«H«…0x000000000000002b0x2b‚
2ýV21‚
Š|ù]
„62ƒ…—µ70‚‚91‚‹1•³ƒ=8258‚£:Ò¡o91‚‚P
†‚uŽW‰k¿l‘      
…Žxrƒ0j†;'0^a©N®u     †9–Vå‡$‡f‚s΃FŽxr†¬B„F0^ý
z
4uÅ…94‚„–þ"Pý68010‚„rÒƒ'5’t£B^
‘;¿IƒFƒ[2[2/[[[2[ˆ~A2[2[0+Y‰XX8…I™7ƒó} BŽ"bx…
ñOÜümŸ‡Õl7Fƒ[2[2/[[[2[ˆ~A2[2[0+Y‰XX‚HâS
‚*‚h‚¨fƒAbxý‚M0kib‚
…zth…1stx
„c~i~346‚Ž9‘˜6}…ˆyÃ\µJ
%Õwƒ)‡Á‚W0‚‚35‚ o„…
68‚™
 9ÒZ—B 9830‚©GÒ§|6‚†v”‹0†UƒÒR‚606Ñr…+”‹0‡j"ùsƒ¦ƒ
„I„O6169‚‚u8ƒ…;’—µ:‘E269‚‚N53056‚¢yÒ¡.60‡8026‚}908‚Œ‘˜|f7Šu† Š0[‰o›"+
.„k
#M#,         E    ƒ4Ðo8
"Š]„‹)nŽ7ÑW„>Š0[‰o›"+åIc
##5  
;    ‚¡Aü6΂Œ‚!Î
V
„Xn0‚“6¤ÒZ‘k¤1‚’G¤mšaÑb|¤m‡©V'3‹:4I„)¶OC3‡!—‚k4ƒ     ‚2—û#i54‚„~97‚•zÒ”/6741‚…\Ò„70kƒ‹+—ãoD9ƒ       šb—û8(24‚¦Ò¤@acksum‚ŠI–°‚
first‚ˆX–°28’u£C^
‘<—)‡…W‡T9Wó~GŽ C!(
ˆ_w›

–7‘l§T¸Üünõ•^‡…W³'õ}ú—‚<—‚ŒP
#w§E¦{
…4å—?‚‚N0ƒ    Š_T—ûn1‚·1Òµf3‚¤#Kø5†Ëv0‚‚<4ƒ   †—ûD5‚’/629‚˜,Ò–a7‚‚F4ƒ…>—µ=,99999999999948840923025272786617279052734375‚…(‘¸ kbƒ
Ÿxd—ëOd9‡^‰y™J\Žd‚b
 „l5M#F+Eƒ;Y„t
=gŽ8Ž‚*Ã'—\Žd‚båI
d5
#6+<ă…,00000000000019895196601282805204391479492187‚†L‘¸Y/5‚„‘¸w1ƒ¦—ëe616‚‚i‘‰[520‚‘fÒ4‚‰g69404‚„=Ò‚r80/Žÿ…+9ƒ¦—ëe74‚Œ700‚Œ'800‚Œ2900‚Œ=99‹,_byte_aligned_mallocƒx¢pù`cƒ  ‡—û%86b126f2‚”je‚‘jgibƒ‹—ãokƒ«„I—ëf`„I"‚.!

 


X
x

:9 r(6‚
4
Y

C%  b 


=<


*

  ŸX˜€€€€¿4³04kib‚Ÿ9ŒV‹c“‚„á.|mb–gŽøth'
^d@}…&6 Öa'-ÏR
‚6
„.z„|†6†f‹?#‚ ½…Z‚þ@0í0
kzåJ”9h5„ˆ
‰ ‡p“EŒl„BŠ n–‚z$…m
…(†$P
SKNˆ=•*ƒw‹fŠV]„/"‚v‰Sy)‘}‰ˆJ„„|ˆ/ZŽ*Ušt†53ƒt‚%‚<;‡‡VŽ˜A3‰U|J2‡W*ˆD…t„d‚'‹EZƒ6wf8H‚7‚>‹…D‹-($%n’Iœl V‰m“E rf‰f‚


            
(‚"
        …    „        

 ‡Š*//%5
‡z8ŠR"„„[‡:%e]ƒZ‚`8      †^4:
8ƒL[=-<b?fK2†M„ x%N%*F‚o%‹<‚ˆD„ˆcƒ1n†U›HV™#•8…‰j‹@
‹rvk;‡K‹ºpŠ
Eˆ}B
<+ƒ"‡f‹2[‰G/„&ƒ!      ;8."% 0ƒ0ƒ.R6>ƒc>,E3D28Ž[…D^‚‚
„^ˆ‚"–yH„w‹hŽc{Ydh!{]UŽUc‚G:…I†~ƒ0e
Š~ZG„„aƒ'„yJH&‚vŠ     ˆƒF„?^‚*‚Q‡‚3‚ˆ


„„YN' vM$/ªƒDƒ}U‚E/M^$
2Wn0T@‡E„‚SB„="‚J…M"yO4VR‚GH‡>‚8‰]‡8ŒI…<‹jˆŠ'’$‚+„z† „Kw˜ 6Š-”F„4;<y‚uƒ™&‚.F‚.…(‡@NŠD‚v˜L    Œ{’>‰d…zˆ.
\    ƒO6‚%`„„—H‚Ž“[:ŠI
ˆJˆ4†F†X‡ƒ…‰k„9[ŽA˜2„Zˆ†0HL)ˆ…bU“U‘0‚NdA#‚Ž„‡lƒ)W‚4…‚EŠlU–š‹$uf‚s“'Z‹u‚).ŠsŒQŒviŽ8x@Ž'I.—K‰yŽ8‰Iˆe‚-‚%‚m‚?…IŽö}‡=
ƒ0—0[T"‚%Mƒm
&‡aQƒn‚5;<ƒ2…|S‚5
E29MƒEL1‡ZWƒ‡c
G:
†wM$% ‚ Œ‡Gzv


            
"‚
        f

     ‡3—8
…\8®o8    †^4:
8ƒL[=-<b?fK2†M„ x%N%*F‚o%‹<‚‡m—‚1n‡…p‡F†KV®YÆ%„hƃS‡j
‚Xp‡Y‚!w

&br  žt

‡m— 
:zp<¾0
M-‚m)^
r*‚'„T‚‡T


„SN' I8‡Xt=FPt‡b®qR‚+n† ‡[v‚~ 6S‡`
;<y
N&FF‚$
YNPY‡X
     rB§       O—4   ¶V7‡h®n<‡f‡D ‡f—
=u
‚s‡m†<C
‰|ix@  $W_—R0…Rfƒ`„a ˆ"  ‹4‚aƒ,‹G‡>ƒ\„R—l‡SŒH‘Y‡n

Œsœ#˜ 
…m
Fµsv†R‰]„’s-
•„‡–`‹=’i@¢yB„a®o †W       ‹4‚aƒ,‹G‡>‡KŸŽ*¾@JÎ&ý
§„ò(ÕK‡j»…I—8…@0}.‘u%%„WÇ Šu’R        
@*
.6ƒ2«\µL"H%%#‡}     ʃŽv„7â^í‚&0‚ÓF‹v0‚
‹t6‚
‰ÒZ
‡Rk‚ƒ3b‚
ib‚
…mib‚620‚Ž.«~ÒZŒc«~40‚~‘‰+p9‚‘ghzƒ‹.—ãoGmb‚‡X1$
žMŽf   ˆ[—X¢Ðn‹tªW…ÕK‡
܃uƆ=®–
ƒ†@¦`såLn³‚´®J2…a‘JƒAŸ-ƒ"2‡9¡"2‰I‚Àt   ˆµ#…t¬_`B‚}‚Hƒ     „“Ø.1"2‡9
7"‚¨SVÖ$õ>—T‡ƒ)BI.3ƒ„g‹8—µfŠ)0ƒ…5’)—µ4‘h6ƒ„—µ7ƒ„Œ$—µŠM430‚_ül=8‚‹
\ªN…SÑk‰B\ªN†R8‚«<‰\ÒZ©q‰\2ŠŠ)   …+‡,”Ž        
’%|
’-;’Ž(½*VÆ)
+…ˆ(|”8‚


=&
!!ŸW˜€€€€¿2Ž‚=•ÕS«…,ýŠ\h=x0520‚Ž1…b‹i—µa‹U7‚Œ|-rÒZ‹1-r2y
…20…A–|0ˆž@3ƒ„^—µ]Œ044…~—H4…]†–'ˆäI6‚‰q„.—µ-0‚‚E90‚~•³w3–z‡]‚^˜y&‹mhƒ4yƒ–7‡û‚ÕŒåHfœ!r‚‰Xd‚ß)¾@1ƒ„:u—µ9Œ93260†—KO4678912672195348198342567859761423426853791713924856961537284287419635345286179œ51‚‚04c6974652Š6833‚¥Ò£Q7‚/3484‹+„(86ƒ…8—µ79ƒ…V—µU
de8864ba114bf‚ŽH‘˜ƒ4„$
Œ)ˆZ‚w’lˆ-ƒƒ%ƒS–e†‚)õ
‚*)§†<®o‘!ˆ-ƒê1K„Ân330‚¦zÒ¥/5‚•\ŸpÒZ”Ÿp4….—6x702‚‚E5‹/Œ:…s†Eˆ2¨H‹u„c“±^’|
‚Œ:–6…K‡{µ?yœ„(†Eˆ2¶r‚ömtü}7ÕB³]ÝÎ
ƒ412‚‹q•³ƒ}6‚‹r•³ƒ~5ƒG,‚ˆ\382‚ˆ”ÕkQ6‚“7…—6f04‚
uÒZ
œ*94a121bf132a98‚‚6Š„nŽ8†£š@Wp¨P-K ‰KI’!q“+¦ƒ‚GŸ˜"®oœp¶zâ4B‚‰KÝgO«…ý

‚0‚‘2‚žwœ#ÒZ,œ#4ƒ †1—û_2ƒ…2’6—µ1‘r%ef98a04765c34c1c2f3ed7a6f03a732f3b886‚y
ˆOk–þ3
‚5k7…8Ÿ
¨U9‘'‚U–»?¶ƒÌ7‚¨†FõP21‚
¢u„h
‚3786‚–Ò”84292‚…jÒ„66‚Œb•³„n782‚¨J$ÒZ¦$9ƒ     ‚4—û#k
f3d7b32808‚
¢x„h
‚!8‰:o‡IŽ¨Y*„Uš‚hc„TÑ\…~Ž¶p
‚*y…õF…c0‡"—‚l4ƒ ‚5—û#l98ƒ…—µ
mb‚…&–þj9‚Eˆx„<&…S‚vmŠ+¨caŽ*‚'Šnш`¶‚
…õRƒI‚'3‡G—ƒ672‚‡74Žÿ…08‚‚V9‚B0a1bdb4a073‚
’9£q
4‚
’=£q
23‚“¤'ÒZ‘L¤'mb‚y‘‰+kth'WÖc?‚ƒH:’e
½…\ƒë
ƒ
6ˆy‹~—@Œ&‚U…&˜{
|
…(ˆ&…F‡>ˆ[} i5*
ƒ,–J‘R†1ŠV†”Jv(‹$WK‚-Ž:‚@R‚F#Bƒ$aUD*Ž   ˆ^Š„\‡_‹/
…)D@ E3H†{;[†e…3‚[Z‚S‰1‚1_‘v‘)Š
‡
:
ŽM„…ˆR!…mj‚;]  F„z   …50‚ca
%ƒ
‡[.V)(Y#@Œ'oI‡rKƒ=
2T‰\‚I¢j”U’PE–„z‹CŠ)OŠz‘b \ ~‹Hv„OU                    2    >,E     Pt8Š,ˆx…=2“CLc†*‚„IUb…w†!‚…Qˆl„B?‡—
‚nOƒ†[,„B`t7‚W‡‚‚6ˆŠnxz('›SD‚uJƒ‚4‚
-ƒ0…^|>('P;‚38' (0_354#&K/qZŠ;Rƒ_‚{„w‚LƒF‡*‰a–-ŽR\:"…        N4R+!cl{ [PECq?Š6 zŠ
l›t“q;ƒp ‚;w@ª`Ž*¡H£)#&
!ƒH+OOPdeˆ/—Dƒ;o“‚Z‹|ŽR†X…Lq=„}ƒ-†F…W‚L6Š}‚V•]”d‡\†mCŽ}ƒTƒ~†“n•6ƒŒc.‚ŠEƒM‚'†‘.ƒ5’M=“9•…~Š     „sƒ~8‹>rz-F„H`K‚B„@‚I•Œ&‰;*[ƒLQ‚SNG,‚&†Žö~‡bL+ƒ‡JEK‚
ƒI    -M„P‡[

D‡n
†53
L
…_;…Y‡V\‡Z6
:Æ'hp]   F„z   …50‚ca
%ƒ
‡[.V)(Y#@Œ'oI‡l—1=
2T‡c
…FEW‡#‚À*0‡j
;Nb‚¾$t?¾>I,`
i7‚1„Ib
‡jH:r—R¶R      ‡z
(l—6†R
Q I‡@¶OS§]@#¦Z*‡h®m>‡g2""!
W 
k
#
8U`^

K
""ŸV˜€€€€¿0V—σWŸ
`
Vƒ~F
k$W&Q*
C060}—U(8%)(#‰x†F[B¨p     ˜%‡~œ%ÙNˆ     …eu›8“•'µNT(8%)(#œˆ-†F[B¶‚„éMæ®1XÆ&R†ŸS
Žj0}—X(8%)(#¶W(8%)(#„á1[0‚*U       4ƒ   †K—ûy706‚‡b”Õk-8‚A‘‰)?0‚‚29‚‚f
2310100000000‚fƒL„'•êc-1‚†¨qJ
(=‡Ñ„7¶‚†òS3‚‚^4‚ŒE54ƒ…#’w—µ"’$62630078797a‚‚(’¼l"721‚”Ò’I8‚“fe9745‚›2ue2‰Q9‰qg…:[‡ƒ…Rˆ3ƒ¨tƒMÑz2ˆ9‰qg…:[‡ƒ…Rˆ3ƒ¶‚00‚*„   167219200Š50‚‚M8‚š[›'ÒZ˜8[›'9‚‰X3Œ5q)…f      
¡'ƒ‹/ƒ3’,    ©&–0Æ+
ŒYõI‹/ƒ3’,„á‚Æ„<1‚’[Ò‘470‚”&Ò’[60‚‚;7‚>3738‚‰–þ‚m8‚H4u‘!‡#–|-* 
m^
‚K ‚
ƒC)‡“'»¼:\ ƒl‚)      ›£¢‰h³-®]ª*…~„<‡P5‚UŠ5•i‚Uƒs[ƒ[ˆ-;³
&‚'ƒ†
1
‚5‰5
žSS8ŽpU9
‚NmŒ|…c
Œk9   o„N¡ ‰(‚
‰)    
ŠN>²L
EP‹51ž‚^6…T…3‡,V‡Z†&ˆqR„epˆ     …3_87oJ
‰jµ‚<>‡\žO       ŒQ£¢‰hŸ\T   ÕR
Š5•i‚Uƒs¶‚®&³S
ê%mŸ&E—6
!9Æ)I‚+—ƒ¶SlÎ
ƒÆ.>‡‚nŸ\1‚^

V7†&ˆqR„epy*¶:5 §H0‚Šh5‚”‘˜ˆb10ƒ…—µ2‚›?Ò™t31‚“4ƒ  †W—û‚7ƒL—Äw15‚
‡ÒZ
…I8y‡ 
—6‚M        
14‚
›lÒZ
š!973‚«%Ò©Zk‚yˆp–þ3‚Vib’
Âth‚¡IÝŒ{5‚…‚M†
‹q¡#‡ÑbH…‚M†
‹q…§ƒ‚`340‚’ÒT8‚IÒŽ~9‚o5ÒZŽ$51‚
ÒZ
ŽC48‚«V‘‰F520‚
¡&ÒZ
Ÿ[34‚…•£p-6…c8H †c‚†s‰W‚‚ƒ5ƒC<4‚
‚ŠÀv      ˆ"bL‚~‚"oÑb …‚†s‰W‚‚ƒ5…¯?X®H§-£LV"Šuo1‚‚_9‚‹L6‚‹P‰cU{†)Pžs„e¡+‡ÑbŠ‰cU{åJ6ƒ-‡l—49ý      ƒ!‚`126‚§iÒ¦9‚ªPŽ,ÒZ©Ž,2‚‡P‘þQ89‚…F66ƒ…“D—µ’P76‚ÌT83623321994526‚…‘¸7‚„u U‘¸m; F7‚‘k¡3Ò …§ƒ)50‚‚]891‚˜P     £q–2       3‚˜+     £q–
      5‚˜     £q•h       7‚—a     £q•C       9‚—<     £q•       907‚—   £q”y       9‚—        £”k11‚–[       £q”=       3‚–&     "£q "4‚–£“z6‚•N       "£q“0       "8‚•@£“"9‚•£’28‚”a        ƒj£q’C    ƒj30‚”< £q’       2‚”     £q‘y       4‚“r     £q‘T       5‚“M     £q‘/       8‚“(     £q‘
        40‚“    £qe       1‚’^     £q@       53‚’    .£q       .5‚‘x     £qZ       7‚‘S     £q5       60‚‘.    £q       2‚‘              £qŽk       6‚d     £qŽF       9‚?     £qŽ!       71‚u    £qW       2‚     £q|       4‚g£I7‚)       "£q       "9‚Žd     £qŒF       80‚£Œ}3‚Ž?      £qŒ!       4‚Ž     £q‹|      9‚u     £q‹W       90‚P    £q‹2       2‚+     £q‹
       7‚     £qŠh       8‚„>D„I¡;‰V”"¥#Ñb‚sD„I…§ƒ1ÝU¤
       ‚000‚Œa £qŠC       6‚Œ<     £qŠ       8‚Œ     £q‰y       11‚‹]£q‰?2‚‹8        £q‰       8‚‹     £qˆu       24‚Šn    £qˆP       6‚ŠI     £qˆ+       8‚‰s     3Ž}£q‡U    3Ž}2938‚ˆ”Õkc4ƒ     †b—û‚6?.,

%3


U
e

…%
"C'

h  I
!!ŸW˜€€€€¿2‡…™/g06870‚‚e9‚•V¡C‡Ñ”…§ƒ9‚`0446‚£HÒ¡}22ƒ…J—µIdƒ    ‡—û%fƒ ‡—û%a5181‚
¢t„h
‚ghz‚lkbƒ®—ë„Kth2k/‚S7
ƒ.‰~¤S„D`‚D—b†h‰}kY0›‚-„a”ƒU‚#šc4ƒE*·ƒk‚}†q†#¢‚+
Šg51…-4…¬
”"> 6fZ7‚[‰ŠIN‰h

‚





ƒH
                      
ƒo‡Žu„O…
‰0C„Jƒ<z,NMLƒ74‚\XqrFG1)7.[„„0
,%qpX    PIi‹k„yŠUbCŒ‚ ›n“T,d}y˜D&‚‚‚K‚!ƒ;
ƒ5
lŒ      }?xv„3                                                            Lit8=‚C"¢E„†U3†NK<‹2ˆ{„†PŠŠ_SVP‚F‚L‚T‚‰…[Šƒ1‡‚~¢<Z"„EbfD‚[†n‚‚Yƒ‚…3x‡Vˆh vN$
0      "HE"M
‚U.
‚#$‚4‚
-[$
LZU@
*)@†…>‚0…Š*       „<‡'CŽ<„tqƒsBn9
)ƒ#NJ2[cls[PECq?ˆƒ]†GA™H‡8’>º7”      "‰F‚0‚<•4„‰8‚]ŸHˆ9ˆ5ƒh‰>‚r‹N‡‡+t†<‚*‚…†+Žy˜-”]‡0‡L‰c…d“n•=*Œ!ƒY„T™¥V–œ        .‡H$„P$—_Œ3£wU‚‹2Ž/‚x,ƒ6
:ŽŠv‚%‚[(m5:@!(‚'
†+Žös:‡_—6RKx‡_2‚+5„@—‡V
‚4
>
…@‚‡P|

x





‚ 
                      
‡DÆ'O<z,NMLƒ74‚\XqrFG1)7.[„„0
,%qpX       PIi‡o—‚&‡`‚ “†JJ
V}y‡O
«P4”7
‚(3  l‡‰=a  ljS~!¾!x¾3U/b
`D‚9„:F ]‡WGqŸ#Ÿ—<ƒZAŸ‡k+¶
AWl¦„‚‚iÝAJ‚7—:Ÿ

$Š}!+:o
R(^'.@
!0Œ=‹Z†IˆR‰cƒOˆ¡Kµg|œŠ†IˆR‰cƒO…§ƒA00‚ X•ñ†10‚‚D4ƒF,n |-)m„“ƒ\%-)ghzƒ‹—ão*1‚‹T\™0’-¡S¥0Ñb‰6T\™0…€V[§ƒI‚Šv59‚ƒ:ƒv„Uu178ƒ„p“s—µo’m828182845905ƒ2‚“‚ƒN…p†¡[‡Ñb‘F‚ƒN…p†…§ƒQ‚`0‚‚N0rpm‚˜1‡Z†g—ƒ$»…20ƒ †j—û‚41728‚‚ByÒZ
wy5‚B9‚†J£nÒZ„NJ£n8‡L—ƒ36‚’s966‚ˆ*”Õku99‚ˆ*’û'43‚£o†4¡cÒ¢$†4…§ƒY1…—6O5718‚ˆ!”Õkl61‚ˆ+’û'5724‚—=Ò•r9‡/–‚_6‚–C„a4‚‹'ˆ“ ¡k„      
‡
Ñb‰\ˆ…€N§ƒa»8Æ
1‚‰'–þƒ
3±‡:¾ƒ‚À;4ƒ„s—µr5544‚ˆ”ÕkO5´l      
Œ’Q“q„-‚^„U¾¶?)Ýa‘“q„-¶P®qM0‚‘       •Òc0ƒ‹—ão'kib‚-W‚     2‚‘e4$ƒršW*z/‚aGe,      ‡F„¹U‘·(*
@GHÆG…ÆvF¶‚"560‚…77‚‡[1‚‚Q8‚«NÒª6bO/‰Š!uÒZ‡SŠ!u0‚‰^193‚¤HÒ¢}2‚¬h‹RÒZ«‹R40‚„UdŒMr¤GÒZƒ
dŒMr¤G7‚…Rõ3586‚ˆ<”Õ72‚¦%’mÒZ¤Z’m8…
„<3—*JÝ39ƒ„je—µiŒY0‚‚d„“z—µ~“7‚… …i…eŽ2ÑzƒU…i…e3ƒ„"—µ!470‚S‰jˆSy‚”Õl
`‚NyR6ƒ…n—µm9352†—Q7‚‹B8ƒ…M—µL275‚‡}”ÕkH9ƒ„[ŽX—µZ=8‚’b”(

-C8D?

 
$N T
Y


"1

))ŸO˜€€€€¿"‰ƒ*ƒ¹NÑbŽE’b…€‚V‚©‚07800ƒƒd—ÄQ1‚‡\‘þ]227‚‡`”Õk+84‚™Ò—P2ƒ„+—µ*5y
…30—}07‚8„@'—µ?q9™$r ‘CŒF[†“!‚wÒZ xŒF[†“!‚w46‚K
p…/”–yƒ.983‚ˆ(”Õks7‚Ž"6931348623157e‚>‘¸97e‚‚t‘¸&8…Y—#        ff3120e4f‚ž98ˆ
‰*„wŽ9ƒL¤p„W˜
‡‰s†‡=ŒŠ‚
ƒm)
+N8      yf!>!‚}!4‚K&I
Tr<
=

…gH      
O%=‚…<`7S"b2I$,
s'7D-H–;„)"…IŽ8XK…%ÁŠ{˜U‰;Š
—$4
J    (21HŠa„l-±7Ä0‚*Ð •`†*„{*‰vƒt‚&“S–6&Šh‰lX''''<'''''''''GN''''''''C'''''''oZ7>'''''2(„o…
Š       
l   [;#Gx‚^‚6‡
?M‚‚;Y6=‚x`A>†=,p"o:‚%<NŠ‚g.KŒg:QQ5
t+.‚Kb<c‚QY‘ ‰L™ˆq ‘E…8#›*^oM

‚n[
‰šA‚&ŽRƒ@UgK
ƒp                                                                          u
*P‚i ƒ|„"‡=‡e•?”Šb8,\‚FKu‚…#n&‚;‚? 2-ŠF‚p
…;˜9†Tžy
ˆp:‚F  ([63,8>i

3xOX-}
/?3#Q/t3KzR,…j„pƒOD‚v.‚#£)H‰„4…‚7‚}‚/†‰„‚L‘hˆL„)Cu‰†„WŒ‚qT'#–,‚o3”+†wŒŒ|FZ7Œ>)ƒ   ‚<Y…~,CƒwŠL‚„#…F6
=)ˆ?—>ƒ} A
ˆGkj‰gŽ"‡<‡+P†K„ …+†+&Žv˜'”^†zn†hM†R‡†o•?&‹lsK‚7ƒ<$[#‚3Œ*›U‚\VB‚ƒM=„…d‰†RV†<i‡‚h‚&7}`„‡t†Y‚š={‚%†0
‚B„Ds‚}$‚I‚m˜Gsj5xx3
VTŽ÷‡b
ƒV"—QJ-Kƒˆ‚9ƒ2,žoE
„Z-¬]Ä0—<‡ƒ9Z
‚{*US‡N"‡]
—7h‡NX''''<'''''''''GN''''''''C'''''''oZ7>'''''2®ox‚6‡
?M‚‚;Y6=‚x`A>†=,p"o:‚%<NŠ‚g.K‡p—8‡`‚`F ‘EC‡U[§Ë
΂7"‡jI¾%|‡\
‚¶,(I
‡r
„W:m
‡VHŸ>¶ODZWˆ6ŸR'‚‚m‡WK‚}qFZ‚Ÿ

)4       —JDh,CJ—/d#„&6)¦w
‚-k¶Kb‡d
5$[#_3‡i`‡k—(k‡W2ƒj&Hˆ9}`„_‚">‚
‚B
ƒ`‚5w0†N—s'”^ˆ#V‡_                                                                                   ˆSy‚ŽO’P¹\–‚å‰GÕl–('”^„ƒS:*                                                                             
_‚MyQŸ*‚‰‡oý‚)0ƒ†—ãb0~
;†*¾?.3901‚†>Ò„s9074‚ˆ”Õkaba201079‚¾1˜S‚!r.&™#ˆB,†n†&‰m†r†sˆvÑl‹c&™#„ƒ
5‚’91‚‘k–°ƒ12‚‚w ‚+Kc–°6f‚+Kc2‚‚G200‚‚U2ƒ”—µ“+9ƒÆ~—ÌW‚:30c†—L40…—I8… —6j90‚‚T3‚¥wƒm‚‚7Ò%¤,ƒm‚00‚‚L178‚¥6“ÒZ£k“9‚‚•³z4‚¦f„-x¥DÁtÑb¥„-‡©‹
:0599‚‡k”Õk61‡-—‚w972‚ˆN”Õ88‚ˆ”ÕkZ31‚‚Y4193‚ˆW”Õ"208‚S
ˆ
A”ÕXA58ƒ…—µe‚‚^‘¸6382‚ˆU”Õ 791‚ˆ?952685†bb08d8762920285f08f1c0‚ˆ(’û'25‚ŒU-4Š…&Š|ÒZ‹
-4Š…&Š|0‚…"–þf1471‚ˆ”Õkj8…$—6nk‚D^6‚ˆxÒ‡-01
[ƒ|†M‡
Ù}„¢r400ŽaT000ˆK9‚žšÒZœSš61‚‚I83y&„y      

—6$C

*2&
’:ED
-
"0&(
&

""ŸV˜€€€€¿0Ž0869431‚‡t”Õk?7‚…&Š7ƒ[…€S00‚‚:87‚¢tÒ¡)5259‚ˆ3”Õk~6‡[—ƒ%793‚ˆ:”Õ81‚‚X983‚‡{”ÕkF8‚›N‚Òš„á}2233‚”/Ò’d509‚ˆ361‚‚A980‚’'Ò\9‚Œ5T&”ÒZŠjT&”00‚‚C1y
…>0—6
0569‚‡'_3_name‚ƒ‚A
¬ùa
n'd3da9ff87196312aaa33076627ccb7943ef79e]—ó:5e‚ygbƒ—C˜šOk‚C^‹R—ãokbƒ‹h—ë‚mb‚‚c9
‚6{‚R‚=
¥&:>ˆf…h™a=4g–†-$B —    …E5>†9ƨ‚Y([„‚cSm   „‚‚@Jb†nŽŽR#EiwIˆ4k„B‡0 
Š
sˆ…‚"‚dŽ|rƒNAƒ^)/q4K\[‚Gf+=1p‚Sƒ…{!"e%:‘\RŽ/¯‡³C
…‡[ƒW*ƒ*‚QL‚<‚jŒ^,‹3‹}’0Š
S‡‹C‚BNN…jŠƒ–6ƒ¨
R4Aƒ§+D‚U¦/Š_,‚s(ƒ5˜$rŠˆpŒu.:ž†YŽUŠd6Ž;ŒH…‚%ˆHžrŠ7Ž‡_‡t†%„!….‡^Ž˜ ”a†H‡}P†)‡>†7†‡#‡|†y†MŽQ.)‹6ƒG…’«<xœ"•P"Žr‚,˜}‘4™r9O‚y,Ž÷‡b—R—1%    $„‚‡39—:ƒa#EŸ‚#‡F3         
Ÿ‡osˆ®orSNAƒ^)/q4K\[‚Gf+=1p‚Sƒ…{!"e%:‘\‡qŸ‚<“k‡EÆ*§ \Ò‚#‡‰Q
KmS$¾ ¾4]
‚-‚kL„k
R— I`Ÿ$¶
.Ÿ
#   ‡^-…(
‚6‚»-8‚iS[‡pO—7—=J
]ƒqO

90‚<‚jƒ^‚ƒƒt„e„tx‚ƒ5ƒmˆ*1’Z?¹jÑb<ƒ^‚ƒƒt„e„tx‚ƒ5ƒm†úT…?¯‚70‚‡B255‚¨XÒ§
9‚"•`|%“n“|Cn1    ˆw…N‚=‡'†Or…0„W,ˆe
°
¦V’Uh•!f
‚b¦lƒ# ¸%
ƒPe‚ƒr’\‘6—3%‡r‚Uƒ<i   ,.‚d<”iŠcÀ=Z
       Šu‡2!‚r.†1”…l…1†WÆkg,‡);%&aNT"u/+4–‚q§y

\ž}VˆB’Uh•!f
‚b¦lƒ#Ÿ$†2
ƒBe‚‡^-Ÿ5®‘—6Ÿ+
{‚‚ s2R>í(;qå8ýsZ
   ¶‚9ƒk!¦‚rí3,‡g
D%
g0ƒ‹—ão$4‚‡Q7504‚•Ò”48‚
¬EÒZ
ªz2H‚…'…,’I†$      /„XDM‡Ñbƒ\…,’„º)‚nÆ   ‚‘48—@
     M      "038‚J‘‰)H11‚HÒ›}23372036854775807D†=•]2o9ƒQ&W—Eσ;‘·!‚À(U„ƒ¶‚ 8fŽ^†9e•'o7³B–{‘‰‚D®N4ƒ    †q—û‚5y„!—6
I!99‚“%Ò‘Z91‚ƒ3        ˆz…O‚=‡+†Xs…+¹       ¦V’Th•!f
‚b¦lƒ# ¸'

ƒUc‚ƒtgŠtŠ5†b‘8—3%‡t‚Uƒ<”kŠeÀ?Z
 Šx‚t…3†YÆlg b
,‡.;* `    L       S"w3-.
–‚u§    ]ž}VˆD’Th•!f
‚b¦lƒ#Ÿ$†4

ƒHc‚‡^/Ÿ8®qŒŠtŠ5†b—6Ÿ+
}‚‚ s4T@Ò:ýuZ
      ¶‚<§‚tí3.‡g
F%
gŸ 927‚“{‘˜ˆJ58‚Œª,ÒZŠ5ª,75
ŠvR9‚“c4~‰„#$

       e0
J
¨i>¯6Š½;7$

       ¾AƒU0Õr
NJ¶p
‚…õƒm06564584124654e‚B‘¸=7e‚
‰Q‘¸]7e‚‚x‘¸*1‚‘aÒ42‚…`666‚‡48‚ n„…    5„…S¥×B@ï0ŠUÑ£<§’}…·‚6375‚ˆE”Õ7283‚‡i”Õk48…9—second‚ˆ`–°2$6       Š?    ”
…FoQ‰9
ˆg|•
½,lÆ1ƒÎƒ{o…Þ6
+|Ë
0‚¤
8‚*`ÒZ(  ""7
‰:k
„<
hj=ƒ^
nAg

""ŸV˜€€€€¿0u0960869‚‡r”Õk=3‚Š@•Ò\4ƒ       †w—û‚%64‚ƒ7‚”
„sF˜t‹.‚9„UƒÎƒ(F˜t‹.‚904‚ƒ1‚‹^‘¸E2‚ƒK‘¸}5‡.‘–‚x51‚…TÒ„  6‚Ÿ~LFKK‚3Ñbž3LFKK‡©Aj0‚‚\814‚–8Ò”m8˜}&r"‡NM’m.N‡PˆÒJ"…JNM’m.N‡P00‚‰D10‚‚[2‚/80‚
Ÿ|ÒZ
ž130‚‚c4‚“;Œ˜
ÒZ‘pŒ˜
825a79ce145‚‘9ƒq"“                 ‚^…N      Š<NMRrqhrfqqq„‚QLFKKƒD/qqq`6E
–uL)6„[ƒsˆ/

Xƒc*  !ì)„‰5ƒ_"‚                        Î^„ Š<NMRrqhrfqqq„‚QLFKKƒD/qqq`6‡™…00‚‰O36b2fa443fec‚—L4766‚ˆ1”Õk|5‚…>6‚8‚…E0‚9‚Ž
cˆ…R
¦‘B
7ê4‚þq
50‚&9‚bˆa„99‰>nbackfil‚Šb–°‚&a6daf340df99ba93c‚ŽVb78184be266fd70‚’2e99‚V
–vLth‚%¸/–9_$ŒFŸI†JiÐJ
8,Š.P"7_½ƒP‡\†´H
8____‚   _________‚_____‚builtin_add_overflow‚Ä7ùbswap32‚Ä5ùcdecl‚ÛG76ùfiG76declspecƒ†'/˜Šq
A/stdcall‚Û
C
?`^ùfk
C
?`^afpfssetlock‚´$ù‰{ppli‚%½T<†7blob>
yteswap_ulong‚Ä=ùconfig~öU˜:¾k        tent~÷'—   ƒKN‚,0Ïr½‚&¾,$N‚,0…ýP*reate_triggƒ†I„U<Bdata~0ö$‚   „
w@…!‚‚<¾b
:       
w!„A‚‚<base_61ocsiz~-dÉ•mƒP*2Ïw½‚s‚T¾-)*2…ýP/ubl?    rop_triggƒ†r†tƒŒSfilter_t‚·Uhave_sqlite_config_h‚
†nùidx~öB‚(z¾X†(znt@64Atƒ‹~limit_~bmax_~inode‚S… iGR”ÕiO(G`oid_‚ŠZüosparent‚S… ijkB”ÕiW0j$Bointer‚f•êrintf‚w¦t$ƒkreadwritebarri‚Ä?ùhs_‚owid‚S… ut8”ÕiS8t8_‘Fƒ,– #%‚ƒ5=‚›yJé9‚™p…¯@/segdir‚$ƒLƒ^N…=/J‚.Ïsü,%ƒ^N/J‚.…ýN+ment‚$ƒMƒ^

G…Uƒ4Ïtü,&ƒ^

G@ƒ4…ýN,hape‚Kƒ`I7
ÉP    ”—(Iâ`
‚a    tart_intervƒ†Zt„z
t‚ƒN*<TÏuü,'*<T…ýP-epƒˆk„mtable_68extB16Dundoƒr†C
*'
]‚T3tƒŒv2‚‹1•ù„ocabvŠŽÿ~
win32ƒ†&/˜Šq
@/a5‚nd)C&&=&      
$.5EL‚d} &TTUS
\"
 /B!,*A
%244$V
O1ZA
$Q,
%&r
HH82‚l{.!%j-@8     m6Z       I9]
#9)UE3K|$
Y3$‚E&/%
8v1M%/ -+5<+  8bj^1*/%

      
i‚    >

     =0:
T_1 8. 4"9        )<%             

'5     O  4,;
! 
2*       =     ‚`2           ,     Q
$3O+D1>MKF
9
(&V!

)$C%
,,%G)@
!N
‚&)/:

!&"YB!,l5JX>

A3‚0‚L+a&&1,B\.M'GIS
)  :D-)06
@h# N.#`$e(
 \S*NEMRKS %Qt.6   5Z]6e]W!#K:R3-
I:w.#h7      (
$/F:?6Z3dH)CC<=C]
6
L_4

O
J3Ih!.F&B&+=E!M6
Ye1<('V|JN   +_<

&m) -      4qH1
"
&v@a ,

   #L
P&1     
      p%"'D\8Q19,3iu;‚Rt
\"
       6"
J
#;T3k7*'$,        L
?I'CHw 
97
(oF7&


* 
:8=
‚p4.
       )X       
/,‚(        $OQI*  (*g       /AM9(E07
D
x)=1
:
M



=



D
%#)"LOO
&)



$+-RA?2'

B

""ŸV˜€€€€¿0Ò][,}F

$
?"/:3          T\1$:<
.L'&'
-*
LD."$*!(9    
        >

        v

?sX6M0"
O&%.V1!*
)     
"
k$%

S4S=<!D  HL!s        T([<
G?#
8Si      )VM'a
    !N
31Bj

c"


E+Tv R*J'!+CM%
t_!+10
663"'
%
=*"
.!)%'E+<<y!18Jc2,'
-5
L7E2$     EV   ZC
:D@#18,#7!,a?.[@D(
6  
5j

u/4;] <Pif=    ,  /@&%XL
57# 4=r    :

4Y],
" =#!7&
   
#


m#,`E
>)

2+$
2&    (&40R\CX=H#(
O0330‚-+ ie"&
$$‚E).W1!     #4    "63(6^3     >A !Y'a(%:"I
OJ3e8$9!2       Q

m2   
        

QTF)
"9
>g8,K0x_?` C 52#
(:(cq4T/
4      $:"    
       %
$>?
33(CT07       
%U@
T+!OG10D      

&

0$:<4 K
       V(6oY(/C %GGZ
.7.    1      &  /7  %&g78$DE%8.]+ 8#x      
&!)-t
?L/S>'7' zE$+,+/!vF)54M6e

&sGD7
Y&GBMj; c
b&!-ewO_VKC.    
/t .O1&! QQ- P%]h;iw{!#43g9).S)y‚(   )'-08F))a-B'b     


E7 
,Ez%H        c   

F
4B5:?+)'&
MlI%\Y%&nZF &;
**"
2Hh,5I  @<z@8
oAK(
%b#
$.I@?;jGs1wU0=C<ZG&>#D
0
O`A$**D0k8N#x YWG/ <"
)'D@EtF‚=
#m.JK"
g-
*0X,       uv3.O2?*‚l2       0r
KQW
gn1
)!‚dGG&3A!I#;2
        ;
*,%C"  ,6G1+68d#.JYb34-
(M-kO      &PG"1*3*
\v+M
        N3
FGt#:4(z"]}+%J0S
2%h,.
##
A
"
%!#* E4R$8*]#LV(

‚" 
K<       I@=
4:6&@'  V,N%B}./t  5   w*‚/9!&Q
2&       &,/
o&h4X6 1,

‡f%A
(v59$8z"HCrz
4  
l      

   )F3        
Z              f
.‚!&*+    "
4‚*!F
8'S/K7=
,
   .T
^7P#!qZ';
$2
7Qj

8-V#^z.#fZU6

#3e
  & kA  H'
6%K 
Bh$02I      LpS&#4<>!u8(# y9Oh/"
]
Ff

eE‚0‚$DF

["AFd6ƒJ?J‚)fhL@5]&        ?#uOc
&y
    W4$25wo    
     ., <$H"p       i
,%Vk
:C  8@f/$V$'/? 
?
!DF'C}6qy
d5Q&P0FJ_}`Bj3;__)h


       2$&K89""^    ‚6&(f†Xh‚Ikd-

$
57zw(‰gLA+3cZ
'?&F(c
#J*
s@<fH(!}%
i)Bq&1y3DC7 
/K)

5.{NRH(‚G\‚   /#6!'QS!,Z3
>Nu-[ƒ8?@     K:/(
%,(2,/Qkv+@
$
"U     ,/  ,p
#U}
5.G\    
6  ]#([7 !uxB`     ;?!/?01JFw1-mJ$X$2      HnM*GT8s/%O
        &2,"%
<$
      
=!‚   0<!i  ]`"73>X

^gDH0@0$
""ŸV˜€€€€¿0ÒO
*[!: "‚-)5&0,(A8
A"151M.5
MN%@uPs 
*
$"
;|<>n/
‡L"        o\nd3$
        %!.^HO0  j*]S(-Ag'1:"K':‚!
Zb)


($2 K
(#   >2D#,4WS‚P
"      SLO2O?
ceC3(
@!‚K
`
H8
2\d(3t‚&^      k^rL:p)s-N;

]+
[o
:!
*I%*
N'
#

.#HVr5X‚Q\& =Ue,j$hHl17)].B.F
!#5$',    9I~P
_&-*5
#-
j‚L-['L/e1T&:        *-
(  0‚H?/{

@$-10*GL%
,
1+H--~.+B%
<.T,ƒY
$ ,_hN'3>.!N        






.
36
="
        
U,J(2                                 
&N  .)            \<








>1M)&CZH  "B
QZ'(`w!
F1 M&Bs4CTOmRF"Pu9qV91Z8      +\0bE%5g-B7ELRI
!n,%,&         & Ei  #,#L
!
vM8U.! (p?6E
+B-
0
#E/62!
0*<C9
%-+ 7
W! 
$!2Tb!+U'-3$:=      !I;`1J$k‚H0''o*Z‚oC$     [+‚$‚#u]&
%:
6¬ƒ,06Gnl?$-'k"
2&^
}O/^
b1Z`1,p8$U%K5%]#)

!UkK&      "
A&   AHN\.hAN
B/$a^91&E
%S2i
=2F4ƒ()ƒ6$"f9+I%.'0$!      gH"08hƒAV,y,68QZy/R       z(
Z4m#Q#!ex3I;Z;WQC‚!2Y|:\,p#2,?-HF$Qm[=s2KueNE8>
N[‚W-?
15@|T$@*=&y.G?Yk‚H‚S
U3?

94*#J@
c&#Q      :
h     
)]^G,#UuS    f$T     cEV< 
$LcNG  0ZU0
5,t&
,      2:)p\2RL#U)
HK! WR2P:+\I
+-2f.4WV
=deA58-

 
I#*'"+57.I4%=H#-2  
6V).5
y>     07gW<#6-]W5*zO XpjN$
CPp+'  #K2

D        
3+#
F./Xj
9'?-'
.F$3#d(H+x,‚A_H@!(N4        a004"      E     "Dg0B
p    „rt$
%     .3=')=?     k)0‚,#("/lK K0+
)?$g(?U5$gP7cD.!'. 
PY f#;%+
U     
)
4"(-)
  !)8d?
-MD    
5RZ.G
8'
B;? ##T,
ItNWƒ

        /V   56JLO$$s3g]\4.1TB.D%BZGl
      ,;d2Pb(%$095R) 18--BB
#m$w    $7:!B$3,3%9'
4nK- >:
;#&d&}2'(7+O6"XF9^"
P,gGIa
        
/_,'
?N<'m#fX:U!@$0G$^
"#
$
‚2
/TE1(6(q$4(55&?Gp    8M ^Sf-

(
P<G]    H#[+*~%L#
/
e1     "
~)
 Eq6!01"#/$*?'\PW01(%$"(q%q"x6*.$A3‚

=*7- ‚%@)-L-(S*7/
;#‚+!0"`$L15C."AmU/7-2":s3 p)vH+($4   )=
.tGII
5
/  /G,
-U?!
e0
 @$<2)5I'Y&
    2  #;40:4I.!A3E #&      0ZU  <"
140_ ',4>hl\p$:,S##z'|$iiD‚
/&       &$-,_
*M!h;‚;  3&B;- B#K+=6 A)("(1G5      4&8%K
A&%;u4Hb!3F59(%0@'>
_%`*=g$22!#! !T"
".+)#h‚9RPI &K<6Sk;14s ,
2y
*g":9<G/fmI%)%   II79-I1V%Zu20:I7?,
!,    E")E"
&&RK`#C.O    8.
)F$N;k%P
„F)IB      )'4'
67(U$B 6+t
$[%,'W
H       5;
    
83&3C
R'    #2+)#@07   eH{=
<            )(@(;*$ 
.x^L0BbECp<CA
$r"RK2 /G_-70*!3
      \^< &g6'    }5 
@*
4*W$<(9G'
8<
'.b1

!6fNZd
JRi2   :*'G]j+I)M7Vl=)
I;p‚[
8#D
a$@=
0X}    S.4D !&
!!ŸW˜€€€€ ¿2
Ó>T
‚I`pC           6&0  ,.2  '"(:>}5/#7)A]'`PiJD
dG
L"$    "Ub
$/DzB&1      (P#)             ^N
*
> ''.'  ,/

B$BL'3.*I.L@\.0      
&& Q
N5W5O2
,%"      #F    c7BlA   a%7Z`r-
F      %      ‚
7u


)
        
L,yW

%ROx     A~h0"abE@M>
O0             Ypo$‚$&
C]5 D
WAU!)h+%N
H!SL
    


,%#+
,&
3(

       

>C
$c@i04;‚5&‚lgbg
%0   9G)"I"
h

P%   ?,&:HB")l{0  2
4
                    
OF%         
       &w<‚

##A)
5=!M)>$XNXL…l &4/4J*8F3&
/"9
/&9Ru
)-
(3`    >x"6;Y6d&   +-B3$,YS%`S#8O%I,&(
R 6!<P-'U/W2+()?A cb
?F/$&Fd76       7)^9M‚*'((/L.@8*       9"L?dw!&d/D]NY&=<e5  y#U3        Q       :5q&[5)0
`#?@{>B9\                -K"H;O)3    E(i<    ay<>FSb
DZg`ECM/'*

3
U$:.‚L'?N!;+%LUmz        
     
22CM(
tU<Z0/p>),^      8J5wOLiOH@E&:
/CKR)!Z
,U!./^

>(Qm
4a0g5j}*
I6u"3(!g     3'=


A#

,"jr[*-4#Vp$7,
kgq',L
Kz7
$6j;#K)29"i

)abFaU
-47<K8M$39I&‚1(~2tO04j5    S

o&
     5S
&.!-2K@E.
(GM
*!   BECVD@3S)@
?_        CS>^4qCV+!RMJSE5.
'

12,j?9$!])o&='ir5oZ=\,~2,


<

ZT
+}@:^T(

x$g:0BWd 
S    5b'yL9)<>
 +6D&GQ`d    <)33\'‚             ‚>[\Bh5=&Z<0cB
U2|3;-6r36e.N*q\'M0;2PFh48&)!8=P4 -9
(v3(-$"kn",     >M'4
\Bu     ‚             %!F $  qG%D(<\^

C        L)s!z=}&|A(
[=f9

')u#)Qƒv*$BQ2&*$,N'%(    {5WE
)
.n‚
        #%8f/       08h4        d       $K
]
        ‚9c
&E$*`*",R)L

J
)

     )

9Z$>!1&
 !(HE
5+?& +\   1G
        
&&
D Q~(
0G_Hƒr+2
&3& |#2A!   u     #52i
‚QS<
$0$%Z@
|q$       'Q
W394)&K"0‚fTZH
5K

h‚Yb 2F‚,o851
$=%7=BH]9 mO!NG*(8;
'`s0r$j@PJ    aJ%32W             #B;i        &7b H
5     OZz(*
N/o$A0JC5R4!!
2
M,$
 J&%^4#
36/>  G+      
   +m@

"
        \_xB
e-O.7:(&7e"+cMdj
6[ULYmS&("';*e
+=
7.';x8J#@69?M2 K

]9W,(jp‚
)E"Ft
-               !N&O
"Q-V  d    C(3

g0&7CF<<Gc1     .#* 6
'*        'B9/$S       g$C6&9$t_f+ <s*7
&;
        +N
Q

        Jc'C/'L5&N1ƒbw*, 

I-O
        Uf[HY0o).,dW?j       +idbFk8W@F\kD:a;-"W
6p&\[    ,R#

-#JI")dJ/ +5        
2#
/:%P2^2B+apR A%7#--   5>
jJ.ƒ>i
6w
-$1a.T'#[JL!=#M|K<*&31 k)(,""Vd4&a>  {LT&?
)ar‚JE4F*$'
H5     d9?
8]bA
+_gv
%03Og
h>T
^Q$
P'
(&
9g) G%1
YG9G2$/d ~(4,9!Yc $128ynIEsf>


-7,4     h„}
35   !?M?%VG
%;##WT'2NS4/|;)         
 
   );B     ':

^^1#=*b&t+!  
               F
/         


$o=oj
<$   9$#!.
)6'
)&P
Eƒ ‚ F
H
]
ƒ\:"6?-c     )‡S2PrIC3ƒRq.†R`Nƒ
u#$-… $ T
s…H@
""ŸV˜€€€€!¿0’Òƒ$‚s
=‚i;!.$R        #OBV=/R|     *‚a?
!‹T'!?ZSŠ-*26!‹B
Bj3‘Nd

”&0ŽQ  aŽ,.)JruZD Mƒ>#1%
YKƒD(             #(JA
@+mX!-!"!Y A
'06G!0>Y1d3!4       W7gD[ dB.g)&NJe-"C
/4
21

Sh 
he!Y
&aOB{„B   .   N
M&
,-
3.%ƒ^o%       P(V0
?;>!
(55-q&mUe<N@<
%-B      1-{".

$"J"
>--#g$cS%***)        06  'YN;
;ZiHA^3&% 6"$$oq;N(‚fKb3        $.il

QGXj<]P
x#"(9       H$B
E!'-XPG68b%
0K/

+,6v-<+(089}R$‚.‚8gt     5d:@Pp;_];)hY!l%B%amn6)H,a1;;(      *Lq‚8yc$?T81A   V-Mh

      U†:*
     ("$.B5(^                         
V   7*|1na:9ZL?          x+23!!4^&LgcQ63  v       BQ   >NF

        *8 #-       H  $$$eƒ,Qh%@4
2f     H
.M




83!Vj_:b 4C

950              !   1
G
        #
%?        O
GE
F
]
F>!A{.
!$„<U|O*,3H2    <47      6Q=
","_(       WoDQ]
    <      N&=j8Dh`F
#5\3A?%`4     
9

!&   :!>"YVFA4G0NXL

4&l
!‚
F.4'
67  3/5:H((     6Cq/45W+-       &hY


^9"2$+L$2.jo`-A3bLA58E%@$I
,glc=K=!6![M>#
0P&-8'":!j@` 
1


!F7     
  #
(

5'@)
:T7"

t<‚RQX‚@              Z7+-"F%-{Y
6?#
C$.#ŽösZF     ;
*#"
2&Hh,5I      @1z@8
o       (
%b

$   I?;jGs17U0=+<!G&"#D
‡YO`A$**'0k8
N#x Y<G/ <"
)'D@ET++
"#m.@K‡_     g-F
*0X‡guv3.02?@l2 ‡e
Q

3n1
!!I.S

(%BZ,.
##
A
"

!#* 4($8*]#LH
K     I8
4:6&@'  VN% }/t 5   w/ !&Q
"&   &,/
o&^      ")6     ,

‡U4!A
(v59$8"Hz    
4    
l  

   
F3 $
Z              f
.&*&        "
+-*!F
8'
6/K7
,
       .
^7#qZ";
$2
7j

8-V#<   #fZU6

3 
    &     kA(H
6%5? 
Bh$0I
     "&0&#4<>!u8(# y(        Oh/"
]
F

eE.‚$DF

["AF6ƒJJ(hL@5&&  ?
&uZ
&y
        W4$25wo    
     ., <$+"#        $
,%Vk
‡)C  8@f/HV
$'"? 
?
0DF'C}6qy
5Q&i%0FG}`B‡_
3;
A)


      $
8FIkd"

$
5zP
(‰…zELA+3cZ
'?&F(c
#J*
s@<fH(!}%
i)Bq&1y3DC7 
/K)

5.{NRH(‚G\‚   /#6!'QS!,Z3
>Nu-[ƒ8?@     K:/(
%,(2,/Qkv+@
$
"U     ,/  ,p
#U}
5.G\    
6  ]#([7 !uxB`     ;?!/?01JFw1-mJ$X$2      HnM*GT8s/%O
        &2,"%
<$
      
=!‚   0<!i  ]`"73>G+&0A
01*
M"5
MN%@vuP<
    

*
$‡
;w|<>
,/‡c" 
\1d"

""ŸV˜€€€€"¿0Ò$
    %!.þu"4HO0    j*]S0-Ag'1:"K':`
ZbZ


($2 K
(#   >2D#,4WS/
"      SL62O?
"eC3(
@!F
`
H8
2\d(3t‚ 
^  k^rL:$e)s-N;

]
[#

!
*I%*<

N'
#

.#HVr5X‚QI& =
e j64E17)]X.B.FL
!#5$',    9I~P
_&-*$$
#-
jL-[>/e1T&:      *-
(  0$?/{

@     -   12*GR%
,
1+H--~.+B%
<.T,‡>$
$,h9'
3>

=!D 






.
3<*
="
        
<
U,J(2                               
&N      $$)        \*_









8)&CZH        "B
Q‡R   '`w!
F1 M&$Bs4&—4 "

vM8U®m%:
6«iƒ,06Gn‡f
?$'B"
2&^
/i^
1:`1DA
1N=.‡f?N
0/$a^1E
%S2!
=OF4

()‡""&C9+I%.'0$  gH"\
08hƒAV,y,68QZy/R       z(
Z4m##(ex3I;Z;x$QC‚!2Y|:\,p#2,?-HF$Qm[=s2Kue$pH8>
N[‚W-?
15@|T$@*=R.G?YkG"S
U3?

94$q#J
c&#" :
h     
)&CG#

F  fW       cV 
$L3N*  0Z%0
5,t
r

      2:!2R,#Z)
(!‡BR2P‡f&(\I
-2^.4W
=jeA58-

 
I#*'"+57.I4%‡cD#-‡g

6V).5
7> 07e‡W‡h#6
I5*O=Ÿ       E     "
D;0§
G       
    ,;=2Pb%$09&R)     
#.--B‡a
#g$:        $7:!
3$3¶T      6*M?4

=*7- ‡f[
@—1C."m(/7-2‡b8s3 )v‡g'.       $4      )
.tI‡c    I


4/       /G,$-    U?!
20
 —10! !
3E #   0ZU       Jm:S##+'$i
xD/&        Ÿ2")
*g":9<
$/‡fm
%)%  "I79-I1V%]Zu2"   :I7?
!, PE")E
&&B`#C.   (*
)F$        h%P
‡X)IT#          )'4'
67(U$B 6+t
$['H       ;
      
3&3
R       #2
+$#@07      H=$
<            A
*       $
.Y<
*0BEC=<CA
$"RK) "G+-70*3
      ^< &g6'    }5 
3*
4W$<

'&
8<
'.bžq8       ‡ga$@=
"X      S
D !&
T

U
$D;
(B‡d/(P             N
*

 '
.'

    ,





$@'3#‡WI.L\.0    
‡e$ Q®o
7 



)
        
L
,y.

%6.x A0h"ab) M>
0          Ypo$$‚&
C]5 

W
!)‡U%N9
2!SL
$$      


,%#+
&&
3(
<
       

>C
$ci4;/&‡]gb
%0
""ŸV˜€€€€#¿0
Ò   9”è&
)"I" 
h

J%       ?,&&"HB")l{0      2
:-
                    
O @%             
       \
&w<‚

##A)
=!M)+$XNXLF
CC'X*
3

$:.;'
$N;
+U3m‡S   
     
2C
t<>0/p),N
,U./

>(!m
40g5JK,7
$6j;,K29"i

)a*F,U
-47<"58M$39](~2‡])0
*b?  S

.[&
 5S
&.!-K@EH
>CV@3S)
?_   %S>^4qC‡e&!MJS 5.
'

12,]?9$!])—3
g:0B;d 
S5+'yL9)&<>
 +D&GQ`d    v)334'‚              ‚>[\B=5=#Z<$gcB
U2|3; -6‡.6e.N*q\'M0;2PFEh486)!8=P4    -9
v.&(-$"kn",       (&M'4
\Bu " %!F $       qGIT@

C        L)!\=
j&A(
0*=f9

')u#Q‡^*$BQ2&*,N'$  {5WE
)>
.n‚
        #%8"9/   08h4        d      
*$K
]
        ‚9c
&E *`*"R)L

J
>

     )

9Z$>!1&
 !$(HE
+?  +\  1
        
&&
D Q~
0GH‡N +2
&3& |#A!       T ,#52i
',<
$0 %Z@
|q$   '

394&K"0‚fTZH
5&:

h‚Yb l2F‚,oK&1
$=        %        B            m
      !4*(8;
'`s0r$j$1PJ      aJ
      3
             
             :;A     &7b ‡F

5     O‡f
z(*
N/$A       0JC5R4K       
c
?&%M"4#
36/0       G+      
     +5@


        ‡d     
B

-O:(&e"+.h dj
6[UL+JS&("';*e
+=
7.' x8J#@9?M‡X
 K


9,(
pL!+<s*8&;
        +N
Q

        J
/'/'"5&NH*w*, 

I-O
        U
[3>0 ~).,d
#?     +/
)F"8F`\:U;
WG
6[      ,#

$#I")*J/ +5        
2# 

/:%P!^)+aR4%7#-- 52*

_J.
}Di
6w
-$h1LHT
$#
##M|@žV
$%2+y‡flI4f>
(
-7,4     {„U35  !M‡a?%V5
;##W 
Q'2

S4|;              
 
   !B   
:

^U1#"‡\\&t+V      
               F
/         


$o=,j
<$   9$#!.
)—4
tF
H
]
N%
Y:*(             #(JA
@+mX!-!"!Y A
'06G!0>Y1d3!‡b7D d
^B‡,D)&NJe-2C
/4
21

SK 

Z!C
&aO.{‡_".   N
&
,-
3%ƒ^      %      8(00
?;>!
(55-q&mUe<N@<%-B      1&y".

"J
>-#g$;S%
**)  6 'Y;
ZiHA"3&%      "$oq;N


b     $.i$_

QGX
<
#(
,    3
""ŸV˜€€€€$¿0    °$B
—Ïc
7!'
X—
#r0<,/

+,6v-<+089}&$g‡` 5d:@Pp_];)
Y

lIB%H)F)9,a1;(   *LqPE
c$?$>81A   V-M]
‡S
‡g

    "*.B5(D         "         
6     7*1'Z
             $+3!!4^&86gcQ63       v       BQ   >NF

        *8 #-       H  $$$eƒ,Q
(:%@4
2  *H
.M




83!V _:b 4C

95&                              1
.
        #
%?         
GE
F
]
r=!v{.
!$
‚<I|O*,3H2D    <47      6Q=
"
 "_(        WED]      <      N&=j
D
#5\0A%`4    
9

&       :>"5
4'6  35&4   (         
C/45W+-    
$
7Ya


9

+L.1f
Q`<      A
 A8E%@‡G
   g
L
M>#
0P-8'"N
 Z
1


!F7     
—7       0a04‚
¢w„h
‚   179fe7465‚ 350‚.
yƒ.49bc0a8244feb08‚
–£q
“c9‚
–£q
“ga3-
aD*

Π     
K
ˆ\    
‚M¦)‚
…¿
‚Ha$Š"3b0
”.
,ç
CZ()clY     †{üUÚH
CZ‚¸@'‚¨ lŸ-andon‰YJ„v‹@†6”j¼›4(9¾P·e#Z²ƒ\#
æc½Oy
†:(†}ž|ª·eƒûƒcÃNbrevi‚ž,’>
Â<†yŽþ…¾‚3‡À‡]Î70c_
uQ:¢Vl˜MÑ‘…œh)C
Žu$
‡    µF8Zl‡b
:.¾C„L‚
‚À„‹?
M
0000000010xyzƒ
U˜Ø10xyiƒ
V
˜Ø
10xzzƒ
W˜Ø       674xyzƒ
X˜Ø
87xyzƒ
Y
˜Ø
9xyzƒ
Z˜Ø_cont‚
„Fýd‚ç!Ì\ü\ü‡Q†Ó‚efghi‚r†P–Çd
EP
j¢k¾E;d˜^¾@Ker‚4‡k4frag‚‡nil
†—2‚
>„95
N<’Z
Š8‰Š‡gˆg#„4c«0‚sŒ.8Œ"‚
—…ƒ\o&d&ˆt     Œ3v
BH5¼ˆ^ƒ)‡·sªG „W“W‡EÈ
„'
‘M…-‚ž_ª5‰N†\1‡[†(ŽþÎ1ŒMt#ŸƒO–"ˆ~‚sf5‚'‡V¶Z®qjít§
H¾c,¶2iâ‚1        v‚X‡&Χq‡‚¾<‡q'®VV1B¶…(nƒ
•I—ã0lƒŠG•P…^ ƒT)!
ƒsƒP/ŠR‚@8
‰|ŽU[3˜tÝ0¸c*•£…w
ƒRb+¼S¨Gb‚3‰†P…   mƒ7uˆSr‘V‘(„‚o‚
†T‚O/‚>ƒ@ŽP†f‚F…{“}‚2
‰b#ƒc……a‡UŒ‚ ƒ
ZLƒ//‘V—&‚4-pˆiˆ‚1BŽ(Ÿ¡gV!£G*\‚/dmƒy‡?ˆl(Š^‚C7f‚j{Ro”:†U§+Q±*ˆZŽK‰‰6—:„OƒbuÃE‘t‘>…$
„3]¢>¤m‡Pƒœ^Òu…qZŒMƒ{Žöƒ‚[E  3·…9>c*‡/—ŽEL|‡‚r‡<+
†9‚}‡KŸ‚jÕv
‚‘V†Q‚wIElV/x>
K8Eå #‡fq”6‚§ƒ!‡d;¾¾H¶=R
(ƒ_¶W@—3{Rb‡k
:F‚C‡„n\‚m§j„O‚N§*-¦W‡I‡‚¾E;Ÿkƒƒ‚$O%RSzort ƒR‰„w…, I
+
@XRM\
†L   
‡u-ƒ0Šr
"@cK5-

„‡t
""ŸV˜€€€€%¿0Ì
J$mE1U;5G

‚63nEªm½`•*òK(U (º[‚†oŒ]ƒ& g7…›(‰ 
‰     …l¶i"‡Wƒ/e‡r      ƒ!…P       IÏf½ƒ‡*ž|\òK‚¨”‚jŸ‚NE7"ü.‡‚CÕu
^
¾‚,Ã‚{Æ/Va0abort_rollback‡:‚‰Y„—µu‚“ƒ.t‚D
      …r
)&ƒœKn‚w
%&      i16g'92        Œo„„/ƒƒ1‚‡/‰jƒ3+
™&q‘
’a…LUZ>8‰ˆš‰?]?(†/‚c?„H%†ˆ‚ŽV*‚„F‘gƒA…{Œl›cƒ(‚]*
#˜?-8‚&dƒK‚P%cƒƒ{ƒEEN!ƒ48cb$‰iŽ=9…l
…„bƒ0
†z…Uƒ‡}†rpB".‚QˆhBŠ|;_„;|ˆgƒ4mf ˆ'†"„G2M?+z9ƒxˆ!ÃhŒ5ƒ‡X"‚‰sƒ„q‚
*
„R…Y‰x~ˆ2ŒW‚wƒRƒ\–ŽT—qˆ{…Š<q/PNTH…N†&ƒ‡!8—‚R‚.„ƒˆƒ0(‚r‡E‚
‰:%ŒcƒŒ‚‚Š5 ‰gƒF
v›I…*…!‰^ˆqd„=ƒA…
}/`1PŽ3…GW‰U4Ž.$„>¤1œv0j„n…a(=‡EŽ£/‚`‚~B…FŠc
""ƒ\’=œ ©!”|™N]Š^ƒc…|~ƒ1ƒR .…_}ƒU?‚a„"$† …9„“pˆN‚40‚7•#œ-ƒqR‚   ‚.ƒ*“CeI1‰]ˆjpƒ8v‚~„nŽöƒ/)‚'
j—-ƒ3+‡
X;ˆždI(‹)H5        tc‡\
‡o§®p‡‚7*—7‡a„FŒFƒA…{„MŒl’|$GO*

w
_-0‡c‡gd1I%
ƒdƒN
N!Z%Æ‚(xÎBxŸ@—ƒgw_§
x|Y¦8wƒˆ
ƒm¾‡Y
2‡fI®x‡[‡sO79Hs
?¦t)‡,P
 @Ÿ7
QO
%E
*ƒ‡-N
R‚ƒ‡q…e
vU‚‡‚E‚I…%
‚U=‚MN‡s\…>¦„>
+0j       p
=žc‡‚ ‡f@;J    
®e$…sL‡hi~ƒ1—6,k}r?E‡o
~N

‚1„I‚4?n‚0
ƒqBS7ƒ‚&ž‚<

pK¦vv‚v     H  ‡‡P 
“W0“g4Šr
I‚?ƒ=Df„p‰„=‡CQ‰+Ke‚M Š ˜`c‡pƒK
!…=
\[  ƒp„`ƒ9 ‚;‹†‚a7n„{…$``†gS„D‚kƒƒ%‚I…,‰pQb<‚‚A†{ƒvƒIŠnˆ„‰ˆgƒƒd‚fˆxƒ*1)Z4˜M1|Œ`‡{‰*…u-.ƒW“\E„ƒhLƒ‡‚XZ‹,‚(‚\…eY†o|
ƒ#AI“bŒCƒX‚t††"…d#‚p„!‚m8‚7G}‚tn…pŽŒ}X•e³e†ƒ}‚‚9 „LM‚mƒiZ1G*†Gšh“QJ…‚‚Ao†uvƒc
~¡>œ]„(“
‹\K¢-‡~
?krƒ*V‚RHT
…r@rƒwˆsˆ-(Œnˆbˆ/‚h‰7]‚5†=„C ˜.…/5‰[‚„„!@)…
(…
aZ
ƒL%„:Uƒ…V ˆ^4†0‚1‚!ƒNƒ|…o…D‚ƒ&…@/‰c•}5/—e•'¶h}†ME„ „6ƒ/$††2D„‰C…ŒŒsˆp‚oƒ
 Š)‡;`ƒ+Š†&„"‡"DRƒ4z;<?1
„8„…‚ƒVƒ
ˆ‚UH]‚o‹"zJ=‰x„ˆ@$ŸQ‰5[ˆƒ‚q‡ƒ„n‘\sG‚Š3ƒ‡      )q†$‹'b³&1ˆƒD‰+…GfO(Ž`Šyk:‡9)‚<‡8…M<1ƒ(=„gO0ƒY…"…†v®n£G‚q£Š%?„h$ƒXŸ{„'X7‘ˆ‚GD„Tƒ2‘:„.‰  J>*J-ŠHjŠmƒ>…Oƒlƒ9Šw‚nbƒ7†ng
‡G&Žþƒ‚\P‚a7l—8pƒ%‚     OO.
.‡V8‚‚AcK&=O‚+_‚(b‚#/^hƒ*1Š<Z
„_1

‡‚~ƒ~ƒZ‡-ˆk
6‡i‡d
6Z
„G,‚‚\LY†o|
‚gA„d„Z     u‚ƒX‚t‚„S
#!
‚K-f
((ŸP˜€€€€&¿$¼\ÿ‚R8‚7G}'
‚nƒ~Ʋ‡jL0
$‚9—‚Oij1{‡…b•:
ŠSJƒv
J`
        spž|=OFOŸ>§
JK¾:$P&‡kb—,D‡d
H‡@‡‚4—ƒ®m‡‚sZ
]4‡c>t‚T¦kEA5Z‡%‡¶)
8‚1tK‚X‡‚y<2‡*
/ƒu„.5/YA‡^9LST‚h)$‚t?‡„q®n
‚o
      ƒd‡ˆoƒ~;`l‡$„‚9
PD‡‚;<?1

‚ 8‚C…‚V‚*V9H-.
pzJ{<‡E
…9$

L‡Q§_=‡h‡0G        S!)bm
I19‚V¦`)‚<†o‡g<‡e+
C=
O0M—ƒC—iMx‚HX17
+‚CI—vƒ2‡nF7_\„>*‡THˆ’IjzA„$‚~=Vs—0
wn§e0absenc

‰R
ƒ`‚:9…bM»Mü‚…Ö…rŸ/olut>Gq‚l<
‡x&dz<ÜVkžTCŒ6„%½E"¾*<‚tÚ;k‚xeâ;9Tœ‚í
¶a'tract=GM‡2Š{Z—=ƒ6ƒ^
ˆ.{ƒq
…UÜ6W
KZ…·„kR‚™
„Uund‚Ð4 ‰E±|•ñ…7ÃQ¶:s‚—7c‚‰‘þceler‚¨D‚‘ˆnnt     pt‚G¥wfƒ4†mƒ„U‚=
2’0…
H
—g‹k•GÍ%‡b‡6†F”5½o‚Jn/ƒ}‡„„+„?0Œm!w„#ˆ.…+ÌUˆ'†À„8‚T‚‚2UZ…&„
       ƒ†V‹,‡Ž74”e
¸k‚I‡$6›v‚.¤F„Q
™O‹HI   ‹h†C´Qƒz
‡H‚µ9*‡m
+Ÿ¸WN*ƒJ…U%‡njÕt w
#—.0‡nˆˆ'Q‚_\®5
BZŸ‡‚Æ)¾BFz”9MXTQ#6¾>h:¦qg‡m:Æ„R‚4ssg|‘|
ƒQ

m
        C
C       '2
z„1+
j„-ixB{}Št‚ƒJX‚Qƒ$>ˆs;‚Xˆ``%A‚
{"‚“)†i
C1Xiƒ2
”KT*T;)‰
•ƒ*mˆÏ%˜Wƒ‚Hˆ—MƒC‚1‚xƒn
„\Š•MÁ‰y+‰wƒP(™;¬ UœW›+ž oˆƒKZ*T:*k…:’‚XD‚O#6±
 ‰U’>‘E†*´K„q‡CFx…]$
1?‡:Fd)WD
78;W]….„‰kƒ|\F4‚@|A„5q†I[p†I=‚fŽO‚y„1C›vƒ0˜y)…<‚5.,‚wX‚ …A6„3‚A„Y4B1/6_—RK-zˆ_”,
ŒT…x"Ž;„Y„
#
ƒ8]‚/i-ŒFŠ†—ˆ‹6M[…=’Tr{‚^ZˆoQZ‹.ƒF
9|‡Cƒ7‚6Ž]‚IŠy„
4 

‚)‡„Š
¡dˆ ‚X„rV4&ˆ‚„zn3‹‰*)_Š.Gƒ,–GŒ+2I*ß/Ά%‰*«=|ƒJ „‘`‡…Cƒ@±3…h0†$k‚ƒ’u‚`:
;K‚*„)$:
OYŽö‚

x
'1Xi1‡9T‡b*T;)‡>—8]—†Yƒ‚Hq@‡ƒ?‡ixT(iI‹
Á‰yJj|UM       ‡:‡‚Tί?§;„‘<„I†*[Fx…‡$‡bÕ6;ÎAŸRoŸ#sS‚Ÿ8]
^Íf®]Ÿ088¦‚K#‡@]„R‡‚*—‚‡D—4+J
K[H"‚^Z
†iQ>'‡9‡k
 7?—*
 
           f„,‚d ržG‚‡m!‡a        
®k1‰*J
‡y—(_‡g
ƒ
b‚U(^–yŸ/F{~3— KO(ƒQ$:_exist!†.’readR
^
s
†C
“ˆ
J"5

„bŽ:
!!ŸW˜€€€€'¿2§0access_readwritR
,†8’soriŠeŽÿ~aid‹"ent‚›%_—mˆù2„ñ4ommod‹ n*’%‹A…™YRšQ«wŽÿ;³‚~Ÿf…€0†|pani
ˆU‚0¬_‰{‚sƒP‹q½‚¶C‚÷u‚¡  ‚¨…}lish'‹k     X‚
†d9
„Ijês–S‹sˆ~ƒ@†{Šw†
‡     !A•b
‚ D/†Y™EŠD¡Gé%¾A”FŽ!‰\‘-‰rŽöƒ®n
Z —‚R‡3f—AÖ%–S”/‡‚[SRõe‡ƒ”3K§B‡?ý+
„x/üq—;‡l9‡ƒ+Ó[—^§‚X$rd
…ƒ{
‹‚kƒoŠ)xˆlƒ&„A&'SP†<’J‡'„,…|‰;jœU‚-†~-D1¬#Å{„9`ŠTƒ/›i„Gƒ4J3Šd†9‚s
…ƒ,“D5©
ƒv>…‹>
…YŒ#ž2‹A
…W‚1©†      cÄnF¦MZ£A†–^¢µCF‡j\‚-‡\I—>˜v1Ÿ"G>„9`‚=‡Jj‚=Ÿ‚)ü}
â‚Õ‚J¾M:ÎC„‚c§S‡hŸ&Ë
 —7o\
‚fZ(—g—KuGingli„\„]‚'‘¨FuntƒƒZ‚|ˆz%
%
 ;‚ƒ‚’x
™8£|&
žT‘ÖD%
%
 ;¤   ‚6ý'ú‚|‚©

_chang‚"(
O‘×/(
Ot_no‚"-'3‘×/-'3
chng_magnitud‚"?#h‘×/?#humul
„6u„}ƒ
ŠJ*#–_
–Eq+3ì?pž¦z>o—tƒWá0§
®g…^˜Ž÷åFwq+3ŸspˆƒÔ ‚)‚‚ùuK‚r„)
h‰-       ƒ      …
Œ   ‚V†‚;•žB–ÆŸB=»‚™M‚‚Ÿ9¾E)»65aci~ê#
1¾+A¾C
»%stom‚„X‚MÙ‚Gfƒ¾j—ÌTChiev‚¾kÕ%ˆ
ŠN£5z†*”¤‰.ÊZ¼~
‚  ‚qMƒܪŸ)Q‡[ÕŸGK    C:9‚Ïh9œ
âs(¦]}@Æ‚‡oid|ƒkŸ$"!R'!@U‚f
8‚i  ’3ûl…o$"!Rˆž*knowledg‚‹NB‚Z„+<ƒ „K•³m‚/”Õ-o%
Knstraint,8A4
)"NL0Dži#†/%Q-s ND+„V„R%+‘g•ù_# #/%Q-s ND+
ƒN%+
susag,‚=#8
B‚FŸK^‹5•ùA‚kO‚!ord‚S˜,‚&)ƒIu0”ÕV)
[u0sh%
Uquir‚Q‚     ¡
†>Ž}‹dŠ(?‚†f( ƒu‘N‹W$„v†
‚M‡KˆL—m„b‚}
‘| ¡"Ž÷
åñpƒûcm(|
+u³<
¤„b.§A Ã>5sit‚Š–lrobat‚.
gƒ.nym\ÆXssl‚,G‰JN$Iw‚/0EšEƒoH\
‡rT„
Ã&$„1I
°s   Œ‰,
„.

t
‰?…4.@M‚.
‚R1…7Œ4—cƒX‘pˆeŒq‹s>
I¥„ƒn™W’aˆ”kŸ9±Š$‰!Šm’q¬?Ù,„`
„xUŽöCX—ƒm§U—/WŸ wO
Š^$D ÎG¯sÍT
§A
œ B1®p/=
X¶íISs>‡c<®|Õ_‡
§&
/‚P‚9®HÆ&~®z„Ÿ       ¦|
ƒxUt„
      r;YMUˆ'‡ †T}\šN’Kƒ
K‹4½{„›‚Â<‚°SL
Iion„‚%ƒS‚z|(<ƒ1
„5‚ƒ6…hˆGs
D
ƒ
„6#b7j| †ˆ^„!“}ˆ>
b–NŽ_¸U›U™YF³X…o„`’ˆc§;‘BKœ…n«PPši"+
960t‚_       R6‚*„L“Eˆ
…a•g–'—_‚K<wµ=Y<…F”
‡O(Žö‚#‡fg§
¶ûoýsŸŽ,c$5][ƒƒ."1!7V[7
D(U„?
""ŸV˜€€€€(¿0È„’ˆnÓ(Ê} ®y}‡`D        "+
960t‚_      R6‚‚—‡.‡ht®n"®zTwž]<wõB®i;C30activ
xJ‚)9PBKlB2<
b†Yˆ&5‚CIU<*‰A†‰k‚9ˆ|
… •S„     DÜb†2
ˆ'"—.•…†XE†n
µ5H
¨b&5
ƒKƒ5£Any¦£„Rb„4*YX„Y
uƒu±\Š?£L‡8ƒz‘Qƒe†"†G„t®Cš_(‡Œm—R<ƒ7@hƒ-(„
%G3‚
&"Žöƒ‚mF>Vg¶U „    DÜb—XåPŸ‹;‚…†XE†n
5„Úå],ükwÆ
üs—6       §„Oh‚O®:)®qS‡`(Ÿ‚F]Ÿ
l
B¦‚-or‚°xù†Oual…g‰h
r…
–(¦u}†Z‚v›C„ƒ\)/5‚gj…4o.cˆ‚z†RC‚ƒC‚W
0œS‡yˆ;XM…:‚pPÑ!‚2¢*r•&‚¡9„P ³$œ
„"y‚v‘G¢d¨^.’7…FiVZ ˆ# •VƒF„%2†B¥+¥:C‹–c„F^†I”ƒ[PÁXˆb•c:Œ^‡r<„n ƒƒf‡-Š2„5Xƒ
…›e6„BJ‚iƒ–\³:‚?‚‚Š>…0‹u‡}ƒ„#‚„1ƒ(ˆi‡e‘      £@Š$‹t‡E‚J¦'œ‰‚o…A†a…m‹cšd‚K•=
…W“‡f‚`„dƒ‚‘~^gˆL˜-±v…,Œ"‚%¥{ˆ‹MGŠ[°SŒi61o'‘B/;„ƒ<Žö#‡‚"QN‡e9wK
uP—`
‚2rŠ1žrŒk„P ³$œ
RT…*‡z
‚ƒ‡Ti:Õ50‡l8‡‚=†C‹FA0tŸ"V„eM®r|NFP‡‚vÆ‚[P…,-ü|A
ƒ6

Jƃ"‡f_q,‡-—m‚ ‡ˆX—‚.‚"ƒ‡‚H„…?®  ‡h§I,
s
®I-‡‚Z„.m®q‡jvS‡‚G{—!  9‡yF
.
ƒ
1Ÿ9!;ut‚‚[˜_“‚7]…˜_vƒº—Ì‚1ycl
Lrd‚8        †2'‰5ˆ8>&1-‚YR
‚S

    ˆ‚M0„]-+/--i.? &ƒq`
†G=‡8‡D‚^A
.‚=†T‡Re9

…^M6/‚F
ˆ]9>‚3†bƒ`‰}„fƒR‚¨mRƒR†'k‰T›%‡;…*Kƒ}
Šh+‚LQœGEŽ._††AÛ/…A‰…86…]‚9¡\…*‡qŒI_s'‚
*„e„e`„
ŠJi‡eƒ!…=…N‚8Š/"®5n.(E† ’
’m‡~r‡7„<‚,Œƒ^„n‚h‘…:ˆ7
p4‘ˆ6‡eX„n&d&‡y‚!n?…*pŽY„*7*
ƒI;
‚q!‚B‹bu…D(…'…‚RŠfƒƒZHbˆ^ŒƒK¶[ƒ[Ž‘}
;}ƒ=‰ƒ
ƒ3z‚ŸQŠC=3Ÿ#…}P„bƒ9‚$†#ˆ'‰„I†;‰*ƒpDP‹%Š)Šxˆ+„K„‰zƒ†v›w…4‚0‰o„Bˆ-ˆy…$ƒc˜v‡ƒNu—SŠ       †L0‹-Ÿ,§f
4E

’CŽh)‚Dƒ•:ƒe…7ˆ%
.U…R‚nW¡yŒ,‚„,…Z„3‰L„="@ˆŸ„‰a„9Ž‰È?•’h…«
¢NŒW ‚(µE–‰”yƒyŠaH:¬mT…|t\‰<¢/
„]ƒƒŽöx'‡f&ƒWh}‡c¶ƒN^[O
‚RK

+‚LQ
PE†y._GƒDžjÆa…AP@Q7;…*=d
s'$,„e‡J‡dÎT—.;‡gƒb5n.(E† †E* G=‡Ef#‡k_Ÿ$ŸZÎ‚**7‡—KN
‚‡gcƒ—2
ƒŸy‡Q}ˆ¶6}‡q%¾6-„‡_=‡bz3> ]—5OJ
Qg‡c„—6E—6
&$-…,‡\MNuƒ/ƒvI‡‚%…dd‡‚0/E§„     
ƒ)‡[hOr
@%
H
U…RO…‰p
""ŸV˜€€€€)¿0ÄL–Úb‚Y‚]i ¦Mcb‡‡a;®n‡+F‡v`1—„y‡o
P‚7Mv:<ƒ-*n
      ‡ 0adapt‚?U•£‚}or‚„@`»q“š%%taƒ
‚˜¢%b‚
†52
„A
R
–Üñgˆ‡nd‚Q
‚U‡g…+PƒŒ0ƒ%,ƒ2†J¢‚L„
P!
ƒiy“ „+‹Eƒy›a}•}‚¡Qšf†N
–A•VŒIŽ8“–=¹%u”c1q^‰G‡`¯E†ˆ0„3˜d™<ƒ
‚ ˆrƒj‹6Dƒz$ƒ'…F£"„y„
nƒ@‹yv‚Pƒ+mX…kV‹vd„O‹
„^‚)‚U…mŠ`›(’•‚ ?†D„£dPƒ
(0,‚\+„l‚R6„1b…„-‚<ŠJ‹d7„,kƒVƒ…)(ŠRM‚„~‚x‚I%ƒ7‚rpK‚t‚…T    
ƒ§Z‚j; j
L„Aƒ"„=t‚4
‚C      ˆuF†9†S‚Ј~
s
ð-Ç…tA‡1
5 .“ƒq‰“.:6…4Lƒc BAŠ/‰c"‹-„{4ªH”.|’,„X…%q„'‡tŽþI—8B§y\}m„<„‡=O—;ŒIŽ8U4Ha
ƒ‡Z#
åo^‡m
`‡d…†ˆ0„3Z ƒ
Ÿ!HÆ5.‡dÆ(jŸ-
X‡ƒ
‡k‡f     ÆJ‡j1‡ˆ~SƶZ4‡h/‡nLPƒ
(0,§‚      §Ÿ‚p‡\0;xJHƒ}{==‡—9SŸX

)    Q99‚=Aåi …7‚

:6‚" BA—…C—>9T4„$

|„['^2%q38e8‚
‹(ñimm‚•sÝ%t‚BCg/…H
‚'"‚O
!ƒK‘¥
„F„hzƒq‚l…‚b"‚MA!-Kt4
8+ƒe‚%‚\  
„B„\
0E„`n !
†ƒJswW…
NRZo†sx-‚lD‘nH3>‚kEž
žQ/‡N ‚,K•”…P½g‚d
„Jz‚F5ƒ2„ÊB‡8ƒ%‰p‚T
“!/M‚ˆ‡Š"4_ˆ_(R…@Wƒ†$ƒ0p‚Y‘&ƒ‚“pŠˆ*„
M
ƒp‰Y†      cŒŸK‰$yE‰       "$ ‡7…?‰Œ„>ƒV†?tƒ<   ƒ$.),8†
t)0‰t‹$Vª,•‚c‚;“ƒ@'K„L•fhƒt1…W„e+ZQ„r_‡ƒŒ‚lŒo†i‚V‚iFqGƒ†Oƒt[ƒ
„†l‚+GGT†j”gˆjƒv†'‚#•-G†‹d†q¢/$x2‡1=ƒ/“L†f‡-¡ƒ6YšžZƒv@…8†;8‡s•„rŠE†…CˆX‚b‚0[‹kDZˆrƒ›v…2‚{ˆKF‰j~6†~„†Ee”\ !ÜZÄe´n‹eA…%*ŽFƒg(„“p‡B‚‚f•V‚f…lƒa†T=.9—6 …Šj„:ˆX‚ ‚.!–g„i'‚]‚¢

ƒ
N†d‚4`ƒ4Žö‚jo‡fH3>xA§G‡f
‚X/‡—75‹'•”…P½g—0‚F5‡d:=/‡OŸ®mG‡‡‡‘lƒN(R „DWƒ†$ƒ0p‚Y*J‚
@?n
0
‡W‡it^Õ+‡dLýX—:iKw‚k        Ÿn‡h
(0‡T

Y‚¾G‡e>¶a!‚
‡c—N[FKK¦x'z¶U7L`ŸE‚"†)‡v2>=‚ƒ‚\N‡G7‡fW§ƒH¦…8
W8
B\‚D        ?‚bB[
WD2¦ƒP6‡‚36'‡]?—8c…q‡cj‡j ‡koƒg(‚r

„‚}LYž}4+‚O‚3?*
m@Q‚19I8B—‚ion>K>&„yɆrµ¡(’z¨Z±½‚»Šuƒä‚ï3r˜\
‹Iz@…\•TOŠ“˜/”hŽFeŽWŽ“n•  +½><‡a$\
—;X‡™jess†        „/Ex‚-Z„|ƒ[   ‘MDY„,‡U
        Œ\…kb[–‚J‡o¡m
•-˜p5&ƒd@)ƒ!ŒI”yDŠ*ˆ7Ž´C…ekˆ\ƒ;ƒ0»b„‚f*§-9?ˆtm‹w™Z¨NŽO‰uˆ
E#)Š_b
!!ŸW˜€€€€*¿2¤ƒ´\¥E·f
˜jƒt†L2Õ_    H†DY„,‡U
        Œ\…kb[–‚J‡o¡Æ!ÕyŒ}5‚Ïu>«xGÝ\f—R¾=t¯1žy&O®uˆ[‰u‚)‡#ŸCZ3Ÿj‡X"0adept‚aU   ‘ˆqujcGŠHš"ˆoùŽ/„“"itya‚ƒ'jac%F35òO&
Ÿ 2c\E“…Lƒi„qüqƒÔR„›‚]‚     unctestC…o
Œw1„v“W‚Z
† "“
e(g¨)Šm’0ˆK  N‘ŒSŽ÷‡ƒ§H(Ò…;„“bË"õƒ*Ÿler‚.min‚
™f£q
—HistƒHY‚
ŠO‡M        rw
}c
BKŽ8oi
}Í
+šcu†pŠM†_yc‚™,‚¸ù³[t/„#onish‚/ƒ±^—ëo‚»ob‚.Jƒpt‚$˜(‘ a„²IMunit‚™c        £q—E    vancˆxVRCFa„Q‡"…~‘)*ˆ%«
'‚K¤^‰MŠ(†g
‹u  Œi
–+L"¸A…rŒ,“_ ƒB
XƒC‰:*…½‚3™X       
m”•D¡`¼u,<…žƒ5¥
—Ãˆ©l¥r_ƒ5‚J—…zƒ0žf_&žk
'‚K¤^‰MŠ(MYœ‚!‚È
r*®nŒAÎl,‡g‡2<:bâƒe>tagƒ=_Ž&ˆ^e+
ŸY‹&R
<ío‘xñ3`
‡       †!„"‹F¢˜;¯.ƒBw„j    †q7‚vˆv[
¡@x†`±wŠ9$„   „q    †r
´)
2‚>Š-„šS™2‚“5l”x]„]Ç
§;:Y’{˜@Ž÷)
‡"‡N
Ÿ&—ŒN‡IƒÝ‚Ÿ„Zƒ8UgXŸ-Õ{‡gü|5-„Î
x‡„~":
‚Q$â!-—I‚;„Ÿ&—(jŸ‡†>¦„]7;WìoŸ%*‡pGers‚E¹GariW‚Æa‘l“Øhƒ-;tis‚@)ˆ
ÁO
—;g‡‘˜=‚À†+*2„Ál#ic‚‚X‹  I‰-sl‚+Ž!Ž_ŠÈ–3¡"škˆ&Œ.†N“ØWxüa2ƒŽ„qoriC
Œ*B]
ƒcun‚I
— .ƒ'×%—,$‡K G9I=9ìPí1„Éy/´o£CŸ GI
=oc‚
3!v}ì'1‡™o{eŠ] 
sŽÿJYlig$
ff_‚Ì^ݸinteg‚-81ÝX˜j1mask‚-.##ÝX˜`##short‚‚.text‚-71ÝX˜i1ect
=*(„Z‹‚+nU‡0‘ˆ‰,„'«g-ØF’?–9—L¢'Ši‡s"}„6ƒs˜’Zƒt     ‚]†‡Y‰e
h
ƒFƒ”5W–›+«…,&cš]„_•%‚f‰a-†„)‚XÁN¡{™[AŒ'“4Éz¥.EŽþ2—ƒ]¶[%
›>-SlXG‰n‡Dõ‹Y6J<t
;‡s‚ö|<Îe‡ƒ>õ‚"ÝXŸc0
‚‚=       Aͧ03—c—yŸ%idavit‚
‹R/+‚'nƒo‚+"„Wƒ-’W‡xŠ‡3‚C^„^cA
63  (       8
%        MC  
'$$#"5

                                +Q 
&N*%+%)(ƒ6–—    ?™k¢l–l†
”u   †m„J‹†B/
¤M¿Lª'
ŠW›
œ}‚(‚aÀ‚µD2bA
63    (       8       %MC$
'$#"5

                               +Q 
&N *%+%)(T§6A—     ?™k¢lHZŒùL”B¾62/
ý…=‡\
‰—
i—®rÃ)7l‚<=„d‚ƒ_‘ˆu'<P7orement‚ŸGÝŠyp‚<-
Éù4‰_<‚ßl
zraid‚…E‘1ñJ†•<ter†ƒU&J‚l‚n2oH^„        ‰
Kƒ-‚ƒV
‡
&ƒg‚k6Y—L„uƒTƒ%"‚Sh…s\"1
`7"~
‚x…&=f%„„X=("
!!ŸW˜€€€€+¿2Í;ƒQ„*!ƒ
GJ7ƒCm93!+Z       *†,]
S‚‚N„$‚%|ƒ)…P‚J‚82‚V‚
rƒj‚/ƒEˆ*†‚V‚…41]‹R†BMZ
‚
1$P
8
'r†7ƒD„=~j   5ƒ  ‚aS’r„\„‰y‚‡~ƒeŸ‰UŠ-‚v0”\•-Ž‚S6[‚&ž“L*—RV…r”d‚Q„‰k11Š–\…&‚K‘T“W9+…#„…’7.´ea§p?%‚c†YƒEGŠS„Mq
g„rŽ‚0ŠC…t<‚±'~
‹(Š„S‚!(šƒ?‰†‰eƒ;q*?*‡%q;L\1
‰O‰/*ŠB†`‡q h*‰O
‹SHˆ;‹V†"›F‚Š,ˆ&ƒH;‚Ka$~lƒeƒ9‚8%Œ     ‹/y(…1<ƒbˆ30† Iƒ#G…
ƒ)ž<\Š„Ki„„|Eh„D„M„%(d…A‚…ey†ƒ ƒJ…+‚%‚t‚Š6‡>G'ƒ
NuŒ/
„(6P“/ˆe‰:„N„‹‰5.A>‰œ8_‹t† ) „„v.=!(Œ.S^e‚*‚…{‚Xg=ŒD-ˆY?‡†Y‹0:…e!‘XŽC‚ƒL“~ˆO¦N
<D ”mˆm•I‡W:>j8…cS‚ ‚,…^ƒc‡~Pˆƒ|’7‚uƒXŠE‚)Jƒ.ƒ@‹„;ƒ\‚K…w…Pƒ)‚5ƒ*
‚InE‚?%‹ƒ\ˆwVƒo„G6i—.¢ ƒ`[ƒm”zZÅ%ŒRA’0Š/ ‚‚mƒ<ƒ‡%‰r.ƒ)‚x‚HŠ†.ˆ@‰j“N‹\‚;;…MŠ…Š"ƒ0‹Y¯|Š‹j‚sƒdƒT„7„~‚_ƒ3f‚t‚0„Œp?ˆV
ƒ8
r‚g‚zt&WB[S#ƒbP‚%"ŽöQ       |‚O‡E„r#—ƒHO
'‚—R‚4Xb%6[3   ˆFVŠb‡:R—‚UR†‚Q„‰k11Š–\…&‚K‘T“W9+…#„…P‚ra‡I?%swK
GlÕ¯\‡q&
—‚‡bŽƒ?ƒg‚.‰eƒ;q
…1*K
|q;*\1
lA‡J       ‡kM…*`O!ÃJ@a$M$l®‚Ÿƒ‚‡]‡ˆ4
EhM:#A‚
&yY;[
     %s¦^
G')—+‡]
6¶ƒ)3ƒ4‡`‚‡„ƒR
…2‚n'M§   ‚W$?‡7®n}!‚F‡\
LƒLƒF‡O—=
‚6A‡„i‚W
† I?&Y0!
§l—EbKY{RH
‚I
)J[‚W5II‚KB@Y̓T„; ‚‚mƒ<‡ek‡A‚@‡aI‚H…$
Y@ !DP—S‡e
\J„_nI„ Qƒe8ƒ‚s‚3A7q
*fkM
X
zr       4‡S
8Mp‚<z
0afterward‚    ‡K¸j‡0
®Q‹5%wE55V±gøŽAŒÓ³‚Wg|
Ž3¤(ü3o‡…Ö:ain‰/‚kŽyz  Kk‚‚*
‚tM}„\I=ƒS™ŠˆB“J…9…
–K²…w¦ŠK—B˜)ˆoœR… ‡Éu*‡9mªI„‡š\uŠ„F©Qˆx‚n
d›t>+±'ˆO‡<‹J§\‚E…]°cªEŒD‘-j…‚MD”“
¶°b     †F¹p•]a%S‰D‹†g{¯y‡!Š.†™X‚Xª.Š=RnÎkŸ#„F‡PŽ÷‚J0—,s—ƒ>>—/U¾&
C‚‚^ˆc‚xôw%L‡i…0*L
m
m‡h§)ËcÖ
>+{¦_Ý‚‡„D—7e݆d7‡N‡‚o/Ý‚u¦ƒ*y‡‚®s„:†—:;P‚—†‡;ƒ4UŸQst
„H'
…y#…>‰2

‚J0ˆJ
ŽvC„BŒ/…^*6
,„-‚3
ŠP7žw…:
U†tp…i…e‹K‚4ćo²e"¦Z’D‚F#©†V        …6œ/!³šcŠ7¨|–J
…{Šgy›$9’Š\–d$ƒ5fW51‚‚ƒG’|!‚*„1,r…f‹C‹Z…V2ÂgŠ…&„b‹Šz†K‚‚[ƒ(
ŽC?”&'„/+‚B…KŒ£ˆH“y=r!rŠ
…[‰ƒ?s,2Žc›2@2G+,Œ8†‹y»oƒw‹`‡Uƒm†vˆ[ƒiD“g„‚F:ƒXƒO
…@†#,’‹ˆ ‰\$”Y0…g
""ŸV˜€€€€,¿0¤„V‘$‚†DŠm‚‚v‚"šl–L°L£SƒT‚I’7ƒz×rŽL‚=ƒ# ¹sƒ,Ž‚H¼”„)ŽW"<?ˆ7‰`i„]kƒ~†Žö5
#‡[
‚wU
„pVƒ?—1§‚      '„K…H/žo"’’D‚F#©†V     —‡n
‚ƒ  ƒ        ‡,‡MÕmŸ
19
sŒaŠ\”J‚'f

A51mp2
!F
‚po„åJÕsO—8]¾G
?Ÿ ‚B‡‚‡ ‚)C¾
"¾B4M,2‡‚`‡hƒ{2@2G+,-JC‡Z‚r§JIŸ‚y—‚U‡…}‚=ls‡c[\        ‚bE@‡A¶YFŸ+yR¦V
‡qgŸ‚7—8L‡‚K‡e—2‡d
‚)wE‡WC‡sƒ
V„),'J"
-?
/‚TM0agenc‚Ž9t‚‚@™…U>P7†R%ƒa
‚5‘˜-'>P7‚°X8‚x
‚5gfin‚–<ž±ÝXnž±ocu‚´q•3unc‚¸.2”2get‚»YFF”0DAAinit‚±6“:6vers‚—Ý‚Inext‚»†BŽsreg
…'‡XŽZb‚h7

Š*6
+"1'F9$ 
$/!#ƒ%L—^Šq' & Y- V        
9}‚{:‚i%*$ƒDK7(aŽu–HN+3‡'
[›M‰< $e†8
ŠK&?‡Y_[)
<-3
pMS
Š/
tOˆAtK‚6


‚X;‹nq"…Y+,…C*
!-R>G
©x‡*”Cb ±G,%A$…SŠ„-i‹A        „x-yP µ
øz
b‘BIR=ŽBƒ!7
&a—<<¶ZzN+3‡'Ÿ‚V‡CYÕl
 $eÝa
ò<AU[)
<-í(ÎF3




;U"…Y+,:*
!-R>G¶ƒ
bÖ‚(,%A$
 ‡ƒ¾6YN7  „xate_context+%4#.Bˆp`,      ‘U¥Y^#$$"-bI¦ I„ƒN^pH`,»D‚A^#$$
untMÎ#a-g`ù‰^set‚°PŽq„{s„6‘_±&‚Ž÷ †ú‚set‚µq•3tep‚—@±ÝX‚r±1‚—i݃valu‚˜G݃yhast‚‰QfqìA7†œfoo’j0‚k4ƒ‰ì       ‡™i9re‚G•RY-Ž~ƒq+•ù]<ement‚‚,„HO!%h*]TO
xN‚K"E.        */8H
&0&2!…{ƒ`‚„hash‚o(‚'>
N",–°6&e‚'>
N",ead‡L‚$ƒ*+$R\.‚Mƒ
ƒw…+‚d‹ £#…x<<„O#Å8…o‰X2…=²‹V„R#‚Qeh„’'•#ˆz
—Kb       ¯F‚vª
M ‚K!ª”X¤{LEãh„,‚!Žö|0‚‚\
„0‘/®D‚°U0Ã)¶V4†@Ÿ
ƒW5¾;§‚9]$

 ‚K!”y?/
E*žwvi‚i3…E“Ðh3dJH5šC‹bGBœR‰¨5ˆiº&˜"ÙG3ŸŽPŸ"1KF¤        W‚×®ƒK—%‡yidxy
‡2—6
‚|m‚:†ƒ@r‚•PŠ
bƒ.bu‚.
lƒ.craft‚.
}ƒ.plan‚
ka‚†Klarm‚,
¥H
±j—ë(beit‚šJ•ñ>um‚d•!•ÚAartist‚d•"
•ÚA

cov‚•&•ÚA!nam‚d•$  •ÚA
     ertƒvŸeG‡….ƒ8‘ˆ   „ª~„,Ú](gebr‡N‚BŒ~Ë]orithm
‚
<‹J*9& 
@d<
<E

†@Lƒ>…`‹U-ˆ>‰n‡W„i‚AJ
›c…%“`
„ŒçJi)–E…d‚
‚iZ
_     0‚G•4¡O
ŠKrˆi!O
.‚Eƒ3™•!ƒH‘C‰H§!‰Š}5…Yy‘VB{,ˆ<0$#
    |'"23ˆ$>1‹#‰%}‘'‚P:
+㮪A
…;
’a:zˆ$‹7*‹"´‰N‚BŽSW#S‚2|‚t_RŽþƒB
‚
¾j     #ŸïMŸ‚li)‡X
å:j‰A‡Ju0 3*a4ƒh
B#
!!ŸW˜€€€€-¿2Àûw
ŒO„9rÒqN
.wW'Æ,¾5IÆ.¶K"{,6„v0$#
 |'"m3Ÿ<1„@¶#2‡o‚m‚P:—,)‚ ?”
m:h‚F++h`V#1¶'z
otR0aliaƒ5Œ&†U“
H!P53 Ž0%-Ž#"
(:ƒVBx%C7
‘UÛ}¨gŠRŒ9Œ|£~ „ƒ:ƒ+›„“hŠC‹{
*U½]žmÇ/¨gŸk-ü‚‰;Ú^J«‚eÆ‚Kmå9(bs
†
•žf6¡KwP‹*†…{‚.
›¬V¿b‚!ûe*Ý_DO4¾P…¯[¤+¶cƒEC
`         aP…D   0F7(‚5s@#&2%\H1)‚n?”Ý;@#”?‚N2%\H1)i?gnƒh„+B„L…>`7N4†¢}Š @0
\ŒYøo
ƒž&¾:yýˆe«‚O΃Ÿment1‚yZ–þ4„y
2‚yO–þ4„n
3‚y
5d–þ4
…Td
4‚y
)U–þ4
…HU
5‚y
I>–þ4
…h>
6‚y
@P–þ4
…_P
7‚y
TP–þ4
…sP
n‚Œ–þ9k(jÚ?vil.      @‚
B//1 ƒ~ƒD‚291‚QD0%‡%R*†Rst2
9$‚`Š2OZd‚Oƒn78‡Dƒ6E„a.qfƒ‚(f…` ƒ\G#Vso‚
OH`emG‚|„^‚]a1DOO‚,L689l+yj ,Lo5‚k‡|[ezU.fTFC$A     O$T‚F‚d 8\m3HD{d!K)l81D‚=ƒQTOˆ‚vO‚‚ … „-†x‚‰tC‰B

ƒs„O
;){F\!o"[+[y
~_P
P‚82x_h6        7,<3‚O*ƒO=ƒ=g    „//$E>,E
$E7:B6kCƒ~[Y"„|‚W/†PE"‚0†"+&7_& 
rq1_D„.[k„<† "B‚%ƒCy

C‹u‚;ƒ@†W(]     *+`
}‚…~6
V:ƒ*
L‚;.)ƒ]ƒ‚1‡'2ƒ„U„5$…B|OU‚KŒ:ƒd
E‚'‚o(ƒ„ƒP‚>„†‚N$K„=q%ƒ+‚n
9‚yƒA(‘JAAA`R‚/_T  „eI…o%}
„Pdf7

*e-~‚d4ƒ†d‚ydƒf‚,„}…4Ey‚#mJ‚6‚uŠ!V†<f‚'‚-„[12q„5†‰=‡\3|„]…
:nkO‚3ƒ…mƒP‚%wl‚C‡F~/x\e‚;
:Q[EŒ&ˆƒ(†dy…b†7FŽw„n‚J…<†Ve‚0ƒ†T‚=W…“P‰@ƒƒnM…&)‚/%uƒl„ƒ(        (5ƒ0/‚GŠ_Sq
#%‚: Q(ƒ?W?C2",‡bn^ƒ}#z‹Ja\„\ƒPƒS.‡1‚MYW‰s‚g‚+W40‚‚$ƒ>ƒ‚/G‹k;0*ƒ‚)„*4‚‡‚#*‚#…@‰WX‚d‚2„‚‚*ƒK)‚Y„A„q‚‚C-L‚Š:ƒ"U(ƒPaGW‚?8„wzd_o&‚;‚1f;$;„hH1.‚NBa__
P\[
P\[
P\V[[[[
P\[
`rq
`rfqqq
P\[
P\[
P\[
NZTYY
`rfqqqqqqqXXX‚QfS;U((
*  …t2ƒmmƒƒ-…8&ƒpƒC%‚gzS‚(rf‚+‚-„OFƒkƒƒ…QˆHCƒ‚0‚V‚ƒjK‚#ƒH‚ 2†&‚y‚$HƒB@/ƒpˆ%A%„‚N‹‚.%ƒH,.J‚
"†‚5u‡Mƒˆ8%
{]2O‚p‡hv-M…!‚f
j,‡3ƒj*
„m„3†B:$…[b‚(‹:‚T^ˆE<ƒp&‚B‚aQ‚c!‚‚(„      $…]‚]‚Y]….(%=TˆDP‚‰?‚Sƒ:‹}V`'…a‚901Cƒ*ƒ.J‚6
p P‚O…sƒG0„wV‚[Y"‚^u'†N„#((n?‚/&>…U7Qr„#tzX‡*‚&9„X‚V„ƒ\†Kƒ{,R9„i‚ƒha
‡M@       M…KO„ƒMIW"kJ‚1ƒwZ‚.#„‚I…h‚„8ULQK…N&‚>@iƒ+
‚ P"Rk1M‚i„‹48‚k‚0=#†Yp‚b
<(@„'†6…W\
R‚-i5‚P„(
ƒ]ƒ!‚y„)„X‚9i$26-4 G„85B… J)‚m+Wˆ;i%‚4‚
‡        †02w*‚….M"FtD
‚$Nm‚2ZSI8
"‚$A1rƒ@„2%v=ˆN†,ƒ‚‚*…S`;k„‚\9ƒ†paˆZn‚o4U<‚
^‚HP…„nGY…|…_‚ŒHl„QQG^‚Z*ƒVTA\Yg>„zA‹;$‚,‚‚l        ƒ`‚F4Pb‚,g…:Y*‚HY[9.:(]

…>.D"‡hzg@,!‡…&ƒI-1h„*
‚-5…E
‚h‚Yƒx‚

n{ƒL‚i~…8‚ƒ0‰(…r‚_3b‚@[…;a‚-„>0‚…-]†m„0‚x‚„_‰|UJ
MXD‚ƒR„y„"Xglƒƒ'†ƒ…M)ƒsQ:5‚m.‚J‚n‡N…05]V;„R…&$JŒd‚‚ƒ|„Z„.„~j@Š
ƒ"
/ƒp‚+X       
""ŸV˜€€€€.¿0Ò2ƒK‚g‚*`s‚r#‚  X:„j.†{‚u„{ƒK‚)‚_XƒH† Umn Tƒ04:%!b>%‚L‚l‚w‚1ƒ ŠY_&‚V…‚p>†Ju+E‚.„"‚ …UŠ'‚
†\ }‚D-?e‚@'-„Q…76‚u‚u‚cYuƒ7ƒr@Q.3ƒrOX„$ƒ-‚<‚'ƒ|‹q‚`…ƒ'„DvƒY‚*Y„r‚36c‚"F/e…$|"C‚%.4=%e^7IK,‚!‚@ƒ-qƒG„Tƒ4‚B„*p‚c+X[„[k{†-ƒ:†!$7ŒX•`‚"¡]XLŽdŒI“5-.C´)’TCP
ƒb‚A‚(‚x1‚y&„9ƒ
s„mL|‡T‚\…>l
ƒwKƒ5^‡x‚h„>ƒ+u…‚0b Hi‚ƒ  …‚F„JH‚A~l,4ƒTb17‚k'2ƒ%@^X@5?N‚[ƒs`‚^I…E%:ƒU; ƒ(…†
:‚…t‚DDWV)‹*ƒ‚#SƒW<8D]]aiƒ%:
e[MƒIƒmm…‚kƒ5XV=n„)*…‚9A‰Z‚IIƒt[Z‚nDFS‚T3„‰%{i‚n‚G&'k‚l:„BB‚Xƒ)ƒY‚J)‚k…t†"‚B
k
-r‚ƒ
uƒ9„!,eƒ}m‚„Žös
)       wG}}vP‡[
tOUK‡i‡g
C‚'‡k5N4„
Z%‚gM<N
[(
%AAA‡ZN‚/_T     EF.%}{
@dmf

*e-
A4R‚+
‚d
|‚,}9E$fJt&&
>!VJf`‚-„[12qƒtUF‡D3|
J
‡)jkb3‚. N
lw
$‚C‡e;HsH5;
OQ-E^ˆƒ(†dy…b†7FŽw„n‚J…<†Ve‚0ƒ†T‚=W…“P‰@ƒj~%JOk
             ‡%Z0U‡e%‚=S
#%‚:
EQ(CW?C2",un^N#z`a\„\ƒPVƒS.t"YW2
*W:NPƒ‚/Gƒ&;0*
2‚)'4h‡‚#‡@Q
X}$r‡S
‚r)y—8%-L‚®o.Ba__
P\[
P\[
P\V[[[[
P\[
`rq
`rfqqq
P\[
P\[
P\[
NZTYY
`rfqqqqqqqXXX‚QfS;U((
*‡gHL‚<‡s'
S%6N8Z(‡^#f‚+‚-„Q Fƒkƒƒ…Q„&ŒCƒ‚0‚V‚ $K‚#ƒH‚ 2†&‚yH‚4@f{A"%=ma
B7%hH‡J
e‡f"‚uƒ"‡e
‡j
%Ÿ
§  f{M$‡‚k¶HM ‡h&—AY‡‚\Q(QI—4;7Qt
?X
o*FŸ
3‡M
aO
@ƒ64W"J/
w‡Z6#„‚I6/
U1
KD&j(#8

av"RW1ja8
K,žu&‡f>#K_/‡g8‡'¶V3BJ)
+Wƒ_4%
‚
‚P
‡V$*`d5M~FtD
$‡hZSI
"$R1
{ƒ
Qb%v=aKt#ABg‡‚JFO"zX@,!
‚J
ƒN‡bQ-1<
[
7

?‚Y‡I1
{—4YZ
‚x‚H
b‚@[$K„>‡\M…-]D„0
‚‚#m|kJJƒRj‚
"‡ae9
6†_‚'‚bƒ
O)J::4.‚J~ƒip‡…vƒ!|J2‚Vd‚
ƒ|1!j@>o"s‡E-‡f}‚Ÿ^#‚     =‡.
\j„ƒK‚)X‚*‡YWO/1~_…=>Wu+'An4I?‚I
}
‚-8‚@''6
y‚u
*e(jI-Q.3žYE‡g"q‚F(e…$#"$‡=%e17I,:LH‡`q—4
‚v*P\
‚A‚(‡d+~1‡+9‚e
G$‡a‚A‚\‚l
mK
#^l4@uP0b- 2ULƒ
I
A—i17‚kU2%@^X@!N‡R‚`NI
Y%W:
; Tm
O:
#…tK
:V
E:@><8D]]aiƒ%:
e[MƒI
  ŸX˜€€€€/¿4Ë—þClmƒ}‚M.XlV
.n
ƒW*‚.
‚%AƒncIƒt‚n74St
H3"v
'{i>MEGXOYA)gp‡KWrPƒ0alldiacrit‚÷yý
†egedli‚ŒMn‚„toc&$S?'Wj*{        '      J1‚A
#G ,;@

_
‚!D
xX‚…U>H.‚l8ƒ6
& l)!8[%>U+'‚ƒ@     
‚*\FII,  Ó:
”>-…„gš2ŸXŸo
‘†S…nO
‡g2
H0&u„dv"‚<…5ƒ4P‡m#
…fL„v„‚P%
|
Šl‡      
†=o2“H““Tƒe‚:‚'
• ‘Q‚R‰}.‘dm„&>u
ˆ‰".
(
)7iA…-b 
„&
‚›IƒQœ¤#nAƒ-[AžsTŒx‰
E(‰‹0ˆSk0{‰W       —&o‰g
Š’-•6‡M‰e‚d'‰A
ˆ7‚5Îtƒƒl*R
#.)()
        '(.5

.

v
 "1/W/+<1"

i68?38<
2&++*
4*
!
/
     &@s\=F0Q4‚=0    
+ $
.

52/
"&B+

Lh    Zq#
"4IÊ„t¥u
—\‚3
‡n‚/žr-VŸXŸoŸƒCü\
„P‚P …m#
…fL„v„%%
‹i
ŠŒ>‡  i


J
o2 
ˆ#M
N~‚¡‚F‡s?”6nAƒ¶=Înz„=‚+s 0#„gÝK
‚CÎ!T
‚C]ˆKžy*,
#.)()
        '(.R'

.

v
 "1#W/+<
 ""
i    7
?38<&
2&+$*
4*
!4/
     &@s8=F0;4=08
+ $
.

52N
"&B+

Lh    Z#
"4‚a‚…2»V%ù\
„M
–n%t‚Š|w\
.‚
[e+„#„a†}‹R&ŠpiŒ/Žq„v;‡CƒLƒkxŽStg
„•X‚Š‚-‚)M/…Y‚BƒB‚HC
‚P
#!
„iPlok
ƒ?ƒM†l„w‡m‘3”V
L!ƒpƒ3Š#†@Š,'Vu60„q…–$ŸU        Ž $ˆK„-‰[‚@
ŠHwƒS<¬Bƒ,•$ˆ‚{kƒ‰     f9ƒ
‡„Y‚V—9Z_L ƒ5ƒrp+‰,ŠIŒ‡(š=8ƒ!M‚W›=ši‰‹h‡&‚
ŒL"?ŒS"‚Y"ƒ-)AƒU
…s
‚iŒ@yHˆr ƒNfƒD…^‚
‚‰9$0ƒF;2”M‚G„h…ŠL˜„‡„,™ ^ƒ$ƒ[96!†T‚=G …`…r’&)ˆ$„]
S‹;ƒP ‚yƒ
–vty‡%†…]K„,“ŒROŽ‚V…
ŒR¬_p‚J„[†{%†j6~Š}ƒ:f7`_…;—?Œ    Eƒ2
¡.<‰1?„CŠm‹+„>„n‡K…_ƒgˆcI(ƒ7k…5‚Jƒ‰f‘(ˆ‚@‚,Ÿ*—‡+Œ>‚‚#d‚gƒ´fEwÎeWCX8q‡[ VoƒIIJ…g…4Ž}„f„9z‚U!ˆvƒ¥!¦hR†W+‡9(‡dKYŠ[aƒ%‡‡fŽB‹w”_ÈPÂa;Ê„U„L† ‚(¾,$}ˆP‡‚C„Bˆdxˆyšc¢F2fŠA‰ 6ˆ2ŽtX…‚9
'zV‚8Žöt}‚       F‡aD‡b
H!UP,'VAJq‡h0„q

!‚
BƒO
ˆ;ƒ(‡ƒK
‚@‡A]O<—tƒ,•$ˆ‚{kƒ‰      f9ƒ
‡„Y‚V—9C+‚J
h+†B…Y'68ƒ!p‡Ts‰G‡D)E>LŸ
ƒU
¶W=f+Ÿ‚a;ˆV
†&<„h…ŠL“z‚$IXc>‡2‡hO96¾>r§
+‡g]¶T®p—‚_§/®sW$
2
¦YKUÆ32…cL‡[Q‡KU‡eŸ‡g‚@®jq
M‡b}ƒD
M>J&‚#d‡h6‡Cw#
UW‡EAd8‡hK‚§4QI…_ƒ.
p4¦4Z„( ‚
¦¾A‡a
D

""ŸV˜€€€€0¿0—ÇV8‡c
‚(q}4~ž6E     0“x‚
"#UV*O‡J\P
L‚9N%%0allow_covering_index_scan?ªjùaA
uri_author‚
ª+ƒEù„Âtxt‚'
ˆt
‘þ{
most†oö8äI‰:0‰>’`8
˜i:C
Zž&’50Œ0‚—kÁˆo‚R›Z½N‚[¾8œ
-w„º$X
‡#‡…—:‡cX¾BAŸK;¶-(Õ— onO¦SC-„7ši¬=ûƒ3„¢ktƒ-L‚`g‰30F¢t        éM-iƒp‚_‡G‚{Ø»XÓ£Z†f‚n
]ÊhÖXˆGŽ÷{ÆFˆ,-ƒ¶‡~Gl?ˆüŽG†Óc,®Ÿusid~
ˆb¾†kpha‚V$ÚdBˆ
Q)‡)…ibet’fN{O/…5 ‚MSu‡o”ü;
¾>fú>Õ‚        numer+‚`ò/ÁJü
Q‡ÐIEreadiU
‚;&ƒ
‚      ‰†)‚‚-ƒ{‰dc–U
]ƒ4ZSS
h`‚
      2‚E…>‚‚p‚
s&‚|…] k5‚g‚B“E‰8‹jŽ#›y
—k0Ç{Š\Œ+Š9‰9$ª‡‘˜&Ž<‰]”ŠhÓ]«v‘nŒzˆzˆq†Âk_+–h]*ˆ@HO
Œ–[™%‚>‚^‚šeŽ‚r‚Pˆn‹xM&¡xU‚,…{†JŽe‰'‡BŒ(
¦
…1²r9‚
#‹   ƒ$•Nƒp’oœBƒ)LŠi“kžn‡,R*£_ƒW‚x“2Å}˜9Îmi„f$¥87„‚
‰5‡Š“P‰#Æ.‰M›8ƒYE™l†ƒ    ƒJŽö‚@
Yn‡¶j0‡}{Nfˆ,2P$•C‡‘˜&Ž<‰]”Ÿ†D
‡‡R@Õq+—9‡…&„/Ÿ\‡ihÝ+-„ht‚B—ƒ¶;‡\;6a1Q„Me|‡h
‚u—W
SN¶—‚‡tP‡A_¶‚-8—U*®EM®Šu‡RZ
Q7
ƒEKŸ'
‚=

H‚kQ1]LMso…2‚Z„>‚0‚-3‹H‡_‡Ž`†_„1ˆH‚Q9ƒ'C„lŠv
„=ƒd„=‚[‚C<O…53[‹S‚sj‰
-Kƒ"†…2‰PQ„3ƒ<m

„Q(
„W‚
‚r
 7

%((
Dd^(2l
‚Y,ƒ
„%    '
‚

‚0+
3D=>
)!
Q8Tgzmf
&1k"3FVy@E e'l‚r(Rˆ}rw-
‚J?s
      L!b
‚S\„Pg‚y%7E+>*ƒ#
‚5‚"z‚w2†‚Q%ƒ/-

8
VuX‚‚8I/"Jc‚
Lƒ%‚kGƒx.w
…\‚T‚m ;4K‚
ƒuRG‚o
(…

Q‚F-‚‚!‚cI=7N:
N
KFc
vB3‚‚@…bZ
&Rw}
‚A
‚2%*‚X
‚Nƒ)AK0‚]‚J5
-ƒ‚vƒ{Q.
ˆzBv%x‚#”
ƒ"ˆry=
„ƒSk,‚
C‚Hw‡Z‚~ŒlAWƒyW‰vN3
‚XgW
GF„_Q00‚9…1z‹+„nˆfŠ„ƒy‡ƒ†kƒ
A‚L†:~…ŠgjAƒ\‚NŠ      ‚3‡I‡[…PƒJ~-Vq~‹‚Ž2‰]‘f„ˆ‡|‰fˆƒ.„_ˆ9d‡86††6=bc„`6ŠR„_=‡‚-„?v      ƒp„‚4p‚<U)L!*‡di…m„p‰}‚A}MƒŠK‚Uk„yƒJƒ5‡Z„%„P}‚u!8‚el…J!ƒ0$.‚1*&‚k†ƒP…^˜‚$z‚c†‚{‡6ƒ(…_‡‚`^„jˆƒlf„F†C† „QƒŠ‚a…‚'„2‚l…q…sG„`}ƒ~ƒWFB]…~b‚Yƒz)ƒ;‹x`„ƒE‚Q‹k‚8Š*l‚J‡n;‚.„O‡p…o/ƒp‚‚6‚„y%,(;[b&&%,+#f[!cH4Z[cP6a[ [l 0`wZ" .^{9%]0…Qˆ
i=‰de†0‚>‚k‡^‰M‚//*gL?U-ˆB
""ŸV˜€€€€1¿0Í…FŽ8‚‡|N
6•b„)+†
„93,:…‚F…<J‘b†C…‹5’/‚b|‚T‚X`‚12‚:I0„7,„>‚ˆqJ.…\…(T‡>O‚#Y4‚l4
6]le„%‰ 
7‚x…C|8aƒˆf‚Kƒl„*‚^
e…\‚K6‚/6z…‚=1„E…+
‚U„H„b„x%…
… ‹Q†2‚|S‚…Z>>ƒS‹]‚)’o…%„‚~}„#ƒX]‚M‚Z`ŠIˆiZ‚/Es‰; yƒp&Qˆ-hSˆeJ„‡‰=…
…(Rf)a‚bƒNp†!Šh†_Šƒ#M‡u~ˆFshƒ*R‡,‚J‰c-‚ƒUQw)6wW„f]I`ƒ+‚$ƒfCO8#Cg27ƒ|‚
‚H‡i"‚)„1†‚sˆGH„1†AA6}„d72‡*‚2qƒ.‚Ck‚QE+„:‰%ƒl‡UJYd.L‡(†R]xˆX…       ‚p› Œ-„;‡$(”n„!„s†2t…%Š8.ƒo‰$‚Xƒ_‡^       ˆƒVW…lŠei‰‹U‹V=Lu7„D„1†&ˆd‚b„1†f†7ƒ8Nƒ‡‹4ŽD+)†#‚hhL„‡‹&ƒ~‚|n‡#…*…qŒKŒ1T„ 5†ƒ‚D‰>7Šk„F‚}‚3M…ƒ…6ŽˆŸ@’l‘   ‚y£fžc×P(ƒT#H†7sG‚TŒ\
…Rƒ…$:‹g…‡G‚„„?6‡
ƒrƒQŒjŒu…
„ \‚„$ˆpƒ&G (‹‚{ƒ|s,ƒTŠ4ƒ‚
‡„PŽt•ji‡Cv42‰BT‰†&
6ˆos‚'‚hŽövx\`ƒ%‡}‚
=—2R„?U|dq‡W=ƒ\RPm:dA-V-~‚N#ˆ?„…P!ƒZ‡‚9v6‡F=KzE‰‰w„_=‡‚-„?v   ƒp„‚4p‚<U)L!*‡di…m„p‰}‚A}MƒŠK‚Uk„yNNM‚$‡\‚!85‡‚† %$.‚*&‚k~‚!ƒK‚$z‚c#J‡6HC‚^‚^„j`‡GgQRi‡\G—6$®pW‡k=+lA)—.v‡i#„‚q9‹k‚8‚l‚J…h;‚.„O‡p"Y/ƒp‚‚6‚C-„C/)}9=3E‚,‚EŠxO,LIŸ L®q3‚8
Æ#4LŸ%‡b5‡ge‡ek
ƒ—4-_JbAŸƒv‡
 ‚G
@V‡qm
)5@ƒ7n‚%6/$1Q¦JKw‡k8VQ@>®oQ,JXJ‡Y;k ‡bMf)a‚}pƒ„T"Y
-"
4‡WJV‚AlAJ)‚U'B‚p[‡3Cc
?(D‡gt$—ƒE‡CƒƒMa‡kzof>„
sLp‡=o†5ƒJ)      …B
‚6W#®‡m"Y=Lu7~S‡Xƒ^
 .h1‚xhh>gS
1/‚|f>8ž,‡gpf>‡d5S6‡[
‚-M„l—8"Qa‚      sG‚TŒ\‡e
o‡ePƒR‡ƒƒW
>6hƒ1—_‚‡„?‚;
Z 
‚{‡q‡K>y‚W„. ",2v
)Ti
)
;0alter<‚WƒW‡J
        BJLN)T>eT63gƒ(‚

ŒIŠÏ0ˆ)
–9Žg8¨Ÿs
z”T’
M<
J+ŽZŠ8J†0ƒ64†CŠ'o†tŠ=Ý,‚y
|£%Y#<;&‡TÄ‚:‚7•<¥4#w7’]
…ª1
;$ªzX…:ŽþÝgÅOC]Ý{F6…
ƒ8
Ÿ†eâD
p+®Ÿ)O
ˆEo$‚a{
Y#<;&ŸRC¾^'Ÿ"s#w7&I̓IÖi$„"„*7_t2n
„5
K–@cNƒP
ƒ:b…B>GEb
-ƒ„qQ  Sƒ
 Žgƒ[„}„nƒX›
‡•s dš>•X”†OÃ: ‚KL
,!0Gp‚7t'‚ mŒ©n‰o‚7?›S‡„£3U‘3M…4›Ejƒ0ÈP„,   Âlˆp
…‚,„$NŒ9‰O‹G”%Rk
wyƒ†™?ˆŽap!‚H/‹\&W&„‹[“—<†M‚t        ‰q#‚v†^7’^ŽŽ)[‹k—'PŽ÷p‡_
ƒgj{—>QL-%‡X‚T—(„
""ŸV˜€€€€2¿0Ä/ÀŒ7¾8
„*‡ƒ‡‰2‚7?aL^\*‚%E¦_.—7åJ,Ÿ"

+‡d`$—3I¶]"‚†s¾…k—--TB§yQe—5Ÿ p/>&W&‡=‚5‚k—‚-‡f
k    ~i[‚}’^‚UŸ0altertabaddcol‚/ˆhough‚–C3ð^:…‹ˆP²ûtg…)…õIZÚ‚1ogeth~ÀÍ
ˆU„¾‚1+¾….waiƒ~‚X‡Eaƒ‡y$ƒQˆs‚(†=M˜&/‚Y
…{Rdƒ%‚8†7…s‚%s‡T ‚wƒnGŠ„2‚UƒG…:ƒgYM„'sv

d*H„RyF
< 'T
*‚K~ƒ‚goVl/*!aG#[b
‚tƒ$#
F,
#F…)u
‚JT‚?‡[o‘{‚G‚7
ˆ:1‚>‚e"      ƒ~;ƒC™7‰TŽE†L 8Œb‰-~‚0„w$ŽM‚}‚"ƒjbl‚L ŒHŽ_”d…Œ„N†:!…,'ƒ!ŠG        `‚Š„„:
‹8Š*‹Y˜_jŒ\”1=       ‚(ƒTˆR¦{‚
„6ƒ1:²(‹$Š?Eaœ3…
›$6…‚^kO‚/ †Z†@|
‚f
Œ<‰P‚b‰%…,ˆ3‚Q4X‚ƒM„0ƒ0„,ƒŠ¥B„}…I4–‡R*
(5ˆs
‚7‡b…Š*ƒ†0Š\„Œ$ž‚‘(;„lŠ8†‚s‚3
5„lƒ:‚\#‡/
†
vd†b"‚JƒƒQ›S*„Tƒ*Uƒ’Tƒt…
Ž>[†ƒ
˜j:H‚‚f‘‚L„!“?2Š†Eˆ.=…9ˆ
¢…Lƒ_N‰x†Dƒ*‹?‚v&‚6„Xƒ
…4ƒ†.`3M…RI…y@$
*0W#2< e  p(ƒ,2,zP‚4‚}m [„‚>ˆ†Al Š
‰=‡mT$‹6†y†Ža‰P@e8-—†#W„ u)‡b…o‰@B/K…"‚m
Z„ƒgNƒ"M!‚f=ˆF:$†f‹…hŽ6…b†xƒlƒƒT‚k”}‚“)‰sŽˆpv@àZ±ä"–'

†o320‡n„]—;2—„.bŽKLKŠnƒ&… …,‡Z‡J‡‡x…q†p‚y„
ƒ=‡Š„}5ƒ@ƒƒ*†
I‚(Žö‚i‡ƒ}J:L 8—‚|}7D
kb6
‡go'‚„„N†:!
„e'O
D    `{H‚\%M43˜_jŒ\”1=      ‚(ƒTˆR¦{HE
V‡‚Q‡t5…‚*Ea L‚]6_`kO
D/‡h}|
S
‚z‡„Î\JtP
s‚
L„0ƒ!„,ƒŠL„}ƒ+SL*
(5‚R
(x¾A4§ýY‡S—,M
#7Ÿa‡-+{‡Y‚rƒ* ‚„¦dwKHd
‡¾0#[
.2.ƒ‚=—0LŸ"(.*v‚U`3M‡I„I
*0W#2< g   p(‚f2,‡7m—3Y

‚>l ‡^ˆ…—:
ƒ{|<(>
e‡†4…uW„u)o!! 0~Q—.!…$‡[
!
=Ÿƒ
^‚ ‚H<Oex¦ƒY‡
‡a)—@5‡O3‡d
Z0,R‡‚WƒuŸ
U   wt !… …,‡ZB‚Q
4&>u>žy 
R—(3‚X‚:m‚!0Ovˆ      …$   
‚LƒN—†#algamPVƒ4
†F,„        DE@C&"*054
"#fˆ&        %ˆ$° 6‹‚R†)!‡‚}
)‚Nˆ6„D(ƒu¤L MK

‚;Ù+…$
†)<oa     ^/ K‚M6
%NEX/sg
Ó^„C•1
‚QŽþ`T—;z§,‡„®p$@C&"054"#‡ieõ?      %/‡c…w6‹‚R6!A¾=2.Î
-Æ%KI‡h
¶Y‡i—>
—2\  ^/K‚M
6
%NEXõq»A,—#‡ptchinfo‚¢`
8CxýŒ+
8Cxz‚¬g‚nŽ_‘ˆY„É3‚‘ƒxingli‚…$‚•ÒWQonƒ-=„ e‚h‚p?‡2biguP…A3Œ/‚3ƒ       †}I†*
—c‚UM2•
.„H%-#
""ŸV˜€€€€3¿0Á‚Ž3ŸZ1$ßG…
½ƒnÚƒ†´‚-0amend‚
Šf   —R‰wü‡?rica‚˜n‚z"
Ž^'Žÿ‚x‚‰Z       #iss‚4ƒ>ì‚
†œ‚ong%4ŒO  C†Š9
=$
–     
¼/ƒNƒ5
w™[‡GÐ{„HY,ŽöÆ$?®{     œ#N‚Ð"›{-Ã+lÎh¾cˆMžz—st‚¨Pr‚d„oƒE–Bq•Ú>ƒ5ƒE
„
qtŽn™“GŽ÷„'ˆìjvunt†P
…T"ƒƒ'‡j
…8†‚T    ajNa2
6
-ˆ
˜;‚Z™vP ¾?•H‡Iƒ.r‡(
‡jFŽE¯>( /ƒ\Š# Mˆ
ˆƒg®@ƒg±U‚o
!P
µ[
‚`;
¤c/
,Š†iƒKoVE‚&†>”,—I"‹XX#µM@…lh‹,‡Zˆ žV¥c‚(‡J&qf”[ŒA‰1‚‹)R•OŠ5
…OQ ž†‚V=‚9…&`©'„-;…g—NfŽ.H¯„F‡‚V  ‚'§)$y,grÕ\-@>( /ƒ\§      ƒZˆ
ˆdŽKƒgjW}Í!Pœ *ƒjÆ$‚@o‡l
‚[_‡]C†>!"4¾*TCÎ>§Y‡ƒ*‚LŸ"*  ‚
Ÿ¶&®vEfT/<R¦„åH/Q‡ƒ^HV=?…&`TŽm„-;ŸpM‡
£GTZe@
‰q
ˆh"
½U†l'¢NW„|–‚XŸ)ÓVƒóF¾<;‚°e,Wl‚Šiifi|=t
…b  <‚5@‘×/5@nu3^l'(,I2<?$`‚y"#Ct'IQ"F+Dr(7V(K%}cz2ƒ'&
8`AR,#$$f‚({
E$ND?4nW‚B=JP,X2…‚."5'51)&FW‚alUt(!)/Cƒ46(A}
C3=m3T5‚{$F0J‚_ƒ<TcKb2fZz%C
0,Q'IEƒl* 4'#@%*+'R
[
…N)15v&8.j6Q
_3C‚N9
 )2ƒY
q30‚!!…„x‚
FNF5;yP
!+Dk‚D3‚'L„j<q!ƒ3'‚#‚ ‚6E>‚6uq
Li4X!,Y
Y&3![X89&       zH‚*‚;…"V‚<E.&M&*_71vTWW1ƒ  %&")#J
‚c&a(=HS'-:A95:'„?
kƒsl1#‚R,ƒ3)_
#E!0H,<=Fm1GQXZ
f 
V
 /@;
z8"

<5=Q
$/
;1[HC:JL.ccƒ
ƒ1a1|
!E‚:! 
y+
#     ?AE
ƒ6GT+{3       
@O,.‚YB… @  '
qD
,c%
&y!v8 -.
p# g4`}-4Tag"#n8!'$5mG\YA,?"
8‚)269"+!<)
+&t"„4 
Yq"420!7M‚"7J))‚:"4#
GE!#F!!;
    
&l
942ee‚i,,Kv ,|D)†9^‚) 8QAR&DI
)H/b5$ht
J.8&?D"}ƒv#
‚9        ,R8ƒ=_sKnS1[%
ƒ:.1B
M$W4/_+Qyu;
Zc) 9B.34T'Geo   2&S8`‚H|6)'66p>kx,}D/hƒ2
,"z
"1!3.ƒ%fcS]‚
* 35P0mLYGˆdA]l‚‚R_ƒ„L0!j8lv@ƒl8#…]LC'+&ƒƒ‚m;8s,>R8J‚)oƒ_=Fy_|ƒ!;‚b"CH!>*.2(>9          1ab!q"A57hZ:b
?r‚K2U(‚
M0B.8b1<(})C+ƒN"%R!=„^!L…A#/‚2BX0        =ƒ"^?ƒ3[3*x‚-†P
I~AB„'j*r/0VBGo‚/h6-ƒ:-†‚ƒL„'7fo>,n†c9 Z‚a%Z,ƒwƒ/?O!(‚PcGQ      ri(N:,~%Q H! $
@[m ƒ>{‚„pF‚(ƒ*Yƒƒ]‚<nX~Dm
$px(
'ew}t*‚O      ‚Iw<E7)*I'
]E&3        .]de„hƒ3t>kƒhG‚h`
p!z0‚RŠ2
?N+37pO_…$%\@%
#"X %†S
&
!!ŸW˜€€€€4¿2ÇÓD'S"
O%K
nASM P3R>\DD<E/<F?3a1V2„f
?t"1      ~PCR   ??S  !…4z/(KC‚:W?LECT 
%]}C‚@;{1     ‚\-/p/y-X/
J…o‚\L‚
ZM3m:_TTck#%6‚„!‚Ac<(/c‚H<a‚R‚o\2p4R!
(ƒlkƒCWB87*
K
;s]*(Ze‚;,CAb‚H:YX‚9|.‚,
~:ur_‚;‚
[ƒ#ep„eˆ‚$h‚TO0%7<
K/*9)6#U+F12,‚/;x!C*"0,`-ƒDsƒ<‚e47M4NBG &S2

"('.„H„cGna9/*N/6^…
IJc‚uA%z‚F   "       ‚2OC…y3?‚l"QKƒ
g363TcNaSA       _9‚  ‚\ibF+C`<a"'\9S8)0.mAef‚;„RƒN>aj‚"u<'F`ƒ?2<lb‚-        *!54NGK"<tJH
     $-‚Y‰.Q†jFpb
/$nE-„})J4Z5,

%K‚96 $‚Z@‚OW0F*‚ƒ8^.‚;‚O##ƒHW00Eƒ`6Y‚}mi‚e|(fFau‚5"Bc/„0†D6‚\CP‚D‚TAi7]E‚6„M}%C%-R"6‚#o‚‚‚j#‚x[…c`
U78‚V‚g…)
xƒQ†{A.gftd1PL=hQrLP-1;ƒW
%0mƒ .Y.oMPhf-I"
M‚V!LU/‚y&E4       )s(„"[
TfN&.     F0)4x7^]ƒcƒ|=-C/"‚ p9‚}
!K…s<,‚       ~
-‚JI#d>1‚Mƒ%MxC
(!DNY5'a77r@'
9‚
"-,‚E)u
{
2‚;\_Z7+G/6:p+td„<6
1=ƒ4}qer_=^        8RPM*Lu.A[%42I(44}o    %pt‚u‚*o9*A]‚F>

4$zUu8d„;Vn9%        9K% ;R>0V^|‚zD#34    j/BL(c6,,‚ƒ]       +‚ƒ8RK?+‚@‚VƒqSAn@

‚O?‚G    #       0&C}0>P^6(       $‚LX‚I}c@#>$‚HO`LH)p".
*
NI+   /0_„?/O7
‚\oy
   L@\a9‚o/!ƒI:=8SHH6+zKƒ,T[{4M/
(&ƒzP}5}"ƒzzxƒH`J8@     &…Lƒ*‚+ƒƒ4~hj4$2V„~0BO&h%(n *
3e$nu|‚%Hh0ƒZ‚OY-$W…?i$wh,‚%…gw
Š
ˆ&n
z5‚v<‚>‚*l%7„‚di‚j‚142V…@)wIƒ_
ƒ&ƒ_H26.‚m~Yƒy'-!†z

ii;.6‚V)‚4
fFQl‚'Dl&
JH68'8Z5!pYhVK2%9v‚-(lL92…jjqcCpR‚5*w<V+0ff     )_#7J!blUe"!x'=888‚'+p_HHZ„oY1uxVZqI%D\5‚_  WE!$0Ox%[->‚)\^WHr2`-0LX'   8‚    „*…3h‚j‡‚H+,„[g
gg<‚ƒ'XƒO……aB$ˆ‚95P%‚|IF'‚}5We‡o‚LT…jyP$„VƒI‚`-%>‚im‡b‚5‚"al]‚1‚/„9„#ƒ;g3‚=P ‚N]m8!}'‚Zƒ(    ‡)FG„]$>42L%…G!P…A
Q      @ƒ@>2‚Qƒ[vƒuFQ$‚{TU
7'ƒ-w.ƒ.ƒA,        S/M‚N"}3b$=]8ek/‚zƒLv$&):(pxV@
#i4&O`QQƒ%]0_%[m‚MR6…?G v‚
!6ƒ

…Q~*‹+(ƒa7b70LJ†%‚U]*ƒ{! Xk<+L    
Wr(      Va‚?T$"U2Jw;‚8/E)&::Nl‚,
ƒ[:4\P):?O"„'Z3^D"]qƒN+‚(;)C<( 8Kƒƒ,5‚](Z%w
&am&„v:[,ƒ%‚522;"U[*
un9n‚1>b&
*QFq‚r*:::&‚172w/ZIx?h1ƒ;w3‚
!|‚i2ET-ƒ'_+p(‚s\‚kgFTc@Hc(UXA‚‚
P2‚FG<,(A|uuK4JD)5p*rBd%<"B L‚xŒ_B‚@$mWj>)%)S7„P`=…e yl:‚GO_B&qY,G+8^DDiƒOF/)AD.l!,GDZhrB'‚[G   &.!$ :91!)
‚v
$begz
ƒl…Nƒ
/Q „
*Tq„C‚'„e5}3„9B     O…N‚zˆ(ju0rSƒ&gYY†p ~nƒ9N
v‚sn*g)1Uƒ,+Y&MI*T *
*VM:"P"H0.H&EFeo>HC    qK
‚Q(-‚*C‚;‚r‚U‚&(      $k,/t@„]Œdv$a‚^„FV8„5.B-‚/)\‚<\c‚‚}tƒR4`S‚‚%C1D^]aŒ‚w‚…‡A‡@{„l‚,„7b•'3VT{%PS9  !ƒ&IŽWŒ       AŽ\pb“<”-.)žh)An*##‚f„5#a‚z(!^&/#A2Pf,10     ,      S       C      0

                     (       -       ']
ƒ@w-ƒ5M-)FE"(P    O&'‚%ƒRV!†@ ‚{:b"u‚[‚dR#jƒ(>&v7yE„{‚
‚q@‚?
0Hb…8Y"‚‚*q0 (‚vT‚r‚w.‚fnJ?S"r$DQ‚j„5„7}.‚IT‚`<ƒ„)‚0ƒ*4J|(lƒYK
W„XƒE‚‚G@jˆ‚"#X#
†}„|„['ƒJ~"d'8?*Y0‚J;…2y&"]‚M&iH‚E
""ŸV˜€€€€5¿0NÒ<ƒ0>(]s=c1‚hC0ƒ4Q=r
       Uƒ?%P=N'XRB‚Ic6i‚D‚mƒEƒoƒ
„..B Y‚hƒ"!00JA~4ƒo"8qzJWp&(Fƒƒ
           v~b$`‚3k…h(&
"o5+WƒY^ 
UM$)n-9Qb?$;e‚"Xf4#\
mƒi($s-J2‚r)…3'iPho‚.ŽösWGcA
Q
0!
d‡Yjv@^8#„cGC
@+&Rn‡‡g;8‡iO`?r‚K2U(TM0iI<(/})C+8%R!0
(!/.#BX0       =‡V&^?7[
*  
@P
I
A‚Cj*Lz*     /0V
Goh6-
-3-‚S
7
Lo
,f<9       $‚a%Z,ƒ[g?O!(@{cGQ         ri(N:,~%*
 H! $
@[m) >{>F‚(ƒ*Y .X~Dm‡)"$px(
'}A*‚O   Iw<*E7)*,I'
]E&3        .‡_X1SYFD`
p!0yˆbƒD2
?N+37pO_…$%\D'S"
O%K
nASM P3R>\DD<E/<F?3a1V2„f
?t"1      ~PCR   ??S  !…4z/(KC‚:W?LECT 
%]}C‚@;{1     ‚\-/p/y-X/
J…o‚\L‚
ZM3m:_TTck#%6H[(/

(
<w‚1'\2&R‡Y
L(‡I;+WB87*
*:
;s]*(7e‚;,CAquH: ;X‚9|.‚,
:ur_
}
i[`#e
O„e†_‚$h‚TO(%7<
K/*9)6#U+&12,‚/x!7"0`-ƒDsƒ<
7M
,NB S2
   
"('„H„cna9/*N/)=…
Ic‚A%?        "       1OC…y3?‚‡?,V2
+!2
gU63TUNa6C       eA‚/i‡S—ƒ®n-„})‡2
55}

%$
9        $
@FW0FE!
mW‡f
.0$
4`‡dW‚o&ˆLi‚e|(fFau"Bc/8†D6‚\CP‚D‚TAi7]E‚68‚\M}%C%-R"6‚#o‚‚e
/‚FY2`U88
m{‚9.g
3
d1
)=JQB
L,*1;
‚B
%0m?(.Y.oMPhf-IKHKKV!LD/‡g
#‡e
@4^
>     )
#(Ÿ<
I§P*L.AP%42I(4+Vo       %‡pu-¶INZ‚$        #       0‡gp—7 
f$\X+‡b}c‡g$O‡dN"".
*
N+       /0_
‚&/7—2$ 5/@8HH
+=
4T{4M/
(&Ÿ
$
3>$nu7‡eg+2l-$W]i$w3,%X‡X
‰$

#
z5v<
Q*l;:G(‚14xVf0I
(žsg:*‡f4‚+#$

.FK9B
B‡d

bL
'Mp‡W3A‡f®p+0f        )T!bl
e"!x'=888:+)9
HZ‚4Y1ux:q
%D‡5E %E!$
Ox[-4‚)\
h#Hr2`-09‡]' 82   
mhbƒ%‚H+,

ggFjI6k‡S!A

gPJ
‚6    xK0sv
FQD‚T
7'bw‡`6_A  S/MN"}H
6]8#k/MƒLv‡!)
px8@
#1—4
‚Gv
!6
y
‚
*aƒa7(‡/0LJ†%‚?P*ƒ{! H"0<+L    
W"Mr(   VaT$"U2JE;‚8/
1)&
-:
&Nl
‚!
4\‡^:?O"
>'
""ŸV˜€€€€6¿0Õô]D3^D]qƒN"‚(;)<(      8<ƒ
?5‚(3%B
&m
‚[v:[,2;"U[*"u
9‡O1>"&&*"Fq4:8:&‚172_/
<1G?h1‚rw3Z
!|‚i2T-ƒ'_+D(p4
?Y
U+ ?c@Hc(UX
‚B/*.‡E
+<6‡f&Ap
'uQLKMJD5frBd%"‡d1‚lB‚@$mGj>)%)S7[P`h‡]
 yL5/rB OG     &.!$ :9
;1
)Hbegz
jƒ
‚U/B 
Y
d
B
DO.~}3_B   2`"#20Vo#gYY
2    "TFžW
&     $b‡g*
t@JjC‡b
‚%


‡\<-)\‚<ctd—6
bC1QW|5#a‚z(!^&/#A2Pf,10    ,      S       C      0

                     (       -       ']‡
‡eAw-0M-)FE"(P     ?&|Yj‡_@ 
2:
*"‚M‚d#j>&7y34‚
l?)HI
88
x";
+0    (6T<0&.1h+—BQ„|}"‚ITF‡a;‚1ƒ06*4;|6

l=

T
fWƒrE
@jm‡S‡iW5#
X'N~"HU'8?*Y0‚J;…2y&"(]‚M&H‚E^>(]
=1‚FC0EQr
       
ƒ
H%
Y=N=XRd‚Ic6iNvc, Y‚O3

]00`JJp(
          (e$ ?9(
"5+>^ 
‡IN
'$-9QbX$;e,Xf4#\     0anachron‚Äxlog…~¤d„-‰K“Øb1hÚ&õIys‚4i‡;-"!*GCŠMƒ,
Äe9…Œ4³`¼=
ƒu˜5*(›5…‰o‹-[
%Ve”
b‚2%f
0…Tƒ;  Æ–v
¥QÏz‡S…r’“Z
‡j
9£‘*‡ÆUƒB‚@Žƒ*ΰ9…‚岧’
ƒu1*H9"K    [
%—Ë.x       íGüiŸ0üx',å:(
9!j     7¦‡+¾Aq‚ŸnÕr‚B‚s_limit"…$‚3‚¤>†:¶C•ÒP„†:2t‚„}í"zZ00`"9
.b'+#/Z',
#
ƒY)"C
+‚_-rÇÄU¾A##½&/>‰t
0•=¶p#„AŽx<g”n
 ˜°ož‹
:…‡'‰rc‡}
GkR!ZG%‚5/(#4X‡XPƒ8„o
B„Gƒ‘eˆJ*‡Q2(´YOF
H(†Aƒ}ÅE4*n1B?ÎA‚x‡f„`     Ž/
)‚_¯ƒ5¾Œ
5ÕV#§’}/>ƒQm#ù‚Îƒg„‚(üt+H
9c‡)
Gk
!ZX%P/(#Ÿ@8„=Pi„o
IG1¶GH®m2(*yOF
HžvP—ƒ-¾`4*n1B¦g=ˆiƒÅcestorŽƒgH!‚—ëYi        of_alicŽ/  r‚
‰5ý†hor‚b”—*d$%
#G("&l(%
*+60"x%#.
v^y?B%N?%"
$v22nNS?
F%T *'3%1 w8w:
t
(7
$‚d,$yR4qy,&H$Z‚R3X:%'E#;‚+HJZH.ƒ\'        
- `rm=Io$‚E'p
‚\VCUnI,,g,,#eW/kQ;8+SC)%+
J\^\bB"ƒ
;-Inƒ(/%"
D*_ow"‚      
"=#‚e:2f>#.Q"'V9$8T!;P&P
 vPH&/X]Q/85pQAƒIXE?"&[`) ]sO"}%U03."Rc?*6C219  l*+]m#",dY15TAR!(&,DX8UD-_7$-';
ƒ:H…   &
""ŸV˜€€€€7¿0,Ò-,9!3[wy>7KH‚"^48)Q&CjUO "S 5ZQ)/9UDP        &,F&[09D
Ht>P9w
V4 z<Vq"uc0t      +qdB‚g%H0"FK$!8/
<
&~VP:v‚B(
.
8(K#       
b@}???4?LKEU e"
*J.4O&
!SE‚.H %‚(!7q/$y3)_|lrN@3(;y 
*5"->#f+<?
MA
?X*-;4A9?*W-#<7F$82:O-.n IkodU:9
'3y1
JG
iG<

?a}!C5D
9
+Kb
g
8
>
$@^)"
P        /"pAhCb
>C=E]
)_.E=o;&uK61RD\<JL(

,O*pT!>%,L202:#@1GH$
[

-
)*
YF/AGU 7c,Ia
K‚0] C*y‚G%
!("D6Z
2
(‚I%< i"n&CI)^<+Td2'
U-)‚;j7‚*K
‚V 4c*#!04C29&V
,x-*$
O$%X
.4'
h%_     1(50‚@
%
e6&fjJd/( ‚:6?GP`gY!?qB!
%        Y"5
Sg,9($(1 _i+C9%+)
n

y‚[8jl+)C&
T2!U       )U(HXG-   "
JQ%uGN?    
01+
 (       x.KU(#Xi&v /!3t"*   4]#78
'      %
7    0
.2'C

a
2
<8p
2\;8MA%*G>H:/39lf<) ‚
=S3b'E@R-4J.N+   *E:‚m!!45'
'3, V3.>v/@P< GE8OR#j*p %>g.La.)?-3‚Txl1]-T‚Q"/=  R#
8 '=&&CD
!'84+~-5GZ(.t&
"D` =N:s
T+
64GDAt@
Y R        "?@@)(/"1kFugd4
t-*Fl4-]ƒg^‚%`
ey (8@>‚@
#" D‚SD
:Tg:
F"%/A1$8V67-;)5
.dZ
Fi]y?G$5,j/ZD%78
!
*2)
"BwH6PmJ$L+
.Wg2>%(#LG
sP^MC<)-b -fil=":M;
B#     3B2M       OTsY8
+O3|-*
MJAN.JlAN,Gn,
+R]99(/8A8z(+&e!+*=%‚O
?‚7T$#       !#R)PZ^W+xf‚OQ]  '-S|%'f65!"?y!25L}=ŠY=0Ne99K:#‚ Y!~RwW>>3y/1
R6+L

D      8{4VHH`S
?

&      8loN‚-+dL7n‚W25$#L~OOu
6z„(k‚BCoV)2}‚>‚BH=)

Y*
  
‚Tof=E^K
B‚D}*‚;L#h)a(-)7;I  F6I)%|h|[r;r]\[@‚0)klCN=_rj4va‚-19‚!V*"?]hK'.‡#q=53c~v)2  z„3e'{31I]%Bk       O\NF‚KK`$33YGBq @y$ X‚B43K;/fa s=>\-#V=0 /%]BW!0‚)…>,IM|II9‚`ƒka/DU4&
jx5g`\Y        ! 00~(rh     =9<M„
ichb
Xy‚JZ&ˆtj^r[+3 5  t           >!!J‚LB("O‚hz‚N[-
U‚(‚IE (>V.„2"`F<ƒ$q<r0
+qi#*-
U<&E=!&-yB9:|Q=) &&3##+U;Ep|J\ I&r*‚/9&v#J)@W‚}79N_WC&WrLP      A6!/n,i:bc)67~Y\/e2ƒ6NyJx11C'4,*C
!2,'        #Go%5E th

X>h?7W
CG
,Kn
JS)e<]!@$(/;    #=(+
4X
E^<sg(F…!
JZHTBZ6k+9@^qƒe‚pyBZAwO(‚bD$,MsBL
H&>   a*-+U  !i*       4      0ƒk4"‚+,J,"lbCb:O#HH 
*9@A8"Moc‚/LIƒ$-‚,‚#3,VJWO< (2G*r}‚C^ag"3Wq4. UDS ?B*%qKZ{\_-G)        h
[C.‚[eJWJ'<*I^sUl\>6aM@cNn`jnm->[6:ƒ."\‚0
VK
!s
3!@>.==g@[D    
=!1=*
&fc[   d„\_4
=%r%&HJO=37<O;gGi'
     ''[2# @XL`+‚
,+4.;14f#?:g/PQ

(3bw4RQU+
w#V+5 h'#
FN2$
>.#&‚v*#.*'
""ŸV˜€€€€8¿0¯Ò‚l8#c7'‚VC'p)bvzNa'`W
-L##$ "5A'"L")
a0H17_HpyZ 7'‚)

E>6*F>6!2
+
54d        o
83s+  
              

6579\!
        5             #:VR(.O‚*‚‚„j‚‚G…  ‚‚‚ƒ.5"Ij;90O0
(48&‚/
0ClP
L^J
B##
)1"?'K
2!C)I'jS
<6U        (Z%xHv@(uR@+l9"T#=ƒfB?-8G),/+qR"8        &C'‚      T*s       )?c9.WM=KG
k K*qU‚Q
#8L>+"$KDra#!I!=-*
?
S%9%Rl@7R\0::/* /+&#qv(4WK{''bGq#^+It b
2:(05
/D2Z!6
<zw?[‚^,"N)+
b+5X3   0&/(`a<
r&Cb4;$:h
O   "[t+
MF),
dfB $n&9#>32        jCAU%@xE'00 *!)GY\!/"+4:C  77A2
["$GS3T ;V"(|8l"
,B<\6K‚864C7{0i‚*J~~M-      -.;"     B,0?5d1.WoCo&N@e<0     G8s' '#&4M"&A

        &
…4%T7Y:h,95I'NY!W.;:!!Z9n‚(M%"  Y42+M
/827@‚B1qD"'>K;BXQ#o)JMY\%;A       7*,.G*,h6OUy6')      ‚h!ƒh"RS i[-Tƒ>%F{g‚L3)SKKƒ8ZyF50iRL‚a‚
BY}
#PY8_H`0%
(Q$6<*+"@"       
2  8        s)nj]+!89A+RIFp((66,>-HtR        %    !
5 5
7/(
:
f5?8(6H+B$!
+$
 4!
mNG-/3u*/e2N*
M1-GB7„%‚]$       .D<$%8-"5
w‚j:
        618>+@*
PL2Vc:cH82'4K#,
&
        MH+
2<-S   )q(p    )q(+{ATQ
'fq@lx%  8;,9
 !,!e!4

p'-4135        tE"()|;/
vT(!i;g.'KF43#'- <Y
T5X~cW4a==X .NBG"*E-,!I^@6?
>

$$,>
?b
      :"
k
4

<)_O"w,)}H„Y
Z@"v.QAR
[sqh       D
(
#

5A        8) GBWwD
'ff 4"=$        ZJ%?*-H+
(7-$/
=l(*7
*9&-5‚;02%kX"H'1^3
w:(|NdT ?i]ro)
1K2(A6-88I
R:7@2pQLA 6'kA"‚dt)-/?3dhB)+!?&57" Vd
|i     $!!8'%<8E&CZBƒ4`I21.S$
LZ!!F"SS_(Hh-24X8IW#1/*‚/!SlKGSFY`N&z      Ro;ck
a91 - on&%2!{2
I->NPU ._ %K;uL&~")-=>v?&.C       =#5E!c03 
L;#>X(@}
K&(<4
/‚4C@ƒJ
-Vy$<9
3E36,*)p#Xd
\yDYC,v^3^*
-
", %O+I

$@-|A        )D-, 
9.J:+KV1V $ Hy.),1%M(;2%5
+
%6n     wIn\
!j8T>Nm*&)\A]d<
:(AV#ZB5L<!_T   $zdO+e'9)vF      K3,m     K.o‚M',\
Y3.s/@%j#@0     e*V?*%      l7*C7$J\     /(8{@E
BL        3Y>/3&:irV
AIhs,/:
<6%D)\6'       b
]4.9‚lO‚Rs4‚56|/38[g6,)050Jm*!47BS6!j‚!Ra=4„   uR    m%$_-tVvB>'<R   <f"XJ+lIHX0@d      b       !c!./\
   's0+,=+^L nw,Ww$
j
*9S:0PY"qh*(8&"&G% 0',F_W]O# "@A7WS
5bJN3! HA    Y!zmPY
)U:0&
        *#:L$+'; e*2EPf"'?4$!E7$-1/H#N4P‚*VNa
!&+0%;19<2Q#\%VF<   >       7(l' ecA3z%/=<+#/*,"zZO9 0% "(4*2@N;63OTAm:   
I6&(,F-?P&H+>#[*7!N@.OS&g7%
,R?,"VsC!
,Ffi;Uy#TR:B';
++}/C)&+@"'
        `l   h
,WE4&4j
I6!D *o&765+ _.' &+ N$)"=.6[U4(&!Bz0
!!ŸW˜€€€€9¿2OÓMt Z$‚IZOe+G3I  pp F& #-,!,       1l‚]\>Bb$H"=:        3l&i`%r7P2s!Gk4$L 4I?,Ju
Qx(B‚[@':s7&
‚T@7 QI1@f*
-Q
(.08'

A
o



G

3‚$C‚Fj/" ( 0 G9OS
!mY@<-,zprm))"'4Z::[<.f2t($+J<.
;e+pk<.;!
$8
n„M$T2‚E>aS#[3YJX‚FN
/l…%,\5 ‚?8>wM-)|d"HF'2 A#tnSA-A]_+$ Ij.bZTiOaƒ"*3Y

       

-'#
 >MH,c‚M$[)s0$9kJGw0
txU&D
)E8+6'7y2+(;*D#8&'4D% B9AU7FB
02+oY‚-="*1R?     ]$&Pnx]1&‚~*C   A‚B#6Ybt
H>0=jb&"ET       !e5+l"7X(5"@
pQA.9









eiAH#4x*2>
h0$    qV‚$
$~a(O`L?*C)sD
'Fcƒ‚(6!!s
4*;=)3.z
7[N%x']*O!of2g+{4XW,E*B
-D  *c‚@L@.
 -"B.3!*1?#-MQF#6'4"Z+b:;bBcJ0*z5>QI,,TBB;S$\'#       NH0,   #
fL‚*5A7
F j -Yi4".}{WmW/&
N}2Y^r{H‚L‚At"8g'BO+NI(               R
+;DJ     "3    I$&M!Q>=c"!1lM‚* vV   +q19d&#3    & #b       Z$     R‚x792,V^2
*B‚B$8ƒ%hdJP? {
y,
XJ%-lBƒ3-‚B/    1c!j‚tB*o)0210"8‚E="0kL,Y>J'Y&ErX-=GgY+v#m8Sjnc
&#<80J#'npƒ^i,65‚ Cc5Z"1#F2 'X+?
"$
^o5h'@!2
^O>%7In%F#

2‚ƒZ1)%xj( 17_?mƒ9Xxr‚e  A694F&:A:>$sB)/+fdI$-%<33 "Y       "7#R@L6W1)" 4{:,„(@-
!19"@
n;w!T) M'D\(&O      0?_CN!sk /F4
4JY:‚$U\"8ƒL]gl^'#++^1&$8C:"  [      "1*/

#!)%0!"#(SZ"

`\ƒ6 <3$9>06D‡X
‚I^xx$„6‡     2kg+‚    5/:…`#/6UO7…f$

n:+una64r[‘'JPH0=e7B'?oYƒ+@‹A
CC"%OŠ*nC#ORŽ98
"I‘m  "7'“N7$GŽm2QŽ|(JGW/,.-X?,Eg.u‚X5h‚*F94‚7'ƒ„:0%s&j@3ZJI,+D!3G?O'1,-T#F*&&‚JY%8>5_s
*U3cPFPa‚gh‚*2<
s+5R\i>+
‚f:#v*!gz.N2

iƒ1a[mLi‚:9t
2V_$

Nf@GN=_E,*3As`
2     <'8;&F>8
,1:
E1
:%G
      EF9GNP4A%7#.PA:    "P'%/1%
;@‚/,?.]'A5!9;$ (0
?Y
O3Kc7WEQM&
(1D4!%!K,s+67 _-, <!<d (;.CH H"
+?H,l.Xi#%
a0hui)2%/        G5LI,„
*\S&bz?
<#
"u!|[82.* QKe2
([({C "e
4<BF.O1/
Q0;D%# .)kEE>rV43ƒ7$AG9{>{#!e2/+[">w 36ƒJI6V{
a0--dC$#
!&"

_\?+57[
‚/GvA-9*07\SN‚cNpF$A$?gXvN.7
,
7huwKVDE@Q),S+mN0 Le1T<0H‚,!I
'WG
4"0#O+X#,‚9FT#<{O7>J@7B5&D7Bc[@7&9KcQ&=\)7%,^5I,1$*R.[WzT$R 3Qd4
Y=(0sy[\"PQ.">"! 
87 
‚l-\#W5#c4L*+H
=~Q7y:$

 '0  !%
Q-4GW58!J21nƒC(ƒ'
/
hE    <B,D-!72](6D"+kA    Žös!
*2)
B.H&PmJ$L+
Wg2>%(#H#


P
VC<)-b -
Bi="M;
B   3‡Y@2H    OTs 8
+O3|-

GYN.6<lAN,G
N,
‡_'R199‡g-8A8X(
+e!+‡e;%*O

uT
#     Ie9 7K:#‚ ~RS>>3
\/       1IL


D      2{4VHH
LS
1p

&      jaN+dLn   W25$#+~>Ou
%z‡Ug‚7W
1)2D
+>CH=)

Y*
  

HGE^K7
QD}?‚

6#)a(-)72EU    
""ŸV˜€€€€:¿0 ÒF6I)ÀL
|h
|Mr;
>]\@

k$CN=&r4va‚-19‚!V*v"?]hK'..ƒAq=53c~v)2   G„3'#3I]%Bk  O/NF\69`$33YGBq @y$ XK2+/a       2s=>\-#‡)90   /%]BW!
+‚>,IMHII9Ka/DU‡_!
jf5F \w       "{0zF

cX
X7mHZ
9ˆtƒ`6^r[+3 5 t           >!!J‚LB("O‚hz‚N[-
U‚(‚IE (>V.„2"`F<ƒ$q<r0
+qi#*-
U<&E=!&-yB9:|Q=) &&3##+U;Ep|J\ I&r*‚/9&v#J)@W‚}79N_WC&WrLP      A6!/n,i:bc)67~Y\/e2ƒ6NyH)


+>?2"


G
,4n
JS)e]!@$/; #=‡Y+
-X
E^<
Dg ‡d!
JHT>Z6      k+9@^q~e‚pZA0oO(‚bD$,MsBL
8&>       a*-+$   !i      4      0‚^$!"‚+,J,"lHECb:O#HH 
*9@A8"MocLIƒ$-d‚#3,J2..?< (2G*}GX^
"3
q4       . UDS  
?B*%q0SZ{\_-G)           

[C.XeJW'$(*I^sUl\&6aiM@c@nj8am->[6:ƒ."\‚‡>K

3!>.==@*D     
=!&
=*
 &f
[  '"=%r%&HHO=37‡M;{G(i'
  ''[2# 2—4'c#‚l=.*'‚l8#c7'®mR(JE‚*‚‚„j‚‚G…      ‚‚‚ƒ.5"I‡fO90O0
(       8&
60
CoP%B<
;U    (‡f%xH"
o@q(
/1@+@>9

5#=‡]@(-8G),/+"UR"8   &C'hc  T*s       )?c9.WM=KG
k K*qU"-
#8L>+"$*Dra#!I!=-*
?
S%9%Rl@7R\0::/* /+&#qv(4WKD'x'bGq#^+It b
2:(05
/D2Z!6
<s?[E,
N)+
b+56   0&/(LaS<

@&C
*4!$h
      "[t+
#+

,

YB =n&       >2     CA9%@xE'0 *
)Y\/"42C        772
["$G3‡B-V"(c8‡f
,B<\6Kr64C0i‚*J~~M-    -.‡c9B,‡g-n
d1.WT‡op*a&‡e;(0    9'    ' 4MŸ
Y4e+d§&8_      `0
(Q$6
      
*"@"        
‡a
8    ")nj]+8¶S
)SMR
8
nf‡g
ji:—5/5        
C$,()|(
‡b
vT(!i40‡      '&F43
o#'- 
$Y
‡d3>   !c*
4a==X NBG
—1
3

     \
k
LKY
Z*"V
QA
"sqh   Ÿ
"A(-88I
r:7‡eoQ?A 6'
 A"
Ut$-/?
dhBH+!?57" Qdk
mi $
!1'%<E&
vZ
‡W2:kI21.S$
LZ!!F"S(L(5hC2!X
II/ /!S
K8<
Y!N0      n
""ŸV˜€€€€;¿0Ò9“ÛSL]9k
91 - oY&%2/2
Ik-~LU .
/k%K;L&
")
=>

&.    =#žq
331‡f()p#a
C
DYz,2I
l     Sn
A
!
08‡<NL*&)
&A
Ud
:
(A!V&<
W
     $‡*V+e‡'-)vF®o!@0      *&?*%      b7
*uC
&$J\       /( {@E
BV     *u>/,&:ir(V
AIhs,/:

6eJ)‡U
']4. /O‚s4
6|
3‡]Vg6, 00sJ      m*!      7BS%!j(0!Ra=4„       uR    m
$ C-tVvB>'<
;    E#/=
#*,
ZO     "*2
4
)O‡TYY8y       
.6&(,rF?:,
"Vs!
,Ffiy;HyTR:J
YU &!Bz0M( H$
‚%hZ$e +G3I  dp     F& ",!, 
1E‡\B
$H"
:    
K&i`%rPHL 4I6,Ju
Ql(B‚[@'‡$&
QA@ QI1@—3-" (0 GbS
!bY@3-,z
8rm)"'4Z:[F/.f2t($+J<.
f[+pk<
;!‡Z#8
A„M$T2"A>aS#[3YJA‚FN"/l…%,\5‚?8>wM-HHF'2 #L

nS-A]I+$ Ij.
ZT
i
Da‡^"*Y2

       

-'
 >MH,c(2M$[)s0$9kJw(.0
txU&D
)E8+#j6'7y+(;&!D#8&"4/B% "19AU7FB
42+"Y$4="*1R? TM&
nb]&‡N(C f     AUB 6Ybt
H>M=(b&"ET      !5+
`"I7X5"@
p24A.9









eiAH*_#4x*2>
h0$    q$V‚$
$_K(O`?C)2
'F0{‚(6!!s
^*;=)3.P
,(R"x   ']*O‡o=‡g
e      {
FX,EB
Mb%M,3!
1?'7-MQ8#6‡c"+R
;BBPJ
.*z
>QA,*,TBB;S$\'
     N""0,       #
fL‚*5A$   F j -YX4"‡Y:=%m1/L`!1aM vV      +
19Q&#3   H*792,V^2
*78$8
Th*d\&D&
{

P,

/J&-hew3/1
!j{B*o)21/W"8‚"0kL,Y
>7-
uE_X(=G(k#m3Sj(
&# 80J
#'<'i

žV(-%<3‡f1 "D        7#R(L6W1),     4{:,„(@

!9"        
‡a
;w) M'\(&3   0_C%!T 
F
‡[JY‚!U\"8L]l—!(*/"

`\
ME'.>o5h‚*F94‚7'ƒ„:0‡b#
%&
+@‡e-JIc?        D!3G|
='1u-T#F*&‡_Y%5_s


U3DcPFPa‚gY‚*2<
Z+5R\l>+
%:#v*
gzN

MVa<
L‚:9/_$

}f@GN~=_;?(A)<
  '8;
F>—EF
 (GNP4A%7l.PA:
    "P'%
D1%
;@‡`/?.]'A5$
""ŸV˜€€€€<¿0Ê!9;$ (0
?Y
—î\
-3K'    WQM&
174!%K,i6;_&,  <!<d (;CH 6"
+?H,
N.i#%
*.hui)2%/  '5‡R,‡f@
\S&
Jz?
<

")!`>82.F   QK
(@       >e
4
&jF.O1/
Q0;D%# .)kEE>rV43ƒ7$AG9{>#!e2/[">w 3S
/
I6
{
U0-dC$#Q!&"

_\    +57
\
‚/GvA-9*07\N‚cN0F$A$?gXH:.7
,

.h4
BKV#E@Q)
1T<0!
‚!I
'DG
4"0O+
#I6&D'd
+7&9KQQc
=/)7%^,I,$*R.[JJ)
0$5 ]3Q   4
=-+yF‡G-mQ
l-M#W5)H$y=~Q7y—7
fE    0ander‚ˆKroid‚‚r)‚2ƒ.ƒ @MJ
T
$ŠZ²e…"& 4„q†Go~?‚%,ƒs      .‘ý?œ‚Ïxƒ'"&úQOo~?
‚, 
      .eabiƒ
•N
—ã5
gst‚ular‚½“"i‚<
3#,[…c ‚2:Y\„J_ƒY>„,T‚N‚‚03‚… @ƒc‚W…e„g&‚B(A~†?Kƒl{‡.„\‚{ ‚        l(@ƒ@|‚B‚'ƒ„6&Q„05‚Z‚\‚vw„DH_‚A^y]‚aƒt‡Tƒ=ŒxG    ‚K„$ƒMxI0L%[=‚8„
)ƒQƒ„+q„$"ƒXUƒ47„"
"^‚yw‚^6
P/f9U@
1
)jYE.>G       E&ƒtƒREB
V
‚<lV‚

3
g
zXƒ\ƒ;'‚*9
‚a%3"00
*B]F MK
0/
q    T
‚^
3(ELq&}‚\%A:‚ƒ%g
3J8‚KIS-ƒIdRTt
!\Š$‡(‚$"p"Y„6…$
1(
R&4D
„]4ZK‡z„^*t†X:In‚|‚Z
!bT
@<|‚H…l;Xv‡L„+
‚n‚+ƒ'        70:$SQR
itG5-'„R(†x‚2‡t0I5J„ƒ{y<&]…}j!OU‚~‹[t   rx21ˆyˆ…)ak8„{+Š‚Uo#V8‚`W„d>‚
…fZ‡t%t<k%<^6ƒu_V…;†.ƒ'‚3-=tƒ&21˜$‹&Nƒ57ƒZ:‚&‡JbR…
‰}„sAŽLFq24„ZƒJ/†eOp_V;„ƒ
„F
3
1+la„FŽ,‚9ƒR
‡i‚!†RƒAƒM]‹)Z„[†.†{8‚+07o‡ŽHƒ6ˆJf„
i†Dgƒ}†    <‚x„†…zrƒ{!„9‰7‹b†
ƒG†F…S_…9ƒU„ƒcƒ„#D‡dŠ3ˆv‚{‹1t„)jLo…m„^4‚+„jtOˆk]ƒO
5ƒ,ƒ
1
„-dXZ‚z‚7z„-‚„;„X+
/w73‚3ƒ
[† Z‚l+6S‚t‚
Y[‚‚&&S
XB0|
8‡)‚‚„j‚‚G„y‚‚‚ ƒ@Ž
‚"ƒb@
‚[ƒ„=…\
 „s‚
7:„Wˆ‰{
ƒ…
‚1‚{‘ŒZ)˜GlŒOi…G‚/ŠE) „;p3
„L(ƒRr,X4„<       ‚9D…Im(„JŠ„/`‚f‚ˆ5ƒ0†       /‹#ƒ~„l‚>„OLƒ@Z‚1….ƒs‚$7ƒ^h„m…?„^*‚‚s†=…a6Y‚/ ‚Bg‡‰^v‚%>‚9‚O†{I†5S0ƒ&L‚s‚…F‚ƒhp?p
‚~„AƒO‡:I‚pn?„t‚i„9ƒU’|/„xˆyƒLH?d„b‚…) ‚,ƒn[@Š>†
aX‚
ƒ#…56†T‰G‚X†j(„"?ƒ'…P    ƒ]‚"‚H‚^ƒo

„{ƒ3ƒ!ƒ7tƒ‚Wƒe †/|"noƒS=ˆ\p?s‰    
-Q
p4{‚^N‚m‚ƒ,Š
4/‚Xˆ3‚"…„dap„Q0„ŽDƒik ‹t>48'U‚
Tƒ‚‚l'P‹y‚A„lƒ{ŠZƒa†Yœb‡1'CŒMƒ2ƒ„C:ƒpwy"ƒ^0N‡Mq‰\tƒBŽsfŠ
‚9X|%Vg‡}"‚\ƒE…Š$:‚0o‚3†.‡‚F&k‰Yƒ?C#5„/‚L‹{(‡„
—M„v‡wŠW…wO)B ƒo…Œq‚-‚+…`ƒH„        „b†ƒf‚I…~‹s
#ƒo.kB 5&$M‚Lƒj‚k4ƒ>c‡‰qJDeL+`1c6…rƒƒ‘J‰GŠoGZ
/a 
2\Hƒc‡`]G‡s
/>
…A‚`ƒhŒ5ƒAQ‚1p„[„$XL‡UI‡C‚V"ƒW‰7Tƒw‰!Vtˆ44Œ!‚Œ1ƒ'….‚c„LDƒZ
Š1‚‰iÀ2‚q““*Ž}¢”o Cl’gZ†W…Md„;XƒFt†‡V„m‡/0
ŒuT4„+e†ƒ5,`
5k„vƒb„?…"VE‡}%
""ŸV˜€€€€=¿0Éjƒ–)8h…~‰
…‡‡<‚{ƒ,1GX‚q“>‚ƒQj†b†JfM‚Rƒr‚z•Os'†lpggƒ{ƒoŠ/ƒ,†48;8ƒ)‚B$‡'G…b_B=‚4‚ƒOR$‚T‚>
Y,dK>ƒ       r„P\"    b:;‚DŽöv
=‚2k  V5CLcyw‡[[j!OU‚{
t[D‡‡p‡iU9K
5e
5>AdXt0‡Vk%<^6
_
"@‚Yo;
) -=@Zƒ"1
‚1Nƒ57ƒ        Z:‚†-JbRK
‚‚A,$
„2‡D0K/bOpZVlƒ
‡9

)
[)+J^ˆ^b8ƒR
‡i‚!†RƒAƒM]‹)Z„[†.†{8‚+07o‡ŽHƒ6ˆJfG6+‚s<V
ƒB„Ar!ƒh‚QMƒG†F
ƒ_‚;Y3‚Bƒ
ND5a…
‚{6t
pj.o„„^‡@YH
‚
.r
U
{ ‡S
X
dÆ'8…^‚‚„j‚‚G„y‚‚‚        ƒ@Ž
‚‡g$
‚f@9\OE<‡g

‡ƒri‰{
ƒ…
X‚{ŽQ)ƒUP1
yit`‡H_‡g&Z‚{2‹!(NŸU§       )‡‚MåDQ#3L‚V2x‡g‚t
K?—3=NKF
tn?‚‚Fƒ/Ÿ
 P-[‡f?>‚Y
0‡Y+ƒ#…56‚j5uT
(gk‚      1  Y-#‚S¦`
~‚WhmG‡g ,‡X¶Vy
.N~;

@4
2‚Xv"‡3:aUv‡_
„r >48'U‚
W'‡FŸ  ‡@
ƒl-—pVcf—gFlƒ‡\vo‚3+…ob
k†!Y{C#AJ‚/Ir‡b-ƒ$V"/‚"L")‡P>‚uJ‚?ƒHƒ1?UJ‡J!‡gEB 5&0KH
1.‡ZcVPQJDeL+`1c$
‚:‡[CEP
„/oZI
Hƒc
m]E
9>QCI„:
MQ
‚     pu&
{      p¦B‚4‡. MŸƒ       O#;…Md„;‡t‡h%‡‚
0
MTS_e.ƒ3
+~‚
VE—‡a_‚K~„kk<‚Eƒ,1G?(Py‚Qj†b†JfM‚RX‚z      ƒj9/
'g
)ƒ{=ƒ‚J:bv
!$1v.<B!       5\—m$5‚>
0annoi‚V’RËY†q‰Bt‡x—ƒBunc‚S)5Ò=†ƒñ„ƒK/y‚ŠN‰,ual‚Œ
]„*íomali‚…<$>Ž5‘‰„.>
nŸnymDQ†Jµ1…‚
mˆ       òq‰n:‚
„j¢„,åi&‚
ym‚°o«{'th
O-   !
Š'yƒ$†mƒ5ƒ-ƒ# „i  N
ƒ143ci<B
$
“">‰C#Bb
‰qX…=‰b‰J‡i’Šd_žN‰?ƒP…x„‰i‚zƒ1‚&„F
ŸÅAŽC•9¼>…4mY‚3‰H‚r†#,†`ƒ
ƒ5‚H„u„Y†„‚-†Z„e™mc“+–2ŠC‚„‡?ƒ%ƒkŠM‚N§/¦kƒI‡/‰Ke‹‚P‚ƒ.‚=…‚‚d
I †0ƒ1„q…s…)‹‰5…@††>4…!‰‰4…+8„Œ<…ŠŠ<ƒ*†j…Z‚V‚¦W0¡7ŠLšWƒ   žOƒe…
‹'5‚rƒN‡X„Hƒq;ƒ8ˆfŽS‚†{o¤†:œR“z…843e)–.¾f‰6ˆK‡l$‰Hƒ‚…V0‡<…mƒHƒ‹yŽY†
°N•iü>ŽyW Ž@…:Z[š70‰&ƒ‘yc•‚)Œ«Y† ¦m†:‚_‚2{†
‚‘Q(‚$ƒa‚Žöu%„V‚C‡_7§*ƒO„"—.       9*L
)
8•      ÅAŸ„\‰j!
‡X
BmY;?lŸ‚;¶W
‚  Z—‚h‡z„`NYŸ
l”87®rD®x
”r.4o
""ŸV˜€€€€>¿0        ·‚DI“ÓTG‚‡ƒ?l<7^5
n-¦\Y—6(¾‡V.‡q¶@7‡y;$8—7~—‚c—4
o‡‚s‡Q
ƒ$   D®
+‡†c|§[22t ‚J¦‚8‡‚‡§ˆ%yWKH‡m
i…:Q[0—…A‡1 ƒ!aFB&p†)žs
Kjcd—       0anqueu‚SžH…Z”Õu
e…Zsi‚‡m«l…Kt–      R‘‰7„ƒ/Rwer”Y
›c1‚h¡tƒ[`
‚#ƒP
˜
•7°eŒ>ˆ}™_ˆQ’o‚aƒj‚WÄ ƒF$ƒF‘Š'ŠB‡\d\yƒ‘„f.‹l|Š
‡K4\Œ
™lo&   *„‘n‘K
kT˜b‡.ƒ/‚Šo…K
3‰Yž]Ž0–)²f$9ŽF„X‚)
”oÇz
…U!¯"
4ˆh…?ï_–$§CBžjœŒ>ˆ}™_ˆQ’oIŸƒí6zƒ‚8    +#d®MtLÆ"Õ
®s.|$§[‚<
‡p*¶K&      *M‡wB¾6E
kT§\]¶U=¶V1‡„;m‡_…Pf$¶U„X‚)§1^®;2>¾<B· ]ti„9S²0’-@ ¢‡À|ƒ#-"       cip‚¡2ÉSƒ!¾/•”ôV?âY”bviru‚.‚iƒ.wendbar‚ˆPybodi‚
‹^‰KH„”ôj6how‚?” ‘(‰•»-on‚k‡Uâa†bh–8‚‘˜…:…æAplac‚•Vth$‰r)‚-8Wx‡g„80oˆ‚!
ƒXz  ƒ#†—=‰k
!‡3‚:q…9ãmˆƒ%‡I†#Éx*‚†ŒAÈ
š}Oƒ…ˆ}’k¢7ƒ4z‚…3•m‚
Œ\
["ƒ„8A„¹L…gŽöwx‡n1§V—h‡7~§{CF\‚CÎ5—7‡l…3*‚‚‰LÕ       übm$£zYP ‚
)A³Wr}im‚Ênù†)wai~
ñR†f¾¾ƒ.h!N  †0…7„–YJ„‡,
Ÿ|'  ˆU¢yƒ‚vž…5ă+µI
+Šv¶ÌP3¡E
‡J%ŽH§
A'Æ‚>‡‚"‚ï‚tÝ1‚¡H‡`c¾2bŸÍl;§
&®3@ol‚>Cè
‡)rderbiysR3#93
:<Ÿ,‰‹•ù"ƒT‡param‚Sœ3&P”Õt‚
3&Fg‚P¥F
L
”å>‚.
L
t…~Œwƒ™a
Jˆ<¨/‚U†;Žÿ
‚s‡¶ Ÿ…Ÿƒ›‚U„ñ<gno‚o:      0   2^(!(;NI–°68b       0   2^(!(;NI      hraseinfo‚¤H
       ýŽ
       i
/Œ#
ƒ3:#3eW!'P!-${r&ƒ/0‚AZ-…0     
‚…#f&ˆ3…d   „d/ƒ}iH"+fTb‰2f›o,6ƒ*d—;…o*‚A„&0fJR
‚     N
0.9) …„‰H…_-°;C/ƒFBƒ*ywƒ5Qƒ.†^+…ˆ2 „
ƒ2…x›K‹‚&ˆ !‡‚L‚^…eŒ~ƒFI„ŠxˆN¥ ƒ$‚]…5f!„mƒ)@…:='D
ƒ;(~9#"pE%
""ŸV˜€€€€?¿0¼‚G
lHŠ4: ‚‚‚"†sT(B’x,e‚.ƒC…NSP‚.,rX„;‹
˜(*n}dNK Gsƒ"gAE‚'‹i^n
˜L&‰5‚rX‚g*a(‚8£%&Íp…DemŒUBq•QŒi‰S’Xƒbkš<@v¥/ƒf‚ob!$YŽ'f ‰x‚H
p¢‚ 2WÁ$‚r‡b

NMD‚I‚‹(ƒxƒhƒtŽög®q+`Tb—(6
wd"*
.‚A6„$0fJR
‚     N
0.9)       
&ƒ'GE‚@>Ÿu°;—‚$„…•N‚!‚&ˆ !ƒv‡‚L‚^+ŸMM
/I<Ã(D‡‡hJG    ,®ƒüx+®|
L‡‚X
"X/a(7‡g
§‚'Æ+b—6h‡<‡‚T®&®o
k@=7å
     2m
‚r—ƒB

NMMB—9
1‚1LB0api_routinE:†6]˜Šq
P]cal‚ÚoOYqùfBOYqndvfƒ¹—Ì8olog‚ƒGstroph‚w
©a2p‚g
‚z      
žz.‚J,.
†/…%ˆ#
„j„ƒAêƒ<ag‡&—‚pr‚.‚>ƒ.˜8Œ¤v„.˜šZmatu‚„costv *#Žÿ6*#eal‚Žø‚}r‚q
    l
*Q†.-$„V…ŠˆH‰‰4ƒp+„˜e‚L‡*„Aˆ3š7B;.       e„„f0ƒ^‡-…O
ˆ3m  *…h‡MIÌ—‡„SŠŒ•Wƒ•?õUqXŒ|ŽV6‚j
ƒ…G
6‚PŠOƒ´d’.…06†h?h
“«'š]´]u‚rŒ5‡#„lŽ=Šw‚$xL$ˆU‚n‚a"…‘„]1Vƒl‡o„B„„aƒy@‚x•@E†9‚&cp„P…A-n‰„
ŒI‚P‰V;Ž ŠEƒ\…,¡
‚4‚?•ƒ‰
=“„sƒ'Ž8”•| ‚KJ‘™
[‡M‡/£ƒ)ŽM9
%‚mÃ$‹{0fˆ|Zˆ‚„„&ƒ7
‘tƒ‡LŠ5…ƒT†?QRO¬(”fc>¥T…-‚Œu…eA„y†"3‚@Š„`ƒcŒDŸqq†'Žövr—U§e‡…dI‚ƒk
E'†
1‡/\‡dW
qõUŸƒ‚t6‚j
F{‚/
6‚P„}L
‚h6)?hΟ~=E‚oƒt‡#NA®?x
®rzÆ‚\®Õ
  EvD)"‡a%R1-n3AÍy[®vi_^6ƒqˆY¶‚wƒD¶‚HH—d‡_3J@
L[‚#ƒo‡…V+9‡pÕ‚m4K        
!0f   "¦u‚y
ƒxOy§w„\Š5MƒSQRO‡qg—a—P‹…-‚‚R
W3R‚„&ƒ5?Ÿ
`—ond‚Aƒ5
„#    W        P!"!r$!„U*ƒ'Ž
Pƒ„u”‚~‹4D‚7‡µ
TƒSº/¸3›a˜a…W„^Žnƒ1¼sŽG‹I
C
:[˜p‡p…V…W„SB(a‚mŒ§
™pt…}“U‚O„Xˆ
‡)‚*}•ˆYD†L
²?•b3 šV
œ6h‡_Œmß
†pˆ
!ƒƒFq(‰ASu        
      
       Žöv
[*P‡ƒQ{¯     :Ÿ¥a¸3ŸQ‚MM‡‚Aõ’JùAåL6
EB(a‚ü9ÆAGW‡k
—5
Z)õ8A

_
‚}D—.u8?í1‡p
9

)
>®t>V|/ix~
ÅEÐo¾d¾Œ}vf‚ˆ&šm¥q•£M‚¨Pg
fileformat‚‚1l~óC*Ê>{‰«~&ƒ
&È@¾…3*¾!„a{ü‚'‰o‚ßl5aud‚‡“šGi
‚7‡)„+‚)&‡_6K‡iw„o‚7„w
,‡*ˆU

9
HƒCƒ‚n*‡E+…uu‚Š~“(Ž†`T.&:/1„„/‘p‡S‡6‹\ºxªm>b
j,?[ˆJ`‚\'$
ƒ-/@.‡R–Œç‡Ž ‚#&‡\“,‚,°y-…1†O‚9–GŒ‘Gƒ<@ŒŸ+ˆ5j<dEƒkb4†{ƒ<
‘h)Œ‡
*
?)>Z]3K†FMj>†ub28w©ƒ_)(
}‚~†`¢U¤T“`2))+ƒ=5Ly‡     %)‚'sëEŒg‰="XP…ˆ‹;§Cƒ?e‡!‚
‡
’`Jd•P’@„[†c„µ¥%„‰7Ž÷ 4¾
*T.&
`/1V‚b‡_
R;k†2'
Q+"Š`…'(_
""ŸV˜€€€€@¿0ÏÀ†1l‡,b
j
?[
„/`n'$
b
@.‡gSBŒç‡ƒp‚Gy]b  
…6-cG‡Zí"
?7‡“8Ÿ
Đ2
a)(·=üƒZ‡_'o+
W5Ly%)'Mõw‡c‡G="„—28‚8‚M
u}‡i‚YƒCPDb‡h—3R
%%d
p¦‡_GK—‚[Æ#8ƒ<     0applianc‚ü„xcob‚*A(‚,,|ƒ$„{6‡~ f?ƒ)'
G‹i‹>2‹(]8@dYŒXˆ
–v‡&ˆx}'’{„)NƒW*\i
4N"

…>
}
C(@
 .30>+„`
?_A'+4x"@*
G)"`5mL(=!8
>$$$† jƒF?‡Cƒg,…: 0#T8`8
"@,w(%I‚`vVg&'[†%F
E…4
k)(/

Aan‚
su…
'†tƒIƒ>;"TK       
Sƒ#+„H‚a%‚s„U‚R>&|cC„p6ƒ)ƒ$D0%ƒƒ,†+=r&‚%-BFp‚]…}:ƒ‹9…Pz1&„ˆ%jƒF/6Wƒ
‚4%,%ƒ^3TC„B“\…zLƒx„)©˜|ƒ x5‚X„K“2‰8      šY,2G„$PpˆL}9xdz‚6‚L‚P!1,/ƒ5F"„!xw{)AF4‚i
ƒl
‚‚%ƒd
;4
"…^…+SŽ]ƒ@†S
¦G     ¥$‚*‚a†^„k‚F„\        “'JD‚ws,`
‚;B<oA‚ <G!g†\@/22B-:*A,6BXGV&ƒ‚*Œ34$)U‚s„`a‰r
1&
o%
„n‚nT‰fUƒfk„4.bXMW„-1„„E‚nƒF`N‚M\…K}
$‡‡" ‡ƒXT]ƒm‰
J2
*„i   
aa)|N‚] nY"0-‚0ƒ*"(s,sT#"‚@0d‡2H&7 ‡      ‚d„ˆ4„†„K.„Y‰‚X’^‚^F‰L‚{ ‚]B…%O…
‡{KB@    )ƒ93…9
-     8Z‚{J‚$<}k„ƒ2$"6,3k(-BUC:%rc:%rF,‚: eNE"-Em‚7;…Dƒ:%t‚K5‚LSŽ& )#&,1.$-U(q<‚-@[|<
„Y:†A"
f    5&,NO
;2%„+„0„Yh 
‚U#2ŠR)ŠOm(g(v51nGW2i'‚~ˆE–V/Y„6‚yX( U"!T'-*&‚+‚* 2(

*
/g#E^Q2)r#(&J`u0?„„Š'

@
u‚N*„e‡Ilm"ƒP†o‰i   ˆ!Œ4‚1¡…    ƒJƒIK7ƒ…Y…"% ‡]‚)jƒ‚Jƒ-FE‚   ‚J#‚C„ 
ƒ[ƒ‚<‚IP9OC‚‚‚Ab
„s7M *T‡K&"7$SyŠT3`‚@:‹|ŽEƒm….ƒt.ˆ(Jg;!st       P&M!Sf††VFb^
".5:76
.‡PPƒH‚S‰/†_
*=8X2a<3
Š,[q.:s$s‹
ƒ¦U~„'†'G(‡c‹*ˆmŠ,l  $9WG@&"/_$ \d‚p5„V+1†K%>.Bv0b]6XaCpl]-15(Yu&‡@‚ „Z‚B:!L      QX      ‚x      t      „X?   ‹d…5‚>„e
>#+ƒ„:U-‚g        C‚‡!      QKn‚ƒ6"71‚Uu#‚p1KYžP„%’ƒs "-†&m‚w@‰‚?y2  Ž-…‹D…g‚}={`mj '%V]†,‚8ƒ+=‚Xb(:%V‡j„}‚!  /wuf 30:U†6© Šk„#"?ƒ
3a+ 
.‚ZfƒWƒE-TB0r†D5>
:Y‡k2}5$
‹Q&.8@&'‚xƒs
†LRƒ{C*Žöu‚_%p*‚R>&|.
J|p6c,D‡#w‚
=T
&>‡`
)B6pR
#VIUd%,%‚)T'K\‡W
ƒx
)'!
= x
‚X7Š=* ,ƒ5‡-
ƒnp
}xdz‡`})/oˆ_K

  ‚%:
;'‡Z‡h
eS…w#„V

Œ|    WI
P…‚F* "JD‚ws,`¦^9^f¶V6k\NB
'aFp‡h
/&
‡i
%
„n‚T"‡fUƒfk„4.kXMW„-6„„E‚nƒF`N‚MH„r}
$‡IZ
t'Hn*/
*
^>      
a)*N‚ nY"0-‚0ƒ*K'J,sT#‚@ ‡db‡jFŸq§*ƒ:
""ŸV˜€€€€A¿0¾’€[
"OÎ
[Ÿ9s,‡#t‡h
5S‡‚T—(*K
1:
"f        5&,NO
;Ÿav51nGW2i#‡X‡]k§8
X M‡gJ
3‡X¶[LlI"
i
to…‡        
‚2‡]
1
2—3
7M#KNXp1`
A:.V‡^‚$—2
.‚^—e|!se    P&<!S
A†Fb^
P"‡Z4376
.sP‚=‚S†_K2<3
I[6 :s‡^q
‚l,
7‚‡P
E(‚5„r‚`‡f‡lFL
K     O9WG &"/!$‡y—*7‡@ 1‚B
,!!L
!    
6X    X     l     

&    
‚82:
>#+Y%U-A/      Z‚x    ^(¦GiK‡H‡f§
F]m‚w@‰‡dN‡g!2‡r

ƒ7‚}=žlL '%V]m
r4=U
Ve‚!    /}wuf 3=‚

‚oI?‚
&e%.‚PmH
-T:
1}$

&.s~I‡N%
2O
‚NP0application_id‚2„$:†;ƒ¿‘"†iG–׆;3:£‚y_changeset‚T
k[”Ý:[v2‚%
¸C3   _strm‚¸Ereci‚ƒeL]‘·„Ñ^[ntic‚Ÿü„{oachƒn
W>HH
‚_h
–Ž3Qˆ0FØNƒ?^“W:…2‰rH‚ ˆƒb!…sƒ|l*‚;

Šj3½6“,…0„;†»e†     ,„

ç_„‚=§J†XƒgŽö‚]K8
2‡„/O‡o—^
Wƒ?‡§J,õ7‡ƒŒPEå
l—7=Î/I
2£%õG¶F_   ,å  Õ‡g4b,®^1pri‚`ƒ…s‚C"Œ'Š{‚D¡s
-%Et6`N†
9   
(Eƒ;"
*"1‘/2‡@¢U
q%„o9
ã(n‚®1†ˆ N‹G-9‘dƒ(…F‡-„š›P>„ˆBq†B…$•>X
‚zE
ZˆŠRŒ0‚'‘;ˆM‚Ô6†XŠWg{.”X'‹[‚Cƒ^
¥„%Š! c’UKŠwFƒdUL‚#ƒP…V”¤À@Ê ‚7›0“…-‹ ŒC‡     ŒD†U…K”lâ*X‹~ƒŠuƒ‚t†'Žö‡fHd§T%NVˆ      
‚n$UX™J1—2UYŸ¶Ÿ!
A„‚h–{>‚)ŸŠWOr«neŸCÕ‚‡k,”|—iy
g{J,    Q'‡ƒYPŸ/‡‚k,‚Y†z  o,ƒPU‡MJ‡i}Ÿ"@œ_‡‚
>
 *iž{
‚#g„ƒ^&jY+P
2—hv‚‚„yƒ2¼‘ $Uxim†%E*8 QŠ]„0–${qB‚V_
HGC @…§'
†EÀo‚1°m‚ƒU
‘V
†O$Ã!-f‡SNˆ4<)‚\{„-«qwVKK‚‘1ƒªMƒ#P» 
œL‡K‡;F…WŽÒ8$‚/ƒPƒZ*,ž–#        ‚§„Nž¬!Ÿ)‚¦7Õ…j‰~)G%K‡"‡ƒŸ
7);[{‚ß:‡¶ŸAýå4
K,ŒK‚{—W$‚/#‚]*,Ÿ?¦o             ate_matchƒ˜Á@ress‚„váhilˆ5sqlparam‚Ÿ”Õ-val~Þb¢^
(¾WJz¾>Œ)
(r10$>'OJ-
ud0-OxT`‚.1
I    
‚.YI"5@(.j…22".L
2@h         ]
o/   0?7)vjVm\y^ƒL6>   ‚Ja:
m+wY …M    †‚#@x>i%G‚(91BE-n%‚bƒT(` Ci~'
*F‚e"9
2@"‚L
EZ‚FA+&
"F0!>      
`]‚o&
_J!
~THIBzYO;b
„        ‚!  *7B8!g) HIM&$ƒ&‚E5
4@„/3ƒB_{\<L]R6"Š_!ƒC‡0!„
3
!!ŸW˜€€€€B¿2'"`ƒ-@7
‚@~‚;‰:‚"$V $
?6;/‚:‚ [.ZL[u>ƒ0     Kƒ2„jf!.5
h>9
'-ƒ,eW‚C*ƒ:[ƒ{h 4?
      i‚?~f*‚T
-'d#I

$s    +7{
I'/d=O3HK1Gm0[;
%~
C;$$t 
7(

ƒ%k#
W3
0r
a‚B<   26[   ,)7KE35K1gO

3e
t7‚e5‚
†6(
b…))DM'> 
‚&1QXF*p>
…$j>
!R

!'‚e@(‚(20~5o‚
6J%N'd&#„zJb%"„vmw
y„ƒ4‚   GƒPA‚
+<!JZN) „F‚1q
8"#.DIS.G‚(%9‚t„6\=^$p%y0 2\^‚n h       C5.:|;"+>0
W~‚GI„…P* &      6ƒ!*]*T
ƒ$     0`(ƒ:S*‡;
‚dV
*„Q

;‚/`*QD        ƒ1$/‚%‚.]!Xƒ(-ƒo‚U~     
C/.‚m7UHF„"%+a‚UdG"‚\6c>m'„!o&
I8S     >s%3ƒ(2"`‚)L&Hu>ITS
        VMBA3‚ƒ=‚O‚z„#…N‚u@‚3D[>qf…j*$08‚'ƒAUND<~C{=
A;.ƒ5h‚+u

.G‚-'/)Mf!4[%0E Ds8d>/'-!P:ƒiƒR@L
V_‚0k)!…%A ,9V|‚k qC$.(H}
Q7; !bPO?%‚qYYP/sp0     ‚T4R*(Tf%>|‚  $S$„‚P‚|‚Xg;56‚Qk…"y…2t‚'Ag0of
!<L/(O[qxƒg‚u7U5ky:'r!‚TrDq‚?k7*‚‚0Y-„l7$
?\C7…]:s/b„CL3?'>   6‚Po ,a^
N>-SV‰w;$‚!+3Mƒe‚8Y.…    ‚?‚%"      x
Y}„.‡/ƒƒ$+…S%"      ‚LW?R„p‚rŠ‚K
„K%ƒ-‚?3 ?F ?‚‚…^ƒBY
‚_i! dmMAp0!*ƒQV0„    ƒ‚D+4‚("
       
u aTƒ,ie9=U^A$> ‚ƒA‚8[&     ƒo}7I2ƒsYƒ#b]$*‚m-ƒbv-@‚Z/[ƒƒVyƒT]!P*Y3{L]‚3      KFƒng+/ƒP‚9„‚ e\Mdd8q‚ij%„<(I$7„Vv‚6 _V+9_)cT1!a5G‚w‚O
*:„C† ‚+NL8lJ16n
;<(‚6S1…$K8‚QE       ‚*ƒ7ƒMA
)‚tU‚
,,U7I8R    F,cj@7‚%‚,YP/Rz2d
,
‚|
…rL#@‚*A)&E@"8!3†F T5-0‚u!Š>l/$
®‚;J9

 %‚
xH‚,'Clf9'n;e;I
@‚30p;k7‚U‚d*#U!
Gwx'kw=>;92vk a^ƒ)nm+&W8!sIbl„Rl$‚<cB{ƒh6‚]‚F$„Pa%s4‚Iƒ]F>ƒx2578 
N+dCH(bB…e=7 [>9ƒ‚)
„zAC@Il„i‚       


%2,0>D71"4@"‚?`ƒU02$2               76)~d0;_;0&-'?7
AZw29/K†*>UC2TN
(We   
%F      /;1a#-‚dLJ+T]T7$L‚vJ F)*c0ˆv8#$*#/ƒ3(
ƒ>,!:bi%"%!K`J_
;#gZ‚5#~‚e#6d  k6‚-t‚TlSƒ?‚d‚?Zc]UM1YQ  I/$DX‚2\6.I@%V
5WQ‚}F\2„T@8…R‚
‚]U
d[W@$<ƒ@~#DW…c=$F mZ#fS†f‚)$Cy4uZ6‚4 ƒ=       ^H(DMƒ53~
…uSCXa**2$‚b7:_‚5@qY‚Rb    ~‚'‡h5_‚>6M…B„- ;FF;v3       1+w!‚!
3'
j    )j1
./-e-ƒ/}wE‚rd0
„Km       2ƒ „cS‚i9‚je+t‚)N*:"%‚Pb
G\W=BE„
3,0*e „
Nz#]%i;v~„7nX@v3„%[‚u+    'vA71
‚!w       w‚
 a7%/m‚&"(ƒ%NkvOx;„C
„^@id‡db‚
5„5‚',‚-UY+;:
l‚ƒog`gS?"-Zk…j'S
Dƒ&‚;Tbl4)Y?L‡Aƒp
       +H*!52/Qx,*„}9>‚
‚ .Hx%'\„&H2‚k?h   5‚Gg?%dd
4dƒ‚‚a‚!$"x(, 4h$„%Zemv     wn:„`‚=
&]XNkBn"$,9M
!a
2r
‚>$j(SN„L&ZwE'O
 L&5SjZ&‚! &‚J‚@ 
‚v‚3ƒ_$W@ƒa‚t-/)   ".{
acNJ2T*FHI@$…gC@gx‚t‚A‚$S        +[=8\I|z{!‚6`A5!„._
ƒ&  d‚82g
""ŸV˜€€€€C¿0šÒi!ƒ"}X31O_P„$Xj7F,IJ\rMy #uq$Z(\0‚acG…    ‚m     kMxdˆ‚$p`eIk‚OJ}‚#   '0c…
`;
3
YX  }"ƒssƒ      jH‚;'2V‚WN‚'V=$$&PEA+eu9"       +92=DM1K„ns‚8,{@Z&<ZLe&<‚>        7C‚N"
v"KM`‚j9
bdx$qg‚‚EU c)
v‚      WjNyf‚5Gxbb‚C‡*(+
RS!l‚ (p&<MQ:}V2Bƒ
(!>W9‚‚O       U‚2b#,{v[‚MV>v]1|8&&PD4">‚2:P‚5FX1‚:~‚Rƒl‚„}„)Z/%‚‚N`‚&‚*‚5($e::‚/*0qL"A3‚,…:&+jJ08]+>%
&$
*:a'7"M‚1x'E„9E8*Jm((%&&"ka
A
H8‚‚
o&    ƒv‚h‚<‚brgX9z+3E><‚#4[‚?e<cK"Sa;1GEm`8*,.‚'Y‚,-      „!     j&mC#aƒj>d8;ƒ&
%‚k)‚FR&L/‚x&(Uh„Og6<ƒRH‚Ya0

B2ƒjnƒB6‚UUG<E5‚RƒZƒ‚Q…c&/ƒg††zU5*/15ƒp†'q        ƒ   ƒYd
Bf7‚7‚{":,‚X%S*8
"a2?,B?‚7

        ‚\1p8!oh2bI-61Q      8S
z‚x)06„!…ve‚i‚„%†*ŽI@.=              ter<‚o%A<;mˆ…7‚(ƒ q{b‚98
am.
,?‰I<#)u$H24<J) ƒ&‚‚/u‚Wf9    ?F‚
]2
&}#‚;9‚t+@?CL'gno$!,@ƒQ<r1ƒD.- 7‚>aa‚5ƒƒY%ƒ       
      Lr     $ƒ1ƒ!fD‚   ‚%‚&Z(gBƒut.1N=8   g?     :…b<oH!<n%i*4waC‚LT
[79SƒI2S~‚ZF6 Eduau; !#
=&m?‚j+3L"q:ˆIˆ/!.ƒz9)‡\‡`C…!
ƒ
6…B3‡|‚9
‘MPƒ++‚
^X‹(ƒsƒka‹(‚bXŠ En›c‚o’•{u‚     
"ƒ6;$:A
&r!‚?‚!U‚91**Iƒ%?(=$‚)‚`zp…1(…
ClWƒ‚Iƒt„I‚Qki1ŠJ„k-
=

51*
?4!/cu‚X
…^2GV"&‚Rƒ3'$_A&!BM
,!uTƒ6ƒ:`       X$'2K2‚O:‚?-ƒVgI(%A5FVƒ+…‚j(
GI)r$9)'N(‚U6-ƒpz,TG.‚^J#ab#M:‚;nE.:‚&S‚#
‚w‚{Z.w1}!;`E=S>j
…a
T1$‚v2z‚FD7„|E3R
…A+3C[Aƒ4
?#$%^"F|(Kƒ\„>clsa/37:z?<%j]:zGF„9ƒ4T‚@ƒ0Ih„
\bGSZjƒ*S/sƒ'Qh]ƒTlƒ`tj‚jAh
5H      ƒ31g   ƒ/VN^

6lL)
L-     !"(W
…
pnY_>i"<Rx
%[‚i\‚9k#       *„s"&1%
$
[IŽös(QD       Z1

/H‚]!X
-R‚
~        
C/.U#UH‡Z
h%a‚UdC"‚\
>m*5!G&‡_I8S        s%3‡g
ƒ&2x"9
uL‡.
4dIS
        J
W8‚'cEN<<VHw
A‚Wh+k

.'/SMf!4F%0E Dk8>/ -!
A:‚‡U<L
V_D)%A tV
N q"$.(H
]
u7+ !bD#?%‚h^YYp0  C>l4R^(T
%>
&c      $E$
%‚P‚q‚XS;56‚Q
;ƒX"y…2O‚'Ag0o
\
<L/(O<qB g‚u7U5kyj'7+[Nr‡mk    ?‚kY-„]7$
?@C7x‡s}
4L,"^
r
S
‰$‚$$‚!+3Mƒe‚8Y.…     ‚?‚%"      x
Y}„.‡/ƒƒ$+…S%"      ‚LW?R„p‚rŠ‚K
„K%ƒ-‚?3 ?F ?‚‚…^ƒBY
‚_i!G


0/ ‚5+42‡Y  
u 
‡e
i
79U
A$>    ƒA[&      
}72ƒsYƒ#b1$*
-2bv&@‚Z/[$ƒVyƒT]!P7Y3{L]‚#       KF
M+/^ƒP‚97I:($*d8q‚!&O%„<(I$7Jv"  _V+9_)cT1a5G‚1]
* „C† ‚+N‡>8
J6
;(MV6S
4‡Yr8l}        ‚—4     /Rz®o¬‚;‡f
7
g 
‚

H
'Cxl9l;e;
@Bu'
*w=‡f;92Dvk )53)n
"+
W
!!ŸW˜€€€€D¿2ÓôE`$‡^„Rl~‚<2!B{ƒh6‚]‚F$„Pa%4‚-ƒ]FH^ƒx2578 
N+dCH(bB…e
74^ [>9ƒ‚)
„zAC@Ilƒ*G&       


%2,0>771"4e@
C‚bU0%$2               
6       ~d;=;0-'7
AZ_29
Kƒ%:
#2I'


Woe        z%       /;1
;#-‡Dmb‡fG+T]7$‚v; 
)*,0ˆv‡c6
#‡g)|/(@‡dw‡e:"i"%
D!
Ÿ
M!Q        §
M      ^H(
M‡h
C3¶D'  ‡g—+J-

vw/‡‚
r 0‡f
zm    w
‡d0RUcS
\i—26_%KPt
G\WJ
-*
 {z#]i;vƒ|Ÿ^
^‡f"5‚M,PUY+?
l.OgNg2?"-‡Xi„     j'S
D2
w;
!%Q4
)n
       H*!5
)/'A|*
„9>'‚

.=x%'
ƒ+H
:?h
O     CGg
&žr‡g*       4ho
S%K",M
!

‡e
I

$($N5
D&Z‡W'(j¶&
. K
&*
 
G*&
@\"#t-/)   ".K

cN6‡URx
 F;I@$‚+agC@|‡_
‚tAH  $S      [=8\I|z!N A5!„._
O^     dI=$
%Pl
A!      9DM1‡TcUI@,{IF
$V       ‚)J`"‚(

=S!l‚(&<M
9:

V‡\U(!>
@!‚O       Uotv:V>5]1|8&‡f
gD,">6:‚5—4J‚‚C/%‚[{``*‚5($e:
'*0qL‡3‚,…:&+0J08.+>%
&$
*a7"M‚
1x'E„9E#*Jm((%&"kaJ‚
o&    {‚<‡_p?X95+3
>‚#4(‚?e<cK"Sa;1E m`8*,.
$Ym-    
‚4    D[
0C#BƒY
$d8ƒ&
_
FR‡N
J/
&
h„Og^<
ƒ H
6r0
|\2knƒB‚UUG<E52ƒZƒ6
4&/
gRD5*/‡/5u‡fn
JO!      
/YM
B7a;‡=
%,KS=
8
"K
       ,B?‚7

        X&    /p8!oh2KI-61Q‡          
S
@>)!Her<‚oA
K;m&(
q"b2
CmA,
$Z<u$H2<J) N'|7:3f9   ?:>I*
&8#
9"$L+@?žW($g‡h9t.*N=8  2? :…b<
8?!‡b
l%84
5S
C9

9‡]MWI2S~F—5$!‚j+3:
&
!‚?‡0UN‡RI?=$‚i$`‡b
(
_
ClW
‚IkikƒK$&
=

'$*
5$!/c‚X
$^_
"‚R,
']—
K
,oRƒ6ƒ&  X$'2‡J2
‚?:‚-gI( %
AFV
‚J 'j(
GI)
J$
9)'&(R&6-ƒpz
      ‡R.‡i5!#ab#M
%4":=

/
X.Z.w1}!;`E=S>j
…a
T'$‚v2/‚FD"%@3t
ƒT+3%CvA‚'
r#$
|^"t|(Kƒ"cls/3R7

@C?<‚"
!!ŸW˜€€€€E¿2³+˜IJ\&/DT,Q`  l_

5    )1
    
$VN‡IbtNlLJ
L-     O
„
p—7i#    0arbitr‚ƒÎ ari†Mƒ,…$–      T=†v†%ƒ~‚
„.
‰1.RJ„(
ƒ>„ŒYƒBŽ2†%Î¥^

5ŒŠ±$&?„?0‚,‰q
…P1
…Qƒ2E.Žk‚?‹t   "]”-ƒ#…7˜coƒ3‡#À>“Q"‚m{1"_f%ˆK…2šSŠ|‡$

LÆC…_„t‚G=Ö5‚¦«     &›‚ƒ$7•/¡I„`
p<¥‚S—ƒ>    TŸ)¿i¥^üHŸ†\Ÿ!&?;0PWœq—X¾ƒ§TƒvÆ ¾JAƒ    J\oƒ3„b{1"_f%‚-2c3q¶E2§:¦8Æ@‡ƒ®_G‚ƒ$7aƒwÝ:
li}
‚)>‚#
Šb{‡zÚ
{‚¨*c‚¤QK‰I;‚cI‘ˆw
„Éde;‚*an‚d>;‚!‘ˆcosin%
fhĥG
…—ãn.§baic‚bitect‚,f>‚6
%!3‚[xmj
ur‚
„3³+t‚<Žzì/‰LOðf…
‘ˆ‚-ƒëj¾X‚Èd Xv’8‚@
HYt
+"$      *
%.
                     

Qo    "ˆ;       BGƒ.…'0M0,jˆ?ˆOF&P=e.,(61‚P2#T8$„
†t,ƒC0h&
?
(@UM+r[


%Ž;    @(*…:”wA 'U,'%       LˆO#
       <.1.N     
1&a'Œe‚I‚b‚ ‚\ƒ<ø—_§XÝ_
H2
+"$       *0"
%.
                       
      Qo     "‚¡
jÖ®lM¤
?v
      (@UM+r 



%\¾B
Æ%*uc       'U,'%        *.#
       <.1.N1"&"      a
:‚aôo\ƒ<e10‚‡E‘þ2ƒ
¾g—Ì@sin%
wtang%‚ea›x
 }=šWŠŒV%.O4'…9†A£‡Z£-x 2pŽ÷HŒ&=‚þ‚Õv
%"¾,O'œ3ýÕl!õ,ˆJ-x 2pn‚†.ÇYg~Ðy
ˆ'¥*
 ·S…w2†7^‰K
Ãy†A…½‚n7¾
‚Œfr†Ãa„8
81~
¼jƒ/½f
†»tO 2~
¼ƒ½f
†»tPc‚!;‡iK
ƒ7T2 $6‹[)ƒ‰ GUƒ2LF4K"…A7ÜcøSƒÌt)KB
4‚Ït„B)
      ULF4K"ount—kment‚†”Õju‚…>‰      —|
‡3‡/¬&ì'\ƒ-ƒ3„Ñ‚pabl&‚–ˆl•Ú‡2mentz    ,C:G8
}‚X    U&J05‚                   
       XW.4]ƒN<5]“Z‘4ƒ"M‚C98ƒ‚vA£!ƒ)
               )„3
/p[w   6ƒW

        

#;)f
      
(
S[m
{EWG8 E8S;10r`
                
&H„C(:&     $

      .3
4
.P

J0‚Q![&%=:7lS$Zƒ>I$
:1;:k#:+ƒ‚C*ƒ6‚#J?'
0y…"D>Ss}0:Js>?N\5%(<mu;   )

(;
+9
-/
*5i:‚[ƒn‚]z„>@
dWlS*`ƒG
ƒ-
‚^aN8
p&
›H
T0‚:UƒB…
T‚hIV
WQ;Jƒ9
.3
#B@6FDƒ'5
+
Qs~D‹o.‚z_E„r+‚5&ƒ/K„8)‚ >dmWty     r6 Fa  
[&        „
ƒc>)
%"…hS'XM„?`ŽT†‚L

?‚K
Š
j–^I‡+„#+‘‘S‰f    ‚Dd+=ŽmƒYŒ*‰[‰6ˆh†:1‚
Šd‚y”E…pw9…,
Œ/‹£dZ‚8?J/‚      ˜E‡o9‚‚.
.:E
`>-A‚T8i‚      
?"
:‚4      "
7
"H‚J,4ŠF‰ :…"99*†D+p(!
E 
""ŸV˜€€€€F¿0ÅY‚Š^"ŠT†^ƒœ
!
*©EŸ\':Š8…z*‚
't4‡L:,*diƒqG‚MG%1‚-n*Oƒ1ˆQRƒ*‚4‚rx‚F1D\^K‚oƒ(F2*#6,@$\#<‚E†b2‡^
…\bx‰>v ‰P&    
†$&[@


$-H
„9>L>]
'aDVO
‚A
{Bƒ‚e-oG‚v?„a;‚u$†i‘bx6S}F‚*š'v‡R0‡„,‚S$‚ =„!>¬[ˆZTƒ"ŒmhS„pq/.k‹Hm=h
 ‚"ˆt  %+^‚8 $
ƒ,U…‚•H…kŽM
7n !      ‡iŠ2‚N\         
326
^›@ƒ%
;PsGƒ(    u!ˆƒI†¢‘_ø^
M5‚
D„P#<*$/'*Y%tƒg"ƒ‚q†# A
"Hu@‚WQ%h‚B‚@,
8!C        ‚v|!‚ym#S97f?…Yƒ[„%
¢UhÒ/
        
ƒy‚[3/!a‚nA)SŽþHG
R0§.‡b‚v_E
+&\
(K‚G8)),DdmWfy       (Z6 Fa      
[&        ƒQ>)
%"„wS'XM4?`‡„r„*

?6
‡Pj‚I‡+„#+‘‘S‰f  ‚Dd+=ŽmƒYŒ*‰[QmF#1%†‚      L#w9K
/(„:Z‚8J/<      ‚‡o9‚‡@\

.:E

      >-
Y8

?"
        "
X

H‚J,í‚w‡ƒh…=ƒ†/
!
*V:iyM
'‡g[P‡:*MÆ
,í/
‡Y


$-
‡]®nI 
'aD"O
uÕ@S%-AJE{
-‡i#¾9i    ‚
6S}‡bFb‡gƒ vU0¾@—3‚^$®n
7=6A‡
‡QA"ghS…/.    =m=hÍR
&5 %+H‚8 $
"Uƒ
7M#
7n
H!D
G#žV
H‡i$I†¶Z
‡Y5‡d‡h
("<*$/'*>%t‡`%a#      A
Hu@‚W%h",
8OC   vylym#S

‚n
CŸ
3hf
        *#[3$—70
!a0argv‚\V;p2;‡Iƒ5    k  $r‹^(„x,5!ˆ}„2H‹;Uƒ2&.
7G
  
  

…CoL    Ücømp2ƒÌtID6  ‚Ït„E(x,5!2
ƒ
UF     &.
7G
     
  

index,
‚H8C‚GLŸ5=yLŠH•ù+ƒ=yP‚"is‚°l#„
œc‡T’D†‚-
–)†¡L
”U‚Ål—ˆKŒ)–8T,       †\|==‡
‰jœJÜœŸ†.»}âM+‚™„5Ÿ   ‚^5ŸÆý®;=‡‚Y®‚tthmet$ƒ\9‰tÊo‰x†R‘·$      †•"3Ÿm‚¥>Œ;,•H
•Œq‚×b
/
v7ƒ‹9—ãoRos‚¦—  •Ò(—+‚‘ und‚#„TŒ+a7’O©,oƒy…uŠ      „8        l†lB ‚PP‘:‰i¡A
{f‹v…(ƒ
ˆsˆA
Œt‰B“:ªCŽi›‡WŽD
r
…<`?……&ˆe†#
‚Jd͇6‹o‚?jƒc$‡7ƒC‡*“
¬H‹‹t‡xš‡+lVR W—ošB”=‹K‹\ª¢K„]ž6ŒP†`‚T
Ž*‚„2†X”y‰e/
@+ƒŽ÷®nSg‡rQ‡W
wf§
Svnu?ÝŸ‚V‘‚vR        ƒDƒåx‡f<)üƒ%§¯¾ k‡-‡g'¶[Æ*#Æ$
‚iR‡…‡!¶†—2NB!RD®‚å
>®‚

@
6rai'
‚/"        8M"
ƒHE9j…
-ƒ\i' O
[y…$…O0X,
=IÓzŠk˜p*¦!»H]a]–fL.¹J<>)‚ƒ\-Î ~~‚W$    ƒ        &.|„
ƒ    ‚lP`MhB    %
?:v-5Œo›6@…4
…{O
Ž0(X
šS27&‡JÚ-Š:7%‡/*‘
i#’~‚!†k…U:Š3EI.‚o…zŽI)ˆ_
$$+‘tC~C(,…Y
""ŸV˜€€€€G¿0‘w„OŒ1Û
#ƒŠ‡K.˜
OG!‰‚lY†^†‹_#a.=
c-N)½‚sKžx*‘S»H]a]–fLŸ%$?J<>)‚ƒ\-Œq‡A
=$  r       R.:|
‚$;     5P(hB    %
:v„pU>‚%Oü{/
~¾<Y27&†A”*ksC%RNi#$‚!
‚l/:
.Ÿ$—C‚.‚o»77e^O
OG!ˆD‚lY†^P¦!
.'
c- Ÿ)0arrangSƒ5¬G‡Œ
£:-&ˆŽpß•[¦‡w½T      …˜…Wœ VŒ{Qt¾Cw¯‹Xyindex‚ƒs „V
. iv‚„;³h(
/,‘‰$#ow‚ŠS•Òosen‚‚+t–'P+{
ˆfr'ƒwšWw§h‘˜q‚°U‚‰W»qíHŸ‚*icly/:.Ub2`
#+“„
A……6J‡~‚3
‚+–TR
M„k
?Žc
ˆb;‘S@;     1
/b1‚‰        oSg"‘–#-#.¶QyO0P_õ+—V®6âF¶Y.‡g        3

³X+OP‡h*‚]Ÿ=ƒ0‡c
‡(;„|œ/
/ÝIS
R",fact‚ƒfˆ
qEjBs(”ŸF”8qEjBsst‚dV2+("!I5&<
-1#'‰m65‚z U „V(?jQ53•Ú>D2+("!I5&<
-1#'…65S‚J U &ƒ\(?jQ53id‚dPW8kUg#(Š;)„##T„_#E
jA•Ú>8kUg#(…?)‚K#T ƒJ#E
jAnam‚d2[ƒ‚J6)>‹y„#…vhmQ>•Ú>!ƒ‚J6)>‡‚OƒahmQ>work‚…Ks
bI3$:i##6g&ZIq
4Y3ƒ
$‚->!HU
a
4
Y(`!‚kP‚ry‚(&„H(     Wkx…WZ|/
2V‚OI)'.‚m       S`‚j/wFs‚ %D.+)|4 N‚#‚5Eƒ      $.Q3s‚a8„JV`q5.‚l;k#      
TKMGpC4n‚7_(r
R2‚iƒ+\B.
;V‚U$2@N}K6YƒW8nM 
>C=S!Kxd[‚]ƒxl2Z R{\‚0*S?    1‚$$‚N
QZ=!"‚d
3
RN„8(2>ƒ"F‚‚)…;+U+(Hts>1             D['‚rƒ74T]vJ'4(/(SƒgSa0Xƒ)  
‚[=f8
sX„G
„=t,"T

';")'o1?.Y
T#
E‚C)N-
:7
&
",          y{A
~l
E
3‡n&;]|7@P1Z&As69Jp
sE
Z‚   o=T„GCG[x8288
@„am„e
@K}ƒ
_.Z,+4P
T%-N)ƒR     P
c#
‚g
88K
ƒs-be1#8560{E‚"‚2sƒ{= 
$ƒ$,?‚sƒ%‚:„‚E…`iVX*\~&,%0udU?3b.K‚+J†~   039‚x
(%>
U{T{‚Kƒdsx%
2&;4 
‚6;|/$ˆfƒ`c^2
„5‚OaKD 
~#KH?‚/pgl% <oƒ ƒ]2
‚$
‚/8‚mƒ`nr)wlƒB@„f+ƒ<A$H‚4‚oOƒ‚q‚%$"tx/\‚m„z%5(0?lQƒ‚!S
($8‚)‚`ƒ'†N$‚{Uƒ:cW + fkE(a
‚T=‚‚!‚    ‚^}^'$
A      
‚*0Dƒ(*_U‚**-*‚M\
*]ts13
61,
uaƒ^K8xd(HS
Z]@OX‚-C#c$ƒ]P‚Ca7,j2
HMUx%ƒ>{V‚#‚‚V.6(1
49-YWƒ0‚.k%N9Xi9b2#6i‚ryFj 8[
@Lz=/'<E(*0Qr‡9'X‚Yƒ‚ƒ‚*BT‚iyHuF?!8!<_$D0t"A
„*0
+t‚+9QbbVB‚j
<W5aIC3-(rOb
,D%?$~`„t,@ƒ)ƒ‚‚'tZƒtƒdŠ{ƒg‚ B‚vP‚Z„…6‚0‚fƒK…J„„aH„Xƒ:ƒ6
„‚/*>ffGƒVƒ%‚g‚%fZ‚O%
YDHD‚ ƒ
4s‚          *„     ƒ>;t.‚‚LPd3<‚o
O8+>‚\
!‚eEu>T7E‚&tƒlP 1?Y)#<'}Ym9D
6r‚^Q6w-`8‚w%gERH‚"/$z]5Rƒ‚V=ƒE)ƒ+:‚4V-*  ‚b‚A2e
R~d)0ƒ?    Yƒv‚E
x‚3…Hb)kB?C  aƒVuƒ4fI

""ŸV˜€€€€H¿0CÒ
ZL'$0c*
/7!O
‚wƒ$)r‚     "‚;.ƒ
Tƒ1p2…*‚Aƒ1‚lVwGI)O;,*„~6‚M&h
r„eW%xn†iQj$‚DƒP‚/,…s*Sb$‚9DV[ƒ=o0]L‚-l"%‚=L )S…]‚3g3‚7‚C_iJq.‚r‚k_‚1Z‚!‚MA‚kKHxu2
-T3`ƒ~M $"‚‚?‚`       ?      0>
S.
ƒ}=‚L|GOsdB
x-‚),4llL1;'‚_ 1&lƒƒU==ƒS>sD…~ƒ(/ƒI…)WƒF OrM}„:ˆ/ƒƒB4ƒo3„*h‚E5…}%iKib2`ˆ„f„GXfV$„O‚(?ƒfy‚Ck„O aƒ2S„*M
‚dn2ƒf‚N(R?‚IbƒA…1)V9ƒ q~80%+M‚^‚[,&$(gJ$1
)
i
'?B)„K‚/[…]*,Bƒ[‡    ‚FlBs--9ZF~k‚‚WA6PS\AKT"W…bƒƒsbfU1J ‡K:ƒ2V0‚U"*xƒ[F1D\‚iG+mV_1yQ@$2S<e‚:&      L.‚jI‚$FI‚}f8F'wm5IKkA@]‚_X)>C&O]mF>&U0<gIk)C[
Z„BgvQƒh`‚…>1+V3rl‚ƒ…(„%%@MU(MJ*p'cJ*p'
‚‚n‚2
1
$ƒyN0Cj‚q&DL‚T%%39T(OzDV    ƒ4H-QQ
&…[
&    }E%k0
7+&"tL4‚a
"‚*%ƒ%…g‚0Ve"[N"bZSHg‚M8‡:‚1x[„}^…ƒO‚X‚<d„(„}&f5*
BODP1\‚7ejFƒodJk‚‚#ddJD8j‚\U
&@ƒw‚†]…_ƒJkƒ]ƒ4A‚dB0ƒ!]…)&<‚fƒqƒa‚V‚5„mva‚s‚ :  )SPo~~‚    ƒN"‚T]]$l.-
‚3kƒu
:+h‚&4"]2L-=>5J*nV./cS‚",MP1C‚1 $pn0<ƒ‚$xG$:ƒq\?ƒMmm@cA8<f5‚~d{9G
Ofƒw„\‚Z"<7&†>V']‚/9‚O(0g:Y‚~E$9@P‚*ƒWIYM&_t-KN_2‚T…,'.‚ B"  V'
‚K+,Jj Kr*D^i‚[$eiƒ]‚0g*‚.ƒQ…l-‚[l‚T6'ˆU$‡yƒy{j„&'†6N<)Po.‚"Šn†Q‚?,3Œ_Z8rUh ! „;
ƒw1%"…dxPf‚ƒ†y"MsG!‚‚„8Y:Fƒ4M‡‚!‚t4„g>„‚R%‚
‚=(8a-=*„a‚h;Om@P6ƒ'(2…)TG_‚`~
f‚+\‚A3‚ƒC$%<aCp&/_     ‚*@6%2#u„A‚&  …2‚w‚Y~‚-
"Ov~M)T„z9se({ƒJ5„:OH(Ih,‚ƒ*‚0
n‚I‡i%ycr‡UGrTC:4`>Io„;‚)a5…_…w)$!'KX1N‚8‚ƒ‚Q8q…‚3„I5I‚T/QL‚"‚a*ƒOp0+1f$2„KX)‚FK`NQ^1/-n{M†<<u   Q>:5"`7‚-mu`7}…**Z)‚='vJ
5‚;L‚b4†ˆ>@6)„s‚2‚<l      0 -0S   Nsp_
4FS!,eƒJ,&#AdMA†H2@h„P‚N…EJT(a683,
,\Dp8‚#Z4@„8        P#a)‚B(h$$5‚OF2@#+aI,ƒ37+iS<MjNa
ƒ`    L,K
tWA‚G.‚N3ƒm$‡L‚M^:L„-S1"p`‚A…t|‡x‡4‚Gƒj9‚ƒFi„KthlMDW„%x9g‚*N‚#   %jX        ƒ("`ƒDc†>*‚G~AviYC8ƒV‚ƒ Ij‚92GfWV<-fgqq>‚:G|6}„TC‚/        (pf)uQ‚5~‚./A†R9VH   >&2L‚@|A‚&O‚70.]ƒ+&‚u†0†b‚u„r…Ocƒ…``ƒJƒ-“'`G™uŽ/›‚;–X5-%tI<]Ž~#&‚Vw      RACƒW4ƒxƒ-/!4‚m&e%S ~       d(pƒ!l`‚  ~#‚1Z      t!
ƒ`HB‚KhEzgs hXx‚
&yo_0od2DfUTF‚Q"MHQ'&‚3@BA‚$BMkMI„~a"?mƒw
DqW+‚8‚%.4„tIƒ
H4„;QLM:~=/†E%Cƒ<L‚]‚jD‚-‚[`‚T`W\%‚>i-;‚<‚lƒvuhE
}†     ‚^OUƒ!,J&‚ƒZ…$…)‡I‚z„3@!C ƒ;‚XC‚4ƒ‚4]‚Su‚‚B2ƒh‚7./‚H‚,q‚L
!6u,/ƒG‚vOW$‚,(Bj(‚F''6a-‚"T„W‚‚q‡i Q3‚5
,…[ƒ|‚e`
Lƒ38ƒ&‚<K‚dY[2
<vj9(O?ƒyX   
,>9‚clyŽös# <oW"&2
‚$
-@H‚5` rwl‡    +<A$H‚4XO‚‡_4$"t‡g
v/\p
‚‡e#
(AJ
zT=

G‚    wI

}?'$"  
&T‚*0:*_A>*-*q\
*ts
13
6Z,Ba‡V"G8xd(HS
Z
@O*
""ŸV˜€€€€I¿0  ÒC#ÀX$<P*7       j2
HM#
+%>F,
@‚y.6n1m
$9-Y1
7‚.%g
OX0(b2#A)
dy#j 8[
@"z=/'<E(*0r†E'X‚Yk‚^9BT
yFH4BF?!8!<_$D0t"A
`*

+F9Qb‡)RB@
WaIC3-(rO5
,D%
$
`ƒD‡_~t.Rq‚Bz‰IbƒQ‚        B‚vP‚Z„…6‚0‚fƒK…J„„aH„Xƒ:ƒ6
„‚/*>ffGƒVƒ%‚g‚%fZ‚O%
YDHD‚ ƒ
4s‚          *„     ƒ>;J      
a/a%
!
;Ei‡Z7EZ‡F s?P)#<}Ym9D
'6r"-Q6w-`83%gEHw/$
4z5Rƒ^=ƒE)ƒ+:‚4V*   ‚E‚A7e
r~2d)0ƒ?        Y;O
>‚MbBkB?C      a
ZL'$0c*
/}!O
 Q)r‚        "‚;
#ƒ
!
1+2…*‚Aƒ1‡?

p
)O;,OB-6z&
=
W%n‡UQ7—5I*‚-l®o
¬‡f1‚| $UG`&    ?      0>
E       D-
j,‡jYL1'0     1&l

+==‡‚n&…sD…~ƒ(/ƒI„EW$‚# OrM}„:ˆ/ƒ"!ƒo3„*h‚E5J%}Ki2
,$
7XSV$
p
J(y‚d' aES1‡Kn‡P(R   bƒA…1‡c'wV‡g8
(‚4‡fX8‡ M^

,&
(Y

3$1Ÿ#--9§$"     L."IF>‡ef8F'L¶O$‚‡h^
1—

>%%9‡b(Oz
@‡I       bg‡dF&Q
&
&    EE—2,6),K
%‚e
VeŸ[5*
BADP1‡g
*7e]!dJ
H‚
>
=d&J{.
%Y
‡$@‚w‚&$2Jkr$9B'l
ƒ0&ILz‚
‚5
dv
G‚ Gžq["‡gl.-
#e
:+/%
$ n‡d:R`&L
|"‡X
-m‡fPm®p
        G
 8
B3
?‚Z
""
      &ƒE0']‚/RP
@(‡V
:‚E$
1@Pl*‚IM‡_ZtKN_ 2
wT‚x,' ‚ 5J" V'
‚K+,Jj 
=r*%^i‚pJ`; !
]1%‡u=PKHXG!xR'Y#.‚=(
-*[2^;OmP6
r‡^XTGf‚$~U3N‚)‡e
 <ZCC&/_     07—~
"O
~h)
+j9s*"({ƒJ5
:H(I‡+‚ƒ*‚0

!
;$
i%:cr‚BGr
zC:IN>Io?G)"a5
~‡^]‚-$!'4X1N‚ƒ
<8q‚3„^5I‚?Q+lT*ƒOa0+f$2
7)
+j`‡O
O^
m1//-#/M
m<"/u     Q>:5"`$c:m8`7=…**)‚='v4
5‚;L?~6„1>@:)HJ‡'        ‡ O08S  
@Kk 
$M
}v,‚‡g
^
A0A\2@hz‚N‚EJST‡Y683"
,.Dd3
#+8S<M8NUH&,K
tWAq.'‚$‚V
2      -^X:/
YSWS`^$|P("‚+7
""ŸV˜€€€€J¿0»–Úc
.K &"hMD+žV$W7‡f+f
UqX>pGj6}„T^     ‡bn
))&Q$/
‡_)A„nVH   >&2p—6‚7S†w‡ AT‡‚FL/-/!4
{&XS ~       d!‡`Al`m~#
J        l!
ƒ`(B‚ hEgs 4xuto0o
82Af-F‚Q"Hc'&@
=B8kMI
1a"4/
‚8
}&—
g.
„aI‚oH4:Q
M:‡au=/R%C
2
!‚SE9_--Z`
DT\%i-;‚<‚-
h!E
\@.
;
2,J& wƒZ…$…)‚@3Z!C 1C‚4PB]‚SQph2,‚7./D‚
q1
h 
!6-
‚vG
7O
$‚Bj(X(d     3‚ @
,
O`‡H+M!K‚"NW22
<vj—7
*0asc‚\+ƒ\
”LœK)©
Ï&Ÿ*‰+½O¾;
‚K&„é‚=” ƒiend„OœcŒBµÏDº        ƒ=¬x
h„CŽö{Æ6¾‚|†$ƒÔ2„ªƒ.¶ƒ(rtain‚‰%~4Œr…^…M–&P+
Œk;z^!ŠM-Š[‘H
O6Š†Y…V„„5"òV„{3Œ
‡„Nd`
ˆR“–L'c

…Žh“ jy•
]7¦i
½:v‚Z…ŽþiI-1[¶J‡[
HpFx"¾Ox„{ÕY-‡q—k‡m¤‚þN¶Z{håK¶p¾F
y]7H®f
3lia‚&?…ldƒp.ÍO¤”
‹
‚T”[ºE
‚J‰QŒX³GµC
¶†Ã‚Q§&ÍÕ~>kn%
[h%
ekQ‚T¶1…;„Y
™Z!Oˆ:7ƒUE‰‘ìœ&.
‚À3
!œ(=õv‡‚_§
*Uí2*”ApectO5UÛ"¨b‚w„Z ƒ!½QŸÆTœ…tƒûe¾?iËýÆ‚!sembl
‰X„xy‡d#ƒ!‰>”,ƒrƒg‘ˆL94
‚‘.gò`ò
<,rt
r9 Sn…      "•1¸š%ƒ8„AŠpl
£›7½"<Žn„Y‹ ‹



‚O,„‡^‡l‰`m
¥Ig¢       Z 

ATP"#W; 
y)*+*/H‰
ƒ;g‚ ¥+–T‚8Æ+ c¸š%ƒ8„AŠplŸŒVüY
D
"+G3       d        
|     



+e‚‘O,»E
‚1gÎ 

A*TP"#N; 
)*+*/H‡"‚°[E®
o+ss‚It‚~ign
5
‡x„MŒ‘‰(„!‚7‡0Y
%       =(¨~†„0'“[QaUB•h†>–P‚Lb&‰‡[
²
t)B"‹ MRÓb½Lp
^„EJ#‚„W‚(ˆi„K:‡E‹<’'…d†ˆKƒ‰y‚3¥&‚v”?ƒ
&„lJ‰Š˜,…r˜cƒTŽ‚r
Áh8›”h
{Mƒhµ/*'
LaU‡aL+
*Lb&J
q
‚<I)B¾+ MRˆ,‡
Lp
^(;Î1—90‡†4‚×®‚yi‚,ƒ
&„lõ‚bŸ‚Ý]L 
'žf—:¾c8ŸZTP¶Ey+mil‚#”õ!st      ƒ”¥4×}ŒR   
Å
øˆ„ÙRJ…,®6QÆA
oci2V.‚"aIƒ
ŠL‚{“–†4\B{jE”‚Q


"*#   †O'T
6--
)\‚+‹„q:
%ƒa8
+‚v‚‚r
KT
‚i”F„
k…J‚0‡@œ:NJ¥G+«G!+Z+BZ†Gz‚"‚v‚&B…RtŠi"‰žX‚d‰y£+œ!*¨-~Z„0¹N‚0FŠ,a‰…%‡k†.2‡´
‡K™
§J†/ŒRƒ§;‹u†I        ‘"ŒL©(Š…o @…„?„?Œ;'9„5†DŠdˆHetƒ4

#uqƒJ
„PS
!!ŸW˜€€€€K¿2Á‡:V‚”)¹Pˆ|”1…:‚I! ƒˆ•riƒo‰†›       ‚u‡lR…:&]‰‡iŠ##m‚E‰LDO‡8›3ˆ[‹¬N„$Ÿ~ƒLšAN„
‡d0aˆ"cÁW›%|‘n›V‡H‚`$‰vŠF†o…£P\…T”2A†6†„d†0Žöu
‚
il‡^SP‡…N<z     ‡i_
%!+Z+BZz‚"?T1&B…Rt
ažg;“
‚d‰y£+œ!ŸƒQLZ„0‚T‚0F
ta†fÕ²;§–,‚=ŒRƒbe;D‚¤®A‡§
‚H§
cˆ5¶9O‡.!„i
R
!&]‡cK¶S
ˆi#
G‚EOWDOD‡h[}‡ƒz
¶@‚,—+.]JNÍl2@‹z¶"z+E-"
m…  .\Ažzy—Eƒd0assort‚‡n‰sŽ4        ‘ýoum†8ƒL„_‚2…\1ƒ ‘?‚_ƒU       „AWE     ‚f‚?‚n      ‰x0…N‹]LšR‚,’Mˆ;Š
<‹KŠ%‰c†Rw›0‚b†”p‰|2šyÕ‚Wac‰9"+Š@š3ž<…[‡6·C†HŒ‰>œ „«v‚zƒiB…,‚”.‚=ªZŽR’ 
•}B„V…
sŠV^{5R!!l98ƒ{‹8“N‚l=‰'Œ…yŽ~…zƒu”<
’W,„£V™Z†T– ‰U$‹h†yŠ't‰Z”+†ŽŒ“      ˆUˆƒWt•|  “[¸iœo…R„
Óh0    ‚}ƒ4mMf#+ š*{††4Žö„‡‚*eMl—:—82     P=ƒ?#ƒ8‚b…4„        ƒˆG-Y†+Õ‚WacQKYƒ'W.‡6
m)xåW‡f „j&‚w3B‡gŒO/ÆXÕu45R!!l98‚N
*‚l

94¦\RÕ‚‡`v‚~‡a      „Z—eÕx
q$n…yƒ‡\:bX‡\‡lo[
@g¾‚GƒWÝg—Ÿ‚;{‚<‚J,Y_\pt„Zè†›w¼rŸl+&cQx1‚y{‚%¢\¡X¬r„a‹V
ƒB!‡+Œš&Ån‚\†‰G‚j‚IE‰"ÜÓBœ‚ÏcPx1‚y{‚%l›x
ÝZ
‚  ‰ƒ%‡,ŸÞ      
*Œ‡nM®Pr‚…    “t…1
Œ«lB•£=
„     ‚È‚6t‚nˆW –¨GU atƒ«Z—ë‚$eriskž=¾‚Dync‚‡(
_cond_sign‚‰wait‚‰     mutex_ent‚‰
leav‚‰sched_yield‚‰"hron‚@Œ$=+N
Î
…
/ŠhP:+[;=,!:,(q+%9!2$t
„
„-‚p‚1‚ƒ4…ƒC7ˆB‡q‚gˆ2ŒX…rƒ:˜~„‰#„K7ƒ„A
8‡|‰B‰l„)5‚f„B…Yˆ.‹d ‰&C=Kƒ‡…X52=L^2‚
V!       
O*„,
"
 Wyƒ`y‚3
U
(ƒs'


H„SF‚‚lJg
4ƒV   ‚ˆ9„N„HƒM‚~`~
„uYd{ƒF‚‰;†&"‚
0?][:*‡H†
x*+`
Q„ ƒ:*ƒ$‡S:9‹jF$…Sƒ‡Xs†t‹BšIˆ$„F‚|P‰_ƒƒS&rƒ_‡
P2
„b#‚‰mdƒu
‚>‚=„e‰¡KƒTƒ‰"…3…W‹
‡[]‚T
;.†J=…0ˆu‘;‚Vƒ†,{wP
D‚mƒ[ƒ‚E‹$;L‚Š`n‚3†C…,ƒƒQƒ-
„.‡]…"‚P:uG s…nƒf‚N‡%"x„]„„O„       ‚f‰x‰39‚<…-#‚\Q…\ƒ4:‰d ‹rM‚.W…Yy’ Ž7ƒR)‚ˆ’}8‡WTƒƒ3Gƒd„<‚4
il#%
4PDzq02HG‚,N‚B#|,1@)Gh0KUq‚ \;‚4G…u‚Q u¬u))o((*‡*‚]ƒDj„Wˆ@‚uqƒƒ5‚!…',‚v+KA5&BƒB_
9W
ƒ%Y‚Xw„/&$‚pƒ‚}ƒfa{OK‡:2…yLƒ~ˆfƒd&,-%\ƒf„SˆX‡ƒu‚ZJlzŠBQb4oM†
„A=(Dƒ„
Vd=!†ŽKb¢R“@ŒƒD@ˆY†B„]
Š&†a…/N‚(1N‚m-P'&Š]5HYHZC;‚,‚W…)[5‚      ƒ.‚f9ƒ‚3<‚+…]‚u…r;>E&"‚X<‚)5
&GŠ‚Aƒ,‚z…‰v/’Os†6ƒ-<ƒO9;    „(‚.a‘iR‚C
ƒ \X‚v
„kA†(ˆ_‚?

C
""ŸV˜€€€€L¿0AËjab0&'‚UŠc6‚.‚Yj‚3
ƒOi‡y‚y]+rc@j…„
$7.ƒW‚‚:!)?‰QYƒT†V}ŒZ‚u…]
ƒ5F‚ƒTƒkƒ …L‚
‚…$zˆnƒRQ4”i/„…HM†OPƒ‡œ$†oN†mˆ?‚Uƒz…bZŠl†"1†\#‡/J:„j‡SkOƒ1‚Jp$+‰X     8c‚3‚9†;M††NpU"]*wT†PS‚-„ˆd‚#dQ†DUƒ8:‡`EjBs&ƒ„b‚K‚w
‚X(…)‡7&ƒm„4‰-Š0‚^‰ƒ}OJ9ƒ…nŠ$1‚rT†H‡a2.…t‰N‰„Nƒ>„…!’Q‚-‡.‘bˆ/>‡‚‡,}{†„P
r…
|
N48„Z1„},‡A‚Z0‚%†vO    
‚,2$‡[„‚}`6„+‡y
^‚‰T`(k‚!†
P`E%L1„Ee‡{‚TS„gƒ!‚H‚„Q…U‚|]‚wˆ 
‚†dq‚‚7ƒ†L8‡=ƒ)ˆsƒo‡?TX‚‚ˆB!v‚_4‚jxsW„0T‚v‰N‰…†.„E:9?7k‡e
‚x…|M‚„‚’wU‚[„G“XC_‹>-}‹#ž0O( ‘C1;0
'¤\<ŽLJ
DQ
v†d1‚r`o†F
‘U:=Pˆu%%‡3j‚MŒ‹W„.‘  „!&
7‚Tj…:„b‚P)‚4(/ƒD
C‚k„„%ƒb
y‚?~‚8„u  ?[^}0GU‚jTR~-'wx&QM>bkC-
V%mH‚@U"]W+^‚„C$HXƒ
„…1
†cbw"‚\Št„-„rlˆTGTmN%†Nƒ}
„?g
…b‚^.†f[|K‡8ƒ.1‚XŠE_
ƒs
„)ƒE!
ƒ‚M„cŽövZS:%jF$‡‚‚B‡oŸ‚b,…,K&‡_
‚_d2X
]?
‚d

JE=V
ˆ4K
T4I…W
‡)?‡f$
"
(P
N=Qg‘;‚Vƒ†,{wP
D‚mƒ[ƒ‚E‹$;L‚Š`n‚3†C…,ƒƒQƒ-
„.‡]…Ls8n4"‚DƒA‚O‚fƒy‚^9t
f#^Q‚Sƒ4:
ƒ
 !
‚.
)W
xYƒU;)‡A%
P‡T_—7D.d„®mo¬))o((*‡kTK
k—xqv‚LF‡^
B
„C,6‚Z+KA5&BƒB_
9W
ƒ%Y"H„/&$*ƒ‚}ƒfa{OK‡:n…y‚p‚    %,-%\\
f0&6 ‡D@‡z‡d‡h‡g4A
‡iaÆ$`‡h¶U`7w‡i§Q‡fwP;—3A‚P
%‚AŸ.;    „‡Ca.Rh
C
/‡Yƒ Aja0c'6C#`

 23„ ;
Q]+
rc
!Fv
c$.:
5‚¦ƒR
"Ku.‡fYN ‡‚,‡p®ox\M4†R‡2/e
PM4—5
9‡VM     Pz    wT[
NJ;Q‡\

@5
ƒX‚REjBs‡f/—Ax&*
?
ˆ…‡$t‚%OJ98
B
‚91
     TKP2‡Mƒ)„N‚6ƒ>
‚6Z\‡^ƒt…A>†90w"…tƒ4pN-—91
…=A>0‚%ƒ9
,    ‡GwŸ(‚!/<`1C%8z|4       H
kTS‚#$‚HIƒ;Y=
9
~
ƒ¦‡0‡c!Y  =s(Ÿ‚mTp1‚r`‡‡‚:1‡_
:P.%%…3
‚M‚K
„!

7—Ch(
P‡d
G)S4(/
‚
/;!
\%ƒ$
A!jD„u   ?‡TY‡k40GUs0T-'D
&QM
k          -

vU"0MW+^‚„C$HXƒ
„
f

ƒ[b
\"
ƒNƒ>ZGTmN%7#S)Jg~/.1.
6_i‡K!‚*N0atan%
k2%
 uh%#hlon‚mofƒ…m!
‚
ƒ}‚1o
>23
–v†wfƒH       ˆB2¬{1&@*Šq¥s    •;ƒ#ƒnˆp
  ƒK
<!"
‚vj‚h‚A‚BŠTvK‚)†1ƒY„'‰E†49I…i#f{„%9„*o0
ƒ
A•†A&‚Dh‚wks>‰qŽ   ŽW®‚ˆ,™‡+v$‘IŽö|       3
Œ_>f
œ7


""ŸV˜€€€€M¿0Áb ûw‚R1&@*P)sôz*Ú]<!"
‚nj‚h1vK'WL 19Iƒ#    9*oÂ{Dh&ks>ŒP¯‚Ý“)åP@0attachk-E
I0ƒ]‚q 2a
„R
<A„y†R$›C†3
‚;…K
"28]MT;*NV/q
V       
‚Z„6"
&:
’/
<ŒU

Xƒh9¨s7„0ï\S ˆ‚7‚{¤=™Qžlªy‚g–.”¯¿x†l…b$
Žg        BŒ{»+>†0PFžy"ƒKM‚+6†]2D4>%3{„<‚<'*‚A'HZh4y
R‚0…£n‚ViP„q†):Œ8\ƒ,Ô>‡6        Š;„v1‚iƒ~3gD”T‡}‚Z‰j
†^!†      ‹`‚~'–d>ƒ@‚.Œz‡&!„eŽ7†\‚‚L‚      Ž}“§0
ƒV
„A(†iŽks5ˆ|£
!æ{~Žö7®sd‚0—aLS (e
HPo™Qžlªy‚gŸRv
dƒ$¦ƒDÕƒ_„í/
íF/¦gPÝh
5\‡ƒ'¶#;j1‡L
—3xŸ‡ g‚Z!9
c‡b'®|¦zƒ@‚.)    !
T@
‚J‚‚`
8.žY
hÕVns6_qJ®t¦^k~w
ƒ}c
˜q(‚„„:
¤e„0Ž:„-/*1;ƒJbUT?‰^“XŽL=Lƒ,F0}13Pziðz ƒ$m‚}?k‚0‰ƒ'øwƒ"
%
o/A1;CbUT|ˆ‚‘<=LŸw!3Pz!‚;mYk'Ú‚Oin‚…:empt4Œ>uˆUƒ^‡/,1†D‚E#"…]‡T[
ƒ
8…N7
j

z‚1k
Z/„q^‚U..n]„7ƒNoiP]ƒ4…uwg†lN™g„P'P/v†yŽsˆ‚o/
•s3ˆlŠF‰"•\‘b…U•¡tg›?‹†:„
„j„h.†W¦h`Uœz”Tx%F6Š\ŽPšP'! vpWu‡‚X“y‹5ˆf†r%‰ †!„<6†{,M‚%†U„‚R…‡v‹<…CŒ‡q›ƒcƒ†R#:«j‚'R‡ƒW‹\"‚Z(#$+:IŠ=‚1T•XƒƒC ‰.?b‚‚‚Q…Yƒ8‹<§*‡Hƒ(‚       ‚‘Žƒ< …b-‚/ƒ‚u‰ƒRŠ†jéi‡SŽV†YƒP‰ƒW‹9"ƒ*ƒI„:c‹ 
1†*ˆw‡55›A>‚^\>‚*‡bYˆƒ'’;†wŠ)T‚,,rƒ‹Œ&‡x
‚Rƒ"žQG’(ˆd‚H†…%ˆ?†v.‚]…e‚e ‚G+a(†nŽYˆ/{S
22ªfçA †jƒ†=‚‚$?$¯e†š3h4}…Bœ:ÐfŽi‚.T‡‰* 7…Jƒ\<‚ ?ƒ.ƒŽöƒ&P'Pei‡"X—ƒ\Ÿƒ9l      b‡b@  W‚        
ƒ3'‡$c
K‡c$O[˜o`Uœz”T9%Ru8MP'!pu‡
  †3ô5‡,‹}‚%†Uy‚R‚‡Š8…C==Ÿ!3Æ.+í/%Ke‡i
p‚§u1®mN       )%¦b+‚/;—=f¾)6‡e
Ÿ%ŸB,Ÿƒ'ŸpƒI
Wc„( I/‡„5
>L\>‚‡[Z
„bY‚P‚l†s…T‡Nw‡g*v§‚^Z&
*
‡\   Rm]
G„/"u„
¦N
'S‡g0®uvƒ†=‚‚$?$——‡+}ƒ>%d
f@ 
 7_—‚AO‚  ?nd‚$t„I†Ó~Œf”II‚5–&ŽÎ—žzŽTK‡@¨@
QS–bå‚œSŸa‚‘8CŒ[%ÆÕ‚=”7st‚›Kribut§*
{        `‚f*_‰8°;e'ì!*_„ª`'ƒµI
]e'v‚ˆ]‘þ7dfƒ¾b—ÌT;u‚‰‡q‘þch‚ƒ(ˆ/‚&Žf)Q
""ŸV˜€€€€N¿0¦ˆ0audienc‚Šf(šF—ëREt‚<ˆ]…fØGÒT‹?I!•éƒ}ípô`žzfI!f‚4ˆwand‚ˆ$endigen‚‡ygment‚³1´—‘ˆ‚3†Ã‚+ust‚‚@
¿>:K”Ÿ.ster‚,ralia‚ö:ý
„\
n‚&9thn†a1‰?†
„!rƒ$Š
†—µ
‡;—4y01‚y
ˆ}–þ3
‚c_us;J‚„—µent‚‘`—†#or‚N…a

X8(+"![0R5    3
I‡0H„ni„i—[=
‹*‰
Ä0ƒe
‚>Éa‚u„8vŒ=ª4ž
W9~‡       .b%mb39dt'>YP†cç˜i‚<a…?ƒ‚xƒ{
'a‰A†
‚Œ#
7
‘X†~†eåSz‚s
pƒe
o‡ü\ƒnÝX9®u\ƒµ=
a/®ƒV|Ë
‡C
S'‡a}—7@id‚ƒ?êt{rƒAH¦[9ò‚~ship‚„
o‡ …;‚#ƒR
""+&l .‚\$
£™H 
š‚!¬
ŒW¾|’¥XO.Š,H'   3ÏJ$‚
‡1    †(° Ü„zÆ"
—{®oV¬
§        d
‡…Þ+$H'     3E
$¶‚¾B
‚    ®Vƒ _extensV5
‹&TU,7˜Šs
+T/,7vacuum$R„iŒ?+¾R’‚B›)5+5†<ƒa‚#H)
˜G’5,ŸIøL+
†s…Þ†<‚#H)
,£z,
cad‚ heckpoint‚–×uNommit]
D*Gpe™DîcYk(i/      Üv„vîc…ý‚6nf˜X‡&‚TÖ_½\¾Ffü{&ƒä0,incr ƒ^ÐA’G)        
ÈI       ‚{
Q„Kêv„’       Î,O2,1            ,"ƒ:
 'BLƒ+Ü»sý)    Ÿ
„‚‰LMƒ†‚Z«ŒÆ 
2,1             ¶2"& 'BLdex‚¾•òƒn
_moz_anno_attributes_1‚„ƒ{¯rÒZ‚<ƒ{¯rbookmarks_roots_1‚„Œq¥^ÒZ‚@Œq¥^
favicons_1‚ƒGd¤ÒZ|d¤hosts_1‚„–B›GÒZ‚D–B›Ginputhistory_1‚„˜G™ÒZ‚H˜G™
keywords_1‚„z”uÒZ‚Lz”utable_n‚½E‚5É55„•ñƒ'³E
P5Ö45dm‚¥wW   ‚?‚ž,
‘[™Ša‚5†NŽR

‚y9‘ˆVNp³69„Â
‚5‡l$at.ƒY

GKƒ)ƒLpŒ$ !
ƒK&‚3 1`X
 Z

>L3qEƒ:‚ƒ"/lw'{ 
}„Y
6
„!F‚D‚    l‚
†Y†A}‚EƒK
ƒI{4ƒ‚a5†f7‚A    8_‚‚[h5-       ˆRƒjuJ‡'ƒ>„j„fJº@„|Ns”w„SFE‹X ˆ9Œ1šL†R£tSm-"*¬F…“o™~Ž3@,'”>‰7        ƒgN…d…LY‡7…|Œˆ(|8f}†0y‡`†}ZŠ!<…+ƒ,Š]&…¡^ƒ‚o*‚1‚ˆ‰H‚*‚5…8ƒO
B%Yƒm„KA„f‡K
†z£D¡+YˆO†i…t0…EƒH™o¦Y„@‚u‹ŸQ ‡T†Z|&9H„„uB™w:“"‰œi 
U-M*`„V-e‡D‰ƒ…ƒ‡Cƒ Œ:ˆZ…Q«K•$)‰œ)‹9‡`Št‚3‚  g…•+”@ž”_Ï+Ê‹1ƒ$c† ‰rF“b†0ˆ•°nC¼x‚H]34a]‰‚i4‡K&ƒc‚{Q*PBiaZtƒ/!*
(Žöƒ
W5
‚H7A  8OP"h5-     ‡‚{‡o®s

„f‡@
nNs‡P‚HeE‡ixKsšL†R£tSm-"Ÿ"jPSˆ-
3@,'Jü^
„„O‡7…|ƒƒp|8f}„Dy‡`8ŸÝ
Æ&D‚5Ÿ".w‡c
@%¶‚#‚<®/Æ‚%¶ƒ;ƒAL—‚=NvaS&H9H9Ÿ&—;B‚d— ‡‡Xi(
U-M*`‡U…}fƒ6l§2D—6lƒ‚    P5##)¦D
‚3L{ <—ƒWT…=ƒ—`ƒ+F[/;„2Ÿ,HP„8]3&ou
;4%_—O*,BiZic_index‚Œ¼Y
†=‡ù„ø‚;å†=on‚…’†‚)erg~0¾M

†‚w‚}®      ˜$è5…p(G

*
   @ƒ.+
x7KCg/*# '#Aq @
""ŸV˜€€€€O¿0¾
2vÀO|


c5       ƒ)¾]"
2v
0automobil‚
@ƒ.t‚ERvacuumc'
m'/©OT1Té'3FEŒ_Üf•T1†ú‚E_pagcE(Qx*yð4
 
ŠU†x
Š%½\‚$
 +
NÕƒe‡©?
…1x‡_
1-I\k@
ƒGŽ[

†òH2‚ƒvdata1‚ƒD–BEelet‚§zÝ“,iliariˆlTX…V04
”*¨k$„$Lƒ>1a‹'8- 
        ,B‡5BlQ/?O…Sƒc„!e2""4;‡M*
/£o‚
‚T%ƒqT15{‚dž‹1œ
<0”r‚;B“o6;‹f•R‡rŽG¯"Œ(*N“{†@„8¦%‚P`$CƒW
+BF.h{‡ŠJ„o‰E—A¸C¦]‚:,m¡;Œ(†`¤r„]‚dŽþi(¾:„$L?
7a8- ,?l 
?O…‚e2""4;‡I*
/  <:"
ƒ-‡P—A‰C‹1œ
—0\‡†
OB0;a‚1<v
 `üZ†@‚ß]0¾#
;
5¾E=
+B.
B¶*{FP]d‡CÕ6:Ý4
?,m!(¶E¾MŸ0p®b ‡gyvail‡~
…8
’k\‘~6
‡=
OžZ–7‚,ƒ
9_|-‚J ‚Jƒ
…$
3q    >x…ˆf‡4†h‚
ƒ„
ca-‚(‡OŒpC
˜. ….‡`>…ª4’‚Gˆ‘9ŽBŸu)(”‹@š;.s–`‘}‚rJ08’,'¦B&"ƒ|‰v’Sƒ‚K¦Ž?…:‡yw:)-‡pj„H†.‘4†qŠ=,ƒc”„|
…yCƒ"§F‡H‚G‚%Š&]Š1J'ˆV‚y¯_?]ƒQ2$‚Z„?ƒv|y
…8…zP+†E…fˆD
[‚R‚ld‚#‚:P‡`W‚=t„%fƒ$‰h
˜4†V„U•iDŠl„W’*"‰r‚s’$“?‰(Ecjj94ŒPI‚Kr…u1ˆ3ˆ
„gƒ@‡… ŒŒg„<—gKœŠ…*ŽŸw„fƒgƒ‚F“/‘T
‚-(††Z¨qˆƒ;—!^HlLˆ_
‰J#,Ž9`…&šhma„1†j†g
o…,ßßY †‡7ƒ]Z*…k„0—–OR†|ˆz"‚0‚"„! Œg†Xƒu‚b†f‡&:
ŽqX¡Š‚‹>‚‚FllŽöt&‡x+JA—ƒ3ƒ—3
…7  +U::ž‰%‹š;.s–`TN‡\
‚6‡BV
J'‡Y&"ƒ|‚‰%Y
…:†z‡Jí'6‡h…A†q?…_ƒcƒ.„|
…yC‚T‚Ÿ$;»7N‡iQf‡‚§ƒ#g§ƒh/
t‡‚Cý'%„U‡d—>*—)W
\rƒgqg‡b
„g2Ÿ‚0b_
H„<‡a—3r‚F‡`mƒgƒ®c
‡„u¦|†!‚-8&C=aAžZ ‡iu„6‡cmN‡§&‡7ƒ]Z—4X„0    )2RV
ƒ"ž}-+‚K‚/&:HR
BX
‚0†J—4vŸD—8jerag<
ŽFˆu´TÈ)„À.‰.‚„                                                                                                                                                                               ƒ?—v
ƒa
Œ&:™|˜TŽ>ˆ/ƒ[‡VÓŽ÷
ƒ—&¯w ¾‡fÕl‚‚                                                                                                                                                                              ƒ?‚°\
h:‚ï„`
‚Iò„!—Y`gr!6ˆ}ˆI$‰%

j
,



¯.d‚d
:0P‚<    Ž.ˆÕ1‚S0P   dl´Q¾Mtiat‚*
ƒa>Z1Lon‚‚e–þoid‚‹S—d‚>ƒg‚GŒV‚0
Š4ƒ&
l„oR
‚2
…

t   ‚f‚-^ŒR‚&
„+   |†)x2‡j„ŠV<O`‰|†~ƒi‘—{C”7’RV"£ƒNƒa$zˆ-˜KŸZì/D‡44;†Cƒ"ˆ†›>’V‰w‹d²         ˆE‚>ÀX‹x…+ˆ9“J‹:N„+X       JJ-
…vŽƒri
""ŸV˜€€€€P¿0½Œ‚‚!ŠP„,Ž/‚†n†?"®†o‚Ey>…L‡7iŒ8…‚-    D†w‡h‡b„T¶9„n„„`‹Q•b…NtK
 a4¤.:h.‚zEQ5    ¨O‚"·-W…*Ÿ„—,–v.‚{†(Œu‹mŒeŒ9
†aƒ5’/Ž‰JQš$ç*‡F…‰t–~™EÒa…|ƒ7Žö/07OŸF…_‡k)_      ‚q‡w—<"ŽGƒNƒa$zˆ-˜KŸZŸ
D/‡X‡KÕx>9Ÿ
&>„‰wZâ)9—;G΂A       ?q‡k‚n
"ez¶Æ‚8Ÿ/:¦}.
 a4¶@b.‚zEQ5       ‡ƒeP
x‚"‡‚`‡e…*‚<¶:§#Zn(
ƒ$k
E1     }®‡§R—‚,Ÿ"
dV
UE}!_U?—30awaiŠ-dŒX‚PVz‚{†Ž#Š©|”±„N     ƒ6‚8”üCXÕ…—5‡g¶UÝ‚Ý_zt‚‚M
lindexhead‚–°6_rª$†,‘q     ‰Ž5’z‘f”+•~$‚,„(?‹#†(ìœ&.ËZ„²A
{(?”>|OZd‚ƒ#
çk‚I„‰;" …A      ŽD½d•Œ.úvÆ+mzward‚ˆ:‘¸x‚ˆl‘þ7sfƒ¾[—ÌT4i‚K‚\~”—3¾=xzargÑB¾];colnam‚D
umn‚£%   nam‚¡d5~Û
#data‚¡b5"…P„!resultZ
eurƒ)‡.b|               …
&Šm‰       4
…)
J    6‚(j…F"C&;4‚z‚Q

‹*…31—*>„*P       Š&     †Bo$[)‰g,
‚j„87
ŠGC‚.
†g
…R'†l
                     
‚|

ƒjE„      7

„~

 #,$
Xƒ7.U%902‚w¬]


>&T7/#*P8
„/‚^R
0(L-…1
‚ƒ24."O&…sI
Z
ƒ‚CEˆ3NƒOƒx•…‚D<5•£1[S‰Rˆ‚]U]ƒ        „b|‰@ƒt¤U

…

Aƒ45j ‚o1”
*vH
3Nk
ˆ_      ƒ

;Y—(x8$#`V   C
%
8
J20     "Ž
‰  (‡
:
6<•~‡@[2[2/[[[2[BqXUqqH[2[2[0+Y@UqqqqqqnXXv‚‚‚‡2‰L‚Nx¸p˜:o&qƒE‚`
‚s‰&ƒnƒ&7‹c
#fb@.^     1

;

K+[‚ˆ&2E^$#‚3‚ƒH2‡
"
J,9 †c 2„-QLs
‚  †M
       I 
'‡5
<~7!:9„[p‡     Š…"ƒ‡*,  ‚&‘J        3      yv…!n    c
[S     @\

‚hŽ//‚_Z‚2q*.0?2©O#ŠEu‚3}4  „}    —²i       Y
K
Žp”“Y‚xŸB…RD
F
q
; &
U
c*J

b‡#

 AƒBßY†i ‰u$Å2
$šp‚f‚y„|„mŠ3     
'+.

_#


     
#
%
3$M
wI@A
#)F<I
!&"
$%-4
q
2N
)#&p*„!‚a  07gg4'
_[‚?‚JŽ}„[
‚c    „!F:XU…p‚Žþ^
¶XD    7  
Q       $[)>,
‡U„47
C‚.

U

ƒJ'f
                     f
o


Cr      7

"

 #,

7.U%90
2       s


>&,7/#
P8&„,‚^R
0(L-4
ƒ24‡)O&OI
Z
ƒ‚CE=—42Fˆ…‚D<5•£1[S‰Rˆ‚]U]ƒ   K/ƒ)ƒK      ^

…

ƒ45j     ‚o1-
*("H
3Nk

     
;Y:(x8$    0V     C
%
8
J2 ‡L‚k
q       ‡\(0
:
6<Æ'~…u[2[2/[[[2[BqXUqqH[2[2[0+Y@UqqqqqqnXXv‚‚‚‡.ŸYp
co]fq
o
‡Z§>&„`#b4®m  1

(

K+-‚—92E^$#
FŒKj‡2"¾8KQLR
‚     „$
       .     }
',‡ 
<~7!/9„RpS;%‡U
&,        Ÿ|J    3      ‡aS®x‡eQ//‚_—6†'
<%
!!ŸW˜€€€€Q¿2¸*.0?2•ô~#cu
3)4 M ‡Wy‚|   ¾%
KW
HQK+¶#rRD
F
q
; &
(
c*=

b—Tu ‰u$—Sn
$Ÿ<DQ)6
`      
'+.

_#


     
#
%
3$M
wI@A
#)F<I
!&"
$%-
 *
2N
)#&*       07g@4
_<‚J‚+„<¶/
H    ƒ!0b0‚R‡(10‚ˆ_acav
&Žÿ~
…"calaŽÿ…k‰_ p7E††o
6faF‚\,$Š‡cžB.     Iƒ>?
K]
,MUnYs!
QIm…V‡1ˆz0y!ˆw‚~†>†bd~     2 ‚gVƒB„M4W$„,ƒT'ˆ+Š†#.Œ7Ž1†4‡(ŠS‰P¤†b)¦vŽ(…2”%|“ˆb”Q–qŸY†j
i…F
ŠrŠB_<‰/
-wMaŒ5HˆYŒ-‡d‹k¡d–u,}Z‚‹a…$
†‚b
†;EŽ:s…4
…8i‰ –D
CX@‚6d‡Q-n<ƒd(->[
‹v‚e‰%yG:
‹]’ ‚B´2m–‹f‹P‹        ƒVO6‡8b{dN   iH„q‚…e‚;c#4‚J‚9†
Š'‚{„oC>
“     µ%C*•k…+W•*„2†Ym‚yS†(xS8
zƒSŒ*\‘A…ƒ$ƒ†D‹3…yM
1 !™Bˆ‰w”e‘Yl„ ”‰F‡}‚p‰!6’oƒ@œIˆ ˆW‚V“6vƒ—:†uƒ7‡   _‹0„q‚mLŒ         Q…}aƒ‚<.„ˆuƒ
£\^‹AŸ$‚B„…‚(’’X`…2ƒa.Žöv2‚L'M%A*PUM„s‡h
)&‡„9—‚$…|“ˆb”Q–qŸY†j
Ÿ‡K¦fdÎ)‡‚#„sTI-®o(Ë‚|—tK
®qT6%-n<j@%-

n‚e

2Gü‚S       Æ
X‚9;—‚a¶3‡q
hC‡…gg+W†q/Y|‡FQ‡#"8Na@‡ow"D‚‡[[OŸƒ8W
w‚ƒ®,jL‡‚j‚§ƒ7‡    _—B*~VL  ŸHƒ&‚0‚/‚UI6^c
‚BH%NN'"x!—kend‚°!Ž…
}       Ë0‚Q—+¾$  ƒ
»-‘ˆc,ƒ:‚°e2fil‚oŠk4      –°2‚/4       ground¤=ƒ3
‹(‡)
‹?7Î3<H
ƒjI‡3.3~ƒ_«V"šOƒ?Å  ƒ/¶‡w¦…Î3ù{>å6‚iŸF¶X/åíHŸ       —6port‚švslashˆj‚_
—Ì{tracƒŽw—ëY`upƒ2
&)/.+>NO~   &4 5e$*
e„j£=        )â"d]*L!;5h*rA‚."
;%w&>‰2†Q™\
     
‚q§(‰i          8MK/ƒ        !       ˆa%Ž
†”@¶eC
„nƒ0Žö|
cåÍT”3G„ƒWY3     {     *CC&        !       ‚×6¦`A§_finishL*R‚%-&42…!7x@'…initL s4  :"$†y2…JU:…$L}   pagecountW‡8A_2Œ+ƒ|
(remainW‡6X[2Œ)ƒ|
0stepWJ{t!2.#4$',
(
*S2,…=j<cBƒBJh‚db‚  ‹2„nwardˆ;”¦Bˆj
„pO’‡C™pN
X* l1
Žƒ}ƒ¡y…Pu±VÀ"‚dˆ}µ¼2‡U…Z„T
… h        †Š>–}±yœp‚j|¤I
Ž„ ŽFƒ˜P–J      “WEi        ‹tÒ4…M‘„"–j.`‹„&†S.‚{†(§@Œ9K#ˆM„Q
„—?ƒ$ƒnŽ÷      ®NL‡|>%+         ®ƒƒ‡1‚V‡JÕy{Ÿ
‹
„3—1$òl”ER¾C§¾7Ÿ
Ÿ‚l0§‚`„"¦|`asTh"+    wM®1õVd#H‚ˆy;i†5ƒl#˜)¶%™
†i   Œ0…xì)+i¶O9¶at¾U‚°xMƒ-=/¶U_liŠ7œœ1ƒVŒd[j
‚~5+# F„{
!!ŸW˜€€€€R¿2¶˜aQ0bag‚Å.üŒfgag‚…ilƒ†Ç^—Ì%Nlanc‚Ò*ƒ¢Pøe‚‚D…€ˆnana~óD%Ê?
¾Y…4%¾!„b
d‚K     ‚U”å‚
width‚‚f…1‰j^ ‚      'nerƒ—Ìr‚       ‹h†_‰VŒhe"“FAR]N%.‚(‚… ž”—b»†>word~&ŠLŠP23ƒQ»3¾7-L#23
„Wrierpƒ     
™Xë$
‘q$„fƒŽöƒ)‰„K3žh$seƒ5‚_…8‹\Š}
rŽd"g@ƒ8  
ƒ xH’`ƒZ‘(‹q7[š"›:–ŽX¨Z›x
ƒDf¤Œh —!:Ç„e±q‚bƒ=
b‚h…q•s’e$%w”ƒ/‡+‚H;M—>’ƒaƒUJy!‚šj•_
[!—Š6\™J ½0:Œ.)‰)‰`†9Œ”D‹5¾%          7‹U„%_±) 
¬5*RƒA‚v+¿ƒ$°„“>ƒduAF …B„Žö{y‡em7‡W¶A
#N        ‡Q—OHB
ƒ7EgˆWs‚bƒ=¦‚fÕŠY"$%DtåHÓJ‡fYü
‚#!P&\X‡]
Ÿ—+Ÿ$-‰Ÿƒ?‡} ®W 7Ÿ%X3'.D¦PQ-¾S'f
‚Y>—7§
fUalin
‘|1vƒ&‚‚,C@…&Ÿ?1—"_ z¥ŠSñ)AC@\‡c“L1ƒž'Æ—E?url‚†£ƒmi5XC¼N„m„'‰C
‚°a†*
„
>ŒF  …wžÖ*ƒX[L‘“Z
´TM1½87M|õ¯„¢L§\å=Õ‚X§fΟƒŸ/c
nƒ-J†¢!V…
,›I†8,[_e>‚CÇ[*}
X…:z†] ‚B0
ŽhˆP†…h„@šx™7l¿jš&è_ÑV‚L–hK?§§
n‡n      I†8,[e>_*ôz®p
ÚcÖ&»få‚QƒB‚v¶S)¤(tƒ —ÌNchCg4é-b@*m
Í}Vülƒ9@*†ÓT_atomic_writ‚=–þ„\b31‚uŠib‚U
‚Q”å4
‚Lclear~⇾`|‡doclistindex~
‰
¾‡flag~
‰|¾ˆe#I>2d*6!bY$%*vE‚TO:#2F$_O:,R"d'%]"2jB`C6G2R
(
.yZ
+N
mb]!EPm ƒ+BN2[†,B'‚$(ƒJ?\>,„I:5(‚zv„]G%_6g.‚X5x$nr†h„H„ ‚{t/)51ƒ\."k]h‚=
(!R(/!+(Bu9,
gdPH‚"i‚A‚7
6Q‚
,B‚$d!+w#8X‚M59 C667CZM&".!SR1~X-‚L‚‚„kY//‚„PG ‚C!eI3)`W!X 9@r99‚81.‚z:XJB
'
‚-&U}ƒ?<JI[!%t‚ O&
‚vO‚8<
mG'>ƒi!%
!N  Ba|(/(E`k#‚;&   ?=iHM&>H.Bn
ƒM
xzo
I!%#g
‚@
.RXf$ 6+U3p(X;?
$F
<3J)(
J'$\.&I w
`&1.$.8u
:$##%
I‚'{!‚
(?
!N=e
.0
K O.
N N
A;r`GI   0) W(
!'
[@m 
D#QJ+M#P*.**AyMb17%X?0rEDl
    "
$ !    {@%c_#B7n'
             
*339w,W)(f57) ,
lA".Q8*-+23:*,u

0&O(U 0z2
+5)E0‚n\
BL3
‚###'
8g.Lh      5+
TG
/"nC%3(A!nb!&;    BZ/+9
X9
-YC)‚T!‚19%!„V]OaY%4!
R[F\
‚=UJi
KD‚D3+=~IkKRZ\gJ
!o0q>@A<=,:Q>eeh/gU
\
1*D,w(f‚A#02
CVV
T
4L
HeTBv%
‚6`sB8m~'Z  1C7ic,EGiP?zkZ_
Q" 7>,=<J†<~g‚6;
""ŸV˜€€€€S¿0Ò8&;‚]Z
J     gI=(
c.@H'vC77B4
T-+B?<K<X=4f…A>}:n,.i        ?ZgpMR3A7\LtI'
*6N@M%<o5
)
)b =Y|\KIPL!!.
v`‚‚E;‚R
e0"z,ƒ'`-‚ 0F^p        
iI"(2!‚Q‚
0x3%S6-*XVk:j
*;!(7V‚vL!‚y‚Ay*†Y[A![P&X?z5]UVaAU*w"tkrƒj4Xƒ
\(s-}@(:7.DS>tS<+6SM?6x&#‚84
\_pR‚]ƒ35/91W„S )„  o ƒ%9  …Q
ƒ:2tPg
0UC]#"38S#$v9''ZHK!VL}y-"[L/7(b!ƒh
aW
$S_‚D&U;$‚V_f d
{-GK<@K,IM
„v>/ƒ!i^SDo324n.~% 6,)
O9sXSiIoeƒ,UA {wEB(Ba…FD„Cfƒƒzl ‚vƒYVX‚bƒo(J#H/7‚2+6_>?"E0:
)(U<;MF
(6 bhn3u#&<*Za‚p.=)M9,d!2%n
c3VZ#)bƒV7S_‚_)um3PJ‰
V*ƒZ          ‚43+;B"M9A]bg#"V"5‚*YT&:-''Q?E       I>x<J~„#HK=ƒ|GTJy^+toK‚A!%,+|/^$H     
 @ ‚WqU''#
k
<,q"
VE
|?a/|e]
c%+
t-*7   
ƒU,Ab~‚'!O'."81 x*g&1CieC&z3i<hHr
[‚E7‚aG&xy3(DV†O#6„‚(+`l"Ev/xtxis*:-^u‚@:O$0~}‚=Qw‚     H6yZ2‚ƒSQ`!J#‚G‚w#Dƒa4k.<;eƒFfU%d‚e49>&%~AM‚*
4DV&L':U
;B
xI/
vk*j
'yW„uEiJ[-

#L]"&%QQ'G…H‚;‡P:617B&M>
xI<
q
,
:RvdIB1Ai+4& „r7‚)  ƒ\     ‰?yr/:@2L        )'MSd,|#Kq<fƒ(6‚!/hEr/‚-z$KZD.$"5\1-k[‚T)       4|>,5H''.1;T62
ZDc?i<PL-+
y2‚:,t=vg?=ƒKqu`^(‚s4z4]w‚{yƒ D>c4<&5!FI²<FFq„f@2AQ?{!xP  n&0ƒ:3gr‚8.:dEJu7AK8bs(
:\‚DL‚ZV‚}‚T 7(,#F ,72j„X;j:v$TA&    Z)CP#"U}W
$ S2.!"0W dw|Io"r]‚^92‚3VX!gK
k'_OV(>oh~D @$^ADWƒA/Qn3 `‚}T}hkK-/->"~†q2Le‚h.WS‚pZ0{ƒ
‚@{*(tFƒ7‚"S6&{U‚`bIdh‚4‚gC  R&?‚~Ux  *
"A^+Q<&lh>( ,;HO[S6)…R
qPbz0#R 412-}‚)1^Z  m!#+ƒ
†)CI,,%<n~K2!
IN 1
; J‚m‚Co/1ƒvcƒ#)n‚$!;$!)1‚RC80(ƒ1ƒ_j
e:/wVc~-zF‚:
G…'Q* „*„!t_L ‚:956)XT…8‚}]FM%}%f5/UŠj6‚{<#‚dUxJB:V‚?IT\{‚q-|y"%‚V*CQ59JQ,7V
.K=|v)1ƒM`…TN]wz
[‚8JVi
q>r>^7C'@‚
&IIKn7{;Q%ƒI=‚n"</l~{-l:Lc^^Xq
\4sG       5
!(R6<4*9X‚‚4ƒ<"m)M}Ox.ƒ
mo*VFK(.:@
eWq8/h..K0
p*5G     9G|
IOH~]/#$_AZi‚!-*Ei.
F9VƒuN`fk‚H‚?‚u…(„ƒ}8‚}‚J7)    N:‚KdxX6H7QaOq{1Q
BibLZ9xFN5iG"2$ƒJ„h
,Aj95#DA)X*.{w+
2DE(L$l5n|z
‚(a)‚*$d‚c ^rV‚3yK^n7g
#;
‚+„ ƒIc>\ƒF=
N`‚S]}A_ms\&\‚E[R)u     q#+4‚+
43]‚8,ƒ%;jQj‚'~m
l.)6;OFbzA#'8>VHlƒ|X#-5%/sYoJ: ^_&Jƒ
?$        ‚!}0Z,-?+ |‚‚   ƒQ‚#„"\Dƒp6
t

V68
"5a31oF       ‚DZ‡g‚T
cpD‚xCgƒR7l(C‚D‚F;4KJen>&‚i‚2zF)(j{(`„[(‚=
Pw:‚YD„ Mho‡aƒ…\1:;x'vTe3‚AJ„:‚V+‚x\‚E=y6‡)*?JX#:8=v#
‚‚Yj[I‚%J5†p
![~-9Zd„xo…&Ad<;%†;fc,9ZU #/T7‚ rM&†ƒe.o(A>@ƒL/)O|&($LZL6.‚NY…2&vF
!i‚‚ '.$.VƒGB‚!+Zw1y(o\VJ)+"
WSD‚wHWOXB
2h0*$:‚mfn9#AO („H4kƒ:80‚ &mt5#l_
w<8D,#Jf5(

M":!,XB&$S‚<‚E     'F" 
&.:s-R
Bm@M8+9  ‚j‚J
ƒT_„^rd[1 ,ƒa h]5‡„r<Kl`‚0- }]|8Fe4Z^N}O†E1(#!^‚o*I2
ƒV†}†J
U}Z‚( _0V 76g‚
J~]QG/+fkY>J    _g*%‚&-R"*'
""ŸV˜€€€€T¿0ˆÒt7    1       
I
!EE2@
!Z+v8zf"!>„<u-ƒ.
{,(U/),9mu‚1Eb:$>X&
7=C;HDdwi‚&*F
]A)JfAGE‚h‚4A‚>;bN}%(ƒLO>3N
EA      @U6$Q!r
K`     „Rt!4N@0eDG‚-$d1?#X&Gv?-&'Fk~gS$‚.JO‚
%XQ,&g&SL-KZ/**5AW        y&N‚R:*2 &0‚2
k4‚`,ƒ.…fD=lC'vƒ(z+t`x$ƒQ#P DL"+r~$
J"N

,6‚       )06rKf;ƒ4„eAXv.32' ~0‚1**g
[#7ph=KH2H6#L‚k)"E /%,""     b*
‚^$‚(Qn   &D-a‚p=~wK‚G4‡;  'T[TO^ 3‚ \nm?4<4     ‚&‚C`
*#"=[Mb`%Dzn 7# 
.#u/@ƒMƒ>$1%*ATdqW2#l
P‚t ‚'htQ ‚=W]† ?18h-}?EIƒ‚mC{1LAWGI?7    =#   ‚‚'ƒ.‚V-(\Es‚;2 + zn;
8)'v.ƒ!3NrA‚+#i?N†,ƒ>d*-K‚†#‚<‚4ˆ@Cz,d#    :‚NP]3wbƒVz‚ŠC@#„(C     T„
1‰'„|‡q
‚Q9…u`?ƒ9„?‚uƒ
_A‘i‚tI‹CNiŠqSH2&MŽ66ŒI.’g•Y)?|‚/>n„8‚‚'v*
>$)x
ƒJ
/ƒ j
@7`.B1E…W‚%`ec '+ta;‚Iƒ6‚WW=…g#AVS‚0'       S'+ ]E‚l(J-:N
Ob'b,DQ‚H‚/%P%:P#ƒ33$2:ƒ7>>B7ƒF6m‚†j%v‚&+6‚%+ƒf„     ‚6)1]hS"z@\v‚`ƒj„ƒ04  R
f2&c@‚,SV_BU3Ac1(42%ƒVYl‚dS*W,fw‚j.|u
`@
        n<a3*
|X$‚M`(*w‚Y>ƒ
5n‚(Uƒ>B„1cV![!‚   /5
h&‚;ƒ-HƒY‚ (ƒvt=N‚>
‚‚{
5!'        4fN:pƒ;@f
dq D{p%r(D"(6ƒ87Kip(A?&(x5):-5,z%`]PF‚y;'FCT
B'T6;5oHwD‚|STƒ‚t,9:     EM*Ca[4&=m
}!By+e&;     0=zy =IoM (2<‚H77@ƒ0*&/4E0lƒ0ŽösZKIPL!!

i$‚@E;
2cL0
x"F,‚s`-
‚0F.‡Z
i)"(2!~‚
0x
3%S-*V:/j
*;!(‡_Rw‡gtL!ny‡gƒKEA65M?6x&Y
6_pJ
2C5/91+T )E       o
:9    X

‡U2tP\
0U       ]#"&s)#  9''
HK!*
L}T-"[L/7(<!
‚
EW
$L;:D&U,$
_( $

$-G9<@K,I;
Ev>/?‚c^0"24n(       ~% 6,)
O9:XSioe&‚|,UA {wEB(Bea.DVfT
‚El ‚v)(‚No(J‡)H/7‚
A2+
k_>&("E0:
)(U<;3F
(6 xYn
j#&<‡_U
7au=)d!2GNHF#m36)‰
ƒ2;*ƒZ               ‚43+;B"M9A]bg#"V"5‚*YT&:-''Q?E       I>x<J~„#HK=ƒ|GTJy^+toK‚A!%,+|/^$H     
 @ ‚WqU''#
k
<,q"
VE
|?a/|e]
c%+
t-*7   
ƒU,Ab~‚'!O'."81 xH3
M{H?"&xy(D
`‡/#%‡pr+`%"Ev
xxis*:-u
X$O$0~}‚=Q‚       H6\2‚ Q`!J#$gG‚w#Dƒa4k.<eƒFf5U%de49
>%~0yAM‚*
4DV&L'/U
;
#

I/=.M3*j
'ByW"„GEiJ[-

#L{"%QQ'.…,‚w~
+6>Y17B&M>
xI<
q
,
:‡>

IBAi+@
L    
7
c     ‚q
jr/‡R>e2L    )'S,|#KK—>4>,5®m
@I²‡gS$a
-2-Q?*!xP      
&D
5PWK‡f
bsk(
:-       /LUI]‡^
7 ,#F ,72j„8Xp;j:v$TA&      Z)CP#"U}W
$ S2.!" "& dw|IoPr]‚^92‚3VX!gK
k'_OV(>oh~D >$^ADWƒA/Qn3 `‚}T}hkk$]-/->"I
H2De
z.24
?Z0
{*
@**(Ui‚"
""ŸV˜€€€€U¿0Ò'‘‹])=Z~
bIOU‡`‡‚d  R?D2~Ux      *‡d
J‡A^+(<&
h>‡e& 
H‡eJx
6)!RŸ'K2!
N §956)JT‚?‡       ]FM¶ToO5
'(‚
&‡>K—<(ln{p:Lc7‡bVq
>‡h G    5
!(?6<
Y‡dl‚9ƒ<   m)M=—1*
@
W'q8/I..K0
pJ
;P/#$
"Ai‚-*V.
F9VŸ<bL?9‡EN
ZiGY$
,A\.5#DA X.
'w
ADE(
L$5n‡Xx 
‚(a)‚*$d@ >#Hy,^n76
>i
"
M+6[
dT>\=

EN`
n]tAms\&\
/[;)?J   q#+
04žj‡g'6;OF#'>J|o
Z-?+‡o`
4‡Wl‡e

t
®
J
‚
c1
%‚
Cg‚cl(C‚'‚F;4K

b‡$D‚     F)(0^(`}('
‡]r:~
n!Mhoƒ\1;x'F
!/T'(1V‡T(
A

;/)|&
&5F
!]-V'.$VJ
@
ohu$:
     
 fpn9#AO (B
%kO‡]
 
15#
w<8DI
X&$S
|<‚     '‡e 
.:nR

m@D8+9 —4)[
 
?,
L D]5.ƒ2<Kl`
-
Z }R|8Fe'‡]NkO†E(#! ‚o*I2
‚#V
…}‚]JUJ? _0V
76_
6~
QG/+fkY
!JJ#g*%‡^-R"*'(7 1       
1
!EE2@
!"+v8zf"!>‚tupOƒ.
{,(
=U/,,9o?EU:
 &X&
7C;Fwic&F
])JfA
.E‡NA;sbV}%(ƒ$% 3N
EA      @U


$'!rkK`      „t!" N@0eDG‚-(k$d1?#X&Gv?-&Ff\Yl-
t$ O‚
%XQ,&&&SL*5%W      ny&N‡F‡f
2    <0
2

Z4l-K'
rMBD‡!'j1g+t`_$[‚R#P DL"+:,$
J
N

,6‡ w
06j(L4;)"E /%," b*HQn   &D-aPjwKr46|'GTBQ 3 \;0.4=4    sGR`
*#z"=
Rqb`%.
qn # 

#o@D%‚R$1
**R
?dqJ
"#
!‚9žW
OS‡MNrA\#i?4†,
.d‡+K;
 ‡„wz,d#  —6
ƒP
6:‚‚'v*
>$)x
ƒJ
/ƒ‡c

}@7`‡d'B1IE     88c '+‡^;ƒ
W=„      #AV‚0' K'+ (E9J-:#
Ob'Q,D0
i?%P
P#$33$2E
:>"B     ƒF6R:
Z%&—
{+Qf„    ‚))1]LS"i/\‡auv`ƒ$‚$i4   REf2   )0@mSV_B:3A1(4%ƒI9l‚dS*W‡u‡i]_u
C@
        (<Z
V3

n
mX$,
i7T(
*u>D‚K
5n‚(Uƒ>B„1cV![!/5
h&
#‚;‚-7Aw (
yƒ$;-Nu
!
H‚
5*B'      4fN:Xs@N
S
{dN D m6
!!ŸW˜€€€€V¿2Ș|
w8
7=p(A%I$
o-P8

5
)F-=
<aT";5
H;,,"SaNM,9:‡!@    E=
}!Bp+e&;       O0=z—7(0bear‚[…L
ƒ3•é„»<$Õx
‚63utiƒ„^cam‚‡A˜3ˆD‰
”uœ/‘ˆ50ƒÌ&üwN³Y.åL®~Ous
„CˆiŒ.‚z‘'
A§†=ƒWˆo‰:‰7$‚0
‚2…I
Y‚ 7ƒehE‚|‚G‚s[…N‚*     ‹QƒZ#
H†[|`,Œ=^:h"-V—7$‹{˜C‰6t›‘z“7‚5ª¯D¤D

‚o‚…Rt‡Y‚G
Aƒn8„      •Ž„.™†b‰l†_BV-s"dƒ&‚1ƒ7‡G„t‚.AB‚HƒEw‡‚^‡j‡8‰*±Š&AƒN†(z„WŽM…ƒJ…#Š…V‚3‚.‡O‚-‡9p0Š&‚:
ƒDV-T‰“Q;$&m‡%c†0„a=„™Uo‹‚M‚ƒ.cn
…tŠ,‚T7ƒ=‚¤fŠ_ƒZ&‡E†X5‚f…oƒ&‚b„
(Ž>ƒ†W™„R…‰7<CƒoJ…†B6ˆlƒF_;[ƒQ‡z“Š9$—‘Š}c…
£S„!ƒN‚`"…<…PlLeg‚"‹„B
,„L‰w†9ƒs8‚^„|‚„o‹e‚–h†du&KƒJ1t „}*‡S‚       ‚UˆBƒ‰.ƒr>…
85=‰‚uL‚=‚       „jƒ,„.’ %8‡w2•J’  %
(‚v‡KDI„1‚S„K‰2ˆY-†{†Š$„
Y ‹X K„p›        “I†‚n†„
u‡Iˆ#Œ

‚ek4“U–T‹$…b„'‚}{‚•96-F&†D7‚$1ƒ_j4u77’C‚{®,’…-„E@ƒ‹Q<4˜AƒhiŸ2¤{‚†N¡Hw,2…mG=0ƒ‚v‡<‚)"
‰I.Žöv |`
J^6R
N"Ÿ*6‡/i
T`t
M
„q(‡‚\—<•=¯D¤D
Y@i‡Y>‡hC‚2‚‹~…I<
ƒnB  5
„="dƒ&‡@_t‚‡_jPAB—'¶Z(‚—2C‡i†iŠ&AƒN"/D8
o‚
…+7MŸ
"D:¾@t—98—k—ƒ@—3]¶‚      ƒ`Q‚#ibv‡\}x%‚v [ƒvC‚¶];1‡XÎQ„       ƒ1<‡U

"c0„+—7
e8w„‡%—y…ou&K7t‡\
ƒC*
‚R‚U„B;ƒF‡cf85=ƒ‚uL6‚       Aƒ,h%8NU‡…F‚g‚%‡W&‡jDIM!†A
‡-¦>&„.‚IÝ$P7‚$1ƒ_j4u77‡`G‚#„;—>b4<4‡qHs‚X„x      a/9
0,žp3
EiE—‚uO)"kmann‚P”ÕNomZP¥c…:kcF‡2xh‚V‰T‚^m„a†V†!3‡Œmˆ
‹T¿#¼ „3
„    ,„x¨‚7”@—u…}‡#‚‡%› Š4ë…
‚ˆE…%Œz
]‘e¬*‚./ˆ%ÀS„n†<‚‚M‡‚/‚9C
l    ‚Ieˆ…<‚z‚k%A%ž‹OªD™F
…=£Z¬]œ|“v†—
‘Ht˜f—mª†q‰?†.£„ ”„c‡§oÙ0f‚R‘Jƒf›NBŒá-Œ_…<–#‚<{#ƒLŽö‚&:‡b
P¾[U‚|"&[(˜G‚7”@—u…}‡#‚‡%› Ram‡Qí+[y‡c‚‚./‚jù‚-N&‡g
    ®tNŸ~‡>‡‰m!9
'¶RÆ…w¦Ÿ¶‚"3Ÿ„r‡l ‚&p‚TÝ=
†CP‚Xåaƒs—4{‡ƒ?GK'2%C[]—%`efier‚‹`—†n„o ‚ˆ#5
N\‹mƒR„`‰Kƒ|‘     4‡        ‚N'
5^‚m†8…4ˆgk…s=ƒPKE
E35
…s V@@ba$S#
` Q
‚ES
‡-h0}
‚$E8 
W1<y/‚;[N‚:‚o
     <
ƒn‰R‚/ƒ&‚%‚6
Žh%
‚0CA
v
†w‚Q%ˆv…M‚cGƒCŠŠ8…‰x•
……ƒz¼‹eÀpŠvƒsƒp”hƒ+<•K‡m‹
„"yˆ-x1\‘1†e
""ŸV˜€€€€W¿0Є‰{ˆJˆ pZx‚…e„H‹/G?@…±D7”Ip†R\‚I…gtK‹I3b†g†H‚f$‚‰z
‰GŠ'‚Vr…Š?ƒ;‡Z„n'OK 75…c D(„^ŸT‚9BŽh`OG„^ƒ!‚C%‡j…„ N‡‚R…0‚^„H‘N„5*…s‘.…^‰‚        ‚#ƒ+†%`,†ƒ‚N
I"‚†eƒ**]
3"‡ˆ\ˆq„6†R!9mESw5N‹iH       
'ƒH$C
-‚5„l”>‡U‚1u[„-:&„ld
?ipƒ( ƒKƒ
ƒ†A„+‚q‚p', ƒƒG‚  
#‚‚ 9=DŽ|‚8„%‰{„=ŽIy…ZH.
‚"‚6‡gˆG¦ƒp‚‚SollJ‚%`‚yˆ6f+W‚yiX‚?…NS2ƒ4XN>z‚%'U&I‚%9‚BZ%M~ƒ,//!(A‡)W†-ƒX‚T="t1Hg‚ƒƒdpŽ0BŠXŠ?;/‚‚Žg‚wƒ2Š†L„!ˆB[‹""„‰:„h(‡vŒmŠ‚$X…UrYŽ…(†""Nƒ†XXƒ;‡@„m…_ƒ!K"‚‡^;\’uƒju
”;†ƒf@Œa‹[…*T2œ[ƒ<?‚="‰9NHl„
…VT8$?<ƒRƒ+(‡1‡_|ƒ„i‚g$‰]ƒGe
$’ƒ)\Z2‰{6ŽV…}† "‹’yƒ•Bƒ(
Ìaµb’|ˆ|ƒ[„       ‡(ƒ¥'Ž|œV…kr‰ƒ]’‹^‹[¥p–m¤,1‡E6‚T‚i‚;"„wmƒS…&ŽöƒY‡J„v§ƒ,
—e†s  ƒh‡ƒl
V‡c:W:}‡m‹
„"yˆ-„‰{ˆJˆ pZxRG?A
„V7
…hp
\w„
tKN
ˆ^b‚;… ‚f$‡G4‡j΂]—?M‡]3…1ƒj(‚1‡g‚9R
OG$]!
%FDW
u‡E9—‡h·h-‚N
#"Æ69]ESw5NÎ 
*
-®ƒa4‡k
ƒi‡dF ƒKƒ
AS_
&,    3F
#S9=D@AdÅ‚:‡fQ¶Y
g}‡h
‚v+Xt^‡[pS‚T‡d~‚iL
N[‡ƒ:—3&&‡+!X(‡]„rYMƒ?Z‡g7ƒƒ1Xk{~‡7„m-‚[     B¶F%;u u‚—HP
a*T2%‚<?‚h
‚zž

‡"0T‡b     
‡_
§ƒ[‡eu‡D‡e+   +Lžx
:r_(  {E—3
Ižr
/=CCPM
'm—
E&0befor„Z‚qƒ_\ˆW‚l‚U‚<!'‚3‚8‚UŒ4Q‹rŽ<
:ƒxƒ-3‚C
k‰‚`ƒ/1†eh‚VJVd        8ˆpULa<‚7‚Dr„S
ƒ>2        |ƒ…<‚G2…U        ‚ieŒ*V-
]10‚ƒ|ƒ9…;„.„6eJŽ‡Tƒ Hq        9pƒ[Š~ƒknG‡|2Šx‚…‚M4‰c,|E‚:‡U†RŽ
‚q„f*P5‡+Œ.“.‚w‚Lƒ‰]4‚&‚hš
Q*…=‰AmPŽH‚K)Šl†E4…D¤:ƒN1›2E!”BDK…k„
‰J@—…_—~‚œ*ŒAFˆ}‚[‚‚B‚f•m‘Pvˆxe1‚„u
&oƒe‚.‘‡,‚a„!…Yƒ,&†ZW…‘       …@‰
2’z…‚K˜B>D„(†U–G‚D†g5Š5n…Œ=„ƒ*†[>‹"‡i…VŒ@”}ˆ†Z„N‡+c{”\'†RƒBƒP‡=A„#s…k(‹Zƒb‚ƒ‚>x‹P&ˆ;†c†HmE3nƒiRŠy…‰>Œ[I|„Š2‚.Š0…8‚1•ƒ…v‰P…Qš_Š4“ w‚d‰!
‰(ƒm†    #„hU=†i–Œe„MŠb—mƒI‚9¯…KY„?‚*ƒG˜u$‰/ƒ5…N”Z
Š>#*ƒ4ˆT•%ˆ#‚‘?‡2ŠZ'ƒPhTƒ~™H„a‚_&ƒsŠ+“9Ž
š^‚^›/‡
„A"     "œˆ)†A6‘Yu(@„(—q‡.…#0Zs3¤a…V‡pŸTp‚L‡S‰2‚c‹C
Y…‘yr\ƒM„o
5‚w‰R„zƒGŽö„Dƒ9#‡lG‡ƒFP8u       
J1R‡^T
  lPV|B#]41/‡$Q*gq
…*P‡7„f‚
:)‚‡d)'‚'0•.ƒN1›2E!”BDK…kQI%‚N‚g‚‡)AF|
C‚‚*T…v
„6vÝA%‡i&,‡_U„vŠo…@
‚:2
Ž'„‡h‡„픂‚M§

'‚1&`‡Y…)=A
q(  u%8
P
I‚>6‚DB&¦HE‘
""ŸV˜€€€€X¿0È3”‚$Õt
@Rx+‡aXI|‡„P2‚.
„0§\Æ&
‚Y‡‰(‡er‚9—&"Y=‡W;ƒ…$f§      o—8
„g#ƒ4l>
hh       
‚d'4®6‡‚Y§‡qA‡m
M     ‡i@^6
Di(—Xi(‡nl„i<@       3Ž!…Vƒ^3+-ƒ,7up \‡bO(
50began‚3ƒH
†"‘Qì%‡Ø3 in„
†<f
 !ƒ`a‚Q†g\‚:“o_ U1‡Xœ~ˆm‚a.<‚
ŸH>B*‚@" PGV†N†Pš/
‚C~PI4I
:Y‚E|Y^N        w&MUŠI†#-†?$‚<‚`ƒp
‹F†=&ƒ'‹^2‚D7…fŒJŠV(…H‡‚Jd–!½…‰2‰&zˆW‚
\‚C‚$‚„
Žl‹1ƒ8DF|‚F“F‡~}jW…ƒ@…6‚7….ž–«Ž‚o†L‰s“c)ƒdŠ6ˆYƒG)5±5‚?…s‹Ž‚|…   ‡rŽ3¢l‚–
P•% 
˜qR     ™/C)ˆ+ˆhN?I
‚~9‹+‘bŠv%+$‚f–Jƒf ‡ƒH‚
Œ>Š*iƒV†'‚f:8‚!‚L†E!ŠH\-…t…4C
a‚
”‰BŠ9"%¡… “3Z©$1„UWt0
9ƒ‚RAŠwPˆ=7|ƒx.&‡
‚Mm/‚N†+‹z—*p Œ_Eƒ:…NˆW‡FŽ0Šu¢2‘„Œ$9‰3—c ŽO‹]ƒV…=N.ˆ.<ŽT1J2;’X[ˆ@‚'‚
^oe-!u‰C^‰‡`‚‚@‚cƒ‰kˆƒcF}‚Sº#?Ô[‡T.…@$…-„P:<Gyƒ$„a¤]–#—r†.T‚
7ƒD7.’0"VŠa
S‘‚
‚       h‘qRƒ
R„Ckn„.Ž ŠX,[$…;VY"7Žöu‚<ƒp
$F‡[
ƒ
'
…     2(7M—;P—…DIw0‚8yZ)‡„g
mz‡h4HLHL…5l‹1ƒ8DF|‚F“F‡~}jW…ƒ@…6‚7Ÿ„‚,‡-  ‚‚+…;
=)‡CÎ¯j‚?‡i*—. ‡‚@†t‚„{?‡\UÂ$®8§{ ‡_‚     
    E
"J=
@:8

w!¦]QIÆ.‡d
‡N§‚,!=7Ÿ

Jx—4Zh‡e$p‡6—7HEƒ:‚;w#‚‡\@¶G‚c„ƒ;‡YIŸq)@ƒ!:‚¦B2;‡‡]t—9
d‚
T`.M;‡g
„Pc<-KC—
‡mmC<
7.
‚P"MŠa„/H‚
5h}RxDR5j 
Mn.¦subrtn‚šÑ:ÝX…2Ñ:un£Uó3š-„(†N
„Ñt@hav“@\„O–=„R5„ŒO‰ƒ3   
ˆe8
Š$Îl’
ÈX…{
En…‚•w„ª‹3‹3„]!…A‹
Œ9ˆv†>‰žv‡µ@
8‡{
xd¾-=ü„Kõn„jŒP6Ö&T®ƒ1I}
Q!„I§ ;í‚-vpƒ
ƒÃ!iorƒTˆlŠK‰P
•i‚‚EXw†Qee‰ra‚=OnƒRƒtp:
wJƒ^ƒ%U)
'eU^T
‚W‚R‚^
‚ƒƒ6‚:ƒ
dƒFC 
_ƒs
RI‰d
‚U
†(vƒ$‚4‚7…kˆbu‚s†
+ƒJƒv‰e‚mn2‹Nmˆ‘-
Š6âYƒl
þ
B‰ƒ†{ŽB
5?–W•(E-^6
„a=‡GZ        „t9 Šb#HUeˆ"
ŠfÎS‚„|‰mžzG!Q      ƒˆv(†B¸
…T:‹H
8U‚:     ††_$†y… Iœ   5,Ž]C‚1‡d™e„sN…pu?Ÿq‹Fžd…        R@eŽ@f68
ƒ\O”J‡y;ŽJ‡#†tƒ(†
D
‡6‹t4†Ž.l¡ƒtÐp‰Žb;ˆhaŒ†?f5Žþ„—93Ÿ'—7
6Ο7
‚GÝGP8B3ŠdTE
…&^I;=
a    hEf  #HUeŸR”4ÆÆ$„`%ƒdƒ481‚n
""ŸV˜€€€€Y¿0-o“úÝdOÆ&
‚eN  N—/ŸnŸƒ(‡„-     …>DeŸP®ew68
Efa,;K3&a(݈:‡s4Ÿ‚k‚/.cb      :V—M?f
0behaviour}j“)‡`–
ûW…s÷hž=¼a½9n1¯
†
„é‡6‚çC)ind
5ƒ.’YƒW…Cƒ,ƒ7‘!j„…C"&‚S±‘ˆ„5O‚À-Y'LœE—2>Ý_ P$®‚-¯ƒzoov‚
lief‚s
ƒ5v‚|‚|vƒ.¼w’%Ê'[       ‚]K  ‡-ŽXZ
žs„u?”/”=ìƒL‚‘IÛ
       ƒÚ3
OK    ‚|¾L5
=ZÒ-Ÿ=‡®ola‚‘@V–þ†_õ.ong†7‚|#Pç
ˆV ŠW‡-@…B…<k‹9² ”7½b½…l{V ‚Z*¾0G-@í‚@†ã‚B®okw ‚ŠBˆ%DGŽbƒzf‰ti‚„=…`d–Gƒ4&
\‰H‰P‚^ƒžl0…‘‡D-u‚_ˆd”b‹L…O‡2‹1††,IƒZƒ)”c7¸=YB‚†[‚gS„Wƒ9‚z›†,“{‚F‹b’Šg¨eˆ1‚K™$
G‹~ 1&›#œ.  =‚‚IŒ5‚-‚k0…a‚‡w
‚N"‚„"Uƒ_9 A™\
mMƒ ›=1ƒ$      ŠF‡`ƒK‚‰BOƒŒ ƒQ…aƒ†™ž#ƒv™sˆ3„+&’v¢†9<„‚O"ƒg¶G„@“9ƒp‚g8=-
B²|ƒ uoÐ(bƒ…yƒO‚,o
‘T…zƒ)G„n?žW=
ƒG:Q3Žöƒ‡ƒq?—3Rck‡…p9.†ŠZ7‚K-‡1M‚XZ‡aiT7¸=YŸn‚RgSƒƒ91H‚F„       ‚R‡%‹1‡FjŸ-Æ%
GPŸ%M³Ÿ"W‡‚UbÆU‡tY‡(‚¾¾C‡b
1$‡K
F‡`NrR‡]g‚®—6‡ƒ;—‚^ƒ‡e„+j‚Y8:¾fƒg(0‚:®;®t—‚—$T
k‡d
‚0 t8ƒ)G@L=¦n;
nabl‚²)chmark‚?
‚>F“
˜šK<d     De‚K¦^„R“ØsKath‚ 8”Õ‚Ufici‚’7•Ú…t„&‚Š*„
ƒG“N”ƒ‚KH‰=‚‚M‡…G†<Ï„W”O›‚
‚l½*=–
XG¢oåR4üw!‚KHý—‚‚™‚I¶a7íQ
T=¦d(Îzign‚•ztlei‚.$ƒ.utzerfreundlichen‚‡zrkelei‚
…tdw–¨Cydbƒ†Bnhard‚V”ÕTsid‚£—`‚G‘ˆk…ŸYpok‚IƒnŠErochen‚ˆDtpŠ]hƒG‰ƒ ƒx‹N•Q‘e‘ƒp°¦VcŠ>Rµ.°J
C„iƒnŽz’"rªŠe:ƒ!Œ- „"†E3Œ$Šg
…N‰v&‡o—o„A!@B.5‚u‚T‚
;ƒih;Šd4‚ N%ˆ#ªž…‰4‚|
‚N„1
ƒ5½      …K?ˆ6¤S†ÎMƒfŽöƒ‡i>…@¶‡ƒl0„®PEQ„¦p@ƒ¶a*—p‡‡‚‚G‡mX—2, .®m+‡f„
‚
&¶Æ$
.5C‚
;h…4‚ N%ƒRŸ#‡h
…Ÿ!O¯*Œ„‡wQ/*ž~0en‚ˆ t        8a‚VBœj·FŒY‚ˆ-DN%$ƒCriebssystem‚4
‡wter
&‰7ƒ1žk!
†jO3     „I†u
&.‰…
²oL¢f
QY‹V†Mæi‰[‡z
‚4-„U†Œ'‚`¾,˜b-–Hˆ…)ŒgƒR‚.&…2,Œn‡S21AŒŠH‚ !^0™‹L‚!GŠ G‰1†=„jeŠn ˆ‰‚Z&1-…x…x‰MI!†OK‚2‚1›"ƒ7‚IˆgŒwˆ/µX*ˆ’k‚s"4l.$‚Dƒ=#‚-‚cá¯S/Çp<¥
ÑM†K‚B’Ž÷…‡‡f
".W|ƒ—OL;YŸƒ&I‡YJˆ$„ÎN        <U
“t,’bMod#.!‰m
       f&…'
""ŸV˜€€€€Z¿0º‘‹`S‚‘rk¦
1¤"¾2Ÿ/-jX$I!…kK‚2ŸJƒ7‚I
Zw‡cxŒ?
2      .$y##W¾:ƒ,—:‡e!d\0between‚G†Pƒa†'%1Š†*p ˆ ‚kL8™R:‚MŠ#ƒb&ˆ ‰Aˆ|gL$‚‡2†
#‚CŠ99…v
†W
 ‚^‚#
6 C…3
ƒG
)
q   
=    L…`~‚U†f…D‰‘Œ‰7…8›„@ˆp.ƒ7Q‚N‡c‚zJ†]ƒ[>…6§…z†Z‚5’5˜)‚*„O‡f‡‰4•r‚"6
ƒ=ªfaŠ‘LZ¦FC‚Y‚H
YƒLƒD‡>…^…@†O‚Sf‘nƒ.‘ I£l‚†R—‚(„;m
_‡h†(Š9Oƒ|ƒƒA
—Z9
-†Yƒ@‰~„(B‰ƒ96‚9S(“ƒ†z“!
ƒhI;‚
ƒ0‰&¡b‡†E„?‡Q1G
„H“4ˆeœ{|‡Ok‚ŠE‚zTPƒaˆh

…A1‚D‚5]†>XƒCf2Iˆ‚I„p†c<$††Nb‚n„qÄD%ƒ?‚jˆr
“7†&ƒn
‡d‹1ƒ>F4—|†c‡JPŒ>Fƒƒ_6(Bƒ"’l…"\‚t*”b&$‹)$QrŠ;‡5ƒF„‚
„:0…7Œ[ŽŸ‡ƒ…:…
¬B‘^
R‡&…x‚xÄe+ûoR‹$Ž»PA
j*g}†Iƒ+‡2‹9‚&‰vtŽa<_ƒ=‚HŽƒ   [ƒ9š6ƒŽq9‚,Nƒ†J™/†Žöy,ƒ~    ‚‡^‚§LrlD‚N^
Jm‚     ‡^nDGI-=…P!ƒj‚‡

n‡/‡bm!6W–aŠ‘LZ¦F—/Vƒ‡i|>‚W‚Sfƒ.
‚IQƒ!$b<m‡K
l_‡‚Î
+QL
<B‡,>;9&‡a
`(‡:[V@‡Gk—76z
Τ
I§S‡‡+8ž}/Ÿ¾<1:‡‚:‡d
Sƒ
2rI„c‚5‚Ip†c3$„}—/=6^Ÿƒ(d¶‚M‚}„#‡_4&†c
F8‡m6(&%„NYt*
K&‡„~0*
yU"‡GU®ƒ.M¦‚A#‚o&s¦†}‡dP=‡d§…O‡f*L—($jj‡ƒZ\
tt†8?H-AŒ#ƒ9       ~‚0
q9r
vƒž{N¦…5war‚ˆ†9Â5ª“zù…*yond§@ƒŒ|=qs
‡*ƒd‚  ¢š2ƒC‚3‡<¦Q”+‘>ˆ”“Adi–â– ^C‚iêƒ9¶„¶‚Ý0…U‚¨bggcolor‚‡@1
‹'N
™>£…"1΄á4
ci‚ˆ]"³+‡
)`‚g‘^PtƒVƒŒ,ø)4/¡x*9„46ƒ :ˆK‹“³ …ƒy‘sŒV‚8—
ŽuW+†/‰GÃ]‚<KNy”,ˆ‰j†r‡ƒJ‰N‘8‚m      ÞfJ
 #rx„‚YEƒ3xb‚DV%m‚xq&‰\ƒo*‚El$9$+…-ƒ!ƒj




-Ou7+‡Ž÷„¾;kˆh…d¶#,f!*9ŸÕw
„’$‚"®
‚ßR
F+¾4=ý‚Z¶TF§.§?9”zrD-#E
   
Sq&‰Iƒo*‚El$9$+)‚th





#u+|_vocabulariv
I
Žÿ{
G
ger‚¯•òst‚‰yÁ9int“3Œ*‡‹.µ^i¶Ynoreconflict‚T‘#”ÝVrstrz‰T"F)tablƒ
)|—Ì?
K|llion‚‚Iƒ-N„#‘K#…w”A‡
‚n
‚P9
Uƒˆt•"
}       ‘ˆƒ1Gr…wê.pÒ?ý—6
„&‚°kAmonthli‚Än‚Pƒ7
•9—ã _pointÏ=¾2ari„C„tˆrZbc„7„9Ÿ"[‚)[„0M
‚U…C‰j,•.m‡NKc‚$G@Qh:‡‹M‚MŽ^„
>¤,‚
6
„H{†7DÁ-ƒQ¬z2Oƒ0J@‹0ŽP
‡h
F‰I!‚gnˆD@„z‚078g"5%U|  4M7„W+"2
""ŸV˜€€€€[¿0Ÿ„{)‚ƒƒ4F‚D ƒ  Œ$ƒ
‚v‚†[
g ƒ9nEÉe!…•'aqE‡k“H,‚"„b„)†Lk”_
‹
’T‡d
†%½*@ˆR„K{ŽI§nm)Nc‚$=@Qh:@Lq‡ƒm—ƒ:‡g=     ‡a
.
6ΗD—7f
2O‡Lz§+³Yh—<‚4!‚—‚n¶TBl78@"5%nm)‚;gZF*Æ
        g ‡Y¶^hÆ(¾<"—9JqE„,Cm‡i>õ‡?
Æ$
¯*@|ƃK—7y 0binary64‚.L4O/4lH2Z‚/M‘¸G4T
/4H2/colƒQ˜ØudœE‚
‡"‚

-WT4‚U89[„0'X„V=-T‰0,‚     

†}
”LÓI
ŽŒnw…Dˆv
†=Ž*áx‰“0Ž        RˆZ»F*¥kR&‚       
ÒŸ
‚`³ƒ^³=Õ}r”5‡‡åH&݇^—ƒG
ƒÕ(_o#Z?„Y{%#Á!—ÌVblob
Arý(Q‰8^ü+RQ…í
64doublÏK‰Bù‹errorz
Ÿ8fallbackz„k˜FYI1*int
‰G†E      64‰Lnul
T‰Sparameter_countˆX?index‹U‡X[namˆXAY
‹ÝöMoint†4S4
.Ïh ˆzeS@†c3LP
`
2½Lx†¬
eS


L!ŒG

«q6text=>.ýa<–5‰WüK<a<       0
16       ?1_O.OÕ‰aùM
64
‚Vruvalu…{‰kxxxx‚†z†zeroblobƒu

…r64er‚W”õirect‚³)g‚(™sü
'…ÞƒmoƒÁO—ÌVJnƒ†R oinformat‚„Tson‚U
‚JD’…Ftv‘"‡$–|-
       n  ‚      ƒ[
‚UH      6Y
E"a‚L  
x&†jŠ!
ƒ;'
‚~
Dy
„f…M…     ‡‚TU0Ûœ?0



„rL
$7‡tƒA)(
h     •&@„<&B
9!ƒ5BŒI…r‰s'ƒ%‚+’K\‚e‚lP_‚C†J&(‹
ec2¸x…Ÿsª)"
…
„:
f†}…N3\ƒ[ˆ-;        †iž"‡o¢#-6K2`     
†.8V    
2
ƒ
‚3‰6„3{      £3ŠC™i‚(‹9
Žn6>
:‚OmA
‡kŠvŒ}µ7
…aŒ\ž9<‡HO¨y#…d‰)[71‚$Œ‰#   ¶4‚l¡
‰*«#$8ŠO²MCP …]:ƒcB1¡N
NšrU…Sˆq&



Eh




…3£i5yƒ
u(!„
‰B,–=‚<08o0Kƒ…sjµ7‚=‚T?ˆƒ0



ML
$.…cžn$)(
    z†v@„<&B
9!ƒ5BŒI…r‰s'ƒ%‚+’K\‚e‚lP_‚C†J&(‹Ÿ%0…ZQ"

ü†‚‚Ma
2
w6
K®N
      
      `       ³T
‚)®qp{ ®ˆaR=ƒ;¾3%>
¾0&mA

/ŸC—6WKŸS®
]„#‚]¶Q
m[N„7¦{a ƒ(¦ƒ¶W$‡f6‡m/‡‚oŸ
,:B1
„4
T8U…Sˆq&



zh




+
„$5y
&u!Ÿ ‡ZQM6
O.—Iand‚›A݆smap‚‡^‚Dsk‚´’v[8‘'‹
¢¾@ÜfŸE’v[8‘'‹«~
(…Îjnot‚›_݇or‚›Ý‡1wis2zarr‚—       lackberri‚4
„9h§
‚C‡0”üo
Dnk˜kŽ3ƒOÁ:‚
‰D
8–7ƒ3‚ܬl—5®r
‡&åE6ƒÍ6å‚‘‚Z¾$stƒƒm*3d‚ŠSX•Œu‚ç,0eibt‚‡}ss‚
ŒDindli‚…‘ˆe,„áƒ1obƒL@X‚t/p\
‡D9[ƒzz      „‚gtw%
…{.‚rƒ#‚d‘"+V‚7@  .
<  Nm!      

*-      
     
      
 ‚Q
G>j"/"
)      .(    „D'
E
    
$-…(
-(VF,k‚\„;X‚F'<
%+)0}:/"

ŠcC


#
""ŸV˜€€€€\¿0«"zŠ'K:Š+…2†Lb‚„'_Zy5G„X%wt31ƒ@%%‚
„"Ì©mY…f‰R†E]    -Zƒz‚3•t
„u!Š N„!•ƒCNq‚u†k–LŽwlƒ#aM?‰rd—S•l‹
‰ 7}h¨P7"8…((…}‚B„g„Z†?ƒ;"oC†RŠ?_ƒX<‡z$‡R#0!‰;‚rZ"‚q9()K„GE_      
ƒm,ƒG
%’a
HŒB…i‡(‰3‘pƒ
‰m„3ŠP  "¡<)”`"TFŠ               mEŠ‡iN‚
e†'… p‹A7_$ƒ7    aRrƒh†Eƒ…[„W"ƒlˆnV4\„Üp7”'‡&ƒ; E„]™!#sK"=In‚7Œ{_j‚{4
                31`„b†U>
 ‚O7s‰X†PRl~    
&2k
(5y4f#

N6
}+C)45'+F     ?     wF!m&-#       

º9?ž]$‰     
ƒ
‚9„z¥„QZ:'_Z\
P56%
3
c3@%'(/‡z


@Y
„>
]‡6ƒ& -—7]/R‡O
„u!Š N„!•ƒCNq‚u†k–LŽwlƒ#H"M‚@wa
‰ 7
^hP7"8‚((%‚BwƒH†?ƒ;‡@C‚4`Ÿ$…4#0!‰;‚rZÕv‚b
%Ša
H
t…i†F‰3‡Iƒ|¾Æ C4¾;
      
¾?
‡kƒ)—3ý¾@U‡b‚6WV4Q\ Ÿ       C=     EÕzF#s—/
     =In5‡cdL*‡hD?¾A
17s#„f
{
6—-
&2
(5"d4f#

N6
}eC)45'+$      ?     F!
m&‡uƒU#   

X
ƒ?l
T$*V        0blob_byt?
ƒRY\$2&clos?+‚zE‚   $open?
‚9=
](   |%"[0R¥„Tread?‚?ep‚!&TˆJ>„P(*—ãn
„*>‚m(open?‚VSQF"
·Sù*writ?‚Ea*'#&

…0integ‚gí(rid‚‡U™$£…7…¯Ick&
2ƒv‚e"ƒ:*95
‚*z",
'y!‚$9)l*&$‚?Ž(‚.†ƒAG        IŒF.ƒ~              ˆ]ƒk0é7†=†F&Gˆu:*‘uZ‡‹1O©
’B‰‰0ŠJc5Š
¡}4…MžBsˆ?
‹K"Ž6,rLd‚lD4nE‚ J =—ˆr‚@œ!ˆW„(ŠU”H‚g–®~¯3( %D•o‹uÇM …QŽ÷E       ƒN
ƒFFT
    Æ40?      #V&®Jˆ
…
‰]O1‚g„ ƒ1c5¦‡{å\
4õ‚       «s
X"§‡Pœ*P¦xv2—‚‡'—C8¾=N§q&( %D¦‚‚Õ‡ id‚*‡?
†.o#6q%ý„
Oo#6q%
ng_prepare_v2‚@ƒse„8
step‚@ƒ‚Eƒ†Ngƒ‚q˜š]om{
‚2°-'?=†71/+Ý›_'?berg‚V
Ò3ue‚‹C.Œn˜‰$„„sƒC–Dqñ+7‚ç-0       ¾45uÃƒ9ƒC
„qnder‚?
…}-âXm25~D«$†Hy~       7T+f8Q/ƒp.;Å6¾A3G
"7T+f8Q/>.;      9¾Œnf‚Å7üŒonf~ˆg‹I¾6$oard‚½-“@st‚

…Ab”i]‚5uA*52PBƒF?”Ý;A”?‚R52PBm?di

‚?ƒ„n
P+V[wƒp‘| K<‡J)ƒj8A
ƒQ‚r‡~%%Z‘` $–)µ‚<0¥}F•ƒ\—K¢B ¸9ƒ‰2        <      ½
sƒpCƒK¾)3)v8A
W‚r`%%Z£}Z…·Lcž}N0Öw ¯ƒg‚•Ò]Yilerƒ‚Epl‚
‰CŽ{”õ;jangl‚d…,8Cš+•Ú>ƒ_,8C…{m
‚-H†)   8”fý
8ne‚3ogi‚†e•Ú…+k‚‡l!@MC,:v$5 ke6nDO+‚ƒ
…3
áV
ˆ`;’ú‚?‚ßH
‡&;id‚ƒAêEmark‚7‚’û#‚lƒ
ean
FŠUcŒX†sE„n…[,GBc4-J2„JˆZ
‹<‚\)X'‹…wNƒ+
‰ …v‡$Æ'¼l¾>Ø„j‡?´       …AaŠeÁ4 p‚pˆ   …Z›8‡o
‚
        „C„T‚0xäG       †/ˆP'¥z-jšUh‚[Šg„.D…lo„C-H[KVHƒw`
CNHl„e‚‘$
‚5µ5‡…r
4T±3'¼lŸ…v(‹]+)@F(."„f7)XoE‚
(&
Y
""ŸV˜€€€€]¿0½`¥…!®²>‡i
WŸrŠR_
m"Ã$ §+¤Tbœ‚*‡k
h'—§
.NÝD
‚[
      
£B0booleanexpr‚•%…_stƒ•k‡W–¨‚re‚;ƒ„>F“šB
hFland‚R
…interbas‚„*nb‚…ƒT”ôQ/sch‚.3ƒ.sŒf-†^W{thds‚`…'p!ƒ!oƒh‡6›G
†.„d‚‚mˆ}ƒE‰.„"Q76ƒ
01‚!‚…,„I5A‚v‚1
‚…‚,‰q
…h2‚}:„f
 a†Œ
†K†G‚  ƒ,†`ˆ;‹*„1†0„:ˆ3‹œn„7¤w~•‡FŽ{?†ZTc›A‚P‡20¨8…B"8œB"¡
‚dŸoXƒ„AŠk
†<0Lj&ˆ*‹~‹]‚6…Y‹Z‹=I”Ž=…"“u 
Ž8J
R†W†
…ƒJ”@²(m‹"OX2…$…WŒZ„A ’!
‘t“^Hƒ6Cƒ!‚ˆ2!ƒu ‚^2J„>
ƒ=]'ƒ)2

‹*‚E;,ƒ„GƒB‡d
„,‚`‚……6\
…{+‚„/ˆy‘U)
ˆ ‡ƒ$ƒ.‰ƒJ„ƒNŠ
ƒ`‰3†:\
Žd/;lG‰ …@$‚I„!‰}—l!„8Š&s,„c…\uŽz„
†5j‚S‰d‹F05“ƒ,-†!$ˆ]$‰?&ˆ:ªN›0‰ ‰‡=w„Œˆ@ƒ 
—wŒe‡p†|‘~‹/‚IŠ…l‚^7r„pƒ6‹&,u†#’.„~KZ‘]†Nte–3‡#Bƒb‡:ˆw!‰
Œ+
"s’CR:†HŒk
-|2q\ƒ6„p*še‡‰##Y—^ËL¢%Š(M‡  Žq„gB…7ƒq_‚]k†“tˆu”Ir©iœG„pƒIz‰El…T‚`X†…
lƒ\Ž÷X‡\?J
^Jc§
mG‡8‚a~…‚‡\?T‡,_        {‡yP0“j…B"8œB"¡
‚dŸoXK‡0‡e
H&OZŠK6VB‹=
I„…"1…^‡"J‡\PW—8
‚}®°]‡gz        !—NQ‡”
‡{
{“8J
‚(Cm{!x '21P>
U'        \®O[Ÿ;§r‡h
ƒ     +åG ‡f6‚x
a`§<Ÿ$‡‚D$)        ‡Xg„!7
gKQ¦_e"/LD‡k¾h5‡O5‡Y‰'@-9N‡`%WU
‚Qw‡„c‚b‡jK—‚K‚(…l‚^‡a
‚r‚CQ4‡bs46ƒfKZ  
ƒk
me‡†‡`§d‡g C'        
_—*da}n6žl*K\zŸ-„$PMƒŸ!  B‡cƒq*$0"   ‚nD%ƒr   6BO‡fuŸ…er‚‡˜S—ë`Zsom‚…etleneck‚omŠŽN‡aµAƒN‹R(ƒ–[„kW.K

…|D:’Œ=Ü sÆ0õ!‚¸$
H
kA.K
«f

D§
$Ú‡2und‡# <
Œ=q)q
j
U 
…
7GB
ˆCx&„*ŠD*cƒX
ž!'‹Lƒ    ¨
‹ýfzƒf…,‡v
4ˆ9Bˆ<"Œpƒ«]†Lˆ$%":
Š"†<
{'Fˆ`@#:O.
-ƒ‡ƒ.„SM‡_c
ÆJ#†Eƒ1¤z„^‡{ƒ{*‚d
‘Æc
|ƒ7XŒ,x³i‰{Œy…-žJc‚\œ-¾\+Žö„ c‡^§F^‡|9Ÿö6Ÿ7:f&í2„Aˆ9B

"Ÿ?‚ivåE—%
¾+#:O!
-!
`xMu‚
—VÝbX—37@ƒ{*‚då‚`;žÕ'xF—‚‡|
 ‚\s
¦`/ari&
ƒˆ"9ö[£t˜|^†%m1‚[
fŠ4Z
      L    :5!E6F‰
HdR
F*i.;
$—Y
ŒP“
ƒTƒFƒBS
¥5&ü„}üfL%[gƒŽ!d
¾<&T
      L    :5!8E6I"H*F*i.;
(„\‚™…6Ÿ‚K}Ÿ>x˜]‹Z(j‡qnl
‰        
‚!$‘J+…A‚S
""ŸV˜€€€€^¿0š:=‚        žP
‘R
Fˆa@#:O<-ƒ‚`„-(„SM´\‰$kƒz*H?=º.z‘·417S‚™0Æ&
¾,#:O0-
 ‚`"(
ayM‚öwƒz*H?=!Yz
0bpurgeablfƒ017racez
‹-ket      |`U¾<7in‚z
ˆ—†bnch’dÒdƒrX?(
KAz$fƒf  
Y$xa@m
×95hWYY“b…A9

00‚RU!E      


,F'„9†Abd
…
Ê?.%„lš ‡c˜F@‰’-h,‚KR‚=    3
H„ag¨%—
‚
ƒ¿ƒS}ܾ”/V?"
KAz$
2(     
Y$&
e‡e
’t5I
 Y
A7

0&
U!E        


,F'qüG”:kb„e
n”‚UŸ(
k@"«e
-N‡ R        
    3
HS{å…each‚„:dth“L"_J‚£•:”Õ…k4l‹gˆG
V¥^‹:

3‚ƒ|ƒYŸ7‚3’Eˆ†–|    ”6¢OA‰ˆž\Œ       ‚i‚iƒ"     †Dˆj„z
2‡Cœ)“@‹ž=w…/‚
¯9lÇAŽÅ…‡`zŸí)?:Ÿ
‹             &‡#A‡jê0k‚RÎw”N¾ƒ)§ƒU®juõsí†a‚*down‚·
q$ƒ
@ƒ„~„cøŒd†ò‚,{@
‚7er‚†\“Ñ out‚‰,–°2ppointƒ
‚V##*viti‚¥/“Ù
|iefk
f…rS
ˆ
hŽ&'{
™d=     šd@       RdŠ1ˆƒ5–‚ ŒM
…x¶Uf„yÝj
‚     —/Æ„„„=—*X¾D,li‚¡6¸ng‚ƒTŒ…LØ/†[ „
Á`¨}ñ
(§O…íj   ¶OOoadƒ{—µcast‚‰terˆKŽÿ‚tli‚
‹{ken      ‚eœƒdvˈ><‡R¿'_‰7!†rŽö|t‚†W‚×Q‡…p(\œüu       ‚¨vok‚˜ught‚AF‚X        
®G“Èj@wnƒ’X?—Ì<…?serG‚E       †~ƒ,>µ@‡#‚<P‚`P†
N‚ 6‚u„9ˆt
‚K>—W5u„¢pF®‚Puce‚‚\sd‚*X…n”õ
Ps…z—Dt‚scf_validnkei‡—‚Yovfl‡—‚Zursor†h—‚2reex,‚X
9".$[&5 

f™YŠ7
Z‰tŠ.‰vd*hQ…k
*
ƒƒAy
!9ƒYgƒ&$´Íb"L‚<.
‡4C
ö+
¥~ˆ1t-"¤2Ž8‚V
9".
$$&5 
Îf…Š7
Z‰tŠ.‰vd*hQ…k
*
ƒƒAy
!9ƒYgƒ&$õ²P†¤VJ.„~‹Dˆ1t-"„_‚ÛÝÆKblobkei‚¤RÝintkei‚¤IÝ{
omit_journ‚Û*ÝÆ\singl‚Û,ÝÆ^infoƒ„˜Áƒt‚…nexty
‡.—6
‚g.w‚‚—†7ubblƒ}¢!cket‚8®%V   14      
b+

×—ûH
Kddi‚·“øŒZ†ò‚getƒ’_—ëkffer‚Eq3
"„YA
"†pjD
4@,‡0

†QQ?‚6„ai„_9Ño„fŒ{ƒºæ‚‡V…‹pc•#‚p‘O,V    ~†ap…M&„ -ƒ+ƒ        ‚8!ƒƒ
ŒƒŠ/^JŠeMŒy†9>
q41‡ƒ_›>0œ ‡
µ8ŽP
Ž\6¦S
‘<†£„0ƒ[    ”0prŽW&‚L‡f„)……}Rn'\…’l=+„K½Nh„f
ƒ,¾QŠüY
‘c(

6b†L]i‚¡‡tB‡… B#„E
‚Y6‡ƒ;Ë,„Ž)J.
Fa~Ÿo‡d
CdMQ|n'\®k
=+g‹*ˆ_¥zŽfm)n†v*Š1Df‚vëm›Q‚7„q
s„B
\hN‚x„9—U’W@Žvq#S,gx„ ‹$ƒj?>F[)%13
z‚e0QW7        )2&    ?$ *gƒ^*U‚=‹Sƒ\†rƒS‚†Lu     …ƒY…
$ƒS?
n
 

‚
5"…
!!ŸW˜€€€€_¿2Á!
‚†-J  0-…O,!,Rfmb9#`‚{56^Ja:yI%'#
]‚P7~#<iyRI>)
?#)uŠO»7-…*„–ƒFƒC9P6EK$cX<p
ƒrI‚QB)}ƒn‚v"Wc2OFD`E'6‚%%„F(
ƒ!.„<ƒ)O#nJ.S„E'3D%NC\"vƒ
@-
4#Bo#9[21Vi‚}7‚%"tTVO;"+J[(Dn-Z]gF#‚
a9w‚E2‚Cqp‹6'™         ‚±Ñk
†M‰L‹,
‚Œ)-ƒD‰r™'2‚ƒf(ƒ_’;H! ƒGƒsrZ‚';†%®‡uŸzW"
Dwf$‡*
)Ý8[‚32Ÿ
‹‚
'T
qh1
,gG n

y‡
6F‡fX)%1
G0LW7    )2&    ?$ *gƒ^¤Æ+‚—:W®j
9#)oˆm'.-,=¶,åH1P9B'å4e—‚‡‚#®M
8+ÕxJ‡n_®‡9¶UdŸ (       H! !
rr0buggi'r‰¥‰
‚ –(ØI•w†aÙbOŸ‚(„Ùi‚‰|‚$(c(†{ld      ƒƒb“F
tU4G
‰]ƒr`ŽM†/!8(‚8•BÒo      p„-
:)˜BG--g*h‚<ˆp
ƒlDr™Œi‚J‡h8[/ˆO†3+ƒBuy…*e'.Yl‚3WK;eG2,…uuS†fV   ‹†„])„8J
l‚”†z
,†1_›eE‚1] ‚e,…P
‚Iˆo„(“&c%
‚H:Š#¦}ˆ¥#†Iƒ„(
2.).aL]  
EdŸ‚{m„# …

bGb‚‚a…Qž+(‡+ŽX.‚{†(§@Œ9K„mƒh‘|„#m…8
¬
³W—Oˆ0!J†\Š‚3‹@_‚C„YOŽþ\^¾A8$OXtÒo        —:‡jBW‚;‡J4ÕwBŸ%ƒ‚J"†8[/ˆO†3+C2‚duy…*e'.Yl
WK;eG2Ze
$     kVD0ƒx„8J—4oœc®Ÿ +à —+
L
—'<).aL]r
d!‡^"K

bGbe‚aƇ-Æ)m‡+:%q?H       ‚¦‡¾=6d
 !žu
‚@‡a3—=n<=¾(M01‚y
ˆw–þ3
‚]33‚yˆ`A–þ3‚FAer‚ÕCtˆ&1‚6‰†T•
–u
n“Y
-[ƒ{+\&
"‚{„-"‚$ŠU†Z*
ƒB      ƒ)…=ˆ>lhŠr„}„+†K„0   ƒy_˜V,‡”u‡  šHnˆ»!
n™ŸJÅ;„>†P 2Ž‡]ƒÎyŒu…R~ƒ\/Y#'„9@       †o‹q†v>
T‡
_"“$…*‚ Œx„dFB‚z„;ˆn„
JŠv
—'
„5‹[…%ƒYƒ(1‚1sIŠ"‚~….Œ…U     ‚'ƒ8ƒY[7   2T"”M+<&ƒ+,‡X´

+
v‚„!‚%\n?„H
‹B%`/³   R
ž‚ ƒ"‰)„_«„n
†k
‚W¬FØv&aZB
 > ¡+(–
’g‹'–p¦…$ˆa
œJ"ƒoŽö
‡kn
"GI—?P_%‡Y1
n1‡+—9ŠAJÅ;K‡h0‡eiH_„.‡IÕ{<—8l‡Tx_"’

:‚ˆ/Œx
/B‚z„;ˆn‚
®œ=ŸG¶^/Ÿ„JÆ'‡g!‡U5Æ(O"$
+<&ƒ+,‚
—%
‚D—6M
‚:X‡ƒ4¶X+%`/
e‡Ÿ!1¾?‚ ƒ";ŸÎ ZB
 > ‡ 
—@—
5og"¦‚olk†d127);’-‹‚NÅ-2ƒ-X'„øElet  ‚,†\‚'—x9‰;’„"ª>‘1Ž÷*„²‚x‚¨…T‡ƒ}nch‚†b‘þ6cdl„(…‰2ƒnƒ.„}ó-
Ó_•A邃–ƒÍ-—(rden‚‚G‹v—ë‚eaucraci‚‹U‘˜|$n–A±VK…sŽ÷„áƒ$‚‘ƒtsi"‚Zf+G
@
ƒ?S)X
B
w<  <:‡-fˆvŠG;\\4
""ŸV˜€€€€`¿0!Ì    9
J
 M%Md
'
)3"
Šy$ƒ[E

‚q0
‚
gƒŽ%‘d.`:„lŽw+‡eK"ƒ\ŒJ‰
É|A‰k  ŠŽC‹@‚3…2Ž+”…H…ŠQlƒ!‡-ƒRqÏ{F&ˆ&‚(<Š ;
F>>    (ƒ'ƒF2   
†~<…Žöƒ^
*`:åˆIœ
…7AÒr
*3ŒVP‚þeDFÝ"=F2         
†~<0busy_handl      ,?S^SˆAŠuVš5Š?Z8    ‡—µ#recoveri;(‚E„ƒf†#—µ‚
†#snapshot;)‚
‡ee'„ƒeˆD7P—µ‚ˆD7Ptimeout;*N3‚4m:ˆCŠw–MH†>‡(š>‹x     „ ‚–׆>Ý`
t t‚`'6:b?-]/5ƒ‚0K‚…'ƒh4ƒKˆ6ƒpoZjŠPˆ,Z$S.Š*]!‡/’!t,h`U53)…;
ƒ=
u‚?†H P‚„<‚?ƒ0vpL?ƒ SgfƒCjƒO‚R…p‚3K%ƒXƒ"‰ƒ$ƒ Œ>}‚z=d‚W]‚u2;Cl
‚#&e…#)eOc$F@
‚_
e†Kl)Hh
G…|Ts9LRH-@E|~/23†   
I   iƒ
:Œ>A^‡v((E‚`‰sˆ$‚U8‚wPƒN‚O  =ˆY‚rƒjƒb‰U
T‚k@ƒ:w/„Z_6G Dwk‚†4O…K*‚-‚ƒXg„@4‚~^†9‚-
‚Lx„%„FA(4ŠyA…Y#LGŒwƒV„d„
…ˆ&.‚0$‚S‚ƒf‚A…M‚LƒYj†s†k†„,‚\‚a‚iƒr@>…e‚#ƒŠ84‚:˜7…l„]p–vOƒ
)ˆ :„QVŒ%L‡]†45(j†„CV‚V†+ˆ,ƒMX‚gƒ
†`“>ƒ,ƒ…m‚>‚]„Hˆc„aƒYr‡‹„[U4†:5z4
2iƒNQƒZ6*Z!V*2L:‚8Km0z‚„6&‚F>„\>†PF†y^T…/„‚XZ>“W˜D5‚GVƒ
oHƒƒW^,‚
‚dƒ)+Š„H…;XYŽ}‰‚Cƒ<hƒb/Ž
‚mƒ"]g‚ƒFK|„‚?3'4(z‚TQq)1,‚;/C‚)Š}ƒ+@
H®4gEeb*Q*=4‚"JRb"„1oo&Vxƒ     ]+,L-‚M‡j.$PlKI}D‚KLƒnƒv@‰$Š4†ƒƒCŠ%ƒ"/$‚~1ƒa„OsŒDah8KJd‚ƒPˆ0ZƒZ"ƒ1‚t‚k…L#‚ L‚:mj$‚ƒJR‚>7+J‚p&(F‰8y3BƒWEƒd}ƒ
=^L&aDWjjP/5uP…f2„`rrP&*R‚Gƒb n.Œœ$XR‰u‹p‚%i{fƒ
‚IL‚„Rmƒƒ!t&0„]{„x|.\&
<ƒ1l[‚$‚d{ƒ[$„X~4‚$„+‚3f‚"ƒ.&6ƒ`g„><p|77tpi>I2@(‚ALJ}‚<
Q‚     D‚3)7W18+f,ƒ'ƒ'zk‚u*I‡R‚‚u8ˆw%†uƒyWJ[6ƒM&ƒ}„V/Œ†N‚^!}‚5t,Z‚(ƒ‚f‚B#$9!m„5$Zgf<tƒN‚mƒ„O‚7fu%ul3„)>1zƒ\MbLf_i%‚-i‚Z‚T„Kd&‚
)‚1‚l‚.|
R-`pˆB‚^/‚o2‚+s‚d!ƒ*„l6O„L+‚bRj‚V@_,$‚„[‚!‚LWJ‚W‚Š†‚ F‚3ˆ‹S‚LŠ‚G:‚ƒQ‚Eg)^e„‚‚?}ƒ71ƒEcb„p‚EE‚?‚‚Cp„_†A$‚‚G„U„$†w‚dƒ6\ƒ5k‚^<…w„†O…2ƒlƒ#‚‚_I(‚hm%<.?‚9$!
Ux…<)ƒb.‚[…‚„y‚VIhQBUp:‚x#n66v‚{%p„F9=ƒS„f}‚xp-]‡5H„ƒ\"M"b
y„96 ?h
†H„(,/‚,„-r`eUbQ6‚T&;‚](z„N,‚:'/Q[
‚P‚el<;yKqZ…t2ˆoNK!„v†U‡ †‚-Fv),‚e@1yg
D3#ƒ=^‚Q"BƒN‰q„‚Fƒ‚h-‚.SXƒV…X„@ŽL‚TH%`=‹u†=†#PˆrƒO‚[‡ƒ
i‰7.‚p…^‡96ƒ$‚-‚m9:V5j
CAP}VC‚':+^JD‚7„Z†!‚Gc\‚jƒ‚{{‚>!„&FrV‚;/JH)c0‚%X8ba\‚M‚\JƒQZg`4ˆ7ƒM(ƒU>i“%W‚z‚K‚ƒŒ6‚L‚s‚wiƒ]'AYVŽrC0BA:'A‚w‚TŠZ9Aƒ)3ƒ*ƒWL‰Y‚}C-‚57*-Eƒ!)‚dƒj2ƒ!NEŠ(*‰ {XjdVRƒz‚|ƒ  ƒ
…
Yr'‚S‚%‹3‰:g5†ƒWŽ;‚`4‘Wƒy1‚g”HŒZŽ4‚-K§ZŽqOt4@‡f‡jH‚]ƒ,‚pƒ2…oƒ`N…)/‹/„D‚v…„&’HƒAHƒXLL‚4‡I‚2„J‚VtsTY„‚i‰E‚3<}ƒ%‚3ŒJ†4B:‚W_„‡X<5[_X !‡`ƒstˆ}B‡l—"‚4u‹-ƒ>V…h@† ‡†S†\$:„)
„Y4†{‚?VFgd   ‚Zj>Sj…
H{kOV~w.,q@†J[1‚j…ifj‚+R‚lNT„ƒ.M3Žös
u/;6GFDwk‚/
4O‡‚+t‚-gƒ04^i‡QxT<
TAƒ
'F‚f]ffY‡Z@/k#ƒC+4r
""ŸV˜€€€€a¿0ÏvÀAT‚
>
2@,
o4!
-…l
Lp‚
‰%>ƒ_‡6F(
ƒ%`
‚Q]‡dDOb…tV‚V†+ˆ,ƒMX‚gƒ
†`“>ƒ,ƒ…m‚>‚]„Hˆc„aƒYr‡‹„[H
K2ir.z*Z!V*26:Kr‡Z
Pz&‡p&>ƒM>
…xF‚^T…/‚

Z>…eBG
"V-dHf‚^,‚
‚d
‚6ˆ#T„‡C
IXY   r‚ c‡‚c
ƒ2/—
#F®¬<‡gt
e,*
3
Z=
%‚"
!R1+‡iP
‚N.wP‡cfI}D‚KL
n‚
v@‰$† ‚ƒCŠ%ƒ"/$‚~1E„OsŒD-<8KJG
tƒP1
k;S
B"
l6#‚       LK&2$)+*
J2&((ƒ[y3‡d[‡gA‚/lMM
=3ŸB- §j‚ /D‡e‚u%¶T
76zŸ!
L<
_|‡5‡g>I2‡iCTLJJ‚<
2D—2O@s18+O,Jh*O\‚Ÿ„u‡hs!}O5tZ
‚(>

*‚B}V
!m
/‡XgA<tƒNgn
Af
>
0
3Y>dzWIH‚Lf
i%qi&3?Aƒd&
c)+,|¦Y/‚o‡hJ
%+G‡X¶YIC‚87J|F`‡‚)
0F
23‡b^‰+Q+‡Y!@1II
U y4v {%p9#0p}p-‡b
y„lH
[
V
‚
6j ?h
‡iƒ—4"r&;
.(@
V,‚'/[
P‚el<;
qq<E‡[
‡5N!ƒ
v‚…$‚jFJ|@1ygvD3#/&‚Q"‡‚6&„
3ƒw‚.SXuv(‚D‡R
#`=†ƒhlP…A‚^O‚[…C
1i
c.‚pƒ4g76‚i;p>LV5jM{
$C
]'‡e+J-L‚bƒ‚Gcw‚Uƒ
{B>‡X
qŸ4'‚ƒ.MJW^‚‚
<w?ck
'AYVHC0ž+‡E
u*‡kX dV_‡‚v‚o—YTr‡jH‚‡J‡fTRfEpr‡/ƒ,
a‚vw 1
]
2H"L<^'.‚y—*‚\W‡ct
o‚pB:o_X?„.<[‡S]‡O!MSt
B„l'‚4ueV‚42J94K
:$4P2gd      /&Se+
_k'@,@E{]—"fjN&+—7R0button"`…E „]ypY|_

?1ƒX$,G-.A8%#5+5
( 02<,^3(. ;<?'<' zkƒ… "P#O4SK‚E]B
,‚ŠA‚s}jjK(
/Z
!>ƒI%]Tow„];‚A
.M'^"* F
@;E
Cm,g‚"ƒ#‚.,<D9P
-   B     +‚Kf'p*
$&  9%)^)cc* ‚iu(
‚<AQ!R{v2‚*9.bp;„vS]#VL‚       ?+9
~/07f|G;
"‚Dƒ     ‚{?8
+'
uADf.
1i
?) 
u6(77X
PY‚OP+„mC‚4)qw†J‚$ 
‚Ojy'=TYs
a#<
†/‚vW
vƒ9~KVGƒ
C     3,‚1n8%?"
       H  2
Z;x)n
L*S
9‚
5F(<k7
8\
YS


.5O
H
A< .0

)$1Y7
6<wX
R
&K$‚-w d(9
0={703
K,+-   U
#U.CT69U|0!F76wLd'_ki:])#d(‚lXk*
‚ZmP:4‚U\-
# R‚-r,‚'fDƒ$\8G
{W
   
d
•|
""ŸV˜€€€€b¿0Ò8?‚`*P.321WUW53h|`u

H]b
0
!…4.M%!ƒ@q
E
/>@JDcv[$wR   ƒt/P‚f? f
"$.
‚}um?/_     D1$%=/]?

'.i$HB

98"‚ bg$Q
< ‚>m„u*ƒvkv0P>

 
*6{6!'$ƒ  ‚d
'78:N"EiG~["
&
:+[\y1'        LVKWY#"p‡D  Yz(
KF*

.E#}E5FV  t62eq    k_BX2rj†4o
ƒ#>L;‡118#]jHƒ<%61‚BF:q"‚W*?H‚S=+„v
‚V]  z5./>h_65
sSƒvz#T<A]jU‚G
2WŠ$c&ƒS0P‚5ƒq  amZ…Mc5.)WtU}#Y
J7*8p$ˆ498)%x‚7                                /‚†K(VG+%Bv ƒ:@‚g
/;;SH% n  Y
ai"2DOv‚K„\ƒV@9Jq2             
Mi D„z,\0I;ƒ>6":S'; †,VKpE)/&2‚Y?"t*l‚4Sl]X‚,‡ (S&‚N‡‚!‚ˆ       33%?N/Sƒ9NB‚ƒ`H   4k>L.'+f{nA&6X}‚2OY‚yFV=5_5{B‚#Y$.X;‚‚E5A SUB&JGOw‚Dh…O‚9‰\q‚|,CuGH}"S5P|44ƒRS„(Nx!‚du‚CRPƒ/2„„T‚ƒ
!‚V!‚dk&{9‚`
T‚.„n':  fJJ‚>ƒY‚Tƒ"B[-ƒn‚gN ‚B"l/qZ40)‹'Q     L‚-PX‚a_B‚v<Uƒ@‚: A9k…ƒ…q&‚Rte‚I-‚|!†P
‚…ƒ‚xr
vƒrƒI‚o[L?S.  :2doƒ%=„7t‚dsw„CEƒ(kDJƒ.#‚?Y‚F>@CU
ƒD(T
ƒij+‚O`ƒ%I‚T%gu/(^DG(‚*maB‚[ƒDˆLMf…R‚@‚,0a_p…M‚v8‚yIP‚6,        o‚A^h,?Zr†/‚</1C4l‚*‚"ƒV0X'''.5'''''''''GN''''''''C'''''''oZ7>'''''.‚<#%vBƒa‚]RQƒ‚k5%„/CSH'p‚NU(‚WiRdB.2^   d[S^K@YI"VC]6(

U94(=¬+c/Z)k((*0eP†&",^O<&ƒ,a*4cƒ~uY‚&%,Qym‚iƒ^‚zS_„ƒf‚4|
`h(L‚‚<‚y%;"WZ%+M1>i„PQ)3P?#Y2?EmT1d‚U<„'I‚px576‚QE*4
-‚&
NdW:,^/?eu‚a‚I5‚…c‚^,*…tk: 2.-v""%,&d^;.v_`b{a*i^6:51s^:5%p0†B>‚Q‚7]HRzn(@Y/4‚"ƒBF‹‚.on‚qD‚‚u\IA
J0Jy4y„W'7]b{‚VN‚
++49ƒ‚c!BNpYT:Šau&Y`[ƒK1ƒw'0‚]B„17x!GAY>9fM„s%
(
Q   

‚?‚_k0s/‚GGP(‚O‚‚9*n‚).‚2I}Oƒ@‚E~&c.B&h…@)-#.‚@V‚       „p':„R~Cƒ^‚>~|‚gUc‚      >1‚‚g†T,oƒ„^h‚ZY,NY„30D.‚> ?$HB+G<‡W55ƒ$?
U3w    k‚)
a%   YG*7;j‚‚'u[a†Zf+}„<nE…(a„Q^0Plt‚ƒi   %o#„>$oP„|,‚8ƒ#C]
ƒl@„.„O:,]L~D…f‡X2†4/"†i(^KX1&ƒ4St`'Xyqjs^p
41)H‚tn‚$i;\
=I665&,9_(h5(     D&
;JYT56ƒ7I‚Dg=coA`„C‚mt†ƒeŒ~‡B[ƒ‚u‚|‚ X46ƒ+h‚gE‚!(…mƒ ƒC)
0J ƒ!"`)^X(0;r…*V‚Y{Iƒ3
‚UF6e‚qu06†7ƒ5=g‚ O‚K#Z!\NJ9O-F=:&‚fx‚4VN7‰J)ˆ\c-m
\Ah‚cokZw;l‚
B+Y7=‚5%‚!2%;a=ƒ‚*z,#5:       
&k6/D)
M?
S
Da       2&G&XSXvF+K<;     *%L$/
-190w      j*
!-‚kPVƒ]„…4ƒ8u
|%$r0S‚j+„@‚F…+‚5;:"ƒsB)p†HJ"‚rs‚87‚=e‚O‚     …6†P[‚
0_"0ƒf‚."‚bL6&pƒ‚,3"Z%*[!&sƒ=J‚/0""T!3Lu
QKO(‚V(Z+rˆ
Mm‚p!$I,ˆ‰q†6(&8v}‚jƒ&V‚5JL‚#‚ ‚|O3)J" 9779*,              [‚=RR
bƒc@‚
‚nƒ3ƒ|-,ƒu+0R `?@ƒi_1\&J‚x‚EUT…#ƒj‚/H[,/†/ƒrzƒqƒd!‚+>"$1‚"ƒW‚lv…/„07Ž.fZ]
*:…#]^ƒ>      '-|*~‚::--‚r=>dH+
‚*6x‚oMoB"„5„ 
H7„rƒ
$!
‚A9L/ƒO7N+
‚V‚eƒ‚C,ƒƒ
h4+†pƒn‚s#† 0f~WAƒ2BI
)A…1br0=ƒ'ƒ;P8A„Iƒ9ƒ7[8„‚$7dT(†P‚UIO38!&:‚_‚:%_‚ 3TYTZ
-?‚+Wƒ
ƒ9wƒ0eL{ON-ƒc{ƒp'/\"$JŠ^v†%RA„ƒ5
""ŸV˜€€€€c¿0Ò‚r ƒ5‚       ‚J‚a‚5[?‚n9‚‚J‚n1{‚.‚sV„lLWaE       B>"ƒs7G<!?‚C< 
F

BiFbXƒƒ`|.X4#‚'=#6uxktT:%M`O,gdƒz„7‚1„ E9-=1Hp‚Bz5r‚X0…"p‰ 'm-‚>‚j    ;!j‚gcƒcƒ#T=‚       ? J†I‚DlO†jx…‚xy†\>-‚?3Sƒ  UQ‚       !*&8_ƒI
1ETi‚``…‰K‚IL?.L„1‹h„&f†r‚RH…7}‚:'U…7‘ƒ…8/jœm,k‹ ,+3a‘C"!IX“AY0
ŽLQAC"9J/7F7-„h‚#cs,O<JtnN‚/=6ƒ'62n$U„1O„?0
7„",:P[ƒM
„<‚*
f/#,„VBQ„&‡Hƒ„‚8-ƒ,‚+…T1A‚*ƒBƒPb   ~rƒj`+dA
/0…(.ƒ$xRj0F‚Y$P|„Q„~ƒ<HW(Up q‚\<#`9‚ a‚ AV‚15;o.ƒY'>mZ:=8Murk‚vjZ#FFvAtHV#‚5*>ƒE
w„hTƒ.†`Š]F…#M%'$8|‚! 7….‚]#-3‚rN,Ui]BCos[9
&…#‚'|g-ƒ~%

‚x^xKD‚0Wr
bX‚QXao:#?
(%}
#‚bƒx„l…b(‚BƒW\%$CYmJ‚HƒPRK,<X^9ƒS
‰%PXy7‚dKŽösX2Q"4o

>;ƒ1#]O‡\%61+Fq"
*H
q=<f
‡`[] ‡gx5
_/yh
Q6‡5+
)ƒPi#IYWtU}#
=

.7K …))                            /js(-G+% v ‡U<‚g
/;; 7@       
a
"VDKH$@9  2              
M% D=,;0I;"2":S';j!6Kp
-/%

‚Y""t*l[Sl]X
0,…(S&1d!I033%?N/Sƒ9NB
#6    +k>L.'+‡){n+
&6C}\‚2OY‚PFH=551B‚#Y‡_
.Xo
E5SG>Fˆv‚0‚|,CuGH}"S5P|44ƒRS„(Nx!‚du‚CRPƒ/2„„T‚ƒ
!‚V!‚dk&{9‚`
T‚.„n':  fJJ‚>ƒY‚Tƒ"B[-ƒn‚gN ‚BRwQ        L?-‡]pXR3‡;Un A9
#ƒ9& Rte‚I-^!K
EƒX‚xr
vƒrƒF‚o[L(S. :2l4,=„7t‚d_%0z(MDJ‚I#‚?Y‚F>
CA
-(T
ƒij+2IO`-I6?%gu/(^DG(‚*ma‡>%/`f
b‚,0)‡p
M—7j‚"ƒV0X'''.5'''''''''GN''''''''C'''''''oZ7>'''''®m$¬+c/Z)k((*‡fc@ ,4<&

‚,6EwO‡aLS!@4‡^ 
`h(L
%‚<RO%;"WZ%+M1>i„PQ)3P?#Y2?EmT1dD<„'N?‚px576‚QE*4
-‚&
NdW:,^/?eu"‚I5‚…c‚^,*Jk:0
S>*
6HRan(
/"31!o<L C
=I<‡eJ‡gGy
iH
V'7Ob‡dV{‡i?N{
‡)UJ9‡gH!7#Ÿ7H!7A
~
^‡dH|g¶Tr#g    YG*7‡j—7Yi6‡bd+‡h`N
‡c‚,aƒL—8)Kl@

‚8‚C]Ÿ.Sl`'6y‡
jsp41)HIn‚$R;\A=I665&
,
$h5        D&
JYT,‡W6‚z7I‚Dg=cA+KVtBkU:A6z X46T
,‚!žr
.J‡hƒ"4
XK9      u‡d.;5=T‡V OzK#Z‡e®L)c-|
\Ah{okZ
;Hv‡VJs
N7=
qG2%;a9@‡]*'#5:       
&f6/ '
M?
S
Da   +&G&XSXvF"K<
3    < *%L$/
-190w  j
!?-‚kPF    2
""ŸV˜€€€€d¿0Ï+”÷a
9%&3‡U%*!&sBJH&)EMm
‚!J%‚W(V#JLx;‚|O.)J" 9779*                   [-R
‡\<K3‚In-,P+0R‡e[
?@   1\&J—;:‚/6[,/mQ‚UzƒqNT!‚+‡[
!$1N"ƒW‚lq„/7YfZ]K
ƒ:]w>      
V'-;*~‚V
‡_-‚8=>d+
Z6x‚oMtB"#„ 
jR$!
FA9L/ 7N
‚B
4
‡O
1       h4+/ƒS=#‚+f~WA‚BI
)A‚#br0=
‚
!‚*ƒ9[!i$7‡d
(‡jP‚Ÿ:E%_)‡d57*-
^W 
ƒw,0eL{ON{‡\'/
H"
w

‚J[H‚J‚n1R‚a(lW@;   W<>"'7G$0F
=

/iAX0j.^4#L=#6u!$<hT:%C"'Y_ƒ3$1QžVR7! ?‡fHw‚DlF)‡Z
?C‡\
-`3Sƒ       Q}!
!—5U‚`P->T‚#cs,O<JtnN‚/=‡b4G62#‡dS
0/7$‡_7P[
"
*
L/#,BQ‚
2H
‚x
T
ƒ,a5DƒPI     6D\G0—.ƒ$xR_0F‚Y$1‡b
ƒF
<
W.Up G+#
98a)
V.;oƒY'>m:=‡S
6)‡f.j
F1
*ADHV#
*A
‚*
0„hTƒ.†`q]F
M%'8L79‚]
-3        N,Ui
.BC&s(9
&‚K#‚'
g(% pxKD
'W#M::#?
(as#!`?Y‡G#
-OROK,<X^9—7V0bypassg…v‚/„£Q‘i¢bW
Ñp0H…‰pøic‹†Ók*—‚a
¶‚te,†!n/0
'ˆ
ƒ‚Q‚…h
š-82=_
ƒR9#UE      =S4uAƒ!/qd((@
Q‚ /*
;L2
+86 &44'K.TG‚w 
}xd      
Œ…Q]]"(T"U1Vq"1          P"…=,-'1YJˆA)B  MY"~8‚X‚
$
:,¢J‚Q„ª\=ICY^›jfŸu²‚mr
n“

Š  !‚<6-7w ›:nº6~’c>˜y)`-@‚#g
‡m‰c•fDBš
ˆ$‚3ƒƒp9*"=ˆ3
&‚y$t……;†wLt(

(

(

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
(

.

.

(

.

(

.

.

.

 
 
 
 
 
 
 
 
 





(

.

(

.

.

.

.

.

.

.

 
 
 

BK"
T
       
       
       
       ƒDf„‚1‚]PˆN(,C‚[zƒU‚
‚T>
†N
#…˜k$…w‚[†!
‰D‡i…mOJ5„/‡J‹‹N]{F‰6g‡]†[:Œ"sƒt‚=Hv`ƒG      $
2sƒX†}‚1ƒ;Š"‚)†Kfƒ&ˆ‰@•\ƒ5„„#<ƒ2fI…U    4 q‘"ŠQ„b„/&‚y
‚S…ƒp‚BF‹Cƒ[n#  
,J""^    –MI&Rš‚K†g‚"T
„„E‚i
”*n
""ŸV˜€€€€e¿0Ê%‚g‡a˜gx
‚9
‚
Z      y)G      X‡:Ch<.mkrZu‚%‚KLh43ˆRƒb(I‹)ƒ;”u;†[\…G8ž"  
ˆÀ%ƒ7t&m6$ƒ

U…f
‚""ƒ" |-dM%…hHH…W„Aƒ4
Cƒ;‡}$/‚4#[QB.  ‡%2‚pz
!Sfn(/K? *(vxv
b‚DV%m7.dT&R…(?j( + 
$X
B*'*@      
)>

7"$#$<
-e?##l ‚}i1z‚      ”eŽƒK
{9'†|,G QR6          J5Q
  
X‚G„dŽ÷Q—)‚O/—6AQ
.^
,‡f
ƒ|q‚mr
ƒ;%

2I       !‚<6-7wžt †lnº6~’c>˜y)Ÿdqg
$‰ƒ
4DB  @†3
‚`5*"=ÕQ†,Lt(

(

(

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
(

.

.

(

.

(

.

.

.

 
 
 
 
 
 
 
 
 





(

.

(

.

.

.

.

.

.

.

 
 
 

BK"
T
       
       
       
       §‚a(,,"‚[zƒU‚
‚T>

#…[$Es…w‚[v”2
Kƒ;¶ƒ

§c^§‚8‡h 22fI…U    4
‚$q
8"‚O0¾+       
,¾:
‡d
ƒIURÆ 
.
.—‚{®E%‡d.
a#?
—7U     
 )E       ‡o3Ch<.>TrZu‚%]‚Lh43i—DiI>
R;\8‚"ä1t&Y6‡d
‚2

ƒe
H
8‚‡kq
5M—
phy‡&=;
{q$‚4#[B.       ‚6%2@1
!Sf(/?        *(A 
v        $.RT&
>…(?j( + 
$X
B*'*@      
)>

7"$#$<
-e?
"#l }i1
O      ‚m
„JK
{
''
‚
0bytearraizŠ7cod…^„kST*
'
  %E'2%‚Mk:DÝR„w©Wƒt3eƒ‰ƒ=
° †8
hc     2

"" T5$=ƒ?J‚

Ü?       *
 

    %E'2%k:Ótœ
„„4Òt‚3e‚°:0=ý
Ĩdy
h. 2
Î"T$Ë
ord‚Šy+Žyøz„
+†…„   sdescript‚ˆV–°2namemean‚‰:–°2~c
ƒ>K
6%‚Qƒz…W†@*`7‚

…wŠq‰&[G…!
KIŒrˆN‡dJ˜l[o#4S‚%"A
=C(1\f&YS…'„JXE‚gw      4‚'`^‡6c‚Sˆ$„Q…jT6&
qK$‚51'7‚;Žh‡†\…\‚b&D       ŒIBD„+Š|5†1o"J‰.K,…a.$
      ‡. 
‚8”'ll
       

        ‚z

ƒ5ƒt
‚O               ‡E‚!Š'

‚k-=$ˆ„T‚C‡.ƒ(‰"‚/C‚k‡hÏ=…„e†*zDV%,)(
""ŸV˜€€€€f¿0Ä;6F:+

%‚x™ZŸo>g
L‚
`“B*‚y>
4Nj
Q              œM‚
…z›8Œ



     
ƒH
        

              ‚}                                                                        ,      {'ˆ?3‚!ƒR‡.!‹` 'B•‡3‡\.5BŠ‰Rˆ+L—Y„|Ž kd%v"‚(u^%i!‚.ƒOL&CE>fŠ)sŒ     mEƒ    ]…‚s…6oi…1‡M5f$†lƒ`‚~Šqt#…
…‚54
„?ˆ;
!BˆluS],(‚-ƒm„‚(     K…x:'$0(:%F#
$Y
ƒ0‰_†d„9žLŽM‚    
P ;D)„    Š‹fƒI3‡    %‚'86‚†e ‚Z•N„.Xdp
F
‚†G

4&             
        ‡?@
H
                |ƒ‚A'#&Še‚‚H‚h„n-,>‘O…%jƒ†!b
u
'1H--*T<m
5,L
ƒƒ}ƒg2IY}SEqYƒ3‚g.…#n
‚
„Z‰D„(‚>F‚/Ž0#
+…T‚‹5.‚3/1&?-´6e‰x‡ˆ‡>~¨,…wƒ\[K
M    Bn‹x†
J†Lˆk)ƒŽE”jˆE]ƒs„c2‡&=
ˆ.2\«ne >ƒM/Co*!uB†7
           aeh*<‚| ‰@‚RS:
        
k+A      K)'
"%<W       
Çw
SŒ"
&"nV…\CƒG‚|ƒ#^}‚ˆ}”,„{.m†ˆ|…7, "ƒ7#, „*†‹Šp‚ˆ‚3
@“X©X…7

        

"‚
<f0d%&C,ƒl˜! #|
dƒ‚W'G=9YW‚-ŽöB‡bI—
1'
7;-      ^h.KE
95
S
"JDK‡…K$
       

‚8 l
       

        gp

/‚g
2               "  

‚k"‡4
Qƒ‚C‡hI

/C‚>$‡hÏ=…K23*z‡
%,;6F @+

%‡h.>g
L‚
`/**#>
4Nj
Q              M‚
‰@‡I t



     
 ‚
        

              0‚K                                                                    $  s'‡\‚o3Î
‚+.—k4‡`‹f„|$Hkd%v"‚(u%!‚.ƒOH$YE>f>T
b   mwR‚
6o‡G=‡i
K5LT0ÆF‚5‡a$
XÆ#Q‡j'—8*      K‡‡kŸ$$(
:#
$Y
ƒ‚
ƒÕp
    —3       %‡Z
'‡f6)®p"‡gX‡^Xd"P
F
‚„"

.,&                 
{             &‡-@
H
                Cp‚A'#N
j‡b
'
GI
'1*H--
T<@m

,L—DIY}SEqI
4Ÿ#`z
FE‡cS0#
iU4T‡_/1&?-geO‡Sd{5b®WR6
MMKP
    O
n#Y
4)7 +]FG
N2¦A/Co*!MB"ƒ
            aeh*<8L     5‚RS*§     t
‡y‡c-"
&‡V8C-‡z
43‚P5m58k, "ƒ
o
  —

]‡c‡_
.
‡w7'A

        

"
< )(d%&C,:6_‡YŸ'—770c0~÷,—
4…:‡E1°z\½      4ƒµ9„ÙZ\a‚
„Ký$10
SN$ó="
K
‚]—
år…;CˆW5
°{]½\…-"
K

B¾W?‚öj:„‹9‚=5Î!]b‚
„Lý%e97e4c6f‚_ˆqE•³=
qE2~ó>)
O
ä~w…<M°|^½\….)
O
¾F@‚öj;„ÙZ^c‚
„Mý&3ó
å°}½…a¾Y‡Ð4‚
åýH,6071ac99cfa4b6272ac4d739fc61a85acb544f6c1c2a‚‘K–þ†j99‚…t”õ
Va‚BŠa…N‚)<$
‹2
“Ðp&xsH‚™@›DW.=
""ŸV˜€€€€g¿0Å
0cabl‚EOch!1         2)+)* !8ƒ                   5#ST8[)”;"…   p&     ƒ;"
‰
(‚o †! ‚K`*
[`    =     
5I*[$/0%C‚Q
6{5›($„mˆT     
‰|Œz‚&r
+0
(M#‚^w7+
!$™x-žf™fƒ4‚r‡?Ë‚r…Z±$"…‡b„8‘a¯4   
^
z$_r…[™5%P-      5Y@1‡
£f‚]dz†=/bŒ
ka‚tDQƒW„saˆ",'S%XM;;P†wŠ
-{,¢|&""„{„\#ƒ‡ ™vAUA",‹$‚N‹v^XU†|U;„Wœ@*"%ˆ1†=q-|
ƒ
‚cXŽ`
       %0 $      $†q&!©
†‚y‡x$  ˆ*Ï-‚3…qƒ^†b,"}•F
*Š'ˆj†…i…Z'
 AMŽ÷„Z®j
‚tmŸ‚"‡h
+
(2
*7+

!O$…*-žf™fƒ4‚r‡?Ÿ†"Õ¯Y§„3„8f
ŽA‚ßC
A
=
DA+
pa  1     ''S%M;;PZ{Ã    @*"%ŸI¾A,¶V
'
§04
       %0   $y!!/
h®<N®‚6—‚—u„
‡b1}
*:ƒnG@'Ÿ->e_s‘F„B0!“Y‚3-'/ˆiB †?‡pp,‚ˆª/øm.“Y…Þ†?p,
'”;pil‚t†@Š~L–׆@LgrindyTE‚2*lƒ+&\F‚U
Œ%–SR4#ƒ
d‚i0ƒ.BO”ÕfM1ab4cb7b0fc344‚lcul‚rŠx2'Eƒ^±E‚[-YÆ£V¡XÖ/„~[
‚„u =š‚s+,?½Y"A-Y=¾‰FŒd…$„~[Õ:—yŸ@ƒÜ:‚~‚s+,Òp=endarNŽ]„1¶OKifornia‚B$ŠN(<ƒ=8‚“Ñ(<
h8)l†
‰'ƒ
]?‰pMdF‹
‘2c”U…ƒlŒeŽGvMJw65Y‚di1'%<‚14
]2${
9*xq 8 
I
#$_

+
E
QR4|B;6 Y<x,v
‚b]"h      
;2CaYLm>‚B=X‚
8
V_`46
8r-
H(:"&U73ƒ~

‚X      
O=a‚gs \h%*
)D‚B|
`O
a†~"ƒ8‚1‚9=9B-7#
1‚
‚V8%=
…:
97o

 'AK
v],+?'g'ƒI?‹0D&k":3‚r‚6{
 7*
Q      \‚+‚k<ƒR
s4bszA…:]&[
h8u
o={l
#4i&Oa
ƒ0‚
!25.:/„&Š\$4‚"W‚_&jCP_,
H"J(‚A
N5I/##-At$,
5
=0H%{\8G$t„H5ˆh!6Šk—F„”'ƒz„>ƒY:ƒ\R*,$N
OJC
;"(*ra
†"<…rÄˆ<\A.M…)(9ƒ
B!M—A.…S’ZL*Z-U,N^{†.kf
‚zdDƒ~:„ .P„l        ‚Y‰X11´.7„J‚6‚FE^‚&Œs|ƒ\MC_‚i<Š-&¹ŒRJ™
+K…–7 …XDƒ††I‚Sˆy6wƒ!*^„\<4ZDS
C;Š?(v*
W)ƒ!Q&‚>/1‡pD…^L…X#)G‚6>…’|‘ w“=n%Œqƒ
JS:/>:…%Œ.H7†ƒ$†k„bM„:†m

N„;(obh

VCSB h^kjVai„?ƒ,rƒ\ƒ]3‚/$&7Z‚…Qb…%~U‹(!
„?v>‚H„C.ƒ5‚5XQ†|ƒ}‡P$‚QMƒ`b
ƒX._‚/…IGAwsM
†l"
-O
DH'„-O‚.w8‚#

‚_*808¡?rDxkƒ
<)#(<0<'OWW)iJSCƒdŽK,iƒ}8„V!¯:‚K†J„2     
‚2
$„Y"‚@„bˆo
‚&ƒu
5H’3„MƒE`ˆ(Š‚XX
4+rwU.ŒI‚v~
„ga*œ•e†5epzf„4‰p4ƒy†)…f ‚D„GŽ0Lƒcƒ`„,‚+†ŽWZ0m‚Y&J…6%ˆV„#‚66ˆZƒe/ƒf3„“*ƒg•"‰%0‚jŠ)g‚`
‡F>…I"‚!‚y      YB‚
„!Š!t/R#7=
""ŸV˜€€€€h¿00È„j    |Em‚s^ƒj.ƒZ#    ?U
'
M)R‚ƒi
gˆY…
D‡(
W.,ž
„n‡yŒ"’y’.2Y\‚x„
‰s
‚75c „k
#ƒ
;E'Q5y4SwFOƒ$K‚2) „1„<‚\C‚@‚/„©aöVéA‡8†…N        „)‚9W
‚<³-ŒfLB‚c†&„m^ZMe
 TƒW    p‚B„g…p‚5:/J”?ƒ-…QEŠsŽ”˜I„Snd]ƒO„<0‚aˆ^‡ca
‡ZS…i‚„u
{#=PŽöur"
5?gv‡c:B§aR*,$N
5JC
2"(*7aN
$"‡…n#‚vC\A.Mƒ
(9[‹!Bg‡7L2Z-U,N^‡B
"H[
‚#:OV‚H.P„l  ‚Y‰X11´.7„J‚6‚FE^‚&Œs|ƒ\HW
SW‚b
+KƒC‡fDF
        QkŸx¶W>—7B‡e„s#)‚6>„
    ‰^ w„Cn%Œq%GS:/>:„

;
"2dPlNŸ",§
u‡a
4!Æ(
rŸ"?GAw%M"‡d
m—   HN&w

*808§yL‡bƒ}8„V!#?<‚|) ¦bP
N*—C5®F      ƒs{M‚‡\eXX
4+w.‡g
ˆ2
aKM‡kE‚0R)F"‡4,&4_—1<‚—34—K
ƒf)i‡‡
‚     9‡O
 g‚`
*>„I"‚‚y  B‚
G'7   
 |
&Gs^ƒj.
##    '

&)E‡Gj§e<‡+D‡^/H
,!AK2YÝ‚R†…N  „)‡9‡f
d‡ƒO—J…N‡fZAn?
EMe
I D       p‚Bpƒ1‡W0‡6A,„EŠsP,
      d 
‚%O‚4
%0‚D^J)

¦„0callabl‚;„„       “šCL‚=back‚O…bC*
x$
Oh:D*
6
        !(.3
8/%)y"
2%/4f:76B
     .   ]!bH<
(9 (=„1y2(++R93
*H'3G,
[
B

P-7J#)"2
p2B
O%M
.
Š{"
@CZ
ŽDY7I"((
‘T”
,‡d‚U j      |/0v8
*15A&(…
‰-4*Ò8ƒ{Vˆ<N†
!=~Á5Ê
ü#ˆ9"‡a
"„l³Q S‰_‰1‚>2
H#)
4m `$     DO[:ƒm‹=•eK‡=6b //86g2†Y      ¤S


†c
<Vc‚TBN*<


c>&$LQ<„DJC#Fx]i7&I0J‚XA
ƒw…B;
%Œ&‡ ~@—}dk"1&NH$(‚       wƒR£N„
‰}1œ7    Á?Fj„@A-v;
T‚)e„ „!„jƒH%†>
>…<ov2O†d/
Ÿ[|  
…_     ‚X>„bET~2cŽ]ºX„]‹p>gg‹Jƒ9)‹5Mo„*’HzCe‚ƒ8N‚‚/†…Žöf®4—^1ƒ{V
:<7†
!=~ž|¬gÊ
Ÿ7Mü„Ž ƒo‰_‚>®e     
#$
4Fm $Ú`
ƒe
§S
:‚IB7*<   



ŸMA¶\Õpd"k"1&NH $(‚   w‡7‡i6„]¾=
{Õq/Ýs
   6FÍH?U‡DN‚‚/—4~erK@T
v )
„G‡}ƒd’U„9
‡MvV
¼‚ƒ>
¡d,Œ@‚O…  ŠL‡Œ †V‰-ŒKx    ˆ*Xpd…)&I*9O&(
’5µ 
L       ƒ^2G½Gx4a¯‹/„áƒ%Œ_‡rc
L       ¶"Ã0m‚.1ƒ.e‚|¤d¡eƒW†?Œ„@$
„`
†‹ÌuC„‹J)ƒ-
åS®ra‚—k¿%”Õp^niny"
U'8ym$Cxv4E
.‚yq‚e*‚q
&…(
…kˆB‚[„I‡m…oˆ2‚ƒZ.qŠQ‘P‚|
|‚w!x4*]_v6.ƒ
%
      ‚+P‚
‚*#K„pƒ.|$
2ƒ3pG&Š6‚‚?ƒ
…BH`)8ƒƒ\(
…8‚=ƒ~ƒ%@8Tf&
ƒC‚7'dF"‚Cf$„xHN    B‚\(/(‚=ƒV!%rƒL
ƒL$f
‚58Q‚IT.5W<$bUSŽf‰y‚  _
""ŸV˜€€€€i¿0      ÒFT…tgd
\=D
K        G1^(>BRI‚6:R‚O
2        „/‚.e
      68\ƒt
3
‚H
„X      m;*…[„V+CQQ‡Iu‚~„‚z‚d‚@Qp‚…T0B7 *`‚x6eƒFs…1$F‚Nu%pG<dlcgˆZQ†|„A8V6.8†WL
"2‚.rSh6t!v!
9vm[‚Rƒ$#01f‚n-g1[JRB‚@! !bY‚>(Nd8"hGvH[(‚+‚km#2D-„R:‚\$J
u‚i…V-MPVCz‚5c$5SA…6 ‹'‚@H‚_.*M‚=K‚>GVT‚p.‚\i‚!90‡     3ƒi
…0ƒ^B‹>†V†,5™`……o
šC…((ž~pˆ6‚)„x…}†zƒH‚:!ƒ:‚$‚X7NU‚
~„%j5
0o‰PZS|      †s„@†y6…P‚eƒzƒS7eŽ/^‰‰+c‡‹@Œx„R%*‚+‚$&S4a^7>‚‚‚‚9ƒ0      D?'@-K‚gƒ #6…Qˆ6tx„nŸ8`8kh„(ŠO>I„S‚/0‚aƒM„‚4m&'‰i†A&       Q'ˆB‰A‚N†1
2vF*…*†.‚WƒIR2:‰ Ip†QHb‚GŒx*       +b    
+C7J^|‚&~D|@(S1
il#Dc?i%AZPeay:3,@‚vC^iGƒF/H…‚{
 09²<,†>E#'ayTƒ:Z.ƒ"ƒTfE„
Wg]‚=6|IO>bt‚f>18=
‚v?!+?ƒ(6H(‚‚'e…~zYZKbTA‡P#u}‚ƒ]wd‚fI‚r]+†MƒKd9I>'„%T@‚@}ƒ'‚lK;qG@‡ ‚/‚h‹yƒ      …ƒƒ^‚|ƒG‚a‚4IAs2 7b]d‚punH~Xq}‚4A_<z'h;MƒI6„vQ‚>^5]Iƒ01
&lr‚t`k!‚FR 1
%!l„%w‚=

/$‡;˜,•JO‰Z‰Lƒ‚.&De9"%:„%‚=‚}O2fbvƒi>7+AnB‚U<#L5g$3jdB9#ƒt"<^U‚r
y…'63T`ƒV;‡*P$n+2„{&JAƒ
U
‚5D&ƒacm7$z
ƒ.2,c‚n|N/lnqƒj]W‚
*R)
gPƒ(8Y
 ƒmƒ<##‚5H
p1lo6
,FOƒd:ƒV8 m _‚I
<   r‚lw"
9‚\/‚
zU+(ƒ7‚z„9>‰9‚(B\‚‹}wbƒnZD5
v{"+,(„Gƒ}Rdtƒ[p-=l‚ 
S
N; ‚~„{4‚HX+a.
7‚H7†a9'0…ˆ5ƒw>ƒ&,‚
1`J‚fx#ƒ=*{{H+‚i$
Nƒ&‚=…fFQj‚OƒuB
sT…&%
XJ9t"0S‚JV8 $$I`_Q"~Bl v)!‚B‚ ƒQ‚9„"Z%"‚`7*,bqo6„‚…F…&oJ‡„W"$%
…6ƒ-ƒ*„q \†D†r’ ƒ(„>„
†$ƒW-„bVƒj‚5‚fzxD‚`‡ˆ.‚ eI0Z‚[‚†(P0‚Z"ƒc*‡3K‚ƒ,.~>?‚A„ƒ
!„J5ˆ2 ‚TAƒa‚I$‚7ph„$U„?‚‚:[-jBƒF. L.d†YM
Bƒ‚z7B9i\†"j‚‚:/1&…eƒ,/‚‚=t4$Tbl]SP"lxl"‚$‚     „c&! 
&‚o9c,‚\ƒh@@c‚F…d,‚
†Y‚3„
JˆTMŒ,„+†B_$z …4†B
‚2ƒi]TFA‚:RG‚\&‚‚SC:ƒ […

‚BP‚m„} (4†8gN„/„$‚zTpX O@\&ƒG!‚G…0ƒ_RV36$‰{ƒ…B.C‚‚90&…:ƒ‚~…y:‚kh‚H‚un4KpY26#„h ‚Zƒ@†
„„A‚B&>d
0"&#FOƒ…=‚W?2P‚a‚+A?'b‚‚xlƒC0‚2.DƒO+~ax+
z‡Oƒ9…M‚WYŠTG‚E‚+‚.ƒt#oe$p"T>ƒ„$l‚\‚'‰qB…ZIN‚
v4ŠCi„M…%‚(†lW‚E2#_
w?(„1‚Li?X†1ƒt@,ED'K^‚‡S#‚P@‚%ƒWƒC;K(A„u„K‡1z‚…$S„:—$‰…b›;Ex•q‹sŽQPŽ]žt@;” o*Ž{‘x‚.$.A…7(<ah.J
†+`R‚@„[A†$‚d=R‚(‚W‚ƒ‚p!b„B‚c-OpY6_s‚ ‚W+h,)Rƒz‰C‚$Xfƒ[mƒƒ~n~@g~@K!0&…+mERv‚6)1]j‚F*"6,4ƒ      1#„…m‚Qq     cn‚P&`]‚CX4C„p‚AlR‚,
K-u,„!ƒuuN‚7ƒM‚*‚m‚‚)ƒ*„ƒ†:
ƒ#ˆv-‚>-HŒW„11p„S<ƒ& m  † …/F%F ‚z‚(.3'9ƒr(‚7H&…Z‚ymRs‡(‚K„7C OI\8>Ji!I‚d…kƒW3mX.:J8d+
‚J"z‚,^+‚1
96_LD0ŽösQh6s!
h!
#vm[q5
01KD-21[JRB
n!!b(
(‡Yd8h(vH[(}‚km2
-9.‚‡ q‡g
s‡k/ƒJK4M‚K6GVTp1]‚!90x3C
9‡\%t)e5
‚2W
   „%…(Š)(      ‚M‡‚%jƒ8ƒ7
X‚‡5!2$
7N
!!ŸW˜€€€€j¿2Îß5
0<
ˆ`Z`aS|        †s„@†y6…P‚eƒzƒS7eŽ/^‰‰+c‡‹@ŒxH"^7>T!J        D?'+3‡ZH‚P.#$‡‚„x„‚`8k
„(>;‚:‚/0‚a‚%<<_m&'
…$i‚R Q'
‡`*o†1
‡>
PQS2C
h ‡RG^ƒ6HJ—4
#o^|®m
²‡E'OFhZ(B
4

2O‡f
bt
‚P18=
‚d'!+u4:(‡:‚'e„7((YZKbTA‡P#u}‚Ed‚fI0r]+†MƒKd9I>'„%T‚@}ƒ'dK;qGw&y     ‚(wqh&fckI+‡EG‡g7(]MuS]~Xq}‚4‡dI‡A
_'<T‡e
%‡eH6H Ÿ§      
e9"%:
‚=‡
O¶T(N3
&ƒ/‡
K—L'lzna‚R6‡bU‚
‡!))

>P
‡48

 
ƒ<##‚<—6
$:‚38J:^"
9
‚zU+ŸqLƒn‡C

;0"+,(‚
‚Rt‚>       p-=&

@


;‡Y„{4‚H+        1
7H!
‚a'0S>‚
d
D1`0‚Hn
7H:H

+
‚X$ž‡qP
~(r‡t)D~ 3‡
%
]‡e®ga H
^&oN„W‡Y"f
O/‚‡^Wmm‚r@‚b
K5
:‡T‚IP\,o[
j‚/1&

$‡]  
)
04$"bl]SPJ
‚    ‡e 

o
,
‚R—4
(>‚$B‚

2‚3ƒJQTM‡Bƒ+‚"ƒcJ8/Z
‚'B
 E‡_ETF$
RG‚\
‚‚‚2C:N[…

Pmf
T 
%
=gEN‚3/-T‡NV O
<\&5!‚G$ƒ9RV
      $„g#…B=C‚‚90&…:IOc‡E8$h‡"@X
4,KFN
A‡hhYƒ9o‡d0"
u&A#M:hL‚2.D
=iax2
qz   "\y-Q‚aG‚fP
/
"$
Z"‚s)>Q=J'žW
?‡i
a1|i?
=†1

@‡a
CD'&

#
@‡\
‚‚sK—6Q
GA8(<ah.J‡`‡dzHƒW‡a
=
\‚(
"ƒ‚p!8b‚

-8
fY6
2sz
+
KR^     !X@ƒ[Q7nY@%—
+mERv‚()1]‡e=*"6,4‚t1#
q
    /nl&`]
X4ƒ&~lR‚
‡I-A‡‚XaU*d
h6
*
‚ _ƒ*„ƒ†:
ƒ#‚q-‚-6!‚,p
`
Pƒ&@m   9 F
zF a1_'9O
(
H=&
2( `9O6#
!IH‡KMJ8o+NH
jz—7
70cancel
|ˆ<#‚M*
‚gDr1Fžb‰?…
‡MMˆ%˜š=F_auto_extensV
;did›W‚
3_
!‘'ŠSŒ~'‚ƒC’ÓB
      _
‚p!œ‚]ƒ[-‚À‚(not4‚N‰nM‚tŠO…\‚ZŠM„‚H‚w‚nŒ„$
 ƒ#ƒ 

Ÿ:!
‚B31E
/‚b
2$m
o!"
‚
! mzG
ƒ-”„‹b‚g˜o"!3ƒj•`Š_‡X‚’uŠ}„V„(…J(£Ak©rƒdK¤^ŒP‚j‚/        ‹       ƒ)›!__
!!ŸW˜€€€€k¿2©‚"µk”=‡?‡yx‚4œ
£e–x„q„q‚AU‡:‹VˆB‡}¯!t
‚Ž„kq¢"¥1‚‘…ƒDƒ&ˆ,„?‚_d6 †L    …d‹t‚v
1‚uŠJŽ"c„Bˆ)…o‚tƒˆf|š‹=ˆ“)
Š*ƒ#¼2Omm“}„6-‚_
={Z™wƒCG‚3‰4ˆ= †3˜R@…‡V%_fŠ=š–Qƒ!&.»¥3Œ$ƒƒ_‚‹I‰+›<dŠ_©-ˆ1¦dJu‚E$Ž÷‚!"!/Ÿ#4X—‚Ww‡Z@‚G‡itU(Žsk©rƒdK¤^ŒP‚jH
p    
ƒ
‡‚I&‡ƒx„I…[x‚4‡,†8‡M@‡gƒBí„jˆ#‡}†kuŸS—‡j1Æ'Qý?Ÿ#»A0H
,§
‚„sNŸ y—c
|ƒ‡]S†#‚\N
5‡‚
Om‡Qk…%†{‡*‡g;§ƒ'ƒCc‡[W‚f†3MF„H
‚.%-\¦fZ‡c
v  S‡ƒ=§†0ƒƒ_(‡y\dDŸƒH?\o%—,u¦d 0canon;’J
‚HI‡!‚
†
‘P Åv $'l)!
…VPE+   ÓU‚tnŽþis—I§Ÿ $—:ý         ‡e1 $'ƒ¥h'!Õ8P®p:âIÆ#7¦_`
#tanker‚®openn‡J*†1ˆu„+ƒ*—µ              _convpath;.‚E„#”?—µ"’l
dirtyw;/‚„&—µ%
fullpath;-‚„)—µ(
isdir;,‚„,—µ+
        notempdir;+‚„/—µ.
symlink;0‚„2—µ1pˆ0ˆU†3
      ˆ7ŒjŽÿ‚~¤        „
  ƒô2abl‰J‹ƒt‚,^
;Qƒl•:’„®T
‚_
       ‹Ž#&-<
%E£Dƒo‡+ˆHƒ&‘&–i!
…_ƒŠ<
…8”‡gšo†#xhˆG‚&
šd,Œ”—L‡gˆM‚X‚{x„¼P…‚J™HX‚;mJ¢X†JW
„     ‚„4
ƒyh¦J‹—Hµ?‡|Dœ7Ÿƒ
%EHƒoLn(TxÝ`4ý
ÆM‚9¾3mbp¾ZJ‡8Ÿ&vŸX‚{Ÿ®‚‡‚2;‡jc®qŸ!ƒ
®>B‚åF

0^cƒ…:—04˜šO4itor‚½“it‚¥   ‚ÒRüt
-‚ˆrici‚„Y…b‘¨.tur<…>†e›@/ƒˆt„0ŠH2„V
©Dx_¢ƒ „º(/”‚RŒP‚Q„VÎõ vrdin‚•c•ÚA^e‚a
ƒ‹R‚X0„ < ‚3„
I—X‹'s‘†4
v
¸:‡= ih      ‚m†…LŠ.‡y‡¢`Œ…X¹”•ZM“vˆ1
‚‹V„c–’DŽ÷
¾¶U&Š ü’M&=žƒÃ'oÝ„w‡j¤AÝ‚(
…‡&ƒo‡T‡„†b‡TKý΂Ÿ*z®;fulli‚;‰:•MŠm
‚,ïi…‰w©(
Njš¸UF‚]    
D
“©EË3
<Ý„>—ƒâIc_FÎlessli‚•U•ê=nei‚‚]olina‚
˜@'‰rai‚fŠ

Jˆ%
ˆ.,^n'•é`\9

JG‚¡—4,^'Ÿy_bindƒh    *631˜¢$+       *63doublƒ‚5˜¢&int32ƒ‚/˜¢&D64ƒ‚2˜¢&textƒ‚8˜¢&Mi…O‰b‡`      Œ
[±#‚     •d‚…Ak‚n ˜q˜¹Bš?‹G^¥p
â7‚¡X¯‚q³Æ/u—10¾>k0¤sMžn®z
ag‚ˆnñtesian…; 2/.E‚6
‰7@”—H@oon‚Œ    —†v‚‡Y–°1xscad     ƒc‚Ç›C‚
@L•ÚC[‚
@Lev„ =„!ƒdV„S‡‹,
 _…)„/+„fF#“N8…8k.n„
‚}BƒUŒ
{‹%…`‚F„zg„5K1j] I"{7‹S}
Qu
7M   q]6Q'‚J†}
B
_
‚e„j
†D
…:…"ˆ"}/$=„_"}ƒ([$2
""ŸV˜€€€€l¿0Ã#
r&‚*ƒ/r 
ƒ…ƒ,1
„yŠ1
g
„<%
‚f{fW}2h‚y–Ry‡T$†"„,1-‚5ƒ}:†.#Š_†)8ƒELƒYgƒ,†^'„‚=r„†Dv‚i‚m‚CQ…Œ>ƒz‰\ŠJ-‚\l]W‚Ue‚]‹ˆ:‚…z’-‰1 Š'/e…#pƒƒ~
9
†>—|‡v†0‡,ˆFG„Q•Qœ-ŒC“†‚]‚Eƒ „@Y†      _†kpƒ‚1;J…Lk‚R†i‚:„"‘a
ˆ
ƒQˆCˆO†
Š`ar9ƒ‚^˜jŒ„ š1t†?ƒ@†-7X†F‹L•$‹q
%&
„0
‚d„)‡Y…–S–h™mCrdg‚3„I„QC‚E
‚

Q
‚=45‚rC‚flF‡d‰|
&„K.0ƒ-J&I’4Rƒ‡n„‚‚[O
=(ƒ+ƒ_xƒj,–Z†o
F5,
ƒaWo†\V
Œ*‚e„<„?‚;‚{ƒ"ˆ^ˆ*ƒp*‰‘Qiƒ
l‚Ky‰~sj‰‚"†U…$‰G’kL
„:‚&8Q…@.‚AP‚2.#„s‚p‚‚9‹+"„}0ƒ„}‡‹E:„[Bˆ
ˆ8%j‰
„R
„9`‰!‰`Syƒ`^r ƒvv`VbŽA-8‚t,‚4‚0[ˆx >„ƒ;††qjHˆƒˆd„o‰‚=„8T%…<ƒw‰sG'[”‹-9‚A'‚(ˆy)‹2)‚|†V‚Œ65‚Œq‚ƒzSƒ8‡K."…zP‚l{„

…J‚6‚g3‚ †4…:7QH„    tDƒ|†oƒN#
3g‚a ‹r„ƒ    †q.†e4Dˆ[‚h?l†1‡;‹/4$p‚R>? „k"‚G‚d‚E„4‡4‹\„H‡O‚Tnx‡C ˆ<ŠXFˆdšu‚*‚t„VH‡wpŠ2w‡[?‚ŠA‹qƒ„b
<„;(Ž]3‚B¡‘WGn»Bä†B‚Š{
†g
"—„6ŠŒ;ˆB‹T†Mƒ‡FoA‹p‹„
Œy4…>N*’~ˆ"        ˜?ˆnˆrs„-_Žs„- n   ‡?+Žöy     ‡\KH1-‚5

:
‚9H!§G,‡ƒ(5'
_ruZv,
i
QE
az/J‚-‚\
]W‚Ue*‰!„j
ƒ*4  ƒT‡-E/e}p]2‡X>‚@|‡v†0‡,ˆFG„Q•Qœ-ŒC“IhH‚X‡^K‡o
z;*‚$‚1k‚R!‚:„‚,
Š3
…;
‚P‚,ˆ'l‚kr9ƒ‚^  ‚Š
‡; tt‡VoƒÎ     %&
/d‡‚,‡imj@k:CIg‚3D7)
     

{

4ClF#‚7j
&.
5.wk
‰8JåJ
‚‡dDÆ$‡gq‡h,ƒ`@sj—ƒ5MW
‚§"X:
c‚%‚~‡Y7„}o       ‚1
LVp‚
¦b;O4—/¶X
ƒ-‡_‚t,Oj >hƒ;†)Tg‡V?_‚Ij‡„jd‚\GƒŸ‚c3ƒ7u{‚\…C‚6
03N‡„j8ƒb‚ %‡‚d‚s‚#
3g‚a
„<r‚
‚\p5o.s‡†+6‚@|1@
4$p‚R,Ÿ8—U\}…(E—*:‚bLzF   Gužmg[‡„'‡$V‡_b
{—‚xTN‚Š{N

‡‚2‚-t
{;ƒ      `—ƒ&oA‡6Z‚
:NK
d    ‚#G
'sƒY=b(CK
n0case_sensit~£'.¾E
a'.ive_likŽr£ ¨@
²o'iP   {"
†AŒEù2‡s„øeRP    {"å†less‚‰f½X—ûQt     ƒe
ˆXL‘1
M
™U
‚35LƒD„0‘.#  GQ!P$$t@$ˆzƒ‚%ˆ@ƒ]$3„œAèz•#ŒR–_µg
‚
‚ –_-z¡µw„[=‚=
X$3
¦‡sèzŸuüŠl‡Ãual‚°x•òYtƒœE®y—Ì?galog‚e>
…O&strophƒƒ$ch‚x…M¢Tˆ…hßs>ˆ#ƒ8eì‚Qœ„?IŸ
0egori==9*&Ojœ(VBð!‚¯VMA8‚`„\‡|½@/VB+”®MA…Ö`ŒOught‚‹ua8
(‡}ì%Ea‡ÿƒLs‚q…2‚
u-nBƒY[l&u;‚‚–MŽr„J~¦%‚1~m
^†Gw‚eQ]‰46'R„K" ‚6‰`‚;ˆh0„R‚>^Œnš
Tnb˜hwK.
""ŸV˜€€€€m¿0³^‚)?„I†;1„`"a
Id*/*    h…XˆVR‚4ˆ‚ZG;‚a‰0D*
„>eŽC
ƒ.h%ƒ†PeˆI/†mP‡,;„H‚ˆL–X†^…U?µ ¨qAEC„4_J…6+P„D’J:7“G…Ÿ(„…FƒY”'‡%‘[O>O$¬        ˆ Ž4‚v\L]x‚8W£jŒ’:†,‚Oƒ|XˆX„&†p
k;’AQX^‚7Kƒ    …zƒm†c†y.ƒr/ƒo#x„c1‚"1e>%.7+5m‚Mve„ ˆs†8‡M‚‚h‰A\:K!N‡g…LvQ 54a#34
ƒ,†@‚!†z
„:¸_n…J  „=O‚,-‡J~„e)‚s6
‚Kƒ2H4E‡`ƒImE…npƒu@3SX‚"Œi$ˆ^i‡tƒbŒ’=™0Kƒv
Œ     ƒE‰6x„?„7]‡,0W‘X„!ˆ~„<‚N{„f‚‚1ƒTk‚(Qƒ(!E‡;!p‚:d…‚Vƒ<3       –m„VƒM…KW…ƒ †Q‚G„P|w‹&„c^&G‡‰}‚X,ˆ    ‚T–"ƒe‚XF…00y‡E [B„ƒ¼W‚F/…#=F $:N…pƒ
‚\:ŒO‰]7ˆ)‚u”X=["ƒŽ`l0
Š¡\‹+ …(#Ucƒe™#•)ø"’%ƒ4
5†/‚~‹*F N.>‚mnŽ`†[H‚aŠ?^•…M‚"‰+‚%ˆE[†c‚[‡X‚b‹
“hMwI‡w¯y*„ˆU}F‚G‚NƒF‰1uoYs‚"‚
/~'‚X‚*†pPŽö‚^
<e‡_‚r/wPM9‡hj§C†‡A
…_Ej|—‚c‰<<k„D’J:7“G…Ÿ(„…FƒY”'T,E
ƒh$
06o
L
x
aWŠ‡?Õj
kX"M—/f‡e;"‰QX^‚7Kƒ    ‚Gzƒm"{†c†y.ƒr/ƒo#x6ƒ1‚"1e>%.7+5m‚MvedL>IPCYw
D-H!N&.„4vQ 54a#34—V‡iM΂XÆ‚WŸM{2‡5~kÆ-SO‚"‡‚.‡d†|iUU    [
[
‚K¦ƒt—F
¾c6Æ#
ƒ=W?f‡‚‚B
<w‡ƒ—3~y^&G‚DT‚X,W‡‚no‚XFz0—,E      s‚‡‚1‡E;‡i P!:|¾‚5
W
y‚u=P"
"¦C>§
E+N!ŒQƒ4‡b3B‡‚&4 N.‡
n„`uH‚
M?v6
2‚"—
„%[‡ƒ'ƒW‡K‡v
%I  p)*ƒ<}L

Gr!
GoJ0['
1?2—‚0caution     ‚!ˆ‹P‚>m>
‹+S‡{ˆ%5›µ"„S
Š†L•º‚6u&Ž“ªs‚•L•ê4veat…2ŽdŸ6d64š^‡ ?ÙK…í2œb3aa0641d9a4‚§cc‚y‡-‰–þ…Kc’p*V
‚OÅI‚*…Ÿk
‚J_ft
’vBÆ
‚Bfƒºx—̃)l‚ pw‚K
Ž
”—
dˆ‚x
V=+      †0–½-m‡Àz
‚u=‡o6Æ—ecl‚Û==IYrùf=IYrfg~¢|Q¾E
LQeas‚‹
‡q“ujìQmde‚Kil%%‚zllPT‚H%‚9@
(–8’L¥)’    ‚*«;3,‚3ƒ.%¨

!
”(×|Ž%4_
zž@‚|‚ ''.q
J@W*c‚:
ƒcBŽ8
‚F%      9'Î(j’L¥)’    ‚*«;3„ørZ

‚¤l„‚|‚ ''.q
J@W*c        ƒB_size_check‚ˆK3†BL“È‚1ƒŽ†B       phon‚+~o‚-nsorship‚'
…?>‘þ5
{>t‚
„B8‘¸:Ÿ8er‚µŒL‚1™5üƒ#„›
‡¶‚(imet‚”s•ñxral‚+4…    ˜s`†
‹@”—(‚°OCremoni‚WT”õRod‚)
‚„F53tain‡SQ+0L@„'+S‰dŽsu‰"˜r‡'~
‹#‹J
…\˜~˜:‡Šn‘+‡'’N‡4ƒ^…Bˆz‘>’jÐZŒs©uœ.‡L„,Ã)ž8X”‡2
ÆlŠ
”z…Jƒ¢8Œ”†KŽþ„
¾K_‡^r®nˆ
‡|ü„w’eŒg‡„H   I~
Ÿƒ ®o§~«ƒ}¯,Œ5§   .åd‡].
K[3Î(Ý—4’P&
M*‚)9:6
!!ŸW˜€€€€n¿2Å7—î‚‡~Ÿ-—‚
0certainli‚‚^›b•Œlif‚r”õi‚ˆxfg‚y†R„.–þ8/romv—#;  (€;  (ctomean™K€‚?g_annoy„`]5—6*]5i‚WŠTƒO:‚k                             ”ôU@II*hˆ¾5zainŒYY…

]¡'_ˆ94§f
ŠN
‚XŽ9

…ÖP_Tƒ–-,
78
‚Xlleng‚„:„M„e•ÒAg³Ync†\a‡LŽ<X
ÐM Z*œ'¿6…?–(     Î•WOãlì@œ"+—0„É~2íM£… g‚?‚<,C               &
ƒNB‚      †P‚,†=ƒVu‚&-+3'5g"2J‡‚xƒ†xF
)œi
='}‚ƒu„KP
"B =sEˆƒ;‰V‰B… 
yW‚b-„[R9URdƒ=a6       8"*$'P{
™Hƒ@‚j0(L   I      ‚d0! M
)"3
=V
-O%e   ‚PY}
M8_
~
fL
g‚@‚b)‚[
ƒT:c„hB
:
ƒ‚%\4   Ua&„z0‡„Y 
ƒ…[‚"->d^‚'…(‰/‚al‚'U
‡xƒz(\‹dU]„3D&‡g>zMƒ<
66%‚#A1‹y‚‡-Hl‚^ƒ)ƒU„BGƒf„X4Šy
ƒ}S2z‚vŠb        ƒ]…D‚|…4‹Xv

9P$†wµh
Ã%
}9L‚(j$„v&|P‚‚Y`ƒ+„8C‰d…c‚q„U.ƒN…S‚C6
„‚]‚6™U‚5
        ˆ(G•,;        …}Œ(À”IˆOi’9ƒƒ‡ƒ!
‰     `ƒ5‚
ƒ"1w#/
9†+x„4…‰U‡…-ƒ!<.1ƒ†g‚tBib{
+6Lƒw
&       Fx354B
6p
\+‚X2ˆv„$‚Z-…T8 (†
ƒQ‚BCU‚"‹>yƒdŒN“o.ˆ`ƒ&Œe+‚7Œ(V …T
MA-o"c„?4‚:
aT‡mˆ06‚]‚:‹%"]Aƒ‚$$2(#    h >
5      "
%‚~,‚I4~  
)0m0.^U$p6<3
W[}<F
" O,)i6Ho…1n
j
(o .>E= 'DF3J92<<…m77-(0e&#M/^}l6/!(…yNF‚**O3Wƒ…q‚WŒ„(‡M   $rK‚V‚k„8q2U
ƒR†Y„l@ƒ*„P…a!^mƒG_dƒl68)%/#'6o!uƒ‚& +#dƒ]!Fp„n‚PFS2p‚
‰dP)9k  L2‚vA'O‚/ƒF10y9U>‚‚.‚d_ƒ*7 %Z->_=JƒDŠb'r
„R†u&‡(ˆG.1Y;‚@U„5‹\‚`       )5/sI    ‚„C†]†uŽs-=1!$
_:   
6F2Crh\"%GD,(33A'\e„[~P2Kƒdv ?O* *?%ƒf5ƒh>3YEG„#
b;,'‚K„~5/hPL‚v…c‚%.<:‰-†E‚'f„o'$%    B-4w}ƒsm‚X~„‚T‚ƒ!-„
I‚…9P
Fn3"&LJU8(y
G;‚f`
.ƒ„
‚0>')'    +%0  ;Je„ƒLs"„d…OL`#†ˆ;‚9~‚ˆ`„dƒ4Jef#       !‰/ƒNm‚f‰"ƒh„YŒ„
z† ˆ,<ƒ~K‚:]†@~„A‚>¿Wƒ~9_S‡G0‚ˆ[Nƒd/.‚LlŠ‰W‡C-><…-g‚m‚ ‚7ƒCƒjKU;„U‚N(<Nt†
C…
CQI0ƒ"
[!,<
&ƒ+‚D‚KH2ˆ1`‚z
‚%(8x‚a%UU‚‚vDi^K%
,%_=+ ƒfƒFXX+
1ˆe
‚DL)`mPJ/*/o*!*‰„S‹Ln‚-5F@…;”<;‚Hf†+ƒt‚c
ŠKˆR8‚‚c‰#;…§?s‰4M‘*ƒ`
¦pŠs-…cƒe‚QX…A      3DI=„$:‹0†M’_‚ƒ
‹cD
†      ƒ`
’9OD^KROH…f…\+                      ec&…nœ)Œ%”o‚‚!†&‚N…S\-R8ED.&#‚a$†a„^ŠnD†'&‚…"Pdƒ1w…
6„ &`<‚E@!OqUl‚Žöu4%
A1JW
ƒmH;^
‡Z
‚>G‚:
*4Rw‡mR/S]‡`DG    
y‡+L
‡e$KM]‚p;ƒ+„8C‰d…c‚q„U.ƒN…S‚C6
„‚]‚6™U‚5
        ˆ(G•,;        Ÿ‚A†h‰
m7Z‡F>‚d‡‚HÎP;‚aF
@ig‡g
{
C6Lz
&       FZ3454-
   6
‡])
‚2$2„$‚Z-…T8 (!ƒ!‚BC:‚"‹>‚ƒdŒNM+<
 +X3(V*
‡H
!A-"‡‚2N' 
'9e(
""ŸV˜€€€€o¿0µ4‚:‘²JH§"]|®ƒÆ&p‚kŸ!FKq2{
Q‡jƒY—80‚"®E‡‚I‡S5p‚
P#        
2‚].
O
ND0d
"!>5
E.
_E7
Q%R->M=>ƒ‚¦^LSc‡rXF¾4Mk‡Z

>-)="!$
_       
6F2C
rh )"%GDx(3A'\>‡^ET#+  ¦‚VOLA#P‡a2.Hwqƒi‡f.*
—6 Jef# !uƒcg[
^„Y‡‚X
z‚'OG‡iƒ%ƒ~‚
‚uz‚HW‡j
ƒ~9_S‡G.
‡AN
~/—8ZRdKB‡Y+Ÿ†
    ‚@
!      I0o
          !,

&J     

D,           J7`‚z

‚(
x‚0%
UR‚aD
n'%
,_        '+ƒfX
+
     1       ¦D
`;‡fy8
+Q‡]
*§„-…c‡eQ‡y‡i.      3DI=: 
k
.,
b'

YD
     —
ƒQ‡rƒD^
 R‡XM‡+                     
ye
&(—dFƒ/‚<
G-S$"K&.
Pd‡FMu<
60changegroup‚%`[…{!,&"+*0N&,h@='¯–”ÝX-_new‚int‚%‡U…vs64‚%5et‚=‚8Eƒ06
):
#&/%_+/%0/
6+10\B4N       
        
AE
.Lg="
R‚%&:‚y
@
p-( Q,16#Y,G
ƒFƒ*
‚?/Mu20
N‚Pƒ2'‚
FA>'v3X+
,\|                        .!/'o
5%    
G5oL=Y9=AK2+G44)/ C3      
éM
;
      Eƒó
[' 
5% 
5oL=W9=A"
K2+G44)/     C 
_abort‚%d¸K‚‹Bconflict‚% es©6IŒ>‚_straint‚%f‚Qdata‚%(go¦&‚v [   - ‚c#foreign_kei‚%h‘w¨2it‚%D\Ž=‚l(W‚¡JvKP…FF‰i””Ý‚notfound‚%i¹^   ŽD‚_omit‚%j¸?ƒ‹Sut‚
ƒ^êbreplac‚%"k¸A4+Ž‚)U
apply_invert‚%aT¶u^nosavepoint‚%b·C
int‚%“Š}

sqlite3_int64‚ªtart_invert‚cCypedef‚‚set_it‚u”ÝVDnelz¤I0   ,A)?ƒ9ˆ&
™–þ‚΄6pter‚…Dr3‚SU
?%
‡r*|2‚'‹ƒ')
ŠI(Ð,uY(‚:‚I
ª%
žpþU2•gƒq‡K¨N‰ ,™0‚ƒUQ‚<ˆE†K†"F ‰ H
                
D,E
y
ƒyƒ4ƒG
ƒ.?‚'„‚23*
˜T„YNˆK‚i 5>ƒ‚Qˆ*ƒh+‚G‹Ž2‹/†x„*‹'
ˆr   
~‚

ŽQK
¡a†3]
‡2-µ9ˆ‚!
:!(‚:‚I
t‡6
„I¶o‚2 PŒAmž2”DO,:í8«t
‡ƒQ‚?œ2‚i 5>
‚Q   k+‚G  „K
ƒpKŒO
M]—7fac
3   P‚AƒD
9!!„AƒVs‚l      PBz„Jƒ3˜T"‚2a„R@Nƒ=0(H7|„Gx‚3-    (P+
‚Y   h‚44‚&
Ju†V…'P4ƒƒ?}0`H‡ZA
) Y„wŠ<‡Œ2‘4‰p

/i-x8*…‚ASm    
 N!7                "      4
(z& )±>Žh•        ˆ5N„e' †l…71~t„sƒAc–"—1W
‡$|›`q™‚K#.Ž„Gƒ3¡_„o
$0!7            *_†9ƒhN(ˆ@‡‚sFƒTˆ
†| ,"((„‰e‚yƒ|‡H’0#
\!1!
…7 h1‚Ai…!ŽP‚M„X…M
("Œc.
#1XH^
ÐKC
ˆ,
‚-x…j„ƒJ†H„ Žw"“@+<ƒZw„
‰yš.’1‚NHƒ‚&     E9G$j
%‚
j+#E
!f.Tq
‚†pWI       #ƒ)'=tˆa‚s„a†p6†xVŠ]ƒ       ‡,¶–‚[…

‚BŽþƒ
FT}0`H@0
) YI}§
qH‡[

/
i-!8*
bS
gmŠrM
ƒ<7B
„W
**ŸN˜€€€€p¿ °À@>        
 N!7                "      
(#& )„qƒ= !
ƒR'‡,7‚?1~t
ƒs—<T—1WQPq… }#.‚P*ƒ3HK„o
$0!7            *…‚‡G
#N(Õv
C
â:#
Q!
-!
Ã6õ*¦v?EUŸMM

(¶Y L.
#1XH^ˆ
Cž}
zT*‡g;?—9q„§ƒ_¶X?N
‚/&   E9G$j
%
V
+#E
f.‡`
n
/-W2      #‚ )'=tqF@V‚R®N/
4
‚$*
m‚


0characterƒ    ·H—û<
istƒC#õ$ƒ]
ƒ¢o5U‡x,
‡x
½T:¾3:üc‚Jƒž”<
valuesdescript‚º9üqint‹'¶lott‚.‰}
ƒvˆi”Õ4t•Y4'3…h*Šj4)'/(*PTR9¸~Ž82ˆ¶Ÿ 4)'/(**TR9—Ker‚>
6'4Øbykovski“t€‚eapŒI„K‰yŽÿ‚E„Ñ1er‚œ: »d“Ø`[ùˆ0ŸFck      ƒ
”,„!‡],)    iF:)-1w,!‹„2U K„#3‚
&4=
†-
ƒ8)&,
z‚s!)LˆlƒU
)‡†5n‡%‚c&#1sˆUDWtÅA'
l„uJƒ’›5…&=‡&…ZŒi“ƒC‘S‚x‹(„3q,‡sà6q ?‚e¦>eŒi=„P…‰xz(ƒ(XC*TƒD\…a‘ePŸ        ŒzL„‚L<„ƒ:C%Žj‰uƒ9MU+,‚5‚–?
‡~   ½    ‹i‚aƒ7’WŠ`…O‚]]Œr4ƒBœn6‚"—L‚‹['C4‚9‚;7l*(8‡;–ˆ-ˆjJ‡[$3-¥y©L—>‚%
‰f}‰|X‚L‘J„nˆG‹r@
„‰ƒK*š\   

l
]1"ƒD
       –o‹c‚1”DŠ]*†aŽq‚Wˆ0[&$”      „{
ƒ,'ƒ/’~w‚m•U@”Šn
…FZ
&,ˆ#Ž„
‘
†V‰qWˆnA:‰-:„/%> (^„~/
R.ƒŽ(ÌTœ.†B°U’C…,‚J…Y2Š0(Ýoš,Œ0‚#‚Žöz
j‚ccŸ
N#1§$'
‡F_—DS›5…&=‡&…ZŒi“ƒC‘S‚x‹(‚J\O ?‚=
e
ŒZ=¦‚2Îxz
pB‡]Rƒ1\„x‘Tƒ
ˆ
        x7„:h‚^
#CM      
,?G++s5‹‚c:Õvü&®x‚]§W‡u
6)4~¶4aO)7P*(¶`bJ‡Z
~$v-‡‚aIR‡;}Ÿ 
;‚"‡ƒp%KƒKŸ'"ƒ       

l
]1"
   ‡bi‡h/ƒZ‡gP„G‡d5…LX‚Iƒp&$…lƒ@5
‚'§„Dw‡_$Ÿ&


Z
&,m*1
/¦FUƒ)!:      ‡‚ %> P        R/

L.q®Š—/—ƒ[‡e{‚JUhJ5$Ÿ^¦in8V

       
MJñ{_nam‚|—†tim‚q“
78list‚^‚(´
       "D
  œK"ƒ=
Sƒ7„s#       ”!>x¤3’:‘ˆI=#&            "ƒëx
[
D=     
#Ý      9pŸ‚$Œ‡Y
app‚7”õ>out‚‰
$‡#!‚       @D2"„m.
HL£‡Î
!
Y‚    yDHFƒ-M‚çSLpoint3
 55#("(/k!

5u’R% ‡R&ƒ
‚%*U|
)b2!,a
3    8#
       „<
;Z
%       $(
/£1œo'“]¶`„,,…6f‚MŒaFƒEb‚=1"6”[Z+ ŒHŒb5E4(j_
B<"æN-/
ƒ!D;G
-Žöƒ$*G|
)*$2!,a
3     8#
       , 
;Z
%       $(
/åFˆ!'œ‡j…·*/HE‚5FƒEbX1"§e+3ƒ
$E4(j_Œ
Z<—`R-/
D;
Gž
‚:-_ful3iF,\lfsync‚t†CŽ
&Žz¬U–׆C
&/„pass3[*.)ƒ<݈7restart3
%M=
™zŽø
ƒ,„uw,o(-0=j„27$
ŸY˜€€€€q¿6—0checkpoint_trunc3h=
™|Žø
ƒ.sum‚C±n
,‰l
*1˜G
™/    P#‚ 
(
 F‰u×f7I
$‚Fa
        $":#*“ØOƒ<
‚×I0
*
„^
“;    ‡b# "(
 ¾C,#‚9f7I
$|a
        $:#* _verifƒ†:V—¼mVrri~*óE Ê@     ¾Y*…5 ¾!„c    iefínv½ŒM‡È<gld‘E‚9„$)Q‹{
‹N(+    Œ2¡@‡šq
    
(ˆv"C

 =…/f!I,3'MO†_%
!3.iL2!O_/0
Ÿx
±›5%[f…:!'     Ž5*)Q¯$Š
Êa(+ƒÍƒ]+üwƒ
       
(‡_‡<"C

 ="‚H/f!I,3'M
O2_%
!3.iL2!E_/.
ý
R¤{%[f
%!Ÿ'    1‚d
Ž$Q•ÚpQ0‚‘V•Ú„"2‚d
Ž-I•ÚyI3‚d
Ž6B•Ú@
B4‚d
ŽD@•Ú@
@5‚d
ŽMN•Ú@
N6‚d
ŽV\•Ú@
"\7‚d
ŽdP•Ú@
0P8‚‘C•Ú„9‚‘O•Ú„ren„`œ|ƒL¡Oœ`9…Š      p+‚    
‰7SŽ.fõ,#‡‚s„ʃlü{
…9(»8íE‚a p+‚    na‚…pp‚˜@ng_id‚")‘×/)oic)–4G| D
„61   …oŠX‰8gñ
1‚a¾I
iv…3‚2—q Œy–Eƒ!L}‚˜[vU‚PPƒX„Jj‘EÎo…Q´'„_µ
RÆ‚wí” ‚¡s¶
ƒ\¤jÝ}…WvU@Ÿ‚xƒX
J¾3H§‚+ôrnosƒ–E‰‚1Jr‡@™„D
˜&‰PŠDímˆY
‹‰³Y‹
F,xY„
9M;„f™BY®4˜.x‚IƒU‡<‚!yj‚ˆV"‚ŽR$‹G)…"      ‚†uJ®’z‰#\=wŽu·‘–S¶A‡ µC^ˆ„1I¯‚!‡õ‰0‚×_
‚~M„f ü~=Y&yjd‡L"j—{‡ƒQ…")‚T0‡ZD®!>®qI.=U¶íBjJƒen–re‚‹e‚#”!¥[‘˜.4„º$h§„ese‚¾…B«c-z’Wø“r‚°‚R„›&n‹M‡{?„ˆQ
Ša{ƒ[  ˆ"›=˜]Ž}Œ•Y»m‘E
„^‚TŽþ‚zÚf
{‚÷‚¤=ü„‡v*ÒƒnåD
‚Tri‚4
Œ>stma‚d„rƒCp…Vq•Ú>ƒ8ƒCƒ
„
qomeu
 b%‡64C‚:ƒ.2‚y„;Ž÷Y‚ |q64C„¢pJ®‚Rbook‚ˆ>ium‚
“)±w‘ˆw
N)nolog‚„#‚X„Cƒ]‘(ƒŽFÕ|ot›mžJŽ÷9=†¤Y\unk\.hS
¶&C«t0–"a[„„<‚„|‡‡c"‘C‰oøp
‹}C‚σ1P‚ׂB§‚S”;O|i‚‰Šp£†z„ÙEd‚b‰yX'''.5'''''''''GN''''''''C'''''''oZ7>'''''6&&XšD3
Ñ.b‡[X'''.5'''''''''GN''''''''C'''''''oZ7>'''''6&&…¯G‚4D3
…Nndi”$^_rca‚‚$‚x‰^M       É>ƒ~†|‰bnÌukƒµBz‚‰ËAjŒ‡g  ®oZl‚,ƒ_ƒ"ƒ‚7v*$O>™4ƒ
‰6#ñ'bev$Oƒä4
‚'‚Vüw
R#uit’R£L‘‰A[l‚…B„PŒ‚'
ƒ©*¨ —:ÙJ1A‚¨‚DŒ‡L
„ƒS   ar‚+‘¨F\mflexù¾m¾‡"radiu‚ŒS”—=st%Ž=ŽMƒ,ƒNƒë,ŽSvw8ƒ}
ƒ^
µ5"Ž2¯]¢C‚‰Dƒg’
Q†…I
’ËY°#µiˆŠ³t—K‚ƒ}‚ÀDüj§[ŸYÕ…s§Lå‚E§  !§*-žgv‚„NÆ\ˆSô%/ƒäW‚‘ti‚ˆV”õ
zen‚9Gkid‚c›vp#•Ò`„p#smvf”‚Q—¼j`umvfƒ""       x6ƒ'—¼i,"     
?6
s_initƒ‚I—¼jXl‚Z„*‡_4„f…4•Œ       t=‚°S]§
F§aim:„
m‹&†D†’"ƒ)t$
"
œ
Aƒ†‚‚‘.‚"M!‚r~
‚\ƒ\
37.+R
5 mnp#‚,5=
""ŸV˜€€€€r¿0½‘›
…F‚H
0clang‚Ä;¦;Œ9„
@
–#…~‰X‹**ø‚      t
ƒë{`³VÕx
I…¾=Srif‚ƒŠ;‘˜ƒ„‰i‚±=†
¯ŠW–·{;Òx\ti„3Ž¯z‹^eñ&‡…Q„ƒSÕƒ(³Sss$
™SZ.bH*W6';‚
B'>‚T‰TW,ƒuA‚h!
ŸW‹>•‡5Ž —?‰ ×`…}‚p‚$$2
F%‚hµ6W6'
B'>‚T
,
gA
!‡g
ƒ^®»ƒ
‚ï 1»§!1¾=Hicwx+f‡c&ff‚!‚hi“v›~–‚j½@†œf   Ú^[us;ƒK^J(#p</ A/QFO4/#9_*LW3]D
?:%:H&+Q%$@
1   
‰O:‚L;‚!2=O ‚C…LZlp
            C +83'K>2"K&"+   *9=af
W     )#„X‚*„%    i&(1
E

„<-@6ƒ{‚xP~Z:   ;0$yAv=*4G_e1
…'NaGB‚PAA[~=…o"OZ‰>:
-
" "! #
j(9‚Y†}*mVƒf#†[’M 
‚=%ƒ`m
G8<S‚,K

’O?s
E
„20‚k2‚rF†
‚‹? ŽuŒ2(z‚Z(‚!¸iV±vŒ?¢A8
%
,ŠL¯M˜$žeš/Fs¢$"c) ƒ
   ƒ

„|‰K<
Œ$$žU`žVŒY=ƒ~‚xd\
Z‚.,+
*
zd#gD
|_OfƒoKƒ+
3M,%
‚›:1ƒK‚

}    Šw‘T
ƒ(}‡‰p4FŠ;?ƒR}ƒF#bO&#ƒdH>ƒ$„YFbx
+ˆX—&#2      
&(++saN)
h>
‚f&‚XONa/Z
# o-$2
ƒ/ƒQQ‡lT„O-‚(†">ƒ3‚D‚Y…„]`ƒ7‰‘,ˆ0˜e„7m†O“

46‚'.
'0„…,‚n";,3Œ:ŒO/*$,‰
iŠl‚|ƒƒ-
†ƒNzK%w;<?<*}   >      
$2     :9‡j%ƒ\f
B‡fl‚[
…"     $c7|L  i-/)8M‚}  n‡-;<$'a)NŽu‚@†0\…U„ 
Y     '&^
‚K‡–ƒh
ƒd8(„ušqSg’_$T:‘|‡W™H‚*3I „a>Fh‚qx„U`«]„kxl&K‰*¡#¯zG"8OŽ!b1‘}‚ 
“M1
¾.(‚
Yƒ9[‚ƒ]Žþ‚i.2
‚NF„qM
‚     —9S     
2(‚Z(‡V‚
VŸ(Œ?¢AŸ(
%
,
„0
$
s   …/Fs‡M‡S
) 

—8l¶]<
Ÿ’b`”z‡5=ƒ~‚xÝY
œƒQ[§‚<§=
}
F#b&‚
0
9
      b¾>;‡FO]¾
&
#@*-     
&(++ia(
h>
)_&XOa/
# o-$2
ƒ/#QO—1MmŸ‚{
6¶QI9";,3ƒWƒ/*$‡\
‡Pi‡'O       ƒ-
—1zK%;<?<**}      >      
$2     :%f
(U
      $     7"   L      i-/)8
     n
;
$',)‡U9/„    
$?  '&^
‚K…nR5‚B
®s
8Ÿ„u
>S0|
T:2ž_>—8M>FSJíI
‚'(Y ¦keanKƒ l—?‰[…h†P‡;Æu‚        Œ7ªoœ•<šf‡U‘OfÇPŽ÷qõmŒ‚0‚°‚D¯ü‚ ‡ƒP¾9w”JÎƒer‚”‡C•E‰ì‚™‚Ï-§Eli”,ƒTÇT‡HŽ÷#e†¤Rj”:)up¡6ÍI#ÁC„}ˆ37…atŽ÷
-õ
ƒìF‚×ê8kr†^dƒ„Q
‚`Si‰M’9ê8M‡F‡–:(+ƒ%&„‚4Yˆ{‡ŒS›G4¾cΆV³ n?‡4›tˆj—„p'›o˜3y(‚tÜR…‹F…B‰I7F„,…5MHŽ‡VO5´we”vª5Ši½‰B‚-ž!B‰(+ƒ%&„‚4Yˆ{‡ŒS›G4Ÿ†     ‡dÕ~?«Ò\
-'Æ)Ë5í4
!
U

ô{
UŸ
M{Ÿe_bind,C)anc‚’er‚‡Uˆhƒ6”ü'{"+M‚1“L<8Zƒ1
""ŸV˜€€€€s¿0«0clearliŠb…‚š.‚/\ªO„$  ‰>ÙâI)œ-ù…e³Pbver‚‚_•Ò$i‚ëd
²-ŒF‚X‡'‚{œ0ˆuRCLƒ]D„=*„^ ƒ^‚7†K„A*@ÒB
ˆ~-±An‚6„H8ŠSkˆ‡rŸS1‚*(
‚<P!„MƒOÜל
ˆŸ‚XŸ ;5Æ$
#u¾A2F¾A
D?ú-—3dA*@í‚z1
5-í—‚0®4P2     

(

‚<
!ôqMƒO—ck‚L‚Z$†W     ‚Na‚$      ‚^
¥u”ž`H$‚ç/,
$a‚Æ&Bent„M‘6S#WG’X/>3f%)Ës„K‚4KF%"Z‚(‚{
%aHsV
#µ‰'$PQ†D0KƒMd82ƒ1=) 9oKofH,."SSWr>r†KA‚…~_¿B‰M
 …7‚u$‚w\mH6    -    ß…g-q
ïD    †P)¶På
%D¶WT
#ŸŠt„cƒÔb_Ÿ‡W‚4
 m®i9‡k
\m#6        §sôa9¯B ob}ŠJy‡|
³w‚7„~µ8:œ
²,ber‚
„Dckƒ^’hƒ~–Kwis‚K‚N‰Q` ”—%
 ne‚‡MŠ=/73
‰#…iŠ:   
†Lƒ‚(ðC
A/ƒ-O!Öe‚‘,Æ
9sSBw<L.8*%$•`i„$…l†oˆ<‚P#
‚elˆ
¦g.…D™   ‚^‹.
‚1x
TŽ÷W®`
i„ƒ¥n.³`œ"[”,D
&ŒC@®oo®Keƒƒ;N‡  U„nOƒR(XOXCa‚           ƒ"‚†
Low‚AHm…
‰3‚L„x'
ƒ
…M‡+"&
R|;.Q‚‰`
™(,‚C‚.†b                ™J‡2Ž_ª(™zŒ0³*‹e…ƒ –—.¤KŠl¢s‹P…[†o 7‚_‚[CC>
ˆÃe„!q-@t‚
%Š8‚=„ Š&‚„fƒ^       ƒRM‚%‚}HŠW…/žBDSƒ=…ƒRƒp/(D
R
‹
£E ‹6‡?‡o'ˆm…a‹„{†"8ž…#†I¸^e=:ˆ>Ÿ*
1eŸˆ…3ƒ["‹ˆxƒ‰5FƒJ‡1‰ƒ"ˆ‡g9V

†0yƒbƒk;‡8…F‡6ˆ/•B:wBŒ;B‚ZLBo‡Uƒ.
4FŒ[…;Žc†2ˆ‡1ˆ#„5‚~‚EŽ;†T†gh°K     J’\ŒX”xð[ŠD(Cd*„FCTt‚ƒ{Ž÷#
X.Q^‡Z‚+§
…     '—=3v‡‚u‡tŠ—.¤KR<ˆc‚e§ Œe7‚_‚[CC>Î1‡˜n¾:`|³T®o7>(‚]hƒzÕƒP!/(D
    ÕxÆ%aY'‡hkAƒ‡h,—†9
G—/`2=<§
1¦‚9‚VuK^®:®oˆGNp‡fgo  —
Ht‡f
,Y#
DMCd*
BT^`_v2SK?2,$t¦-ŸB–°(ry‡ˆ)…3ã˜|ŽaZ‚¨+„›!st‚—7‚i—†>urƒŸ
     
7—û„SÆ7udƒAƒ‡F‚÷Sscap‚
…Frsubtyp‚žhÝŠuemp~
¿A¾[%¾†yster‹S‚F4ŽÿOí`‚‘-O„gDtter‚ÂŒ“ÙXm‚”C•ñxOdƒ$‡:h¬,+
—/—Ì8‚'h
.+
en÷
¾‚$¾4a_vocabulari„~ŽÿDtˆ&
-Nn@_
ñT:o‡,!U2/6Ou)!½X
ƒTƒÄc"!U2/6„é"ƒA)
a!o%)6Yœ5‚'„K…0
‹&´=R " 
       _|"‹_0R…^½.<‚'D>„ÊÚdP " 
     |"œn0r³„^alesc7‚‚Ue
‹?Oèk‡_‘‹d
™.Ã>‡
“…Gƒi
‡Aw…%Žþ`
;Oý1¦q…A‘„º‚,õ
SŸyù‚\rs;stƒ…de   5nC‰+ ‚E‡*?d„e„z‚81…i†+= 2f!?,

       qƒVƒ89
$'xnŠ#->$!!

!i4j""    
""ŸV˜€€€€t¿0ÒK
k
1
b
‚)|ƒP
Oo      v-E
L:)#SF‡e8
k†u-J?jQ8.)‚x 3
-            „zC
<Š&h…‚#4c‚‚*d$,‹2l‚‚7ƒ?_;ƒX$3
dƒ6#,v;76‚ky‹<ˆ\e^1KA‚#,†`&4„Z‚QŽJtƒM%D„        
Š.D‡$2C¬Sš$„ „a‡S]‚nYPe#36§x DŒoQP)‚@Px=ƒtƒ&3Š!ƒ3ƒšN¡LeŽ5‚G>‘6ŽŒ:((#mWv`>G5$‚MˆV‚+‰1ÛD‹        Œr
 ~=$ƒi+)ƒu#"‰-~J% „ B‚o‚b}C‚1
3("‹` ?B(p‚tZg„}„d!+„‹.ƒO.:Lu…]ƒ%ƒX      /h„ Y„@›=&*‚w0bˆMCR"‚U8     …F„ #*%ƒ.‡‚ „H?|'
        $ƒU     nKs‚0    4w!,u.5‚So.n8=X1
…R…]Zƒ'I1"†,‡> 4(„O Z‚pQ@:*1
~]*GƒF…i‡<G6‚b‰A"dV‹‚>^c‚X~‚42s‚/‰5D„q9ƒ9†Nk…3„bf$7

‚:~@,T&N&ƒn;^‹;„ ƒ      1£bƒOS3o
Ik
c;‰!q…Zz]H"GX9$_SW
8.aA!N75
Jˆc‡2…D).‚\^Q‚z+…SƒpHDwa
ƒ%h‚ƒ£K™<^‚kqE‚P„„†4*#w†<7$„„‚ƒ}D       !6‚9.rE$Œ1‚TVj
`¥ ‚AB
\!„ˆ<ŒM‚7`R@„ŠT„X„H]…U†2„/‚@„HeSBƒ]‰
‚({…‚_>„        i

K 
u'`I8‹2    m*V…9   'no4Ÿ"?
ƒBf„KlJ.‚0O"vu
E#s…ƒ@—m‚^ˆ‚x‚‚a
%/‡‡ ‡‚D…%ˆZx‹h,ŸDŒE‡n‰pF„fUa†Yk*#ƒBAW‚Kµ`¤;9†dN8\)4†IL…hz"‚Q5U‚3+ „'N"okˆb‡\„‚l($>0!]ŽcZK†.;…EP„
a&‚3+%0  BIƒ`kŒY„SŸyP*6‘{Q…0P”mŽGªC§m}Ž9       o’%[90‚*#






o

Q.4 \b,64,V]$;#:,"%7" /)*
x‚xƒat**‡š ‹‡at„‹|&F<Jq2P‚h‡      iP
‚"‰
Šd¥#n•g
S‚( ]5‚sDC„<%‚E‚4˜GŽM-\UU/ BE      ƒU      K52‚
Žþ8e—4D1   ‚#JB‚e        
b—3
2C        }„a'] ‚
nYPe#36-‡ƒb
QP)‡Q=j22ƒ3ƒšN¡LeŽ5‚G>‘6ŽRS:(‡]#mWv>G     ‡
‚@‚+
c‚rˆ‡'=Ÿ
v B¶
‚,.—*8L(,b]l       /‡^ƒ;

„@„&*0
0bˆMCR"‚U8 …F‚#*%ƒ.‡‚ 
?G%
        
Z
!     nP-   4 ,@.5
}o.d8=X


>‡DI1‡hn,ƒm 4(„OKO)Q@:*1
>‡d[Îoe‡(

:~?,Æ#GL‡-§   z7‡‚
—2'3!25
J)'‚\^®hCh‚ƒ5
Dž
‡i—2B‡h  ! $‡e,®q‚/‡g1‚Tj
`‡hq‚AK"


+' 5*8‡e     *V2A 'o%‡\
^Wƒ KJI"O"vu
gE#s‡hO—?
‚^N
a‚‡'RVc‚h‡d/]‚_ƒ$i‡:
‡B\q.„TUa,žf!5?bŸ'%¦D<+!
].Z‡bI
‚,;2a®d#
4

 

V
Q.4 \b,64,V]$;#:,"%7" /)*‡c!Z‡g"*‡a‚   :ƒ%ƒu   
&žvG
di‡‡m:
KN#n

 )5
""ŸV˜€€€€u¿0  ¨C˜m%X]G
"¾00codecpagŽ]oint~Š!‘~‚ò6%†4e•S¾/
N
W
S¾OX%†4e‚ifiƒ^efficivR23ƒ_†7
Žÿ
h23~
>
rc$
‡h#V
šHŠ‚-A1†t‚µ…'§
˜s1¾k†¬8xion‚‚_–‰9xist‚Šlz
„ez“Ød2gniz‚Šher‚ˆHincid‚Àen…5Œ+lv
|.¨;JÅ@7wv D-C<º$;3d‚&:‡6 "#TÉ%D›<‰2Žþn
zd¾UC;J"V7wv D-C#¾  \;3d‚&:‚C6 "#TND‡Ð„1~‘ ¾<2~‘!
9¾<
93~‘+9¾<
9d‚·J/ =    ‚U‚1ûx…W/ ƒÜ>K„‹4slabor‚†Ft„


ƒ.Œ     AKc5aƒNvƒ.                   2„Tƒ)‰>†p}ƒl! 38A8Q4"1.
J#k  


}X6    ,7"      5!…D„p›          
ŽU
ŽT…U‡{g
-*"             
"7!#‡‹M‰Jƒ
 „›I‚QŒ1’6    *Yˆ}p5/
%t
‹—*4|‚=Žr
?+"
g
.£    (ÂH‹ŠBƒ/3YbM/¢ƒl~…• ”}³D—,¼q  X
ƒcƒC
Š~
+.
VŽJ—>RW"
H
      
-*"             6"7!#@Mrnƒ
—2cŠ7I‚QŒ1’|ŒGrÎ$œ
«oeÚ;3Y—:KM/‡„‚FP]Ÿ#8Ÿ'     9õ®jj X
C.Î+.
erƒion_list‚t†DŽV–׆Dneed
,@„       W„q›cL
’Vu16‚“yed16
?/„       X’`eagu‚…ct]?‚†#D„Rƒ'‡EƒT½)/U1„8•G¡¡Pƒ)‘3…Žu%ÈfŽz‰@Œ;U—&©o?™rž9‹RK8ŠnÈT”:6*–e§#»F“/U1hW‚ÈŒH‚r%¾?'‡>®oK‡e!W—>?‡fQ¶Y|q§I§Z—3—WS
ƒor‚¦widŠ%‚ƒUÉ’†cÓ‚
sx–ƒ7…Sc•ém7‚¡atƒ‹oM6oquiƒ¦g—ëseq‚
žo    ÝX
Š!    nam~‰K‡J
6¾6ru
6e1‰O¾62‰P¾6won$
Š$KZ
>¾ r‚‹@!.Œo˜
=ñD
4!‚ç-1
¾c=spec~‰

&¾64
&umn+J/3I‡+
ƒT5  
C t k,I“~(G
‚7*2

=-
D) O
8/T%/$\$
!‚A   #    [X0    A/!‚"Oy
0
k?)    8^KDƒ^ <„Q
]
K%.,Sƒ       =b
„Y
„?I‚8‚1&#               >             tˆL‹6
‚-

        
:3


            1

ƒ]6.‚R…'‹|‚IHw2T3‡.‚0 #<
"7aGP5
2'
M52"1g2%†*?8=Bƒ;‚  ƒ#Ek1N8[,>
=
1>‚8A‚e&Rz 

#T
’h  %;NS
7 )R        zk*~…D„QG‚7f…,uOQƒ
X>E
ƒR&
{'     "H†       qK
<‡eE†[D6+ˆp*lY<‚,
2‚ƒ,)‚:‚0"G/      9  PO
     3_8
6„@N†<
B   EI   ‚c1ƒBlm8_'A/ˆ@‚
.
   ?Fq    
:‚a‰]f/4)6j‚)‚3s13|
Wk,‚0  .'.)  <(e X„n   Aop“X‚
$.AS5h„        ;Z%kI‚=9
, ƒt0ˆ        !x    p6K‡@
_

-!
)h‚f    ‚
Z„_‚j
      .#4In'
!
@d+[-‚!ˆ$…b…v‚7‰4$"ƒM—<ˆw#
Kƒ#‰~('*ƒ1@U|‡…HŽz‡\5†Q4!ƒjL.    
2 #l,*(1J>…yG-ƒP„"†J"    #1-(X
R:‚mƒ& !/9-‚f‚
„u‰'‚B5fE+j„|X!$
      1
(R! *:.#
!sƒU        !
&%Y`$"+Zƒ:.,%h9W]%„g         ZU (‚2˜{
6X(‡8$>‚4j"      F†N)…} ,
4Tf         ž/
    )0Q,O'
%=†a$(
‚b&7
 8
!!ŸW˜€€€€v¿2Ó$,?_=E…{†
 („,         HL‚t‚Fy9

 
)"'S2‚pw\(…f

'B„l9c(„;²j‚{UƒAI‰Q…!lF(,‚5+‚,‚#tƒ„    O`w‚:h55™~˜„6Z_^#s"       #\ˆ/#"F5("
kd
Et…;‚iy
…CƒUcJPcJ9t&
'ƒ]Fƒ)%
$@A7ˆd$–K‚F‚‡~ƒ ;ag!M

+
‚c†,K1l           @'4
#‚dFUJ
o-    9<zo"Š;"m#„F†h!,…_ƒH‚! \I@ƒW
‚!
'
e"$
  Jj…rƒLb  i  uwŠ>6#%$^mD…=ƒ32’9„E]‚Vƒ]#ID.
Y* Yqv{p‚C     


;/ %Œu

B(‚QŠ|ƒ
    ƒ;‚
1"ˆ3Œ2LŠ@ƒ}…y……~Ž>–_Šs…x‚9oK0X
#-kBZƒP]
$S’1E#—2ŽB
&tƒ\Ge„&"+%
ƒ*'2    E
x`‡pH ‚#‚1,‚+-5ds$
C),)S>

„EFX'mV/[.3$d(7Ž)9;4 <4336

B‡b†!‚$…K)‚6\‚TŽcA‚  
$#</      16ƒz3…,Z 4
5 
‹Lq‡A0@~'8j5      "S&!
ƒ,'
*0!
%(@#N
ƒ'ˆ(]        +
]


       

     

S “X{N„u:ƒ#xxf
"<;/‚c4(d&#\„@2%”p!‚U‚R       ‚  #    ƒ
        -^


%\ˆ
–z†      %4"D                                 „n†i'"‚f„?J…pF'A‡$    ‚,    ƒ"$^
„L     8‚\()‚|’Qb‚'†UU&       ƒ„@šBƒ=Bh

        ƒ>    

‚KL^;[†+r
"‰T
ƒE†}ˆP‚ kŠ†INˆA‚Z‚0Œ&FK?†‚AAAAˆBA†;†[@At‡+
d…kA@Atˆy(„D„uFA‡…5‚EAƒ
5ƒR„4ƒ|‚d J
‰!†‰6ƒ02P&     (
        X‚$‚      c„N4$Uˆij
!(

 ‹f8ŒQšg‚5§&P‚ 
 &-f)        %f    )      !t
L       
L

       
<$%~       
…wL
"
        
}‚ \)# 

       
&"%
$‚1
        ?      8
aJ:i6'
+F,VM
Žþ\]G‚%fMu QF
XB>E
ƒP'    "—6
jg<‚,
2JvK%
6,0"G/  9  O
 3_       6‚:7N
B      EI   
‚Q1‡Uhm8_'A/$4
.
  ?5      
Y})/4)[!j
‚313|
W-,‚N0     ')   <  e XJ   A
+p
‚/0R
$.AS5h„       ;Z%k8‚=9
, w0(      !m        p6K_
#


)    ‚
‡*I 
      .#4*n'
!
@d+.-‚!—8^ƒ…v_‰4$"ƒM—<ˆw#
Kƒ#‰~('*ƒ1@U|‡…HŽz‡\5†Q4!ƒj  
2 R, *(1=:G-kD$3"     #1-(
R:`ƒ& !c9-$‚
„uY‚:5f:+jjlX!$
 1
(R! *:.#
!s6‚!    !
&%Y`$"+D+:.,h9W]%        Z (2
7X(=$>‚4V"       F2„&)…} ,
4Tf    ‡S V
   )$,‡S=C=EƒÎc[


#9


 
)"'Sw\
ƒVŒz‚{UƒAI„…!lY®Q.Ÿ
åGLO!M

+
‡i>—6.‚‡dK1c           @'#fFU/
o-    9<§‚.Ÿ„T‡h
]7 \I@'
:!
'
e"
      J
Jb        _      
'¦w"‡h\mDB
2J1f‡h%#M.®q       


;
 %$

B
(s†8
      ‡Zy
%"‡Z-—V
-
E
]
$JŸ‚¶‚C
&‡\$‚"Ge„&"+%
,*'2   E
x`g‚!pH ‚#O,K
B-5‡g@[$
),)S

~FX'mV
!!ŸW˜€€€€w¿2«[.3$d(7•ôd
‚?;4 ,4336

;„?‚#)p‡‚KA&  
$</    16e3>L,Z 4
5 


0(K~'8j5        5S&!‡‡%
*0!
%(@
#NAQ
&]L       +
$
&
       

2      

S NxK 
"<;/4(
S&#H„@2%!X,   #          -4



%Y‚    %1"                                 4‚0'"žY#|‡‡p\si—7&   T‡‰!‡frN„#02P& (
        X|‚
     cn4$
N j
!(


     _8—j‡s3OcQP‚ 
 -L)        %F        )      !t

>0
L

       
<$w%~    
$\L
"
        
]
\6# 

       ¦^ %,
$
    0column1‚!$‚›"#_‚Fƒ   ˆblobf„Y+&!;,†Vÿ<@Šn‚-O¦„[Öƒf        ytf$   ‚e^‚^"Y†WKŠsy?h¦„\es16f"
‚gq|{e†XKŠx‚~¦„countHvW?†YKŠ}@
¦„database_nam6¯ù„Ze166 ¯ù„[      ecltyp!1Î0‹Hù‰Ke16"1΋ù‰M      oublf#†ZÏN0‹‚3¦„_Ò‹intf$†[…`D‹‚¦„`¶‚C64f%†\K‹‚ —I¦„nam‚Z"
Y&¡t%‹Fe16I
"N'‹
origin_nam6(¯ù„^e166)ù„point‚“@•êsize_impà`¾‚      table_nam6*¯ù„\e166+¯ù„]      ext‚$? g‚f:1Y >,,†]…bD‹+tL1]
ƒ~¦„b¶‚E†¼16f„M"v*\-†^Õ0‹1uHt
ƒ9¦„cÒK…ŸkS      ypfw!.†_ÿ6@‹6p,¦„dÖƒvaluf„ /m†`§„ear‚…tDŠB‡g—Ì…/„Pcont~ñAg–}±9½\‚wAg‡/ˆŽ[nam‚w…ER›v<†<*‰ƒoÆ<›o774;<U:“6:›Q;Ž;”_s~6—“VR%YQ1¨Ž’L—$‚\`¾‚P%YQ1…‚       /<us‚¡ÝŒ5s,H7$< %ˆ/•ùf
‚ƒxm‚A3„V~
„s|†*Š
#‰(‚a
‚Œ'ƒ”ôUF‚‘0LbinSŠ_G…%H„,$4‚"5U d‚|
ƒ
ŒU†…w‡bãfO*…R×d“T'‘[©       HOQ…‡Tƒ)Žr<
 K*¾"d„@…ek‚k¾v‚Œ$”V•6•{j}…)•Vi“c–‹…f‰
š…r„&ƒTŽhDÞ#?Œ
˜ž: l|…[Žö‚‡¾…s*'ƒ+O*;žxÓT—/$‡‚{   ‚HOQDxí.:_’] ƒS‚ׄ‡i(—/®rF¶XQ—ƒoX‡g
…
x+Ÿ¾H¦‚6ƒ|N@§†*¶„FÆ„[db2‚ßGÝÊyI
„¦žgcV8V
YD„4„
’T“i‚uœ£P›…8Š`ƒ;„\….:Œƒu’-
‹'H„7 …P„ƒ1ƒI‚           –‚yŒ<„„s†t>„2†8Kƒ"4‚c4…0‡/‡B
”Fqˆ†Â)ƒŽ&†]^
‹\ˆpL‚@*…‚Šz‚‘%‚3Žg0<†e‡*–†P•‚|nz)†p0’I†|†=–Kˆ6¤^‰-–$²^‰k”y©Iœw›#Šd¢ž6™
ƒT²>¡M‹4–ojžG‹LˆF2‚/‚„#‚}„Žö®jz^§›L=oB‡k<:Õ5—‚:—<"hƒI:Õ‚*‡,”l®{„42ü‚R2FG‚@§AUj‡b
)—7?—‚G—0r‡o       X‡†"®i‡†?§gz¦X¶“L‡‚`Ÿ+ƒIƒ]Ÿ       t8fort‚I
–2X’Xmax@ †1œX‡uB895&'"31)'$#`Q9)!09X*R„]†|
""ŸV˜€€€€x¿0Ì\„?

?‚ fŽVš”†YÉ•uš$$„sv™>Š0‚!o„W”E‰mŽ{z†Z½'*‚¾&Bƒ!      B‚ö
$âK-§õ2]‡‚?J%I»B‡f
$z‚   õ0command
T0A*y353AG
>6#‚
      +

B~‚K4‚%ƒ"wG3P*c%
$ƒEB;
B
6l
#    *
9Œ[‹b&
'
C„Q%&7„))GB%gƒl;-       
8…Z’
>ŒVƒJ‰:ƒƒ
„CT…R‰†El(XS%‰jw1ƒ{…‡a$Jƒ-h 6;‚8C@EA&ˆ
j§;—„qb>!$WW#\U
       
UA+'-—y
Z
‰JŠOƒi“l*¡'
†TpŠIƒˆ%0xCž/©/&
†\#+CA* I(L;.<,d8‚‡6ƒBzJ?ˆV
‚[
26†Xƒ$[$Ul =TLDZŒi;3ƒo–Z†R‚8Šo/>‚hI….„‚?‚M'D8#"Œ%‚q†>…l†D$xjF‚UA‡P~‡yX(ƒ|…O@hC5‚‚+!ˆEg";ƒZ.
ƒj
b(8')‡L   3ƒ,ƒ4ƒ=£pX;     &„!‚Cƒ%ƒ)ƒ(†@=
„94‚?‚#…ŒBƒe.    …„0KAo -ƒ)4ƒ}—S†Ao‚<…6ˆh2J‚m $a6#.e
ƒL
&C ‡–lJ9…r?‘/
‚j…X ‚b…‡'’V†9&*2U‚w†g9[—LL:MrKo&‚Gˆm‰„\Lƒ…i‡j¾W…2ƒ+…R5‚>]‹?`P‡b/i…>6(‚T-‚x…r‚:!ƒr‚6iƒ(„!#„ˆ[n…j|ƒŠNa…†@„<‰R…. 8V]ˆ   =j2*!)‚„l)Ø2‡a‹{ƒ7W„6/'
0&'*‚M;#      KD   9r(i>}
""A*#X     "UMG
2D"0        %#    ƒ`6 @\/u<%60LQ";7i!Q‚8Ic606 @  P9     d!4-)K4'#fRab7)=\$$d>F*v!YQ!1(
@?P*`„PE|ƒ      !0”/º‚x‡f„`&7=z .:SƒA
Q()“xŒ‚]„%'ˆŽöƒ
k‡bƒLl(§f—IVqb$WW#U
    'ƒ 

‡*V
n
"
—8
ˆ{* k—4‡h
bƒ
%0?C…,ˆM&

#C* IL;.<,
dÕO
—2‡X‚)[U
& =nLDP‡`v;3ƒo
†*"…K‚8Šo/>‚hI(ƒ:„‚?‚M'D8#"Ÿt‚q†>åH X¾:>Pf‡j

5—;E‡ce";‡j.
<‡#§
!§ƒ‡yŸ
‡i#*MŸ
4¶V5‡k—8—1E$a6#9.e
<
&CL
ƒd
/
‡`M>—1Q—9,I‡2Z&*‡[
‚wC9[L:MrKo&d—ƒ0„>†_JL        ‡X0F‚w‡0‡‚
25®nb"P‚VK/i6(hT-^'!-U
w
ƒ#‚^¦U
&)~‡ec 8
2]]=%‡\2*!)Y§
m‹{‡cB:
L6/'
&'&)M;K 'r(i>*
""A*#  "UG
2D0 %#    6       @\/Z
%60#";iQ‚8c06 @     *9      d,  )#fLab7)=\$$.>F!"YQ*!1 
@P`—0E|ƒ        M
0‡zj„'‚S
()*
¦equivalƒ¾T—ÌT-encÉ‚
’{½½‚ˆ
!‚u>_[3‚M
™nV‚
‰`ˆ‚·‰;‚_‡:)G‚`‚!
j³‚!…‰}¯LB];ž}Š<Œ;T
RÍz„j
Œ'
‡m
‚ -³qYz›P
ˆ8™0r‚  ^Á3
ˆ8“‚E‚‡g8`7Ž
‚‹gŠcn‡>‚8
 „Å‚n—tš-
""ŸV˜€€€€y¿0½
ßYˆ—8‡…¦~…)G®md²‡h—‚‡i…#BJ9Zƒ;c¾;;®xõŸÚg4
KE9¾'8Ÿ'
U„8‡\O‡e¶6Î        Æ"n
¾X&0commentari‚…P   ™•Œ‚ÆBrc‚ i‚¸   ‘r
t‚eˆV
l‚a  ‹‘ˆZ‡‘it   ƒi
>(-QZ=6
6O0L‚>"05A‚:'a
‹?„"ƒI,
m
/ni)
_$ƒ*G‹bA
100            "(
4„1#

L„#y8Ueƒ[Œ/E”'P ¾l»WJ™I#Ø–dÌ¡Y»:
Ž+~(‰ƒ)   J~oY
ƒ©|e”Šr   ˜]U¸Lƒ{…r‚n‰…•K0<="
†Q‚IŒ       %*h=)m ‚r‚j=c)‚o] Vbƒp‚|e&,ƒPk„lcwE:95{ˆp*

2‹0«*@     !"  ƒ’E–r*K&‚ }‚7ƒU >ŽH2;        ]q‚…o7gf![0‚6h‚w^.a4&‡<

‚Ou     ‚g –u 
v&8ŒËU,4ƒ6#‰r‚ˆ—X@‹5
…l†g‚;"’‚_yŠ      ,oR…S/
i’Fƒ      †$
ˆ-$4‹9‚!†_ ƒ|‘B
Œ}—ž0‡D6ŠG> /…tw„  ’'D‘|…*‚
Žöv
A#

>y8
e.Æ
‚Jžx„{#Ø–dŸ†/‚Õ¹oŸ#‚?     JmVY
‡‚1‚gP*‚Ïr<="
†QJ*h= Yr<B       qSV       Le&MuC&wE:9*
Â{
6h'
^.a¾?o 
v&8‚.Ÿ,®V‡fO
D¦{
L"‚y6O,oR¦Mg9‡e^O®qP6ŠG®V—^
</+w*   žK—c_hook‚CGY„rœon†!ˆ\œ
8       "

@%#‰QMŽ"ƒMyq7]_/$
‚

UŠv¹ÉbŠ†*ƒ=!MŒB¢#‚m¯L¥sFƒt‚%ƒZ
„/ƒA‹>Â*s``'‚R‚<ˆG+{ƒS5†bƒr‚YB’t‹])    …t/ƒ3Œ]’H…³™oG„‚!h
Œ'ˆ3Œ2fƒ2‚ÀjX‰„yœh:‚6„rk“>„y‰#ˆ„‚IÄœx‰-„f‚[‹_Ÿb‚TœK„^Žþe
‚
¶XQ‡i¾
!M‚c„sˆP#‚m‚ƒ*'
/Fní„R‰L9‡Y‡‚VŠtÚƒ§K¯
|žsÝfGI{F§"‚-Vi‡v‚dŸ…B
b٤7N
¯!+¦*凂‚    „cli)t‚C‹
„9×G…`M7™|ƒ#‰h‰X

3±;„/hÍf‹XƒSšD„ŽRŽþ‚A§¶ÂyL‡dƒäXYü^
3¶q§‚!¶„í"¦Qw‡(åUŸ"und-‰
&/–=  ”]„      
„%H†Û+‘|B‚{o   
L Wž0†H
‚Yj
‹(‰g„e†ò3‚Ï„-œ40®IÆ(

 W\&®jÝ[åEt™qj›1:†M\µ‚p†¼
Y:
%\pabl¦Cct‡=‘+
…[    ?¾1…  C†i‡F‡†ï|û…i‚^j‚ß‚li‚ˆYni‚(,|
7

(Blo,5 4.',qC'
5h,r*„W†6a‚O(%ƒ[
…-ˆcƒƒG(”ôQonía†a¾Œ@‚Çh4r‡I‰y†n~9ƒW
†J
‘,[ƒ
50„|Ž†X
*‡Z D&”X‚!c"ƒY
,r     Æ[™}R„B
…q—E)Šfg0Š3D‚F'0ŠQ‚[ˆ> )(.ƒç
v
‹2#
ƒHVƒI
ŠU?‡;Éj
g„W·|“‘%
Œ'Œ9”G¦{E…j•wƒ.“P‰mŠ3
‘e–o… f™f;ˆ[y£O‚g…´‹ÃR¶fˆl‡)z
½"Ss„%'Tƒ{
cŽþ„S—2(ƒLŸ&
;J(j(GŒ#† ‚V,p 
""ŸV˜€€€€z¿0Çc"¸,r    ‡‡N—3
%
HŒ~E)Šfg0Š3D‚F'0ŠQ‚[ˆ> )(.ŸzÝE
LVŸ‚;®j?‚¡‚$¾‚Îi—5.UŸD¶‚

‰‡_ˆy
—…N
r‡‚\Ý&=®N<;Æ;g—„L+Kxˆ
SÝs0comparisonpZdu‡^–DŒƒLo†lƒ4#
P)ƒ[ #`“4
?0eVBG  %‚}
R.o%E$+/\
B:„k&Š#_H%+›bH!¶A
ˆ):‹ƒ!–d=       –JG6‰{’t
H‰f°PT"„FVŒU„v…^Šd‰
…#š
Q
‰h³,Œ
í5
¼ +
&„9
g<ƒIŽþƒ—9Ÿ'?eVE     %
l

B.7%E$+\ˆžje6&Š#_H%+›bH!¶A®j
‚Y:Ý_%ŠqM;‚È3«n"4O¶„a§‰*—‚
”,
O
õ5+ÝC
&tƒ$ˆ<
$„YZ”+£>‚JƒkƒGŸ
m‘‡D‚8‰9ŽƒJ
2:5
Y+ mtŽƒ~   Œ^@(ƒXƒ¡z…Q„Q‚Dv‚¯TÀ"‚eˆ
W)‡
†ë=‡U…[…%,‡E„U
…!i      †
‡ƒ?”k‚’~˜F†9QœqƒY…        "¥ŠT 
>”97‰*V†h7L@c‚h
}UUi‘w’U
Ž„
1ƒc–;‚7–M“W•A]nEŒwj   ‹uÒ5†N!…U†R8F†Eˆ~†S.‚{†(’B#…_Œ9Kˆ/$ˆM†‡^
Y‚c½U<‡)„—@½)ƒoŽ÷  ®ƒ        NM
C‚D‡s}‚?&,    !Ÿ‚<ƒ‡2‚W‡J        +
 EÕO
+|Ÿˆx‚‡˜„4—%AÆ*”6x.7—5c‚S—4Q»I:D‡[5Ÿ*B®kŸŸ‚m0®rP{KF†Et      Ui#@k,   xN¦‚U§Qr‚ˆZ
4®Wƒ;el‚q@‰vÎy„[)Žñ>„²c‚Èyns|‚t‚…ƒ&…}U‹CŠ_”ôýƒMÄkit‚E„iV‚A‘&—ã        or‚†zˆWƒLÙN"il
a 
ƒ1ƒ^„N
…2†r’w 5…Z„@     ‚ƒM
‹lƒy37‚"
‚G-$f
n
+X#<‚‚‚K0O        2q
G       :  -[7   - B‰z‚dD‚>pJttJ.‚‚KAXƒ72
\eI,
?ˆ5E‡
(Uƒ*ƒ‚ƒi‚+     4‚*…}Ž„*Op,     G‚MY‚œa3ˆ&8…-l
?„†)Ya?
„‚G…B‚
n*…GDŒp
Œ“˜ZŠD!ˆZƒfJo#c,= —n'SU
ŠRÑ/
t#…
„$.wƒ>ZƒQ./Go/‚Z-
ƒ~
Iˆ„‚

(S‚ $$=/%‚l V„+
ED‚U=@#j#&B;T&Uƒ„"Ey‚\<M>‚ziM
V‚b‚}‚#t
4/_<[Gbv,''/7G%U‚F9„‚6ƒm FGRF>Ki8…Š•/g4K0,ƒy=‚ey…Kw“X„yR
,
4%)>.N‡7>87Q       ‰ˆƒp‚e
        
‚=‚…ƒs>ƒp„J*f„a2:‹_%‚(ƒSF* ‚!r‹Y
†L    ]…'ƒˆHG=
IOljƒ^‰ƒ3
…/Es‚$y‚˜ƒˆX,ƒi‚t„.>=yƒ|V8ƒ" ;
‚k#‚LTE‚F ƒ„gƒ'‚fk   †9ŠX‚G†l„‡ŽX‚NŽFƒ‡}…Q&GV>J=ttT0'&.X B@{l&˜tNN     *>ƒˆl"‚
ƒ-…*)ŠyY4A
@˜Xp’&…DœfX
}„_BUK%
>{|†#ƒ„f†a.‚{„7s*ƒ!„,*†1‚yƒD‚ ‰]‚TAU<6Z:ƒmƒ"9‚'ƒE<<bp     L7„4„7"‡'‹0J
f    ><)'JƒL34]},5(†_#9•s“XTdƒÓ.        I"
‚ „2?†y†q0|NB…‡\! ‚   %       ‚_ƒ6U‚kƒ‡ˆ5~‚?‚OÃqt*‚&
9Q„3)Df…3‚C
ˆ¦#De‚0Žöze8Y—-M‡i
G
Y#I=‚`—7MJ?‡f
„‡RK%WD‰
Œ>“˜ZŠD!P‚‚/„dˆ        FC+$
!!ŸW˜€€€€{¿2È÷        Goo#c,‡i!SU
‰pR„"‡JÕf
—.& &‡_$&$=/%‚l ,„+
@*D‚U=@#j#&B;T&Uƒ„""y‚\<MP‚ziM
V‚b‚}‚#t
4/_<[GbvF'/7G%U‚F9„‚6ƒm FG=@>Ki„?g4K
,==
-       wˆ'NN‡e
P
,
4%
.N‡jKÎKÆ$
( §W‡r     Ÿg‚mS
ƒŸh‚$y
‡1‡`;ˆXŸy‡i—7T‡8*‡  
6®p‡i$—>3&GV'—/)otT0"./ B@olU"IN *
2‡_"Px"‡f
"—Bg‡aY4—;ƒ*
|‚T‡Vt

„X‡[
{§
1B3K%ŸO†#%w
>)u        }C‚$%
*
      1%]‚<
      <
      6
      Z
      :žZ
    ‡:'#34]D},5('#¶‡cTF‡‚Bˆ:"—?0N‡bT%%   -U
ƒWƒZ~‡V:‡s‚        
*()D;6cje‡H0compile_opt“'&kÍÄ,†EŽfùˆ;…Þ†E
option_get‘z
&! 
_
Ìt    @
Ä
•‰Tù
ˆ/    …Þ¦ƒ:us
’!
&7_
Ìr    @ƒÁ(        ù#
ˆ-    lain‚’&Š#
;‚Ùq.…¯9=K6  t‚•3ƒwu„UBÕf)ementx‡'ø%›l·E£qèDkªRŽ@




[½Rdžy‡·EŸ‰aW»†Ä
MRb




tˆ&‡Dƒ3‚‹…$‚‰#‰k      t
0
ƒOv7o
‚We‚f      ,‡‚U…4R&e y"†7AD1„s‡Br!›M1kƒSˆW2M‰]"˜,Š0ŸF‡xž(”s‘I˜J‚`[";’90¦lŽz†=…ƒuƒk“h„ ‡`…1‰VÎ{=‚;†g…J™edqt‡gK„&WA
„„ w\\‚ƒ,„Uˆc-O}‚†Jƒ=‚p–„Mœ?’}Rˆs‚e7Šft0…\‚)ŒE‹R3„;+ ]¡      ™=250
        P1  )
#1‚Vƒ„G‡)ˆj„Y2‚H†‰*j…H‰[ƒ˜Š
%B‚9…‚;4Žv…:‚
‚Wˆj5…;‰jˆ:ƒq‚C‡~‹oƒ]‡`…G\‚qƒu1ŽQ`‹L„j’<"«g„K‚%ƒhJXƒ„YƒJ*!†`ƒKˆCƒq‰[‡j‚9……O„†‰‚ƒ;‘%” "¦lˆ3…C?9†-†`1„"UŒJ ‡Ž °`žw‚ˆ3„#‚-<‡{ˆ†ƒ†md
ƒ„Io†txL‚j[ÚQ@
ˆ>^‚ “W‚h±#‰Iˆ#£V†  ?ž8.¨>:‡0…i
VU‘*8‹D‡ƒ*?ƒN‰hŽöz3P?"‚AD1®eiY
ƒF…‡q*ƒ

‡^R‡8J"[—8"ˆm’90¦lŽz†=…V[‡[`‡Iƒ(=0g‡OX
‚Td'Ÿ~®o¬}Ÿ"@‚‡‚„McˆB*bGBe7z—10‡1NyŸ!6ü~
        
P    )
1§   Q‡U—6*j§C]
%‡YW…‚;4GiIU.    5:,
[:<¾P%‡‚r1¶]
`
~‡cP—4Hfd—ƒ*KK7ƒD2¶X
(‚‚lˆ$‡†l—‚%-!?9‚_
1¶f‡gU
;†k‚P§
‚x`ƒ
‚%#¦
‡g®q
‚J^—2
‚'‚h—…)‡ƒr‚AP<„Y.%
;:JX
!8zN¦i
?e16z*  Í  ùˆDxvŒ
_
–vƒ5šxÛn…d+‚>‚
…5
ƒV<
‚'}ƒD      ‡M¤‚S—k
]|‘0æoA“1
“gC
o‚BV        )™.—G†4
›yA‡:ƒ[¨d6ßp‚n-‚^±f
‰U½ƒ®4Oh…¦i(I‚
õ‡E—9
âK¾QCür
‚%ŠFT23%y,
##ŸU˜€€€€|¿.±^”Ø…/¶KOV
ƒXC—0h_Ÿ 
    Ÿ'I

{3”)¶T}¯ƒV‚^—,jU0compliƒ—ëR~anc‚‰!Ø7‚Z    t‚ $"!Lü'…p$"!c3
›I(aq†”ÈK‘L…eƒZ‹ ”pƒ
R‹qƒ&‹(´|’t
Sƒu½†‡ƒ=—³}Ÿ‚l%zü‚u‚‰„Õ|>ýƒ‡!õƒ%‚`‚¨ƒƒon˜cƒ7=‡P?ƒyh‰7´*Œv‰K+Œ]²O‚vƒ.Œ
†d
Q,%"U
ƒq‚-<…{/ƒN
ž^A
„S&‚†zEj$
™@µ„Z‡~MD›}pŸ‡k„cœåB%"U
={*¤——5$—:—3C—9IõÝGs‚?‚pþm      ‰Œ  ‰xˆ8˜"6¦J¤
‚t½‚ÅÕr.„‹oO§ƒoÕpÚ‚c®‰QC;its‚E’T
‹7
†q"•“~“‚„"Î5‚‰Q!und<x&— 
        |Wf
‚`‚‚.Z5šj—`ptis#VŠfeŠ(#
ÍLzdE‚fA#`z[Z[c'_a+    r.<Wr‚{^‚Q=ˆ3Œ2”Q‚776!²^"@.|        *=µÂW’u        µS#VcÕi3í7ˆQOƒÜAJ¶Z‚776Öƒ?"@.œ*=rehend‚¢ù–'
s‚4‚g(ˆzss~†}2‰J„m
ÈM     ‚iA
'    .¹
„+…Z
Ág
# $FRƒ=?u     _
‚=9*"~        T     „   
†y{(‡Qƒg„)‚=& *ƒE…q      ¬N
“.“ˆr½[
…2V¾
'
{     ‚i0
'       .*ü`
—>„DR

?     _
9*„Éq(O„P   „t

8Y¾
C     ed_s‚µÒ³:is{¹A
œ7ƒZ›iŒP&„\9¥h       Öy‡„‚L„É|`‚¨n
ŽBomis‚‡/ƒ;%ƒˆF§x†‘˜,
%%‚:Rv‚°e‚‘‚=ut
ˆQ{
„7†>ˆ2‚fˆŠ
„M"…z‡?$…‡}…uƒUƒ-‚e‚7ƒNd‚\l">)#!>1}„*ŒŠ3@„ƒˆ™J„S8 °l¦OR(„&£nõzŸ9ŠW¯1Š
i‚…PšGŠ?†Š       „UŸgI;ƒj„v,—xE†Mx“$)ƒ,‡!Š‚&”&#†*ŒD‘&ˆ|™ˆU
˜‚
,Ž]„M‘/…T^†/†-’3ƒ…],…a,E–I„J0m~…k‚&‚ƒ2
†
™1œH
M(R
o?‡(‰a6MH       f
…'˜AUÏ%Ÿ8i‹‚#kY…=,‚  ¨v‡‚CÛLœS’q‰B ŠCU›L ‰~2I
™QpI_:XŒw“‚79‚Wˆ_¥e‚„&N‡œ8TŽö(‡‚       x}‡‡jF—‚X¶_ ›Dl¦OR(„&Ÿ‰^ƒ1‡‚`Í-f—6g‡i‡ŽT
‚N',~®N
;
vÆ"NœKJ
!‚§%
#w‡`      O49¶/d‡g*'‡-¶)APET
?,‡e
r,EŸ‚¶P2
n‚n&‚l|ˆ~zŸ%:

;(R‡U
m?¶_G‚M6MH‡\
Ÿ‚a¶ ‚#Y¾„/
"_ž{%2I

-p‡_‡j   )
“‚79s„&‚ƒN‚
Ÿ7¦q8Tation‚ncat‚¢S¡XZ¯V‚L¡]ÜŽen
‚)
ƒ!{‹@
„k 
<Z«QºD†[½ '¶SU‡Ø‚ueal‚˜1iv‚ë*xüntr‚µüƒpt'r…<“éT
‚fÐx‰…R‚>|< ‚_„v     ¡¸$ƒY—Z©
’[‡.ƒ(&¨†PÜˆŽ÷¾5_¶c\@ôi‡Œ3M^üNüaÎ\‡{       üXS턇[ê‚uŠ‚M50‚mƒH
†bŒN$Š‹•mE¹;¥rrÆ)bƒ;ƒÜ(‚™‚"
\>¾G'ƒB
rnœjñ/
±—V‚Q—h‚d®ª‚`8Ð*g£‹šYñ‘G CŽö:„ƒü†l2‚Ï‚¡…/;Þƒf®6åC$‚ž|>w!\‚pM‚:
‚YgT‰y&V‚

""ŸV˜€€€€}¿00concess‚‹   is“<‚_˜3$”õ"ludkdh\‚
i…j@„o‚KƒHR‚q“)•@‰W͆…u—LŒƒ=s
…C4H
‡H˜š1¸5–|™OƒgŸ„*‚-H–@-z‰5©”LŽ÷J„áH‚eL¾=:ým2ƒŒkret‚Ÿ!urrhJ
_Feˆ0!
ƒDB…i‚Wˆs‡1@S *ƒ>
‚`    
_„`       ‰*g2
3†'ˆ!?FVj„H´a9”k
T„      ÃA‚n‡xrA„#—k„;™N¢r¢C„b%ƒ@†F     î(†TŽö@‚VC
‚c@OÆ%»ƒR‚Ðj‚×W§‚
 
BCÝRÆ$žud‚@68uTitF


/x‰+‡

ƒ9‚q
•}
¦ã#n…gƒ.„O®Nç?  ’d„9‹
„”Hž5*rd9K3m^N†Ž&‹S…d„k‚y„H‰—S7‚‰sBž1ˆIŒO$3&A†]d$9—;ƒ"#!ŒA¤ˆS
¾Q—joŠ èf¤30IŽöQÆK‚n…g‡ƒ*¶‚r]ÝCŸ
„nk93mNŸeÝVƒž„MI,&Ad$9Ÿ&
‚Lƒ      "#!Ÿ*1ÄƂjŸ30iona‚
–ýmuct‚‚ƒO¢u•ù„kfer‚D
26ì(Ks”ÕH
06idvk"ª:Ž8+Ä]L–E‘ˆc(d‚Ïz
Lƒ¥ONenti‚&ŒYJb    A„*g„EE=$*ƒ
ZszE…=]4$    ‡ƒ"„t‰y(…GMB ƒ]P‚Zƒ

.     

        
S>
=ƒ ŠZ…c
lƒS4‡ˆy)‡1KE'ŽC„Rvœ‡
l4
kOˆPž
„F

»E?ƒ…sˆU.   „Q2‘2‚DZ/lx„„:ˆ[Ž#     Šk¥k
%Æ%w¶XN<ƒ

.     

        
S>
=ƒ ŠZÕ)‡1KE…$‹vC„Rv
“iLcŸ‡gR‚™ƒ;ò4œH
?¦b‚;.   
‚í5>K1./_a
ƒ<MŸ‚_covering_index_scanTªzùa getmallocj2jƒ>–N—ë^/utex>c‰UpcachT
Že2TŠYheapT       ‡B¶C¡WQ„GF‘3‚Dƒvwøp
‹sC“m‚σ<„¢x?Ldƒlogu_ŠtBH
m4Ä=‘¨
okasidT
‰u+s‘Ÿ\Hs‚‹…)ø…†òƒ?WNmalloc0jƒ„{Š‰-χ
‰1•M0nø‚A“jLd†ã2\b              emdb_maxsT“9šnùŽ{statuj
ƒj
„?ƒ#
†[‘/‡(q–Œ"Qøm…<‡(†òl   Q      map_sT?B|‰1&ˆ28
»F?ù„    ‰1…ÞV
?   
ultithreadB#2p:
†¨‚D‰Aù…-¶U$
texIˆAS"ƒpagecachT…       /|‰8ƒ:c‘j™[ø…w†òb    cachT
«v
e2T…2…ƒ«|_hdrszT…zŠP       maszTzB
 ù^
•scratchT…   eriDl‚w¨‚L‰Cù….¶U,        inglethreadA!2
IP¨‚;‰@ù…,¶U mall_mallocTƒw   
orterref_sT’,»1ù     qllogT
Ž¼!ù‘x tmtjrnl_spilT‘K¡#ù•uri„F=Œ$†|
•»5win32_heapsT#ur    
ƒ.
w3M
    &      z-‚T=
ƒ'(
ƒ"Œ2ƒ
0
%Usz‚"ƒv]DK„5ƒIrˆ6
k
     

%*„=PŽ,*‡<i†sf‚kv?Žt9Š+,ZXSƒ=P/yA 4‚e’Y?~‚@†+\‚vUl©˜<‘^ƒ% ,¨Q a¢{‡lkUEƒo†V‚(•=Õ28n\        S‚L;x)‚Z„9ˆ
$dN„*U…Šc’†{‡n^„4ƒO“QŠ)f–C†s•m@Œ8        …‰’n-3Fz
‹#"‚/†?ƒCš^¥r
Š! 7"‚^†8.
‚~0\’,§l‡:_ƒ\‚…\‚G'†^$‚+)$2q‹4C$=‚"‡Z„n¤./FƒA+ƒH7?‚M:        ÓD7 :e‚-‰-ƒ_‡k…7m
H:‰@ƒƒ
‚Ž‰7
œEƒRŽöƒe&A‡a‡bbPT,Z—2%\"‚>
ƒx +<„9,&
`-W`"R;G#B 3F#%)
""ŸV˜€€€€~¿0ÄOƒ=À2
)p      yA  4.Y2~
5\g        ‡‡e4W,” a¢{‡lkUE ‡i6‡erôz"   NX*‡ep…x
R‡nK„(F‚Ÿò¾‚
¦g
#Ý\6‚7
A0\—9—'

Z'§P‡g;Ÿ!J
$=‚"¤-FCA#ƒH7
0‚M‡oEÆG
žvd‚1ƒ7P
H:ƒ
‡U—‚c0configurations2‚q





rm‚|
mƒ.™c…1$„x•~‘ˆDAÃ0‚ç1#‚™‚\§|lict     ƒj‚ƒ…n:
.-"     ‚$
;)&DA      P1Lƒ<š~^
ƒ-ƒ'‚}+
+(^3e(#$
A
8I
§!ƒB      Š

\    ˜J„$    ‹{
i‚“|F‚g5%   <"2`ŠIs‚ f.j‚&…”w‚$;6%& +N
C
†
>
‚;+&q?$C#i*)Ÿ*.[„1VO47="‡2
D’%¡b•8w&       ƒw™G 
ˆ
†¡<½8<
ƒ    ‡W

«m‚$  a
ƒìz‚-N47="*
D¾,í‚Q«u
‚ÕjOorm‹_‚ŽPj„#ËB”—\ƒŽ‚`ÖƒAront  <‚”“ÑJus£G]ŠZ,1X†)„SpˆŽ)`j¦@ˆt$½;Ž…JµL¤
‚B¾‚x¤qƒ–V‡‡:$‡ƒ”gress‚;E‚Wƒ.ƒ~ŽYi„;‘Ÿjjecturƒ†!—ã‚unct…žs wGŒkÌ"ø“dÊ{„ùvnƒÉ68—ÌX
38ecteƒ!X(A
!†iq…-“‚5„Ps!…o‰L]‚gU4

hf "4‹uŽ5D:‚[
‚
‚KW`‚(ib*XO\
@
*.``ˆ{
   #>


‚3,4!‚;/  !R>+"
'y!,9
<9[$[        \…=„(j6T4D
‚@
&  XF*

QL
„(…`l
`%H(‚0%‚-n…$†1
-
U"<$
-|^‚$m*$
,3$H„ƒ)‚5c8Q*`W:H‚
,&‚    '@

ƒ.R,(       &0"Z$$M Z   …L‚it=

D_‚~uV†iˆsu.B
B]
3      „!Vx8
$t
G,6‚L‹oF‹:%9#L$%$<g9~"‚c
!…”!º:>TB‚   1,$# -6 4
;)+  c
~}!‚r‚
ˆ ‚<;-x«2•†Y4‚mw        -(,1v‚_:zI&Vb‚ˆ&…ƒu†w$ƒY
`‘x
(4‚4‰V‚w‚‚!„xlƒa…;Ÿ{“3Dv‰x„2r)TBK…:„1^1
2ƒ!‚Z2‡8Šn0„S„C ƒ`!
!Cp…5nP‚+‚#A††/žDƒ+9))+              0PIHB‚QP
‡Š9„…<#
_$ŒHet… 
aa“^F„H•;8¤O!(Ž?0‰8™_(ƒ+g
-'
R/&<3  +
i‚F(
Tq !,•yˆ
t ‡.)‚$-ƒ(I'‚Li-~9Jo ƒƒ‚*S›,ˆƒ‹~"†7HS\–r†N—‡52„N,„;ƒ‚^‚ˆZ?›I+E#
ƒ=cpƒSƒ…r‰9c
CE","%'q(
%)@
     -w , ŒW?„V‚Aƒ`
k„‚/‚y‰7‚„O7+ƒ7QiTk=>ƒ[‚`ŠH[Qk‡*„d %>Š&‚c,~„PDs!ƒwp‚{->ƒ?‚Xp¯4 
 
Dm˜>u1s$_E
dOƒ2*‡GZ!‚9¨,¢|š†K„OŠD+i170‚2†‚5F
ƒ$      Œ:ƒ/<Žöz..~Bt3 U
xE8
$k—)
E—9~"‚c

!
;—N>'
B      ,#   - 4
)
    (
~b!óRŸ:‚U  b
R5
YÎ
‚)(ŸO‚w‚‚(„Olf…;Œ|Z¦1D§XõŸ#+nP‡‚)¶&
IuŸ
‡k<#
_‡
e
\


G
¦_JÖ
!(‡‚<¾;
P
 -
Y„8?4@G
!!ŸW˜€€€€¿2ÃI'•¦/P%~—3E
N +‚*S—ƒQ
J‚]‡—‚
S\…@‚

ƒP‡N
,ƒ(
\‚E?
+
#‡>c®ro]8B
CE","%'q(
%@
     -
 ,—)I‚=1-E
1B:7}+
]7Ni'       
d      3

kƒ8ÍH6‚D&XDs!ƒwp‡d

-N
_
C‚T   
„&   
 
ž~su1s$_E
dH*‚Z!‚9rƒ%                V#D+i7j=P
$      R¦p‚/<  0consecu2ŠÐI‚]‚w’I±z…]‘é½,A„“r”‚rŒ_f¾ƒZ”/XŸ‚,—ƒnt‚ƒH†Vˆv5„%qu‚j‡b
ªHAŽ¶‚:ÛTƒX˜L„H‡%
šv‚†cû‚Œ[6>„+‚‘‚]¯     ;‚×L|„HÕ‚ZåT
B‚‚Nrv‚Ð_‚Y±>;“Ø1‚™‚id2‚A
y‡‡ƒ`E ‡o‰F†mz‚WH/Šn
ˆ:„‘;  k"Q&Gƒ+_…e     ƒy‚t„~6
k…Tƒ   ƒV™t‡W‘,„q‚f†,„Rƒ…S9MB–†&-$A(E#–_ :ƒ‡t›®G        Ž‚4Œw  ¸3
Š9&8VŠv£$…ˆ|ƒ@¡]—Y!!J$E‡šT<•M‚1dŸJ‚<‚$…gš\‚BdŠA/Šj^
bŠC ˆ6§@„’Z…GŽMƒ`q
ƒ
…q‡s|dŸO<~Y|'ƒ7—‚;…3RªD“†<„‡P@'"39;    …gžŠ    ‰?„Mt= ªzfb(?‰qƒ‰‰
‹p@Bƒc~ ˆqƒƒY†lJ“R“#‚QƒW6C’kg‡F?Qˆf‚ƒ„w†œ‹I   I‘%ˆQÈ:‡Ÿ!&ˆ«‰n“h-(¹¸x¹nxŠF‚2”J›‚e&¸'š.ˆiH`…,"$…/‚7(Žöƒ&‡‚J¶T
‚f}/‚/B|
‡a|&-$A(
#

ƒY
ƒ_ƒ4žs™y   Ž‚4Œw  ¸3ŸUcƒ‚„4ƒ@i
ˆ!!J†m"‡D"‡ScÎ 
Ÿ“J‚<<…g]
\dg.,‡d'—8.Ÿ
2 x§    ‚¾>—\
—9g—9
^Æ#6-Y|'I‡o>+‡sW
hƒTƒ¶ 
9  Æ!† {
t=SX‡@Ÿ—;}Ÿ‚t‚i‡h‡_„‚n‡g+8g}?Q
‚L\!@‡‚wÞô{
‚x   
d‚2Ÿ !
†Ek4   +‚b,§eerŠH†U „'Š1ˆ/@  z
š     
¤;Œr´wŒ1Œ#±TÌe
WŽöz‚‘MƒÜU”/ˆ=®<‡_st˜B„|„G‰…Š „o‚Ew;Œa;r‚UnŽ…O0‡%Žv‡x…R‚d–Hˆ²ŠC…V„"ˆ
„kƒ$¨#11‰!beƒw6]B‘
‰fSƒ!…k…-‰Šc‹vžŽz?‚_†[‚TbL‘-
º„ED|‚Rˆm3‡
L‹1”_ƒƒk„9qÅv&‡
¦L3„'1<$…D1P‚?ƒ4….•t(!ÌK†@Wc‡p“Š6‚7„Pˆ
qˆV+R‡CŠ8Žu‰M–•˜3Š~_‚h„.]
`‰ƒ.>„Še
MŠ[…F˜n’eDq`–B‡oB„3ƒ/o‰3Z…E‹g‹E“_e†‘9t%½  v‚(Ak
‚*
5…V‡4‚K—7–w11H#‡h
;6]‡‚*^‚T
*‰"_…‚2?‚_‚bü^t„EJS|‚R‡—‚bÕx>‡fˈ ¾*¾@xL‡Y:'1<‡e
.1r„„6(!§ƒ
M
—‚B‡g¶q
…9+‡†9¶Zb—ƒvX.)
y_¦Z8¶Y5‡c‚HŸ(u‚> L„koB„3ƒ/oZƒ6
7xež}
9tol‚Xœ"Œ(—Ì?Drtium‚$‚…q‚      #M]…TB50C_Ò6†=>"*4-1 ,#$tdU
>%‹ƒ'*.Ð+uŒ[‚ b(‚&‚I
žoþW        5       ƒp…H 3‹L-ˆN `
""ŸV˜€€€¿0ȇK‚¨M       B“†*ƒ;Q‚<ˆG†KE/ƒ<F‰H

Œl
x
ƒx\ƒFƒ0Cl!        „X!*
˜S„YJˆF‚          d#5>‚Tˆ,ƒY
!       
!‚P™4‹/†4i
‰
>‚
 ‚†5]½O‚ 
9
+‚  (‚&‚I
‡„H¶oƒ 5       ŒwŸ1‚7«t
‡ƒP‚>œ-‚               d#5>
‚T
X
!       
!‚P
‚‘
O]   0constant?Š†n#I*†‚@„7ƒ@‚„{>ƒ‚!ƒ
;(,
%‚*b,6p‚ik     .ƒ„0+‚‚4/|AB0-X<XkH"qj-5o&OJZ}D‚$p‚v<V‰v{1ƒKF!]9,
P%f‚#WZ„Tk‚})‚'B.
‚hA‚B‚‚{„W7ƒ‚U)ƒ31Acy‡M&&N
f‚c‡W…({„L%‚$‚q$
;Q7‚;R‚!„IK‚sD1
…
ƒ1‚†M!
@;P>SRJr…i‚1…fj-VZ‚M
”U‚WŠ9ƒ?‚zƒU2…J(W‚)|‚'
ƒA
EƒFƒWs0G‚G"†{‰
ƒ}";‰zR7ƒA[‚a„cX34
‚;…5ŒN˜!‹q´dˆ0•vt;°2“V 

„-
`ªg]>¡24†Gƒ@„T{‚Z˜¾‚
‰3nBªPša> m#…[†{ˆ5„kI•%·L0
‚SAZˆjŽþ^‚J§
k—|Ÿ(t;°2ŸhVŒ+ÍS
Ò‚§ ¾9Õ}
%‚ZN¾@
¶\
\nB‡l
;‡[
‚c#
}'®e3PDÕ¾M¦q.®hA      li‰ˆ~™i¶0‡ƒ#–pâv%ƒëtitu˜W‡<h
5M[^)µBM…Æq)  tƒ
˜%i  ƒ)™=–%Hòz‡†ÛDra‚ýÝèin‡   …|?‹‰fž-*ƒ-2<‚9‰iN”%›zžpŽ[„‚
„‚„ˆ,ƒo—2‚
q2<C
†     N2%
1‡\f
ttƒk‚
JT‰-‚V7j~ƒz…Sj      /="               "#%C
…jˆ(„5—p25
 *2")% !@+1R
)U‚E‚[b"H~D)  34
‚9Y
_j3!
v
|/(o
ƒ9):/@J„
{I!&=8s,hdj
‚3‚5,X*^=%&ƒ
‚‹Z"  x"B,/‚F•MtˆUDWH„v‚_ƒ8±9

     !   „ÃQ‚B“"Ž1‡FÂ9˜Ÿ+\
A’h./!¯…*‚6K,
 K*—$•@  ƒ„;0_C‚OF‚3(‚
zyYC‡)‚!‡<.‚H‚nˆS‚2ƒYˆ‚%%‚I‚;^(’Cª+^K†"F…{]]
§y
‹
^    †`1H… ˆQ‹z†i„†C
ˆDD4‚9?ƒ
5†F…ŠM‡U        ˆ3Œ20„v•{†‚˜"‰B‚#œx6‚}
ŒyAƒI
N6Œ$@~4$ 28,Oaa!3]I28860 .7C"P'+      ~('
     
(43J>      pX.@n#q5C      *-      :C"5Ah8ƒ+‚?#'…3…Z‚Xƒ6Œ`‚P?t6ƒrCX‰7+‡B:  )‘„J<o„d
+‚P‚h
D#X%
ƒZ&‚     2''‚
,(#:#>„*‚IOBc™(J›O-ƒZ(!!„@xE‚Jƒp„BŽ•*‰!…‚0‚E<ƒ-ˆ'       ƒk‚5+#ƒ $£=…J0‚BS‡ˆ[Žö}!Æ{;‡`'—=8œk

     !   „ÃQ‚B“"S
|F
„1}w"‡E
‡:A—:m®-5‡ƒŸƒ
 K*Œiˆ   ƒ„;Ÿ‚¾?d(¤
‡„§
‚    §         z‚Z®a
ƒ4bÆ)6‚=‡bx           ‡Q$¶.A¶X
4@‡bƒG0A
!!ŸW˜€€€¿2     º4$ •Ý".28,Oaa!3]I28860 &
7C"P'+B('
     
(43J&*  pX.@n#*"5C   *-      :C"5wA—1 :
<#'…
‚X

‚=IP?t ACXƒ1+:        ‡ƒ"!<tm
+‚P(
D#X%
ƒZ&*T      2''

,#:#>
„w
z5mI®B'7Ÿ.-
Z(&K6
6JƒZn0ÍPB0‚ER8…^        ƒk‚5+#¶‚…j      &0‚Bn¶‚O0constraint_check;;‚E„5‹C—µ4
Š
  ommithook;<‚E„8x—µ7
Œ:datatyp;F‚‚@„;’(–‰«t:
meq‚¶Y•ùy
foreignkei;=‚E„>*—µ=
r
unct;>‚E„Az—µ@
ŽEnotnul;?‚E„DX—µC
&pin;E‚E„G‘{—µF
L
  rimarykei;@‚E„J‘—µI
Zrowid;D‚E„M‘a—µL
8trigg;A‚E„P‘—µO
nuniqu;B‚E„S‘-—µR

vtab;C‚E„V‘=—µU
u‚†‚ct‰„Eƒ
Š‚!<j
      )‚
[P"
B$‚:•<Rœ5–>Ÿ‚uÆ=Ù|±G†5
¡   
ˆF+‚ †…J§1ƒq…g
‰9Š%„ƒFŠII‘=
mp¢ºA]‚†s‡OŠZˆz&„,„a/†4"Û–: EŽ!sÙ0
§dU‚G       ‚5Žþ*Ýc‡g–>Ÿ‚uŸ&`‰ÕNv‚™8+Ý„?¦ƒoT|Η@m—*kI.‡bp®Ÿ*#]((‡S6‚#®d$"-Ÿ$¤
‚UŸY
or$~=(!=:ƒ:ѹVk"…;C
ƒB¦8‚—`»-…€sult‚0,‰g2’AÐ"‘y¬FŠ‰‹oƒ.‘?”oœHø‚{‚×e`ˆt‚„E—å<S®s@®…{®lC
—DW–{m9ƒ-‡dŒXU9®K›ƒßjŒq›ˆO
z„8ddhX[\X[\XZW[[[\X[\hqrhpgqqrX[\X[\X[\VXUYZhpgqqqqqqnXXƒ   I„Hªs{…:
„mY™J“
²‹4˜’R–2§;
¾t]‚V#ÕVz‚mddhX[\X[\XZW[[[\X[\hqrhpgqqrX[\X[\X[\VXUYZhpgqqqqqqnXXƒ I§ƒcjaxí‚HÃ%
ƒbY‚¡kí?®RgåP"®qpt‰?—*tact‚
jˆ|e‰„s„z&m'
‚Œ!sÌ1Ÿ(.ƒ-ƒ-âG&min†
‡U‡xˆ@‚*‚<ƒc‚Q‚9*AV‚vUƒ$Bƒ,_‚"uB†ƒY?
ƒ4…‚O„)„)
ƒ@ƒ…&XŒM
?|6†f6DJ…TŽ R$‡[!‚'
ˆphC‚o‚R%
/9Q#Z1ˆR‚‚[@d"
ƒ3\   G
     )}
Q%…7(v
|9‚ZŠo   
q„‚aŽqw.„N‚b<F†
-„ƒdH
‚Af‚‚    ‘n†„
k„I‡x
†0„e†Ž‹|H„3‡&$†ƒZj.,‚,6+[ƒƒ R‚9
„b
ƒf4Šh+‰xedd‚%…Nƒ,Ew‘I‚‚Wƒ.‚M":‚r„=ˆ/!ƒ]$(%2
1'ƒ!(‚<w…Xwb#‚(u‚
MH‡^
D2„]5/</#90zƒ<
’R†z…9†
‚X
‡{‚M‹dpjƒ[ƒK‰MD%y†E!‡)
#†$‚`ƒ
0>ˆ&
(
ˆ-„ …Cƒ|oF'ANIX‚TJ
KIZ‰AT-L@SR*„(ƒW>‚#,.m2D#,aƒ_$(   A3`        QƒOu[#‚b)~6Q„
YM‚*AD%^k‚L)   (     Q‚h‚<ŠWGCe“O)Y‰'‚!†{10=‚‚M‚%v‚&‚f97s‚{„‚1ˆ<•Y‚eIc|†*‚~Œ1…o†C‡M†ƒI
‚‹$2@C‹~Šfˆ
Axua‡WF‚„'Š%0štL
‰|…i•12‚P‚YY04A˜&+„'ƒV.…Aƒ3‚lpd…:ƒ‚qƒf…Ji_…RS‹†…†>„+‚oA„a‚.‚N\sQ‚Qgƒiƒ[/„?)xZJ…Y‚&ƒ.C…‡ƒ‚0G&\I‚\\
n'†ƒHu0‚Fƒvo{.…9‡
…u„;…‚[/5#‚H.4‚gsŠ/†\
„
„P!h‡:ƒ&ƒ?2†fƒbE‚9ƒ_;uƒi4ƒc‚N†|…'ˆF „r!‚^„X„+IXŠsZ‚*†„H…Žg„j)†edZŠ]
ƒ
}‚ƒ%‚/„U
‚;
ˆTzzƒ?E ‚z‚)/ƒ+}6e %ƒ4.‚†osB9‚&‡<‚@/„}i„0…%‚R!QkA.b‚'
$<Z4)…p)6qƒW‹‹
‰†Mp…GˆJ†‚
$Dƒ-ƒ^/‚
0,[+:t„I,†EZƒgX…^d8p`?ƒx‘p:‡‚i‡F„
F‰L(H;F$‚A‚>‡5&’G$ˆG|ƒ‚GB„:-&2'!# &"""!„l"‚w`
!!ŸW˜€€€¿2Ì‚<‚]‚$‹)JO  U}‡l…K8Ž‰(†p‚L‚pJ‰Tt/
‰FV†NE‚†m‚ZI.‚#‚v#Cƒ|?„‚&‚6„s„$Jƒ/„V…8D,ƒHƒ!%f‹ZIA*‡nl/1†!2@`‚ƒ]‚b‡8ƒ…q]('‚Q†#ŠuU†‚J„‚‡5&Ÿa†o‡]…&‚v†6‡Y
‡B(‚S\‚ ŒA=‹Fzƒ-†f…C<@=„P;‡F‹ƒX‚‡s\8DZ7‚X<ƒS"`(‚8§f¯X„ `Àb‹Tºg*ƒ8
ƒ
>‹BA
…gR†F‚‚pmB6…‚MR^†-Dq…t—"|,(@‘vƒ
0:6Sƒ?‚J\„V‚_‰7;p3‚#‡^„A'o/-\ƒ‡D.Q‚     #
K‚‚ƒp@… R#„~g"„g
qƒZƒ1(‚pƒ
Z‚a„]‹Hƒ
‚S
B5Žö‚+     e‡`D"k„I@
§‚8B"$~#‡c*,‚,6+[c:W
a
"
\+edS‚1
#Ewi‚‚W‚     ‚M":{ƒ-ˆ/!‚e$(%2
1'0!(ww
$Hb#‚(u‚
MH       M
D‡G5R
</#90—16ˆ~†…9†
‚X
‡{‚M‹dpjƒ[ƒK‰MD%y†E!‡)
#†$‚`ƒ
0>ˆ&
(
ˆ-„ …CJ

F‡cdANIYX‡g(
KI
ƒGT--L@SR*m(FW>‚#,.m2D#,a($(      A3?`     Qu[#])~6Q&G
YM‚*AD%^k(‚:)    (     QH‚<ƒ GCe
‚H)
I‚!"*{10=‚'
‚     v
,&6f7s‚{„‚1‡Fu
:‚<I‡S
|*Æ`‡n3ha—>‡a–V†&‰|…i
‘2Y&A(+        
H.N(J‡D‡h
‚}Fsƒo‡&‡g‚=®o*§
n}‡g
Vu0¶B.—8B—Q‡{‡t!‡h‚Æ‚,‡‚$G!‚>‚
‚DI5(‡[
H†6.

n
){
VZ)
K
H‚a:J‚B¦Zxzgy—3#Q   ',s¾.74


/
‚i
‚A%K!Qb4‡*
$<f4)‚3)6O‡ƒR‚q`†9J
‡SeI#|;5$‚A<OfTB‚<‡b
@Jvs‡h|P—‚&‚0‡…_pz‚
‚2
‚dtJmH
‡‚'
‚„o‚Zd..P#‚P?‚F‡O`
j…
D,ƒ
!%IA*‚f~10
"2@NePH‡g]„ ƒ@ƒ‡_
]}B$;
3*~&CX¦KDC<=
;‡hK8‡„_D—5
"\‡6‡e$‡e‚8‡jr
„
6R‚e&lC(B6=‚M—#‚
D‡epJ       R    ƒQ"|=M

:6_ƒ?‚J\„V‚_-7;p3
2
'
[/
I\
ƒT.?
P#4K‚3ƒp2[#‚;eP$(‡dNU4Zƒ]—7
0contained_in‚S‘{$3V/l”Õou$3V/Mmin‚‚Jemplõ
ƒŽ]¾5>¾3orariƒ]nd‚Ž+œXìJ…æ„}t‚/;   &      !†"    …n„X‹      
„x

F=X„!‚s…Zs„{ƒ…pC„ƒˆA*"
† >@Fj†AQ
…5
       ”5H…ƒ4…;ˆMjoŠ/ƒ'
v„%ZGJ.„
(‚I-4ULIŠG‚'‚~ƒ^{ŠŸ0&CA
•‚”m=+ŒjF1^&T
Lf”:‚;‚G3V
†H’V…h†:!‡@‚(‡S‡.‚…}I0.ƒd†‡'/,
.5R"A
†j‡‚&W‘Sx‚|.“h
y
z‡_Š+
P    \|y‡,@‚aƒ8-3A–<†Z   >
„hfs‚8O…A‚m, (q…N„%‚P,&"‚2
%G3`;6"LK fF8Hu„'Z
—^†_„QŠ‚aj@„N-$/@‚@‚u„!Š8Ld‚2[ o‚V‚n”
š#™‹`(…Š;ŠV-j*ˆq‚x‚—‚B‰#y•t‚,…K0GCG,ph&aƒ|}M    80‡g6‚CWUY„,rW)’3‚cƒ.ƒRR!%f^!"eQ3‚1OH‚O\~!F
70*ƒ,NˆŠN‚j1u‰D|ˆI+/iƒ„`S]UŒI
ƒRƒl=5LY‚i‚+ƒP–f1'
 
""ŸV˜€€€¿0Æ      ,ƒ<!‚‚x‚Fu"*-ƒTd„/Y:6P.CC
‚m*…
–I?‡ ŠL-e¤…Jªxž£ˆˆ`„[…8‚„-ˆZ„_!ˆJ†Eˆ‹„^‚yƒ& 1.yƒ;‚o(‹r¦Bƒ42q ‡#Ÿ^ƒ,s’(G‚#c0C6…\
JƒN
.ƒ@%ˆ/j‹ƒP:
l&ƒ+pS"D‚J
q‚-
S+‚W>?
.=N>1<UW`ƒ_/7‚]†pu#ƒ*„S”      ª[…349*ƒCƒŠz‡u…_…5߈8nD‚gl†HEBO{~ƒ
>K‚{ ‚W„@:
„~
…#27‚O3ƒ*ƒ6‚‚m%k,    D{„†"94
]d„ šZƒB--‚# MX'K‰Cƒ/‚5†‚1Ÿ{mƒ70‚aiP‚2 
‰"
‡,ƒ`e‰!ƒg_Lq+`‹
„<…Z‚
„@‰oŽöv
(V-4U
LI
‚'—-
‚~7
>{§T‡[
‚d+B1^,
Lf 
%:           V
i„F†:!
‚(‚„(‚I$‡ƒ`-/,
.5R"A?+—uW`‡x‚|.“h
y
z‡_Š+
P    \|y‡,@‚aƒ8-3A–G
:F]     >
5hf ‚8Oƒi‚m@q
       ,"N2
%G3`;6"LK fF8;C
;
Z

†'ex‚aj@„N-í@&2[”|
U‚nXE%‡e(Ý_EC=,Dh&a)TM    80í)lH‡e!%f#!‡g!Q3
‡jJ  §C§j1R-‡c†g+/ia]       U

H
.=56YQ

BH,
2!‚x¾¾BDW
?‡[C)e‡OdS¦w
i‡ƒ®j
>F
s.‡^‚Eƒ;*(‡{‡[o ‚# „Y*G(G‡F
n‡0
W6BOh
—\%
]8`ƒP:
l&ƒ—?„[#
R„S    49*
zƒ1®.<C‡ƒ—8
S‰zD‚g—4lHEBx{,
>_ $@
2&
y3‚0—
46F‚m%v,  D{‡q‡f94
R‡‚@&„'ƒB--‚# MX'KNƒ'f8
u‚+{m0‚aZ
P
 W"O*pU_LC=—O
ƒ@0content_rowid~—‘
=J¾s
@
=less~Z—^ƒQ2‚N-V’+‚†u˜=†:!‰[—h‘5Ôx6?
ˆ    ¾}ƒ62D-V +„N†:!‚W‡6Z¶e$
ˆ        xt
‚1$
W,…&ŽW
Ÿa6w3$
ƒKX[
Aˆx#ÞU‚gz…,F˜-›!° ’1‚v‹ ‚/”bÁ3„Qƒtace/.‡f
‚(qgz=Ž`2Bm      OŠ4,‚:1  Y¤X6K$š8Œ*±HˆtŠ˜
†3.‚y†]Än‚+½M=‚*z…,Fž|ƒ_›!° ŸƒQ‚v%‰w‚/ÝA;ŸˆoŒ¶T_—9
9A®nb§&
?qg2
1®^M,J
    OÖ@6K$—/$ý
…*
ÝRw®e
h.¶Z=l*å   _db_handl0
~
ˆdÖ,“©_digu„N~a
!
1{œBê
©j³²ò%ž;    ÀNJ
H
ƒ9
‚‘Bˆ'•½9I„Vžt•³²Ÿ6Gƒ        †´
‚Ý%ÝhNn…5n‚]”—Lentƒƒ#uŒ5
ƒEd‚*ƒ1ƒv}MƒMz<t  "Z!#‰mn‚S
K8Yc„z…F…:‚[„l–+”[ÀOpLd;‚)0W„`3Œ„DŽ‚K
†0Œ/¬‘v†)J*;¬W\‰h
¹TtŠU…JSƒ>HƒRx‚l„Lƒ       
,‡
‚a¡=‰       „C‘J‚Wa!‹o4m‚+i‡

D‚mŽ6‰:8Š_‚.O£"/‡=‡$ƒK“'‚E?
…h+C„zˆtW„`‡2†j…u‚G¿;„>–b@ˆUÍH8:£
‚4mŒ ƒ"‘WŸ`G'Ë/1ˆZ†6„E‚+†B‚rƒ[ƒu ˆC“"„ƒeLŒ$$Ša…a+f$j<‰@Sƒ'ŽöƒCŸDƒ?§"O†G”[ÀOpLý3‘%7J„w,)
((ŸP˜€€€¿$°ô
&‡cW‘vM7J*0/—ù(^¾W<p„‚—  Ý
DŸ—$§§58¦`m‚$§‚f†6‡1‚(ƒX]Ÿ
ƒcCAQ‚S=$ŸfM f1TS        0contract‚„<„x•›
        or‚X—ƒdictori§^int‚¶q†HÝ¢#ri,Š9…H•êƒ_st
{…A’Z
‚j‚0ˆ* …6‚ƒ‚l}“sˆHs‘c„o5·x„kƒƒ‰lŽö{‚f‚¸Ad_œ N‚™ TŸ$M‡„/JR^[8ŒA C9ibut“èH
ñC„Y.k#*t"(     `bƒ8
-„#ÜÓzŸ mœC†Ó‚/
or‚
‹Jcˆ
“Épv‚«$olƒ‚Dƒ4‹]
=ƒ

…V
‚3~A;„      
2-  Z‚_Nƒ‚L‚)K1-2%p?X
:s 4‚      x‰"_     ‚r‚5?NŽ-48cƒVF:„]ˆ|„<k‰?‚SûkŠMÀU”X…x _AƒWˆR%î?‚SŠ=‚.‚;#"Š…WWŒ (š{‡t„‚…@‚`Œ„:˜k4„ ƒB‚-ˆ
‚g…(‚#g…Qƒ.†w
6+C‡7’:‚[‚‚      8‘K:ž5…ƒ½NŒD-ƒ‚g“k‚™p‰,‚-p&‡[C„d‚‰RƒFSˆ„
˜†[C‡sr%ƒs‚¡T(‚!gŽ‡I‚ƒ?Ó jG†
ˆ‚@bC‡X‚YT
Œ³5ìi’@”„p†’t
‡Eˆq’B©3V;‚ISå2&ƒ…Rz
‚$a.„7@ƒŽö{4pB‡h8—:X—ƒ&FP¬”X…x _Jw‡^Eˆ¦mÕ„‚„‚`Œ„:OT

‚
B/‡~åEõ‚¶„
Ÿ„‡ˆa
h-3‚rÅ|     ‡fB®‚c…7‡;—@8‡['Ÿ#‡^vW—2>—ƒ%—0‚
‚‡o‚gL¾97¦{‚ƒ?B@¦Gl‡g      bCF,J‡d
‚§Ž(„p‡g‡l_‡_
q
„,„WŸ'Q;‚IShžy

¦w
$vei‚=
„8|¬Y”b“©T
u|‚ÐniƒuƒDg]L†,Y›b‚)
†`&ë"ƒ‚NŠ;…[®q†FÀ:‡Ag„M‰
Êi‹H‡>‹"‚O
GE™&žKƒ?„,”k¶u3
N¥.
&—Š®F0-N‚‡<„„HŸâJiŸ,âLR¶ƒ.Ÿ—8„3¤u¾G2ÕS1t›ošªP¯_JS:/>:z£0
vƒ
ÌZ„bÅH¶‚ü'HS:/>:—NƒŽ8&Õ{(ƒ†p.-rg›%‚ƒ‚Csƒ$‡V3‘              B=U[‚ sE
ƒ  
M)q?‚W#0‚7—60‡#Šƒ$9C3=)(01-[†CƒL”s‰O 
–\F„c       \\*hˆg
„‡‚d"‚WŽ÷-‡k*¶‚F$9r3=)(P0/§™
«‚‚ ‚ ‚Èq§
«)t\ƒ‡~…K…x
•y$¡h„l
‚E3‚&™hU-‚MkB<E‚/bAƒ>Mo7‚D‚*

Y$
‡Žg``ƒ(ƒ6‰
Šx>‚ˆ—T„L‚B[8I&/t(‚‚F†2* ‚$}V*2LŠ[C³hƒ—*ž\‚
–}Ë ’s‡y"Œ.†$ƒ   p ‚L‚cxU1?7Wª†qnƒ-ƒ)—~¡_’T˜(XE‹
ƒdQ‚7’šE¨<
IŒz„A
‹j{™,§
!!{\‚(ƒY‰M‡,µN‡ P
„74’Pâ8“E®Rx$À*‹4‡{.‚l…ƒiTŽöxMu‡^t>‚§‚O
[kI&/t(*       G}*2L§?ƒ\³hƒ—*ž\HH
!V‚X‡G2-TÕg
xpŸ$"¾O‚™"Æ,4¾4
;QÎ#6—‚      
—ƒ—49‡n
,—!
\QsK‡kK§¦§
‚t4§     ®o
8*
ƒU4‚x‚ŒC”—=inc‚ sš7oki~
ÿlå[™l@ˆ^
    Ž)
†ˆo6½2žvÑ
™l@ˆ^
        ˆž5  6l‚·:/?üx…G/?per^„B‚Žþ\ˆìiz‚%No#
Š)‚J‚8‡Y
""ŸV˜€€€¿0À0coord1‚¨”Õyf2‚¨”Õyhin…‡_†0 µ    Š3…x‘f—•),m‡C!k„K
Y-F(…^   ƒP<S
†!4 &
ƒ6%ƒk†
ƒ7‚6Ž`†…zŽ6‘ˆXüƒ‚‘
N
I!
Y-¾.&
>    
O<
ƒ*74    


&%\ÚU
7ê|
1pe‚„'Ñd‘˜„á‚i‚V‚I‡Q‹<
‰?Kƒ7œ7ŒG‚S‚@r"=-9,
…_      dH†%7X{9‚wQŠˆJ       x‚ƒR)/:ƒ1…;lv‚g
Z‡D|6ƒ'„ƒ5(„u…†%
oL–26„$@ !}„{[™q‚c‡Tƒ&…H‚;8£&¼e‰8ƒ]ƒ)
ŽT
‚.‚UQ‚AÕ;¨ƒi–OKL
@%5(/‚hDt(J23‚Uƒ?kˆ‡*Š5‰ ‡J0"ƒ#ƒ80
ÆQƒaˆ~8…3ƒ*•T™%†<ƒ     6FR7v‚;X‹|Š…
YvXK.I!ƒOGˆp“eA›‡,
‹„>~›y2‡i
¡Auœk‡0ƒ=R
&˜!ƒc„S“2
ˆiˆY
 /‚-–w‹w„¢r…Q¢aˆb^†T
‡`…rƒJƒh«?×)‡)¯‚z¢5>…2@LÊ0h•Y†O
„
‡68$ƒF,ƒY1dƒIŽö{
|Æ
„ @%[Wq‚c…HX8ŽJ&¼e‰8ƒ]ƒ)
ŽT—0uQ‡vqh‡Ví&O
 ‡k
‚®Õ
/X«0®Av
h,Æ  ¶c
2†-uY!—*G
‚
RK$
Õ‚z‡maj
†
Q¶Q
 /!‚—.zc\¦‚}
T
‡f'A#ŸLhŸE‡w+‚|—M>ˆ  ‚/ƒ!
‚>
;"
P8P,)d‡^yright‚
‹(03 -‹K„ n@*ƒ+5:'a_3rƒŒV˜Št:e‡xz¢        ƒ;ƒX,$14.

;ƒ"
ˆ~-:0>Jƒcu_…/i@¼Q¤=“j
w‡
u
‹0 
²'L•†0(ƒ^ƒ/,‚N†=,‚no‚g"%y…I„Ž'‚VŒ6y
 vW„{‚=_("ƒŠ[k‡e‚A‚E‚uƒ.
ƒ55  †¡¥H”<L=ˆ4ƒu
Œh>
‡r&™¯ZˆfA‰QKˆmbƒs'-;ƒ„r=C%ƒ‡
&4)ƒ h
‚5X
Q˜<5ƒ?‡   Y”EZ‚[Nh¡.ž{
Š 
E†N–Bƒ!Ž
¥iMnd¥F]—…+z@‚žˆy—1
‡jsü‡~L’<ƒG%y
y_‚SƒY‚‘4ú„f—
&—,Ÿ(‡]MA‚HQK‚N%ƒs'-;ƒ9=C%ƒ
D&)
Gå        †]‡jP®pŽQZ‚[JL    ‡#uK— ‡e9
ZYjj
ner”$‚”on“:•]‚w•…,§B‘ˆù‚0‚çƒC‚°‚outin‚ˆFn¸LÎTx‰!
Ü]k-/ÎT‡©<
2!
por‚&‰y
„U$u‚ˆ“ƒyrectŽy"Œ\‚&
ˆ„rƒi„|7-L‡…F„¡    Šd¥,X‡b„b¾Ž&W
£   …8)Œ_ˆ…`…hh‡4-›‹*‚
ƒ#{
”;†
‹k|†N[„‡pŠA¤ƒQ•!ƒ0Œ&‚-¨F‚S<¡X…K“&‹UƒVš4ˆnˆ²<5šp‚
…T!¢6ƒƒ‚Q+Ô&ƒq‡&‚3š„Žþ_
Lƒ$„;¾L
%     ŸH›@X‡b„b¾Ž&0ŒeÝ<<®i
%    -‚p  )ƒ
Ÿ K³u—-|—8x¶RZ_
-‡ˆ_
!ƒQ0¦ƒ.—"¾¦z\Ÿ‡ƒS®‚  
†-‡‡4S=[
†5b®‚  Õz.¾9‡eSˆtž‚hŸ@cH¦ƒli    Œ†\;V„™ž¦~—
w…#’0ùœ-_’…<ƒ‰;³`’Q„ *…|t*j‚{Œ&†$>Rˆ,Œl
0‹cVA
Ž5'¹0¯ˆXX
‰1  ³+Ì«„dƒXî;Žþ‚¾‚     ‚#…ží)‡>

_ôT‡‰7j„  KEH*E‚-!8‡P@…X
""ŸV˜€€€¿0¾
‘‹;‚
D5‚!ê1%”A'œ
=ƆoÞônŸ3ƒX7
0correctorŽŽÿ„l$˜<+‰D¦KTêsJE%
Š9]–/‡÷H]spond
"”.ƒ     
ƒZ„Z˜xƒ7ˆi™
#
_i
‚4" B      

8.1‚+‚8&M"!pD
w\6      
@‚}71"ˆ{ˆD‹ei‡I
Ž9A
@j†5‡xX›JˆC‚ž¼X²F>,…rw‚-#"%B‚3TL„/(q‚J -¢”j±x%„VVµ+…*‚
f_‚}…u‘Vƒ§!-U,†~)m,@,Šl‚ƒr„F‰Ž‚d1$‹O•†QˆAo’Šˆ›Ra‚S¢bˆ¦l‚l1,+–hˆmŠCˆ‚r5‡%…35†•0J*„pŸƒ&‰(G    ,‚0o1'':7bŠs0‡}%‡+§.¥"ƒj†q……Kb1“&‡J‹„¥´K††
‚32.   6‡™IE–[ƒL3‚}„j$Q+˜t†SŽ8Q—#‡‚!‚yN>‡4/2-#"%B‚3TL„—4‚!‘¢”j±x%K#ƒ8‚`*‚
f_‚}‚g‚ƒ-U,,)m,@,…I‚ƒr‡‚|‡S/Î:—7c‡‰(®‚&SS,KÎ    4ýUÖ
YE
#,+‚¦NŸ`‡gr®v5ƒ

J*>Z        XõF0o1'':7w….s0?%—3I
g‡f
8ƒjƒ=6Z¶„l
„—0„!K(bÝKOÆ*"
†,EOƒL3$Q   l(mupt„ )E…
Œ‚n;„u+‚Ft*
‹-gŠ8    ‚8‹|†|4«xÆ9^‚y/x•;¬4’¥c…sG êHn©
Œ7…&ƒ˜ŠE*j8ŒKi†Tp—Y,Q  2‹D†B…ŸFŸO Q‚*x!T‚>‚
&,UZT
G‚ƒ‚*…Y4[;/v<‡f|X8¢T\1Gƒu;„R‚E{…{\‚/ƒ…F`|^Ž{2Œ-\‰%ƒG„lz‚!S$‡‚ 73ƒp…D‚z3„–1Y>74yƒƒ>…F)ƒ‰hJ
‰]„wÑR@ˆv6†
q*”-›–g3…(It‘y‡ˆYƒD8…Q"ƒ0…C†W‚I4‰¦^9…e‘c™:ƒ"(
D
D
QhZ}6+;‚GZMgNQzR
+HqaK#$-4E J+&0Pg{Ž÷5;L0¶zxŸm¬4’¥cŸ3
2n
Ý@D‚*‚.
4‚*j8
ibNXTÃO~T‚JUZ    
G
Î)
P†|X8
\1G‚i-
‚{¶
SÆÆ'
ƒ>‚.‡
6PtJ
‡j7®ƒq‚
‡E>‡lUv6®q9Ÿ$"‚1b3ItAÍI)Q!‚}†W‚I‡b2ƒo7—‚{—wŸ      DQ.i
@0Pnp+    %ZgN7S;
+4kF#$
2-?        B
%0]h_db‚_‰N<•³=Z<  index;3¸~„YŽ[Ü£9‡Ø,X
>   sequ;2‚E„\5—µ[Œ5      vtab;1Æ{„_Šx½:‡÷3^‰adb‚„?’û$ionfollowingbusyerror‚ÜMsh%+?in%
‚amic‚ŠG“؈eoƒ*‡/tƒZŽpHŒ2
0m‡6M976
+
æ¤„¹l«A$r##*(#5„%‚%   …?Kˆ‰p!A,aŠI’2
r‰P$2=+63k_G!9
Œ
` ‹4¡=FŸnŽ'<Žö„)‡g‚.
0m82976
+
ýG†~üCeoŸ@Ú‚Æ~‡j(!I,‚al$2= 63)_G"M9
ˆU—5ƒ(` ‡e
ƒ>+!‡dWli‚‰W“Ñuld‹„
‹[ˆ8ƒ&…ˆcŸ'.UJƒZU
‚7(-‚v2…/†`!†
a
ˆH)Ñ?‘7‚WA•èl™eBA¢0ˆo‡SE;
`„|*…`
‚+‚`¥†%…\‰v•(‡w°JŽ=‰O+„f[

†k
†og}b<‰4Œ       0#2ƒz
!!ŸW˜€€€¿2³Jˆ‚@{mM  :–…„t‰*†‰t8ŽJ‚x‡ˆ‹[7Œm‡xƒ‹‡;ƒRƒ"„q/„^œ+‹#‚i‚¦AWƒ%(ƒl‚gÁ$?ƒxŠ‰Dƒa^„9*‰hƒ'‚M;…;)[/=6…H¨ @
„<Œ„y…}Ɔ,‚_…vŽ †‰[ƒ7¥p‹‚l£L•o(‡‚o‚eƒ8Žöz0`‡\¾y%
Q¼q‘7Ig†4
‚(
<BA‡Y‡ƒÎ‚k
,N‡hc‡‚…\‰vG‚I³WpÎHkƒ<§‚F‚¾8YÆ+j§O:/(—ƒ!®i}
‚TW—-<(q(‡V‡)"{O{M\‡ ‡evŸ
…H#PW¦=‚i§
8‚_…v—)@_BŸ‚.ƒVFB—
Ÿ3Z!0council‚ˆ•ÒZt
†%‚0“X>8`‚q#‡F†z
<5og‚U+
„#u‡O‚>…<i†X:   
¤"¬I¾",ž*…D„‰ebŠi
´T&‚>
”x8‰)‚ˆI"&&a‚LB¬%
“Xd–dX'‚I
      ˆŠ$B¡°M6#Ž

ˆD8…+‹j 
˜dGË}$‰$

j
,



§•##£g
]=Π|
“]…6…‚G

E              Šƒ>àfƒWŽ‚<
)i‡f,ƒ/     Ÿ,
‚&‡X‰Hž|,‰\…D„‰ebŠi
´TŸ

)
8‰)‚¦a†+"&&®oB¬%§       
‡e$³5%h
Æ+m§        1B¯      mM6#

ü‚IJ, 
”‚Ý_##
¶‚,®q§z‚G

E              ‡h.6u‚ƒW_chang†,…&‚wQÎ/^†Fù‰j…Þ†F
ctx‚=Š)“ª6er£…ƒ!<J
 +TK2J„wƒx9D¨!‡]—…z
‹7†`
•%‰@9
‡0„m‡t©2"š4k1…‚M‰V`ƒ9‰Rƒ8Ã*
&…g…\2     e‡ÑPÜZ
&9D>-!‡]—…z
‹7†`
•%‰@9
‡0œK‚Ð
%"~R1
‚/¾$‚‘)}‡Ë2        
ze   )intuit‚u–¨part‚˜ „_Zfin‚=ŠMD“ª
ZDinteg‚˜8Gý
‚Gless‚ˆ\ˆ†ƒV’H„bƒ_U†
ìPí-,&¾7@Šk僎‚Wri‚9I_”—Nstep‚=
Š1S“ª>Spl=R‚‹3ÔŒÙ6rier‚
•!PsˆEŠ,
w†k]…‚_…Œi
h…=‚M‚Tã<‡Y’‹68…:’H=‰#¸‹‹}w‰e‚\ƒ'C‡ˆM‹¥™#ÂŽK’C…F‹‰0¢4
‹xL(‡¦j¨TºuˆNš;‚\†ƒ"p‡_œ¢"“Eš/„*ƒ;Ã%›F>‡BŽöuŸ!%ƒ6§®?B"2I‚4ˆô;‡‚7—PR        q
R1â.?—ƒvΈH¾B¾4&Æ"cƒ\¶‚‡„2—FW|‡6MOU‡‚%§Tå7n¯t‚Ž)Š:sin‚‰ev‚yŒ+j  
–þ4Jj     
1‚yƒu>–þ„-
>e‚,„
r       ‚KK
.(‚~ŠX«ª2‚1       v(‘a2!
!‰‚j"?§6º7«Cn„X&„X+,‚v
‚-R
k“R…Y†=ÆD
⠘
\e ‚ ms§0!
!    "‚¡    ŒOD+,‚<
‚-
7
kÝf)0;-ag‚
µF   
…D×;YB™
        
J',!NGC"DI„)On
“{Z„E
‰
     …\ˆ?3Ê.%Š…&‚
&(,‡f‚%8?!†     ,ƒ
‰8
ûw
„Fü’vI
B
2          
J''!        C"DI
ONüS”‚iÚhR¾4‚
&Ë,ƒ]8?!,í-
…
p‚       2p‚„J‘þflag‚
˜^ülu<Š3dŒXƒnb0-!`‚ #N         Ý]ƒ
 [
š@}…\„4Œ<ƒ„N˜       ›#}…P>Y    …<    …‚Q…:˜UF,
¡S;Œ7.<ƒf…®
E
EŠx  ‚
Éb{,‘b
È›n  –  -'x#     §…f‡ƒ      —AŒ
…y…DL‚ab„h‚&ƒ    
!!ŸW˜€€€¿2Í„üW
…\„‹Pƒ„Ne‚,z‚N=Ý‚Jƃ8„v
;‚™
ƒn‡aCƒEÆ&0Ÿ8b¦‡Îƒ<ŸXÆ0cr‚ˆr@…oñy
@Naft‚Ÿ1
-†ŽZ‡‚-ù“>Ÿ*‚°Xish
‚R‚8ƒ†„0„*W
-4&…A     j±4m‰]&  g(‚  „H›AfMm$…Z•0ƒ$‚U  ƒuj‡ƒAŽ]—>$HŠ„‰C#†t‰^L•"„Jg##<>…
,HR‚SˆBÆ ˆ;ƒ†s‚
„_sHƒ2‚JE„R,
„G-r‡Êf
a=
ƒK' …,ƒ.„^‰&G†H¯(5‚.„W˜        …sƒ%‘gYÞ[ ‘
[†z(„E3‰`ƒ-Šc‡        CŽö}%>#
‚†bK &     g(!f
f/
Jm‡)/Õx1Ë$‰@b"#^        B0ƒJ##<4,HÂ|y2‚JE%‡Õ{k‚3ž@=—g'§'‚5Ý+‰(…s®‚—5)
f    9ž

38
<$0eat    v9n5;2      +‚
n"ƒl
‚0
."…VF
‚b
]u        ^o&
."g%…‚] ‚L„k
0,ˆnŽ u
ƒ2~‚WN)zZƒkm$\Œv?r‚W‹:C
|&ƒT„."mKN!ƒh‰W ‹ 6Wt
N
:„       
[Q6A/4       "|Lk‚M)4V-„3~7   hP…5"Fƒ

     V[1‚     AMƒ'28‚Bw[E+) ‚I“V…70 +==Jt%ˆr††}    „b8
‡‚&(qR)'‘J’b.„tPG3f‚‚pS*$„sŠ-‚…B‹.‚bc?"…_‡Nƒ!‚T422
nI‚
1n
AQ4I5ek#m 

‚|

ˆu“/ƒe#H‚ ,…(
    $

?H-(?RX
4 (.„6-‚,'‡{)ƒsJDo'_%‚LP„*M‚
G

W
ƒ„     
U qa5 „8‡uPo0„!0ˆ–‹/…pC’/—F‚…!¡kƒ
‚x-‚*k+@[
      :A„\ƒ‚~‚V‚:…dŠ.‚…‰H…K
       
‚_‚UMl!

@!!/!ƒ
6>
-‚>R92‹ƒ4oKq
lW
V@Tƒc
<

‚j~:
       ‚}ItƒK†Yƒ†ƒk‘e
‹bƒ(Xaz@PAgY4ƒ~‡D„ƒug"`:9Ip-|…‡$ˆ}U)‰Mƒ'*<ƒ‚~MY‚J     UJ*7YFŒ;n\DƒIˆ:ƒ/‡9‡R„ˆ0‚D…g‚JB„T>‚n"%0+ƒJ;ˆV‚Kn1_kŒ/‚J
xv‹>,‚{ij‡.f       */‚f(&.@"\HYhL‚VƒM…t„rƒP$"jƒ4‚@$ƒ{‚„3\%*„œ0=;/'+‡VqxP
kId&5LQ#*     ‰x 2„i‚Y‚h…Oju
v<^"4UBUz-!6GN7q\T!,†g,'+>(‚+I=6‚*‚ˆ
1X+A(…G…c9‚Mƒ8ˆ†M‰‹‚\ƒ7Jl2ƒ…^ƒ ,…‰‚'p•8˜wŒ1{6Gmƒ'ˆ-‚Y. ƒ["W+e#f ‡e„Sƒ>$R-
†:„C
3h'ˆ‚1ƒQ‚Š8‚l

 ƒd†+‚‚)-‚‚‚?i{˜…„@0G]˜h‰;¤`ŽH„U‰^ƒ?ƒ4Fƒ&7‡r5†?„b‡_!XZ^Ouƒg$mhBv
E„G
977\(„+} Œe9fQOHˆr($„ne‚+œ
ˆ_,
4$RE8‰8
 1  .+T4
,‚BX„kj]
(,‚‰k„R>`‚pˆx            593?S‚+           „[

nD 8'&*Ns$‚„
 >x@S7$Lj-A"‚&?.&ƒj˜#—BW*„-!aƒ_`38!‚% `}Rn„_"&‹#„ƒ&‚?$?3‚\#†5‚zp…g†aŽrm*      %  …gg

D†orƒy       "ˆ(@pW —)‚}…ƒ‚^(U8Œ‰„4?G
S7
wz‚N…IK‚
1…W&1\a&##\„*NEˆYƒ‚È},"?$7‚z†ˆ   …œ’ µa‚W*‚„Šl‚aƒT$b/'"8ƒI?Œd
h‰5„u†t&6Bx‚oKjƒ5‚„uL,~  -&ƒƒw
†C–IˆMŒ*‘/ˆ-†7–V‡3‚
`#,c      ‚Iu^&##v)-A*/ƒTO‚^f‰CŒwˆR<‚^**h'7$‚:ƒXƒ

1"7KT9„x|Žö‚G
q"0 ==J‡[
r%, G`8
r‡‚-tP     3f
Z‚=S$M23‡U@…u
!!ŸW˜€€€       ¿2-_?"ÀB‚5
      45$
nI{1Ky.Q4IH5k#m_

h

ƒC%
=
‚#‚ ƒ,…(
:0$

?H-(?RL
4 (.‚d
-x'
†Y)k' >%‚L‡*2HG

W
ƒ"
U .a5 08‡e@ )KQ,‰L‹/…pC’/—F‚…!¡kJ2
Ne4+@[
      ,APƒ‚
N?Yu
…ˆHK
       
‚_&UMl!

-!1
! f6>
-
;>;
{2.ƒ4oKq
lW
V@#
<

&~:
    ‚}Itsq†ƒk‡7w
‡Sa
T@*A)—7xƒ®mj-…‡QU)G+*‡YU[u
7;‡`Hn\DƒIˆ:ƒ/‚z‡9‡R„„*‚D…g‚JBH]‚8‡h?Ov‡o%Ÿ&@"H§)q" ‡ch¶VŸSBvz-!6G
/7‡co\T!N‡k‡d%>(rIz6H—‚7J.
+,(?
9ŸQƒ7‡II2>'%‡„Cy
p,~
e{¦Z  '"
/J#S‡h
Na®r3h      j1uM…-
&

‡ZU‚)-
 ‚‡‚:
{‡
      „@J]‡a(0LEN
X
GOuL.$
H
YBnv

:v
977(‡\z,—0C
P—=„=
.,
4‡[QE8@B
 1  .+T4
fX‚Xj]$
(,zMvd>‡bp?‚
x         93?S
$             

F‡N
l 8'
*  NY$‚ >$@S7$Lj-ArD
"P&?.&‚u
‡F"‡h
1
aŸ‚#‡‚Fg‡n
G"&
3# 5>H
…gpa,*       % 
          <

0‚~rH      "
{@%W#ž  z‡gzP‚5K‚

—6/ Ha&##P6Šl‚a‡e
@$M_/'

8‚T?;
hE\t
!6Be‚ j‚N5       
rL,#    -&^-—
uC‡q*„`‚J
]  ‚)…g
„6‚!

`+#

8        $4u^&##)-A
/OrfW
6—C*
0create_aggreg‚c1
-7colG‚w   Z
ŽIž—-%’49L¾¥ˆÅ‚lation16,     [d
’Eo_v2 G!‚r \ˆ˜Š‚filenam*%N%!R       unct.ƒ|…¢&7#„ %8'
ŽJ$Ò Íw—8(4!/' !# ƒ1gO+   6A‘sR“Z
-&F¦$Ö#‰`ƒ-1!' !#        
g
+«mœ;åKW
ion16:&7%^[Hc      N#“ªKf_v2…i-9_˜&f„¾hˆÅ&ƒä*iåKƒû‚index2modulgV
!@w`
1
ŽKm"ƒ‡IC‚vE
2¦†ÓB3ƒ0C0
'
w2
e_v2iVq/
       a
3|ŠK"(ƒV‚ˆ•ù;ƒ2"()y‚‘‚t2              emp_index2
t2rigg2
view2    riggview2            t2window_functD„ZQKb‚&‚
¡„“©)»

„btre‚¤#ÝUcrƒ—ÌN9dbƒ¯R—ÌIzflagf†?index‚æionƒ4•†KF     …?ˆHƒJ¦m„_"
…#ƒ0½(‚È
åG5—3§¯
mÂQ‚‰Q    v§=R‚L
Æ`“Ùor‚Žv0†9ùƒ§måLdit‚3scor‚Ž~í)Wep‚’;isi‚A½
smerg~"Á6>$‹“_¾R6>$          ƒ+p‚
Š5teria2X‘+I…fƒSJh
³}‰V‘>…q¼2”oŽ÷ |„jƒ9…f”Q#*[?T
fL                           D"+;

**ŸN˜€€€
¿ ²þz
‚"J!£_%ƒµ8‡‚œ3o¶†50criticut¸Gƒ`e$…,…²{¬(ŒS‚†3”Lƒ<“(P±³4ƒ3‚-9„.
BžGÎª2O–[TW¶£yÆ$Õ„9ngX     m¦ch‚¨x*¾'Ýâ<”
|Oon‚1—† "p‚‡
“š7sbi‚™t•Úƒns ƒm&†*„[-UšML~•(‡
„ˆF#˜ ‡‚-9p‚G>.ˆ†‹Œ8  "™m‡I!znƒ{="›`†
N‡0
‡i[9ðoK<Ž÷aõ¶T†F#å|ê<‚™&nÆ‚-!zZƒW=Ÿ

N+Q¾=OÎO[ýmucial‚˜  yptograph‚X#Žtv ´b‰t‚w”ô]‚‘/FsÆ3®b+ss‚‡£„|v‚…*<„‚       @     _ L" $-/2‚$…D‡M
ŒZTl†k‰ …gz@
w
      C@p¢e;
S
ì
*³S:Òx(      _ L 
 $-$ƒ†‚"M


(Òr
†k
‚z@
&
        C9?lôS
te>‚8‹]
ˆ5‚#       h(&`x…
‹~Š8?´•ò„xov—);'(€;'(rlE!x‚U¥B
O<          ”å>‚*
O<          ull‚‡,‘¨ƒtiv‚„hme_dist‚Uš„I
K”å<‚z„I
Kul‚‰:,
èJ‚|¾8‚Ø
‚Nrflag‡
—‚Wiou‚
üƒ&liz
‹
-T¾<6rent ƒn
‰&„_&&Œ;Šˆ)g
-1I…/„oˆV=>‚‡{_‚Cvp
^>g
L"
-B!'‚/(R>%*
@(@%?-W[„|!c
$;hO/*ƒ:VƒW   :8,$=YƒqK'
‡1
ˆ5+N%C  ƒX…^;ˆk
F&ŒJc6
c„a‚/G$
qJ‰)•~J…
,„e‰;s:„i@‡Qqo‰9l%‚@
r„p•7†`ƒu
#‹"H™)dghcP<+[‚Nˆ#I†#…sŽ-Y,P‚. SE0[i<+q_go…dF„
ˆk‹i„~ƒ'fO„ugzyˆb‚Z‚SS`‚?D‚F„„sˆo/ˆp‰‹O{fŒC@‚‚nR…=c#‚>TŒ—.‹Q„<q…${ƒs‚/Š9Œm†3’fƒ
…p‡wJ(,}+„\PŒbˆ+
,K#0  ‚sƒJ…
vg‚‡=®ƒv
‰cƒy
Ç,ƒHmp SƒKŠ„<Bfƒ'ƒ
`+‚i+b+,‹E‹J9/†s:ˆ|
Š–}„W‚‡*‚|6‚)
‡…-~?
m‚qEQpd‡5ƒ^‰kƒ…D¡vŒP˜
ƒg-„y_?NƒJžY…5ˆS&ƒvƒ9270x)0=5]
%5Z

3
&ƒ*K/)
C)
„P<$l*
1-PGQ`
Œ+ŒWšs†ƒmˆy„OK‚Z‰‚,=Š.HœM]‚+¤+ƒ-‹(Šj‚~1W‚=š[’i
(*–
‹1‚3‰v6Š’dŠ|EOŽbŒM‚W‚ƒc„@‰„‚+w„P‚]‚
Šbˆ?
Œ}+„#w.‘†,„„3{‹p“wƒf“NQYˆ{
‰CFK_ƒž‚*
Š4„7ƒF˜L¢Œn
A
ŽXÖ‰}ŠEZ8‰V…ˆUF“s?i1JOFŠgu†9ˆ^“<)&ˆq‚„h¡N† ¯St…i†l]‰9Žö‚n‡lH~
—6pƒe[w‡\-
#
H
|d0cP<[jI
‚1Y,,‚. SE0[i<+q_M
8KL$„~ƒ'fO„ugzyˆb‚Z‚SS`‚?D‚F„„sˆo/ˆp‰‹O{fŒC@‚‚nR…=c#‚>Ÿ‚1‰4#Zq‚'{ƒs‚/u‚)†3‚‚w
)
ƒ‡wJ(‡++=~
,K#0 Í}¬9ƒv—8}V
‚g‚:Rp‡P'‡h5Ÿ()ÆÎ
16§‚'§6¶#‡e‚…DC‚+
^¶-Y‡f?N®~v…5‡v‡ƒq272x)0$65]
%5Z

3
&&E*K/)
C)
„P7$$Q*
1-PGQ`
X‡,ŸF8‡cR—B—=‚l‡O‚~1
GLT‡n
r
e‡…+w1‚3F37§„*‡—*G2ƒBZƒ
6wl 
2&‚"w.[¦LZK
KY0§„ ŠEZ—„C
‚S
?


J!FƒBuŸ~
-)!6>
—"08t¶&[6‚‚:K‚3F%     &"0
""ŸV˜€€€¿0®
0current_d     ƒo‡
%ƒps‡I)Æù])‰;     row‚U“{#”å:0# tim   ƒp‡        ƒos‡H)Æù\)‰:estamp    ƒq‡*ƒqs‡K)Æù_)‰=sor…@E.ƒ8ƒQ     ?‚4–"6'‚A'N-    6+@5M‚†T^-‚O‚‚d:Q@kR2‚kZ
ƒ$‚†V%J%U5EAC}&‚|  t 5 3%oyN‚%ƒa‚b/
K       ‚+!D 7      Mƒ?-#=)]/#B)9@A&z"4
‚]X   [‡yo%
‚:‹      ‹E3.¹#C)
IHXWU‡ƒHŒAj‚        u^(C>m
uƒO:ˆ
HErw„>©]CB,+‹dF_oä7’(šrÜM4 ? ƒŠ      6'‚A'N-     6+@5M‚†T^-‚O‚‚d:Q@kR2‚kZ
ƒ$‚†V%J%U5EAC}&‚|  t 5 3%oyN‚%ƒa‚b/
K       ‚+!D 7      Mƒ?-#=)]/#B)9@A&z"4
‚]X   [‡yo%
…ÖBƒ        ¶[
S3^C)


X†vò>_validy
‡—6
‚Khint‚¤hÝlock‚¥ÝN
ownsbtshar†o—‚9unlock‚¥1Ýcv‚‰[st_addr‡,
       

_chng‡9id‡&nam‡*om†,
‚.p
/
I
ŠqNŠMˆ8
*œ      @…ƒ,Ž#ƒb–fž;‚„\† ƒ²„JqBƒ
†3„Žu
&ér7‚/9ƒ>4†?^†6eŠ@¦·m„[‚rQ•'Í8…2‚pƒHƒ7
"‚{8–bvŽ ‰n
ƒ#y"
%$MpŠC†b]†'‚   F‚b"yVe‚,y~ƒIMWwd_‚    
—'EbŠl     
Õ=ŒB_‚.…|xh•.      „(ˆ:>
‚<g‰   ³?“i†K!‡~
‰:!§dƒHŽötÆ
…;      U8q
+‚!
ƒ,‡-ƒhqBmƒ
§
N
&_5‡Iô6+
‡ƒƒE
,‡^Yín‡i¤
%
#pYŸH]„EŸ!% Ýk#Eb‡Y,—H—(Z‚
'x#ÝdMr„bhe‡k)Æ8

ƒ| ¾e!6‚&ariM‚Š•Ò1
er_address‡0
nam
†o'iz‚‚Wt‚‹u’sjcŒ“Їpƒ¥!ov‚œv‚‘ZAȨPm
$
ƒ}ñ†Û‚9e‚6{)A':A*<-
"OY @       2      
       w!
!+ $(4H#34N%ƒ+‘˜R{)"A'/A    ;-j "OY @       2      
       w!
!+ $(4H#34Nw‚Ž”—>+x–8(‚G‚XT„'=ƒ•ê
oT1=Jy–S'(cl=Š4dŒX+‚!C
-TE"m‚‚ #:       Ý^ \„K
~…\˜
‡LˆZ   …=Ž‚‚R…+˜UE¡T—      Œ8:<ƒf
‚$© ZF
‚

É
b¥7
”n`
ˆ–
1(y#      §…gž~Œ”‚N‡h
…\f‚RLÝ‚Ký‚Y·Gœ#Ýj„3 Z—2ƒoÎ1Ÿ9b¦X
`‡cgwin‚„8Ÿ˜T•Œ ‚™’`
_conv_pathƒ˜Z—µ’fril–€ud‚%U
‹v


;
)    
   EG
>

?G        4        !
‚.†9 4# 


0ƒ\\
‚B
 A
‚&
_
I‡v2
[:    (r5Z    “L…*— ‚ˆm^T<
       
˜[
‹+Bƒ     Œ8‚W5œ\½     „"
”T„iƒ
—-‚„i
‡4
)4„f†4‚*    
ƒn
‹&‚     —o„=Zcw-‚
†Z
{                              ‰a
‡?ç „^0‰ˆJ' *&‚4"n0*2?+´5u     
](HŸ.1Œ‰/6ƒvD§!…x†‡a‚@&u Âd4‚#D2‚0Žþu—9dŸ( ‚J^T‡]
       


TB5      ‡Q‚V‚W5—ˆŸ%„A„"
g‚|ƒ‡uÕ 
¯i4yŸ
6ÝdåE,«|
&#      ¾>bD'ZcX-‚
„*
47                      ‰D
„V?—282:…1

‡   85^6ƒ0
""ŸV˜€€€¿0¿2•Ý$
T0R,' *‡a"0*2?+
huÆ
(HÆ>h6ƒf¶XpK&‡r¯B4>#D0d1y
…(—r_have_sqlite_config_h‚y
ŽJ–þ4
ƒ=Ja‚4j‚)       µ
d
^nemon‚ˆogN-‚ˆb—†i…B
%Ba]g    ‚Q]Jd=LQ G!
>:f)ˆ18
„5‚]S‚†l„'Ž3‰`‚{5—"‡P”K‡{/˜ÅP„z‡"+”(ÃÒ
JœY3µ6¤       9®ƒ
G{‚z®j|”6
%/—>&‡g"í4‡Q‡‚>„E
Hœ83li
…&U8
‚Šbo”—^Ýlla‚L
F!
ˆW):
‚m-”ž4!Ö)mag\ƒ1+‡     œ:
7‡
+ƒ"‹‹l˜7”ME~…N‚qŒ%„y‘I       Ó     3–\†1øGS‚E7‚QâF"‚h݉0$
#‚       =EGÊ„#âTÆÍyFn‚5+ger‚[…HwZ§QÓ‘ý‚í3¾ƒ6„£rk‚
ˆer'‘˜Sp‚°Ustara
Œe    t‚µ!ai‚l    …|„Er‰M‚E63d!7,5†~2W*,<†#T”…2l†ifƒˆ|Pƒ       
s#  U      T
"
P2‚B({&
A‚ƒ"5ƒ
‘)
)      I‚P6-‚
‚D$ŒA
       !
A        d
ˆ…e…y(Š2X‚`ƒ‚ƒCU#ƒ#“2b¤ŠkŽod…
]d„$ZŒ\*
/Š6nMR;‚6W†{4ƒu*ƒ8$% ƒl‡J„Hƒn„m
5„wTˆ ”ƒ@‹(11ˆ;…-ˆN
…,„=ƒ0Šy$†"‚lˆj/[”h.@!K!.!‚<Z)‚ B!‚@;ƒsILU4B„r‚>
kAƒ2I‚ƒ8&?ƒ{…0‚$ƒBk‡ƒo‚‚i† $‚KC‚/Q3#
<ŽBŒbP‘a`:‚z^‚‚5ƒ1‰caHN8
‚/„a¢"v‚_74LuƒFjƒP…K*†l‰?ˆIŒ&(q«L     Bj‚BE‚i~l2ƒ&])Z'(   ‚nM„o®uŽ9/T0—ƒ_•+
‚}„['‚-8„?1…o„a,‡UV63C*¦9…84‘GK‚KYJ)
O;FDJ)ˆ"‚6L//}M6C/!k mƒi*.5   ŠtŽE3#!…‚;S2m2$=F‚-‚,4„q
7ƒJB?H‚i\
 ˆ;+v/&‚K‚`YƒC‚(*!*ƒ„      …&‰‚@‰_ƒWv‚|v‚.N"S      |ilM$8%r7/ƒi$ ƒc„5†"„l$c?Q(b^ƒ…0#                 
‚78ŽKL†Bo
(&‚P:JF‚4‚r;.6‚^SZŠ‚P†\
ˆi9ƒ7`Œ2¨#“V
         ‚N‰z=M\"ƒaƒXˆ@$$†+ Bj„Q‡N„/‚5†YŒ^1†_ ˜G†‚-‰O<XY…l‚F
 …7‚%‰R•xˆH‚'Š(ˆV
z$
,‚ /S0L$¢p›[J‚V
!E 
N_Tm+       d(#    4"„e…P‹†_/q—jˆ„&V
ƒ'6gˆ4„j;       {/t„R‰„k†4…0
‚}Gcˆb,l‚U)HŽvŽ?DŽ{‚XŠnœQVcL7‘„Ž^S©u   È?3"*A_"~…8Z†O!‡.3ƒ?„ucŠ&& E@"…5v„t’5%Šm†uU‚Z?™Z„r>šB9$ƒ@‚=# •>:Š
F 3ƒpƒ?ƒ&
…)˜'Š<‚x „}
1 /3t(z!     +ŽöK—7‡CJV;ƒOapU#ƒ#
0‡jXd
gt„‡J*
/lMR;6WR4ƒu*ƒ8‡3! „,yE
‡_0TQZP‡Vƒ@‹(11ˆ;…-ˆN
…,„=ƒ0Šy$†"‚lˆj/[”hHbXuPILU4,
kA
ƒ,‚
&?9…0‚$
}k‚ƒ0ƒo‚‚i„| $‚C</Q3#
:
‚cP`:‚z^‚‚ZƒJaHN8
‚/„a‡.Í{"?«L  Bj‚BE‡h
X~sT„LŽ9/T0‘N‚QA‡d‡E‡'‡c%‡jÕv
BJ

oíY‡h2B?‡gB‚X0
 ‡h&+v/Æ&&‡fUb=‡cv‚.N"S     8

M8%r7/C$    +5Um$0 
#¦Z
‚58—$<
nJ¾4i^eZ
‚
-‡V7
`—AHP¦{[

¶q
‚!‡tOoJ‡„S„‚-:Ou‡ZVY     ‚F
 
n‚%d†/}"‡ET)W$
,‡gz/S
      0LN—H|—+8
!
(

‚H5*h
M1

!!ŸW˜€€€
¿2
Æ 
N_Tm+–ÊW
|P(#H
"„e9
3/‚‚C¶
‚}
Gcƒ5®qN<!‚S3ƒ?„'O&& E@"
/)‚}%—‚xbr‡g
(ƒ_„hT9$ƒ@‚=# :)…"‚XiŸ'
C‡M&x O6
0data0_ccc_ft“#Æ‚3#_:‡(MA-&(`<u-;)&ƒ(Æe(M-&(`<u-0)&ccc“
*|Æ‚,
*|ountH*0qRV
‹O  directoriHM
—#@–×@ft1‰Q
†#Æ
ƒ
†2‘ÆBstore_directoriH@<Î1^†HO$
ù‰l…Þ†H$
t1ˆ„‚CÆ[ƒ‚Cvers‚~i
,.’‡†J‘y!–׆J!x1ˆhÆ‚3bas‚pI0     
  

X(0‚%  h!X(g),^
ƒ]‚`G&‚.@
.
A&H‚O„q3">"0‚"+8u#6j
*Z„hˆw„‚n4
..|‚Q†k‚+(*"–qŒ„Xb(-     
3  

'
"     $0.ƒY`jdpA->
-    4?

))f "‚><N…'ˆ       L      
6/N)3/$…~‚H;yŠ„5)„hƒ]9‚G
6‚r
‚Kd
H\V_ 

h
_8
db*
X<\

&e?    

'-

`
=F65„y„      &
/E
       -=$
/5+
'"(&;


‚3 ]/
       v1/  
    _*ƒ1
[0
&`}      [‚o#mwHƒ*,(1!%3#1#
‚?
& #'ƒ;! W>C
*V        …)
NQL
>)7
)M7.806"
&…_
D     _%N|bW .#)%!0MrIh†9%
/
!#&
7"<$
-|„F<]‚      ++!#
j(82$H‚FEƒ)‚Kcoƒ)D{
4f

 #        -If
@t
?}'"

ƒ.Qn"15&
;
"1
!b* %zX",]LY‚|‚9    ‚Z
%)‚{
(QzN*P<*
CT
'#       tt‚:x#       '/(
1(&R-2Be
QLu|*\7

             
*i5R6_>2D--')<(79      $
†“#0* 1+4$+& (/"‚$g‚,Fs     ,E 
      #
*9d9…m6R‚ƒ,
4L&P‚‚ƒ!
„aA(1ƒ%
/

          J$69"‚c,
    …
,Q3Fm3J'"Uƒg‹K—#ŽL?r‚G;V0'X‡(ƒ-,1‚9>ƒYƒ/†h‚L
Y
#  ‚OM<
…Mši
b"M7S 

!{)'CSf uc'y$}O

!)g    :   M
9_XJX/C}
{
kX}3a-z
\$
,
;
A<&\'>3^G‚M‚^‚\ŠW„ƒ,l†„\1)<
T11†?Ž<ƒkQ‚N}r‚%‚,‡        ƒI‚
ƒ4e„U        ƒ`‚8?F‘    :†WA3T(0*8H
'4Ns‚J.#
6ED+‚Q
bxI*F)„6TMuJNEY‡1zmpƒ>8‹V(‚c
6„&3m-1
M&›ƒo‚F?Y„M
…
‡… ƒ,
X†+>‡7‰@†]¡tMƒn…OP
        S
       2$.    h-!+,1
C6       $
O!&?
%"

1
R+
\.4*      1* "BM,   S1b     WAc-X0%a=|"woT‚+"0
‰]     

!"66&
9‚q„$ƒY= #8*&7.W‚ddhX[\X[\XZW[[[\X[\hqrhpgqqrX[\X[\X[\VXUYZhpgqqqqqqnXXbc      4R‚&4>2&#0*(([/T‚Yq†(<FN%
!bV}'….?
$^5i‚# †E‚3-
ˆz%+IX22M7N'…TY
2        ‡ƒklƒab„,ƒ‚“s#ƒ‚9D‚pd}‚A9;39„:L  „F    $ƒ‚}/‘5ƒn!c.…+3‚(b‚vN'Tt2Dv„5~,)dƒ5‚0 K#$K!@
4Rn2       „ƒj%S'>
„.T‚_
bQ^‚.„i‹40Œ(
Xƒ;+‚
0J„44#         5d
xa‡p\*7‰
       ‚0‚Q%N""%I!I
""ŸV˜€€€¿0Ò32X]4]}‚',
'
Dƒ7‚nƒ…Ar6      

$


     
      (uQ„               qz/7cV"T&E#[%ƒ## 
B     :B-6+VR
#B3`02B!‚g#‚Z2…a<)    
        Šk…d„C ƒp!
!C3)Fƒ
ƒpX!
$U*"9,5;/ 'Y5J"_.% p‚
]XTnP
1
‚*
B

' 8-%?3A fd‚O„j~-U5‚B'ƒ6T0?l#.90 ‚"Aƒh‚!…L&A!6|'>2‚+„P„|ŒL‚=t…Cl$‚r@l~)n%…}0 79ƒJ

>L/$=‡"
Q2<‚$ƒ{„p3ƒ$       &‡|R2;e
uJ !
x
,z
.,#&E
.<9*‚I        c""M;@]**a6



4cSO!
^8:o`Gƒ*?"-w    :&
.    6‚ 
„.Lfb<9  -W>‚O?#/Br;$9*
A
rf<UTK"

@N‚…hƒb$n64.@1f\+',
'4       


:%dƒsƒF"J1q.65.5!
8'/(^
‚()‚O
pn8‚"3 

-Fs       
+2
$‚u‚ƒa`ƒT„/…™T'h  o'+^"!72d@‚
.C    JRTT<„b„!£
MP‰7.…‚X(„.<†3„k(ƒ+.ƒ m=…@ƒeTu„g
x    M„_ˆ%!S…Wg‚ 73‚Yv3!pVD
‚o3„;‚e‹9Y†w
        /<3    &6$<"
1 (+!V{(
_       
     !,„VLS_?'j(L"n
+
      ;P(G"
32!f1H!"#`+%%J+
$Oh 2/7@7$#3-L:
JG$R;$EOB ‚&D>964p
! 


"
E%$-N- 
              
ˆ1(ƒF~%F
_
-w     CkT@^'
d<‰d7<9^ {|ƒE#@'2D
‚i*B„u†_8J‚    b‚+…:ƒ7ˆ‡‚‚+<V‚6'XL&'_ƒY,…9‚„7~(*HfX5o-‚`s‚hƒoV(ab…Ž-$2—P!—><0V!‚-,„;ƒE
‚Ii
   ¥k—"%I%%#:$ƒ!)  'c0z'*yFK"\*)%2
F3!$‚4%0n,a          @,@"6CL‚@ Z+Q‚$+„3-
8b.ƒM7A&B7
"? !J_N:‚ƒk"L„0/†!=90W6wƒK:@c
;9   @,ƒGƒJK‚y
…
,Y)3*            "#
>&*i0\=w, E7|‚       3
(‚B("qr‚ R…(J'
C)
h!)%MY
‚H
c"!&=)!NLSel‚oG)a               
`‚)#(~:„u%[:5ƒnB6
<\H!L.^]d‚&< 35S‚ƒ=Pƒ3$H    
6.
+    .‚x

'$
U3))kQ;„N„ƒ|ƒ  ƒ)S&‚E‚g‚ƒƒ   1‚/‡' sy‚Y       Ie"uXSH.@ˆo,


 o<O   pt'†‰k'‚ƒ1Šb
…aW…‚`ƒ’O@7g  –b€4d}„0'V
,jRƒ#2X< 

0t97„\Z)0S{

%6
$
‚4#,5f$J!h IQ5†PƒM>J%;9^7           &a        

%#
-      )‰m†$1S             2    T"(l9J I‡}ƒz7#]((J    !Ya6S!,KVZJ
‚3^( 0#M)Fm+3$E2AS;A1:s=oi
‚kJ`–‚!u1s$$
d\ƒ2ˆZ!DS 
"
&

=(   3H&',
_  BQCRj1
$
(             $!M‚5V!M!9>  V7"m‚`
0/c#;ƒ?†U„b=
dlcƒ
„S<„J„"3‚E      It.4'l2
*?bK  ,rv‚f>/PEv
$((ŠD+i17&„R‚D-
$‚(* I0!t(, 4
!
y*A   (3#+
+
8  %!7+
0
y1 IN
QMFEsaM=!"
<-9$        9   O      D?%2!#%Dv‚~O‚',U.&!8   ƒH"[l6C=FŽös! '/(
(&R-2B4
Q
*7&

             *]5R6_K2D-
')<(7' $
‡[4‚ ‡`*        1+)$+‡g(/"'g
K—5
$9"‚c"
    
:JQFm3'"Uƒg x‡[‚
hL?rG;>
.'X
%,
M>sƒ/…b
Y
#  ‚O
<
‚J‚
‡)"M7Sn 
!{)(
'CSf ucy$}O$

!)g     &=
9_XJ‡*C2

 -3-'
\$ 
G^R
wEIFl„ƒ,l
""ŸV˜€€€¿0[Ò†„\1)<
T11†?Ž<ƒkQ‚N}r‚%‚,‡        ƒI‚
ƒ4e„U        ƒ`‚8?F‘    :†WA3T(0*8ï"l
*bmI*
N)
 MJ#Yƒ4\mp8 ‚l(‚c
6,3m-'
M&ƒAF?Y O
…
V
#I
u  ‡7
…v‡‡RK/
—%
F
C"wo®m 7.W‚ddhX[\X[\XZW[[[\X[\hqrhpgqqrX[\X[\X[\VXUYZhpgqqqqqqnXXbc   4R‚&‡
>&#*(([/T/?
‚((F^5L@# ‡j;‡eN-
>%+IX22M7N'…TY
2 '\ƒkl"eb„,ƒ‚ †p#ƒ‚9D‚pI.‚.9;3
~
:L  # $/\
#!‡H7‡g+)3‚(
bBn&'Tt‡0D‡h-ŸTW
§
'
DRD‚F‡‚O¶TMŸ }]X*nP
‡b
‚(
‡h

 
 8-
%?3A‡d‚@
ƒ
~-—6$%
kH&A!Ÿ
7"
>L/‡f<
‚!
o2
f‚$ƒ‚d‡_&†|R2      e
    J!   

 
.,#&
9*             ;
"M
;@]

        


4 SO
8o`rG
*?"-w     &
    .      6‚     
‚Lf<*    -W>
#/Br;¦Z"n64.@1IB

,
'   


+%J
B8Æ%^
ET8?'‡U  '+^"!72 @.
.C    JRT        T<T‡^        
„MU‡\MKM0OB ‚&D6964.
! 


"
"%$-N$ 
              
(‡]
X.:
_

$w     T@^Lp7‡e

9
M 6
$T#@'—4Nb+QP
‡
I<V‚'‡\&'_ƒY,‚„7-(*HfX5O-‚`s‚h‚bV(aƒ‡_0ƒ?PR!

ƒO‡R0V!

,ƒ'

[i
        *‡E
-I%       #:‡]!)        '$0z'L
\G)%2N4
      %
L‡d   ,"6
CL< Z;+&$+
7-
b.ƒM7A& 57
"? !J N:‡Z)"HLK‚y

,!)(*               "#
>&*0\=, E        3

("9
(J',
C)
h!)MY

.
"&=)!
LIG)9             
l)#(~:?2u)B6
<\H!BžX1—6
|‚/—71‚9    I"^7'V
,jRƒ#2X<        

0t97„\Z)‡


%6
$

]K ,5'$J!B IQ5‚>ƒM>0%;9^7         &a"
%#
-      )8    1E                2
$  T"(9
 t7#]((      !F(6S!,
KVM—& 0#"F^+3$E2AS;bA1:s=Fi
‚ko‡ru1s$$
dG
~‚Z!DS‡T 


&‡g
((3H&'"_      BC]
*
(             $[(!! V7"2I‚`
0/c#;ƒ?†U 
=
dlc‚W
< "3‚E    I..'l2
*?b   ,rv>PE"
$((#D+i7J* 
  ŸX˜€€€¿4¦˜K0!(, 4"!
i*A     ($#+T+$8 %!7+
0y1 IN
6:/3lG=  !"
1-      $       $      D%!#*%—
/vs‚',U
0database1‚ê   2‚ê   _file_object
list‚
š-i†K“/
˜†´†K     ar‚!V       corrupt‚à*   int‚Äcent‚+%„?ƒoutƒ§em(—ÌD7m(sƒŒV—û+etT‚~‚. 

39R9
N
+
 zƒ#n‚;ŒH‚xfŠ!.„      Š#–FŽÿ       ‚vý
Dƒƒi£       .„ÙQ;typ—
•~,‚]J){ƒY?
B"Pƒ92sq
#W=†\b„N…!ÇG2½B;           '‚#‚E34.‚W-@8ƒZ<
†qe‹;†',‚6+‚3t\Š†7/…V4‰S¤X4o‚ ŠˆB
„™N«s•)’Q]‚fp-? K~;a!Žz‚P‚/†jŠ<ƒ8"‚™;
-‹eO:8$m<ƒ5B!)4%
¥>Np
#   bq¦~²y2½G           '
 3al-@dXZe‡p Õo6+‚3o‚Ï‚«n”N
‚M]
p…             K*;!§@‡6Ã’W`e¦S2etyp‚Yíe}

”lˆ+„gj# /Qq>U d9R"! h5SHh
JY¢*       
ˆ6+ ƒd
Dˆ"©K:ÉO "'ƒ’Ðƒ‚QÊH,”P‰9‘?,†;8  )‡f_"Å‚mp‰I…]d¶H†L
—’b ‚ %
0Q‚ +
˜Ú†i
%^
¤L
¸N
x“k‚K!Y'
‡     
†s%e¥ogL
D‡w
x:…@ "'ž 
VÐJ*dZ„k,‡¦‡¶Y
8      Ÿ
z_"‰"‚m—D‡jdí2‚‰M %
QN +QÝc%§
S®t
$LŸVNËSn‚‡pbank‚4
‡s
en‚4‡fF
sprach‚4
‡_Oystem‚ˆ`
welt‚‡Utim]ŠR
cŒW‡Y
†3ÍuŒ#„˜Šj™(ÂFL
“µí…;¶YŸ‰0„‘4
@í?ÕMŸ.Lvers‚0umve”*r\i‚d†.šP>•Ú>
„t…oP>b(+]HFs#„:ˆD‹59(„#ˆ!
       !
Šv[qƒ+$…G`o3‡c„Ï•!iŠVh
‚z
‹8Ÿ(þ7)…u*„KS#%8
<PD

‚o‘‰—
"¬Q
HF†"A\UZhI† 
„     ‚VŒ[M‚+     ‡W C]4%
„L†'
˜P(5§+†B4…9ŠP…P‚ƒExbœ©0’ HI…"W˜EPY‚^H
‚*F.<ƒS
2E6`‚°w   
      ;y   O …z&1ž*„vˆ7ƒ5‚]
ˆw0†(+Mw‚l<I†0·‡E&i‡OOG–Ÿ7‚a)ÝJ
‚Ÿ…$‰‡ò
 -®pnŸ
{W¶WN
:'Õ
‡cƒM(
‡i„¾;
t4®nQ§

ƒ7P‚‡bF§v‡j@—7MaWHDyå9b.Ns
2E`‚‚0   
      ;
T    :— yz&1‡t
ƒv‚‚"Ÿ‚G
L]01‚
„1
1z0…v?


SWYy)‡'‡Xƒa‚@é[eƒ–‚>2‚ƒc‚E
<u‚éQgƒ–‚C3‚H‚J!“ÿy‚H!4‚‚O“ÿ‚M     _cache_us‚j”¦'    flushg>{config6
\'!GŠ*d-Š
Ž|Ž7þ6Ža‘ "‡r.’Q‡W…8Ò&¶,M¡w†qž.+ƒ4¥Ö‚`ÝJuŸ…#‡
‡r‚°mŸ
zW‚‰QP§‚^ÝsCô^Ÿƒz‚!Ÿ‚Ffilenam
[10IK?e-!handl1k
ƒmutex
‚B%8fnam;
E'greadonli.hƒ!0
  †„Y

) ‡9)‚
&
""ŸV˜€€€¿0}ÖÚQ=0db_release_memori L%i-Ë4–×estatu
'd<
:jqj^Q" »œ
£"+„V”¦7
.Q"‚°iV”7
‚+ÕƒVa‚c
†q•ÒY
‚     cmdz@wƒmK†'&?24†z%‚Hzzonfig‡"†k—ÌX        _defensc‹#'Ñ
h±!¯C“Èv‚°zQ
‡Ef„'q!s_ddlc
/
Ž\C”$’Ú
pCŸˆ1mlcŒw/
Ž^G”&’
Ú
rGŸˆ3
enable_fkeic
‚  ts3_tokenc
„nþ8±8ü‚bü‡load_extens^/
I
…Pƒ6˜Š‚Hqpsgc       ˆ"¹"…:ùŽy„ÙERtriggc
‚h‡k“ÉQviewc
ƒk‡p“ÉV
legacy_alter_t2@Œ=¶(–×ofile_formatcŽ3¶s–×SookasidŠ'I-M‘ŸcHž0%-‹]ø…%†òƒ|*-‚#
        maindbnamc
†fƒn–Boxc
no_ckpt_on_closc
‡,

reset_databascŠ`
trigger_eqpc

‰1usted_schema|:E©g0‡Ønù†y‚°oŸ|ƒŽxE
writable_schemac
‹jdata‚7
†’û@hash.T '
—ó9T'
info‚„†s—Ì`list‚i„+–B,name‚pag‹b¯S>

#@-"*0$
-…:„7ø„e…ˆ2"

#@-"*0$
-»B!„ƒ7e‚i„)–B*tr‚†%’û%Ksqlfuzz‚2ƒa,!=‚
„?Œ'&
‘ˆl‚S
 ,!=
ē&
tatxH#      
+M
k&.zE.
M
T‚9¯ƒ…H‚ƒ
sŽ/,#      
+M
k&.
E+
M
Tå"Ý`
§„m„“‚í‚
‚ÈseŸÆ„pu's_cache_hit(      ƒ'miss(
ƒ=spil(
„,us(C8%d”¦}!ed_shar(
b]writ(ƒSN
deferred_fk(
„oœ–×?X

lookaside_hitRmiss_ful(
snusE£S—ë‚1
max(
        schema_us(‚ACtmt_us(ƒtargetŸÆ„kotxtƒ›&—Ì‚  c‚0‚4“r    X5ŠF$9-6†B„+/‡5„Uƒf"‚w+‘ˆ&
X5  #9-6\ü9‚ï¾N
+"ËC+d
ˆ>
!‚cƒu„‚(¶.„éd
”!Æ
ƒF_ft”+ƃPdddddd
Š*=
d„?„(l.|…:•Ú&‚e|Ëin‚”LùˆYthh„(e‚ªq–ׂ_vocabulari„`Žÿ&activcˆ(ƒIU<*1„0‚/d‚i“Ñ‚4lockuSNƒ*'')‰i-Y
duâ]l0D „ƒf‰Aˆ
–
        ‘W…8„sO’J…º\˜U…=‚
†c“Q^ˆ8Œ¦Š}¡’
x……~‰sj‰p„”†uƒÇP‡%‹"ƒhŽþƒj¾‚Åi
5aŸ‚UÕ3ZB‡G‚‰‚§B‡u
o¾vÆ‚:—Ha—%x§rŸ‚
â1¶Iloc*
ƒ
)
 Q‚NP%X‚…8‚7ò5*™
Ja¹Mˆ0£[“?H+˜
¡Îv˜wƒ=.8„…a‰Hƒ3ÜÝgƒü2‚ ƒ;
…{+ÓMŸ~~.8o‚!t¶Ht‘j*Žÿ:n‚d„`ƒ$>–&'B•Ú>ƒ&ƒ$>ƒz'Bbat‚ŒY‘˜(t”Š;„Žþ‚5ug36,26|       ‹)ˆg'Òo„%Šz‚t‡M °*„f’eT"¬KIq†'
2ˆdWŠ|ˆ]<¾Ek‚dƒ+”"@!˜*–ŽsƒD$CYOU ^.9_
ƒ
†‚N–Æ/8ˆg'
sÒo—1„l…l*
\’e"d{ŸHi
Ã$0‚‘Û
ok$"@!¦(PÝgp ®h
w
§…g‚„/-bo
ƒYc]ô”†â{
‚Pc…{·6—Eå…Cad‚iHŽk—K†ƒ`Ž$)Œ_†HH$ìƒ9œ|‡PSí3…ˆ;^emb‚>Ñ]nd}7q(P
20.1*.&K!SI
        iL  ##
       4,
 9ƒe&ƒ$?z
""ŸV˜€€€¿0¯0decept‚‹‘˜id‹n‚£-”"…ZÐ*:…X‹m¶          “w„ŠW‡„•Ò&pŸƒw‡)Î…Ãm‘S††-<•n.$Y‡/}„*[Š5 *„8m„#45hd „{
(‡O]
Ê0µ8
‚R}       +‡]bù8m45
h†N+
('ˆŒ.al_add‚Š'‘¸<    cmp‚ŠQ‘¸f        mul‚Š-*%2‘¸B
<%2   sub‚Š*‘¸?m‚
Šn‘¸
hexadecimalencod‚
0ýTs…xvžF‰Œ£D -
‚i‰…E†0Œ'†4&šU3!„AGŽö„HâKI¯D ù‚G‚™'^3!k‚q
™Ular0Lƒ
„)†28ŽU?'b1’cz:'Š'+;])”    2ˆ4‡h2„Y“…d«&‰F¥Vƒf.†[ …j+&‚M„8Ä’UYSL‰    J°‘¤NŒN;E      3–Vƒ™M»        Ž0ƒ,
‚.ŠHˆUk‘3
Á)…
ƒ‚,–}    ‘°0‚%
P#&…S%µ8'+
M‡)     2‡†8§‚HXt„,‚9FR.ípƒS
„
Y‚×U®9EÖ‡_:—9JåER.I
JkyŸ3
_®W\QGý‘   Æ.^¶5e_vtabqmAƒq2&’G      Nƒ7‚;y‹PšD’ó
Yƒ†W‚C   Nq+‚rod‚Ç…ˆ*        Ý²F…„º0)mpos‚Ü4
„_„3™[!
ƒÜÇP¦ƒ–%
‚¸=M‚ï
‚   it‚¢„+ress‚Â……‚>„=‹3¬Kø—X„L…Î
reas~
—õh¶5+
œ:‰4’=™*

Š„`“_‡XŸ9½ƒ"žáŸ„BÚ+‚‡R‚ׂZÎ
„¾L§¶m(ment‚¥KšÝX}šjumpzero‚¥DÝvypt‚*‚@dic‚—*!&2`pb
(„5‚.= ‘ˆuc‚z.p 
m„{Æ‚hì7;‚ç0Fƒž!eem‚‡TŠ†*ˆ•³=pz£Z•_
SÜ†Ger‚!†oц´‚$st‚li 0;¢`¶u¦v8§‚   fS)>,ƒ ”ƒ[”åƒVaultƒ6
lS„Z‚      ƒsƒm~‹ih"…x:U
ƒF
y N‡`œi‚1Owy
‚4‚sŠP 9

WjmƒPƒl‰8Œn
n<)3!hH
‚VnEƒB7     |ct*‚I„1
A
|ƒ        „=‚`2    ‚8H.3‚XPA&‚b        1‚Guw     "‚K1X4V„N‡tAƒE(<'T0ƒ‚Z†Y-‚$2Y$……>ƒ=^‚=1
†Xƒ.‚8*6
$%XN‡vNmGE$+ˆlAƒMMs‚‚V‚‚QV„a…q{ žRƒ&ƒ?
ˆ‰!ƒ0GXC&g7…†5†…<a65 Š
&¸ /„2N††'H„5‘=7…p‚.fN‡3`˜‡."ˆR‰{‡@ˆ


#d…L…<’;Œ<ƒE…V_y)>ƒ—U†,,>j~‚l?A>‚=
A h‚<ƒ‚}{ 'i“*…‚NLƒT‚q%,Œ3q‚]~ ‚xƒ~ƒLS4k'% $rFf        r
#FMX!|P~;e‚HZp)bI‚:/H]T7:I
2-xj6ƒN=;‚6
Ndh),…0ˆT„(†1ƒVH[Knœ+q!‚t„F
”kJ‚F‡$Še‹_T!0„„Qª"DŸ
ŠJ…*
8pŒŒ)&@uƒD„18„‹Vˆu‰$‡01„…q)P‚f:c¥‹'„CN,f‚tƒ„n@-*5‚„L…Šb‚?Š‰q0ˆ3ˆhh8QžL&.‚‚Klƒ+Œ6ƒzo5ŸU7%‚1„™f„j
•ƒnkz† ƒ<
|‰o_0)D…$4E‹/‰}…(
U‚C.
;ƒ$ Ž)x‰‚#†9›> ˜>–0F‚4‹c“By7‚7ƒgˆ$3‚+        …|,Š3ƒ&6B='&(†bƒ‚`)xN
†ˆ@d‚P=ƒ4%T     U}0tƒPˆ ‚‚FZ%7ƒ\‚ƒˆg†^Y˜l<ƒƒŠ  ˆc‰[‚s‚U    2AŠ^BEX„&s
V„}%uŒG‚„y…6-&Nˆ/‚Œ}„j‡h' Š…?„IDb„4‡+QO‚;[‚"ƒP‚@ƒtrs:*VˆC>†ŠPSª+‚8ƒ†b„„(q‡U„‰#
H
†?Y#Žöt
ƒR‚-‚$$&8@g‡^}1
„]9!z6
$%HVN‡ƒ@P\‡ƒ"
0
KKL"„Xa0SH!:7,!+(
""ŸV˜€€€¿0³XC&ÀB
I7d]S23a
k6
 C8
„/„2NƒW'H‡ƒ 
I=7‡b
i§4‡j
…!"ƒE'"ˆ


#d„"‚qF        "+…V_y)>‚L   G‡?Ÿ„¶‚{    Kw%,GP
 ‚>
3ƒxP4k'%       $rFf        r
#FMX!|P~;e‚HZp)bI(0/H]T7:<@
2-xj6ƒN=;‚6
Ndh),…0…„(†1ƒVo
qKnY    J!
72
‰:J—~‡j8Ÿw§
8Î     $@¶X§
M‚#Ÿƒ
P„)P‚f:c‚M7ž{L,‡h
d‚tPÆ%>‡^L‡c0ƒlhh¶R
‚\
        
4‡_
K
z‡fƒ—6<‡eD Y
U‚C.
;—6‚x„Y
†9
‚C‡]q‚0F‚4
S

‚P‡w7d‡‚A§C‡bp        Q%N6&6B)
&A%67
`)
n
‚

!‚
R=4%7      U0i.%
,1
1%7R¦ƒo¶W|…H‚s‡d
d     27‡j>0D$‡F
V
/%u
‚'x&Nƒ9K
&‚OP' —…od2‡aacO(/Vƒ

+s:V
>E
S„F
‚8‚0S‚$WU‡HhP
X?§W#0default_automatic_index‚‹u½`¼qù
…„ø‚S
vacuum‚Œ.Š>ù;…Þ0$        cache_s‚ŒjÁK^†LˆX‹&’økw‰n…Þ†Lv¤; file_format‚2‘Xø?‡‚‚permiss‚ŽTù‚a

oreign_kei‚Žw¡lùƒ…Þ journal_size_limit‚^¯   „lù„…Þ|‚      locking_mod‚O·#ù„\…ÞT(okasid‚mŸUù„z      memstatu„uƒ+‚5Žf‡CùP…&‡C
map_s‚C‰gˆ»OùƒP‰g…Þ page_s‚’Ásù†…Þ
cache_initsz‚‘Yù…f       synchron‚’AB?Jù^†NB?J        temp_cache_s‚\
.<•œ
/<   wal_autocheckpointBu…|“NÝŽ÷d‚‡[…ÞuYsynchron‚‚Z(#ùu†j(#
orker_thread‚“g†hØù‡t†h…Þn;eat‚¨w•Ò„
ct‚ÊC¸7t¥%ø…~n+ñs… nd‚„8
Ëw™„#“ØYB‚‘‚L‚°R!sc‹+
‚-‹JƒTp›#‰?Šw‹Z  ‡v
D
ˆcr'M†If¯:‚/—p„Aƒ`ƒLˆW†dȃ"•!ø0
r/     =      D=n‚°UBzl‚/ÚR‚¶‚bíì‚JÖ‚Sr…ƒu.UƒC
@"…‚(˜2
6   ¥oD‹KC
Ãi¥8´„0Ç¥JŠŸ{     <–K'3)4$'/%3Jt‰pƒz·*
›e
9Ž÷dåF‘!D‹KCœŸ„8‚À       £p[Ý],K'3)4$'/%3J
]‚G—CåG
(
9_foreign_kei‚˜&†N”r•Ú‚ ü†Nr  ƒt‚[—V+
F›k•Ú2P+
Fý
.edseek‚¥[‹FÝX‘
‹Fici‚¥Õ.¥A—ë?n„0%
Š;
W FFP‘S]… Žxˆ* }    „AƒAŒ}myi'†y>
"‚zn+yc#:9…?Dn,3\A‚VVq‚bƒ`‚F [$Cf
\Ž A,w(l‚`vV* ƒYS„
‚Sy‚{‚f\…H‰]
       •%„Z„hŒ8‡%“{žM'<‡$“`K²‚,‹z-#TŠ…Lyd&„
J       ‡r…PªHŽ*‚@|“}ƒB†I‹†.
X ^5E‘œI…Q*7‰4Aˆˆ1‰qŠ7‚uS-"rK‚4¬2W…;ƒB(4/s†tl‹F†*uLY^+6Y_‚g%e
‚0$‚_[^h&A"$:Q,
'(…9K;qG<‘y‡?>3„c4$
tˆ~>„E#HU
„L2
4ž‹W‚GŠ8‡‚-:"]_ƒjƒBy‰\†^V9C‹1   ƒ4ƒ$ƒv(
#RŒ-^N]
;E…y…0hzIqp


       
          

…L‚d?9‚
‡.~‹=#N*)9)1.%#B'.9;|‚&?0 
""ŸV˜€€€¿0Å‚I‹B‚4‹)„c‚‚…
A ‚h†P
„b*†!ŒM…mT!ƒ/&ƒeŒ’{„-›‚3ƒT™U‰J/ƒ'%Š\7QŽznœQ‰|L‡:„L…m†L‡9










„~ ”V
b„ƒA‹2……F‰‚Bw
‡0%
„;r@z‡     


       
          

šr„$ƒ&‚5S%ie³Hy(yu’!\‰,–j“/fy•D@.ŽaƒH‰'„g]•#"5ƒQ‹_b–MŽc
ˆl‚.^„]NŽö^‡cG
^\'‡W]K
`Š;8Tj…‡7ƒjyd—7p         ‡r…PªHŽ*‚@|Vp‡‚!‡j2ƒ
X‚
‚ EA„)(7
‚>Al
*‰qÕP
i¬2—ql‡/†*
†OL(5^+6Y_
      %F}
‚0$‚_[^h&A"$:Q,
'([K;qGQ6o
394$
3%B>#HUÍpr”6L‡e^¶W##^N]
;Ÿ„%¶\N‡e:9   ¾3s
k
^
z‚!PT!ƒ/&
I!—8X^‡d
H/¶P$7Q‚#‡f
‚m‚+‚$‚‡U!„L5,ƒ











‚    $Ÿ  VD®…F2‚B"¶—9
&eP
4\—„           
@ŸA=?a?6‚B„g]*"5ƒQr‚k
I—7C0definit"„bD‚eƒo$‚ ƒY…ƒjPK‚S‚!&!F7 ƒ‚hž[à>°)‚  ’véN
[+„ƒLŠP-*‡y„8„ž ¼M :
›)”f„hl‚…0‚@$        …m˜`TˆaJ+ÚW‡ƒm‚c
‚mL2ƒˆ%
„‚‚dŠO… q`rxƒo‰ML†zƒ/Up…D›‚5³R‚ ¾2&‚r\†9#‚P†L
#h¯ ˆ‚&
)žg
/éNH
+Ÿ!ZÆ«_—’>^‚‘p‚!   Ÿ„bœ'
YT
kJ+—/S
7‚c§E§    J
/%
‚*‚‚d„D(q`r$Ÿ †!L&{®fJí.rQÆ‚+x$\V—5elat‚'†NK.„†‘ýe„Ét,‚„e#‡3‚„o„]`†6x> $d5‚+u‚y…m†G&‹aJ„ÙGd5L,aa4rag‚‹G©s–-¤9gener‚©M‘‰‚wrad‚†Ne%-E
_‡cq6))$!$ŠL‘ .6))$…Þ„2initilaiC„Q
,7
’±'ƒGg
š–ž`›QŠ2ÜœYÆ"
—}†´7Ý„>eg‚B4“Ñ3t(‚?ƒvHF4"4/1B4
l
 G
‚
 Z!*‚Q-"‚
        Š Š0„V
.0D 
‚ƒ3hF+(0$181!    &:‚
…DŸ}       )..X<1
‚y
4(
B"„‚q
!|WIU?e,
)'…*f„I‡^„t‚WA\†Bƒs„V‚Z(„B‹P‚K#‚*yE„
†‰qBTC‚>‰*!†…L’-*+V¥p*
‚f•>KB`"‡c‡4z¥Š“
@(>=j‚Hi„Y)†
)&‰E‹Y†F‹>„BZ‰F+MŽ9’„^Šs¥*
>T‰q‚Jˆ?À?…c 
*"B7
U*—/
–Y3‚2…s¦.-ŽŠ8„(f.‚KU+‡:~‚ƒ|
&s
d‚l‰Zoi-ˆYh
0„&‚-‚F        #†‚X‚R;Wƒ:…>B"Q:ES92 (ƒD      ‚-…
ƒuzF‹}7t(‚p*?! FƒW‚Œj‚un‰U
,Ž#93u">‡0'†p#k3
"BA1
†
       @-‡C|B‰
„9^|…:‚<„#
^\px`?;‚-‚#‚SEs(
¤V‹?»_‚‹Kƒ*–* ƒ*2
…\‚Lu8‚
‰U Mx„G'&U*…2*R‚zc:gzT
      „ƒRz(„ƒf5„v;pIM; Q†1n‚:ƒ<IŠ84‡<
       7sZy-:#+$ƒ6R =†k·FdYƒc‚r&†O#&:,…k,j …I…4VŠU‹"/–NU(*&’^…t
7!I"‚Y†F}‹˜2„#0V+‘ƒ„%h”h 98ƒp!%„`‚#0j‚ ‚ƒy:¦7ñw‹X†@J”y\u‚#¦q>…L|„j—^¸TS>ŽA)‹(„;Y"ŠH‘-‚{8I1+&„
„V>IŽövH  P<O
gEP‡‚53TC§ƒQXl-*+‡
%*
‚K       s>nBŠ]…U8_"=g
""ŸV˜€€€¿0²`ÀR
ƒGz‚

„@‡)
:=j^
ZY)
g)&)‡iyN
M„B>F+MŽ9’„^Šs¥*
>Ÿ
‚J$.„ 
*"B7
U
3*…-‡!3å:U‡j(‡j
ƒ@-ŠHŠ8'l‚a%-®E§
‡h‡s
,93u">##3
"
A

       @-<¦g—W¾?t‡gF
^
p=`?;q‚#Es(
‡>¶NeQT
    
pbR(I:)‡f*—3'—I‡f ƒ<I…84D    7sZy-:#+$jRŸ;
 dYƒc‡=®uU#&,…kvj —M;
"/U(*&

7!I"So:
¶ƒ§\—2r6Bh®gDS)
H)pžuUo—‚w        0deleteriƒÑS—Ì%iber‹>ƒr£‡?Ÿ0³8ˆt†F‡2•B "…‰
Ñt:CÌ#„™+Ž÷‚“=‚:‚a„ƒ‚¡ÚÖ
‚,¶5:§B;Ãmitƒ ŒR
-–W~‚—Ì:M
-      ~‚vRb'uH…F       ¦Rœ‡9†]‚‰F–Bò‚‚È4¤¾OÆ‚-er‚99i‚
•W×]¥b?‡ŒLù“*— |„“‚ËklƒŠz—ãota~
‡,   -(r•}½…5‡7ƒ6        -(v‚9ÝO6mandfi¬Oƒ+„kŽ0;‚DpwU
„pU½^hå‚M‚ßHF‚öuòTÕy
ƒpUov*zC(b:VT*…ˆ5‹/ƒ0†A‚#/Ž,ŽþxxC(b:CT*|†¤Xs`/ÚƒK2v$g
†Žÿ2$†¤Y
_data‚S$Ix*FD4TRL”ÕoCx*FD4
#RLindex‚S4…wgQPTk‚Y(„‚@LƒsŽ5”Õ1'!PTkV(
‚AqL‚7F2‚S
•U”ÕxUvocabŠŽÿ~nstr
‡‘2š2“*”9×x}…v‚yŠNƒˆ\‚zˆ8‡T‚k
t‹y…k“gŒ<‚

‹"sŒ@•Jh
›pªm†B
ÆY›‚T„]        ƒ?'R5µ?ˆ~‡H¶„Jƒ‡‚bŸ[åK‚‘8‚08O³Z‡‰—27§
‚"l§
V‡ —ƒ‚‰BŸD¦r
‚Tt‚•ò
?n‚4ˆi@X_#bƒ=™T>…>(1ˆ(“Ès3altƒˆJ:
¤b4F( …+ˆ‚(MF=--#'Z3Pzƒ$øtŸC( ‚!&„:‚(MF=--#‚°TO3Pzƒû‚Ln‚ˆBot˜qVúo‘BÜæ!†•…+sƒ†4e_rank‚U—T9…<C”å<M9…<Citiƒ…Bpart‚ƒjend‚m    ‚]†G‰v‰_F…&ˆJ„S‚@‹ƒOˆ
–vˆ%!ŸK‚(
L
‚E@QJn% ?c6ƒs=q!ƒ0A‡~‡"“(„*£Z‘†h¥œV_…t„˜>Œ0„P‡…8‹sXT¦9Ó‘Š{…&‰
»
S¯2ŒNr „J‰“‚d†‘(‘AŽ>Ž;„V
„>‚hA&‚VWJ;ƒ`J†@Œ/‚‚˜ƒ%Š#s˜3‡+:‚8p‚J.‚…D‚HŸU‰Ž-Iª~†"’z„,
‹"ˆOƒt™;„AŒ&‚=b„!ƒv1Qj‰{‚e*rƒN™}-T&ž:‚.ƒ'„Jš‡P…M‘dŽU¤@+†]—u”]ƒ-ƒI‡=
#Š{ÅŒ~ƒ>‚Œ@‚`ˆl,ž4
‚
CJ†+GŒ
’YŠW‰a†Kªu‚h…†x…`ƒ<„@ŽöC„W‡Q¶T/!G‡_x‡‚/—/\U´„˜>Œ0K‡i‡r‚IXT     @H†r¦¶\CŸ
aSj‡d/   ‡jÝdõ|ŸS
;®n  ‚‡.‚‡Q       qs„#c+¶.nx‡‚®r‡‚*‡h=PE—fw‚3V‚=bƒjE‡` MoQŸhV*r‡‚{}-T—2„‚.Æ$vyM,|+Mž?7‡b+§‡
‚fW‡h;Gƒ$K‚,
1—
ƒS†Q.r
N@tn'5Y‚u
5
-
$

""ŸV˜€€€¿0¸G—æx_‡e‚z>„ T;‚h:iU0depict‚ƒ!‡y‰XBFÍ/0¯„R„álet/hoi*w5
]ª9
”dJe
‰
O{˜sV™
›,¶Œ2.„f‘0tKów2”9:
‰3J„º,«g,VIÃ!Iy>)‘qc„ gˆ.¸DÅq
…{!!
    ž
ì!BCbÝ‚
¯‚Ÿ^‚°w)ù`!‚È'Cosit‚•^M       ‘×M   receo'9/ŽD„M·K’ŽB
0‘m5$‡S.‚{†(§@Œ9‰e”Nû„]üƒh‘m‰[‚3…Þ‡Pd'      s”%th“I"[dl‡$ˆ …     fr‡B[2[2/[[[2[BqXUqqH[2[2[0+Y@UqqqqqqnXX‡7"„
{$:!‹>¡ ·;X…•6        ƒbƒLª{¾‡œ~
   „*ƒM'Îr…w[2[2/[[[2[BqXUqqH[2[2[0+Y@UqqqqqqnXX‡7§
ƒ,
‰"$:!‹>˜D oƒÌƒ^
„sÝT‚§‚
ýz£m‚D
ƃ*quot‚‹^§ƒaC‡Èƒ2r‚4‡r9%efer‚R’Q.IJ‰U‘˜Oˆp.Ienc‚™R‘‰ivY‘,d:‚}Öz†‚
‘+§BÌSW¥g
‹‚m P
ƒ/e
…’ „ƒP„Žþ‚{9¾…s‡@H—8
œ„T‚ßqPüd΃Õr…1Œ6
¾Fhƃ(~edfrom‘‚R’wƒ'_back‘4sc‚^1ƒw“h~œR0
’D‚X;_©3‹&Ï=É4‚‚Jƒ*bˆ=0X'''.5'''''''''GN''''''''C'''''''oZ7>''''': ˜k     †,)äš3
¸NŸ$‰0 ”ª
¡–]
½`O¾6‚I=‚K4‚‚Jƒ*¦ab†0X'''.5'''''''''GN''''''''C'''''''oZ7>'''''³:ú
NR#”‚Sí‚XŸWN‡b
ƒkÝ-ôy®w
end‚N8f#¼vK‘q],
 1ä?‡)&       „HT!¬zü
„.K‚füj‚×l
1ƒµ4O!t‚‡     „Xrib‡h‚_‚(ˆm
)1/ŒOe–%ˆNƒ]<‡ol<zƒo„   ƒ0D-RƒR†&7Oˆ@ŠOCC•‹/.‚I‹Wˆ‚EŽ~Yƒ+#…$†—WAEMs-
”A–H11˜t<DZƒ<ˆj?‡i
’;‹lµ[ƒ3†e‹;‰<Œ"U‹}¯SE‹z„s=×(Šuˆ i“KA8ž{‚%œ\* kK†"F†„z‰;D8‹:x/m‚(†r‚key‡kˆƒk†Iƒ`Œm¢S6A—&„m?„y„h]‡
ƒ5„^ŒW[S‚bR…cI—"'!z$M£s•^]‰qºƒk‡(‡+‚„A
>‚TW8„a‡tS
„%
F£8‚."£0„‘P$n‡z‚&„„M…8“Z[‰t}0mŽ%ƒo‚!‹Y*…‡?N¤"‡8‡cM3      Žd‰^‘>…ƒlƒb%
ƒØ+‚c…(ª‰Ij„aNa“"ƒ]‰     J"U™0“b%Š„~
S„‚nJŽ.‡g.Xj‡†"FOH
:C<      "‚\ *!‚I‚k‹7
‚E„6Yƒ+#,‡LƒY‡z
*M-
        –H11˜tŸD„RƒK?‡i

„`;Š.†q*X‡1‡ƒlÆŸCQg=‡’cN-P
      
o0‚8åG
í.
VyŸ+TA§‡W

A
-
MsU‚?4{ ¦_
YS
R@—1
!z‡g"¶K‡b‡bEQ@—&9‚Q
‚s‡f®pD ‡[."
„„y‡alp‚&ƒ
„M-ƒ8¶H‡c& ‚ƒo*—,Q9Nd]¦‚COX—9‚%Ÿ!#‡te(‚D
ƒdNŸ‚.^[„<ƒƒ%m
+žvR'—5
vnpt/ŠEŒ
<j
W2e8*y(t†f…‡Kƒˆm„%—>RŽ67&k
ƒP#›¬f‚h(‡g—A‚z‘a•rƒ[’z†H—wŸU¬z=“   ŽeerƒMÈT
-ƒŽ®…VŸ‚Vƒ)Š<)œƒ7&‡(—9
#‚ßQ¾[
 Bƒ9G
§¾—¾@Ö7‡:>.D‚W")f
ƒ{
!!ŸW˜€€€¿2¹_r—¨1Ö’Zƒ0descriptorC‚sŒ<F4S›&›D
.6*„_ˆH‰}øg&`-†¬’åD    
6*
*d
elect+ŽÿAria^ZJ"“P&„v¦š^”HŸ"cŽ#
š³sPøŽk„{‰†…4ƒ<#Îs
rPalize_freeonclosa
Mdwreadonli|8DsizJ8zv‚šŽign‚!b”ƒ{‰H‡Sp;„)
¡$
„ƒh;[„Oï+˜<Ž?"‡@h/xƒ
-j‚‚0ˆƒ0Œ„m„
l†e(!!ƒ&=‰AŒ!ƒpC“…†‡,ŠU†Y
ƒ7)‰"„7†}¨*…
-‚$‚l†)‚?U‚-‡.‚,„3‚7†
—…‚h†`ŽP‚=ƒA
o,‹q,‹S«jd
sg:ƒfˆg‹.ƒ
:
„6‚\¡Ra‡}=Xƒ
y¿šA‰ƒ:…ŽD’/IGˆn’ƒ
„‚Q
=§F‚r
Œ&‚=‚+‚_Âd’]Ì„@ƒSŽi›c‚>—Ž‹v,²i ‡gˆN‚] ½.4‡W—ïCŸv+„V¦_:¶`)> ‡f
l‡†Q
!=~  f
C‚;?,W‚[Æ,Z‡E)Î
—6AOL‡k/‚DE—U3%¾C§Õv‡i—F¾-
‚(Ÿ*K—„,=X$y‡ty‡ =Ÿn‡r
‚W‡ZƇg=¾,ˆnžF„e2Šd‹v,…Wž}*r…O‹c‰Š‡?
HŠa
ûT!…Y‚K¶@É/‚5…5‘F‚JN…6…‡‰*gœT       „FˆPDƒ&
„ƒ‚š)‹z       
l`Œ"Š5‚K‚T‚G…9‹E
•!@‚{bÆ-ÇW
…`kžY–d•fgŠ?Œ    
-O
§JS…!¬jŽÎçG
kI„M
'‚5õ)¶P
3N.”‚`‡g^—<BK;ÕQ
E‡ŠÆ(l¶]B‚v
R…9¶‚#zn@¶@—‡{}‡jh®!k‡t
?¦‚t®c‡‚¾S—‡ƒ4ktopa
Œx‚%—w
Z
ƒ.†?J3ƒ’_Ši)y†Cj     „…l…<ûƒÜN}ƒ-qÝL
?picƒ±1—ëgot‚Ɖ)™GÊü*$„á‚L‡‚@t‚gœq 6U#„`?•ñz‚  6U#u?inW01
B-I53

>t'"GƒbŸV™O–„>"}„=',1.
…u2^_M’tņe—7EŽh™O–Œ0^MroiG3PR
 ,x

ƒw\‚?Q †=-0†<*'6$˜]liŠC‚11†¬[
Ïz‡b      ‚7
§ƒ$ŽO   ’} „ x8®k   …!Ü2'™ng„j¥
„i
x'6Ÿ]—:‰iŠC‚11Ÿý‚2‚
‚¡‡DÆ'xQV8LÒlQŸ^‚uct‹
™r—Ì>U    orS
$}
N
eH„(‚"

@<…8     7….9‚O/@zѹXm…[‚      |ƒb6L¾l‰$†_%)H‹0¬8ƒ-‚"¥x—b»/Œ¤ƒ-&«ƒR”/ƒD%'HM
ƒs00‚¨a7tach ƒx#
&Q[‡7È&…m3ig@ùƒa„¢ilQ†%8‰<Hl ‚V2G)
…o…Yf"K&(ƒm…Xƒt‚
‡sH‡J…ƒ`ŽOŒt‰f+$

y$Z™>$‹!‰q„I
#bƒEb

F„#H,„„5ƒj„w‚’$‡HV
KA‚kˆl‰(»P‚F
‡‹d‚T(„m‰RZ‚E
…\½†B4n!.$(4H#34N!‚ƒg‚
2ˆ)(KƒT–…lH=‚L5N‚]+ƒ.†A_‚‡fqB‚‚/‚~„C6‚=L!u‚+4,‚m#††D•Œ!‚r†–YLˆRƒ)ƒ‹†ŠMR„j@e
P…Fƒ‡:‰ƒt`]‡   †^+„t‡‚}Š#‰;ƒN†[ƒ`>y†o…!ˆ$‚8%p‹‹‚$N‰4‚#ˆG”/
y„bDˆe6„D8ˆLkˆ2….‚…,‚9‚<D‡˜®Žx
ˆ,„Z     2%~ƒ
‚&i
""ŸV˜€€€¿0ÄŒR‚uƒrƒuB]–(‰lŠ‚V,ƒn…‡S   ƒsˆQ†   ……zC
Qƒr#íoƒGŽ1}‚ƒvŽþ`ƒs‚‡n
ƒ=K1l—‚
y")$

y$Z
9$†‚t*„2
#bƒEb

F„H,‚Jƒ"‚M‚‡I‚j‡_
HQ‡‚‡‚Uƒ2‚F‡_Ÿ‰F¶WC-XvE‡h",‡’uIQ4„=!.$(4H#34N!MÎÆ)w‡g—8‡‚‡‡‚3§    §  F‡Š Px¾%
¾3VR
…6@    ‡WN‚7‚P4‡b.MP+‡hŸ'—+rK‡f?—=>‡ƒ
‡F‚\)‡‡m….‡d`§      ~‚$/‡co§
5#¦ƒR‡d
+,‡ZD"Q‡gg—‡‚_‡X!ˆk‚2%—30detect‚$*˜ƒ)UN-‘c %as‹y¢‰g„o–K
ˆyjn‰t„a„4 >Œ        W‡$ %TƒY†LŒ
ˆ ƒ†W!•m…‹I«5%
Š>         †g7=Žh£J)
b
ˆ{fÑb‰^
”/˜Œ"‹}ˆ74‹HŒ`      †D
2†:«qƒKƒFƒ1ƒ&‹k2Ñ<„4<ƒ#(”S‹ƒEµ…
M—ô+SCnü8”K‚W‡$TE<mMZŸ‚,!‚¡Q
ˆ\/¾?Æ‚.7=ÝŸ‚2Ÿ‚‚Î$H¦i‚4
(H¶X†l   †D‡b0J\0Ÿ‚B‚2F‚)+2f „4Ÿ‚T¦‚Eorƒ‰%—ë„trior‹ŽøWmin…ƒ.tˆs?‚puƒk‚=+ƒ…M"Pc“ƒ8&ƒ
†B
„]‚J’E„'  ƒY
U‚*k!‚'DA†gL…x„ƒA…%O/QŒI(K„wNN•lƒK‰7š‹w6#‰m       }x ƒrˆeP‚m)*¬h‘PNƒ2&‡P‰®v’›q>ŠH—:Œ
†q‘eƒ4†y†RAƒ„ƒm0£Kœ4‰v”-8‘[–k„{‹P$‚gƒ
†#„3„r‹Fˆƒ$,'=‚I‚';m=††J#†Lpˆ_3
ƒ9„’=¥B•rd‚[?
Ž\I˜1·J/wLS™’lˆp‚^[B&–\‘+‰G‚=R
ˆ8tƒ…Œ4žE‘5“g”tƒhƒR˜4…eˆq‡,ˆD™ƒ…“, ‚`ŒQ:‰v:=ƒ9‚Rƒ<C—W„‰‹7(‚k‡%¥T„
¬r‘aM“i-(0v…I‹q0Žu”z1ƒ!'7‘L˜9‰„UA90ŽþZ‚)h§b(?\.‚m‡kw~
m&7„6‚:
‚I‡J—6,:2Œ
†q‘eƒ4†y†RAƒ„ƒmŸ‰;‡5„
†8
‚ƒm1pP$‚g‡AY‡@#í/ ƒ$,&
=‚I‚';m=††J#…pKˆ_3¶I9§5œb
%?
UAΈrž~-—9K‡y;?®‡‡a[B&~¶y,
ŸPt—d'‡J‚„^‡‡PsuopG‡Zg
‚t
‚X‡G¶?S7K>)c:
ƒ!  $¦HF΄
Ÿ @
†K(?-
B‰
1'žF‡bQ    ist‚`˜å"|„>…<
P+
w%   -B+-*„%ÜjÐT®#Ë
>>Ò‚yåF     + w  B+$
-*‚¨pQ
t‚å,ÝÐ^ract‚…/–¨iment‚‚uv›TƒŽ÷>$…ýH6elop‰P‚-&‹k™}"9“3Rx‚d‚)Lƒ™L”3‚kg&4‚=wI\‚e‚‹!
õ
a-
†!‚*Qˆ„!‚*ªZ×$
™K„J…g2=Œ+…X
r‚9h5O
A
+;6!2%X<:((
;oHƒ83J!
k7.‚W(ˆ]?
*1†w¡w™D:šUƒNSƒQ‹L5("‚ˆAŠ0$‚5;ƒ@ƒv(4\,Xj!…PXC6S%SŠ9)'†C
/T”P?=[ˆq]Z…L &H‚T>[:.mƒ†?@Jƒ.„>D+A<„@v
Ž#„‚
5I/ba 1-b+bG7‚B9‹‡mƒ‡„|Œ&c
""ŸV˜€€€¿0µM‚CÄYL‰"-&$‰bD:‡R‚31*‚L„#ƒ $[©~VŒ‡E…JvC‡KWŠ^‰P…p8e•W‡3n0@7g
P!n‚vˆP‹N7
‰< `<D=M"‚ƒj5‚k¦3 Z;[+ŒA†‚.…x„P‹±*\!
ƒv'K=‡&!RW]]ƒW„t˜i‚V£1ƒl
E”S†zŠƒ!”I†#‚IÍ5#„:‚
Š~o i .
I„m 3"'F$
_%JŽöƒ2‡b!‡cpg&2D
\nKˆ2
"(O*14/‡\)‡†0¦^:¶5.oW
j—.
*1L‡–‘:’F
CƒQ   
/5p
"$
;(4‡E0‡gUj!
‚`PM6SSŠ9K(?Õu
'‡‚ZåD:d—:
‚X#—33I/Da®jGx
L
-¶,XP"Æ0EI<     
Pa;‡_yJ
2
8§YD=M"y‚{5Ÿ0„2 Z;Q+‡'„(y\‡„     ƒ     —ZŸ 
+tÕ%7‡‚[
R(O¾,‡m
„
‚"— r‡c
‚I ƒ%…_`+!z¦G„40deviat¥'Bb‚l—ãl.c)
ƒ?%++
M$ƒH3®@
†]‰'B&Žb*.‚ ƒ.
ˆ(
y‚m*m     ‚6‚oƒ:‚‹j”8   @%‚¬~Šž.™V‹0p•
'¿%
‡t>
–šM‡w’V„.VÅ³„4‚‘:
‚R¾;     ‚6‚oƒ:)

Z
@Êrƒ
0p®rŸŒ=
Z.¾=<§m—HŸ9%o‚½9sœ~JØ‚BŽ÷o‰„=c[ot‚ƒ\¯O˜!”!„@Œx  ‘ ‚r„=>Ñ®¶i…ýIƃIŸf‚„w—†,5c253c0b3dd‚ƒ’ÝUlt_valu‚Ñ–×i,have_readlin‚Z
…hF•Œ:
‚2F  strchrnul‚Štusleep‚Z
…\Q•Œ:
‚&Qid‹u‘‰-acrit~œ`O(-‚÷b;.(¾:gO(-+¾N†;.(gnost7 R
oˆ.3‡QX‹Ìl3‡ˆ…sŽþazXúˆ'®idw…ÖtÄsram/%–J‹sH
ƒ<D†&›~_)…‘NB$‚t'Lrƒ0ƒ‚A1D*
‚8›}      )C”IH‰ ŒQ
E…ˆUˆRgR
‰!    üôrw'Lr

i1Dz‚ßG
H5‡]

E
G      
gRù=lectM,4_‡ƒ       og'‰ce‚„tatŽUionari
ƒ
]™?r
œjŽÿ‚3†úT
id¢L
›s@‰z„$:ŒRƒQ
’CÊ4ƒz‚R…U‹#|‹8Žgˆ¡ƒqƒ!”   ƒ‹rË7‡7‹
†_:…J´_
‚&ƒ28‚TÃH^ê2Ž`·[’¥,ì‚/ü…o—MòTÎ
h|‡‰V[tƒü„„a#Ÿ"3¶Yk§(&¦R‡‡f2—Æ-Ie(uŸ#n‚Š9Ÿ3ªœñ‚R„á‡Xe‚4‡T"#
1ff™\‚
–ƒRŒ—>†ã6er3‡S#„R7„K"‡zh…2ƒH
.ˆ‚k$*‰4C‰I…   ƒgxŠ^‹1†f‚9q’V„rS†5‚wX‚{1[‚N8),
'…c‚„  ƒ$‚exhrˆk‚[‚‚&ƒƒ4X…CE‰G„*‡s
„<ˆ        †B‚sˆF@%†–…/‹0ƒ„Zd`.‚$†D‡G
…,„2hˆN‹«%…+y…ƒƒGz‚(ƒk—9‡…O`|#n'L’1V2<„K‚ƒ‘f“•        ˆ*‚‹K‹.›‚?†2ˆRB-…|ƒK‚„HZƒC‡$‚9L‡p1…P‘)†=ƒ:‡K‹7ˆrwŠ8†dbmc‚6o‚*‡v„‡
S„a‘>‚,‰',AlƒX‚^&\2 cL     ),V‡QC‚&‚+‚f†a†s…4˜(—4‚pŠOg^†H[ak85‰=f
‚?#y/†T—k
‚\Š0¤W‚+„m’2v‚c„Q‚fƒxH †Kq‡lƒg‚‹•l
"*‚{†^„‚Eq3./£„g†UN‹<h‚"„'0,)&x•Ž…`]Œƒ _„vQƒsˆ)9‚f/‚O…fŒa7‚"?&?ƒŽ…&‚L†
&šq„‡_žVŠ‚†Iƒ!*C
XJ‰I!‚d
,k#Dq2ƒ(.
!!ŸW˜€€€¿2À‡B‚Z:„l–28ŸD!m=‚w…
X8‘0.…]j}h‚)gƒ|ŠD,‹kz†c‚‚t†o/†<4    ‡ƒj‚@Œg‚Ej‚‡+-‹‰
*…‚hp?‹…%‡/……uIƒG?‚8.‚XŠ?…{†O‚/ƒ2„N…Lƒw 06ŽI0…
‚HSv„8’•a…†S‹7Ž1‚@Œ_wƒd†P       HŒ$‚cƒ‚+2;™!0›0ŽX#”6§>Á.”2fˆ„U†F
h†T g†6›Y‡†Y„I<a…(ƒ5„‚$ŠA‚62‚ƒ?‹1ƒZX5 ½|‚v†>œ,ƒy†a^O‚vˆ&&†
w‚ff@=ŠV)
ƒ‚‚MH„>5„ K4\Žö+E
…0
8
‡‚?,‡d
s‡jw‡g&)XG8
%L
y„A
fV>‚?‡=‚VFyH‚,z
((O‹‚‡,`m'‡HV—.R       0†f“•       ˆ*‚‹K‹.›‚?†2+eF‚9 =
‰w1P„%†=a_"w
‚?ƒ       ;m‡K
‚Hy‚rŸ‚C¶U*xC\2 =L    ),V‡G+*sp‡…|_…4—L
pƒOUj|a
&8"f¦f‡Ÿ\®_åDL—;‚B‚2§n
%:Ÿ;‡fM
MhYR
‡W'&x

"F‚6ƒW
%_~¦-=&tL‡u‡b¾‚9‡h
hN*    ,—)5‡7!f=OR8Ÿ!
uj}dphP       f‰ ‡x-z†cel„q‡ƒj‚@‚Ej‚
-m‡UGdp?,;%…ƒ2SB#jN:Q(L-‡‚~5‡\SŸ6Q0o
HS"g„,Tb¦HuF ‡F   [V®‚
y
[(‡e
†6wR'‚—:]ƒ!

'‚‡fh[s‡V5ˆu ‚…
Q(E\=‚v+P
8j0=   '—#p
H
0difficult„*ŽvŒ‘p‰01‰Eˆ‚.“W}(Ý¾]˜*†        ‘9„/™r…uˆ'ªZƒr1R˜Çrt„k–<š‹Œ@“#4ŒY…‡v‚e…d‰„.ƒ¬Xx
„Db¬        Žþƒn—®‚|§V(…ü”4’@K+탔9
21¾dg³//—„W‚rŸ#‡+ƒ{‚”2$‡jYå‚S
i‚ªBíG)‚‹CJÜ•tg‚ Òest‚…:–þ~it‚‘M†0       
™K+@

‡
%‚55SŽ
„\!
ƒY‡0Š6
‰]
‹K       ~G(
B:}K‚bƒ.
žU
Žcˆj„)ƒ#‰M‚[„I
‰PŽb!‡Ÿ‚S‡hcåG
‡?
íRO(
B—8

}ƒ½00‡c6¾n¶Òu
7#
}R[¶‚\Ý9
lemma‚žw‘‰?ig‚…2‹Pmens‚K
ŽK‚;Ššh”—¾.I
3;Peion‚ ‚i

‚b‹}ˆU         ”—|¾B@

%`
?             r‚H†%      ;¹
…J…G[*(.-)“ÿ>
7     ƒÍ
K
F—'[*(.-)1‚r
†ºv*–Ç<„{
ƒ'le‚˜2ctE  %
D„hh*‹e”Jˆ³=ŸFK¤^,„P·7ƒX„h‡„
,³]•ƒƒ,   ‰Z‡Uˆ›˜5Q†n†A,‚H‚JÌe”>P‹0œ
3.
f
Ž–«>ßq
-‚+D‚?…Z,9ƒ0PCQ-2!R"I-V%Žg³
YNŽþd8ÝcžoŸFK¤^Ÿ
„TƒX„
,p‡Si„oQg‡—=A˃CÕuh.Åz³‚LŸ‚-l=
§
d
®u+§
 åB
Q?w„\Z,9‚N0P
Q-2!R",-
%‡hPcN_overflow_read‚£=“øpO†…„7åJ1li&ƒ]  ‚?‡lˆ‹G
M‰‚2bh     -"xS…v}4dZ#
/‚Q‚„›&CŒLN¬>ƒ-Œ¯~‚@‡<ý:ƒC"¶`”L.”\ˆ6…/GQ‚.ŒP„F£N¥q-^…Q„ƒJ     ¡{‘b3ƒ ‚zACM,
„88
""ŸV˜€€€¿0¯‚…7]„"
      gy‚    
U6Š\J¾ ^2‚U…*É$¨-†2ƒ9‚W‡`‹ƒh…r xŒe‡‚ÒDH/
†Œ$'‚{0
zƒ%¡‡ÜFŸz”Œ4ƒ`®‚7Œk‰yŽöx‡p‡_?‡§b‡MYRŠCržèlŸB
#‚`
„]‡J
=GåEJS`„xf~4#3Ý‚Æ%‡iS—7w—ƒG§‚P¯‚(ƶYdŸ—eW—ƒr—#—‰—5ee‚|®C‡a$†‡Z%Wz
¾=:ÖB
+ƒ —'4‚G—K“X‚7>O‚'‡b#Ÿ0directonli
ƒ)#\*Q˜-C…=‹R‡J“ª
‚zƒLŸr‚‚^     i4J‚
i†
†k
!ŒKcP‚“u…\Wƒ&‡2‚[
ƒ‡+Ã=
‚†q’2c
(§A‘m‡B‰9c%  „z

¨ ƒƒ!†#
q?†X• "#"‚;„Xz„N
…Q„.‚f224
+N!6??(—j–8žP‡Ya

‡U3
”n    :„~*²fL6&\}„?'CŽwÞw†p‰>ˆJŽö‚
d:WŸl§¶{ý!Z‡j

„b[«L®
.'GFc%ÅZí/mf
q1L-3C/Z
ŸíXŸ"
H223,+N!6Ddj+BW
®3®r
Žz    —3!~LL&&—'C—[+C"ifƒ¹—ÌMsqlite3ƒ¾i—ÌTBtig?6%A
ƒZ[\„{'‘Sì2%†ësablˆŒWŽ"‚
…Eu‡=ˆ'Pc…u
9R'5
I1 w    bXƒ(6
ƒ%
C+‚

^
†:K]^Sƒ#$‡F/$(
„‡hP‚H$$!%"(/!,B&A5O(\$
Cƒ?‡        +™uƒ™~‚Lƒ†aº‰T‚iª#‚4îU"Ž-…%(R‚p
%.NO*‡
ŽV*#l_fSŠwbE.†~3‚`_r'ƒIT„oV‚q,‡]77|†QD‚r‚_ƒSw‰<¡\5‹z©?ˆ*
3¤~†$‡/ƒGƒNr.‘}
‡<*‹q½v‚‚D¯„;“W‚XŸ]‰™u…gzˆvƒ8…"C‹/8k›:‚G{„Vu'˜V-eˆ
D‡x‚VC…;G,_Œy„4ŠCŠˆs‚Y–Uƒ1
†M6‰:~†5‡Š'½sEtM‰m‡V> ‘!„nƒBˆ4ˆb^„p•:‡    ŠQŽö‚|Q9+‡‚i¾9.‚)2     
&•U—Tˆ
1"‚JÝJj*#ŸzfSƒbE.†~3‚`"r'ƒIT„oV‚q,77"_†QD‚r‚_ƒSI(|;5
¦eœ "Ÿ‚%¾‚mŸ
"*Š*=üV‡i¾ƒYŸ‚—6:‡eB8k
„%‚.—5d„V
K'
‚5-c‡l;Î
62CG7#   ‚t   ;7:*¶x®5M~„o"
      EtC—…M‚Y>‡l-rT]
f^®l  
           e_dirsync‚Ã5ùb   fts3_unicod‚ÃXùb24_def‚ÃoùbI     intrins‚Ä'cƒiø†…5„"ƒi   lf‚Ã(ùbdvantagu-P™‚GT
ˆJb…}]A‚'FƒIŽ÷+Pƒ<DPåQ‚‘3…Ævgre‚„c•³‚Ullow—6<HG
Pƒ”_)B˜Gøˆl…Þ;}mbigu‚–}|ÝX‚/|ppear‚ˆ„u™L’ë
‚x„á4/ointƒ£F˜š[0ssembl‚”/݉>t‚‰-‚kvow‚
‹Tbelief‚‰%í'card’

†„F?/#R!ƒŠM‚~ƒR*éEˆ„$ŠXµt“V

¡["…i
–a"ˆ>—wŒ{ŒˆŽþoH¾={¾Ud„$ƒÜKüm
ƒx"¦~zŸ$
‚."ŒK<
{—§‚ern„2†‚ˆ½]iplin‚„?laim‚‹L†X=%0os‚ŒL9ur‚Œe@9.g5p…T‘ -onnect«Tu…X‘\Ž÷V‡¹    y    btinu#&&²NN –}.‚{†(§@Œ9ùˆ%„¢L»*au/8     ‚uragŠ?    [@ƒgƒ™p“Y:&h…BG
…[4Š&*s@)o#&6p
""ŸV˜€€€¿0¹×x‚–`„
„u®A˜
Í     &«“3W<Ÿ‚Ã)
ƒŽ‚Ý_y0discov#v$Û0‰N¦w‡#†x…: †2„a†fŒ‡$„‚)‡;¸    ‰9…l$žRŸ-‚0›&‡,….jƒiŠÅƒx†8
’-r
 I1… ì"ƒ1ÝS:®sn8üavü‚<Õu‚5‚)6(‚‘…7»Œ+—D:ÎFXeri‚raºc‘˜;^rep5$Æs°V¾2Ëat‡6 ƒˆ           Œ„3`BŽZûj,†´$B§.uss‰u‚W‚Š
×3…ˆh‚lš_˜]‚+       ŽC#  
…Gƒm      ‹vœ0Œ8Œ‚$£ H
‡~    ÛS7Ð'·Rƒ#Ž‚—=—†®O‡‚‡oOGÝUD¾ƒ‚¸H‡]3Ã(¶b ÆCœƒ—‚~®eŸ‚favor‚„;•³‚-joint‚†T”—4&k
"

…b‚zœk
‡q7„B+v#GV1

#    ƒb:#„(.
‘Z‚i‰=
†70&ƒ.ƒ(V‚x‡ƒ?…D\ƒ/„Z/IJˆi‚
]‚/
‡
(r•W”
…$
GO&·1v        '‹G«6‡r(ƒvXt¾lŸ4„aˆª"‚e%‚psWJrVƒo1>ƒDK‚-‚([-4d6ƒjƒpX_#ƒ†@¡6‚…+Ž7Œ+‹ˆO“<”'„‚‘P†m3‚ 2s‚YI‚< VˆD3„-/g…Aˆrƒw;L ƒ<o‚Uƒ8„ƒH/fe
!‚I•:6n
%}…k‚!kƒm+      Js1‚7B}ƒ8Y;ƒk‚JTOP(,…M]‚;|3"ƒtƒ/%‚_b1…kO2b-0z
…u‰Cu†l‡B.`‚v¤9ˆB ¢4‰k‹U†}ƒd}-
Z‚„5…NX‚DI)K739
^%
ƒN
N 
‚&eG$2/ƒmy’W=@-#RV'„Y„uu‚#"‚3‰rAŠ~²*c-…]”E‘6
E}„WZ
Wƒ.rƒ    %.‡"5T‰
‹DX$‹ƒ4…f†8”=™}„4n&;C,T(‚ƒ…Gƒ/76`‡+%59ÞM‰Š6 ƒ•l2]™bŠp‘t iN‚ƒ   ‚FE",‚m-m-,e?;#,     '‚‚”Y¥J‚      m‘]Œ^‚r"&-8&h#.>4
$lƒ]Žƒ$
…1Š,ƒkŽöy
T‚x
"ƒ?!\t//EJ‡h
Ei§

„e‡n‚+^
‚{


„.&f‡)-v  '„.—=–hOyIXtŒ..
‚U
„T"¦a|®o-4d6ƒjŸ"6‡•C
b…+1Šu<}åImí>
‚U—8:
&ƒHÎ-‡`
%}…k‚
!!
<+  @G1*-Vo;eT$6(SM]w|
"Atsb1O2-
z¦`(õ_§/<my =@-#RB'Ÿ
d¶S?ƒG
ƒG‡S
a-P
+=‡}‡‚sŸW
@.‡he.§v‚
>n¦M^¶^ƒ)Š6—3
?
|2]      }   6—1‚FE",‚:-[-,e?#‡h    
‚`
";ƒ‚H‚ržv

S—  ord‚„wpers‚?‚”žR-lai‰"Ÿu²ìG‚V7‘1
ƒm‹cP8Œ_£Jµ#„v(›†!‰mƒs[ƒ<…0˜]Á”t„o„y
‚X™"
$(†

w'…E$‚p   "‡8,‡_
ˆW„V‹}–/Oƒ
…9ŽþƒKýˆ¦a87®m—8
~‡lW¶S8‚ï"n¾…g¦~
(Õƒ3„5¦‡e$
‡c
‚X¶\)
w'$
‚,    ‡b‚8,
}
ƒP*U;¦j'os„5ƒZ
‘iU“•êUrov‚ˆ{‚Y—ãut‚˜OŒ—†qualifi‚©R
§3•Ò„hŸ
regardŸupt„4
ƒR?Œ4ŽnÚAƒû6semin‚1‘ _ntancv`†24‚.h‚7:&-)/ ƒ#"%ƒC(Žÿ}[4‚.h‚7:&-)/ A"
w
=(inct    ƒyŠvE ‚ƒ        &‚
+    „2+œnu6‚M3/)
(œA DÐ8@ðPºaH‘K“n¡‚‚‰!) ‹Q
m„
y‚
       2n¡¥]K^,H         i9ZA4‘ V¡'“ƒ~†?Y’ob
Ž&U•v*•f—7
„2i‹z!Rƒ
„U^‚&B‚1oƒ*)..
  ŸX˜€€€¿4¸…‚{
ˆTS˜5Ù„2
ˆx&µCC‡hB
‚j@žÜŸ%‚H(0‡i
)‚ÕZ)—5E—qm‡jÃnýN‡*¦qå/U        '¦z
b¶U
‚6U—^‡r K
‚ai
9!R%å…¶
SÝl<Pƒ80distinguishˆ]…B~ÙgG,
'¤ÝÅ…ˆ/"
"ract‚z
‡?V—†Vibut‚‚PÆ^‹3ƒ,‰kƒ,ƒ.
`‚=šÈˆ3
™ly
ƒhÇB%‹P«5Ö‚    &

ƒPñS‡‚„b‚ßH‡‚}R‚×w‚~%—i‡dD
U&9
ƒPust‚e“ªƒ$urbƒP‚Ÿ—z˜šOIus‚‡cí%v‚ˆN£†0ergƒ’)—ÄXxs‚+‰3, †
‚e‡Z”õ
z6t†id$
ƒR2„+‚ˆË »WzŽ+ªo½h-o+&q)k((*D†9“y…-c
†T   eH‘ŒE›=„fƒZš$´%Ž;P¯f
„gz
‚
žj–!½hõ¬$+&q)k((*„“ ƒ)…Õt#Æ%0â^‡       Eˆ&Gs›rUŠJQ
ˆµrâRŸ)_„øj“Q€zikarta“S€|nn“R€{ll_AG
`,b…J”JE%‚*
$‹K09      %'
8
³\ x.V‚.8…¥usÃ!`”‚Î
#³X(åN&09 %‚°a# ¾,
.V3exportƒ†(/˜Šq
B/malloc‚¶;ùŒ
ongdouble_typ‚Ž[–þƒzpenƒŽJ˜Šumallocƒƒi—ë‚`lƒM2”M
ƒ$3!W9øˆZÒw
7$ƒŽ9‚Z!‚À>tndebug‚b
ƒ4o#ƒLƒ@}‚x=ƒ[ppƒ‚"
‡ ‡…m…1…ƒP‹p…eƒ$‘A‚JC[
†!0RC$HPA/ .@a ?‚ƒT‹]
@Žl
RˆALoƒ<ƒoƒ3„-GVP„&‚?l.DP‚tm'r
;i     ƒUƒ‚/      0
m,$)zUe/n"ƒ<
!
n‚„g‚"„JAIY'
vƒWzN‚e    ƒF.E‚ ƒ*‚JƒXcŠiƒTƒ3 '&‚^…AŒLƒ9
ƒX
‰A
…s…)‰ †…XG‚~‚„(ƒzx&ƒ‡~„&Œ2Dˆ6‚(‰‡}ˆ   ƒ
‚8•&…
††‰8ƒ8´pƒ'-
aJm6ˆuŒ&†o}…3‚?‘E‚“6„4Y‚qŠi„    0„&Q-‡ƒ+…S
Lƒ
6)¦Hƒl’c•jƒ(Š`„ƒ1ƒ,‚,9‚y„V6‹o„UˆA.wf((YBƒ
ƒ~‚hƒˆ†‚ƒC®<‚d„‡oTƒ&‚>e†1„!?qƒ„d`…'ƒ8Bƒb@4ƒ5]…—|DƒwLNH<ˆrT<‹‚„OƒA|‡\†.Xƒ.ˆMaI4  @_‚‚3vW^R‚X1wT‚‚a
‚RI&.?$„s„.^DS‚%
ƒ~#o‚'j
uN ƒ…O…nƒto‹„
…hu…„Wƒ“‰$„?2ƒ?ƒ])f&59ƒmo‚*‚U‚${q{ƒ{ 3sV‘5ˆ5‚nƒ
ƒfo†a&P0ƒ^m!U|…"5Q"‚iH?V„s{P…R‚(]ŠM‚‚4Œ?i‚`‡…3
„}‚H‡„)‚Kƒ
1‚]‹hˆtˆ7q"5‚/
4c
Eƒjk‚F~ƒ="…6}c‚RN„7ˆ^‚'CŠ"
ƒ‚B=ƒ0
‚[`ˆ6…@u…Sƒ‹,†`‚2ˆ„I‡fa-i8„L†…5ƒƒ@H<…#†‚1&‰$]e‰/z#’„R‡t„^ƒ†/ƒ#‚t*‚6‚SU†)ƒwl…T6„o}‡k'†0Œ4„ ]$‚,:Š'ƒBD‚;‘A‚K    „Lƒ
†|<\‡…"„w„P ‚v>        
ƒG‰Xƒu‚`‡<S‚e…4YˆP„6‡NŠƒ$Ž9;R"ƒV…}A‚2…AG>;ƒ
1T
8ƒ{Žt†>‡J†…8ƒ4…SƒCŠ…i66…h…b†6‚*o‡ž8@ŠŒ`†[x‹?Š  ƒ]‚]‰„‚{“"‚]‚'‚aƒ„'‚O…T2/¨BŠ@4„a‰B˜'„-®p
3‰;ƒ|‚z4.U…a „‚9ƒ‹8Ž;ƒC8—‚‡:,J…1‚      ƒ V‡ J…‡e    –s‚_¤„*-z:„[o<„m†&&…|Aˆ;G}†D‚q†…~ƒ\„n…‚\‚jŽös
C‚ s‚fc
‚'
$        ‡Z%&qf
(ƒ9‡a
]V
,
IEH‚UEt&<d‡!  lxH
 
‚  3‚.r‚^ƒ8(‡0&ƒ'—=J‰6ˆuŒ&†o}…3‚?‘E‚“6„4Y‚qŠiHnZ9‡[I‚t‡g(       ‚"„r%‰'l
,
d,9‚ }—%Y
‚l
®o¬q‚d‡pM(6‚LX- {;^Y
""ŸV˜€€€¿0Å=qìB‡‚gGƒ
1*‡^Oƒ5]„u
mŠƒwLNH<eTN
JM
|
1‚
B2‚caC,@_
,ZvW8R‚X1wL
`‚aPŸu\§
‚$\í/Me#—6_)f&59ƒU—5]P{S‚_3sŸd‚4‡/^m!
Uk‚5QHc4%
{‡Yƒp‚(]<|-EQJ5

/H
j)D@‚{¶+        ‡e2!‡XC
‡f?®o
}K!-D8‚‡8—3+&     3‡\Fr(H?|‚(_‡f]*}‚SŸ
S'‚]o%„ O‡[
r:‚:ƒ0D‚;QA‚K‚c||<‡d*„w‚3P   
     C>      

>‚`
8‚es‡W‚„6…-8ƒ$„_;7zƒV.‡K?‡(G>;O(
1MR
8O‡q
:†>†(—-K6…h‚(4@3@
¦'‡c
2.'
!9Ÿ,S‡%‰;‡ho+*…a
„‚'#\     
{8—X….‡A‚X‚    ‚UuIJ
‚?    
‚
bA &bPNK     G

—7§0do_rbu_vacuumžnÆ„Gc~ñM[S@Ž
†U'
†&x3EG%d
'!"!&)h/‚W
%'#Hy
7nCc1\2  ¢@  ‚½PƒM[S+¾„6
*†'
L\&x3EG%d
'!"!&)h/<x
%'#Hy
*n‡ŠZ
2Æ)u    id~
‘HŠM9.?†`ƒ6ŽU‚
!‘/Š7Š†*
G
,$ud/Aƒ;¤_$S#(iE=p‡^
‰
U
]‚{*¾gf9.?„\."‚
!‚
Š7‚iS
G
,ud/Aƒ;C_$S#(iE=p
$
"…8U
]‚{*list~ø^ƒ&     KU)‚Y(
[+;$
_!23&7-.ˆnN
1W‡I¾\ƒ&   0U)R(
[+;$
_!23&7-¾.…GN
1Wpropƒ-1—Ìp
s_with_hit‚¼üƒRrc‚L‹    
|ƒ              ”žR
Ö
z     
‚‘+%trin‚Š8í(ument‚@
 
ƒO‰‚_ˆ/¥%2k„Ce’(‚`0
r&6„@"$     4ŒtŒe’,‚Z‚<AŽ,),ƒq†!<~;„i„!•tT„-!
„4Šƒ$‚w%‚:†‚x]G^R"/Za†Ey†1ˆcˆu.†z

’!~ 
9&d
Q’<ƒ'

;‚(„Nƒ^‚oHARC‡
WW?qI",.m!6:M,
‚#t<
_Xj…q…†/‡"xƒ‚C+‚
ƒe
‚>.†EƒGŠb‚„ *35<#<` #‘ M80
(],C
R
nij,0"fm *
‚!Š$

z…„;‚„d!+&hG)5'9„-‚H‚;:v‹  ¢>„    ‚—~ƒ4–:¬VŒ‰W#Cˆ]ƒ)‘Kƒ"'J]ŠX„;LƒS–‚U.‰Œ>t‚Y>
yŒˆ„<‡!ƒA[
…{
52TŠ-
dƒ3‚„xL'ƒ/VHfT‚#C
,w4)%‚/‚ L
#4,OkGˆV‡2ª ƒk°‰5‚7…:ŽP#\5‚s‚g‚r$
"‰[#/M‚
ˆ6‰R…V#¤Y,jƒ7‚y…VUM#£JŒ8³d‚W‰s GRsF
„R#/K3i„
z‚>Cƒ@…33l>7 ƒf‚(¨¬HlLR=%4t…Šc     >kW‚ˆ5'*-7†D
:"0ïb6
,"‡/
R†27Wƒ       Žöm‡‚X‡iŸ*5—0%,ƒq_#S_
TC!
E_
1%$„%+]G^R"/Zaƒ"„*
1
c) %

‡F‡y P
9
dO
9B
'
6
;y‚tƒtHARC‚
NDW?qI",.m!6:M,
$&#t<
>_X4
…„>/‡"x‚j‚C+qƒe
p
„ƒ&‚*35<#<` #ƒ`Mh0
(],C
R
nij,0"fm ‹
‚%‚M;
!!ŸW˜€€€¿2Í*ÜQ$@+—+K:#‡]6ƒn‚–0e#    S-r‡f
`CÝ"‡h¶X-®p;¾?v§
42‡RŠzŸ!C¾E‚T0‡jE#)$
*‡[0#Ÿ
s„!—2HŸ
#'‡[,j‡Ch‚Z—2
M#
‚*P‡‡(‡Z]‡gUŸ%
 ‡c
G1§ƒf‚(!2,P0¦A2‡i(‡]—8aP&—8''/Ÿ
9"P`0
‚64 LQ
0document_data‚
žhýˆ3     s_data‚ž'b        ý‡rb       xƒ¬S—ÌGN(dgii’J…+œÙP#…ƒB‚°n<e7%ƒUIs*+†j<D>†.‚K‚('ƒ+ƒ‚1†<‰+ƒ&%†,‚ZK……
‡-‹9ƒ?:.‚…‚-
ƒa‚„‰S„‚+‚OzF^ƒTF‰“‚0ƒZƒW†RƒSTM …W†?…'‚q|J'        V
C[/A        `f
"\jx‚~{
)9
jy5o$
BSƒI]‚
M*7
{c‘r„P
‚ 0\&yv…ZT†a‰":&‡.=‚U^q>‚t|f‚-a‡‚2e
s(‚?
*K.Lb|Ry†'‚{_…7‡—A
1‚I:h†O‚4‰Y‚l…G+9ƒ/‚o‚
ƒ6…     „'"ƒ.=L„E‚ˆ†f‚Nƒ4Œ+ƒ ‹t1ƒ5‡[CŸF!£XŠ† EƒV‚!„dV’JA†ƒ    H£N‚!Šˆ'‹m‰†'/z‚>ˆ#†Sp
„y$‚F‚x$‚#„„2‚‚i‚pn‚t’„‡=“B„)„
Mˆa‹+‚s‚=TD-…„Z…${!Oƒ4sˆ+‘
†t{ˆV„‚wˆ)„‚&D…NV !ƒ0†'
„

‡#(8L*ƒ={„"jD…)†om‚Oƒwƒk‡j‚ ,™„|%ƒ ‚…NvMƒ<ƒ…vˆ#†7…g…H‚
†):aC_‡dDƒ+0„:^F
^h&?‚"/3?‰@†Xƒ4(9Xv?W2‚?

L‰
O
ˆQ‚"v„25ƒ9*fˆ†‚_t”X‚a0L…d‡s`&ŒƒN‚c„     >‚^M †cB‚-}ƒQ#-7ˆ‚G
:- ˆ]ƒ‚Y…]ˆe}eˆ9      g‚Lƒf/2†k„‚[†UƒntFrP„Su;7‚†W†N„`…P`"‡D(‚A…;ƒ„
Tƒƒ„@J†D%„:†{‡
g‚=    …-ZƒŽ1Œ…
„A*'7‚_&ƒKƒ6ˆ5‡3ƒ{ˆ}g0‰A‚nŠ\†@Šzˆ„P‚‚ˆ@›u‚  †[+†d5U& †#R XŠ7WCƒnƒC…
g„5ƒ„V‡V‡>`.ƒ[q~
…J‡>ˆ[<‘mUN‚VQ‡
8ƒ%ƒ6…+V…n
1~8x2ƒ}
9<

*cƒC‚?ƒw(>ˆn‚=6Eˆ_‹‹Y1ƒr
'ƒ|ƒ„O„,"•f„ƒsŒV‰;~9,ƒJƒE.;w;f?Uƒ>*…2ƒ;/}-‡X„+†fƒƒ.8"…%x‚?‚p†8‚O †"„nX‚‡dMd„/ƒ‚b“`:ˆŠg ‚ƒ.„Wƒ
/‚Yu†Q„j "}        U…`H$
ƒ-6ƒ—!˜‚=D—E´(] Qµa”J‘‡(
[ƒk>Uƒ‚^ˆg‡W~…R…ml‚0ƒƒwƒ‚",„T
ƒug„y$ƒ‘‰4Ž*ˆ•[M‰c‡Ž~3ƒBV•(‰Asƒ
Ly.‚Uƒ)0R"8…-‚o6„%`‚†L,|
…WŽösJb|RT)'9,,7_‡c5‡`-}Ÿ‚A.KL
V„E><``‡ƒ1,ƒ/UZr}‚RF!        ‰A‚x‡)‚!
kV\JA‡d"TH‚!Šˆ'‹m‰†'/z‚>ˆ#†Sp
„y$‚Fd'‚‚^fR†-0†M
‚*„
M1
„F+
=

‚=ED-…amƒU{!Oƒ4e=
M
†C‡@EODD‡Y
W&—8
b
¶W,"L)E
w‡nG‡d(„ƒ}‡ƒ ‚…Nv@‚    Vq‚gkXuQB@_‚6A+0„:LM‡hEZ®påY‡‚+‡i?‡h0N#-7—ƒƒ
}ŸA
/‡‚.=‚X7‚yXF(F‡Y‚qu;7‚
}|ƒ
`"at‚_X¦ƒ*;—1ez®qm?ƒ\‡0*'7P‚_‡ƒCd‚jjƒ{
‚OgH%‡lL!OA‚!gƒS
‡='‚H‡
S`—J
t<„„F:
ŸY˜€€€ ¿6º•ÕG‡zVQ
‚8ƒƒ6
ƒ-V…
1~8
H2$
9<I!‚C9
(‡f
x‚=FE
>_†I(7‚x
'‚‚ƒz}‡…bV‚…j )9
† ‚$
.NfN
*‡W/-
*„+ƒ!‡]Uv8K
l2J
‚`Md‚AxBa`,
‚_ l
‚l®4"OB$®‹‡‡d|‡fR
6e‚PU     ,%Cl‚b1?—d‡i#
ƒu
pJ.…oP‘[M„J3
RV<
8AsJUO7&
6ETNg—+@L,0doesnÚ[Â*&…0Œ~^?“0†V—½‚dž-\gƒ’Y?—Ì<…?llarŠzz„@] ‘¸8(Ÿ main%Ue
‹;ƒ†{„BG    ’ ŽZ  g&d&ƒ^W[F<‹4$-D%&4bX&V†WX 63M•R‘ˆ09‚À(=ŒNV‚¨westƒŽÿƒin•n˜YŽÿ\n„<9J&"N:Aƒ=hy)hU:×s9˜Q„ed‘,…g—4‰&
‡$,†nƒO)’L¤lˆ1
 ‰L†#…;oJV¿c
T‚a„1½†l‡      ‡Q‚Bed§ŒK-¾_ÃL,âN`õ¶Oh«m$‡e,–VmŽ/C
†_";Hˆ‡‚r—ˆ4‡_’*„ª>›Œi…‚t‰‡^ˆžm¶wˆ<?‰m–fƒƒ*‡E"ƒ=%£F‡5ˆ;Š
“x‡Y
„&<ˆN
ƒ&•M‚t=„µwˆ7
Ž?#
A‘1
´hj„^‚wŠhŒ*–
¨D‡6—Y½b{yˆ5‡$ŠN,ƒeˆG‚%¢W‰L*¹HžJ ” ‡h(„M„n‹ŒC†hŽ÷IŸŸƒO‡fV•p›ŒiQ‚L‚5…‚;…&Ý‚S—‚‡fŠsƒƒ*Q
"X%K‚RkU"Ƅ΂"jG‡|‚?ü+Ÿ
—‚WÕ
‚0¾5U§,{y®‚Y  Æ]ƒ„'        Fž‚5¯~—‚!s_oth‚,
ˆGt‚rWù
´?/žO      ˆ
ÉOƒ!&R…
„IM;#  
9r‰?†:D•,‚l‘_‡AƒK
Œ9½o¾‡$üg
Š/òíU
‚Êi)‚¨o

M;&rƒF

:D

-'¾‚]19fila
H5Šdªsƒùƒx‹,„ªU'ub¶Qxl     
o
‡*
&[}t*
*
ŒL‹      "„R
ŒK‰g     ƒ      †‡,žY®+Ö‚
 Œh@")2Pa†0Œ!&
¯h~   –d‡‹D‹E„O5‰EH†':
˜+ƒ\ƒG‹ŸkN&ƒ.†V-WŽ\        „‚‚!$‚]
‰\#   ‚C™ šta,ˆ~Žþ^
‚H¶[

‡f
     oŸ!S „:ŒO‚
Ý@ @")2Ÿ|#ˆ;&m>o‚Ç'„‚¤a
ƒ{&„ƒ{ÆG=‚!‡eQ#  A‚\ÕZeŸ,equotƒ«—ÌF't©g‚%Ç‚@†iÜ=.ƒütÚ72wn‚UY

-…GG^“ZJ‹hˆH
¿'NµKæªU‚t©z‡j‹l…ŠP)ˆU…ÊYŒ<
Œ!„Ld
…&U
„LSŠ„"ˆV¿NcC‡K
…Lƒ‚S“LÇ‚bÍ"’ Xƒ„…x‹‚=Žö!g‡ƒ¾YNŸ }Ÿ/Zün
,‚t’z®lÝ‚(Æ%>„k

ƒ#ˆ1ü\
%!ŸL‡7UÕZS‚w„"‚[Ÿ*cC¶‚‡(L§    j§0‡i(¶XqtG—ƒ6‡             Miƒ[b®gradn‚x‘°/"loadW
…u
Œ#‚bD…l‰[
ƒ7‰       
ŠH{VQ"O+|
œn¼C†“]"‚q74!*7…)W‹2ƒ$kó{‡i
‚<õ!8—; ‡\íN„‚œO+|í‚

_qP
!*݃@œ$e $        _dataƒŽÿ†A,2‚…c‚0„7„‚W
::Ÿ>˜€€€!¿Sƒ0downsid’<Ž)„aïJ‚¼9’Ž÷ƒbüƒ"Bˆ&ü/”"tream‚Œ*–þIzen=Sƒa…Y†N   Ž3 [–

/{
     –!‚kˆ
‘W
…BŒŠ;’WŽ÷ƒ_ú2—Fs‚ ®r_üQœŒ‚†x¶„G¶cq‚[’Bù\v
ˆ(s_ddlzc"mlz _ doubl‚”FùˆSr‚‡   ”P&
ƒm‘‰oag‚?£otinŒmat‚
œ$‚“ ˆ[“
†q2ü…oƒÌOz‡?w‚ŒAƒŽIº;’=L”Kñ
]‚çM„‹jback‚“ÙJn‚bI~•Ò‚h‚…Ep„†(ŒGŸ
‚Œ%•=
U…¢iƒ'‡À}$-ill‚‚R—†'veaˆ „iŽ'ˆP   ˜
’&Ÿ%H    ƒ;ˆ‘ &+¬z ŒŒ>N…F):v‚C‚X„Fƒ>ªh‹F„&#u’Iƒ$Ž÷ƒ`‚‘9‚ÏtYˆ
y+â&
w):ÃåI_¶c
n
ƒx‚0%‚97r‚2
ŠN
Ï(ˆ;‰Yûlƒ"
ƒÜˆl„‚oessler‚‡Yne‚p
3Q‚E‚ƒ{090ƒA

%3ƒ‚0.…e%901%Q6+F#X†60‰mËZ„,•6w‡aª'11‰H 
Zž¶fŠFÓxSm‚…{|
Ž4r3kIb&d&‚_‚M‡o"m#‹ƒ
k, ‚^‘LŠ.«…>¦y‹3r%†4‚‡‚@B
’</
(… ~£%Y!;a
K'„$´EÂr
YÜ*+Â\¶y˜ q8‰ƒq‡m6Ž‚¯7‡E‚`‡arB3R•A'11Ÿƒ1     
G…F‚Q7Qí43Sm‚‚ÏS‡ƒ‡xügx¶Æ)(‡e} 
Y!;a
K'ŸU;Ý}W®j
„:.q.Ÿ/_index2modulIwkt2   emp_index2
t2rigg2view2rigg2view2t2box‚.Eƒ.@index‚«Ý–Ntabl‚«KÝ–}rigg‚«zÝ—,wxr‚r
‡Mh–Çd
vhyrunƒ¿&—ÌU1showƒ¹:—Ìksqlite_‚’]–þ‡|    
cksumvfs_statƒ
`[—¼      H
orƒŒQ˜Št5verage_test‚ˆP–þ‚6 debugd“Z_
Œs!–!J‚ˆ)…æ
‚
fault_cache_s‚‚foreign_kei‚ˆ?œÚ6hlookasidƒ]—ëƒ)memstatu‚‚Ipage_s‚‚wal_synchron‚‚K
irect_overflow_readƒ„W††q—ã7~
sable_intrins‚’q–þˆ
qc
(/
Žm’Ú
‚   en‚’b–þˆable_bytecode_vtab‚xi–öJcolumn_metadata‚l•Œ‚"dbpage_vtabƒÕ;—Ìap   stat_vtab‚‚C…EÕ<ôc…˜
‚‚ÀPqeseriz
«lexpensive_assert‚–þ‚'lain_com‚”X
…VUÕ6"܉…¯;
‚ U‚ÀPkfts3‚‚@
˜3Cõ`‡AC_parenthesi‚
˜4CüBC4‚Z…/v‡;Õ@•Œ
yv‚‚ÀMu5‚‚A‚m;
…1vÕAôa…˜

{v‚ÀPvgeopoli‚KU”—.Sicu‚šŒ\ü‚Ýbijson1‚‚D-‚l;
…>jÕ>ôdP7…ˆ:
j‚ÀPs
math_funct%emsys5‚‚"„3“Ƀ(offset_sql_func”T×@Õ=ÜÂr‡ð
rpreupdate_hook‚‚O”ÝO'rbu‚‚Eõetre‚‚B‚o‚…6t‡@’r
Õ?ôb„á00¶Z
‚t‚òˆÎ7tsess‚‚F‚Nôf„é&napshotƒ“—µqllog‚½
ù’atmtvtabƒÕ:—Ìaotreetracƒ
#unknown_sql_functƒÕ9—Ìanpdate_delete_limit‚{–þƒ     wheretracƒ
$zipvf‚M
|”¦}
9           have_zlibƒÕ7—Ìal
omegrown_recursive_mutex‚ˆY  introspection_pragmaƒÕ8—Ìam       like_doesnt_match_blob‚‚M    max_‚v“É)k
expr_depth‚‚N
length‚ƒG
emdebug‚ŒY–þx
utex_appdef*p‰ª      no_sync‚ˆQ–þ‚7     omit_altert‚Å7ùc
rutoinit‚†(ù…Cdecltyp‚‚Pprec‚‚Qjson‚³8„Dõ‰load_extens‚…•Œgprogress_callback‚‚[G

JC]g?…G                             $9!3!! 5!<#)5 E4X"!#!$
!
!!ŸW˜€€€"¿2¦0dsqlite_omit_shared_cach/‚F‚SÍ
vacuum‚W
s_oth‚
Hwinrt‚¨       powersafe_overwritƒ
ˆ
rintf_precision_limit‚…(“É„       small_stack‚Ž        –þƒ(
ystem_malloc‚ˆR–þ‚8                temp_stor‚ˆ¦"˜š]d
hreadsaf‚i9‚G;„o.ˆS
Õ4“ø¶X
 ƒÜJ9.ò‚9Î8i—B

rusted_schema‚]‡7Ù(“©ƒŸƒŽx   
use_alloca‚‚U
uri„Bth

tclsh‚Zˆ•Œ;%uƒ†   —ãialƒŠ~—ãobiou‚‘qÚKctilƒ°B—ëged‹'ˆ_¥8‡oDc
„f/KN‚U’‚6Œi‘Šb‚…!ˆ ’6‡ˆf‡[ƒ,¥!…<…/‚c,…{—n¡}´J†Fƒxƒ$WŽ+ŒNªa‚~>ˆr
¥(…Y¸7
šT‚i†=ƒ.V…Tz‰FO§y…}›}°e’P•%†d‚†^‡µ(i—‚ýgG0‚3ÒƒV¶‚1Î@‡S¾g»;>,Ÿ   ò
z
‚|O‡‚*„>CbŸ‚WG-—‚Ike‚&(†C‘c’…D…¿2mmi‚w
Ÿd"

‚—¼p‚
„j   ‚p-[ ™‚5?—pÒ>ˆz+…„| †{‘D–!1
E‘ˆ\{³:=ƒ½‚v11+³hhƒY1
Eti‚œ@p‚Ñ|ˆ*Œ£/Dlic

ƒ”:D.1/‹‘’S£`¶=–=Ú2Â\Oˆ@       ŒU—  ¼Œ,ˆ\   ——f :4"Š 
§{‚yC„FÚ(Åx—<¶=–=Ÿ‚3†WO‡Fy    ?ƒÌq@Æ_ݦ‚OÕuƒr  :4"—7:ÎR‚8ƒjrabluŠvƒ?ƒp‹%ZÍ,9Sc‘R`‚gŽ÷
/ƒ?ƒ†O,„ÚX,9Œ{¶I`‚Gt6
‚
6…‡GL‹1ƒ
‰R
‘e
˜^º7ƒ'
õ~Ž÷
G—E‚™"vƒ6Ö
ƒ'e‡4
‚)‚‰‚|Š5dˆB„
Ž|$¥^„K„'‚+ƒA*"v
ˆ&@C
 {+„;
…              ]20A‡Bˆu$†0“:‡u
ŸN5‡2ƒ&£S’t¢7™M“(†·2”AŽ„„‡‚‚a£U®?…X&P”8ˆNn†~ˆeƒ?‚7‚4”y‹Ul˜m…L…d†h.ƒl…;
—_42‰s3ŽQ„0‘:‚(…fƒFˆc(†|P} ”C˜>/‰5ƒ”t£)œZƒBJ‰}
‹F|‡‚}‰V…H’ºsÇ„I“8‚q‡#, "’x‡5£z‹hƒyŠ) ƒ<        ‚H–=gdtŽÛQ‡:…#N…ƒešG4fµ &¨…@‚c•       V‡glF…Žö  ƒR®eN’t¢7™M“(†Ÿ…?†üvgM…XJB)8sJ[ž}h‡i¤§      T<Ý_ˆ31'‚(‚ƒM@(3¾<¾{Æ(Hsb‡j
ƒD|t‚   ‡n—6`‡„X—JU‡oŸ!—?g
‚e‚¦x "
_ƒ>ƒ-    $¦ed‡Z‡mw®F®‡jrN‚Gl=G
ƒw&
…@Ÿ
‚8    4gG¦mFti‚“m†Jvc‚5—_y•Ò6‚ewg‚I] x‚K
‹Y”—Uy‚K
‹Z”—Vlib_>)1³;ƒ?‚&’ò'„ÉyZdD¾,MC6nam†‚b-7F      S^-
})‡)%$

5)Ãy†
7‡VUN…4Ô †;¤o        
…'

ƒ>”?'Ú        ‡P…7!1@x8Óf’,
o8&*„„[Ž<O"µB
1)§¯+M7¶S
Õ„|KƒÌ%Ÿ)-—JÝd`!1@x8íg/å‡g6*&„["iclibƒ,
„s—¼_UÎ>zero_argument_generate_seri‚“øe‚2„†M†‚|‚ivƒ(%
ˆ"bŠ…        Ž‘jdˆ/   B§tn5.hƒ"‚4!‹l‚„T‰Z†^œ`,d·b„‚[
†im„i‡a”             "Ï3„ƒ%      ƒ\.F.ŒU„^„k‚y„9ƒ#‹s5&o8ƒ|$‚~ˆv%Mƒs!,
!!ŸW˜€€€#¿2Ð3Š…bŽ‚K‹!       Œ3^„@\y‚@
†l
       ‚    j‰w
‡
X„aŽ  3›M0‚5šiN       „D 
    
f!Lˆ.&0±v¤Iƒ       
™V$†'‡N4ÅVZ3‚2½L              ‚
‚d6 ~n5.hƒ"‚4!
f‚P‡‚Q|‡in>ˆŸ
B
‚      „‚[
‚Mh‚}/‡`‚Y               õŠn®tP
W     &
.
*‚ßO  !Æ"0‡a*\p‚
„/
               ‰J
„XX—25Ý_
U3#—‚DN       b 
Æ
#!LT‚W&K0$G5¶ƒ¶\C
‡j
V¯?Z30e6e962d6b0f06f46‚·Où&ach‚PIƒƒtƒ|lƒ<!           /4…U@F
‚RAK‚9V"0‚xlƒ\ƒPg!6M!Y?]KDf‚|.VmO
;ˆ_‚~†|w
V'‡#2        U3(‚t_%†/ƒGR†qNƒM…‚/
‘(‚Ž(w‚z‚}J‰NS?)‚3J
f)    
:ch
|lQ3E
e@~
LT

Bt‚X
'   
xJ„<;{m„d5&…D'w8‚s„<‚!
ƒ[-3‚) i><ƒw„<Uz =!‚!…H…$ƒ()K†F0…uTˆ1‰  ˆ‚|8)„;„M%‚
!![‚.-„YŠ†&‚„h‰%…@Q^2xƒ
„I‰|zy‚i/‚u
EA„!v„,‚~‚OAƒ!3ƒ<J‚ _ƒI‰t!
…‚J@[u+‚Ll0_Y-‚-a8E9;*j"6Fq2OHƒ{…2
fo6,ƒT8 (‚       -Cmƒl†OE„…„‚p>o‚=„*&Š7„ˆm…p¤S‹jŒ’^ƒ:!„=„g‚\…f       6‚a„p7!ƒ‡e‚Q‚^‚H†^0R„<okCƒV+GH‚4?z&:ƒ;†1
O‚=Š0„a„$…‚KB’a‚<IR+.&!kƒ     ]„
I$"NƒV42‚&HU  i
zO ‚     ,’‚t‡[…U„B
HŠT,†Znz!a@‚*U„#†‚]ƒs"†Aƒ<"$ˆ$ƒi…/3‚sU
°<t‰sE|…}‚E„m+xŒ10‚.‡ƒ3‚L)ƒ‹0     šF„SDƒ‡E„uˆƒ.‚>‚       N‚<T?"‚7‰_˜b…a
E*i
h‡`Š5 ƒ%„H‚2….‚V.‰yu‚‚GS<#Hb
H†C‚}††vˆ…j†B‹(†y‚b
`…‚x„CX‚cƒ0†c
h…YC„.Ÿ…ˆFƒ„,u{‹g…J…S
Z.‚sƒ**?<Œh…h‚Q
+
ƒG‰7„‚%tŒ1‰L
p0‡fŠ/k QM$ƒSC‡~‡{†5FB"R‚"…‚#ƒwy /
‚I‚boF‚ƒi†nƒU‡ƒS‚.'
ƒltq/2
r*0v‚q&_
:9       
‚R>*‚5&‡<‚zk‚‰m…W*W‚:ˆ‹y˜hL‡s
2ƒN c ‹Wƒic‡46‚A„^0…Okƒ,‚‚~…}…VzƒZCM…2G‚D*6ƒ@‚pƒ:8‚N
‡:† 7Œ0Dƒq++„J0:95„\„9…^‚„K.wˆh†EEBH…+|4 †b…
„e…"`&ˆ4k#‡ˆ‚,,1)(ƒ_$H$†<Ab…nEƒp‚ALƒ+„B?‚rrO#‹n‹'
‚†j…f„  b†iƒ
‚%%#'42„O„0‡K‚)†w   'lR=ƒlƒt„((ƒW     „'‚Nƒc(
‚I†D‚
ƒv…$z„ƒP(NƒIX‡gƒPCrƒJƒF‚W„OT„ L‚{…u5ˆrˆ/
c‚Y‡k
‰$2„G;‹H‚O‰d%ƒ[‰?‚42#<(„&=„0‡-\‚'"Ž
&9 E‚M‚r)‚Pn„x‚HmEa
r‚Y‰<ŒNˆ<c
ƒV†S¹0›    


3R‹r1Of     Vµ[,!    …+P‚ˆƒsU!6>‚OGƒtI!‚G‹o\f…e#Y„.…‚RL‚BJ…:%=ƒLƒVUŠP%%$J\    !‡3„?2…I„1YK‹Oƒ(ƒ;H.B†K‚/ƒ;„‚V@‚v‚ tZr‚F h)fb…a‚j0‚[[)‚Eƒ^ƒu&‚tL,k‚ n
‡|L„|…ŒE†j|O‚ƒ`L‚oMŽös<<2`Uz‡‚K=!‚!ƒY(Kƒ(K‡‚L‚R%T!!
      ‚.L'm‡[„eE^2

H
zy3/‚M
Q
EW!vZ
1‚O
L! ƒ<J4 _ƒI†>!
!‚J@[u+l0N'Y-*-a
8E9$.*j"6Fq2OHƒ
E
fo‡)(!8
(-Cmƒlx6‚ ‡,!H

&‰@*ƒsˆm…p¤S‹jŒ’^T!.‡bH‡g:af   
0‚aƒ7!o…‚Q
‚H
‚10
dokC**+GH‚4?z&:‚J
O:„o!*r
‚B*"IR+.&!k
$"N:c42‚&HU      i
zO ‚     ,‡Kon‡T
8
H—@
*U®o
…!
""ŸV˜€€€$¿0      ·®qtÜY
)E=)‡v;‡I‚]‚L)ƒ‹0       }„SLƒ‚}Z
5X  N‚4

?"®      {Ÿ
EF
Î|Ÿ
—‚tX—66M
/‚
sŸ‚
‡ftU\
Z.M**?‡[*lk

+
$ƒK<tƒ¦Zi QMGwK@‡>)5
y>l®o

iOc-U(‚.'
ƒlk
C/2Y
r*‡&_
:
     
>*x&‚5‡‚uM
G„"(*W‚:„2O
P
jG      ‡‚,I1P*‚p>z'ZCM
G‡'*(@
ip—4
     —6++A0:9t5Eƒp^‚V‡]=ˆ…E=I|4 MxƒvU‡_54k#…~
‚7‚,,1)($H$cU…7‚4‚‡\^?‚rrOM)
‚‚q@'‚Nƒ‡p%‡!Ÿ 0VC‡jj)ƒ7      'l=ƒlT —)Fu
;„(N
[I$9%

MoTL4
L5
)ƒ
/

'ž:‡jj=ƒw0
‡
\"-‡j~‡_3 ]E‚M
)n—4C4lN+‡     ‡k&‡‚…
7U!6>‚,GO
"I!
‚E\D
‚#—W
e…
‚L‡e %=;[$‚
u%$J     k
„?@w/(K
;$jƒ;H.B†K‚/ƒ;$
‚$@b8
 h
`f
M/E
m0
d[
ƒu&tL,‚$Tr‡^‚#O|O‚0eagerƒ‚Fl‚r99‚¡ li‹-ˆ^‹h™zo›@
¾U·a.„#ˆ…+ªK˜'ŠQ†CY=Ç

-A’Ž÷åEª·a‚»8HÚ‚-‚Ï~L„MY=…Iíker…     ˆlƒc†
      …wu…PˆÕ£¶i¨<›"cD·B’R…(ˆÂ2Uq”LŸkŠ.•P¤%Ây¡s     ˆ†~†'RR)
/…f5-%6ƒ| ;
Sƒ|‡O£ˆ“6“+„[Ÿ+ †ŽV¯„n¾„v‡$
ˆec‡JOõ…MÝ[ «o&ÖR¦Õ8
§;Æ&R(R%®q5-%Ÿ‚
%0å#Q§
—<'‚'„8ŸstE“75 —.‚{†(§@Œ9œ:–×1h|6?   ‚ÃZth‚K
A6”—@
06s‚‰ƒiŠ†*‚f6†'Ä
_‡˜h†k„5
…b…s«
!ˆ%b"]‰x‡p…w      Ÿ<vˆtA‡ˆ_        œn-®†WkŸ Jˆ@®d_‡a ‡jv‰¦‚Η8
ô{,‚þh)Ƈa—0
œ‚Æ&-rer=

,
’%E›<†~ƒNƒ;9Šxb
3ƒ‡M‹V‚sƒ}    ƒy#D‡G„q…s
ƒ`N„2J‚0Y—[q
CŒR¤jgˆXH‚OthM˜\!`ªÜ†nJhyX'b‡Y0‚býJ[{Æ+Δ8
rJUÝ[C„n
HtIvœKÃ<fst‚“Nƒ_Žx…f
Ž~’ú\ƒÌ{li‚’ðƒ=‡+‚}j0ŠW’@‚K’˜|„:ƒ@—j„x… ‡v5ƒp‚?_„‡        6ƒv†k†b„~GŽ}‘e:–h…D„<„„%Ÿ&ˆ>™G<’9P‡g4Æ›qƒJF‚^ƒ<†$T
‚ˆ*TŽ_—'§`‚®‚n)ƒ>„„ƒ[ìjo¦m_¶aH®=lg/*å4¾:pâ^¶UEŸ'>§ 5‡D8‚Ÿ‡K‚x§&‡]:®ƒ§0C=¦?}m‡bDw‚"¾7|\‡‚C—B‡„U®i 7t‚&>…
uth`=  b5548a849‚Å<ook‚I.„(ccn‚!‚j}'hoƒ‡Ä5‚ix—Ì1
o#xom‚‡`™/£…B…¯Tnd‚u
‰    flict‚%½eK†"Ff
BƒGX‚7‚F8„7(!
!!ŸW˜€€€%¿2±t”à*0economi‚+Ed„kJRwr4
‚^;(ƒi…†j4g*
‚ƒwƒA¥””Ý]®§ƒAõ7g0,`š 6(ŒP,d œl%/&?>‚S=Å2Ã91ƒÌnp,œ!‚%/&?>`=e_aabbidx‚œ{•ñ‚#it#q‹_D:Z†6‚ch‚7"P-)/ ƒ#"%e‚`(„;)’"
6ƒ:;ƒZ…pÆigP„ml„}
‚
Z@y‡¡T†d…s…

‚$        "‡T]H)!
‹[”:
X   &¡J$!4'
!-UŠdŽþ__‚ch‚7"P-)/ @"ve
<(—5Ý[I\d"
í#4V:;5‡‚$ÚZ—Z‚‰F—‚=‚ÎYŸ†Î^¶X^‡cÆ3$$!4'
!~_cost_tv
$Š:Žÿ $
costv—,‚n(€,‚n(    3›€dist3v<{)Bƒ^z'
e=_)Žÿ
)B
,e=)lin‚†^”õ
@or‚/b.‚/k‰9†
Š.? '„6
=‡gôOý0®ƒÔge‚×a('*
=+i‚‹]‘˜!uc‚‹mÍW“ÙTffect‡cƒ‚hˆeƒ|ˆEŸ+—4‚n =.„!$l
6$‹x…*#‘RŠK$Œ^A!‰        Ùh
†S&
^‡P‚^
ìH¢/rƒ…x†ˆƒ4,ƒƒX('‰3šž=ƒK“‹nƒŠ5~c†<‘z.ƒ2’`‚#ƒŠ   Ž‚$FF†lˆ“i—”|Ž„ƒ0“f‰.ƒ…%¦n„Mˆd‰xƒS†w†x
š/ˆR†O"
j‚\Œ!”‰fš…~™%,ŽpŒV”ZžB¤xƒw›#.±Y„
‚KŽöy
‚\  ?®e—qc&üŸ‡XŸ
rÆ'\('‚GD—D
q“&^c®YIÎ$¤
R‚$FŸR¶Õ|§Pƒ¶‚‡ƒ‚E
Cx(†L)‡k
#—       Î
j‚\?%‚O$¶‚e¾?{.Ÿici˜MƒG„Kƒp
ˆ(‰y#®5-M‘ZŽ#1r ‹yƒæcƒLB:¶]¡²H-„e‡l–ov        
F‰‚‚AŠ
H r„z…Q
…2gŽƒˆW
\‡G S‡äD†M…GŽ0
h“>Š0‘g
¢a‡N
‚t\h ‹KˆsˆeRM¬d“T8²W„AƒyŽ÷ƒn—<(®mF„*ŒX
ƒU1
ˆB ‡3
ƒ0ƒ—ÒJfN     
‚r¦^*‚®m§Š|Ý]výü}q.~

‚?g®ƒÕZ     S‚(§$MÕv_‚#‡`g†p—‚:=‡m
„W®‚Ýc~‡d,¾#—‡b7jƒZort;-†6Œ+
Ž{5
3Êeªw
…EZ‚'
‡ТT„›i‚•9   
‚d
Z3’
'‰GŽ÷dâN(Ÿ†Qceüi
‚SÎÆ+
IÚ_+ÝdJÆ"åF
3Lí*&gregi‚ŽUO'
í).O'
ight{    ø)ˆ5†84ƒ\
ˆkY  ‚‹iªE¼[¥p—hR„š]eúÝf
Æ"‡ý"h
„;Xi‚b…L^†1n‚ˆgesetzt‚‡tsteig‚ˆieg‚‡Rsdir`>ther
K„h„L  ƒE†KGS“@‚6y‰‡<ŠF&ƒ5…9…_5„šb…Oƒ
\‚6‘j…<„
t
(w     M/3K
0Hƒ\ p‚‚edlQj…42D\y?0bcƒWe‚F‚[Œ#‚<ƒEƒ1w
,‚v‡f†/ˆ+- 
…
‚…%~r†0‰Kƒ3‚fW
˜h
‡a ZP‡;+‡K›AƒA#>Š†J‚q#=‚]ws H%‰Ÿa†:%Š4ƒ8…x’rt]…„c‚•H%ƒ=‚3@†X„*‚fƒM?›„'‚U2K‡o|Tƒ‚(q‚V„E‚„GƒY‚VƒW‚@(;ƒg†Z„>„†&@‚„)Œ†ƒ=‰@’V‹ƒi„t{B¿…dŠZ†,…"†hŒE†Z‚ -\ƒaFˆFƒ‘
ƒq’a“j|™TC*ƒmˆ-9‡QƒZy‹„ @„x
‚aŒM4S„
3‚a39…lT…
†UŽƒ:sB5
ƒz>  r
ƒ\$Zw†Z…n

ŸY˜€€€&¿6½ƒ.‚I‡-ƒD†meˆ
9„a…ˆ~
yq“~ƒƒ*2„„Gyˆ˜g„……*PŠ@SH:„Q…
ƒ,‚v8x&i‚w‰†s”#³q“yiƒ!‰-
f‹]‚Ž|‹36Š‚
i
$‚*ˆ…Z.‚|‚w‰"ˆVƒ|6ƒE„Œ6“>&ŠFžxž7ƒ#„‚
š?bC‚,“dO‚2ƒI…‚*‚4nž…g]™)–Ž$+ku…lŽW^‚9„
‡Cw‚jƒ(–-¦´}ú3
n…&†J<†"Š{   †AœN1…nXŒz‚U„e‚!E#.Bƒ7ˆ„NŠ/M…Œ'›EŠ~ƒ#&ŽG†‘6‚9ƒ_ŽöU‡p
\
K—+9AE#‡ZFCF#



3%@„?†:%,‡ƒ4
‚x‚t]‡c0`Pz%ƒ=‚3@†X„*‚fƒM?›„'‚U2K‡o|Tƒ‚(q‚V„E‚„GƒY‚VƒW‚@(;ƒg†Z„>—3‡eiƒW
X‚q
Y‹‚HO{B‚
‡IPŸƒ®¬‡hPFP‡:‡ƒŠ]
|?C‚_A-
I_‚E+=SM‡fvÎgl5ÕvŸ,‡k®m<#Ÿf‡o8'‚‡]‚;„G‚0E+{,'Z¦QP‡j (6‡c
iÆ)‚ —5&L%
Q-Fp‡‚b‡hŸ„ .‚|‚—7`96ƒEl†<
!‡ƒ- „R
%#'/d§ƒo‡CyNao+I
‚4'„!]5ž"+^;‡‚0e‡0E‡]vZ—'N‡iy‡f<‡d+ƒ 

#X‚M—ƒ‚!‡f<OVOT„NŠ/7`‚      -I‚5[
‚K—0elaps¬i•
‘v/•ÒI«k
‡/derberri‚ÊR)üz„u)ect‚
Š%mr‚.yƒ.on‚x
x‚m½0'˜Y“ÙCg‚‚9
„!ƒg“‚2…¿‚gment   ƒF}u˜‚d

0‚„G–‚+<17ƒc‰†ji
…†2‚ “šC¢+›fÐe%–o‹|j„
…]0‡J)ƒ(":+‚^

+!(>
‚
‚o=£w      ›‚
‚š’'…"6š/               ›k„K‚>1’ŒSN‚‘n?”|wS\6’GnU‹ aƒ1”]
šT…M- Š’I
‘%,‰¿S…p
A¥k—FJŸ]›fÐe‚uo
:‹|‡B


0m)"(&
+2

+!(>
UŸQ=åÍy%úI"
{6
m             „q‚Q‚>1‡c3‡Mu„j‚o„[Œ.¾9H‡_Ÿ:
‚&

„O,T‡N‰-%
—Eari~¾3vK‚ð~
ˆi•»i„mŒ;cgÇå¾NG¾4Jmin‚…%•vŒqÖ     ŽEÄ)
Š-£ø„@„Ù‚UŸ3VùjT„        lips‚²gC‚&üxtC‚&s      …h“_„o
i
PB„
ƒ1…‚      q‚‚‚š‡T–Q-;³C”K„{§uÃ2ˆbƒY
jU
IƒTŒ
…aPŠ      š˜eƒ{v‚>¤V

´W%³%ƒ@„5eT‹>‰É0‡T/„
Šn"Žö‚‡ƒ—ƒ§‚J‚d‡ƒp—<“'Ã2ˆbƒYH
+U‚‡K„E®Y‚™ƒD‡ˆ'4ükE
‚7Œ]'‡†i‚*eT¾„(\"®4-¶[seeq‚¬)Ý—[wherŒ8‚ƒ·E/?
.ƒ©-“`r½‚R+®{…R/?…Þ+Õpd„lŒJpmail~2r‚&U'„n2ƒF‚g 
g‚@ƒ"L„$‡ƒƒ.ƒ
„o„pƒ~ ƒq½n‚&U‚w        ƒF2Ë,õ
‚b‚%õ"argoƒ+ed bR
ƒrD 
…     
wƒ‰mL -Çe)†XqR¦ž^‘w‚D„…>h%‡MˆU][‰&\ƒF„x›M…~ƒ,‚I4
†Aˆ'‚„,„'¿q›0º‹Œd¿$
„w‚CL
Šu¿nƒ0…O
"¥jZW‡kL®…=:)Ý8NŸƒ
‘w63^ŸI”9
Œ{+!,&…:&[ƒkz6
&&ŸR˜€€€'¿(     œC’¿Ý‚QJŸƒ!‚Eƒ[ʃ®‚ —<
‡w¦r}åHX
;LÎ% %žJ}
ÝW0embedd‚9%… „S

K‚w5rac‚“
BCè‡3‡*ì?erg‚…%›TŠ  Ð.‘˜‚it„n=Z6   Á1&ÅY‚#–nƬc‚¨g„ÒÂma”0m\phas     ‚.‚…Žr1-ñ3$§ƒAƒä+i¥EgBƒ
—wG‘‰Sloi”*‰‡[$‚Sņjƒy„#C’/‚h‘{›QŽþjú
P†j—0„‹ƒaÕP‡Uúd¯y‚‡e‚V‹Z‹f
Šo    Š
Ÿ<ƒ}ÙF
%   e_nam‚wŸ&4$ti…qƒ_E„
6ƒcl‚J4"…6„8R”f:R‚i16„(
;‚j=>†0    ,Š(‚IZ+Jˆ

2‚0†(‰ƒ2„ylB}Œ[Z¥`Å>!—;‡7ƒ1É"£ƒFœ`q†>¦yŸ‰‰Zƒj‡rª9ƒIŽ
–n
ƒbo‘<(’Y†'        †4     ‚W¢’=‡~e….‡c˜MŒ†$‹l+}º †"VGC     w‰14„vŒˆ4Œ0›ƒ\ƒ*
÷T·%‘nZƒ6‡-‚Ž]˜X”
ƒ(8†KŽöX‡)       o
¾Kx‹ƒ‡—>´T£ƒFœ`qŸY†dín‡k‡i‚ßX(zü„!‡cQÝ2Ÿ‚GÕ|Yƒt—2oƒ
C3Ý$'P1-‚¶`'Œy„¶‚
y_result_callback‚Î5^†O•^†q™C7ù‰p…Þ†Oulgtex‚u‰     n_au‚‰2ìs‰|
ün
ƒ„Vh

vocabulari„VŽÿabl
L…*Œ]„x„0‚]

g„…IZ!‚dNP‚,5E+n)
C"   1!<
‚|†AK†IY‚0!‡LbAƒI
‚vb‚~!†%8‚ A"M"M("$K(#7Vdt*    &      ƒˆ"†R‹/…B
„%ˆS


‚m+ ”+•(—T‹^—¢'Uƒb—p>Õ,…Žk†‚D’6Œ‚s‚%…|ˆp3`…@ƒA‚z<1%
a@‚l‚0X[Hv     z$ƒ5
–I5m¬ ‡•}‚‚F’    Šl&Ÿ/Š!;2‡`
0‰
ˆP”>Š„W‡f.6ƒL:‚aƒX)‡0„O..ƒ
;ŽXƒ}C
ˆH
>¼‚
‚F$U—nƒ+†(„J…VŠ°f‚L‰n™(†M
†,>4qˆ„r8‡.;Š/o!U…’$Lr(l_´Z‚4‹l¿
- 
PŒ@ƒ}dS‡Xl„„4‹g‘F223&“19'
…£Œ6$-™…-;M‡È/‚"…!‹H?„fƒLˆb‚ƒ/-ƒŠNŽƒ‡o
§
zƒc‡)
ƒ}‡h U‰:•—T‹^—¢'UŸ>\‚TÝ‚JŸ#‚s‚%…|ˆp3`„
ƒ*`<‚z<1%
a@‚l‚0X[Hv     z$ƒ5

“D
c
H ŠL—4uœ,6Ÿ"c
-)®m1‚c®l
‚.
<iü\‡®‚$—7M
>‡g
4q‚M—
8T‡b:k!U„p$Lr(—6
U_\‡‚2.L‡-‡ÎvA
      DO!„3
3P9¦CU$-¶“‡;
|‚žR!F1nZ
MŸ
‚A-               e_8_3_nam”‚$2:«RŽ÷|:‚ api_armor‚¬8ù‚    
tomic_writ‚¬\™ø‚3†¼“batch_atomic_writ‚-Xùƒ/     ytecode_vtab‚®Xù„column_metadata‚®bù„9 used_mask‚¡ÝŒdbpage_vtab‚¯     |*ù„`…ˆz*
        stat_vtabxN¯@
6…GŽYLê„h…€Mw     eseri‚¯ù„explain_com‚
¯BLùa
…fkei"  ts3‚˜°üb
ü…o_parenthesi‚˜°/üb(ü†
token‚°Rù†)4‚˜B±LübPü‡#5‡
±e¾W»‡geopoli‚±}ù‡icu‚™jܲüx„%ü‡e      otrac‚²"ù‡json1‚³ùˆload_extensŒc6/
E(l…c„w`ÐQ”8ƒbøŒ‡’‚t
        cking_mod‚ºstyl‚³=ù‰
math_funct‚²Sùˆ*   emory_manag IµY¤\ø‹0†òtZsys3‡?B
¶;“Xøp
‹];†òl/5‡AB
¶K|øp
Œ†òk&)"Q9)1…8F
(‹]0)"&*:
$()W3*
""ŸV˜€€€(¿0«0enable_norm‚·ùŒj ull_trim‚Ìz  ·ÝD¸,   œŒoffset_sql_func‚·lùpreupdate_hook
¸2ùŽ qpsg$¹….ùŽ\„ÙErbu„¹(ƳŽ    edef_io‚   tre‚¹1‚ùƒÜCsess‚¹?ù 
hared_cachA 
ƒ_1‰&6Ó       ‚¨x!ÄÍ6«ŽD…ÞZ6   napshot8!"‚J‚¹Fù orter_refer“5B¹\eW-ùa3eW-   qllogŽ%B
¼6ùa
‘p6   tat2‚‚
½&@®f™fÕLøn
’v&‡‚Z3‚‚½7&}@”ši
©b×>øn“&}„ø~‚‰l4d…"½d%a@”†9
©d"×@%‚)øn“;%a„øo
‚‰%
mt_scanstatu!:»eù‘<vtab‚¼)ù‘\Òrtree_explain‚¿ù”gtracƒ
&‚*
iggunknown_sql_funct‚¿gBùa•>B
lock_notifiRÀL…xù–#       pdate_delete_limit
ˆ)…1†u‚¿‰sù”p„“view   wheretracƒ
(‚*c‚‘“ªƒPapsul‚686‚r…
 2„¦
;…¯‚Olosy%
†y1ˆK‚TŒ7.$>
‹8‰d†o%‚žN®2u™  ¸:•&/‡k‚#ÖX¨[F³|½2
3%W¾„6Ý[ƒ½
#‚À"ôo‚;od‚;ˆY‘M)„l*
o
z„u …F:(\„
0 I

‚i0ƒl‚1
Q—\}“>ˆäT”Œ„Šg.Е`–YŽ   
=&
ˆ&‚

+„)„!…(c£¤‰šB
‰D’d‚\Š# „K    0   +ƒ}
ˆ7†[   ƒp[äE
‚)HŽ[†J©:n&‚!#%ŠJ‹\2†Q–h
…-šH‰$:)&†5ŒoD–Q†w1™U
c
µ9Ry6ˆƒ3#ƒ„žrKŸƒ
|
      
=&
#‡A/

+õp†C
*¾@
˃§      T        +í6
 Æ
[Œ‚„PŸi&
K#%¾†Q,
>£c

DHƒ
v1
Z2mpass‚µo)ƒ|…Ö'unt‚~†f
ˆ9fCVs 
„N<Š1‚7‚{"›K=Áp–y¯T‚O‚2„b†u
d  ž&ˆž)
ŽXƒ)¼G†r,'Ž(¢T“Vƒ
‘B‚j‚*ƒ^ØR‚"¦c’
’O    ƒ9ƒ*Š5‡Gxƒ6°.ˆk
‰,žJÅ$=—8-"–y¯TIEŒ’3e}‚‘¾N¶FFÎü‚AÕ„„bSx‡e"aPŸ„:A,Ÿragˆq£KŠ) ‚B
“@
ƒ+ˆ=Žu‰z·H
+‡h‡0SˆL‰1ˆ“U‡6ƒ•N‚V»c„O   ŽJ‡‡VÙÍ        Ÿ@í‚       Ÿƒs]ž{*AòZS®m!ÚWÆ,síkmrypt¢z‚0
(^2„ (H‰lŽ÷‚¨m…§W³`#d„
‚NEƒ~…
†r\…j}™„    ‚u„C‡~˜$
t‚6ƒ8’i
S.„.>‚DN&6i„i
4‚‚
…J
K|WSƒŒo$š'7‚[—³L”OYT¢\”FWD‚m,ƒoŸ#†,V}dWƒVC%‚~k‹o‚B‚ndt&²\]*ªW m)“OfV
Š<tV#ƒzˆQL…o‹¬…[˜
„Z©em‘KAR$sŽJ„Fu—Z‚$;Y‚Z<Š¢a„Œzƒr|X„O‚x2„m
KœPŒ…Vˆ)ƒH‚{/
X‰W…$‚xv>e0
/(‰Hef9z1*
 Š5‡ˆ>šz‚L–X…gˆ7‡!ƒ)Uvh=7„%ƒ{‹7ˆ‚@fœ,…oO‡!’
„K$‘d7„Q‚-…2$‚1‡<‚‹%ˆlb‚,†E‹"£,“C%Žx„Y†^ŠnD‚!‹6“bB‡„+‰v„‚f4–9Î]”8…Eƒ80n!ˆub8
’>™d“H%t…8ˆŒ>…[R…Gj‚-7’
%…zƒƒ*„zw"‚\„f‚(ŒuŒ#„^‡[ŽQƒth$$†…4Žö
K|WS‡ƒ¶.‡jp
‚F'r
ƒZ‡ƒt—<TŽ”FWD‚m,ƒoŸ#†,V}dWƒVC%‚~k‹o‚B5\i]*‡5
)‡‚!‡
VÆP#‡i    2—2jLQ‡„#Œ}…[Eƒ‡A‡†‡d~‡h"+ $("!O4(3DP'!&(I
:>…K$ƒf]
""ŸV˜€€€)¿0¾$’€„e"‚v'§‚?‚5tj/‡]ƒ
Kb
H
i
‚{žy/
—;4Æc0‡4/‡j
$H

9z1*&J2¦vU=h=7‡-ƒCŸ  ˆI‡dD…o—7!7ƒ4$‡`IŸ‚+‚‡h?/J
@%
ƒ
‡YUyRn?¦h¾:‡k@ƒ‡d
k!
0b&
xC Dž{P4Du27`%…zƒƒ*„„=
^"
,‚(
ƒ0‚.#{+OG!N
0end_block‚‡e‡fý„>‚coroutin‚¬|•ÎlÝX˜.•Îleavor‡[—forƒ    ê:—ûian„juƒRƒ0ø*4
„5;
ˆL‹
³!‰
‚;
ŽvX
#‰s‰O‘8‚e
‰,
K|…‚YEƒxb‚DV%m‚xq&‰\ƒo*‚El$9$+…-ƒ!ƒj




-Ou7‡
½Ri…e»
„ p
‚#®V‚ßRG
#‚™7§@2
¦ƒý.
$E
Tq&‰Jƒo*‚El$9$+*‚ui





$u
}fƒ†)/˜Šq
C/point‚‡Vur‚T?–ׂ(ergeti‰>Ts‚3…l–)Õ-ƒìù\xforc ‚@‚
‚fM2Š-fX<$)bH
„(oˆF–>T„9ƒ"R½)‡1œ     ‚J‚v‰p;‚&
„~)„Ç
‰9k¡X†omC44ˆsŽ
™yšZ
ˆh\
‚*™*›J…/JƒKœµ¶cfX<)b
      Ÿo΂("<Ÿƒˆ‡1[ùq
‚)ÒuÎ
7k®tQƒ[m‡\        44?21ŸXC
\N¾P
J”‚Kgag‚3ˆ;[‰
¶Cùa
‹pCin-^„=‚.„P
+5j•4pƒZG…„‹yƒ^2…    o:PL–|‰f‚ Q_bJG.8*
o
0%*‚'25‚aÖdŒˆ&- R,…gI‰U6ü_š:`o9jqV,   S1>‚X‚g>‹q³]>24SKP‚†0„x«!8†ƒ='‚9Š›lŠZ‚g…X3‚(‰%M‹\Šs_G,…BŠ6x7ƒa„w<s&K_fmFƒ‚3D3e‚q(…q‚u‚ƒ6|55>†
Ql‹3‚nNƒƒGˆ-.ˆa
M,9       :9A;rƒq‡
®˜ ‹:„<ˆ(š\J‚uƒzƒU‚y‚
bƒ^‰—4—{».5…(ƒ
‚uƒE%‚J‚W•…iL¼B'J‚dƒ=Pu…Su”)²{¯OY4”QI2‡%‚n˜3
‚Kv„\7†Co:
*LŸ!      N
Q
b
G‡.Ÿ *
S
%*G'25Ê_ŒHmI6 
E¦^
GY®²‡>
      4S7P‚Ÿ
„…8†L
‚/'‡E
N‡h*3‚(í‚PÆ&MD3e¶Y—9%¶T
=
‚"
pg‚e„n
`Ÿ—,
L<‚Æ#Ob^QŸƒ@
\ ‡h$‚=^Ns

%g
®kL+6mJ®5sÆ;w—,p‡H2®ZM—"
0vƒlish        
>‚6 eh<\r¡ói*ZOŒ
²‡T„]0ŽpŽÿ‚¾P8¾N‚*ZO‚þM|‚ß‚|—‚Yhanc‚‚hyƒf‡!…g&ƒ’õ)0…<’T‹xHƒ:7‚‹LÌ™<‚8†Œi
‡M
Œgƒ1
ƒ
ŒK¾'D‚]
;
ƒ"ƒh‡Q˜s‚n‚cf‚&‚r‚sQ‚]‚Q"U;u‚+R {#OƒSC‚)Gda‚Mtu–N)‹dƒO>ƒ"N‚sTdTƒW*O‚‚rˆ]ƒ2)‚v„rA/‚% m9‡5p(„%<_QL‚i8E
ƒ9Tˆ*‚[GpzˆB†BRE#ŒŠ˜‹ˆ$ˆN¿-5ƒ>
™#P‚w/FPbNÆUM‡%j…n‚2ƒ}ˆfË£"‚N
w
‚^Žþ¾j?¾<<-Šƒ:
‚…!†#‡@f
Jõ“~D‚]—3

0jÎIý¾;å
,
#     ¾„Ÿ68j‡ƒ<‚N—Wåìr‚2¶[ƒ7Ÿ‡Lc„\#!ƒ
Fƒ`*Š5
""ŸV˜€€€*¿0¹0enlarg‚‰Hù‚\orm‚4…-E‰E‡*spc`<ugh
ˆ[ižX‡IŽ·Ï…˜h

–>ˆ_x”$i…tŒ_†vƒ"•<‹E‚)‹ª|œsƒY0œ5œ\
–     ˆo¯&„8

Ž“‰ˆZœo”5Žþ„3¾ƒ#„…‡h³TŠKˆ_xZC‡=§âH(¶
„yÆ.t¶‚‚5Ÿ]aå-”‚
`oV‚5”5ron‚cül
Adata1‚
|FüZF
2‚
‚HücHsp$
N     Lur†P       
uŒ…j’
ƒ„mƒ\5I =‡„‡’O.£]¦I‚vŒ”r‚y&ƒjØS”V¦b  4„8¾)„r"„*‰?†BŽ?‚C„#    •7’C‡H‚Cb6d„FU˜  ]ˆ%’'ƒ2ª…2‚k“‡¦{Q…x    “ŠGÇO…n‚GŽv†X
”}‚|ƒz¿r„Q9?„miƒ6-§ˆn•FˆƒŽöx
ƒ.Æajo
‡‚

-&¶gT    [düX6”6)ƒ‚b3Q

BV‚ÀO\QUŒ<0í‚*‡‚Y„Æ„G†v§/3w‚GoÝ      ‡‚eŸ 9?
hiEV:ƒnŸ

     ter#ƒ-#       >K5U‚"
ƒ=(T
˜
ŽFš
0D¥ó    
‚%`‚‚g:     †8Â:
¨l†Y@fˆ/†®N
¹D©D‚Z…ÔS:q
*wg)6ˆ#Š7\0 5¢
‚¦uDƒ:ŽöR‡
‚Ýa…<0DŸ +aôuNÆ%Eœ‚¡T—FÝ„.‡v^å_
‚I¶‚T¾@q
*wD
96:y
0;Ÿe‡§7¦hDpris‚*P]…).„7-†‚u
‚l
dƒ.„}
5…|
šY"<•Ò
elinux‚‚küIirˆ+ n5‡C#‡D ‡o‡+†k„yˆ>‡X‡<H4Sc
M;‡6
‰]N‡q‚"„%ƒq‚<’fƒ/‚{"¤•cv‚,¤”v,Oƒ ˆCyŽ>^©¸§+‚>‚[‰bI}šE‰@¬Sˆ:B˜5-@‰CI†Eƒ|‚)ƒ“—X¯„Aƒlƒ!
Ž8\A‚WÍuˆ„E‡It‰MÀƒ(ˆU„c "‹`‚2-„;ƒ‚T@ƒk‚2,†h¼jŽ)„[‡ uˆo‚/5r”
‰"0†_œÈD™+
aEƒ‰n‹:+“e@‡w-b‚|¸”Q…#+Ss#†,
0 ‹      ‚™…^¯7ƒ‡|“YZ…gF‹AŒw`†"Ž"
Ž …pˆš‹#®K„[°Š
‚‚*Žö{6‚"‡fkƒoG—84‚{—o
Qƒ„'

‚6,‡)
Kƒ 
‚Ly:‡_YY”I¸§+‚Ÿ9‚TI        ‚ˆPM
…Q-@ƒ
IÕP-G„A‡[X?rŒ^‚0K
CôOd¾?í0§,t‡}})<Å{#¶ƒ}‡‚E‡d6S§oE4¶)‡†1—6(?‚X$‡fDUÍ K
o‚R$0¶T¶_T‡dqƒRw —ƒ#‡cƒm‚%…2‡ˆ
”b…jJeti$Xti‚„wƒW£    ‚Yl
‚#‚–s…,r•Ú>8ranc‚©t‚á8ÝÌjeatƒ„Tnch‚† ‘þ6!iƒ‡P‡j
‹b’%†'…

J˜Y‚1
ˆ;‚OƒG"G-4Kƒf
ƒ\[‚Z…6
   ]‚{‚<‚G
8„…+„v$‚H%„y+*,‡z›'Nˆ0œNA&#&0+“T58‚Q›udŠ$M‚L|ˆ+aši‚93‹9„MGD-VF…d†cŒ‰ig‹&ƒƒ:k]a]‚v†?B8°.’)š68†„ŸBˆs„J~'
ƒ7.
ƒaF„R„3   A    A    E   9     8     9     9     8     9     9     7     8     8     8     8     9     9     8     9      E    D    E    E    C    D    D    D    E   9     8     9     9     8     9     9     8     9     7     5     6     6     7      E    C    D    D    D    D    D    D    D    A   5     5     ‚Z $    
b          ‚:$}‘
’YŽx…;£,

F›BFEŒ|
ƒN;X‰„
„Z‚Wa%‚f’¹C‹„ky        ~ˆ)2O?…vZƒ@(gx„ Q      R.d‚~
.’K>
ŽI
…k‡†Q—uƒ*
‰q¦ƒf‘_
n”U—
Œ<‚9žg†,Š:
‚g…ƒIW‰Q#

!!ŸW˜€€€+¿2»2v‚o09Z>%IO   W†J…
†Gˆ82ƒs(j#s4{@X^H(% ¦Y‚n…OV•}
†OƒLƒ,TmZ“
 …TŒŒlŽ›.@t’„U)¶RÊA)Ž@„~.ˆ‘‰RŽG‚d‚{Šv"-‹o„ƒ˜s˜<!†cMB…Œt
*
‰O0N‚de}I y{ƒO‚`}…"x)=I!*,K<0Y8{-96>5…3P‚Q„„3„=Žþ^LƒX8„v$H%+*,¾
A
#&0
58‚Q|dƒM‚LžpeCv#‚93‹9„MGD-VF…d†cŒ‰ig‹&ƒƒ:k]a]‚v†?BŸ>Š
„m68 3     …CB‡
o'‡R

ƒ
—9
CF®o„R‚h  A    A    E   9     8     9     9     8     9     9     7     8     8     8     8     9     9     8     9      E    D    E    E    C    D    D    D    E   9     8     9     9     8     9     9     8     9     7     5     6     6     7      E    C    D    D    D    D    D    D    D    A   5     5     ‚Z $    
b          ‚:$§   …
‘
Š3,„F`;Íx
F§|‡cyåH
N
X—9
‚     oÎ"s
F%r       
h‡(„
¦bmPMÆ
(
OQ‚tZ(g+,`Q   R.dj
‡__>Ÿ
'kƒƒB¶/‡‚,>
M,‡mi0‡`]'
ƒ

*2v¶I*Z>%IO     W…—-
Uoj#s4?      ^
(%g0"ƒko+¶$
8ƒ,—7R|TˆL„~—‚t„!
<a        "-2—%ƒ
‡szYy!†MB…
*

09
!eEI ]{
4})=zI!*,K<&W!{-966>5M3[—4,‚yƒ30entryconfigƒŠeum‚¥|•Òerb—y—
ƒQ‡¶hžMj‰>«AŽ÷+‡dG¾Z®„uü’Z‚Ïw”;ü
vironV†J„§]”)³s‚
ÀD©Hƒsƒ.…@–dâg
… ž`b}ƒB‚JVô*‡kmü~„]’gm.—NƒÔg§
,`ÎÚ‚j‡s=ŸUs‚[‘‰3{of°}V
’7½‚m…ŸKparentwithin‚Sžs…”Õu…hemerœacÄ     •~&2„„r“)£ÐD™{Ü[¯;•~&2„† …uÞ„ilogu‚Œ$ochŽV‚ƒY–Ç;nymN9       8„O-S&‰R„8.2‚„´Y        Ž
Nƒ½(Ú`Ò{-&9„8.2=#‡Eõ0ub‚I%Wƒ0q‚„<¨0¢†m}
ãܘ0¢†mp‚{‚?‡2&—o‚9$¾xual  ‡o‚3†ox.w

†ƒ
      ŽI
‚EPƒ^8f
:(+v
†!!  ƒ0
1d>&ˆ$‚MŠtœKX"‚)‰+žbƒU¨n‚&Z„Cw’6„‚C‡i…L…V†g‚{„fŠU‰yg]oŠ2
‚?Ò}‡*˜®0‹c†F„"‡<†p„6ƒ’,™(!MŽ‘Eiƒ¢`™VÇi£Pƒ–w†h]‹bŠ˜d„`‘{,ž)˜'ˆ<1…ŒŒ>=”Q‚LÚŽ4°9%‰a‡s™&–
ˆˆx‡;<E;Œ=?¥H‚'M"‰¥hnM!‡Eƒ[mn‚&ž&Vj’6„‚C‡i…L…V†g‚{„fŠU‰yg]oŠ2
‚?Ÿ‚&]Š4»S{Æ¾:^”ƒF
Y¦{
‡ƒÖ„}‚O—@Õ†]…2‡\ˆcˆ)—49‚e
‚<
‡XZ‚W„T
I
ƒ¶i>1ƒH¦‚LH)ô‚N—…A‚j‡$X!ƒ]ˆx‡;<E;
0?„n¶.§ iangular‚ŒG”—=later‚ŒF”—=p‚Œ^%‚ƒ0val
‡Q"s‚,%ƒd‚     ŒY"Œˆ&ƒ‚[‰&ƒžw‹b|ƒƒ2ŠZ$w/}"‰OY
‚>‰nN‹|dŽQŒ—d–N‡
‚vLƒyAˆ
‚ƒH‹ƒ4Q„5ƒo¡©2†Š9† P+…K”<‰"…'‚
‚\OŠ~™+A»ŽE†    „fFƒj‡ƒ}š/
ƒ&=Ž&©,†yŽY‚†|ˆf›7„73-#ƒE‰\„K
ˆ0ˆ
•Œ•V
—
…[„&‹B‡„4Žd™\‰1Š#˜Y‰g‡cZ‹ƒ
ŒxIm%%Œ{j"!e/,‡
""ŸV˜€€€,¿0ǃÚT‚‰g¡o©n„6ˆŸˆJ´|‚Wƒ)Žþ„M¶‚Q‚‡ƒ       lAn=k_n4Q,d
†@ƒU‡-W—=Œ+…K”<‰"K:cE
ƒrA
D     49«mA&Ÿ
A§}΂073-#§‚GÎ
§‡Õ}lT
L
—‚¾—‚^|‡‚z…"‡nP|\‡„4
…5Z‡YwÆ.E%%ƒIIôb

‚-&‚Ÿ„g‡‡=i0era‚‡6s(„„wÚ]AŠ)-]”
ÜƃûˆG!
T]lang‚–#rcod‚/ˆfm
E,%…T…Kn‚S‚mÏ'…Y†o=
ƒZu¾msg‚1o
G  
`…Vp‚Tƒhn‚*Ï(ƒeƒS      *1—~0       ‹v½‡÷†16
a‚W
jodƒW*‹x—µ†no`5on‚A
&‚O‚“È\ h„Ñapr'
g ‚DNa
<d$
‰*AnV<H/>†sŒ,ŽNˆPˆhm8@„"„&Š4‚3‚!+
‚M$,YX‚k‚K$;
,*ƒ…K…4m‰sf„V
9#KJs  &t
2*
A;
3!     )‚(ˆ$
#,
nn  ,M&

3    ‚"^‚"T%)#J‡d7<L


X…T
k"I1K
;ƒZ61-‚#7v#>…#       ‰\YŠ‚1…;>
XWb‚ 1+% 5_:'>Vsz„KW]
5(:e(‚
~‚Q:‚kO   &23/T'…/58`‚H|>Š…g eR\ j"&s"0‚7Bm%ƒNs:~8V‰s„P‹]
u„?_†`Ž{ƒ†EF•p5”x„:ˆ   ƒp%ƒ/ƒh‚@LeBƒ!aUP        
      ^ †nŸv‚2‹†;„)…aq* l…!A–dŒm%†i-„5D0B‰(ƒ
ˆy+MƒF‰%ˆC“V
c9l„sƒ( AŽ,'     =RŠo_{‰ƒn-d†+‚c++/L‚t0D-‰'‚e†X“&¥l(‚)jK„Jˆ[{ƒ:J4ƒd!'.St=‚,ƒA%‰prƒ7MƒMLV—9ƒBQ‡…
”)ˆ‚0:Ol^5ƒ:!$dkƒ H
pJ9
'
ƒ0EŠxPw0(z…L‘'0 #O//'                  

-

@1         
[6ƒu8-Fƒ
Œ["
#t…        |8J†MƒMa‚‚RG#H
‚u'Or       ‚/&)5‚"‰5:/_8„_o@ˆ-1&ƒ"†-#a"wf”g„{vˆ[‚Jƒ.‡ ‡+
b‚n
f…v‚Z „
ƒFˆ9Œo†t„N‰@…v#
+5„ƒ=ŠD.§R„&ƒb"D/„#!j,;‚‚%)‚<<< Œq
‹a‚LŒh‰Y&^

U˜,N& )’UR‡-‚?I
gŒ-‡feBŠ‚9q‚ˆT.ƒ>…dr…a1]ƒHa"
;

%%…= 3(‚s„N„o‚:8
4½dˆwA&„;† „„ –$HP
 
…‚ll       F„fGa†Y‚A{‚}R
"$†”}„9‡'H%ƒ[(c [‰x2;E
ƒu’j’)1p‚‚=
#‚DD/g2‚%q5/!F0       h7p
JV•1_‡,$sIˆ+‚P\m‚"ƒ-’öEl78>O‚N \1UV5_X3$@2PVG9
4
/
"



'
! ƒ1‚iN9‚'†"°Q…‚*eƒOJ!ƒgG#Ž6• «+……‚2…>‚&E‹0H‡Iƒ5M‚v5+6ƒ29ƒd?‚R‡4ƒŽöƒL
6:z®gf—2w.
‚>F5       8;
    ‚%ƒ/ƒ\‚@
CeB.|aUP     
      ^ ‚^
/-‡,ls&&q* —2
h!gbˆwŒm%†i-„5D0B‰(ƒ
ˆy+MƒF‰%ˆC“V
c9l„sD'   =H{†zK      ‚c++//q0D-‰3‚
"‡@WL,"L‚7fSÕi
fr     JFQNTŒƒBQ‚8”)(ƒI‚0:Ol^5ƒ:!$I‚{H,
p*9
'
 ‚Ms
4
R(%f2…v0K
 #O/("'                        

D

@1      
M+6,Îw
     å‚PS
‡eO1~n
—:
 ‚Z‚
Ÿ%5
ƒh‚-O
ˆb.„Ÿ„B
k2
&
""ŸV˜€€€-¿0©h”‚A9‚j$-<s<     ÕyCL1E‡`ƒ
jk

U‡%
‚`&—.e
§‚‚9IjaƒM.‡8Ÿƒba1]
aa:
;

%%‚p 3(t„No)—‚{‡X^A&5„. ?‚ HE
 
5
A[
[    -„SGa+0
{6<M
#Ÿ$0PPH%kIcQ72;E
ƒ[
%4:¦]s$sI‡8
\‡c®o&>*V \1UV5_X3$@2PVG9
4
/
"



'
! ‡eD9‡O‡r<
SžzFJ!‚jG#PHZŠ1(,PPm&E     I~xH
5+60—‚I
Z‚R0error_missing_collseq;‚„b—µaoffsetbm]pretri;‚E„e‹;—µd
Š*snapshot;L
"y„hh+—µgŒZ+codz„x logcallback‚n‘¨str
]qsazt‚¢`–°:lscal‚“2ƒ•iA4‡W”E‘˜ˆ—60‚¨w
'Ac‚‘"-p    ƒˆx †"]†l‚_i
 j

o(‰sy†‡’N‹S
ƒhƒ.2„‚s
Ž     ¨?W‚9¿Iƒ½! ƒu®7
Z@…¿cR¶Y
rÚ|xmhew‚…:”õ
oter‚…“ÿ{peci‹y*ƒk[‚j‡6„—‡P±‡µ(ˆ!›f6!‹LRX…hqˆO‰J†Lƒ ƒËi‰ :”&¡.T˜/Tš:S<œ?

…J…}ƒŽ2ƒJ±0‡ŒDìP6—;gίM 
‘v([-/
ŠW¾R®rUåíZ4üYý‚_
…!<Ÿg³Q
Rq—;[Ÿ/n®bsai‚‰#„
0“qL™`w‚E•ÒJ+—6.
enc‚˜(ŠC•ñ‚Mti“I[
””1…
é–+†=   
ƒ"
‚EÌ ƒug“$‚l“BÙª¥v]?‡'¾PFœŠz‚ÀQÍc$õ^Õ‡+ÚjVtablish-pV
›m)ƒ†Hît†U
Ž+–ƒ2„W›C       žl
†_ÅF‡_$;k¯PŒ:‚Ïz
Iùxq§Bty
‡—6
‚Jim‚
ƒ~G
‚§¤œE„Lƒ     Šw™:%J
‰O‚     ,cA“!‹9š)Ÿmw <!Ó       „,Žþ‚ÝiLœE«ƒ>‚È?\‚b
k‚    cAˆb!ŸƒC‡j
c: <‚‚_ƃ,atedcostƒz<ŸlŽ6…t•ùb36B
row,„?,< 4Ž!•ùf
v4‚tc2gˆ„oþIh†     µÚDƒ;¯@Œ5×3Š.j›G¯W‰j™MRˆ6(
}‰)•(Ë…Ž8u¯!
nhƒ?žt¡1ÚDŸ#Pƒ+‡‡„f0ƒóu?œ,OPŸ‚_¶S{„
extrep~B?:FN„+    >8‚0!“ªhh‚”>‘‰6]yp‚‡B
£q…$
uler‚}ser‚‡e™4£…G…¯Yvad‚…z‘þ‚6l7[@„y/

#?


SWYy)‚Xˆ?…,>(,J
0AP†2…bu…UM=†z8
ˆ…L(X†i3„[‚\0$%L&+/%‰<ƒ)*<+„FI
œ]*‚.(T,ˆ*P„%
+ˆ‚FG#Xƒ}%\†r‚Z-x6$
‚jƒBNoG

n*$Nt†(ŠR0‚‚:
JM‚r:L"tC½˜#©9Zƒ=sÄk¤T„A
‚‹y7g_)       ”H‘K‡3—a±{ I…f„T3>3G+,Û0–a‰LŽm,o„@`˜ ƒ}$‡sk…Œ{“^Šy…*¢Ê4~g
…M‡C‚ƒy´KÛ7sÅrÃŸË¥r‚:
JM9L"tTP‡ŸƒU©9Ÿƒs‚5sy‡L|‡e
2ýK7I
)f‚ j¯ƒIŒ‚seƒx3>3G+,¶W
oz@`¶YE‡‚C—f‚E}       

‡„      Þ      `*%¶„/—‚6§&‚—‚‡„jƒat‚ˆn•³=zt‚’H‘‰en†]‚u…cs‚‚(‰fTg=
†whŠ&†4(".SUƒ6C"3)n6"C†S
""ŸV˜€€€.¿0È‚=‚h‚;„Z+†Œi†iŽ„C…g+Jƒ{
 )s„N‚;
^0„7.I‚[‚k1ƒ b!†‚xyv-
/‹8ƒN…e]CR
ŒE‰e‡;‚t„Š2‚$$0Ž#ˆT„žZ0«2ƒr’=#$‡w‘=‘&…w¥e„…YfnEDŒ0‡4QƒdÅh‚_‰z„˜
†*b„w–……KI‚)ŠP
…V‡r„


‚0†?„‚U"‚,”
…eƒ]›mˆm˜w‹~`†ƒ*L‡3…8ƒ‚`ƒy‚K/…†ƒj¡ˆQ‹4‚hG„ Šp‡S†i‚:?Š+‹”-
ƒ.
‡=@‚"‰ƒ‚‚_ŒY]‚m(†ˆŽ„‚
Kˆ‡‚ƒD        2|u‰.‚=†?‚”‚ …Y„‘hR
Bu‚
„‹4DJ…f‡g…=„eŒT“a“H …?Ÿ‹ˆ3Žt’[=ˆ^ŒIƒ—TŠl‚%…h[m‡[‚y…‹1‹>ƒK+„OŠ4ŠG†!‚¤„e®\‡,‹6‚xL„O„v]‚>…q‘†Gkƒ>Dˆ~„,Œ4ƒ,©(4–{‚w–‚\Tr†‚†iÝ=‚•.‰@„.±;:‚\;gt"‚‚„@ˆ1’cˆZ„:1T±`ˆT‚EŠz¡K
S?4…s  ZŽö~|DyT0Ÿ!
bT        ‡h
‚a0‚N‡ƒn2—71 „d‘&…w¥e„…Yf‚/B/m…<.‚A„‚*
†*bh„w‡C
/IZƒ@Õc'OxGŠD…eƒ]
hm"ƒ/&     k 
,I‚O‚ƒ‚`bÕwX-Gí->—;$„
—6A‚fs‚m(Ÿƒ‡fJ(‚‡Xz

‰.K`>
ƒ(Y%Xžw+—BJ‡(C‡Z¶Zw2‡u‡d}J;‡‚%§‚x‡<#[—:G‚W‚b…‡\T
S_L‚fƒ,‡a‚>G†$‡X‡0†SRF‚[]‡   +¦<ƒZ!f¦[‡c
1TrK3®ƒL‡]—95S‡c‚
„'‚VƒF‡/Tˆ—&‚n‚VžrI4
,0evenli‚š7ÖUƒ0ƒ–t
†
‚‚aU
O0‹+„”0‹Ñ^‘7þ‡Z)   )             sŽ
…#X"•>¤W˜=2§~OlPŠk
H™)(     @%¢I®
—
|—>‚uV„w‚s Žöv"åP½‘7Ÿ‚?¦k…<)   )             „hr#X"‚°k:üfj§@
HÕzN(   @%‡‡a—ÃåJh"K8typ‚‡u™D£…W…¯iuŒ
„q
ƒHV6…„X“N!$ŒB‚O…     ŠL‡Œe›SKŽ.
‹M—
ˆj*ˆ;E†µ"
˜f˜=‰DŠF
‹)‘Š\Žö~ƒ:õ$AƒìW§
K݃'”Be”+h®„Rå%NJrª+

†cy„‚pNƒ^„p˜"DŒt†iÙM‚Yå5‡z‹Tˆ
„iM„r
‘qG†M˜y
¦œe˜´:‰•D…Z
†+‡CÏ7   †o°
„Z….‰     ‹"„@…~šI
S06 ÏN‰f¡B…<„L‚
„_Žötv`®‚n¶WmËfIe}ü‡Yd‚,‚À3[7Îk¾‚l¶ƒL΄B‡iaˆÝ‚}®R-®‡Ov§6‚
[
S06 cbŸU>—
ƒ'i…<‚f‘"‚/Œo„W‹o
–.
‚~
‚&„d$‚ /E0…9ƒov    †5‡l‚ƒd‡J†Lp:(††o
Œ|‘;
„r(…~ƒ2F™“ž`h‘Nƒi‚SV…M—8Ð2…fGD«ŸMƒ
ƒ~‰N9c‰ƒ'
Œb)‰2a3…'·K2’W‰†L~_‚>
M‚K„Š/
„n„‚"ƒX)…e‡M‰.‹&¬
#†jƒ>‚Tƒol$ƒhˆ!ƒ<‰ƒ
…_"‰LM
‰F…vPˆ#        ‚–ƒIeƒT!…=Šv<ƒŒ†AX‡O„r£O‰U‹;„Fp„+‡       –pBƒt"ƒ
…Az…d”\…„qD„\’R‚5„†~Qƒ\k]cS;Vp  @a„|ˆlƒR
zJx‡‘b@B‹e„l‹3=”9›l˜.
‚}„ˆyƒNr†)m‰z8•]]r@’]”+
5‘V„!š=(„Œˆf˜‚am,ƒ"f„
  ŸX˜€€€/¿4 ²z8ƒƒ^-†8š&‚u„‚_“‚OJ‚7 w‚Y…bP ƒ4‰yŽöx1‚
<ƒd‡s
„p—7 &U„tN¦z8?“ž`h‘N,‚)\‚mD„/‡‚t‚‡RÎ    _—6‡c0,3…'”A1-_  
MZ+
XŸ"»>&OE
fXÆ‚‡Q‚ l‡0
FMƒ>‚'žs$—6c‡k5‡‚¶lP‚L„"S\N*§G¶NE‚Nr‡‚:—uVz„eƒc  ƒv~‚}‡V!>‚g†ZFMJ<cJ2Mg7
X„|‚‡E‡h$ŸW‡qƒ(@B)‡Ÿ
]t®^<Ÿ—8‡jDP‡ƒSw—<E‡
%-‚^},‚ ‚OJ‚7      bk‚g
0everybodi‚z.—†,on‚ó•••Ò[ Ÿ%thƒjf
P·†F„R`
 ‚,
•E…†J6‰„L†SY‰Rˆu
§[lˆU(„³$ƒ?„}'„‰b
†ˆCƒP…}¯  
ƒx‚ƒA½Xž¢@M8
f`‡]jˆôwg§"‚ ¤W‚™3*¶Gz݃Q‡ƒ‡†h‚q'1å‡
¶Xd_Dwher‚ˆ^„6
‚y‰S—ë…"ictf
‡""d©ˆwŠLƒ\˜mðv‰Kµ„¶_‡ÿ…enc‚`l‚
ŒK‹©M•Ò„colvDƒˆ—sžJ‚K
†:–IKÕ}6œO03„ÉU
Rwithin‚SžyQ‚‚1”ÕuQ‚‚1x‚
O,4
9Š‡n,…H‹w
ˆÇ…~
(
Q]!wC
…g£1ˆnˆ‰‚q–
$B„+ˆ|šOÃ8W$„ 
ƒd‹(„0´›N|

ŒO=†z‚ZŠ;‚"®~‚i‚"
—BŽþg1K*—ƒMT6§UŸ$‡^Î—6wC‡‡jŸ„åHõ"‚—7k¾‚}Æí0zí=¶@%Î  
n=Î

‚/8Ÿ‡h#§1Š}‹7†|T ‘K#3(C
$‚0~
(%‚#
2Eª.
%œWD
VÜCF®,…%vK#3(C
$ÕŒ…Î
"r
2E2
%~_dtƒ
‚Eitƒ
V_utƒ
lWˆ;T‘
H0$¤
‚9u
z     
¯6‚'‹‚k…%~H0Õ{8
C    
z     Œ…7Î
^5ƒ       ÅQ  —ûB:       aƒ   Åp—ûB
Ycdƒ      Ågq—ûB
Pqcƒ       
Å`—ûIi1‚g¥ ƒR_•ñ> _2‚g¥4one•ñ}D4o_3‚g
ªo•ñm
‚Œ…/i1‚ªv•ñ‚2‚ª}•ñ‚4‚ –þ…?act©mdƒ‡3w‹¤¹»bƒ"-e„:"Xƒ6b=p„w‚b‚y‘‘J‚E‡4“\D…`{
ƒ?‰‘ÂYŒ¥      ¶8Ÿ%8ƒô%—ŸX
$b=B‚‘Î"A¾6D‚EEü‚
‡‚Ÿ…UŸ?—=P³‚0—S76liˆJ    2….“*… ˆK‚h„Xˆ~…  .‰‚7&'‡DŠj‡|‰>‚q~:k#2f…8
ŽL…&ŸM—^‚j    ‚…v¸œK ¥Y‚
½)ˆZ†ƒY‰\…BÔÃ
ƒ71
‡3
…
ƒ6Ä C“ƒv#5}ƒK‚2)ŠL±u‹)ƒM•0
ƒƒMŠHŒ&Šy-‹v+“  ‡(ŒF¨6†y‰‚|H:–‡2‚n‹P™F¥ŠB¡
„r6-ˆ}‚Š:œlƒH
„V’|…Z…]£b‰*™Ž    9ˆeÂF„Œ&‹‡Ž÷‚‡cR—30TYJcƒ%‡'ƒWž ‘‚
½)ˆZ†ƒY‰\—#‡‚k‡Ar!‡dyÎ
‚‡9‡nwg
®(5R#Ÿ
M)«—8MP‚ ®‰ýC‡^K‡[‡7
)HŸY‡e—4?—‚lŸ":‡o.ƒN6N(—&<‡]BŸ1‡9+‚e(
DR!„5.
#"‚J
""ŸV˜€€€0¿0ËB—¿l4‡KV‡…%ƒp‚Q
—…
‡#TH~3.‚iƒž—‚0exagger‚Œ‘˜
…îmin9i‰‰iŠ5‹A;ƒtˆz‡0‹}h
…6‹{
›O“VƒR
‡Z&"LÞOŽz¼*Žþƒ=¶…Ò‚       9‚È‚       ‚1TÆx»ƒtŸ‡?ƒ2åC&"L”>cf#p‚R„/k‚X‡#G=†
gƒ]‚†s     „&A‚*ˆBƒ<‚&…F†‚y”      (       %
„T‚1S‡I„O‚%‹j‚a‹f7]Š:)‚´0‰Q†^‡`ˆ1‚;y2‚T’6
O4‚,˜0ƒ<ŽXbƒ8‘&‚DŒOmŒ_. ‡!Š
_idx1‚á$„‚d‘DŽFlF„l†6eƒSt„[m“’>{m;‚at  0…~@k…‚;,ˆ‚N23y‚r&@j‚MˆE„`>$ƒ=ƒTyƒ}…j‰l„
‚;}‚oƒ~#"+
}1^ƒ{>‚8A-ƒ
‚Oh‚`
07#1#K dgm„†]ƒv…^…Z<i#
Œ<V‚5
#‚7ŠIƒ[4‚[:P[v„.quzjg/6;‡g
ƒ0!hhƒ‚Cnb2…hN‚CY‚$‡Q‚h‡U…&†Q‚z…0‚yqƒ,‚!ƒ†Uƒ
‚
…A‚iˆJZOCB`A†sv‚&S‚W4s%O;e‚pK,zmƒ1j|oƒ%‚rMv„2G„"†‚=‡in‡ooM…#W‹yƒƒ0†P‚&†_‚:‰z…R,‡wTfƒ1‚XFq‚‚4…Q~ƒ#‡1
`ƒ
„.…x3`ˆt¤„ZD5‰ ?‚ Z†w‚‚B‚.>Z8ƒ<‚x`‚6ƒ"‚Y‚v?ƒ ‡†‚K//)„Lƒ^BQƒoƒ28ug?HƒccR‚>Ž}2@|q[ƒ:c5&‚„{„‡OD‚L>g
z}{>‚#<„\zƒm##„&ƒ-‚Y<7„N5‚2C‚CA /v#ƒM‚omih‚BpŠ.(%‚qƒ``ƒ>‚ƒ&\:/‚F‚Wƒ6_) š!že‚Q’e…H„I*bƒUŒ?ƒLP…MHˆsaReƒ}‡…]‚UTnnQƒ_‚aŒ%
k?ƒŽz—=,:.T
^,
&ƒ3g
POL†lƒƒ>Œ&Žl…V
‚t
B).6ƒ`P…_6‚†J
‚UH'aHn‚ƒ=d x]‡ƒe‚.†w’5Šf‡…8‚H"‚Cƒ|…L6Š`ˆVƒ±Q‡`‚/ƒW]WpW><ƒr'*‚P z„.‚77
‚
.Q@]…Sƒ'Rp‚X‚A'„W‚Hƒ0G†R‚v ‡W$‚J81ƒ(>‚7I(-x<‚I†m‚‚Y‡W*rx1…q™RšMiŠNU„_S†KirN‰|ƒ‰ƒ^ƒ‚=†=6c2(‚HY„=ƒ:1I`L‰D$‰bƒr‹D#(‡7‚\‚„?b        ‚…\^0]
‡;ZE0‚|o„aVƒ2x‰"ƒŠo‡M\‚vH‡e†j{e7mƒd!1>+ƒr‚>ˆ‡+]PƒU<‰A‰y…Q“L†A‚Zƒ34…‚
m‚/Qg‚_ˆT7„>‚Y‚#`„$R*‚p!/QŽAsŒ;‡p™X&i„N&ˆ6‡#*ŠI‰Q„
    -
‚(„g,7"NQQ4%‚
›‰i‚2‚d!"…k %=k†Z‚`„fU„<•]’“]‹ƒšU~^ƒ“3mBŽsƒX†V…w‚0‚(„gJ‚rl,‹D,ƒV^‡"MƒTC0L7‚S\Xƒ{†Mc„q UJˆ [‡†‚_
Œ,m”HT,‰ht›ˆn†zS‚#™Y‡ ‚t\b‚v#_ˆc$jx‚K‚nƒXŠg…hƒb‚ ‚]„8‚-pF‚"‚=Oj<„/0Žö5#'ww‡Z‚[:
9[v„Wuzjg./
";ƒ!‡a
0‡g
hhg‡gHP
qoJvNT12‚-‚h‡UVOCB`A1,6S)W4
]:'3;irpKJu-m
|UY6MAƒ>]G‚pE1.
|nioM
‚!W‹dsƒ0:‚&  ‚:#9R‡,BTf‚z‚XF

‚     Q~‡a2K3
Bˆt£\K'!5F‡]_‡h
8ƒ<j‚B /.>Z8}U`‚6c‚Ye}…„3‚K//)„Lƒ^B
Uƒo‚= 8ugHƒc:R$}2@|q[‚j2c5&
„{OJD"O>g
z}{>‚#‡b]`p‚
‚, ma'‡R3
‚*%A—6®o"   ‡h`
I\:E&6‡] ‡h/@m‚Q‹…HNz

?
bP
 /aRe‡d‡lO<ƒN-(.45Ÿ
k?§  
.t
&V
&‚-‡cd¶XB‡g',6—8R‡‚S‡g
,Hn_‡d—8"Ÿ=‡,Ca6%V‡[G]5yžx‡‚-F.m/Xp0
""ŸV˜€€€1¿0”‚Ei%*‡'6(-MN‡x.‡g®o[ 'RRpF7'aW
NH
‚UG…H>>‡Z
z$‚        
1‡^‚2(-
Jx<ƒu‡*rx)„&—/f
N!
SIt#
s‚=‡o64&‚H‚/1I`‡eG‚&—7~|r‡^"‡7|J„?b
‚ƒ.^0]
^I40‚|o‡‚""ƒ‚
5‚8Hy‚C
Ke&
^
#!
z?‡)K>(i++P
<gAƒKv‚1
‚Z‡G4‡4-Nh4ŸgP;(7`R<H‚p!/GƒggQ
‚HižXR‡ƒS‡_[   -
&‡dS,7"NQ`4%§b…w‚0‡d7m‡jXe‡`,wD,ƒV,RMBCqL7‚4
GXƒI#‚( U-‚Ic|EK—
    N‡ed‡],‡o'„
(S
3  b>$‚\b<#:M
Vx[ !‡SB‚L-—80exce1+G‡v<_;;-:)]
œpŠv
–aƒP      ‹
˜…WZ‚E—{Œnƒy
‰tD”Žf„‡O’BÊ%„
®B
 4„P‚†h‚r:dŠo—I†oÆZ‰cŽö@®ip—‚l»Œ…WZ‚Eƒ†ƒw¤
rD®‚/Ýd,„§A+”1„0
:d&‡|†oyed‚„U 
Ê*ƒRžø˜p„ª‚
‚È
‚I/ingli‚³`–°…Nl‚‰C
…)™`1
~,‡—‹
%§.ì)œƒìl‚ׂ‚G%pt1‚‚')4Š‹~Œd„*Pt‹WŒt{"J‰Q……~„;b‚‹]‚n
"„%6†„6R‡yK/„5
g‚    %!ZK       ' „@
†)ƒk‚
i[;†i&
6ƒp<
‘e¡!ƒ‚h†<“"'EN2‚RzŽ1‡7‰mˆP›t#‚g…s‘;@´\‚P‘:…Mƒ+ƒsƒ@q˜<‚'-„       \ƒ9 Š2ŒG–vª#Ÿ†E Nƒš$ƒ5‰…T†cŠ;‡ƒ‰_„!ˆ.†}¸`”Eœ›q†?ƒ"†ˆ 4‚X }…Z|…Jd ‡CmjRBn‚I†‚Wd†Y‚‹f’-…ƒƒT…$‚B‹%ƒƒpl~
y{‚%‚0ŒN‡ŒQ±S•M‚%ˆH‚Ijƒp…‡‚C„†x‚nƒ?‚'ƒW’o†gƒt4…J„(‡dƒy‡
™V‘  kƒ)¬TžX‚Nƒj"‚: ‚‚c!‘;†^ƒ ¿-ƒf”`–*†~

P„42¤|‹H˜:ƒ“ŸÇ¡;‘u‰r¦U$ƒ[’8‹@£.2ƒ`Œ‹t‡S‘
†A‚6*ƒ{‡ƒI†2
S„{.l
+‚<Žö‡¶=„E
D';N‡W‚Nz      
0]
    „f#|L‡A`—<@ ‚P‘:…Mƒ+ƒsƒ@q˜<‚'-„  \ŸK‚        
…K‚
ˆ‡AM[‡‚\΂\ŸŽ7ˆ^[n   ¦‡Ÿs”‚9M‡‚,§
UB
X‚I}§ƒ/
*®h$KC—-¾‚ =ƒI
‚¶;jAQq
$‚C‡&ƒ}—Ÿ‚>‚Aƒt4‚s‚?‡‚aƒ"‡ViC„( (H r6ƒ[‚m‚1§‚W%¦YdQ
—4Nƒ?Ÿ„‡q
‚n$
— Y‡‚‚$
.‡S‚ƒP
0*
YƒI%)Q§,§~ssuƒ?“$\‡‘Jfn
˜F„%|/&„„XÜmŽ÷ƒ= \ŒK
^ŸÕ{ŒS„%|/&ùÕƒMhang„,“I†PŸ3
x1•!”—Ó  it‚‚4
‚ l‚]ƒ*]S•£o
2]Sud      „Œ8‚XzÇL
7Ϯ;
,‡
Èw)Œ|:‰†TN   #”~†ImùƒH5³*œJ
l)üL
(
ƒ&*     #NÕqs ‚ƒF
'GC‚8‚7
,    
ƒ8…L‘}
…    oD- iU(I
‡B…]„W‘$‡8
Ž
I[ŒP8†,…G
„>‰
‚KIp'  ?V
""ŸV˜€€€2¿0ÂCN•B
.„7…$%^†
^ˆl+-ƒ>)-ˆ'Ë“Wv…4…#.„j#„&!LB
HM‰<„
7nƒIƒ/D„C0‘3.
>

1$ !†‚m (‘~ ŸS…'D&9&.zŒ›SŽ÷       "D- iL(Iåòtœ
„&I‚ßO
.

y+-)-xÃ}
7n*‡g7ŒQ
_(H3.
>

1$ !
‚s
‚ ¦C      'D&9&.Œ‚—>DŸ0excurs‚šec'2!*+$
.x:&
‚QrŠz,†n ¶
ˆc“-!‚D.‚c„ (²~
œ@.b
ƒN‚‚-s
ƒS
?‚QK„Sƒ!ƒ(„„pX•3ŒT„!T¿C¥1 ¶¡<…€„ú
.¦y‚w¾
R$!:_printf‚wšKŒ2‚-PYvprintf‚wšXŒ&utq $\zƒ‚3†W„I„(ƒs  W†0…
–s
Oa*.
"
†$0„ƒ-$       ‚.        f
B!
‚/"…5)D…‰b–'ƒ($‚¹FŒY)XŒ-‘~¨U‡nZ‡jT„e6…s‰0‚N++ƒ+ˆD‹Y+…?7m–Y•ƒ„e”r…mƒJ‚™SŠQ:7u?;}‰]  $RƒTÃdƒ5ƒHƒN:!$
Oœ"†ŠY“ŸS-M„XŒ„2     ƒ1„IŠ>„O³^‘f/‚jƒw.FjYJqƒO5V„Œ?l3é4‘lŒI,ž8
L‡iˆ!)_ƒ—;‹…i
”3ŸXcŠo$„eA*}3(    m 
£)–
…t8ƒq…L…>wJ"8Qƒ
rIV…
‡'7
…=4ƒo‰8ƒŽ       ´"‹6@0„#‡jˆŠIŸ?B3„Q‚"
•c!µ}‡‚
<))X„J†,
-„‡V‡n5JI6
‰0B~N++ƒ+ˆD‹Y+…?7m–Y•ƒ„e”r…mƒJ—/‡iq…/¦^ÕxPƒ?ƒAƒ5ƒHƒN:!$I/;m…På«mŸƒDol¦`
Hq
5Ÿ¾E?l3¾EJ‡\&1L-§
5
‡c„*‡…‡h_B?®_
7A}3(      d®2;¦
‡Ÿ§
#L?
?|I—J!rcis‚P„6ŠC6‡'Ö|ŠA£ï.˜¡ck–3Úd‡’7ƒÜ…5ü{%Ÿ
ŒGifiltr‚’W‘˜‡&haust†S×V’:
Ÿ}„nÁeŒyd>
/f½†O»”
{„ª„w®p>>
‚ïdibit+m‚V‹:•}„iJ  ”l †JÉ}‚#†…<™‘ˆBB ‚À„hŒ‚¶ƒ.‚þ{ort‚s
‚istJK‚1T
8uuƒP+„Œ)N‚K        Š)3‡Œr„‚‚„         ˜{?ƒ‚
H„’A„#"ˆP‚!Cw=*?C 
*WR6
-„r
(
‚bU
„kj
‚E
     7
-†=
…?v2!0t&‚|!ˆ&‚„S;S‹R‚™)ƒtD:k‚„M‡H       „e$
‡ ‹"6‚o„ƒ ,šF“5’X`ƒ`„`†7¤w„(Š.‚t‰w‚)K„L„p"‰@’x„¯@ŒT$ˆ3DŠiƒ‹I¬B)…B,‰F“‡a„lP‡2=‚q'k„cŠ‚rˆ)‡0{7#‚LŠB„Èu…h¡DŠ‚|&y‚W'
‹?‰FJ0ˆ~<,(•R„%Š^@>‰
Q}&H'ˆ_ZGˆPk„‚b…/‚%i‡,Q„|†z‡g‡,Š(’v‹I8‰‚2'%…=&GŠˆm††^‚}“†„@’ƒ~‹›l$†*‰n¥‰=ŠlŽu„)W†"…5ƒ-('ƒV†>‚   (&†<d!ˆxB!‚wN‚     …Z†m†G‡k
‰=/e™@D<Q9‚#L‚ †@†!„{„'„Fgƒ!…PŸ"ž8&{‚\5‰ŒF?! >©B‰^†  ƒ`OFS.M?‚.‚aƒZyƒbB…=TO.‚{„!‚     Ž\9ƒ† ‰zuN<P
š\0…a‚U2“²6•,Y|‚ÎL‘{µ”‚tmPWƒ‚fr‚ŠZ24rnu‚-„,>„*‚wƒw8‰ IŠC(‚m°*–d…1H†ˆUŒ~Šcƒ)…e“[Š$ƒ„pk‚O
‡+/Žöu‚Y;S>Z
R‡‚‡y‡B—84(U—A‚!‚0‚i
w7BL‡0
L‚t
‚)^‡b?3P"Œ:‰@’x„¯@ŒT$OMLƒ '
     ,J
„,‚ƒ
B
‡*=7'k‡QAFŸ…{7#Õ}„0…h_S=) ‡9&ÝW¾;\®rƒ0‚#‰[yi

""ŸV˜€€€3¿0°%’õ‚#Q
~Q‚'—7
=z.®ˆJz'%
O&G
}^?y‚}¦d,=Ýb‡j„e¶„.=!$B!
TN2D‡'‚]‡k
U/—3c
‚‡_
<Q9‚#L‚ ƒ"{„'Jgƒg‡„Jƒ:‡y5IH?! >†S®PJ‡|O
S.—?     VyI…=TRfD 39'f
)Nž`.‡‚Qek—2TArƒdDR24

Jn-g>‚/e4ž+
77[$V      v%1Hn1w%hn(5      n—)Ni0exit*
ƒ\I>!”*ƒ±[„!„"£.
©     
=_„\
¹S'¡b•9•!$z‚"„Ra‚v¯TRŽ÷cåH
„!«=‚Ï|ÂN»e
‚X'¦]Î
w:‚R3fj=_print_changeset‚T”W4-”ÝW‚k4-p%/L‚^-andP9
¦q©LºCšOƒ$´vyQƒwø†^‚ßg"ü8Ÿ„.„PÆsed_sql2WD#o     0"ses>}–R‹.†mŽf”—lâ?G¶‚rË‚    ect>k;}C)+†ƒc›Œ/A0ÆD„:¾·
HÂ7ŒQY…\’A‘gt‚wžD»0Šh’¥ˆR
Ëˆˆ“ ŒT©¤(Œ<…B‚2…D0
~‹.Q‡™r†kŒ%°|‰nAx“Xˆ.E‡I„aµbˆF’$¶9a4ŠG˜™B‰
‚@…µ‡_
A{ƒc+ƒM¾…‚S
PŒQ݃ ®‚QFAH‡H(‚È$„"—6
&0—1L§   ‚Ÿ:‚‡…13‡]
JA¶v‡……4—.)P„ôt:       ƒ—2‡knA®t,
)dit‚–m•,îv“ÐQƒ-Pýi‚”õl‚„nsG<„&Œ\„_‰+Ús¢=u
‰     –z»=fƒ.‚|˜#šTˆ.D‘.Ôy
}“q·h
®y&È¢Žþ‚Xü„!?      ˆ
ü‹p‚×b‡‚Dü(Æ{ƒ ¾†=—H:åX
l&õƒNŸ{ifi‚.Yve_funct‚g·~$)2•òP$)2ri;;
›¤\k„#‚…Gª     ˆvV‹        †Žƒ Æ!  "H„zL ,
†9„S‡Š-/FZ#ƒzŒ…TF…‡hp„<ŽþnK¾‚,®ƒ;‡_P2í0L—Qù‚QÖKÚ‚lÎWõ)V  @ÝV
Fƒ/penc„#…:…
mentv%X“;
¢/
‰²J‚šR6<3°c‚„Q‡xž
¡-Ák’|„?/†‡)½#“(&v„VU½1»ˆ!Ÿƒ_…¿†õ‚Ÿ       #
†rÕeƒVUt‚
R
ƒ~s    G„4„IÐ$™b
/ ‡(½?$33\$8k‘˜ƒgÒsE7íYvƒó‚>$33\$8kis‚‰Nir?ƒ"  d)<    Y5¯!$Î$ÝDšS$œ‰_lain   „„,:#"  

N)‚
vG)‰7…‚cˆ
4ˆ)¡[¶Š‚]¯R, Ž\
uO½…R–F“4ˆOŒµ/ˆ/†XY*‚-\({

      
rRL*gXb'68‚Jl.…(•Y*‡¿dŽO‚LÜl4ˆ)¡¶
œ…), 
Š0„“‚Æ)YŸ„
b‡®®mY*Ÿ"?—60({

  frRL*gX>'6#‚Jl§)—:‚‚¾&n~ˆk¾~’%Ž@Nœ_2½] g‡J¶„YÕtH—Ÿ5ƒìBatori‚HÐ!fÑXB†ú‚xicit†Ob†0‚
       „r2‚*+
£TŸ
VGk‘1‚ 1Õ~®m…4
ƒ)  7ÜU‹*—'–p
ŠdµiI
VGkCV‚ 1¶fQÕ-"‡ƒ#)Æ'„¢‚F‡!Ÿ$eÎ…
       liG‡†BŠ
ˆ]0d
‚1žL-êW–„†a²vËŽjƒq„}µ?Ÿp‘Œr‚  ›I®i
‰C‰ušLÃP
Hƒ&        ¾C‡‚ƒb‡…:X'T„M.
‚(TD„i(c
""ŸV˜€€€4¿0·ЮpJ
?Ý‚lŸ‹ƒä2oü~aŸ‚-΃l„/¯   ¶7F‚0exploit‚‰^†J'‡{%„Q#08‹^ÈM‰<Ðq‘˜‚°V}‚¡‚h#0u*2^‚?Ò}Cr‚”Z‚|‘3܉-«o„²;MË>on$œCO&Yˆ.’!ƒ(„Ad
†5µƒQ/‚[Z'†Qenti$
†1#‚^
†2(3—ÄN(”1rt‚…‚f}¢‚ƒ£1
(a   §-‚„S…Cì ‡™aÆ-n—(#s‘vÏr‡7ü=
…7«M¥kƒ+Žþ‚#¾gž;Ÿ<gü$†Ë‚Sur‚‰fƒšWì:L«gund‚Šr£k

c.

,
       
.–x
gŽ@¤yq^?&‚k=Af'`xzc<<U.lO> d=Man507]>`lˆ3ƒin
*)L4  W„*H„[2-2-ŒfN"¥8_‚a…T+„'":‚µ>§
+®h—Œf„Â
g2F$
*)L4  WH*ƒe2-2-Y”;N_‚a
ƒ:+1‚V
”+†pp0V•ñup'V2‚”-†r#W      •ñ*W  3‚g†t"X•ñ-Xess/R
I(MGI†CD„'ƒx'Gƒ?k (Xƒ
‚|gu‚auLO‚
        g‚. „Z
-_*/
"     #!<(   
       "
ˆEV_
 
 )!w)"r    A„‚5r4‚k‚9„>
J06     "

@F‰QMŽ"ƒM-}.ƒtƒ1‚*‚z‚@-ƒg0‚I
                

                  

mƒ(P/a…z@
c1M-8‚ƒwk
ƒ<
~‚-"
„@
 …MtŠg…ˆVRˆ8Eƒ"h     *?)ƒO‚[;9‚w†$P2‚A‡9…XI¨5§v„…•
¥‰"T}ƒM…3R=‡b‚‡,K%1^‡
’@„?Š
(
U<<‚~ˆ„iZ„eŠŒ[„
¬6*u``'‚R‚<ˆG+{ƒS5Uƒc
ƒ–'‡?‚›:12U67
,   nv‚^'
‚Pƒ

r    
Œ]ŒZ‰<‚[Œ?@8‚"~
3R…I\—2ˆ3VO‚i:P>…^KB%‚s&ƒ4‹%„A|ŽQ˜‹Rp‚l       
ª    
ƒm`Ptnƒ] z„+‚L‰2m‚&…5•[–UŽ{ „‚.#9,W Y “@!„5‚0®O‚U‚w‚h‡v„MÖg.>¬e–#‡}Äk’ƒ}ƒt`G„.‚.µ7ƒ[E\        *?)N;9‚rE$P‡V
‚=

U
I}ƒf„‡}—9
3QK9}ƒM+R=‡bfK%^„1^‡
‚2‡Y
4(‡]1U<<ÎIŸ
ƒ)
†$‰E‡S
‡ŠvŸ Ÿ$67
,    n®p=¶J¶¶a
‚1    
—88dCÆ1C}
HVO
 i'P>Ke%‚s—:'Ö
…3    ‡\
‚3       ‡b$\nz‚'‚L,lrj        2‡WJd „‚.    L¾*`
, YŸ$=I
)¦„b¾$‚E®!<ÝElistƒ
‚n‚V
”0
tv‡0)……
P„5V
—
J‡'¡;“     ‹ˆC$
R‚>Žþ\F¾B‚ÀCÎ     N³Y
§3Ó2Îõ*0
     
^¾%$—5|¶U<3‚[
™O4‚kQe7ˆ5‚‰„3Ly     g#0

†s$          a-‹rƒ`5„#xƒq
Ž9¢6«WL‚d¡ƒ ‡w†‚"o…,
T
®Jš’:H•Sª3=
7`™u“  bf.
#45‡{{
//#N
f[aZJ"0#'/4.]‚‹r¿ºx¥w
—C   Lê    MÝb.¤‚i¯
B¾k¾@F‡s‡hJ”†$»=+
#
)5D†
{
//#N
f[aZJ"0#'/4.]+‡" C®ƒE       ed_errcod;jJ"#]sr—µ

result_cod;[„"tu—µs$ƒn@‹W,(<—>
G…g…\V‚$
2&       D/
"…pŽl9…
@' „i72s.c:G+f%‚P,("Ž*
P      „,1
!!ŸW˜€€€5¿2LJ2SÆ“j†#       ƒx)ƒ     3%v†‡$„M(ôX#Œa%ƒ/
‡=V$†m.        ‡
ŽV…5–“$ˆ~2‚*P‚;„#""…A‚?$|w—@„……‚5‚b"X]+P7P„`@ŒJu’M’o…9ƒeƒ.
 ]7

‡}
„S)$‚%‰†/C‡„F‡cPÄqƒn^„'7‘?ƒb„g‚8‹0‚A
 Žy&J
Q^'
,).ˆ66[•Rž
‡ƒ:‡
,„08/Œ&FM†…=ˆ0ŒpG{g0J
0       ‡Au  K‡?("
|ˆˆQj%n'8'
†
2lŠL«7‹%‚4E!‡{ˆ‚g‹A…^„!"= 9<'2‚SŽ3‚$Ofˆ
’f†:’!
†=‚. ‡D,@2‡XB„‰a+™*”e
$\ \ C11*(=L        
:"
* "
-              L2:&,Cž3O
‚
"‚n
&9Žö‡h
>'§y—1
2SS%†#        ‡)ƒx§‚x‡^!$‡c„ ‡?-åGTV ‡_†m. ‡
ŒI0    )C/ƒ`2‚*P‚;‚$|
Æ!
=‚5‡dAÆ%
 ‡hŸ [7
‡®k&Ÿ JxRžv
‡h
 '—7

g

=
 ®A‡`J
G^).
®‚‚!—„n®pU—2
0    
u      :6("
@.‚@‡[j%—9M®o%
'O

Q‚4E!‡‚E®pXˆ2…^„!‡=
      9<
2
r
‡A
‚O‡‚wQ

  
wQ. ƒt,      2WžƒW
+‰n4*$\ \   C"1*(=L     :"
**"
-               " 1:&,Ccl‡O¶W
      &90extension_init_c‚,\fQ‚;)…˜ŠnZRQE;)o1ƒ†   E…˜Šq
#E>2ƒ†;]„H˜Šq
U]@t…¦Gƒ&R†*A‘
&2N“”å
\&ĠQ
„#rn

B5j
>,5’@’E…m'<—     NQ o}˜‚G3V&°BŠF
‘L4‚s
„*Õ‚s`-=‚bƒ¿,‡^‡a‚?B‰B
Ú]
\’w˜;…yq—„A%#‰ƒ6o”)ƒ.¥$‹
‚¦
ˆ^¬rU„X—vƒt‘½6
mLo}V&‚7‚GT‡q4‡eïJŸ)8$`-=‚bƒ‰Lüa0
\46K‡.ÒxÃ*Mü~^„òƒ—    *ra‰KE‚U‡5P^‚3AN=…fŠr‚t‚&
6„]ƒ
O…i‚      ‹Gƒ4&o‚&:Ž{…_xm¤pL“p$©ž(?,„J‘[ž<Š2¤K‹h‰\Ÿa
Z>•a†mb‚d‚i†B8„T•N:…1„<„&    ‚~J†Ej‹(O
†aˆUŒ`Ÿ6…—7ƒ8†S>…9šG…Oˆ#‡\‘3
D°i‹5†>‰%”A¸)‚q‹<°Y¥hƒ`”&‡+e–C‰V†x¡p‹…# ƒUŽö      ‡a—8o9—6k‚&[‚4
‚Dx„pLž}
ˆ$¨\ž(‚F
FJbƒ
†`?
‡_‚|ü‰

q07b‚d‚i†B8„T’IŸ„   åm‡JíÕx?s‡j
mO
~‡p¦j—G$¾C>f
7¶‚‚&§‚NŸƒ$—9
ƒm‡J‡„N?Î62)‚q®;o¾<‡†O—ƒ‡kX}
Z¶;_dur‚
”où^
ˆ|  ifnullrow‚#–þ„Bct
”"…7QHi0Jƒ2’QBSƒh†q
!!ŸW˜€€€6¿2¶c‡oƒ)‹IU^0
l<‚J"Xj1l›|Ž+ˆjgŠ=-g´$…cšÆ-‡ mž -G…,–n9¦=*v|‹"‚U[‰„lƒ^[&K‡F‚%Cm‚‰1‰d‚'‡`)ƒ
‡X†?“7h
¡/\-ƒu
Š]•§/«_¦‰96ˆŠ’1 ¾bµe’O0[>8‡~.¡†H…Y‚k‹/%„ƒ8‰NŽþj§F—c
ž‚F ‹/Æ-‡ mžŸk~„9*v|‡TŸ7[®«(
^7@&Küz
imn‡‚‚$§
‚$)OÕuE®~
ƒ$/‡a
Y-—I§`¶‚EŸ!‡?¾‚0¶ƒf‡qa®fQ‚‡ow^*%B—M‚—h0extractextractƒ¸—ÌNAn‡r!–ƒ<ˆÝordinari‚Ž%emf`‹&ª Œ\¬   ƒÆ=s‘ˆM‚Ï`‚™o‚‰&y‚…”õ       7ebal‚”%‘‰6Df
‚>
      p   C![
2.)

&+
-4   1$
@en‹     ¥p
Ž    †dÖ„i8Œ




ƒH
               

„‡7RE#
P‰d‹&
h„C^k*‚:†b
        ‚
             q     ‰l
‹
Ž
/†‡nœ~(2›X™q"‚$‚4ŽþZ¾E     ‚'‡R
„    ®pD‡wi‚~‡_w




‚
               

£uR1
P‚ßN
&Î-^g*‚„-
         U
              ‰P
§‚2®Ÿ"V/Ö†HÕuM¾98‡j (2Xp"¦`1¦{‚N“^½BˆŽ‚K
F2ƒ‚T“]—Ì‚Q
Kf‚-yùƒP3ƒ‚W“\—Ì‚T
M97c4637102a3ae72b7911‚†E
_fullfsync‚éU”dŽj–×7sync‚›:aceÙN…?“CÃ`"[¥T‡`™1‚½W„›ƒ%‚™
¶^Ãbook‚.iƒ.‚mƒ:˜šY§‚:tghbuch‚ˆ\il‚3A‚{‡.—oƒ\‘§W2ƒµ&ú
[it‰Ð    ®3-l‡NW)¼}•5ˆˆ– Œ½~”¬h¶ñzNâIHŒŸOÃ/
®oQt
ˆˆP‹sˆ‹:4„L   “
ƒsƒ†XØt¾_ˆ"‡2ãAƒ{ƒ^‹h!=Œ‚ Õ“%…‚ˆ<„–‚y†
U       Š)‚‰n†c/‚]ŠWµQ˜L„e‡B „ ƒ‹‚µ¨¨…2ƒ{ŠS…n†ƒQ:†
Öx³*
{‘;Ÿ‹-•      …M†xŸ!
`—_}žªN&‚ÝLJ—>‡Bb‚XŸÎƒ¶TSƃÎ&‡…Ú‚W„1Ÿˆ'—ƒI&‡ƒ(w‡ƒ-`®‡§=®I:‡‚vÕwyƒL—„aŸ))or0v
VŒT‚E„-rƒk?…}„YG “„P¥n‚a˜¾”OŽTh
©–/›Q¬)®6PŽ÷‚
…‡„-ƒÔ!|‡;Ãt¶‚dŸT¾@i»G…P>Fdƒƒ/ilZ„  ˆ„4
ŒJ
.„‚!'
0k5„O+,.‚D"+‚ƒ<‚*,,R„   2ƒ5w
u#gˆ‚/
?
,
‚O„?ƒQ
;UdF†
"
:‚\      /…     ‰a_††‚‚m       ‚8‚A
‚{P+…%‰lV†dƒFœTŠi„6‚=‰k›«ZÉo…O™h•V‡5¸gƒ2ƒy’™Dœ´vM„&ƒ7F"iƒcJ—+„+Œ›8¼\a&†I]
L
8ž|‹Mƒf‚D…‹:¯ˆˆ1$
”X‚T‚r#‰=‚aÊ~
…^5
sP–@‘8¢"²x™“{…OB‚>‡:‡b%ŠMUƒ9Œ/„?
ŽŠ‹2ƒ??&a]Š…‚#t†g…
Â.²‚R‡/Ÿ%v!J“aƒU„i5 ]ÄF&ˆLƒ„ 4‚?661‚P…j†D¼[, #`„A 3œOsOˆ?Ð,„ b+‹cHƒ`?tˆ<ŽöƒD|Æ)
72yU…•V‡5¸gTTRƒ^/MÝ‚     ]ŸE“M…jW„j*/
p*        ?…r

!!ŸW˜€€€7¿2¹‘‹E ]
L
8‚>  žO}‚¡V{ü;B‡‡Y¶U
5‡‚—ƒ(Ÿ‚?&a]„S‚#t†D‚—Ii‡…Ed…"SÝosMƒs0Ý3&‚Xƒ„ 4‚?661‚P‡fQ1
‚Ÿ#`ƒ- 3\sOd$J 
‚0+H—‚EVt0failovƒ°o—ëg-ur‹„‚O„jq   †"ƒy
ƒpzƒ-Ž:“
58%
J„(‚kêj†>m–    *‡A4! ;86‚<¢+sˆ=•ÍS’MŽ
‚a
ƒŒtL       „‡!Œ7#pˆj…vL„Z”ta8„u
(U‚VÎMˆy,ˆ>‚|„2,‚‚
…UHSNOk/Š|„w‰/¶„[
ÍRE.
˜P‘2ÃT      ‹(ƒ‘j,{,/‚@lŽ4‚*ˆMlWß;„^2„C3‚X‰‚qm)„‚7h‰BŽ÷ƒsåû|Ÿ3TŒ84! 46sŸmÒt݃+'
#pH>,ƒ(
a1:}

›|?®    „'Õ‚0
„KÞ
E¦†Q¶T
     …W®ƒ‡d{,9‚@l
%‚)kWf
o„žu
3‚>;?#lr‚Ó~„WµLjƒK‰J‡[“øŽJ‚‘„ªUŸ…*‚;¶bCliø_Fx½L¾‡„¢R(th‚—ke‚Û`Œ:
—/EÜLJ©>9”DAll
‰y„&‚ˆv†=‹R
še¤ërtš@5’   ƒF
2>†VA‚C‚5+zˆ/‚ƒp7,ƒ1Dˆ}ˆv:!ƒ|%„N‹i‹^§    œA(…7‘H‚uÂ¥n‚{ŠQ‘F<=š(§?
~ŽöÆg(žot…r5’   ƒF
2>†VA‚C‚5+zˆ/‚ƒp7,ƒ1Dˆ}ˆv:!ƒ|%„N‹iœ„rh:‚ „Õ‚s‚Sò‚/MT‚
back‚ð""ƒC$ ž?–f~‚‰6
Q$ ƒ–)Q‚ÏwGs“QŒC…E8.„<‡r‡]H
Š.b!!
‚#%

XA     &Q5     
w‚.#
‚qLƒF&W
 o;#9*‰n‡g
ƒ>‡6™,“LnFŽ†p   W&™+œVQ”IG&‹SŽ59

        ƒe‚„3   ´…T0 ƒoƒG/="Z)Œ*tfBb>†jG‚‹=qšvzƒ9…4
„s’‘4|s‡3B,„
j‚ .Ž^š™H*Ÿ(ŽG„[‚3DM„2$ˆ%‚g^…O
¢C³@Ñ'†Q¢:†_Œ,Ÿ…F      †µ—(T6„^“LnFŽ†p     W&™+œVQŸ@G‡J819

      ‚7‡D~ƲE‡i
0 Ÿƒ
H/="Z)Š[B >_GOÃS3â‚    ‡Ÿ)ss¶P
;,b
j‚.>¾‚G*b‡1„[DM
O†?ÝE
‚gLåE1®‚
gŸ+GmiliQ
‰+
 '‚,"‚pƒ0‚{     "'
•_(
{ƒ.5N6
…g3‚8 ƒÁ"¥x5‚{Æ2
{'1ƒ-/2



z3‚.„£
ar,xˆFr‡Í+$     ¡z
‡)‚FƒzÕ7§`ÜSO‚¨qÓ(‚‡Îjou‚‡/–¨pnˆv:'ƒô|ci‚¾V•1out‚6„Ndd‹klqnllkqqŠ5llkqqqqqq±Ñb6ƒdd‹klqnllkqqŠ5llkqqqqqq‡©–]r”'‰‚m‡‚—i
¹yZ‘k-‚ƒ—XŽ<Šk?
ˆV•n–J›        ]–#ª‚`„x‡N
‚Œ‘+¦AŠy‰p/?Žöƒ¾=í2(…8ê.—;U¾E%ÚUV§
Ÿ…)5CT»‚V¶ŒŸu‚shionþP
Àƒ>½uˆŽ#t
’;‚g7ŠM‚aŽ˜/ô>
ÜP®8?‘*©Z
f‚‰p‚-‹        g(w„a‚
…0‚(µ˜<y…?‚>„`a›¬0UI½C‹^&FŠ,NBƒa

ƒp
Å„b‚T‹K6¥Ž÷
‚a‡„2¾J)?¾^
%ü„‚‰ƒt—4
(!‚$ü~r»C;Ÿ måem     ^¦DNBƒa

;Î+<—
ƒ66‡‚c¯er†\‚sˆT’^…(‚„3s7F„!;ƒˆ‹Pˆu‚/
‰
»{4-o«W‚0‚S°ŠSˆ-«g
]‚s…0     ¸d†%K£X°4‚
ƒ)^ˆ}‡…O±,‚GBq7:p´e†M}‚1‚[†&g,1‚R@†!4 P‚ 7ƒ*
!!ŸW˜€€€8¿2Ž‚‚§Lc†m
sZ*™6‚_Q…W†Eƒ|lŒGƒ?ˆ>~

s?ƒU
o„%£oa„Ta.“¦S‡fZŒ
]d‚%|#
\*‹X8‹xm@”vŒhI‘0“\3Ž%4Szƒ&ƒ             L‚}    v
@z(.Š†K‚Nx‡f„D6‰(‹qŒuˆQŒ ˆ{„B„+³$
4l‘.‚_…Aˆl_JˆU¤9&ƒe?z‹vs‚n+‚<‚A=`„#\ƒNm=„20%W˜NØ‚B’%’|‚hŽö|
9ƒN‡ƒP
;¯
e4ƒ    ‡‚,‡X›9ŠSˆ-«g—/Z‚n‡i
j    …Q†%K!‚X‡@@‡g
‚P^ƯK§!GBq7:p8†Mb‚1‚vc\ÍQ®‚eýA=~—?C¶S`{V.‡7OZžrGÝ‚Nüz,^e‚^…Vl6tŸƒ{
„u
†)Q
H‚‡†G®j‡t‚t‚_¦‚#6?
0
‚xŒ
`ƒh\Gm=2%W‡nUkf^yž.&0fasterthanf‚‚4stÊM‚3?o Š"‚Q„?‹P¡<½n*„’|n‚¡ƒZ:t‚ˆe16‚Šy•£‚wal‡T„ƒ    ³{ƒ,’ú‚/‚þweƒ_ult&
5)‰(9çO%¢Oq„/‚*‹‘–^Œ;e©$ÜSÓ%¢O«n[e      }fñw‚¨„9„cÃUi‚¹7Ç–×?vor‚…M5´|  D‡5ìX3ƒ      it‚‹P      c7bd6358f‚ jloseƒJ—ãpbntl‚´ˆ:ù‰\_begin_atomic_writboŽy.2D&®ùusyhandlC
ŠZchunk_sC
kpt_donC
%’fstartC
'’K   sm_filCommit_atomic_writdo  I®øƒ\†¼“phasetwoC
ƒ^  data_vers
0--
#‘F
external_readC
(“
file_pointC‚9get_lockproxyfilChas_movC
"
journal_pointC‚3#
last_errnoCock_timeoutC
"Kstmmap_sC
Œp™:ùGoverwritC
‡pdbCersist_wC
…E%”5z†:™^Ž÷#n‡¹
@   owersafe_overwritC
†U‰ragmaCˆq1-2%1‚ƒ?–×-‚ƒ?rbuC
Ž
eserve_bytC&ƒx—¼kdt_cachCollback_atomic_writC!-n+set_lockproxyfilCize_hintCF¹wlimitC
$“`šyùyncC
‚\_omitC tempfilenamC
‹racC
ŒfÁCù—        vfs_pointCˆ28
namC

‡G  wal_blockC
Ž
in32_av_retriC

„
   get_handlC
I
  set_handlC
ozipvfC
ŽOxƒ¼#—ÌPnda22108‚›/tasync‚‡(ù]<d‚‘ ^000461‚‘ ^ear2‚…Nœ“‚‚Psibl‹‚Â0tur 
‚]FˆZƒ(‘_Ÿ_k^‚S
‹8%ž–d
‡va@‚"…V•YŸp’u§"eƒ%h–A‹%”;°fµi
‰c!æ#c‡…!‚Š|†K‚v…Qˆ5ƒ_}D!„1Œ[‚"–KB‚nƒIŠl„)7‚F$ƒMV•’W‚~‚N‡0S…38±-„ˆmƒq_©#1…78
>‚‡zOd2‚5b;u‚+Nˆƒ5zrt …K…
‘zƒD—xƒT7P"ˆNƒ‰|‹ˆJrˆs†>55†]f_ƒs@iAp…Q,GBƒr‚‚?-‰M…
™Y
”:¡Lq“t“t
j¶{Y…{–}
‡i†M˜Y…@"…](°‹p—vHlM‰9†=’†`J&‚;ƒ#Âxj…j!]‚L1ˆK…3
Ž
ˆ
£=#
]‚CƒB8Ž÷E‡b''a—;#‡…R4D
‚?h‡‡cW4‹°fµiG
dƒ:dDÝ?X
‚.TŸƒk…6‚">‚nƒIŠl„)7ƒMH @‡NhG‡‚íåD6åH‡h§



PLÕ~     K-p‡["KV
M     
‡„®tE‡p
—0h5‡†@ƒN…c3®qyŸ…](‚ $("F'¶ƒ)§Œ‡g@‡dr‡‚8I
„
!?e—„+ƒ‡eŸ‚@l'¦i!bruariˆLd‚ˆCÞ#–¨6Aer‚˜`‚>–Ne‚‹G‡JC
8      14? $     9"(
#

 Š<
""ŸV˜€€€9¿0·&‡/‚ a
X#*(#*(_H60feed©
‚Ž!>b‘ˆtback‰
“B&ò–åF„b&ll‰W
‡¬rÆ&±"Ÿm„L‘½G
‚Œì,=ƒ-ƒ¾PÚ‚>¶„<íTqff‚/†+8
•Býncd‚:sqlite3‚„/•Œ:ytchG…>
‹q‹4¬
Ú
›2ŒK¾1ŠzÜ÷#ƒÌA‚È@”4_”7vw
…=ƒC†rSv:M!uƒ`       Ƀ¸GƒI
ƒ=3„J„‚P…¤:‰“i…VŠ/…_ ;
U…oƒƒ(Zˆ
<‚s.&#‹c‚km T‚0”‡B‚Æm
ˆs=
ŒE8ŸŠ5™Z›;X†`B‘pE—)„,†V¨wCLƒA”ƒR¯o
F     K*ƒUƒFb…d"‚&†"„~n½4_'Œ‰B‚4‰J…_‚_B”L…SÄ~…Wƒ@’‰D‚_Ÿaˆ_œ‚  ‚@Žöƒ^Æ‚¶‚<‡ƒ‚‚p¦m
3ÕLƒ“iL
„(*[+
8
UX|í,;õ‚‡‚/Ö"ü^eÆ(o¶R
        „,|‡dO
ƒlL4‡d
(ƒR‡ƒ3®a
D     K¯
^_¦0u‡d##®e—9@!‚{0ž
dD
<0d2R¦n>erƒm†NYdƒ£s›{ §!d¢2œ)©w„Ê_‚w„#ƒC‚wŸQ‘P™F‘

Ž4I(·–0¯¦ƒ=›wŸNŽ÷b‡i¾CŸ‹Q§!Ÿ
ˆ"†"%ü…q¾B»Ýƒ
Æ‚
Î^IíAŸåV;®Vf¾‚e¶=„f5be73de‚-fd‚l‡!iÜv¾„bonacciƒ     
êJ    —ûN
     ddl‚Œ=eld
‡b 
:W
tRH3#‚o$,
)=4J,I’Qˆq„F„m‚       $4•dnÝbwqE2)K$ "˜RD“P¥gw„Xq‰h2ƒhoˆ);SO7;v†uŽM’%$B
„lƒ(Gˆ7¸2
'‡Q
‚{Š&
F$H„<oœ„?3/Œ        =„'8^1z      5&
Te'‹F(3K_
6‰Mƒ      .ƒC…cƒˆ<$fx>Š~s0ƒi42„'
                     ?I
1Š2´p†mƒg        S…L–\”k\ˆ\7ƒ
†wŠ'$ ,ƒ<‚
%‚Yƒ(P1…Z„g‚@$ˆmE‚Qb„{†VFŠœ…ƒ9-I‚'Ó|‚N=A‡AIŠ!Eb(¢R 7ƒ)'ƒ[…v
88„hƒA›I„'Z?†M’5
'„/hƒžŽþƒZ4¾0z5!ƒwqE2)‡†i—=$‹T˜RD“P¥gwK%Lg
Ao));SO3;v„X‡J7
$B‡bý$&žz&&Õtc'¾C   O.]¶‚eüƒ—%¾I`x>1s0ƒi4‡] @'
                
3I*1Ÿ 
hÕz†        S‡„>—8w‡gC7ƒ
„/$ ,ƒ<R%‚Y*P1‚Ÿ—1EP
ƒ5
‚F:—-(ƒ9-ItEžd
`=—6
;E—8Ÿ#~‡l 7‚e'
8®}‰U„'Z„

    [
'
ƒhŸ<foˆŽ
teen‚„RhYu„„$‚\ƒpÇ\ˆž©‰$–×,b¤ŽQBi‚b…0jˆbgur0›QT#ƒ05‚%
ƒ
‘jŠLƒ‹K      ˆ7
`/‚ Upadm3K‚A}gIk‚m+GA‚"4^‚Œ 
‚x4…H¬Lƒ1„     ‰mŽK±.
C2‚0½[95‚%,¯ ô‚eú)åC.bU|fa/'3K:A}-IxY9G:M„nüx

G4§ŒÝBl)1! s‚)†<†A3H‚d#
\R)‰2$3p=y†0
V
 -ˆ'1L
A%•£t
L
A%e‚q'†b#„#
‹]ˆ(*2(d

{" $Iœl       ‚"‡AsZŽ(,o*?=S
/3NO&f
)) <
."" !
#C
F!B        :
$!(3
|)$-

"‚!*Q6ƒ@1       '
ƒlCK'*,.8X d%2/(

               SK1-2%f?--

&.u 

e†‚FVƒ        }
""ŸV˜€€€:¿0ÒP5<$ 04=%u09xE&ƒ7/!,Bq 
(
  Od3ŽxB;ƒr ƒh„   D‚„R‚&=%>  !
     Š:
‚| 7(Rzy      
T‚      ,
>Bp^2d

5„(‚Q
$   e7

/(
Xf"=8ƒl9`A4$GG‚y'"…_ƒ"9:‚.</)‹e?a…xŠ,…<-,<2R=ƒNƒs
T†^‰p‡-¦0¢."M7Sˆ]‰
[]V"'Rˆ_*
      'nqpA
%3&+&Z‚…TŒfˆw†„nœ
‘&…c‰, ‡b‘    ‡`ƒ
,1Y/!4)WMAh.Z‚% ‚r*‚7 >              "
//*6   p.2;$Âo‰G‘@NN‰;V#+&7%$I$$/"5 &!bT$)&o+X+"2S4@       'oƒ)ƒ$t
!'K3&*                  Eh‡EN ?B‡2‡"2#+         
2'l=     =ª}7+g.?‚=6GY`
%/Du
!ƒ:…y>ƒ
8„kMZ
h
Y‚D^ $cV†    ƒt‚NXr8‚/'‡h‡nƒ‚#ƒa       
  H‡$"!‚'io‚TI„U…PLv‚!„@dlX„X;ƒ‚}3)Z”R'dS"/b‚*
…w]FCE†VX

*7†#E"‡M%SR
Eg+„=
45$¦jR    #
h"~D'/)(3n      ,#]"e‚2
 2z       Q\,,‡nLNM
    ‚nl4!0L716!$‚FV#…ƒ,‚@(;"_.,9
‚i
  91q+.4u!  O
VFrMZo‰=<    Q3P]Wc]Wƒ$O
<"6
‰Jq(‚xƒo1 =.bV)2-/,.D,‚GH

%Š'‚:
 B$      0S'‚].?WlJ.9
ŽS8‚,†B,›Ml$!79„e

/8ƒ`1&…/Ae       $ 2<![
3RJ?%4
@
#
7

.,GE
Y--*#%+       !   m8MX +.*C\
!24#"            )6R
6

V      &&

*d„B/4E<3
M‚"
;

"p. 
+(
# ‚EGWM ,b
D=3;vd9‚p"T„8‚g-#;ƒipx     3O        

?/%
+  *:5>-)

$@"J(?(!D?Fe/%LdWc
&MoŽ
1„
4E

:S@<
‚`:‚"JWNˆ„kT‹†\„.•uO…@Œ#‚=-
’Š4…@Š#/IŒ:Y‰i4‚g,$    F 9O(+Gƒ  ‚Hs
>
R$& $‚*9        6‚Tw'@M$1!)Bwe‚G 

   ,8&!<A
'A,%U
:2$O$7‚}$ cn‚

4+$^&f&&      
%
2
   %b
2
/‚3      ;d„W97:U    
%! "!9)
/.d^hB?'U?62;Y
F        Eq1
(
%‰DU:r5>^b‚.  
D+
Eƒr‚)c
—ic @V…D‡Uˆ3„)3/%uQ†C!0?=,1 &       %!C               ƒ+      -‚
   <
      +      
        
-    ',5      
 5  
ZD*        
W
ih AS'3Cx‚%2#‚IIn
Gr  P&Y‚ƒk,8F             V "H[8#L0‚D
        
)
0gw      5‚.ƒ$G]V}Re15l".D YH".#Tc6/E
&%Q^0_rm‚t‚
ƒ?ƒ;aO            Vi7ƒ,…2J#.‡ƒY†0t      C:Hl       -ƒjF[ƒ`\‚Œg       „<@U†}B "fk,_‚&8'T‚05…m'P‚P
(      …T='Z)Hd…z…oˆ""Z9‹, 
ƒ
1:ƒ;G8Su@ƒ8M78†
d‚   ‚    F      (9'! \ %P1%E;!'  +"
aƒJe‚‚D‚
’?ƒ=šB•b[ƒ–b‹J…|jƒaD‚&„‚B
,
…(-X#4yJ‚A
1M6‚50Z‚(‘B‚lH   >5BOw'                $%
Žc|aJ
?4
2:" 
4>6X      EB8!'m2!n        /n+(
        !%Uf)[j†:             F(  O
<&HB.ŠW
‚=f[gKN
‚r
)
c&‚3P*L233[v8Y.T/       {‚9EQ)'‚"l
-G5 _.C‚J    
""- (90k7
2
M‚)C!+/F5V!kr+>  e‚&-"…KH/c#;}Cpcƒ
…
„J„!ƒ93      Z
O        ;       g|22~MM2a}‚fBAA" \;
+4&*„L0‚K J3-]‚gq‚
.3     
%     !/D                   .  

(3^%$
%++
x'„

LTV'6.5PƒR       V4?>2B
#
W‚z
9       -$<Z;Žöt‚       ,>
B&^2[

5g(
$   X8
/(
Xf
"=8_9A4$‡YE‡hC‡h‚w'"L‡h7S
T
!!ŸW˜€€€;¿2Îm¸…‡f?/‚~‡<"M7S„=2
[]"‡"MIFJ"ˆw†„nœ
‘&…c‰,    ‡b‘    ‡`ƒ
J
* ‡`     "
"/*6 p
2;$ ‡ƒ6ƒBP$00LÆ$
!l*2 =ª}7+g.?‚=—6<o‡f}7N
h
Y
8,^C$BV2‡_    ƒt0QXr8‚/'‡h]ƒ‚#2‚F    
  H‡$"!‚'iTI„U…PJh‚!%d^XV
$;3),
'‡H8"‡f,b‚*N
L]®oc§#
C"D'/)e(3P1        ‡b#
"ZO
¶VMM‡—(‚p ‡b;.b)2-%‡f
%6,#

‡ƒ—6?V
8Ÿ
7        
/8/&*„ Ae     $ 2<;
3J%

@
#
   
.,G        
8$-*#%+  !   /MX +

!24#   )
R
6
V      &u


*da-4Eo3

%‚"
 

"p. 
+(
# <AWM"
D=3;¦Z
‚e
#;1#KC‡w ‡X/*‡e24¶W 
      WN_‚}—A‡^>J     >
R$&     $‚*
     61wJ"

4
$+$^&f&
%<
2
*%b
2
/.       ;E0W97:
       
*%! "!9
/.d     ^‡\
YH*=%
6( ;Y
F        Eq)1H/DU‡e5^bq     
D+
E—‚¦~>VN6
)‡\/%RQ‡D%0?=Ÿ
A             >  &‡f
       <
+

0       
-   ',$,
 5  
      ZD*    
We ,S'3Cx‚%c      #‚IIn
G 6  P&Y‡Z*
K #
(6/

?%Q^0gDH‚
ƒ?A*B               Vi#,  .0    C:H$#   -‚ /Fn‚'ƒ          <@
L   zB "fCžX
1‡gD8Suƒ8n78
:‡kU=2  Ÿ_‚:<F‚B
,
…(-X#4yJ‚A
1M6‡c/50Z‡l‡_E    (>5B0Ow'         $%
ƒaJ
4
2" 
>6
K     <8!'c2!=    /$
+(
        !%4
)
j0?          F
 
<{B.
0=f[KN


)—
*

33v8Y.T/ {]EQ'‚
l‡a„-‡T3 .,‡f    
"-(90    7
2
)!F)!5.
 e‚&-""…EH/c#;}Zpc‚X
Cƒ3  @,
O  ;       g|22~MG2a}BA"       W
+4&*L-2              
%     !D                 &   

)(%2%,      
%      ++
c‚N
(+0'm5' $lL>B
Q‡H{Ÿ_$<Z—790file1ƒº

<
 —ÌN‚2

<
e2ļ

=—ÌN‚3

=3ļ
 

G—ÌN‚4
 

Gcontrol‚9EUdX?‚%žJ+
""ŸV˜€€€<¿0¸KLwu4™9”Jžu"†9™^ƒu‡=  ‰øFƒXƒ-2‚‰U?     {ŒDa‚*0file_objectP<ctrlƒ„K‡9—¼7‚&ifƒ¸`—Ìoƒ¡=ž$—Ì2jlikƒ¸y—Ì*namƒv7
"-PN1"
     #(!5  +‚D ‹Q

ƒ    
ŒJ(
F
‚>R'

!                )ƒ?\a       /…}‚E3¤AD?F
Šl<e
4#      5(%9*h6,ŠZª'!   †H
Vˆ^2U

'(9ŽN/     ‚8U
Kf
x,p
„   ¦44Q#‚£Jo…`‡h
¨@*ŠV!†J†zF&B   !
#/R
O[
!‚A2‹&`Y‹J
0ƒH“'„d‹dƒ&   ˆ(™%_‚dƒ 
KR-_ 0'ƒR…ˆa…6f–G¶
¤‚s‡‡-'!     ®‚ÕuT9õv,å!4#i‚¦m.|7—0#  !
#|/R

O[
!
gÃ&iÎ
hƒw      O
_[—1 
K}‡„)Ÿ
B'
‚jN e_databas1
0V
journ]
1W
w 

2Ys‚VÁK‹-_of_checkinƒ‚˜ÁystemƒQT‡u‹%2‡ƒ
ƒ1
%"6‚fg
c1#!ƒ„’"Šw± ›~o02'…;‹q\;     
ˆ62ŠŠB‚J/ƒ]ˆm„oRƒw‚+‚<§:Œ   k_1„+(z<&&„0ƒx…‹°p—k:d‚}‡PŠ>>%‚(
R‚Z„ZfY¸>ˆNe
•„‚W4,6‰-'0P&        
-‚Fê0‚P
‚n&†p
„YŠG…Žö0‚
 ‡9ï9§    B02'…;P)\;õJœ¾@‚‚+‚<ƒdZ1ƒ+(<<&T‚Â|r‡l‚<>%—‚/¾‚&®[‡i8LF§C2
aÝ+„®jt6*'0Pn     --—3}-r@žu
.
lnŠF†
›&‰$„R
„)…|‚<2Š=…qƒU…^!œ8
ŒtŠ„t‹\…!‚„)
„9ƒ}£q™†+ˆW;‰#„.‚k£QŠ>V„Šf
ž6 S
I’w˜…y
£/„TœÃ
<»uªkP
ƒ>܇j‚öycŸåH‚Wƒ}R¾4¾…n§ý,
¶>I…—1"¤

%„Bb¶+Nter     „"‚R,†K‚7K{ƒK+2)¢mW
‚32‚X‹‚F;LL·ª>        °'?ÛSrˆ,¬s
‹-†YX’U·A)e2†1‰2†81/+‰>‹VUML‡7Œ+A$L=R½‚T.;L‚7†/>      žm›C'?ÛSrŸ"BFÎc‚ö}
FV”3
PML4A$L)add‚°{Ýœ-n…u
RT†R|
‚p(S.1„‚`,NX„‚ÏE¶

ÿC@
‡T\(
)mƒy‚"Oƒr¥r
*N
h„V—:Ÿ¡?Ÿ7
ƒ+C†Û”9ial‚™A‡ 
‰A„{‰RƒZ
…NŒ=$i"$z„|‚KQ…fb‚/; ‡`&
u
``‚iŽŒL‡œ$*Œ R0…£Už+ƒ‡q…+¤y‚Oš%‡%Ž²¨”¡JÇ‚%ˆe"ˆp‚x…^™
_†XL
"‰        6Š‚£‡_ˆ:…‚%ˆr„t
 _Bƒ"„V‹1ã'0‹—,
†v†G¨]Š]‰u‰…`šBž\ˆ‚?‚‘.‹+’/EŠY‡e*…¦Hœ_»#$”0Ä:~ŒV¨_¦o–‰¥d²'¶[o&¥…^&‡^
R0‚‚&ƒ+ƒ2‡s‡3‚K      ‚p—)|‚²¨Ÿƒl}ü‚L¾9”7Ÿ%¾@#‚®¦‚#Ö‚|‡ƒ?‡ƒM§‚'T‚b,
P‡`y®,‡r—‚g—9Ÿ‡
‚—.‚5‚?4¶„?‡[¶†b—1‚#—u‡„h…EU<ƒC nc‚ŒGi‚ƒ~a:„e‘˜Thd…sD
Ž!ARQ ‡G‚F-ˆ42ˆzƒl„„‹GM†{‚"‡5‡R#0’t†Ð5¥_“o‚…\½pÁw =ˆvW‚ts"†!†ƒ‚5R†"
!!ŸW˜€€€=¿2   ¿pa‚&LK±/u#¦^˜-~Ÿl;‚      žkvƒh‚Vƒ&ŒN†        ƒUŠk‡Xe
ˆvy8Žup
8o‚B        nvR”ˆ1`‚H-†Kˆ4‰=‚T‹PŽ*›f’#ƒI“4Ji‚‰…#>ƒ^:ƒx)Wƒ3gq…!7n`B[„)‚o\Gƒy™!® ƒ††S„&4""ˆzR7@…      }J…"žu±ŒJ…+“b‰%•'
[e4ƒT„\ƒ
ƒaH‚*"Y!‚@ 1…‘F‚kŠRŠE–G¢”‡a”E^"«I(}–o…@“ ‚3“
wOƒT>‰A»¤-a«q05…%„O“b
£ÑL‚l£Aƒ`ƒIŽöb‡^$‚"dO#0—„—‚*(SX©"ÁG

WjpBKsOu#„3‚~;‡@7
v‡ƒlƒ&Î!IE
Q
‚
yX
p
fXz        
LvR{czx‚E]GPdTIv”/_‡i3®l—cS9Ÿ‚S‡h
‚
)<
‚93C?d7g`B[X
\G‡‚97žv ‡ƒŸc¶U
2""
bR7O0}J‚Ÿ$$‡\<Ÿ$t‡Pe®‚8
‚X
C?"Y!‚ 1
…—„o‡‚\‡ƒ}
B¶K†^"§N(}¦g_b‡uO   M>®oIŠo‡f§‡xf Ÿ+a—‚.      0findfram‚oŽK‚?n+–°6‚?n+e©H„Bƒ
C      ‚~‹ÙŽy‚o©?‹Q    ËS#„f
Ÿ#8¾C„ƒE«ÆG'rN‚[‡Jfo‚}—†&ialƒƒ<˜¢Qsh"6ƒK<\`-j9!„'‚P‚>’u…86‚Y   ƒ2‚A‚dŽX˜<élœ:7
5!KÁ´4Üf(‰f†~ƒt†r2ŠX+ 8 —:ƒt2–r—†L-R ¶§sug‚B‚R„@ˆÈØJ @‡B„Mƒ½ˆK‡D‚7
5!K—¬8Ÿ‚AƒTôz<ƒäƒ8¶L9Î4(2‡‚~
|‡\Ý`vuÝíseek‚±ÝœIt‚A7D”L…y  ˆ“Ø?Bƒwƒ-=_re!     y('zJ‚y„p
3/a‚„gßv&"¤`†.;rYŠ90&É+¦!–`
ƒ5•v       ÊVƒ

‹5ÅQ¶k‡w&"ƒ†ƒd‚×ý
ÎrÆ‚Ubird…[ $1
„(qfoxu
 dZƒ.L§q1ˆŠ)‚xŽ÷[ÚT„Ñ‚'—3Isaf‚9=wal‚'…=‘þ5ym‚&3warƒ†cst
ƒ~†BJ„ƒ.…d&‚~X&‚Y,v+W2p‡n9…J<&t&šuG  5„2S<:&…2&ƒ
‚}JJ8„B"„V‚„$8ƒ„
…Tlg‚O_E*N„u>pƒbA"‹e Hi!…‚']U„h‚>Pe'
}
Z
{ƒ2Nl$B‚ V\&T.2"_2La&H%f…‚!R ‚‚DA1yW3
0‚ _;W
!Y(
%
p)u      ‚7<t„W;„2K‚?~>
<(2f‚G‚I‡W3uA‚L…~xnˆ,\1Zp@^‚2‚QhM
8
O
      hLO     ‚9†H^–PIHi9”_†O…'‚C">Œ‡^p„2h‰wbƒY 4‡‡,Kƒ>af‚x`E†)#†.„j—b  ƒ #“ƒƒP‚n+;6!6;
/&+!a$=!.†‘RZƒkƒD{Pj
        E/
2‚
…Nƒ“C"„)
tŠ,x‚2†V‘P,…a‚l„0:.‚uƒo"ˆfO/„"‚{2„;‚S]a]‰V‚;ˆ‚Nvƒƒ‰cŽT …oypy‚ ‰\‹Y‹nu/…'‚g‚l
  ;‚|ƒ3…p9&‚NŽrM\‚~]„
„l†#‚M‘
‚‹•X‚‰‹
CŽ{‚F…fQŒ|£T4‡@
X;;„_‰`ˆƒiƒ&†‚I_C†v‚5„B‚2‚tŸ  P†V‡Uˆ‡CfƒKƒW„|)ƒE…e‚Y…l..‚ouBFm†„ƒ‡’,.…}„u‚`ƒ/l‚M/‚,†iR…/`„>O4‡!      jƒ0‚K†ˆU‰Fˆ.‰
ƒƒ6Aƒ-)‰i`…8‡:_rƒ]…u%‚z‡g…R_‚‚v_‚N…+N%ˆˆ8‚j‚u
O†‚u_Š];y24‚IYE‰Š-‚*@}‚> D1O‚*4‡L† DI[ˆ>o#c‚TŠN„a…eŠuƒy‰5ŒW…“h‚†)Š-ƒ|‹J4X‚(‚,ˆg…Y„DgˆŠ M ‚Wƒi†OcB‚0ŒW‚ZGƒ…G‚#
LWƒEo„J-H„$’R…>‚j‚xS„EƒA‚‰Q(ƒ&7P [       
!!ŸW˜€€€>¿2É„)Š~‚g8„CŽgu‚)‡$zŽJˆ‚Oƒ†X…x‹Tˆ„e…z‚:%#.†B5"ƒj…pcn†z‚
2b„<iePˆ
6ƒP„[†OCc‰KB…!+W"†#Bƒ]F;„J-ƒ*]P…f‡!H}TŠN‚8S„Rƒypt‚!„d‹…+ƒu‰N'o8[h&f‡„2""       Ž!„U„c‚z’D„‡
ƒ\‚„e„o‡,Žˆj‚-‚  ƒv…Z@‚†<JA„F™ƒ\AR:ƒŒMi‚9‹(i<œ’3‚gC”`0ŽG /sm‡8†I|‡{…U„|>—A"Iƒ(…5ƒ /9Y
ƒ%„}ƒ/†hŠb„6‡Bˆu?*3†GŠ;…qƒi†cƒ[ ƒfn+~ˆZW‰cˆ"‚:)KZi
[M`ƒ"<-F#†@!‚V‚F5‚p{…†/9ŠŠ#  %9  %3l„e‚:-G\ƒ}ƒT‚„šp…„v
\7)„n„hŽö
^
%IHi
$‡M8-—7^ 4‚"O
‚OK!‡X‚t`E.
 #s/:
p     [#        
‚u‚^‚N+;666;
/&+!a$=6!.…!Q%x@16>Pj
        E/
2‚
O*‡.‚h"‡f[SpƒT‚2†V‘P,…a‚l„0:.‚uƒo"ˆfO/„"‚{2„;‚S]a]‰V‚;ˆI
5‡‚;‡i.ƒeK=T
. $dypy(„…b~
ƒFuƒ/!‚'
       ;]ƒ3…p9‡A      
M]~‡US—8/¶Vu(<—6,6‡^
…Q‡<ŒXN
X
3;‚$V*‡G‡HP‚JN
(Æ)¾<,®rb‡}l Q.~R—8
K/@M
#    PKŸ‚‡jES

AK
[‡ƒV:        Tƒ
%a_‚VR[‚2
.%žv6‡h
R$—gu"*;‡Xg       ¶ YE‚4-‚*4}‚> D1‡aOa7‡#DI[do#c‚TP-‡%Y3L
+ML
LGO'6<—7‡/
-H—=R@‚j‚xSE‚‡[R6„k‡c‡'‚)
„Q‚
z‚!
‡(Tn‚H`‚:%#.„v5"
c#…V<2b‡G4MP§
‡hl
RCc…KB!+W—)Q…f‚k
2T‚
SpIpy D        
‚2'žY!‡g
&d‡d‡ƒyv—ƒ"TD†I‡d‡‚\&|‡f
‚]"p5H/9YU
;K‚m     X—
‡a*ƒG
wy‚%‚6‚B@
‚
+4

}c.ˆ‚:)KZi
[M`ƒ" -F#)!Exq{„9ƒ;Z     %
%    ( L-G\‚Zb_[‡I
0first_nam‚
ŠsÚG
)valu‚U˜$„Mƒ7D”å<„Mƒ7DlogƒˆKwƒnam‚X…!&l              ”ün!&l              tž‡
‹%‚!
z†P-@[’h± ·
z‘³‚Zƒ
œu¢i‡’L’l•( ‡|*„#[M†h±4µ‚9ˆ‰.‡‚§BoU-@Õ¯U§ŒY‚ßbÃvÕv
Z¶YÕ‡kíx
‚CCIa|#[M"†GveC   !'…h†_„zº½!ƒƒ0%
ƒ3b      ³e<+I›yV‰=ŸZ]
>‹ƒK‚4…9r….•¸O Šy<T
<1Šsµ7‘>Žþj¶‚‡~&‚M‡ƒ—;
%Ÿ@üc‰<<+—‚ïTÖ5F‡.
>—nÕyŸ*
fO    ¾‚=
ƒcTÎ:åL—\x.‹]ˆ3¥}EMh†ŽA„.t…r®,»/ˆ*†M,ù‡i
7‚_‚[CC>‚‡g„Bš¨q‡Cg]pƒƒ#‚%-’i?HZ‚‚…>A‚}–Š@¤ Z…J†1.
c‚Q^(#  5K*&=h171Y
E,@!QtM1^'_(a}65aA 
 O1‚95~1lyu^$HP
„;Ɖn•ƒG{!‚hGd,2/_z)^G:k
YH‚UI+*t=%]D4‡\"[.*>
B\7Qw„OIY‚{t‚ƒ‚[HF~ƒM    44->&0["QzxF-}4"n-lon34Sl‚w(tWN-)(Y"KV#$+JS)G&a9W"`#@H3‚/^92J‚E2‚D.E‹f…t'˜_a{6Ç†N£tlˆ‚Œ‚xŠ"‡‘*ƒ”b‹7&ƒ-˜‚pk5xxƒ^
[‚'”%%‚‚r
""ŸV˜€€€?¿0¦u
¾y…Ržk
XZM,‡.¦lŒl7‚_‚[CC>ÕŽ˜V
…{gSP5
'‚-‡
5H‡f
W‚U>bMfÃ&X—‚L—:[®ƒ00D¶,utåG2EÝ‚3 —2
H6íH®=®ri‡$¶‚`@†mECŸ‚_XUca‚/0fkc‚+±Q’OS‚a2܇™i
s2check‚±5Ýœgounter‚±wÝ)ifzero‚²!ÝSlag„^ƒlo _aM/
-
>" &#oZUB‚@!
4
ƒ#0‚jH*"‚|
/    
%$ƒ%\
)
Œb
(Uai=!?‚\_#-‰QK
A‚M„ …!
&ÑP&‰6£,†„co‡!‚42b„•(‰k„Jp
†‹C‚S… ’k„’†=CƒC„H‹(ˆ¼L9
"¥P‚C‡0…›c£4·o4
„b> 
(±xQ
ƒF
6@…,X†‰6LM4‰lƒz
#Z
‚
…^ŠT†?H
„5|Œf0&†2      
B
¨R>Ÿ$ˆW, ‡S…VƒCH[ƒ+š
i‰ZL”T…3*AL#      
”2‚”       ‰F    
‚‡(D‚/+†/NO+      ),
=&¤‚½MI&ƒa‚'ƒ    „co 
!YTI
\„|‰k„Jp
†‹C‚S… ’k„’†=CƒC„H‹(ˆŸ%„9
RífQDM…3‡m.¦dVK
§Òx
r|Ÿ
1H¾1
ŒEUÕ‚
‚~ƒCH[
v+R
‡Eg®§



#   
mìg/A-
3N!+(      ),
=&¶‰`¦s3int‚³$rant‚ju–‰'ssh‚CxZ
”I¬|
‹.
0“WNl=Z“Ø-Z
/Ë
ƒ,
‚      N=3t‚±•òsten
.‚ 
œV“E
$(*¯ OI(P>‚,„u†O‹9l•›nƒ6
$(Ö NI(P>‚‚OœHlvorœŽ÷L[w‚ž! 
ƒ{lessli‚²9ex‚…
ibl¥r‘8L8       ‚]n"9",,     ‡Z.k:&"‚.gA4`ˆfƒJ‹†e˜JŽ]‘Œ=
µ3¶X6E0=9`",      L.:&í#.gA4%¤‚×=”;Ÿ]ÂG¾!ight‚.
uƒ.p¥Z‚Œ69–;”–ƒ¥b7Ýqpantli‚ˆ ‘˜‚roa‹¶Qvt„g…1‡2•S1‚Y$ ƒl‚%)•jp *(1‚
ƒR<$
T_ˆ;      / f†,7:
#‚~ƒs‚0ÁLžK‡+…Dj„?ˆÇ²;F':      J/‚K
Y"$#r…V—  Œ;!7y
ƒz‡vŠT3–eB
„]†L™D‚U,‰nyz¹Y†l
‚3‚eƒnQµ;ƒ,7:
#

§V%³žKN‚=—/õ%Š[=®N":
 /P

"   $#‚ßP
&y
¾Q3³N9»?
}%,
%z¶‚&eer‚‚ck‚´%ùa‰|od‚„*‘˜r%1Y‚/rida‚‹-“Ñrw‚“x•êdchart‚I
˜/uctuat‚ŠLZ“؈j„‹8ent‚Š`…G”õ
)shgM0&'(3
Ž„h›,^‡)

Œa<
!‚8†OƒZ‚J‚!2&†GD@‚X‹‰%„]‘*el!ƒ\Ž7†:˜n…WT”Z‹|ß‘
“Ø-…G

<
!8\c"
4 &QD@uIÊ,³_.ÝŽ®or—=<     ž

filebuff…xƒ{@É4/%˜=”3‰q…Z‘6Ž÷ƒ1„áW
/%ƒÜŽ?®m
…Qy¶a-x‚Œ&ÚH3y‚ˆ}
×J
‡y=ª!Pù
“
†…No‚‘'cu’s‚ÊC‚0ˆ*„ðW½t‘j"
A•Ò1u³[qFõps‚—I
ƒ2C
ƒ‹1
ƉqŽ=‘ˆ%„Éld#1r(Q ËF¨ƒY      ƒR‹r2&
0
“G
½@µQ
L‡g-¾…i{ƒYÝJ  /&
‚ö~
8„ªn
9er<,.ƒ4ˆXdy‚h0„=$‚:p:
K?
  ŸX˜€€€@¿4ÒA‚“†Zsh

ƒ`Š/       †$
L@Žþ\?†œ}h
‚È~$
Lõ>0folk‚½5‡lowQpA|‚e
ƒDFz,†
8-‚\‚?<ld=%‚+s…‹L.ƒay‚S…(‡88DHZ!1‚;%‡a‰ƒx_)ƒ5‚MƒSI„9*†f,0d]C>1h,k-L`2yBnE‚5…4xA‚Vƒ7‚+‡1
F‚{:‚5&…x4Uk(†%^‚1TY‚8#‚9\6"O<E‚Uƒ'
0ix
y
]Q%=W… ‹XƒL‚ZyQ„^‚O†m‚KH+xke†…P$‚RW‚_ mƒ‚pG„„Q Šw‚<1†}ˆU…p„:‡‚wK&…,^o‚4ƒ4:mƒW‚5;SX.ƒJ‡v!‡9…G.†ˆQW_‚{0>„T„10„‚4j†I‚e‚ƒL…‚r=0aJ5ƒX2ƒ‚„E…ƒL‚XW2=8-Y%B|
chq3Q‰O‡:l}ƒ#P„<ƒ       ‚
HŠ7…RAg.‚)L†x‚F.%12‚‚S    „Jƒb)18ƒ
‚‚&xw†;o‚‚oJƒ+„ƒJL‚LŠPZ‡(‰a•_b…A‡(ƒQHŠ
i†iƒY‚G4ˆQ†S‚v„9†ƒm‚}O"‚Hƒk…J‚‚S}RI‚rQ0n'g‚ƒP9s_o1wƒF9‚'aƒ‚I‚Oˆ+ „DF+‰GpŠd(@‡KH>‚D‚…otƒ5B:GWo‚9#%H0…Xh"$ƒip`†HƒG†LxƒQ^†E=…    ‡#ƒ‚Ch„E‚2ƒW7IN²%#`‚l†ƒ9&0hgŸz†3›Ai‚CW‚m!nY$†„i:g‚o…n…'‹gg
kƒw‚{ˆ#ŒSs4†.ŠcEsB'‚C‚ƒƒn‚‚.|‡.ˆ=f’>‰
$‡‚‚=(‰-„vv‡\‡i„o;s‚!U†%„Pƒ6…iƒ#‚4„Sƒ‚L…
…ˆq‚ }†x*‚.ƒIƒd„$…FD‰>(‡g˜!‡T„H#‡`Ž}x"1D„1…=~‚@n2a#‚g(„%2M ‚7pˆI/Oƒ]:j‚ƒ,ƒ‚/,,„P‰Z‚ ƒ3ƒ…`†:‚M‚K8Lq4F7d‚SS^9$>v>‚
†+$"L‚N‚…dY:…5$ ‚©6“>“W›U
…Z}‰l
†\S‡M„: Š7…Z_K…H3‚ ‹R†=‡C|+!‚KV*„|cgƒ{…ƒƒ%
VEp‘‰ ‚F:QCkMƒy‚„}‚K‚:%Fmˆo*@q„1X}„C„l-ƒ|ƒ†3ŸX‚       Fj‚,‹,ƒB_„OŒ…C‹<ˆh„36!2‡B/ƒNƒq
H‚j
E$ƒI…
f…Q‚C/„O„Fƒtaƒ †"†Sh‚*ƒf‡A‚+<9„s„H"?…p]<*4:„…6~B…-%z.uƒ("„"<…Lˆf8Y‚ƒ&†J…1‡P„6„;0‚5‚    P
‚M?he‹+†9„‚{‹C)+“–sJ-K”W
‹R%)Œ?LŽ\Ž¸v+Ž„t\$‚s-Y2g…:„m‚,RVB…D† ‰#‰0Œ4„#…LbQ )bC‚l‚qƒXR‚v‹7„S‚btM(„Œˆ/ˆL#ƒIT„'†@:&ƒ„‘i‰y+c„>Y‚X%†Z:ƒ2!‚!.„U3pUB‚mH‚I?rƒq=‚L‚‚B2G„yu._:~WMAƒ   %‚
w‚fyU@8I<„T-–gƒƒƒ
>Š(7„__Žöw0‚<P)A‡\$Z
'K$V
^‡fg‚J0
#_FJ31
C‡V
ƒLC
0J52k
c?
-j[Xu2&8-Y%B*
(jq3QN{l}‚#Pƒ5‚
HŠ‚vAg.)8‚>*N.%12‚‚S  <)1‡
k
‚x[o!
*ƒ+‡N4H†Z‡(‰a•_b…A‡(ƒQHŠ
i†iƒY‚GP‡c3‡eT‚[M‚}O99H‚J…J‚
‚-}
I‚/5Q0n'%‚ƒP9E_o1wƒF9‚'a‚1‚I
'O"+ ƒDF+
E9Ad(@KH>DD‚LV"G1oN#%H0…Xh"‡B$e‚`+v‡Tƒ—8
‚®o
²%‡qK —0
g&‡cg9†i‚CW!nYH:7:gQ^=)i;6‡d$‡h5OŸ"(‡¶W
!MSŸ$%:*P‡‚k—7‚)cŸr‡g
.9D
wD
‡†mE‚x}j¦`#=(f2JK‡t7=P#
/O‡Y=‡e8_®r
p
@ƒ`!V‡W#
$L
]4F‡]‚N^9L>v>‚ƒ?$"Lw7…dY,:„%$ `<}‡b5KZ
""ŸV˜€€€A¿0Ëd•;e
_=s|+!V‡VJ
m"‡gg
0—8<D‚F‡_CkMƒyR„N%Fm‡+*1‡bY
5X}‚&„
>-K‚I3B‡NhE
z_lBO†P…16ƒ"6!2 ""v‡Gr‡"E—<efQ‚C/@
„F‡^ L</H
9„'Z
X?ƒXcƒ$5*4:ž8‡fE-‡h‡b'0q  —7

‚M?T‰&\$‚s‡cFW
2‡d2
‡`?q
N#Irv/Q )*"3YRk     X—
3‚bM‡az8`
#<TL~‡T‡;
+ˆ++c„>Y‚X%‚:+!‚!AK*pC67H‚I?*]C=Rq
i2G‚u._:    WMz'%x(U8IQB‡0foolish‚Ï_“Ù%1tƒ‰b‡s—ã…B‚ker~‡R,š+Ž½l…[,å˜
†ãprint¥J„„^À7Ž  "
T-…&ŸA
“fñpaŒMû}güƒy
NŽpen‚+
V‰I‚xH—ãp`r3wd46Er'p3*MKyBA8qPQR( 2e$‚RA<0V5ZE

0)}    P[0P
$JQƒ.1!V,4!_Ab‚/        &       
2‚g3,(
‚a0cMW.
‚S‚~AXY-‚{k%T8B.
 !7+-&2ƒ-3

HH!P5F‚,M‚#T*(KDf"nF"g4q>Z8-!&E
    a  ‚&GA/Mc„~‚jCGjm+H?DgR‚'A:(‚k&x_
F$/ ;(       t
A‚:ƒ<     Ir‚)SF68'G: '`rx
*y8o‚6!'…hDƒj‚O…'<ƒ+P„'4
ƒT!
#O;kx‚fx,64…ƒE‚:e#!(x+K1#rY
\_V(5$:6Zg :A
}f†F‚`‚+d?!6*63 T*7
E
'?
       RV
1:b~$      Dv/
 3&"G~
`Fr@#!+'2&:$
:
 FX ,w/
b #,
      
:#]
60>VE4RA;$">{*aOpf
KUP3F#
 'W,d8
r)@$N$<b$&cY
-=0
$0"6
‚9<-4:2)   #"       (‚KJ
       R!
B**K:    
!l‚NVS b( ‚$V
7/|$2b7‚|.]f‚R‚$0a
6D"nƒwIMF0Y
J!
Z       &
e6P7ƒ6m($"7i %0G-Ll   +s @lNQhA
K@P/‚(<^kJX"DSJ$
‚fxlOh~S'&
        %   =‚)P
    H8;
'!ƒvh
G(3-
D:k!F<‚;:jUe     (
ƒa(=C^8+w()M\SCV'pƒ‚`7a

Fh"8f<4(4‚2C1‚";
xAe Wl‡k'%0z;!*oZ+.| #5+-j
K"Q#D[, ‚-\&Mz+!‚;ev‚fXM‚W=#3T4)†m?Ci.Hq 7&;.:PO‚O    1>*%$5_8I3&guJ3.7,%yQ
P‚:($LA+/n.>jl| 
85…K&!-$‚4NU;J„,h fA_f
c6‚2$„zƒ&2vWYd&&„5.vN;>
6:'A;fBS!C‚6_-~)'%DRGAb  ]3'*‚4V ƒQ$h)]2‰W%)3$1Aa       '#$5lL„(*)
}
_@1[„Cv‚&5 7;DB@s547$       
|pKW?\8zm‚'#rY|o‚OXEyMv‚UJjƒIM
‚.‚fPd
#+b‚r .Hik?ft;ƒ7Jvfc        (3O#"I:nb…M'89‚zx@1,up‚y‚&(d4}

zFK-#&]1O>4CY#8"*9h1%X$_<*@‚     ^k!t
<jSB8 AT)*:@oCmd>:F*G9FvE$‚+OV6‚o FˆB0
5NS0G}(‚d*‚U$`Xz* >-      ˆB*    \"+3r"†p%C6`NXˆs…_^%‚/%}‚K3ƒ[X=>-‚?is
‚EznF…V'‚"0(9O"*f‚8x„gTL~)2M
x,9‚~‡BD‚7,$F      }‚'^)‚D"/zT6
_ƒ:~‚=:j##5‚[?'r
‡S5n&
""ŸV˜€€€B¿0Ò$‚‚e‚+,       z|#„VsUa'FYhkY
jz?J9I@
(
‚7B;s ƒL80##o&^F|2D#,b0n
"CA
_[x=+‚GWoTƒuG9L.6O>4B<&:)Vl
#%#‚V; =f2CEb=*KiK8ug?,}#‚2*A xyJ!5h‚D‚.[&*x1}t@
|qG~\lB|IBP~u"Pƒ_"„BG,DA‚EKFR@+]77m‚!
t
‚*U/
aF|ƒ    


‚@S‚M„ Y„1V             7(
N\(
L1h18v;‚O".  dv†G%]5M(@OOo?‚l‚
|:>":#92q>
X
‚eH1Sa‚>‚,‚a
N|)@ !
EQ<gj)psFgL6‚I)VvAƒB@v7}#vR$RpBª1‚P*5J‚
G ,<>x5ƒ'3G‚'k\_z5HE*Fn "?‚    >5&H2Zs)`<|&M.y.OKA7[‚->4nI‚YƒC)‚pS'8L‚jƒ!5dmG3J‚}&.65f dK+7@KN.-E[A
"E&P:1B#b*W#hOJmKOSmJ1k_:.J^‚3SWp])‚
j‚    ip<%
:8=<,‚?1%~#%-E*~&*%h#i( ‚<uS5E‚-' \‚;8‚Oƒ"hF'5!O.<„‚0b
>)%3
6‚hRel
&U()      
E= "6.‚naW‚'‚
lf      ~PB†$
.D1EHJ}j9ƒ*\UR2Q^
I'Q}'     
n`KzbvJ/u;‚(lt#mD

0_ƒYz[8‚
‚ zW|0|*j^~
h
m^C`40ƒ„e9Enb:‚5ƒZ4>‚2A_Z
‚+
)‚$
#JX$\>%bo0.PyC
C8…+K‡TS9bs‚‚*st‚  G]|e[‚PI(+
?5vHxYFOO6‚C6P&O&X"+\:(
bD#V<?B _‚=c|5$b2 
^@'.‚=ƒ#C[
!*l‚v‚L}`
      #=
H&1‚!UnWvƒ
a‚d*(9     ‚n&26z#c>>P
$R'874M)D8'874M)D‚X1BGu(!r"
'},e|-5%;‚N4*T?&/<9>‚a%jv#&>W&a)!n:MBcR
}V_Y8-oM
8n&`u*(I2T2‚H
2G        7!qƒ?MkJabR.6B_ v/>j$.d    
'gKC!\8Fkvb;-_>37%!C[+~4;Lv|Z|#/    ;!&"hoX $E
W+#Z
"1Iw
P:Mm0_s2Bu%
2"5;Vd‚<
7)‚7te<+%+$‚G)/;6 0bNex?7ƒ3‚978LLE%‚O#
4>‚89:ƒ%7U/
>*‚ZIkO,25homHwG<>;1u‰Y…!2.vƒ9F',Aƒ=‚#„ƒƒiT…l
‚"…DTƒBA‚KL!cQ,3!HF-NH"SR6(*ƒ13ƒ‚k V"q?.*o&5W]ƒF_O0sOƒ
5rT‚
y„;'qf]
:&*d&pjDn<
 O!‚';/ƒ   ‚7‚X<@,W^.<#S=#A!-:NW)D!0        O:B+‚mjz @
E9l
I‚1f`Z~Jn(#O5IhPQ‚J8&_S4[
             M1‚w`K=6@Ty-
`
d')
!
O:      
W$ !0*h<;[‚Kƒ>[-H*a‚r      (!'~6cO
}2N<1!
2r5ƒ.‚‚hw
‚‚c2%06\GH(7".9ƒ.R@
U(_1=kt
<    #`
t#r2AQ4"+@I);f#gs=p:‚6MKD#V)>{…i\/,n\‚lK:"qD62i?'7
Y}H
h-rj
AUve8D^'\vv'J z3b(?Lp[I>vN,5pe*F,3=_S.[]/(LMy**_F
!).H        ‚F.gIV       ƒF#8&2;F$>v"|‚LQPzhG
‡ƒc"
H./d
 v1?m\;OQ]     U0

NY
s?„"=ƒC]<‚}hƒ9qo
gƒBf/?7NƒT@MeIR;HYƒEML‚776[‚!^      MaM    Dq!!l4-R.C|69^"RwL|
   E;
KZ1-.3|=2e|_X>,%HT1nG7.K)"$l‡qi"ii/M,N†`*!X0
;!O
DN‚7O
W.w'2+:]'5    :P&Y4
JN‚z‚4S:r6‚;z#;Q0R‚N‚lS
‚Q-,MW"d~mƒ9  D s}0‚h…p44
/DH@.l0?5Sƒw<‚G!(9Ee&dtj$14;<?<w:/J>#        ‚!Jƒ5‚oN8w(HA`dj|
 cJ‚Ktu‚gC8:>‚o5>{Uw]:G*<<S  \kH‚4M‚4*WH9Z‚i,sP‚9%&‚.lf$1|0jV!{
6 …1@A([,h
}‚w\‚":'>m                 sSc!4;Vpm@@
;Rx‚
U2-‚
M?C‚|
)^,@<‚)m&451=r'‚CMX,        &%

cCK
l…‚v6Zb‚0'‚c‚H‚ #k,l‚|c8?ƒA8~>%#ƒƒ P‚*`b '/‚j‚3I'3;Sƒc‚ wiq‚XV@g#3'FB{C&:<EsF7:;6#f)Ry     3E7"‚xl;$&0Q7H     q9ƒ‚5dA8w5N"ZqlV=p?wYr}WyzIMJ‚L7dAi"i!‚9&gbBWL 6P&r
J3^M‚.:i(&:‚3f&    "r$x{.9/
        +
        ]
        >               ]Zi,%-        ‚!((
‚B4cL==„?]|GFYrG,Vd‚1Yv2TY‚s„     „{<‚AJJC:UG‚6
""ŸV˜€€€C¿0Ò~ƒY‚)gN\!‚x;b'1;
[HR
T%gy
JN*y Q …
#4WH4XRcCPP2
-]=‚
<lH,
L2X(Fg_UR
A
Uo
)4B.Ox;    >‚bg.1)ES
"%M‚$IŽ‚'?V0QQƒCQ†.M
‚-‚!Q„MnM_<
ˆ2;‚lQ‚
=
•fT‚aC‘
‚Z/_&Œ
TCŒ
 
c3 
ŽQV‹6U#eO”iUsT>aŽ|j&AlW2Dƒ105‚xPh5//#/!
f[aJJ"#'/4.A‚'(ƒAXi4M^       ',/D?      Vp4cF%5>&‚L%Yx72A5/M"85  _?fQ0n/‚<X?!C?Y^J:‚E

PMQUCgKC72%„]." D:-‚b=Mx4'j;%W! BJ|‚&
‚50)#LJ+&‚L i#iS3‚J8[J*\

r‚J
P
]?'XZ‚`Aq[K,jTO‚<8>^H
pƒk‚BƒF[a#d*‚vR‚5
‚#[=‚Ue9
„V
p(7@huW"e/;4S:1ƒ~uƒ@
 Q#0ƒ-M'‚IX(?YA0

NZ@-Cƒ3]
 "(%q6mH+)2‚f>[Mt‚?
t`/BB‚Z‚/!Y%4,
&KxB2HOH%ƒF+R
!$L^+N1@‚-XoZ  >B"h‚X‚}$ƒ2VS'0‚#J*bj@ L
R$:/%ƒz$#/N+&>\&I     5jvF0„
‚*
'.2‚ƒ.5b‚\*sW„1x6DVz      U4$\5ZS+U&<‚‚5-

#-!) GiD.=B'UM X v'2]:=$kD_)‚D„l(‚&
t(‚#j\t%-0+H
Žös&Mz+!|
<vXM‚W4#,n&?„#C@
0H‡Y 7&;.:
8O"O  1>*%$_8I3&g3.,%eQ
‡{P‚
‡g"LA+/n.&j
)‡e85ƒ0cI93
~6:'A;fBS!Cd6_-)'%R6
u /o3'*V  &]2y%E3
1A(     '#$5lL‡V(&)
}
_@1[
10+
55 I;D
\B@947$h
qpKW1
58,m#
4Y|TXEy5M@R‚UJ
\@M
‚oP9
#+
H2 %
-K?ft$ƒ7Jv6c   (3O#"I:
@b"„b'89rx@1,up
‚&}(d4}
zX2FK-#&]1O>4CY#8"*9
D1%
$$e*-8^k!‡)   <jSB 8AT)*@oCmd>:F*G9FvE$
‚O6‚o‡_
J
'P-U$1=4 -   ˆB*    ‚00"+3r"†p%C6`NXˆs…_^%‚/%}‚K3ƒ[X=>-‚?is
‚EznF…V'‚"0(9O"*f‚8x„gTL~)2M
x,9‚~‡BD‚7,$F      }‚'^)‚DH?S:& 5CI'r
$E
 ‡[(^,       ^W‡cr$a'F
NhLY
jc?J9I@
(
‚7B;s     
80
|>o&^F|2D#,b0b
"CA
:_[A=+WoTN_uG9L.6O>4B<&:)Vl
#%#; =f2FEb=*K
sK8ug ,}#‚2*Avx
)J15
‚$%&*x,
}t@
|qG~\)BIBP~u"P
"TB,DA6^EKFR@+]77m‚!
‡>cU
a*Z&      



S)H(V            7(
Nl‡R

-1h1v$‚O—  :#       92q®o"pBª1‚P*5‡g
A ,<>E'
G‚'H\_ B:v
M.y‡fMKA,[2.
!nI
‚Y
%)‡S  '8L‚5ƒ!ndmG3J‚}&.65f dK+7@KN.-E[A
"E&P:1"B#b*W#hN`OJmKOSmJ1k_:.J^‚3SWp])_X6‚     ip<%
:8=<,‚?1%~#%-E*~
.*%#i(G     ‚<u‚~

5%H'       \Y8<h2'5O.sb

%"
6
Re

i‡C)()       
1= "6‡‚k7W‚
T
(     PB†$‡.51E‡gGA
t]9‡hC‡f,aR'
^-'4Ÿ
^t§q20      G
|[NI‡
!

$59FxY@¶UNVB&u‡f&!"

'—-"9
""ŸV˜€€€D¿0Ò’î
jg
&‡b<W‡g+)!nM‡g
5
GV_Y8-<M
8n&`u
*—1.
     79>J\./>j$.
' K!1Ÿ<)/;6 0
*Ne"‡>7‚:!978
3LEpO#
4>
8
 :$7)/
>  Z,k,2‡fo,
mHwG<>;*d7
92ZOGC'EAqTƒJ‚WT
q
4
&T
@AKLž‡ho?.o5-h$pPj‡f
 
!'';
,L2
O@‡*^.#S‡e;
#A®o@
E9
:
!
&0?`ZCJ(#5IhPQ5&_S41
            M1‚w`K==oX
‡U
&>')
!
O  
W$ !0*hw;[3‚4[-‡]
\‚rL     !'~6O
&2N< 1!
2rAH a‚‚hw
("2%06\GH(7" 9E!)
     
2.g+  
#e2
F‡TV_ *zhG)/K
 A1?\;Q] U0

-?NƒTMyIR
HYrEM4‚7764u!    Ma
TM    ‡\K!!4

R._n6%^"RwL&
       E;
^
Q_IX>,%>T1nG7.‡eF        "$l
‚%i—3
X

;O
1N&O
W.w2+]'5      ,P&Y4
JN‚z#nSk6‚;‡Z#;Q0R‚N‚l
{
EQ-,MWdpm"0        D s}0‚h44I
@.30?5S1wKG!(9EeA&‡tR$1;<?<&J/J># !Jƒ5bN8
A(H `dj

|
 c'b]xC8:>‚S5>JUw:G*<)S        A3H>M‡N(WH-Z,=P‚9%&`.lfh*10j8!{h6 … (@A([,h
}‚p\‚"
2       >m                 1
Ic41Lfm66
;Rx‚
U2-vM?C
U
),@<‡F
^)3‡f45+=r
'HML>/3Olq"6B‡'37‚ T&l‚|48ƒA8~>%#‚n‚2‡Y
8M        C:<E'F7:;6#fR:     3;H*l;$&0Q7H     9"‚)|83
5
^"]SE,=Ib!7
zIJ‚L7-Aii!9&bB$L 63&

3
Y3r:i(!E‚,f
&    
P$sG{.g
+
        
        
I
        
*             oZiž9
Q'*;
[H‡fZT
gge
JN* \ Q …
#4B 4
‡aC
.2
Z
-8f
H
L
X(‡\g_\UR
A

Ro
)4uB—41
,S
"%Mp
      D^105‚xPh5//#/!
f[aJJ"#'/4.A‡d69l‡d4i4+        ',/D
     V\4)F%F5>&V‡_%Y\7"A5/M"85U?An0n/‚<X !C?Y^J:RE

;MAAC'KC7%B." b:g!=Mc"';%W! B,.d
‚50) LJ+&0Z#3638_"*—P%]'XN‚`AqnK,j
MOk>^‡a
H

p‚‚B‚(a
dGR

b[=‚e9g!
p("@huW"e/;S‡S+1‡i-(]
 

0M'
oId?,0

?Z@-Jƒ3]
 "(%q6mH+)2‚f>[Mt‚?
t
/
""ŸV˜€€€E¿0¼&B—þE‚/!Y%4,
&/3B2'LH% L+R
!$L ^+11@&-XoZ  B"haX‚}$TVY'esJ*
b8L
R$:/%
     
$#/

8KbF0O
/
O.N
V.G/#h$Duz        ‡U!$L)
c&<
‚5EBD.=B'UM —
t0forai‚…~cƒh
Š?&H‘( ‰,‡:b<‡kˆ|Š)‰%–†?²Fºhˆy‰BŒJš´S‹( j
!„t›{™$
¡o†q“]œ††‡L·5Œ[_ r
Í~D
‰s†k£k‰Ž÷06¾„H§
7†?²FºhVõŽŠ]ƒŽj»9hƒt‡†)—(Z<‡‚U„‚~Æ,ˆUD—
…S‡‚:each‚v#n                
-‰3SiJ63r•ñMƒ                 
goˆ|Ô\   
”P‰*…„        ·‘Q¥Xփ܇HÂyÕ‚q‚‰jŸHign  „
H>‚T       „>‘>mZT‚&
.fkƒ‚9Y
_s3$
q‚W`„}‚†      „r±@
0>„‡R À„;pˆ/m
‚šQ’A0 iˆM$PŸ{Äg‚/
T‚2

 2@]Oaa!3]I288x    )
 ?."@4Y
2
P'+     0P('3
     
(P3J(g5Wt@6in#F.C     *+A+A1UA!ƒ\‚r.–%…*-ƒK(!!KŠv‚I“uŽþs-Æ'\—@œr
0>„ü} Ÿƒ‹„;‚(‚ßG 
 62@]Oaa!3]I288()
 ?<"@4Y
2
P'+0D('3
     
(P3J2(g5Wt@6in#4.C        *+A+A"UA!®‚6®r)Ÿ*R-K(
K
pŸ[<w¾Ž_kei#u9‡!h
…Jˆ1#œzÇ/‹,9    I  ›l†Tš+(
ƒ,¶[ZŸƒ0„á/B9        I  „#ü†T+(y_check‹1‚Q†R˜W`ŒQ–׆R`v
list‚‹"†S™`•Ú/8ü†SnsF‚‚-@
Ék‡–×Gkåpse‚ò,v‚©–,ŠFƒGÏ‘ˆ‚8Š{‚°‚<„²e*g‚f‚j‚I7ƒ•ê
+j7Ceri‚‡N•ê
t‚…iù[/¾aiv¥p2N
ŒO‚d„9„„\
„i  ”iÙFSœ †•‚otten‚Î “Ù‚k‚Œ5
»k%ˆ
›‡_Q
±

•Òƒ@‚È
m    ‚8‚
‚k‚dƒnj……i‡$ƒ0„5ƒT‹C
ƒ11…M„P     *v?‹IƒXƒP&…c‚hmv…‚#‚„-Š+* I:fs#
@DM)

%ˆFŒ*†-!$\1›yŒƒU(†Q22†i†\!ƒA‡ƒ8$ˆP‡µ?„.[‚5œ^"³„niDF•‚u
„
N:„yƒ(…G-Šv…&ž^ˆH Š|DŽ\ŸPƒT
?G‚BRfFZƒk     _iCRƒ
@†

‰k
!-Mv…|ƒ0„ˆÖg …‡2‹39…:‚‰>ˆ/‹G„mˆ‚)Š~O „`i
 '‚-
ˆX8‚*r §z /‡a‘ˆ«0‚~ˆbƒ3E‰TF+‚&Š       
„”Mr‚e‚”ž“‹Q†aq‚{Ÿk"„f›U4’,2Š`O…`1†D
6~q
¢‡w‚4„Aƒ#zv‚"…¢ƒ…8“èG
‚D‚I/‹\&W&ŠhŽL¡Šn.t‰;Iˆrˆ-„T.„`p‚q…Žþ]
‚HFO*-!$§‚$Lt22<
X!‚u‚I‚>‡UGa+0‚5žy"ž4„niDF•‚u—ƒ-:‡3ƒ}
!-
"…&…j
 
Dz‡J;


?+G$BUZ
W    #iRn
\z‡U
‚8Ƭ‡
—3%‡’"K!‚g
9‚
‚ƒ‡O§    Ÿ§5‡{åGní¶H~OÆ8IBY

ƒoL‡
4E§;‚‡g
gŸ‡—6Z.
*{‡ƒLKq‚{
ƒ"®V8®u
q2O 
D1

 
¦N@.‚_M—8O5Nq/?&W&‡c‚yŸe‚et‰;Iƒ3ƒ3h†931@,\G
""ŸV˜€€€F¿0À—þ‚V3c.‚„¦a0formal‚ƒ/4t‚*:7}
$‹b
ˆ2LH'!+
J
W47c@99‰5.:R‡=‡]4i>Q
…f3"…ŒA 
Ž=ƒ’Œ^KV—aˆ2
„NHÌ~ªF‡hSn
&7>$ Y%9i‚
ƒœ]¬"ŽsŠj™f‚e…
:±|‡i        )‡^aÈM„51„.‰:23+      E†N2(DORD2sƒf(;
 Ž5#™E‹>et12""   .=,
„;#‚$„-†;”WŒ(ƒ#‚g5Nm„OU/iI ADUQ]4)c]4)
QN[ƒEOp‚…\Œ$e9Œ      DB 
  !$6Es    '  *:5>‚e^X5hc?FaTWc
M ƒ

‚qˆgj;‚a„k0¬*•M-¡W@Š#/I†~ˆV5‚j9‚„‚,‚‚-+       1J„)*"l‚&!F_„B‚`8        Dƒ/†KPq… ‡C5pl‚ G„c…¡- {U§XBQ
ŽUY‡Rb…Wƒ<Ž].
       ƒ@‚B//‚†pR…Ds†%>‚,CW‡ˆNw‚w„Gƒ$u†9†q‡wƒQ…aAx&
‚/"N*ƒQ    #
W+'‚
„:      

#$ƒ‚OŒ}†_‚„K…6)Ghc„*$3aˆ1„A…oƒ2-nV…g4£({;‚:ZhNŽöƒ  [
KV®hˆ(
:  &7>$ Y%‡7ƒWi—7‹+¬"ŽsŠj™fG
U       )‡^a1¦‡®n‡k
2—4~‡k(H
 Ž5#]~     I‡P
9t1"N      .=,‡#Æp 5í:N?v‡d   Õ„QQ¾@     
B

j¾p‡g
—`‡gŸ3Ÿ"¾hR‡h\‡‚tEN   +F{"l‡c! ¦„c+ ®@'‡^Y—8`T-
Œ#J

       o‚//(‡a
1s>‚,CW
v$VaN+‚‚L¦a ‡hc1   #
W)'&4    

#$40‰Z†_‚„K
"FhcT3AWX‚o,nHf4Ÿ
t‚ëaPÜׇçwNer‚©rÝ•$liƒI¯
sƒƒtƒ.(-,JR—}‚E¶i„xø„t„ð|\íTul‚‰”ü?õ‚}a´º"gw  Œ>4
¦£”b½¾4ZgwƒÜM¾6>¾…0üƒtemp‚Õ–×h‰_žDƒ.=A‚;‹m
‚!ˆ51›™fk‡0„e‹y„e‡O!ƒ#5‰o7V}<-A„4a…?xG‹n–'
™3†
‚-A”ˆsP‚[‚J©†Yt‹C‹9„‡Úd†{‹ŠG´        ƒ2‚K„ŽþiÎhTo˜m1›™fN$‡cFY^Ÿ‚G·bWmauê>‡Õ‚„R‚zÆ„‡gq®*WŸ2‡„'ƒ,‡Z?ýb‡jl#Ý‚[‡)l‡^Eˆ_Æ‚2i‚b…f‰un‚…]œL¨g‚L—<ñ)‚ßR ‡tOù‚Mum‘&ˆe$‰|Œ‚=
(
]„  0--C! 
        
        ‹/pƒ"µ3¶$/í"k¾E
Z‚=ƒÜX1! 
        
        ‚‘)bÝ[2¶‚wardˆ{X%³<¹‡~}µ

}‰=–L¥]—‰~ŒCoˆ^„a„V}‡`³„ …ÜVžn¹‡~}ŸƒÝZR¶Rc„‹‚VŒO\‡gÕx
}Æ&)ssil’
<7‡V7
-ƒUˆ3o‚,6M*.Z
n‚Jƒ
-&&!i&)2:tR$5      :B    O0Gƒ+ˆz–I‡l
4,"‚ 
‚ ¼‹yˆ$
…u1
‰(—Y ˆ^‚T%c†¤‚>xF„+’eX'b„5?M
""ŸV˜€€€G¿07¸1
3)}"xM@a+        
E$?       ƒ’Zx   ‚ ‚Ž/5®rA‡jƒU
-§
ouo¶P6M*.ZÎJ
-&&!     h&)2:t#$5     4:(       0GŒG‚& 
 =¾?—A
      
7
1‡Õz  6T%—„‡‚
ŒGj‡g
F!1
3)D"T:@+  
0$
    ¾<]®h2§        
d    §0found%‡5†zJŸb*…‚
›e‚,
D“'}‚6‚0„6‚>&ƒjS#ŽT‚'œ"‹t‡+a´y‘~ ™:e¯G‚?…*ŒGŽJ˜‡}‚A}‚J‹L{‡?4“C‡J`8J#…wžQ‚4LŸ
z™˜+Œn—…+„o„}©3*|„h Di‚o†A…>X|”cˆhN§W$""ƒjS‚P‰Q‹Oh      ……ƒ‚‡)8
‚`“b‚#„z~‡Q¶ˆ
(#!†    <‘N”OŠi‚'(ƒ\e‹*ŒW‚qŒRœ|9ƒn‹l
›,yž0ƒmƒjŒ%„?/+†-žeM…G]µj¡ˆj‡J‚lŽ8-‚
ƒ0$‚T
ç{‹m‡X‚2„ ƒ
 °i(u‡>˜yƒŒw‚%¢m$G¾M`‰pž]ˆMƒVWŽör‡pG—>+—4‚yžtb       8›\‚?…*ŒGŽJ˜‡}‚A}H

d{‡c      ‡„cm‚`8J#ƒ;‚S‚8†/zŽ,‡N1Ÿ@¶ƒNŸ†EhH!Vc  â$)‡i‡h
6#‡f‚8΂‡j=A‚&
(M¦Z
Õ:  ƒ
$‡1‡‚"UF§B‡^®r5
</‡*„D‡n
„
M‚%—.}¾A    1B®2A-®…yNt‚2B‡s(uF'—
‚%—Kˆ3$G
ƒS`Aj—‚;at‚„Mer‚&/r  Z‚ˆ_5.AQ—YW’n
‰"%‹]ƒ
   ‚+2Ã$©Q…H("„|/1‘<‡9QCƒ+
!‚‚ƒ.
T‚‚cš‰‰Y‹^>ƒWŽI†K0ˆ~…UV
ŠC’"E
„DšqŽ
‚,xƒ1‹0ŒrŸQ
¦x
@#H’9‚šU,
o“8 5‹†
•=ŒHžb‚
ŽþiM§
%—9D<   
z2„!¾ '("ƒm/1‚.ÝV%®l
ƒ+‡f‚ï
R—9[¾M        E‡,>5¾%
Ÿ%A"E
Ÿ„@¾3:>—;X^+¶C
:#í>9
‹!Ÿ—othYN-H-".i
u|_K+aqq„8K
SŽU$
=…<ƒAÖL‘ÅS¤;“i‡8î›K‡
s
w
 
…TJ¤x˜œO‹D½…E†G…å?Õ{
sÝgõ
ƒ5¯‚‹Dxƒ’S@—Ì<„|@pic‚„%*d
!•^„N&h“ÿ7'‚È&õJ§E§
&hrintf‚(ƒC"‘¨4ofil‚¤P[A‘‰B
[Ar_vocabulari„jŽÿ0action>oƒk‰$‰6‘5†j‡— ›    …Q
        …      µ$
9ŽU§    „Yi£}7‡’UE

        Egment
d†V‚„1‡O±n;$†6±}yRB#
¦HE~¢qÁy
‚D/!‚(‹e"ƒ|…
ŽT‡y¥<ƒD
%½@KP$¾14
yRB#
üƒZŒbƒKÕq/!œK”6
‚‚*y1‚-ES‹ƒD
%meB v2D,YJ†7‚
B      |+†j‚Q…X‹'>4t4ƒVK+ƒ        >
(G[   
G+  
2F.T&


#|+@"„\    ‚=‚:&‡4Whƒƒp&mH3^     U('fU
‰!D0„)<&Ý~;Hæ

9
xB G‚Zm  X(t   )ÜL;‚
B      ®#+„Ùo4
dK+$  >
(G(     
G+  (2F.T&


#
+o"„\      ‚=;&QË        +
&PH3  U('fU
…bD0ƒ)!&§A
j;£l(
9
xB BB+       X(j       )work‚„J‰C‘‰ƒ
ncisco‚L
S!ˆ[:
‚|-”žA!Ö!k‚d„c‚/—n•Ú>ƒ)‚/
ƒ}nfurt‚ì?udulƒ
—6/˜š/e&x*Oq/;K>ˆ&ynuqƒcŠ
„L‚I‚#„-"+&

!!ŸW˜€€€H¿2º'2ƒP‹{o$T1zŸ
‡W…ŠP‡!Œœ¢RVs„4‰.‹@ˆm‚m‡„/„f…˜ƒ1œ‚„h‚VVË;§ƒ&0fread‚Š[!—ãkd”6h]BŒN
B˜e9…<c&#aG
94;!s,
‚tz 
m2  ‚AƒTˆk‚NQ
ˆxÓ7@
†G       „P‚5‚N…7°T¡M·›9“ˆ&ˆ8`‚:‘= ŒC‚O…ŠE‡Œœ^ƒd‚ƒ6ƒ AB*‚;f
W„‚R
ƒSXŒ2…¶„g”
›b‚[+¤ ‚E·{‡Z„!‚px„"¢]‰'$‹ˆm‚Œ?`V‘4¹x‚<‚Rœ
†Rˆ%šñŠgfƒ2dL63"y=!‡,"ƒ7„P‚' =‡6‚„~„cŽ5—
ƒn„V„I''‚x½‚0žì>—3'ݯ     §      •Z”
Z"‚x…+`‚f4®„q(
D>ühX‡ƒ(‡j‚EK:Ý\c—!B‡j
N‡c‚$„d‚RS¶…M§2®<lÆ'Ÿ-3"y
!

"‚M^H        =96#‚8
G‹ƒnŸ"    ''‡
filenamte&$tZ9ivÏtaš*†vù‹/blockƒ       (¤z
‚P

       `—û8(Š@
‚P

       `d&#
$rˆ;‚,/07*O     
ZˆVtÙ^›#“`Œ.Á-¦ZM‚tƒ…U[‡|$h‚2øZE‚ ‚;¯rŒƒB„e
v‚t‚c$[N
>$;‚om‚
      “„IX
_
mì7í‚8…¯]
/li„P
‹}]…v‡x›(‚=ƒ@  •kŽ÷  ‚¾6j¤     O…˜P‚¨x/stƒ‚«d&„Bº!
      
 1$Ši5š-#…DLƒ
P  ˆBˆW&
:

*!'›(cŽƒÃ*F«d‚¨pfÞ 
      
 ‚þGO5#
;3”‚ZDA
)   ,%
:

*!'
ƒ     c       _count‚š2i†U›5˜†´†Umem‚w“‡~Hz‚VÛ5–L>(„2‚(*#
        ]ie‚ˆquenc~µ[10¾M~1tXŽ`o   †g‡E„ ƒi
’+‚(+—Z¬l”4Ž÷„‡ƒk‚‰Q>ŸƒÝ.‚Ï‚%ŸõƒT‚°fsh‚‰xñÝ1iendli‚¥‚‚‘ˆKH„á
ghteningli‚†a‘‰-8om4„'„P
ƒ‚T*4ƒg$#!K     /&
%
#
>
‚…(ƒ&‚/
<‚}ƒT…"'Zd‚gc 2Qy_ŠwEƒU‚&    HI8mF 0        +KO
Q}

=-    6ƒ>>$K,\w1)Y‚M‚jy‚Y!ƒ*.</r;‚…OD9e‚Q~F‚:K4‚B‚4:      sScc
=P
(?‚
S        lC‚
fi8
4     w4w
      „_dƒ1ƒ /…q
W k,8†d:‚++…A…~ƒ,‚k7ƒBƒ=‚Q&2dOKR6 *{8
%*&
~'Q
_M%       "/[5(
5 8U7.Z1%
S
  y5K'‚*ƒ0ƒ6=7
K&*#
B

mA‚#:;8(</y%
lnS„MHdG7u%
ƒ1‚K
<f‚h‚A#_`J+‚%=*hYF‚H
`t2~G‚6]‚s#
F`^ ‚.‡id‚,†\
l2†$N#o~>D;<‚       ‚)‚9
L=A
-[„{m‚"]‰&‚hE‚Wƒr!ƒn
)o4mƒp„‚-‡
†.YK‚…‚
lƒ;‚4wSƒEDcƒ‚c%WQ/‚^
„M‚(67gƒ1…+HS(S,V[
 „k‚&x0„
‚„!0Dfm3Te*       v[2V
‚i
`
T‚w{K"F†ASW†g?†[1‚‚7ƒ8ƒN\^^q7…^Tƒ d‚V‡2HM‚_AM‚„*(8)(#{*ƒ>„I#‚i.  
‚W„P†@„2…O0(*ƒPH  F&Uoƒƒ-‚ EN,‚-)8!xN/F;}Kƒ`nKƒkŒ0Ž)y#ƒ8ƒ4„C…Raƒ„2ˆm=ƒLF        ƒBv2M„Ap„C‚<‚‚n%ƒM4‚‚<8‚9[
…XQ@H+@jT'c‰0‚2+3P„z†>g„11ƒ^‚}41‚1†g`‡uƒ,E ‡)6q9m‚0"&)
""ŸV˜€€€I¿0/ÒŽ„tƒ?u$ƒ#duY4‚n„`}gW„J‚X2[‚Wƒq‚ 5!O:„RQ)$h „007ƒJm„~!ƒ:‚ftƒ(‚?
‡‚x8{M

‚z2

„T2(z5EG'#C#+.Q
1ƒ)!%J{
!9pP‚2'?ND…+2ƒT†d(9‚w]'mK…‚w

ev,U4F)
6‚!]‚8‚)      ,       ‚*u‚2 4       o$00(…*‚ A]ƒƒ@„^wz…=4<+"v    ‚-ƒF:‚n
1‚'‚„ƒ‚UV‚Z†[xX*1K‚)2oIj8yfK1D(0S,n\0+=f‚=-]ƒƒLfC3H2



      

                        

        



        
X$


        



                                                                                                             
                                                                                                 

        
       
                                        


          ‚c„t„‚pF: lacdq‚Gƒ,OƒZX3gƒP:iˆ"=‰>:!„[*‚!…F‚;ƒ"ƒu'M„AOc‚Cƒ=w$"‚HKƒ5ˆ|„g.ƒS‚)‚'m3)‚Xy‚iŠC…
‚<VQ„‚$tu‚BƒU3,
$wƒ6
Lg$&‡(…-'ƒ\‚L†{‘$‚H‚ Q!xjˆ^lrEu
[-‹X%‚Fwo‚%F†'rk2U)@F‚ƒ(ƒ8
‚KCn‚Mv0
[‚Rjƒ‚hbƒ%4O-ƒl…5…TˆD(„l=ƒqŽy‚c%"("ƒ„um      uR&8ƒz5„"‚g$ƒn#
‚…-[N.4‰ŠU…U?ƒ/„&<ˆDX2‚‚HF‚fFx[

X6!wO   /k„R3~ƒ"‚6e2R>"H
>‚‚|ƒu‚S/0      *H&HH
‚6xc‚t:†‚dM†[`c…_Wz2‚)„w…U$‚H„ƒˆ-„Dtr†'V&"‚!i?wuRbƒ1&‚=bw*.1KƒV+<ƒ=q1ttpk.+.3/2
Hƒ;„Tnh?#"P„>BO/‚
q^6„d<ƒSŠo„#j|l#„,ƒp'„Vc‚ 
6
J„F†x‚r‚#
80   gƒ<‚SW"‚
4‡<‡L7l‚&‚D…ƒy/2ƒTƒ      ,)„tl'          L†$
‚PTnIƒIsV5‚‚       \„+%‚nƒS‚r„2„k{ƒK1d‚G/QT{2U†,c(+‚BUT„N3wK‚b7
‚"l,r_kvwhq\ScHf‚ +N‚.-.KE‚ x#…yQ‚043L‚U-7‚)0g#k|*†<28Pi
ƒ@‚
I‚7ƒ‚8„Cƒ{†CƒS…G„0<ƒe(‚W*L„i       w4ajM

6D&m>SH,="MDC>sbV„& wc*ƒƒL4      (>‚.ƒW)>g$…,‚Z†q8…ƒmA‡(
7(:3x=+ƒ7ƒk„IlaY„b‡ƒp„B‚5?6Jˆ_

j
,



ƒV
VMQQ8~%…`/D‡-‚n„#LŽh‚;BV‚>V‡I‚V ‡Qe‚87dz
8>>     73F6G9D‚_T_7S2
7y"-=Y†$%)!<
"ˆY             I"‚9†x=
R@‚U
SK)…%
;+F‚Y`‚`$ƒ%L             Jc-1‚b%K"wxƒ_d )Ji1a=‚"‚gzF…K…-‚$'s‚y„‚U~ˆI„f6$7J„.ˆA2‚
j[5      ‡e?ƒW$
.…eE‚Vk‚/=Hs.

7N…ƒb W$ƒ.‡%/;„8%‚X(‚:g        d„>k…obƒGP5‚F„S2Pv!
‚U‚|
V‚}3)1e‚FAVL…6k(9„~‚K.M‚4{u„5‚"…‰Uƒo
M†lUƒM‚ˆq1†zTIƒ4
$!C„!RrDgI5Wp<ƒm
ƒn> 8cWGƒ
)†#!
I+:Jƒ{Xtq…X…RIŒ!0]VL
4S„C‚$HƒGe@RL<QV        68     <,$NTp…M‚4B06?ƒˆi„7‰)ŒEƒ ‡A}{
Ryƒ7”_   /A   (       “m2M‹Ifu‹Q‚xGŽU‹M‚8’k      ”'     -KM#oˆ‚v3c„ ‚„Fu32k7‚!ƒ$R‚_!]\Z^„vƒ‚B<gA(LNJ@{#„?
#P|
(
t}‚qPCIzƒ‚30s3…V
‚>GK5‚# -‚9Yz39…(bƒaU4RT#@-8‚aVƒ',y‚i ,„F8}ƒ@ƒaa‚X<‚w‚vƒGEƒ1ƒSXR‹h‚
‚\_ˆ6†\„DW‚4"ƒ;N†-ƒi‡wƒKƒQ‚ƒ…q‡:ƒ/<‚x‚EŠg&?/{`/
i19:8PH‚a',pZƒP‚…
‡M6…‡I‚l$ˆE2‚]ƒ8X‚Yƒ?
      $ƒxz‚Lƒ{+     $bLXƒ'wƒW>H„e…OŽöa"%WI/‚^L%D67g_?‡YQ(S,B[
eQk‚&x?0‡@f3Te‡g v     2V
*
`
T‡h=:K"L
ƒcT9+…)MA]0*(8)(#W*#‡Ue.    
@‚C‚0jO0(*JH    -NEoNZNE),‚-8!x<IF;TK`n‚„,0ƒ{y#ƒ8
„ClTƒ
}2
‡d=zB'v‡IIE2C‚<‚‚6%4>‡K<UKNH+/S[sCO2 ‚2+3P„z†>g„11ƒ^‚}41‚1†g`‡uƒ,Ž„tƒ?u$ƒ#d
..ŸJ˜€€€J¿"¾uY4‚n„`}gW„J‚X2[‚Wƒqï%+
,!‡‚Z'‡d

ƒ2
‚X8(M

‚z2
,:2(z5EG'#C#+.Q
1 ;)!%J{
!
)pPg2'?BD…+&ƒT†d(9‚2]'m)Q

4#v,U4F)
61]6P  ,       ƒ2"
*u‚2      4       o$00(‚p Anƒƒ@+^w(‚>4<+"v ‚-ƒ‡?Da>
1'V:‚4,X*1K‡SP2<=j—CƒF:H2



      

                        

        



        
X$


        



                                                                                                             
                                                                                                 

        
       
                                        


          ®m|‡h/:!‚bH#‡gx'MFOO0w‡^=‚HK‚ †„g.ƒS‚)‚'03)‚XyŠC…
‚<VQA@0$tu‚BƒU3,
$wƒ6
LI%<3 
X2
‚H\!x‡‡d)‡h
#6‡eYm‡q?%Ÿ

Qi2     rR&8‡e"¶[X‡h
!0Q—$L‡dc2R ‡gC|
>o‡gƒqwS—62M):JJ(
Dc$_WŸi?wR'‡f
F&*
ab
**1KqlAB451-
pk+.3
2‡Fƒ„Tn%&#"


)P
GBO q^k*
rdk"
#5Q
$'
Q‚ ž*   ‡fe<\5Jj‡i}*3‡R¶Y

 PTnUNsV5J
\\       %‚nƒ'‡YU‚>\
Z1‡`‚G/Q%2L
„
c+‚7KT„N3w9'7
‚"l,IE7(-:‡W
j
D

,
+&mX)S,TIc*‚O
q
     (L
ƒ

>Au
7(:3 =+‡b?
ƒI
EaY‚       ƒ‡‚
D?—C%  HDo>o#L…‡\BV‚>V‚>‚V .e‚87dz
8>>        73;6GKvT_72

my-YD$)!‡‚               I"/=
R@R
'SK)
T
;F1
‚$L         Jc-%K"
rxd     )#
1R‡=
2Fƒ
sUO‚U~T„f67Jƒ2‚
6[5       n?‡GX$
.‡h
A=GŸF)
M7‡k9< b$)6/;„8%u‚(‡Z5P&!
Z
VdH‚FAVL=k(9^8#Boj=TR
:8o
UM  U*F(f
c1   ,TIžX
=‡hPRI)‡4V7
6D
‡ƒ
Ge@RL<QVi6 )     <,$N&p—5@U‚‚v3c„ ‚‡2
 3‡e
7o!‚R~
<!
S\i‡[?
 x<gA(LNJ@
R#
w
bP|
(
}PC<-;,s3D
‚>
KS
z -
jY
z39 b‚b
04R!—
-8mƒ',y Ai ,‡/}@a<&l
+8Eo
KXRƒJ‚
?
:\_.&!‚4"ƒ0N†-ƒi"ƒK‚s
$j L‚0
*‚xSƒ(&?/`/
h:
PH
*%cpZ
lMH_
D(EX+‡G

       ƒ^z
0fromclaus‚
Œ5[loc‚
ˆ\#£q
†>#ntcŠ;¢`†…cƒ‡]œf„4“ÐA[=S‚ßI|»‚2zen‚ð6uit‚B‚"‚-$'#V( 6^,?~

3fG<ƒ‚ƒHv3oP1“Ñ76$'#( 6"^,?-

3*GDF!Hv
o1forsal‚Bœ~‚O“Ñ
œ[S4
""ŸV˜€€€K¿0®
0fruitsforsal‚BR‚!_3

'1sjƒ=g3<ƒ=q“Ñ3!_+:

'1+
 2=
)3BC56strat‚$ód5      S   !      ˆy   ŒTü$$d5 S   !      ‡Ss‚‹•£ƒanit‚²n‘+‘ˆp…õ†Jdirƒ¿y‚@—Ìô@ign‚³‘ˆ‚      …õ„8lckout‚…H£ƒ*tab‚™ ync…Aeƒx/
‡+
 ‡+
4ŸlŽP…vJ‹—*ƒ>
ˆl„!‚9(‰<ƒv        ”,A&‰o
…Z‘0Žöcƒ-‚?
‚ßG…I
Ot‚~
JÊjŒ„jŽ8A&®m…O
w¶a't~‚\ˆcvF e
ƒ
‚&„E!$a
…R'„Uƒ=V
‚?<iƒ>
/C‚*k        9‚ZQMR
IXPKP
??/:‡E
„E%6(rQdˆ^sˆr‚a
ƒ  tCG„gNCTy “4*p„86‚YV
&$#,m %1~'a`*!'+2=[?,":u$3"'$70…]NW(5‚T?z
    >9F& \‚t"„"‚|$5Šl.f  
       E  1WUB7‡…3{d9+/
ƒ6=  oƒ(`L2?„9)‡&2#‚+ƒi
0h&H%?#‚}7c…WKk‚B2,R‚
'‚N,=#-b—-½;
 


‚&‚($
Q

ƒF'bOb
     ?<i6:>
/4(*k  9
‚4
F
}H
XPKI
I4!1„.
‚ %6(rQ2†s„
tCG$T
A     ‡.‚Y*p¶6}&&$#,m .1~'a`*!('+2=[?,":$3'"70…]NW5‚T
W
  >9F& I8"„"j|$54!.f     
       E  1WUB7
‚*D{d9+/
a=       
8]
q2?)&2#‚+
*0h&H%?#‚}
cKk,2,R‚
'‚N,=#-…ý/"„1~&®{À
 ƒ    1
@‰>†Nt¾k  ƒ    1
@‡ƒ  †(!_v~ï
¾a
_colów¾…ginstancôc¾†Srowô¾†2~¯À       ‘¾I    ‡?)_v~ï+ ¾a 3~¯À'  
¾
/  
_vïC¾3_term‚ÇJƒCüzmƒs_2‚Ç]ü‚est‚¤R\A‘‰B
\Ap‚‚}„rapv‚²c‘‰es1‚jà^üi2‚lükk3„BŸ{Õm™`0B4c#A'Ek       =*&K"'
ˆXˆzf"[.V g'4 6*5 7†yƒ„@EA)‚=p‡|†„%'&…f ‚q‚[Y‚$-‘x2ƒ9<
MR(<Wzg?…=Aoˆ„      ‚3ŽN)D‚4‰jQƒM%•'DšQ“.œ4
’P%
ƒ)!.´‡*
‡X9,„o†Y‡:]S"‚5†)3ˆ\—'¸*‚^½„ |

        4
>#Ak   =*&K"'
‡‚#®‡gf"[.V $g'4 65 7UƒEA)^pz‡_&-f ‚q$Y‚$-2R( Wg?ƒ8Ao‚xƒ_?G)Dv‰jíO
‚ %Q
‰4D†>]A
†PP„Ñ\E"‚563<‚Ç^_max_expr_depth‚•ù‰tokenc„x * ö…f43I <°",Ñ-ü„A-43I <üf†",†Ójcursor‚f‚6ˆb•ê
M.token‚ÿI
&8Iý
&8I4v
%WBg5,‰2‡#      
%A7‚Vf<‚" %9     !:\:       }‰Z‚BFA)„&‚‹o‹Nˆp
J„>"       …;   9+\5s%E;S%"q!!        "O3./HUG$&
‚i<;%PX‚        Œo
Zƒ&J‚eK•)C®!@$^žH6„9
t$‡Œ7Žþx
#>¾g‡/
‚}$     
%A7¶Sf* %9      !\:        t†SFA)ƒI‚…:‡S
J3"      8
;     9+\5s%;S%"!"O:./HUG$
&=;%PHv†)
Z‚zR‚E#!"w‰(M-"†] b"'
""ŸV˜€€€L¿0®ÿKüY
‰6CU!†…0fts4auxv
q
“.ÅW12&ƒ%I%Žÿk
o]¾~¾012&ƒ%I%5~…DY9=BD%#N'                <*
.[4zf‚=3‚$9#*C
A
CCƒ:
`+^.%=Q6=08#c     LL
Z|b

‚&N/‚e1;u‚ƒ+i r?:&tG,V}-y;M!
‚RV    M+*E‚z=t&‚3‚Zƒw"!,2no<ej+ 5         0-/K?%Bk„    3E…GGWI@1f
M*IZ       R#!-      C_8),q‚RƒM%±v‘)‚a¦n
”ÏP‚f½FY9=BD%#N               (*
,[4
‚:$
$9#*A
 CCƒ,
M^.%=
6=8#c    LL
Z|
b

N/e1;*ƒ+iXy?:&28,V4-;M!
"(V     M+*E‚=t&‚3X4D"!,2no<eD+ 5      0- H?.Bku+E…GGW@1


Z      G#!#(C_8),q¶ õP
‚!%‡MŸ…xí.@ƒä.L   i‚Çf_api~4ÎO-@/WƒDˆ_h“v½t$D-@/IƒDa†¬X     v    from_dbÏ*¾
ptrÏA¾6uxᾂ|extension_funct~ÐR`¾‚Ginitˆ;¾&token~Ð0q
‚.¾\
‚%*
‚._Ñh¾]acoloc~Ò:ˆS;¾3ƒ;ize_ÑS¾]Laux~Ò"ƒi¾]ƒidocu~Òƒ
¾]ƒ
prefix~ÒƒO¾]ƒOqueri~Òƒ4¾]ƒ4context~hÞ:‚L       
 



       e
uQ[v
=C6$P
@¾_"‚\
  
 



       e
uQ[v
=C6$P
@extensionapi~Þ6‚ Dl…¾_‚ l…pars‚‚k’†Jhraseit~(Þ>ƒˆ;?#f>¾&"ˆ;?#f>token~Ñ5ƒ?¾].ƒ?vocab~Lî!

%@[$0$Rži¾aJ!

%@[$0$R
_idx~©r¾H‚nitˆ:¾%tablü”{D¾ƒf¾MD        bl_config~
5¾k(doc‚X‰q$(*”üqF$(*n‚™Pü^tabl~ç5ƒ6¾`†ƒ6udg‚¡t•ñ{er‚4
ˆ
l‡n;?Ð*
7… šJ†Šˆl      ƒ?…R       Ðƒc?Ü»\…Æ‚‚‘50
ƒÆ'¶‚HYfil‡H‚‰N“ƒ‚9l†/Tyh„„ŠgU :%‡rŒy@<f-m‚a,
1(…ƒM‡A†W4 (¡t‚Gj".K/‚O‚7›,1KA3X†V'‚
!‚>4ƒ&HP@%)%%„h%0!r@‘DkV `ƒ{¡Rš=‚c†(R*)G      ‚2‰jD s
"   M(‚%ƒ‚[ˆklƒM„z`T‚>†XŒ
RK\ƒ/‚TE|>VAHQv*S%h’-$S‚|‰t…b†Z‚&
‹oT,‚i>‰†‚))•^…8"‚b…[¡EOƒ†.ƒ„e‚]!XŽ_……cy…‚d       ‚…,†"ƒf"[ƒ,‚‚'¤yˆ[Q††N@Š’
…bƒx‡…
@.‡>5,†(ˆw‰74;‰J…3e‡Kœbo„…o„&–F‘he[6 †5…:‹@Bk–qŠ{‚šZ        ƒQ•@Š%w+7ƒU¹~f1).'q0Œ~*mˆs6ƒh†Yƒ4ah|&‡{ŒTƒw‚-‹J•W
ƒm^3& 0–
‚b
‚ŽöƒKE
"4 ‡a&§
L_e‡W.K/‚O
Q1A3X
‚2'Q‚
4&HP%)%

%
!„fkV `
4„
‡2‡*ˆ8—3‡d*)       %ƒjDM s
" M(‚%
Jˆkl‚zz       TŒ
RKG I‚TE|>VAH

‚A*S%hƒ8$Sp    …b†‡/‡T‚&ÎNŸ‚>T†‚))a…8L
b       OB      ‡Gwí.VÎ
7d„g{"[ƒ
‚‡`EJ[‰z[)(${0;!^!$#
""ŸV˜€€€M¿0“ÛR ‚HQ¾EÝ4m‡[K
}e‚VcŸ—9@‡YTI#
U6‡h
i5„ƒEBk@:‡‚ZÝWw+7‚E1"
1).'q0*m¦4`M ah|§     ?ƒ+(‡c{Y
ed—v¶c[¦y
b
0full_column_nam‚Î7^†V›Cx§Uù‰r…Þ†Vxest¦F—Lfsync‚CÊ-1†XŽ,Ž]¬_“Øp‚þ†X
,„iƒ$5‚iR
“˜z•(YÕ`†VŠ`XN
.e
‚a•
–I¦®LEƒ%L   "ˆMN5ƒm
‚D½[‡z³Rt’rK%ƒìF¾‚ç/4kei‚žx‚1„g-x
21mutex„schemaƒ‡?l*!—Ì‚,ƒE*!ync
DRtext‚Ù4y_within‚SŸT‚”Õuq‚nc#•¶2"-#‚#‡¦j—‚        †¼Rdef‚–kA+3#BÝX‚A+3#Bt2 ion‚
ˆ|‡YzD$      y,Xm
>t -$#)$.

+H#A+,7 "/h3*&#'# ƒ7Žy$F[d
(6L96<MD
);?\/ UƒP„N'&ƒ&Iš!‡&T{J
&ƒQ,

       

$ )*
`>
4\„9DG;‚
‚b‚
ƒN -Y9#!>PGe
:=
Y&
@R+.K
%8:d.r‚k
        v#L80rM57‚!
:E
‚61~CC
1/4(>Zmsl/7o
-3L
ML\a 
67@

     

9>Y_…AƒDZW2
I43-‚"H~;,

R'h9B
5TYb„Vm‚m@W/‚)D00
+
!6I/‚D,v^†c;+.+
ƒ,3,e{ƒ<O        ƒ
O5-7P
)B?L%2v

2/
%!"
 @"          
…*
G8‚.ƒ$‚Z‚s&

6"‚    T
]H„K
2YM:…< 3
 
  3‚†O#C=T/!2
4"L 3‚Iƒ$‚F$„.{!i/7
g$q(‹‰=!,\ˆo2k
*L(‚h„
D      :

 ,E(l_‚wUY‚+~‚)‹#3‚…Z
U/= .Y)‚X
4xƒJ‚)C.W7"5!EmJVYu
0I‚I$„yj‡7‚ƒ]
ˆk2{MQT9ƒC]?zNcg‚gZ66‚?…7LŠf7ƒ)Kƒƒ'B
‚\„{‰p‚ƒ &
. 
% 60…XŠql …ƒ….    N2ƒ~_˜:)  
- )3n‚D)‚7%$By‚8‚%ˆ2„K1a?„`~ƒf2
        ,&‚HH‚ B[F
W/0OM
o.rƒc„!
        )/
'"4;)V‚kF!H >/'Z 8"‚
nh
ƒc0gˆ…Q8.…/DP1     „‚%„’>?…u5v"/…6$Ž6ˆY‹MŒB9$
‰:š%‚V…)„;„‚m‚;B!“PS/->>2Ff‚5P‹d1‡{ 6b
"


"(‚I”G''^ƒk’#NV7_
J‚wna&'2$a%. 9(o%D>!CmY<    .R:Q‚"‚*%q‚94'>6{:('"„
|P‚Y3ou
,    z!$
)E  B%LS
4{ƒ^ƒ‚*+‰ƒA0…F‚h`^R#‰Rvgƒ+*…>‚-#>")‡G†M„4
-%`ƒA‚5†a…sJtƒU4/‚
 
:v‚2„ƒW]8-‚^
„$Y"†8X&|
‡j…„|]†¢,g‚'†‘~P@k‚‡AcPA„†m9„)
L‚m‡ƒ(!YW2Y8=
"6.8_2;0A39z;0(]*f]:2ƒ:T‚nU:‚{!)Vhf     #@
1Q'$}0X…KCKi9V"j1I]?$C#_;/‚5!Š8oIˆ2„(‚j„]‡j3ˆ…$@‡c.%‚n‚$Š…J

       ,;
%+"
!(>0‚1FJH"'
F
""ŸV˜€€€N¿09Ð1-&
) 
)  
'%B7&I$'N]‚‚HC‹F„lM„$YfŠ#BC1+Y?        0     }‚u&!‚D<3ƒ+):
‚1@H`[*9N‚„3H%ƒW A'
H"„<‚v.Ko7$vX     &1,       


0;-

)
T„2  $f
,:!$%&
;!
       %,s%>‘z*>„d}3x9†‚l:Œ&KzC†!&b5
       
9\J6     )     
;‚4 0Š}
4F=4-"{lƒ0+
       +!cKG7‚,DO;‰K
‹‰        (‹ƒD‡ŠH7‹†}^…    <ˆ˜”†;‚-&T5ƒkNW
,m!
§v+gFu?pTƒ!     @XJO‚
 ‚)oC_0DHª7%ˆTf…br‚D{„/…‚h…]6‰,‚#/
-‚=‡3
‚7kƒ‚Kƒ)‚@‚^&%6s†&ƒ1y‚D‘‚8‚z
${M&J‚ ‡    Dƒw2@5     <s†~‡0U‘a•Œ^<‚-ƒXD) ‚8‡2&dR
n}!(-+  /-9
‚g…V[Q‚B„6‚4k‚4A=<8< 5
ƒIs\
$2:‹…N
       Z“km…d‚j>ƒ@„X
}&?Ž]¿3Œ,L›%
b’    $É”P$…F&3g„+/‚-†s^F >&'
<$Šn†)‚1‰v
#!‡b‚†+‚(Š1‚>†qŽ    }‹"‹"…¬5b
ˆO„V*MF…H!0u
   )(`X #0
b*C+U‚5ƒc‚Žþ^b7)Kk&BG
—
„. "_" 
- )3n‡V )‚7%$By@%
8a?)~2,&‚H @[F
00O
o.r‚(
        )/
'"4;8&V‚kF!H >/'Z      
";g
ƒ.‡)c‚A„c8.ƒy'P1  ‚‚%—f}?…u5v"/…6$Ž6ˆY‹MŒB9$
‰:š%‚VK‡ƒ/‡iB†
PBS/>2FfP‹d1 6& 
"


"(=VwˆN'^‚!N>L7_
J‚wna&'2$a%‡>9(SDCmY.:   *%q94'6:


"g‡*|—9¶W=A`^RŸ„Y}#>")…_†M„4
-%`ƒA†6?…sJtƒU4/‚
 
:v2ƒwƒW]8-‚^
)Y&kg_3†MP@K
%mT      :AŸ+)§
8o¾#—8   R®qƒ§

        ,;
%4%"
!(>0,-&
)  
( 
'% $7&I$'N]Ÿ}ƒJ):®n        ‡g>.K7$4I    &
,  


;-"
)
‡d      $      ,:
%
        
!
%,¾9t*>Q}x9
:‡]#KzC
&‡]J5
       
9\5    )     
;4      0F
4F=4-"{lJ:
       +!cKG7N—&
S<‚„‡em
dIM5
NW
,Ÿ*
ƒ+‡[fQ
3?;TB0       @
aJ‚
 nq
J0‡c-H‚%f‡&{{~„X7
‚F6‚;‚#/
-t‚7_\DK‚-‚@&"&%6s)‡G2—7XU—Aƒ‚8‡\RR
M=
&JP     Hƒw2@5$<*$
6
- ž^TN®pŽ\$‡f-‡d
qgT+/*
^‡j>&        <$[

    q
#!ƒc>už{
(1#aU‚U#CD.mkb
qM
yFB!c0u
—3)sŸ#0
b*C+U0function_list‚Àv*^†Y6ù–M‹Y…Þ†YŸ
""ŸV˜€€€O¿0ª0functionequival‚p       non‚À      overwrit‚‘l„_>d‚f‡)a‚ „K,U.ament'
‰}í'csign‚³ŽP‘ˆ‚…õƒortherƒ¢‚„V„
&‚AŠcŒv‚I’
¹u•±&é&Œ…*„z³_“-#‡_‰@E‡+›x†Ÿ8“šf‚P„Q‚\‚‡}“:¢‡„l›;‹cˆK‘gŽXŽAŸs…#’b‹—      ”y£:„T³h‚‡D‚,0‹-™5ƒrF†QÛ<³!‚i† ƒ+o“#™C‚ñ&Ž÷‡‚r‚‡hG§l‚užœXŸ1l¦‚\®²‡t!—U—8e—#‡ƒÝ`/Æ'vŸ=®‚'Q§J‡Y…5„l'¾;;åg݇E—
‚,)‡‡,‡Z_§
‚.‡‚q§†¶XK§Zƒƒ+®‡‚/ƒ.‡U[ˆ‚morˆ3ŽxRPœyé<…‹]ˆL„Hƒ³,
”}ƒ“„kŠA
—o¹T†BlŒ:$œjŠQ›G1Ž÷IåÔnŸ`ƒ‚wü‚/‚.ùƒ,Έ9WuŒg˳O"‡‚6j®tust…se‚Š‘þ8Is‚‹u—†(ier~
’`¾tur‚…d
‚>+‚.
…Gp…       
žc4|ˆi‚G‚`8FY;‚?;‚K9
‚ ƒ;j
Wd
‚J

…~…;ƒ8–†zƒu(º£aŽ‚7†ŒiŠ‰T‰|†A‚x®      ˆ:"Œ'ž9ƒ61„…ƒs“f›w!‚”x
      Šy…†lŒk”$‚M‚m…hqt‡P…F‚Wž0–I„EŒr•T„G£bŽ?
–2(Š†~a‚2ŒuSƒOƒ9‘…Œ8„J‰U
0"ƒ[‹ˆ0‹lŒ‰~3¤yˆ2,„
Sž_:
‚e)0WˆY„3Š6‰H›jaS0„_i„“8¼j‡s„,5”Z-ŽYnŒqˆl‚GŠ.x¨…~ˆE‚MkD   !‚
,‚uŽþ¾;G
(‚=‡V>¾„'‡feI‚f‡„Ƭ@§   45ƒ61„…ƒsŠxZA‡K!L«qg‡iH—9^¾ƒ§ƒ‡‚cmtZ¾#k¾Ÿ;§
."—8z„‡jHŸ—I
ZV‡†
…BSC®o0L8PWl#
   naS0u
;i¦PD¶Vy—P2—3‡r
1-‚:FA=
ŒCƒ6¦dbzz‚Rr‚vAˆAI
Q)0‚$
7^   #       ;L*)Q‡K„jh‘ˆ]#‚XA
)       
7# ;L*‚ÀK«y
check‚•:!
6ˆ‘‰
6ò&er‚Hƒi8ŠD#
&&     QJ7"A!hyR,ƒ[Gƒ`
Œ/"6§%D‘ˆ6
‚["
&
     
J7!A7
GyRAEƒÜ     "ƒ¦gDshel‚„v‘‰ƒhi‚
Ž_'‚z‚#‘‰
$ò‚ write‚Š [
#(—ãk!ag‚3"w&ˆ#“ž.Ätn…Ö„n‡[¤O
"‘2„k‚y„9ƒ#‹s3ž„$
|„F`\)
‚
†Z  s                        z‰qŽ&
c‡N1±v¤Iƒ
†?‡K]¹„M&n‚6Žþ‚¾‚5n…g¾&jƒ0ŒT‚öh&åH0`Y)
‚
„+      48                            
!‰Võrí.%‚XK1$H6¶ƒ¶[

‡]¾*
&nadget‚yŠf·‹(•£ƒ&il”<c]li‚+n„0„3ŽN–3‡Œ]¿)‚3ƒy

N–/J„“
§‚m¤7ý¶‚1laxiƒ‹7|„_—ãP|‚&me‚pnR™Yµ‚v¬&
˜w*†Kƒ%‚+‡'Ž÷ƒÚ³5‚þˆ"Œ;
p*„c‡‚
'‚À‚`_cnt‚´|Ò³1rbag"p&ˆ/¦ 4jŽx'…}†¦v$
!{“؆M4jM'T‚¿{$
‚ither
ƒ‚=¹~†+   L‰Uƒ
…Q9ŠPŸ‚sœF„y„kÈ„7Î>Ña§U‚׃K¤<݇3xŸn„y
_ÚƒH——veƒ
—Ä@b‚‚!ü;‡eOccy\%†<Ä9LU¦:CŠm„-###…2‚
ˆy-*,)!ƒ/(lq<
""ŸV˜€€€P¿0°‚G
– £        „#Œ!Ò0“*…x„C-.5>„E‰Vb
Š ƒgÕ„Ta$„L&/A–Ze$â
>U‚h&‚ö\%õZ—3
-.h>œTŸ$¶2¾=I‡iˆL—4$§&/A0gcov‚œ0ˆ"5Wˆo"‹@‡R‘ˆ\
"5ƒìQ‚‰L_xƒ¼1—ÌP|dbƒ
„Lm‚‚b‘‘Ie‚Ž>¦,‚ƒ Q·{†+ŽË¹C܃M ek‚‚‘¨Ckommen‚ˆ6lernt‚ˆAncol‚e‚ir‚F q‚x„

‚
ƒ?/…[„Rd…Z‡‡f‚‹4˜Rmƒ57
1‡S†,‚F2]‘f„$l…>„/
‚* '7!"X
ƒ:‚!M8‚_†%L;Ž>y'&Rb„S‚-Œ†
\fuˆU4f0œ'o„fŒ?†W@†gŒn»/
†r)%0ž)‚9
Y‚^ˆ 
8¬G…º;@ƒSQ–iŠF‚)4a{ƒh`C‚11K‚?‰z‚Kˆ‚}‚³nP‡<†2…0‡¦q‰3Y‡†0=‰‰B2
Ž&\#ƒ3D‚Q4‹'ƒPƒS‚Lƒj‚)"y=‚@š      {/¢@‚_l?.Ž$>…„C0S
pe&$$Z+0J
†     ‚q,v…*+Ž9„blB‡y#xƒ.SW„‚r~$„H'‚3„+n‰D‚F„@’‚bˆH‹.…c‚
aƒ.\‚VSƒI‡|‚c2„<”.ƒ7cˆ>†v$šy„8%‰KGŠM‰
ƒ=J0r…
 >%'\—@#…B‚Gƒ"(0jƒ+ˆ]!L„3…')“†„
Rb†4Œe“c}ƒ*7”_—y’N>ƒq‚]‚w"…Fp]XYJ'
!!S ‰*‚tR‡zf¡z®u~n „u@0sƒ}
ˆ&‰32M`5=$ƒC_(   _z…D‡Œ9'(‚U
0       -BI‚0VX[‚ˆ5–„B<1”9‚‚BR”h‹R‚zŠG‚M$§‘h¡K†„x*…ƒ5T0“^3‡!„G"„zƒ'ƒp‰0‚7„{Ž@*<*š-Dˆ!„!‚=z3‚P=A$ºƒ=3‰„20†ˆpR
G8‚=„#†)…IƒowK6ƒMŽþO ‡hBŸ0m0‡v.o
‡b„A—6
kˆu2»/
†r)%0ž)‚9
Y‚^—X‡rkQ
1@‚h‚‡V1Ÿ4a®²#‡pd—0‡h$ƒV‰3Y‡0=‰BQ-
q3?
)D
,4   
<‡:‡‚IS
f"‡ewÎV‡a  3p6     $$Z+0,¶SQ¾B4(‡‚@—2#Z%‚8‚-¦a`‚‚¦‡ƒ,Q0e‡sS‡Y¶ ‚9
%cŸ&9‡6.=&r' >D'$\‚`‡#Q4‚Ÿ.jd5!Lm     )‡…]„2
7UR‡b`2!‡[7 oƒw‚s‚KMPM
P)KJ"
!S ŸfHqx 3&¦F_(_z‚^}‡i8‡!§„x*M‚`T‡j
†3‚;   ;R1

‚|0—[h:‡‚4
;
‚=z3‚P=1‚gNo3m
ƒU0…;sOxnO—4
‚T
.Kate_seri‚G}
0!7ˆEA‰L‚n“÷G
‚m{-AÓ;¾¶nfkei‚V
ÄXuin‚‚gTh”õfograph‚>‚‚”žR,json‚K,        '7‚v‚8…=‚k”—.  '"
‚m‚œ”Õ‚etri‚—|”ÕsonamƒŽÿ‚~ploy_overlap‚‘b”—A6oli‚²5L,&,L
p,dxQ…WI
Éù‡^ƒž,&
>LBiWâQ
‚-y_area‚Kˆ
”—6     bbox‚KŠ”—:
lob‚Kˆ)”—7  ccw‚KŒ-H-”—)-

ontains_point‚KŠH
#”—;#        
group_bbox‚KŠ&
”—:#
    json‚KˆK”—8 overlap‚K„O8
,  |
É6”—
8, jâ]
‚G   regular‚KŒ4 ”—=  svg‚Kˆn)‚Y4
”|"Ol%# B
""ŸV˜€€€Q¿0   ²(0ƒJ”š)(00geopoly_within‚K„Q2$i:  ‰k
É@”—
2$\:    9âQ
‚Q   xform‚K‰k[”—9|[tab‚h
ÉM    •ùu
‚^    rgia‚%#‰xspati‚K2”—     
¾<rmani‚ì@schmack‚ˆ5t‘$Žx!‚Lˆ\1—`‰^:rˆ…}„q“W»|ŽY†/‡RŒ…'„   b…|‚.‚C™{Š8žg†W)ƒC;…?
Ž=‡s‚
ƒ0   +LŠ1<J-‚tn2†s‚†9…E‚vƒ  ‡
ƒZjŒcƒtYŒ/‡8ˆ@„x=”5¡@‹5‚H
5ƒAVg†F“9‚JC‡c;¨‡…=…p„-…!ƒG_zƒ`_—Q‚ƒ-†[ŒŒa²m'zYw=š"‹J…
‘&°zŠ3‡j‚m†/ƒI„*%‡#-p„n!Û™A—#†tŠS£   ˆ˜mŠ@‹U‚…‚9¡W‚y‚Ž÷
3:‡ƒn§‚v¶ˆf»S2‡`—‚Îx(—81A‚C‡C˜mv
†,)‚5r
‚nž#MZ
Æ):í\P—%—74¶SX
‚9‚(C‡Z
ƒ=$TiÆ
!V¶ƒ3Ÿ—‚:=`¶‚%‚„"T—D*‡„„v6‡†1Ÿ"Y=—ƒR¦…

^(
z
®‚X`zf®kŠS—2?*‚5       1—† zJ
—8MSjjE_autocommitˆMwxdatae3"1
ˆ    ’“`t4&O-x‚.‡ ÏrTš„4iXi7…M2¥~3
( Ò‹-able_printf‚wšfŒvprintf‚wšsŒ
temppath‚\
žq•œ
hiUz‚¬?ibibyt‚‘xŠw•£‚uf‚ŒH"b'ƒ@‘þ‚6ga‚‚"bytƒBe„!Jåz‡9Z“‰*‹[‚dŽ÷ƒ@…æú?ŒSt—o‚l–˜umpƒ
£4)—ÌB
i)st‚šK•Ò‚pt‚‚_4 ‚?\”M‚!&x     "&  7@iUT-        
"M"   /3a#$N%„E ñbƒì@‚¨o"&   7;UT
"M"3#N%            hub‚W
Š     #,‚b,&‚Qƒ(8
/m&p
ƒƒ=”ôB‚‘-
7,&4I8
/0&»‚=lab‚z‚dO‚R…':—†9O6
2':up‚„—†Yve*‘7}0„. M‚<ƒ]ƒO=†~ŠgY‰A‹Œcúw™@-x•Dƒ'
“ )ÆzŒ^J“[…(”fŽS—=‹†w(†:#‰‹œM‚#‚†$™„
-ƒ7m
†=“1ˆ^‘     „`ƒ8”7 U…I……H‚9‹‹a„¥t›o£‹˜o‚z‘‚!‚~†/L•     ‹
ƒ$%…N‚o„J±ÙhŠG3‚(‘~‚>‚@‘ƒd
¯_[¤t,‹^®
W†žp„ƒ
„a„=–
Q|"    uˆ
‚2žx„r-x•Dƒ')ü„CŽVBV   %‚#Æ#¾=¶‚Ých‡rY¶K
-%Æ,-    ‚_„e¦~Z¶U:Ÿ‚s—‚‡-
‡…_
Ý‚®®„SK[‡‚%†M—‚4‡u
†)[TŠ:,‹^J%U)‡R4rn.
‡H
ŽZ
^›-       z1:u=
`Z‚lOL3U.‡%    
ƒ‚$‚    U
      "‚1†YjCc‚ „\’.ƒ9ƒO…m’Oì•P„Œ]g‹?£9%šX’ŒIÜŒ     
•Dƒ”#‰gp4‹Ž|’.`6<Žˆw
AL¦gƒ‚[)X™¢i«ŠZ
–&uŽˆT„}‘Œt
‹
‘aš_‚X›K‚8ŽN¨—5‘@…B„W‚8Ž
ÀK$‹
^“     ‚° (‰V†#Öj˜{žV
IOŽþc
jpcu¶‡‚1‚
:„‡‚{—=‰‹?£9S
~LH
~[‚Œ‡—EB—6WLË
3‡‚D§7§@V‡zT¾*¾>
'X3C¶Q‡cR®l—6‡aƒ%‡]
‚Xƒn¶C§‚m!®7
‚8‡i§=†;—2P$)ˆ])[
j‚
k(†^
""ŸV˜€€€R¿0š[—φ‚-Ÿ
F†#.
—G{0glanc‹f”„ü…5ean‚ˆX
ϒ$
…eich‚ˆibcƒŽm—ëYVmps‚š5ob  R,‚<ƒ2‚‰r     
)=„u
žA…9
ˆTˆ‹)+
!2
ƒMÌV„j‰`™O2‚ Š#!?‚;'wB?        !V©I
91žw
“`¤†C²m‚+A½‚H9΃—…bÕv‚h‹z„ª^®tŸ,#!?‚;'wB?       !V‡q„_
91‚oÝ]õ0_"5,alf‘:
B"Yƒ
Š~:)          †y@Ÿ4HŒ      
‰Q=,¡!ƒŽoÇ*
ªlP„$^
žV
‰’š†q‚y—$@½bÁ@„)
Š!…¥m+PH—QP
ìo,ŸAŠj!ƒü‚|‘RŒJMƒ–(V—.
i0¾†)¾ƒ<
‚a‚§
@2”ƒ
E®§„_config‚(‚\ƒ#?!‚(P=£q&>ƒ#?!‚(P=recovMÎ&ù‰ausƒ¹-—Ì^ss‚¬“Ùyph‚‰”—9+m‚.<ƒ.ail‚…O‘þ‚time‚
‡U%ùi%_r‚
‡Q'ùe'n“c€‚arli“d€‚
t“f€‚ome“e€‚u‚
…ZŽv—ëY_oL
…<Š`m
Qm†;‡*…w    ‰Y`-KƒtˆB˜;ŠU^‡J†jY™F‡…DŽ9…g=8‰4Š›"ƒ{’X®weƒ*i9…a…]¹|„~®:Ž„R–Oƒƒ„B”ˆ6•³,†{…†"†=‹3„}MŸ,l–Š5‚5"ª‘ ‚œH‡¦:‹ƒ.¤3‹]³        °6\|ƒQ—V…["„1Žþ`dƒ_—5»¬Ÿw(‡ŒHS
B®]"=`΂Rý‚{—8=8¶‚‡^%{
#Æ
¶Ÿ
;¦u     ƒ—‚4¾C@‚g‡†pD|ŸVSNŸg‚0®YgÆ$;ž‚gJ„qžu[Bh44\gal¦9
›™.„-Š!ƒW&ØmŽ^¸   ‚
„SŽþ‚"ƒ†;‚ï(ü[e‚,J‡h,‡„}…n‰š~Okƒƒ
ƒ>ž©&îUˆi•L     
‰`L½x„4‡j¤z†‘ˆ0®u Â8<΂3_3öVcÕ^<¯"”xne‚7p¥=AF)§H’úM
„º(¶W(¯‚
od‰Œ/CUˆ    0‹\Š]ƒQˆv/›jTé,‡pŒH…k‘+‰gˆ/“O,‚c„e-ƒ%yˆ4‚K:
„i<ˆk‚$Œ‚

„\¥4ƒc™
Œl¤>‹.“+&ƒ
BuƒU„ƒ=†)/"90Šeˆ`ƪ/‚*Š!r®}…‚E‚“      „Z
gŽö‡_—>
a/®C¶ir‚vÝJ®‚f7
O-ƒ_âJ‡mD‚
—7
¶ƒP»KÆ#
RBZ?D"/"90„`
‚*®7HÆ4%TÎ
;byz†D$jI    *YŒs<|D'LN‚-‡—Ì6
V|<|D'LN‚-l$fio
ƒt6•{gl~%p:
‚hƒ
ƒç-½[=¾$pŒ[
xsub‚ˆg‘.8I™RÝU …E8I™Rt‰MŽøƒcha‚8Ú-o‚Žq„2¡i8£`7N”V4-+,¹f‰7V‚]Óp“F–p‰
“pÜZ„„2
 :8ŸA
+7„á‚j4-ten‚ŒW—†Vvƒ
Žÿƒ
ern‰S'‹DC4˜-ƒ&ƒT”äƒ!ment‚Ž<rab‚ƒ7ƒ6£ƒûhcefulli†t#†~O*5ƒ0‘ˆ>K‚‘:(O„Ñ['de‚*
ƒb>Œ)™K)2     ’SM˜šIuat‚†@‘`’…D…¿/ham‚‡iiƒ‚n…TƒE—ã_n;O‚\‡Kmmar”/H#GC2e>ƒ;½%¶Oh‚‘702Y>
ndchildrenƒ„par~
þHh¾e
mht‚„{‘U

(#„s¡1Ìx%Ë‚$‡‚PDular‚‘ph H3       uoZ‚m•2
@‰LO     w)3QK.+ 
˜    ‚
„,xx–†¼hO   wl)3Q
$
F"!‚`        ‚k7…<pi=„JK']Z 4
!G0 T?

""ŸV˜€€€S¿0  °.•ÕC‡k Ÿ‚.”13i‡er0graphic‚&Y%‰„        /
ƒWC”—
Q‚ï
,Cschen‚‡{sp‚ƒPte‚•‘‰1ve  eat%       
|‰/cC«Gˆ3}„X‚MŠN=†„z*|Ž,Èb–Ddè‡3ƒk…D¥sâ^®[
âB"Xk¯Wƒ-@eršG†;ƒ%T‘G7
jZPƒ">6cAsƒ
        
†!  ˆl‚
#ˆ!
hˆ        "Š"Ž5‡Cšs/šYn‚&:„y™C–1ƒD†
q†uK\PIŒ¼>a©®0‹fŽ       Ši
ƒ4rm„6ƒ“h†W=‹ž~—d‚?
™o¿”D‘f"Œb&“Zs1Y6H–O
ŒU;ˆ¾h¶&Ž„lŽ#m*‰"G…-D~§l)‚%‰ ƒuƒEŽþ‚2¶g‡[O       B4
jn‚&ž\6‰l–1ƒD†
q†uK\PIŸ‚,
‚raZŠ1ü‚ŸoŸ$~‚™„‚bü‚rŸ…O‡h
…‚T‚1Y6H
-¶",¦EåX‡1Ÿk—R9ƒmD~)„k¶‚Zst$
"b
˜Wý‚"li1*’ˆ$™‡-1»R°b‚cŽ÷iƒŽ:iÓ1ù(ekv‘}„€&wn‚’
)
ƒQ
“ØiD¾qÝo
wichE„%¶O?gorianMŽ]„0¶OJi‚r‚g *ŽC‘˜RoA *p‚I„‰7"Š…?–þƒl‡htw‚8
‚G“ƒIid—4ef‚~vouoessten‚ˆ;ssen‚4
ˆXup       
„…Bi<T‚XCŠ;5-f

 $     +…WPK&&
—
:R^ŒW›|9(‡3
"Ž4C+‚l9EA§ƒÂH‚N…‰I<&
‹&&˜xŽ—’™†4ƒ:|av‡ruL.(b!
M‚m
‚+w'„U
       Š^>¢}´_Œc”6‰L $‰‡
Ž[-•1£E„FƒN  ˆQSƒµøy3a‘‚Y…;ŠI¨mµP5(‚
‡]C9E¾@  
ƒ
‚¦n0¶]<&¾1ÚƒòIu.(b!o
Mm
&Vw'„U
       P—Ÿ„‡fJ ®o
‚-[Ÿ)F 3‡…;ƒ¾0Æ
S‚®q"§†)—Ž3_concatw
—‡wJH…'K{({(‚=    †H8‚;/
ŠX™F£…Y„Âq'KS({(=  „%8‚.
~/
.íkwaR7*Z2*†`‚JcF‚!ˆf_D        
–\-‚‘}…‚tˆ%Ša‘x‚^‡Šs‚[¹ˆ
†n
„/.‰i˜~„`ær†Ž÷%‚J\F‚!_DÆ‚gƒÜ\¾†CZ_Ë‚q® Ÿ_¾4/
»<Ctjv}n„v‚ˆ#A;Š*‚)ˆ(‰ ˆvù17A;‚×_>'thƒ    ¦T—ûŒp‚U“|3”å:13        undlegend‚ˆOt‚K.>‚*q‹ F‚i "†{ 
*“D‚Yƒd
ƒEZ„97
ƒr‰_”IG„3„Jj…KÛt$5*Žk…`‚ST‡%<‹:ƒ5•V‡r†‚b“Q†^|‚uˆ”     Ž
ˆ$
…,U‰;8  …       …K

…

·)›4‚‚WwO'+LˆL/ˆ&]c#7''''*'''''''''1!''''''''!'''''''#!!('''‹>‹z=:LGMLx3rˆ"…cƒb;‚qj
žŒ
„:   U
‚,‡RI


:%     2„„gK\‚Y„Mƒ0n
*)L0 W™…F„Y#

+ƒ4‡2?ƒx        

„g
z
  >           

         $y
„v‚„-„Ež-¦ Ž~(K"     †e:‚C‚?J
C<|P
.
8‚BSPu…:g!„U‚C

fw'„A„      o4
<
<


#      RzE!„`xynN
      10q+‚\+     -4ƒ,       ,9„&<‘C

$† °P"…v0 †x –"‚E        
Ÿ\‚}:Z‡V„57
:!"AG
‚r

Dz$h‡,5*,^‚ST‡5S
Iƒ54s‡r†‚b“Q†^|‚uˆ”  Ž
Ÿ‚


„a
%        …       _

…


ŒM)
2‚E4‚‚WwO'+L)‚|/—8…q&]c#723
;…&Y-#'

…k‚#H
""ŸV˜€€€T¿0<Â''''*'''''''''1!''''''''!'''''''#!!('''''ût(=:LGMLx3rˆ"…c‚D;‚qFj_
W®ehÃ/:„f

lI


-% ÕtwK\Y
‚V
ZG&
*)L0 WZ—.
3?¶S§        Jƒ#

+~…d?$‚a    

Pƒs
z
      >           

         —3a
(„E
‡e
6I(
ƒK"„PK‚=lJ
C<|P

b.
"‚BS u¾<@

fp
s„AVr   o4
<
<


#      <zE!T`x_nD
 1
sq+‚I+        -(I 6ƒT3i

$     ®c–";0                0guarante
„rŒJ
…D!T'4L7[rƒ7
e‡,
‚44k„.ˆMUˆ-‚O…=œ$f     ÔW EÐK2‡<ŸC‚tœs—&‚…N‡
D¡MµKŽB<]…RŽU ŒOˆQ
`$²˜›!.‹`ŠH„=„‹+¶2¤T‹{#0ƒ@
“E
^Å@˜*Š‡[Ü‡l…zƒ‘/ZN‚Ïc‘†)nOŽ÷t;ƃPž‹wÐK2‡<§‚jõ‚“rŒ`‚…NI¾³[Z¾‚}O$‡ƒj
Â,‡ƒ^—‚`—6        Ÿƒ5‡†J
„#Ÿ—A
…¦|^4XÝ2x…K‚(v       UN‚cw—,bnd‚Œ'ƒW…7ãH‚@“Ø."ý3ÝI¶ƒN‚‘„|ž,ess‚“Z‚
šb
ƒ@ˆR ˜A‘8‘P”ž{/³X
‚
% Ÿ 
„M4i)~F”D‹=‹‰x—†dŠwd
t…R„eUŠ       „il8‚W‚x9á[Œn¥M—q³ —@!S„ƒDú‡anc†     ‚TZ¤<•Œ+Uå‚-ttman‚S#"‹”Õf
!nƒ„˜Áƒz‚zŽ_I ¯
—†
1IÆ1
9
ipƒ¯—ÌI4h‚/N
!}
“zƒ;‡E'+/
™sVÌcŽ=e
       ‚LÖ„n›…f(<ƒG‰Tˆ,‡¾b#¨S
Y„H‚E…{Z 
‚‚ƒK‡_<„2‡y  ,
5‚Bƒ    v(\
,ŒFŽ.,‘[1    a
‡#59›‰a…rs%«T‚„Y:‚$mu
¼+
„J“T…u0      
‚j.‚Z‚8Žþ‚#—§0'+/‡‚s —8¸Ž=—0
       ‡xkƒ„B.4ôm7‡ #b}õ‡h$õ
!‚‘7‚J§‡j—:  ,5‚B
‚qq9(\
,‰&‡azÖ,ƒ!1       a
Ħ
—v
—!*—F3B0  —.a…#‚9ˆC3&.‡lM\‚X
ŽZ*‚f./\O‚S‚&2(„8„„sˆiˆ* ‚"‚
3„…ln†K"k„eƒvŠTƒ(‚@7`F‚;ƒ5T‚]…y|=‡|Cz†+…–{
ƒN_ƒ
[7Wr
Ds48
H8   S?3

z`R!#> I
P
‚DQiƒ?(V56A""0‚~‚9‚

TS‚q
< ‚p…GLƒC„(p‚
+‚
…76
Žf%
‚/A''1);
d.
„ ‚Xˆ\/>2
…1   <ZPH
4‚1$‰-a    ƒ…wy„\Jƒ „…_‰ƒ{ˆ3…sˆ!*ˆ{-$‚V†4ƒYA …ƒ…nJ:‰(n)*A&„X‚GN‚%ƒB‚n8.¾S‡}¡s”/„H„l‚)ˆ\<\‚O>?‚2„C‚Eˆ[<^‚t$‚i      O
V…N&
&„hƒ,‚W‚MŽW+3‚%Q6†E†%‰ˆo„U‚†:…_…"‡*‡~„y™CƒU…….‚4„o,ƒƒ[„k+H„'|]„+…Š$ƒ’pSWŽtƒ(=vY…„,†Rƒ#†YJ‰,o„;‹
b-'‚c‹S‚„)‡†-“Y„L
T‰‡C*=_cF-‡[…1ƒ‚9‚/‚;‰"?‚#ƒC$‚G‡ 
7OI‰    '8\4~‚Gƒ „1…-„J`Ž((‘{<)ƒ‚b‚‡!‚8…T‰?^@Š‚BhROG{‚e-3U.'ˆ
`…ƒ?9F…L  
D7ƒ‚Œ<x…@…/%‚‚\*‚0‚C
…>‚Oƒ†bƒM‚':…rE„QŽj‡em!„e„n‚d
N,ˆ5‚"^g6"‚l&
\&
†e      8ƒ0
3„I‚9ƒŽ5„ƒ9„
{
"M‚Ba7.#Hˆ
‚‚8„R
f†S
„@‚3‚H   &~
#…8C‚fF2‚‚cN2‚H…–pu3L†„5…G… S^&%,…'
""ŸV˜€€€U¿0ÌID&(‚„k0ƒIƒH„!_†]_@†m       
r‚T‚HFV
#`    /ƒYTH‰>ƒ‚}4„‚)=‚

‚,‚ t<
8‰C‚‚&zM†i
‚%#‚8
 8ˆq†/‚t‚8

G.‚B8‚m


ƒ`„cƒƒ%‰Kzƒ`@D
„P‚5ƒ&ƒ90Š+6‡šNƒD\‚‚J/†o‚j„6‚yd…Pƒ#Q„)Sƒ^n-  i     {‚%'H9v#  .‚ICP%9~%ƒ,X!>A‡~T…6ƒƒ"%„ig…‚~ƒS‚*„W‹'Še‰1 8†`A\Xi‚
E‚F‚ƒ2$‚L„U ‚A‚cw…b‹9‚F„!ƒkJ…r‚       p‚
Š4o!‚\7ƒ:†„g9:'ƒ„a…$‡Krƒe              qM@‚$…Rt„‚Zy‡Z?&‚T‚y„
D‚      15‚Y2NŽ‚2‚k‚^Kƒ<
t-C6‡]&„Sm‚yƒ"  ‰@2„‚ˆ„A‚…_&+LdJ0+‚D‚g7ƒ/J…„g(ˆL‚
Av†
nŒS    rt"sƒy3e;„U

ƒG*
$ƒ6^„„    ƒ}ƒ‚P†[…)V2†|n„u„Z`ƒ%‚'‚%…(ƒ†+NHl‚?ƒj8$?/‚+T‚A‚R„8
       VR;COmG‚=‚aIO
……Q7pYd
"…[Z…9.„B…‰yŠP0„Š#Œ–X‰(‰+‚U’>A‚Ts5ojI¼HÈ%’jE2yd„Qo~a‚1ƒ$t|mŠ$‹,–%„[‚DŽ@Œ`ƒ2\‚d‰:*(†4ƒ*†
‡9…aƒ…X‹R‚{†S‚@ƒ6‹jQ‚Z&‚’%‚N…vˆXW—qƒƒ\ˆa^ƒTƒUG*
‚T%:[
:†UOƒ_‚6D*„C‡6ƒ^ "‚iƒ‚‚|R#
‡lŽöx‚ra ‚Z]F
‚JF‡I 
„u*+I‡mJƒ
+nL
@(7)*A&9N)#B‚n‡*1z
ˆJ=g„l‚)x‚O‡);‚2{OE
‚r<h
U
‚G       O
V‡c/a&N\‚S+3‚%Q6†E†%‰ˆo„U‚†:…_…"‡*‡~„y™CƒU…….‚4Ju^S
5D\@3…\_rSs‚yƒ(=vY‚+„,v„{JGX

ˆ]b…'‚c|‚„)‡D‚'B‡TB—7¶?d$Ue
—6K
‡]2K‚G‚Em…-„J`ƒi(M<)ƒ‚bG‡!‚8…TƒCE>‚‚9
OG
#-\'     
`CTLs
7‡Dv‡‚ƒ x…@N
%‡gÎ<‡e "^g""¶3MQ\a7.#Ÿ :~M_‡dJ‚3—3‚qŸƒ`‡^H‚_9_@
=    ‡Zpb‚HFV
#n   o'>  
4c02E
Rt<
8
W‚Y@nžu
8‡P‡i
Kv¾>D


\‚Cj?zƒ,@D
&‡X
|‚3
{‡^1%

‚tMj‡[oŸ
3‚c9
ICV‡)3‚hIC,Mp‚‡j
‚Lo—3%‚%Mrƒ
        qM@ ‡^„t„‚Cpv?M
k‚y^D
*1'‚2‡e‚‚2‚k_‚^Kj
t-C6z?m‚rt        Q‡6L*‚U‚
,&LdA‡‡gWQIOj‡k
5A9„in
ƒF    
c‡Y1O
GH„[~})V2

$ƒW7"‚A(ž
‡g
 S‡b1.U‡_§‚W2yd„Qo~‡tav‡d
‚A$(
Cm|‡b\        ‚A<   )    ƒ‚r
—A\‡d'‚))v?
‚oXy2JKlQ‚Z&‚9%‚N„(gW      
1ƒIF$
‚jGQO=D*
4B
! L‡a#
0habit‚aÚIuck‚ƒ)<
ð_    ¤J‘˜/„º\erC‚cˆ_
t‚gƒkŒ\‚h‚ìD«gqC‚gÚq6õ    
‚new‚—jd…% ƒt¢r‚P'4ZŠj
’V†ZDˆQ        ‚L       [%‚(Vk…6'
‰E%ƒ/‚n„G…Ì/‘7¢>‹[„&Žg„s†X…X…j¬_„'

l,”EHƒ&Ÿp'’L„…B…1–
…‚B®)Ÿ¡}‚%†s‡0‘SÄ°z½zÈ3„I4BŽ/Œ-ˆT‚ZÜ|¼x‘7¢>+3í‚b«‚xÆ&‚AÎ1,¶ƒ
‡D
$
E¶9:Ã0v2—/0âa®w2žš_'`
""ŸV˜€€€V¿0¹.˜;l‚0haldar‚4ƒ‡zf‚†=Š}‚_ ’}ŒXŠ9
Œs9±¬CèV„B“‚ƒh΃†ƒt¤‚Zt†q,,¬,„oŒ8ˆA—9„EÑ\¬gfƒ1ˆI‰k‚:ˆ'ˆ=†%ŠŒ}7—x:‘&Œ
3“–p;e†_Ü@
R†O"…1—9„EÑ\¬7ifnul‚·4Ý¢fmblen‚†per‚Š—†<n‚Q”ÕOd„U
Še:…B
@  >
N+‚pŒyH
‚E$Œ(…‚R‰8„G2
~5
kd(/$Z
        ,'"9j`‚f
\„o‹%:ˆg%A-8R R´mƒ*…_Š#8m9{†/+‘M
c(‚*
H„i…8‰•9*0”W…L‚h
žD
†
„{ƒZ‘dƒ^„‚y‡Yƒ6‡|‰\“½IU†`l#‡˜oƒQB˜2‰–X’‰r
†ZG
ƒZŠzx%7
”†s„‹:Oš$J‡K„~:
ƒ$%)[,,‰j†h…H„BƒP‚n)‚8œw‰O…
PŠ8%¢S¬51‚T‚;˜?
‚&×*.ª "‚ˆcŽöwT®w
#:A%A‡‚Gr…ar‡ƒ§\‚#8m9{R/+‚'‡i
M(ŸEƒÕx‰,9*ƒVXvEŸ Æ*‡h
‚     ”9FM6§/ˆ\ž|?Ÿ}w
G¾B
b‚MŸ
<G‡
‚Si%7¶‚‚,Y'‡„—6i 0:
ƒ$%)[,,†b‚
‚5[')>8‡vZ…
P
‚%Ýh="
‚B1ôlY+—Dlƒ5"„=‚ƒ-*Q“;;‰
’…2rE   s

+e$e

Cr

 ,( .(
^-\x7A‚j-
H‰}:3‚p‡Qzˆ„(B…ƒ

)    ‡;Nˆ`Z       kh
ƒi;9–=Š/.”E’_ƒB  ¤;ƒY2(ŠZ[*¶B$…Œ;…ip‚ISna.éxƒ„4ÓeŒA›/}£v†WV@ƒcƒ,‡y
P”,¶
†O(w¬J
F p‹e44sl…G‡VE44‚ƒb//+‰D,……†H‚gJƒP‡Cƒ$‡…*D
†j.   ƒw…(#<‚ƒU‚aŒ?YRn><‚˜@¡¤k†$H,ƒd©"ˆ·Dd‚N‚,Lƒ_„I     ƒk
       '·,¨K…d„F‡¤@™h†3
†n®}‚/‡;
=ƒ      t2([*‚u‡*j^ p.Sna.—Õ*J7‡g‡hˆ%‰sv
ŠíNˆ9…rI
&(wmôHü.„ƒY—Æ0<YRn]<‡ƒ#„¾9l¶]
1—4lÕcXýƒNƒ®r¾erHx"$\;J1
+\ ,N%Ml'
‰6F$
„

ƒ
ˆ8"„kƒ2   jN[Is‚       f.j‡(—"-$?F=8IŠI+&q?$C#i*g ŽÏ{F¡Zˆd¡Nø„®ƒµG6ù|
DFôƒQANtypedef‚%Y…<set‚…*      phazardli‚ˆ•S”åt„;pen„h¨8‚Š%…F76
]7‚!
t’<‚0   ‹ „n“…‰a–w¿;Ìi•0ƒN‰fˆ…vk‚n‚Dˆ(q†  ^…cŽA˜Ž``•`µ.”r
‹X„eaƒŒ\…/‰0“ƒ:……C3#›\*!I‚
ˆ‘®%ˆG…XŒ?aŽŒK
«œ!ÃfˆuOÆI‰h
‚*‰z‚E.ˆ5‚-Š$•M‚5ƒ+;‚E„Fðaež|÷l’z'´J‚nc’‡mŽövt
3a¾‚7‡ymŠ+žtbƒN‰fˆ‚DLkΟ„~X0‚ƒ/Ÿ0Ã(*®‚"Ÿ[‡)9UW‡5
ƒ

‚A#*Í>®§iÖ9‡9—K¶Cs‡nm§2
ƒ>¦q‡d
;Æ…#T®‚„‚]yst ;Žø"2i‚Š5<…r‚Hu—…li‚r|>UBD‚X‚$ze‰†‚9P
ƒ^>„b-
‹T"wE‘Bƒ5‰>¢‘ˆ5BDk
f7‚       'ƒì‚‰0E+í…
¯d~
S 
mv"W&
Š|‚<´e…FŠ
˜Z‰S²‰4ƒƒ!ˆ"%":—Pƒ|˜&„
¨W ƒk„f›‹k‡6hˆ{(†?,
H
""ŸV˜€€€W¿0       »?…‚Žy   …¤l#–a
‰;ŒA
„/‹EÛŽH}9ƒ)‚Hƒ5Žö~5‚<Æ®JŒG
ŒZ  1O‚i'®‚q‡q ‡‚(4Y¦ƒi¤ƒi‚(Ÿ…dM§=Ý!#
;
®D@Ý]^—Ÿ
}9S=0hard_heap_limitkT       †Zt"¦x–׆Z"164„dqƒT3¤V).“È‚IƒŽS
).en‚’a‘‰r’ƒq?Œn…]6
ªŽ÷       Yˆô]Oli‚’CwarmŠo‚'’ŒC      ˆS¥|›e        ƒn>…"ƒG#ƒ.…(7-ƒ […£m–|U—–Z‚,AIŒI
ƒ)
d„%…\Œm“‹aL†ŒQ‚IÜr”Cì?FŒ!—9Ú_Ÿ!;¾?5ƒ[…
;rÊ„G„bHÕz"‡ÝƒVd—(mŸumˆzƒ\S ‡L‚ZU#‚#…4"ƒLe „‡fˆz‚Zˆ9!Ž#ƒ#»/‚}Œ  
„O*„NƒhÑ'©)“¢dõ‚8…-‚ZOi‚m
bƒ#Ÿ‚=Ú<
‚A*¶‚epâlyŸƒZ®lIless„>   Z‚-i‚Jm
$c)
…}    o°CTƒ&œ       †    ÂÝSˆmÜ›u…Ö  Æ‚8Þ?       li‚ˆ•êMoni‚Aù[?sh•!
8 :‡6Žú,°X™     
‰\

¨@g'žF

ƒj%      Y¾%%0‡H/†(>1‚$      $^Rv4

Š‰E« 

'4.])     IŽþ_
-
¾gžx›FX™Æ"
‡>
å_jgƒ–   J%        ý%¾1g/&>1‚$     ÕuOGtK
Æ„2  
'¦q.!)kel‚ƒy“šC9n‚ŽTsl‚ƒt‚s‚g *ˆ8ŽD‘˜RpB *e‚‡]“š‚uptsaechlich‚‡lve„(F‚z,„Lƒ‚s;†x()…‚B&ja‰)56„p"@‚Zƒx‚CK…‚f
†^*†o…zC†.‚M'
,\"
†,#‚B"&†9ƒ'bhŠ„}hƒ_
 Š-…iŽƒHˆ\‚p„j!(l       13‚3‚a
‚6XI}vƒV` g‚$
1%ƒq‚#D7jgx/‚[N
 Ft†…I„ ƒ&‚$…io5fF‚W2"„pˆ†7
ƒU3<ƒ‚„
f7%‡Z@r‰v‰x‚U
„=,$ƒN„<‚K‚7Že…ˆ/ƒaˆ†0ƒ$=‰/m6%…xwAD„|$¯oŒ(ƒQ‡6°]x‚Œ‡C
ˆ'†Uƒ*s†/ƒ/h p…5‚Ž‡m‚'ˆh„"ˆP„*ˆ-„„J„1'ˆPˆiƒxq‰
    ‚1„‡,ƒ[r‚7J@„BXT8TG^F]‚kj:K‚\M!J›B…Šg‹7”I‚A„\ˆ.Ž“ƒI4ˆaM/‚ ‚žs=0‚M>tƒR„K‡+„+†s-‡UE


X„0Š>‚p‚,„|ƒS&s‚|`]ƒuhQ„&&8~ƒ2E:v(_G#k„-ƒ‚}Z,ƒP‚5„H’g‚P…O‡“h„v…q>Œ,ƒBƒMT\bƒz!‚fwŠ;0‹EU‚Q*
‚ƒ>%‚‚C‚*
„3m2ƒbg‚]BB‡…IƒJL…‚Nƒƒ~>Œ3‚8\jƒ‚aIO‚„ „e„_„$F22ƒ!z„…‚‚4I…)ivT„]a>)‚6(3{]„3…ƒkB‰pz‰‚3‚ƒ.‚! +1V5[…ƒ8
ƒ5„u‚T‚c9„4)V^tJ
ƒl%@&$"‚&F1ƒH[‚:ŠO‚/$D
;‚V. QVŒ`„e†^Sƒ,ƒ`N†…Bƒƒ/ .†Lg!ƒV…dg‚a0„\L+ |‚"KJƒˆo‚Koƒ
ƒFSD…6',‚[&ˆƒp„‚E„p„WC'Wƒ‚`

‚$‰…(M""„2ƒ|‚wƒ)Q„N„D„_
‡x„*1 c|3‚!ƒ4P&†wm‹;0ŠQ&?„Tƒˆƒ0Sƒ<‚;K‚?
<6‚i‡$’1>„u‚lJ
ƒ‹+s‚ya
s‚ƒZˆ>_†ƒOW…K‚&ƒ?_ƒh‚\C
‚o‚JNƒ‚b=C.9^"5G‚&H-`…7=d6‚c‚-‡^>‚ŠN        ?‚Š
*1W‡Y…'B…`Š{‹    ƒ^ƒT†KƒE‚i‚$…D‚^‚‚ƒXq‚ ‚Qo<Šm‚"…E‚&j…u2[ƒyoa        (ˆ…EU‚A‚VF„r†m$ƒxj3…b6Œr]‰Y…’1fQ$)8U† ‚%…y4†T ’k‹1tƒC       Pƒ%„S‡„R‚V…><
‚"…K‚2(R4„
„^3a‡P        ‹:ƒi‚Nr=*†?=9†ƒ-‚ƒ;‚U…w
ƒ#<ƒ/Q\‡ #ƒs…qŒ;š+<?ŠJŽ-‡5Y‚&a‚<P]6#&QK(ŠmƒOm‰[ƒ        
B#$Šgˆ?A“#‚R% ‚k‚}C3…|s")‚
?43‚mzƒ
)
""ŸV˜€€€X¿0CÁow      ;…1-‰e…nˆR‚2—‚sw0ƒ;Œ=‚P‹    ži“jb“8Ÿb”4RC      ƒ’}Gƒj]‚q-2<ƒ
inŽG†‚{7zˆAŠ}…      ‰.K/‚,ƒb
&…jˆsƒ\U‚0p
ƒV‹Z„X4ˆrƒXy"Yˆ„|‚+ˆe‡
ƒ.ƒ1„V„%
<ƒ|a‚OPq‚nl!.ƒU„
ƒZŠ[  ‚g‚jˆPe*‚(_"…QM <…RƒZŽö‚u6_%q‡\
>r@v7‡a
U‡C,—:mc
m6n‚1
eAg&‡_
2†r‚
‚z‡,
†4n‡d9EhI
{5d|‡m‚'ˆh„"ˆP„*ˆ-„„J„1'ˆPˆiƒxq‰
      ‚1„‡,Kn@B~G^F
]!z‡Z
:K%!‡k2…‚

„U7…g;_„        M‚1
4‡8M`/,‡E3
=‡R.‚"-Y—n¶‚\


u:
4&(G
k‡‚06‚TC;‡b‚k‚5ƒ]‘;‚P‚[‚0“h
n…qd
9M88/\!*0  
‡E8‡f‚
‚(%
‚:‚*Ÿ+mŸ§
`F‡e_z¶VN
5+V5Ÿ:‡ƒ+‡‡gJk‚c9„—4
&$
KE$e‚/$DŸ‚2 ‡ig!i‚Q

‚02>
f    ‡[@KJƒo{D7
R


S2%,aƒ(
#!
A
'K'(cžr7‡g"‡k`n‡d
1‡f]®g:0B&?‡Y8k‚7‡`
Nƒ<
K
a
S6|i]*E45A5s—T
O
{‚SkF‡`}‚J

$bD‚^‡+—‚  ~&j…:2[
'!a    ‡†_(U‚A‚[
,†mL1xj;‡[]ƒ0y.Q$)8UD‚%t‡P:   "tƒC   
>ƒ%F\‡N‡0I<Ÿ‚ ‚,-‡e0‚,3
†    t‚‡=Q Kƒ/Q\‚\4Mc
$‚<?D‚b¦D/‚‡c@C ?‡ƒ1§Œ ‡d.
‡d
-v‡`
*iJ†K
R7
%ƒKw/Jž9w^&KE‚w‚‡‡r^4  ‚ ‚ny"Yˆ„|‚+ „56‚=„IGjEL-
3

B     \O
&e—
d0have_fdatasync‚
‡ù(gmtime_r‚
‡:ùNinterfac‚‡
ù]!snan‚‡|›Sù]{
localtime_‚
ˆGù]
[r‚
ˆ'ù]
;malloc_usable_s‚ˆgNIù]{NIposix_falloc‚   strchrnul‚
Šù]
ƒusleep‚
Šù]
ƒ3tim‚
ŠUù]
ƒizlib‚Á\ù—3zard‚…R`
”l*•Ò_%e‚&#<†=‚z‚o‚]Z‘]e§e’…?ƒä-‚]_Úf
,e§‚adŒ‚QF
Œ,&$‡]        N„)/–°
$Õ|
$     er=~i

…kŽ[¢Q   ‡M  ‰T'
™pV‚r†(n‚x†a%
i,ƒO2ƒn½‰q „B@†30`’#‚p…@5„JP…+5` „wV=ƒƒSDC…cPO#M)‹H$&ÁKƒM‡Zˆ}S‚+‚vƒ:]
„=Yˆ8T8‡Wh
%z%ztUŠ%F{ˆQ‚
‰Z‘5“G˜iˆ'‰v‡ › ˆ""Z…}…s‚%
‚%"‡ 
 '”‘vdƒsbm
ƒ<t#
(.      $…;z„4m†j7
F‚6Z‚
J@„v~…
‚4¤f!#     S    `GD<#
/       B‚E„"‡=‚e
@Ž÷XÆN
…V    s'‡‚p—8î$†(—02n®„C®mcH§’k‚>ùy*‡93ÝcA
_‚,5245N V=‚
VDC
P5#M)¾+&õ      ‚GM
‚/Y—6
&8Týv %z%EUF{p¦z"HEƒ¦‚A¶—7
‚, 'z
ži‚*mn
#
(.      $4   
‚H8J†j7
F‚6Z‚
J@„vl
‚4(6!# S    `GD$<“7 "&V=
""ŸV˜€€€Y¿0·#
/       —þ+.NW%—7z
0headquart‚(‰{…_roomƒŒ—ë‚'p‚[‚
M.TGG  )     
ˆcD

 .    
    J
A‰Y…M›u¸L‘Nƒ
µ]¢Jƒ†‚Gƒ'„&ƒbH¾y‰ ƒA ƒ;„SW“Gˆs¤m#$ƒ&(mƒ*B…˜‚®hDÒ„h•MŸ†³U
aƒ'ü‚WHÒ?‡gIÆ,q¾:‡oƒj§"#”‚!Im1B®rallocƒ8—ëZfreƒ;—ëZreallocƒ9—ëZvalid‚Ú!^øt(†òf<r‚“qˆdÉ_‘‰‚Ð7d‚…L•êƒct‚*ˆk-ÜSA†Ëcibleƒ‰q—ëUvi‚†ISŽ&
@ !O—ëY
@ !OliŽm‚p‚kœa‚7‘ˆbightŒj2†Jÿ”>$0ER½‚7„Ù%\ÚWJ$0ERenyr‚‚xld„2œeB#,
UMa
qi_
‘_?
¡Z7      …6¥Ÿ>™]‘>
K
Ž!“‹N—
¯IŠ9©>„j—:„O‰%!•V„fƒR‚#ˆFsJU<ˆ[B¯
“70žM60‰L1>)%)4q‚<y‚fP
·S”zƒ%žFˆv1Ž÷
Q‡Z5Æ —@8Ÿ>™]‘>
K”/L‡Œ‚Ïc(  w   RuÂ}:Ÿ%s®rk‡‡ƒ3…[‚f¶GN*1>)%)4q‚<‚fP§XŒ+:—„Ÿ$J1ium
„"loz†<*cN
’&„f
°    a„A:9@?‹E©0„YƒOˆ<7Tƒb#ì)„L*QŒs<|B)LN‚)ˆ¯‚n½*
®k3X
…õ^:9@?…WÚ[
Nz<|B)LN‚)jåSp‚‘s•ñ…\p
$†6‚#F3„FƒG‚e
(’%3„+p„c‘&‹†
ˆƒ6‚W‹ƒ° =˜’S"Š.,Gxc<:D.ƒgŠx„/~
2‚EU/9nvR"²j‚X.„N-†*$„).†Vƒ!„^‚„"‚
‡RZ
šh;
]ƒ8%$ƒd‚9‹H‚_(‚"ŠNT(`‚‚,
„‡'†DQÍG
‹4w‡;    †0ž&‹!T=m‰l®5Š‘…
‚+ˆ#‚†(˜HŒ>‡,&†S›Š^…>`“H4†yŽ(‘iˆP¶G†T†„
ƒ4<˜1‰;„nT*
¯‡#Šj1-2>N‹z¢!•-‚ wˆ\‚    ˆ<…`:„r„T‹G†‚ÎJ/‚U‚f‹Š1ˆ‰f
}iJOm!ŽöW
‚W‡‡"Ö›5 =˜’SR(Gxc:D.Ÿƒ—‚Õv`U/9nv
N"‘‚X.„N‹v†*ƒdS /ATv‚
xM®LåK0N:‡g"Ÿ7V
‚_(ÆN(M‚‚‡g+
'
‚M
QˆDüa Ÿ9
.¾9‚X‚Ÿ@‡W—-i‚J‡iF3‚R¶2‡o†e¦‚?    #ƒJ¦/  ‡g#T*®s/Šj‡b/‡X‡;
[N…x      
w—„<‚   <‡d
/:/k‡XYˆ'
‚fŸ  
u¦h
Om!er‚‚8 i†ÜVAœ”vncƒ{ƒU†F‰
‚*‚^ƒDo†y‹j2„aœx‰SƒMƒz
?(P…2
‚=„krp‚
‰]ƒiƒE
‹YƒŠk‚/‚ZŒ      ƒJB+‰™ˆE…,5‚IŒa†h…lˆ` µ>©i‡{ï/Žm—ƒ‚z‚        ‡z…`Ž/¢ ††q
EM‚Z…k‡E„+’6‚b„?†„937‡‚D‚;‚8ƒnD„H9‘3+ x…f„H’]†bŽ.„<…*‚+‚ 
‚…@„lŒ{‹ Qq5ƒY0†„‚„
y‡
†D“ …q„A˜}‚:‡ˆf5YŽ
œŸt
ƒo&
ˆMJX‡‘"†!4…Q’ˆf”0_B‘#ƒC‹'KyƒR‘L¬o‘J$‡‹)Œb‚O‚…|ƒ=,+(‹2xsŽB‚t‚4ŸHXlpŒ†6y•…Ž÷ƒ‚xC~‡^‚ƒJ
'+A§    ƒhm5C—,x ©l©iŸ‚D‡WZ‡‚>?—7,®§‘ˆx9lg‡LE‡g
BMŸ"Ÿe®ƒý„‚1A§ƒ§‚~{‡XG1‚wi}‚e¶2‡h`‚Í‚c5®aD®‚%_‰—4ƒ"%$$+I
ƒu>‰s&
""ŸV˜€€€Z¿0ª•ìv
;‡…       ]3‚
;Y‡Y…'ƒ‡p&‡j
J§6g<‡ZqŸ&I
=ƒ¦@ˆ‡‡6§d‹N‡e>S
ƒu      ‚fž‚T8„X
7‚+ƒ=‡*+‡q>h^
‚‚t‚4sMlo‚‚Oa0her†]vP
I6ìY„ðh6eƒo¦W23‹‚ƒ„¢VA     ‚UB…c‚]‚g‚‰5‹kƒ:‚g‰6:…U†'•PŸ+‚Y&9
R‚
¥%‚T†c_F”…8ŽpƒsTŠkv‹Do‚Oƒz
…|EšPƒY¦gR‚-oƒŸ‚4†c„¾hŽ_
‹†‚Œ‰i_ƒR@Š‹j†+‚…XŠ8(‹&„†$}‡%m‹G’D†zxgOƒpšr¼-…u‡x¢~ƒo2DŽs™‚Žc¡9”Jç¯usr‚93•g¯°§
š†ClJB   
Kƒ†F K?‚gLx‡†#|‡…‡ O#QŽpÝ6]—D‡kˆ"…8Ÿƒ?Ÿ%”8„0H‡[¦‚+Ö‚/*<_‡\
k‚Z0Æ"„<‚‡ˆ~—;
ƒ&ƒ
S}ƒ
mƒ9|‡v¶Xgzƒp§
-g®;      ‡^[¾‚\‚1Ÿ…g•V\
‚0!]lJ*aft#*R"    §7ÖaB
ƒ\‘eŽ÷ Æ=¾/„ƒ<ýÕ}«hbi‚‘   †dãin‚DŠ<of‚’Tund‚‹ˆ2untergeladen‚ˆss‚üuristž\‚D9>•Ò]>
x?„ (‹„]…|
—Rƒa3
žT'‚y+…S›‡Ž9c‡F†ÓD
+gâ~®madecim„T‹J †~/O“pR%y„|—[‡P#1Ï~¦Q
„"†e&Vƒ
ƒŽ§
‚s#   `Ë9‚ßX>âm‚‰R&‡dbƒ›       /µO—Ì>
l/ Ug‚‚]ñu`h
ˆ7‚f|„c„‚mµl/†…hQhhhhhh‚C
¦K“Ù8i†[‚‡kœt•‡…
˜ƒES¼
‚}*        ©H8Y
‘ofø‘"üxdÄD”8r‚ç>fdden‚
¤}a…juOU0#ƒxƒ    H‚'N»‰6”>ƒ”g…l†v(„“6 †
žˆ-0B%    #'G     mŽoŠ4!
ƒ
„ÑTn
‚
rŽþ{uOU0#‡}‡gƒ  HN¯‡N‚N¶…^
aX9
k(„> ‡d
A‚þ‚÷ 
%  'G ‚

V!‡§T¯t{
žre‚8
pƒ.Ak
.‡vŒ2‚`
‚)¦=åGÝa2ƒûff
.1”2Ý_
‚)erarch
AŒ            i‚
ƒ?ƒ[‚~†>‚O—ã‚ÝOghi$
c/*#
6+ƒlôqƒ
<¡?ˆI„:þ.o
Ÿx¸.„21]†‡G}‰*
G‡(‹Bi‚#      ˜!Œ
²oak
c ƒ.™}„Eš*
¹_—@‚`–§24
žŒqŸt ¦g$Õz
“'xs"ôunË`Ý_` Îý„U¶B   akåH]Ý‚%‚u
!EM-

m
…C¦`er¨-
•/-+e
Œr‹jŒµ
‹(½ˆ{ŠzYª|Áe¬~w
›QŠ
#œ6Žq‚QO
‘H‚‚5§5Y
‰(¬M‚·-‚>‚:‚hŽþ‚l¾-bb®I
JYEƒ&ü^ƒž>΃rí,z„~—v¾‡hY§   
fŒPN—R-
‚6¦oOŸhst$1
7J“¨
       „XŠm¶-‚,
8¢x½4¾ƒ.YÝ#¯"ƒiÎ6®5‚ÈVliY˜Y   
ƒ"+
‚8‡Z->‚‚Rn¥q‚$ˆ$.‘§X
„‹70‚ç-ght~ „w-3NQ„*!U|)˜T½„s
 Q!U|œ'watU
U*SZaG#[e_¢Q0+—ëc/0+j£¾EVld…#Žÿim‚œLndsight‚x±:Ù‡¡—t
!
ŠJc…9‡!œ$$@(1‚/ƒ
$:
R
„
3.*¤kM„m—
ƒ,‰.ˆ.ƒY†4‰‚$/‡#o
-y>Fƒf-ƒ‚`eT,
&
""ŸV˜€€€[¿0¯Œ
‚B
*'„™¨%œO°i>F‹      A¿xzÜD*M„m—
ƒ,‰.ˆ.ƒY‚¡Òs
)'‚ƒ;Ÿw‡„-ŒA<+Æ>
^ƒ50hipp‚ o„ih†6Z‰qƒpç"Ÿt‘[h„z’…3
      Z…¿
*hstogramh‚½+/T0@
Èg©q Où“/T0„øo
 Or>grƒ59
2$

*C,
!„l†K=‚N„…)ˆi†RƒC‘"„Ÿn‚
:KA57
žb"‹Y¡ c‚E…P‡-'•ƒSÇz      
–Q ‡#V…L„Y„$ „"
#_Ÿ<X‘    ¢yÌbDž
‚µ<;K§Tý ‚MŸ‚^Zg‡F:KA5‡f‚À‰w,
FÅ~4cÕy3p,ÝT-—j݇#®s! Ÿ#Qq
Œk¶WcŸSi‡BO:†L—E„"†>7l   ©jÈ„<ƒP„~ˆ
,>•r^Uq‘2‚sìƒ
„aB—!‡\õ‚™%Æ0Kg      
Ý*—9”8‡hB¾Dt„   ƒ0V·1    Õ.¼QC„S
Ýg‚Œu
‚z+À?Œ7ŽU
ŒwA”=Œ† Ç\ˆ%‚=ág½BƒT .¾„    C„S
Šf‚Œ‚-„“,A»C2®n
Æ
%Qžƒtt…f       s_all_row‚¼üƒIfor_phrase_p_column_c‚½}ü…5this_row‚üƒ@wtr‚M-m>&”¦}jm>&n‚ˆ9—†oc‚+
Š!ldŠdƒY•R/… —}‚F‚‰>nZ[‚#‡
‚b*y8†
f
@[
3    )?x‚ƒ8*h!A‹9B†$ˆZ„r;‚R’a‰T(†e”yJe‚u‚p
„6Š3„G„w“(‡+Ia†„I‚'„YÎ Œ”-
ŒpKƒG±s"‡Q•^Ä„;†~…}‰r: #N~ƒl&Œb„`~„"„}95‹=‚]ƒV0†o-M‚<0œ"œ~‹5‘Q1q'†…X‹c•7->=‘K•‡„v‰"‘$’gƒ-Š\Œ‚E›z‰n‰‹JˆT<„ˆ71K‚R†A8JETG6@L{w›,ŽGŠ…Ž]†lK
{~¢;)(
JÈL
)’Q!‰oR”)QDœ‚>‚d‚
Žw•^}‡&‡‚#*,A‡”…3„rŽþ5mJ@M¾C[;PL‡(‰T(†e”yJe‚u‚p
„6Š3„G„w“(‡+Ia_X‡cl
ƒYÍ}°("§ ‰k¾93ÆL¾@N¾‚ÖD‡
ež|%‡l!Õ
dc  >Æ‚X‡c5|„%Ÿ„‡ˆ4Ÿn„K
gT¶/
Kg"8JETG6@L{
Z¦     Î8~§G"—''‡b 5*
…OQTb‚>‚d‚
L
}#*,ž}-)Mer†%Œm¦„*e0meaŒM
^‹n…Dˆ"A;Š)
†-Œªi•<^‚)û‚§ƒ&Õw6A;ƒ†?ƒ†TÝa#I6pag‚‹Gnest‚Š(ƒQo‰R—"Ò;”l
±H
ŽV’’M‹„„ÙM”?
„DHÝ*¤$Ÿ   od‚†1í##k„{+ 
%„7$P;0.
6£¨6!šs„k¸
-h"£*‡’>ÜZ“h!šsŸ%ýŽ‚‰„        „²ŒJp‚ze     ‚4y
¾>-¸mŒ
‹=‚M¤X„LÜV
©p-¬
a‚Ço‚M‚™ƒfulli‚J
˜`„3œ1ˆ‹kš2áZì‚#‚+ô‚6‚ç†5„£ƒst‚6      ‚U"
4‚4h
*‡bW„-)
‚XA°/‰K   $†h…z
                "      
!ˆ>†‚,‚y…;ƒR†TƒQ‚BF¦q…\‚^…`‚+©r„)‡'a„:‰=•m+"S0 ™ƒA©V¦p–,
Wð9œ‚RTŽö']AÖ›a”3”8‚ï>(—‚*í‚)‡1D§
FJ„“#‚i‡v!——2‚Ÿ6¦qRTil‚‚>
œc”…T>P'…@ƒ0%‚R‚=rÑTÓøp†NŸ&>P‚°„5‚¡'R‚
‚ÒtƒY†B>Ÿ5X) 0‡C—~‰@!'K
E-:ˆ &5
P
0‚b„cq …24]I„‚h&‰3      _#
Y_ƒ'
""ŸV˜€€€\¿0ʃcƒ“"        Q:„=+)2y“Ø=2X      0\‚
!'K
E-ÂU‚™.Æ$8Ÿ"))w0hour…>‚0…ˆSƒSƒK„"     …\°
_‰+%ŽM…k†º½5‘c9…‘ˆ„N"j,\…¿7_¦‡‡m*sekeep‚Ÿ6„‚]w„n‡uƒ…8–S…!ˆK™…&‚g'ˆ;ƒFO‚D‡27‚b'T?
‚~
W‚Rƒy„    L?…ˆtŠ‚†.|ˆ
1…}d„,h‹)f‹G…nŽ~*‡]¦$…m‹eN¶„6-‡4‰}³†6‚VŽ‡B›‰PÆr”—K‘a‰=ˆ‚`ƒV5Y†0Œ+
%9”*¦d¬[‹b†
‹*K&.ONK‰!ƒq‚-‡‚/‚a²V„V‚j…]ƒpŒU™IyYuƒR&Y
(o+„%/+D)`†V&‡
ƒb"Œ'ƒ`(
”N„<YŒ–8‡jšv‰&u‚…V†3
†px%>*…(ƒD‡
#‹z‹Mž?šc’Tc‚Ÿ n

K•fr,\”!‹
…RX„xQhk…8˜6…
~ˆd“lƒ<…j¯Eˆu„5…B"      –EŒ{‹z*…‚u¤.6Šm0%„
CŒF
„‚    (h>US       9”%ƒL†4-I    ”v˜Rƒ]ø>4‰‡o0¤2ˆV–{‚M„ ƒD‚s,†qfƒZ-ŽS¶D`-nƒ,… 
‚.*+‚}p
†ŽötEL?„J5‡‚‚e‚*K;‡e/vdPIP
t‡XHƒ

‚Kƒ$9‚OžkI<©vI
‚G‡b‡j
p‰P(  l‡K3‡ƒm—8®—#ˆ7cJ/žtM
٤
¾
MWaƒ6®rŸ/®‚U‡g'
‚@ ‡W/N
7x¾BP‡a#‡e<®p‚d‚e‡a‡e!E}'—6p,
\ƒl‡ƒDŸOhe`‡‚0‚^—~r‚zƒ<‚-‡ƒ       ,Ÿ"‡c       zÎG‡f‡`

‚)‚        —7fVƒ‡o—2-
y
ƒ(—‡‚;
‚,A     ‚~a†P„"†B'kN¦h*+diz†LqDev‚.u‚1g‚FŒa‘-…:ƒw‚x‚<ƒ ‰Šf•vƒƒ‚
‰,‚E7¡T„i
‚D‚X&ƒ$‚@

ƒ;‡<5‚lƒ‚’\ˆI m    „{ƒB‰Z~!"ˆj,‹eT…&‰V„MƒƒNˆ&ˆA•Gˆ{
o8$7˜i“/’aT<—a…i‚f$“]‰g“&„F…9ˆ-¤tƒUƒ„\:‹/†4‚§GNŽv‰ib’ˆ‡SŠ;“E…)>‚oO‰H‚q‚H‡
IQˆ}†d‰Gƒo„[‚7Ž‚^‚elX7@‚\u…YbˆC#}† Œd?^‚!E.„„8ŸR‹7ƒ#'uˆ
…i@‚0†.ˆzd†ŽS 7;“UŠ|
‚‡‡]„tŒDW
‚-&l‚z&9„|:ƒCx‚u…Ž`‚†,
ˆY•D0‚Rrƒ"T‡AP„sU˜yŽ
B"”8‚UC52…oˆP‚eŒj‰6ƒJ‰‚ƒ<ƒc‚/„[‡B‚(„h‰3„rƒ8…W’tšM†:ŠD…Mƒ‰ƒ"ˆs‡@†5†U‹(b–j‰L6Œ‹ˆc†h4ƒ!ƒ'‹uV=„8D‹v„e‰V&™
‹H…vi‰/‡w‚X‚wƒp„/…*„)ˆ4ŠvC/‚‚FŠ5‘@…:ƒS“…1.%ƒQ‚a‹‚{‰qN†Z‚lYŠ ‚z¨
n‹\"ŠTNŽ7fŠ“Œ4‰{
Š)D„-…3„IŠy‡_ˆ\Žöv
‚/,YXe0‡ƒ„7ƒL‡oJKk    2‡>‚A  ‚„3T<+
F‡†9‡-ˆl ˆt“&„F…9ˆ-¤tƒUŸH‚j4‚   
„N†0Gb4‚\†s‡7>37c7‡o„%—6¶#
SX7N‚u„V/ˆC#}† ‡^‚!E.„„8`vu|
!!ŸW˜€€€]¿2º‘‹H‡I‡‚l94„_LFP /„_®qyOn‡gq*‚"&97—4=®‡ƒ‡aprƒ"T:P$‚Y‚P¶,K5‡1I¾
‚Y…[‡[[@‚ ‡‚—=^wNNb—'Ÿ`     ‚[

6‡„7cƒDK‡‚    ‚†"
=r
8D)9‚1n‡=†F„}v„%~ƒ‚"‡#‡QfIO|‡Efa‡4Ÿ\C/A8,h       n&7S+¦L!l†vN†Z‡d{‡K‡cƒGžm,‚ŒŠ    ‚.DO‚G—‚D0hr‚
·Yüx
…ftmƒŽÿƒl=2A„6´+
Š+©6†b% 
;"%('# *0
6 &0W".55%(F4D‚/Qƒ3
Ô †pƒ±BnÀM½„2qå0
ˆ
Õ†H§&åI‚™"‚ç8
 Æ#!
5‚‚>tp’‡m‡'‚:ƒTxA…'„
‘a/—
ž}‚H‚<
ƒKVƒˆ9
ˆ

ƒ0hh
 !;k0        ž3L<¯k2ˆD5x           
              1M      M       J‚y            ˆqEjBsƒ˜QH      `*W$‚{„6
‚V‚TFJT2‚g                        Žþ‚}¾BX¶[(®nƒTxÎ/‡‹"§
Ý>Î
I‡j §¤!;
‡e.Î
5.                

v             %>        >     :             ¾.qEjBsŸ'v³NU"'J
)FT2uffmanƒ ª—ûGgeŠ9…z†`ƒ0F  …‚(‹X‚R¦+ù…{‚"ŸEò
‚¸„man‚1¢¤‘\ˆ5
t‡:‚8ˆh
§OŒ_‰Y.—*¨kÑf+§–%fG
——>œ‚x¦Õ…-ÕWœY‡‚Fpti‚œ?ndruwŽ&„&Œ: ƒ    ”;
†~
(‰cG–#rˆ/ƒ¿kzˆ6:…/9‚„
ƒMe˜^„Y¾…C…5ƒ†>ŒƒŽþ„"—:=Õ{(„
4—‚
‚ÈF‡ra³P§     BŸ*     ‚fŸ¶¯<¦‚í‚
]Õ‚rri‚…nt‚»DŽM]²c„)ø‘‚‰ƒÖ„1ƒäwaci‚|0g96)„f #1'"#,(M6vf5%              !&\(J!6l„L!i
4‰v*%Cƒ;;†)-
‚Œ&ybrid‚¶6‡3ùŒ
…¯tperbol%o3:}$link‚
š‚9¢w
—|ƒûmhenŸ3¾ƒ:othes‚t‚u‘‰%_Ãi˜_„ƒR†wŒ]/‚ *†$ 
‚   ƒ
n
'„)‡s„X‚&’
W‚t„X…QŽk8„{„T
‘T3-(/&RŠ¥xd„k%
E„^T'bŠ.h…T!‹l‚„T†ƒ|‰Z‰G
-†]¦
J
b)#6ƒ,Z*Š/f.^4";ƒmºP„‰[r„n !ƒQ(W‰

„X‡3œpY8i‡L=

2
‚Ž#”'‚
†*9]?VI&k‰!ƒqj*<b‚m,‚„2ŒTªS…b„ŠVp†(QW@L        7#04IF
AlK"‚”~TˆS&‰97ˆ(¡{"ƒ‚|ƒ
…vŠ5Š
  ƒp
     
…WŒ2ˆJ$N¤:ŒC‚3Œ^† ‚K„3†`ƒŽ/›f>
‰
BŠ~¢
ž#Z
 ˆ00S'
(„"‹Ae
›,H‰Q‚(/)>+"¯‹3`:$L‹7Q"+[;#:dG†&   ‚ƒ9Ga$‚.
8*W„
—&/$#Z^Z/4†‡a‚A›W„5Š}•mD/‚+D.‚@m@6…/%ƒE{„[o;
®G„M”Y»‚6       “7"‘o$†U‚`‚+‚|5+60‚:Žös
U‚tdƒ
'8ŸE
8
Ÿ#'3-(/&‡bK
‚d‚%
E…k„y
ƒhx?‚XAp$*
""ŸV˜€€€^¿0±'bÀ^„.h…T!
e‚O„ƒ|‡‚P{ƒG
-‡hm=S‘L
f.^4"
O„‚Ll
ƒ ¦w}Õxƒd‰
ƒO
j‡3
ŠmYI(=

2
‚    v=~S
9Úaƒ*Æ‚9O‡W7
2
"B65„E/ƒ$‡x§‚j¾7{"‡c@ƒH‡q
„
tZ
      9
gŸ'
[‡'e
—ƒz‚`:$
?Q¦R_‡j
8*W

®rŽZ^Z/4N qM‡kYFWD—
R@m6…/%ƒ{X[‡t
…ƒaƒ

1    
Ÿf$dp$5+6—
0i1y
…
Ž…K
ˆMv–L
†ÃuZ³V‚7
9v2‚Ž†AcW~‚-•Ú)a³VƒAcWF‚-a‚‹$b‚‹*3‚ˆ'Žˆ$‚•Ú)h³V
…$O86ƒ…˜Špc4‚{‰XB‚TnU—Ž
>‚TnD64‚Š-“ª:7ƒ‹
—ão
&amt‚,˜-v=Ibm‚
…@col,
‚'R>á;?O6  =†~
bT     ¤'       
@ Šq     ¾<?O6      =†~
bT     ?¾=r     
umn,`
3(žn3‡ƒ NwD•ùd3Qƒ Nw‚
n‚ƒV‚kz/      —Ì7
X/  stv—/r‚(€#r‚(u
Z
‘.‰.·¤ 9„W„M
²—?¾KP
ƒ
l  …/„2 9g
ü‡od‘‚
=…J
ƒZŒk„r     8ö%Y.…:
-&e!‡j0ƒB$ÙH0‚d…;\==u       #‚u„-  Ê
‚
‹E
8…zƒ5LT$L‚Yi*‚‚IQ‚b…>
˜ƒgtœ^SP„_:
‰Q 
E£6)J†e6Žþ‚p

&
    ¾f;Y.
-&
$

‡0¾H0‚d‚
\==‡Z   #zƒÔufž>
Ý4#LT$LT*‚{"
‚5Ÿ ý‚SPr:å@
 ¶V
?¾L
kJ®‚b‚8…$ÝW‚G…$ea‡yƒk|‚Uj†n…m…T›kˆz*é-~ƒ…B²W
ƒ+ƒm…m  ?ˆC:‚e‘ j ‚i˜U    KE‡@„uh™7‚ƒƒ~ªªkŠ/~²o“´œH„ehŽþ
om¶Yw,`sô—„4$VeÆ&ÚeX
& Küv
COŸ"!—2c‚¨o—MU&ôƒlS!‚Œ_•ênt‹†y$‚s(i
•'›.ƒM¥{’yÏ:‚Š3’sŒX±[Ÿ¦iŒ$‚j   ™}§gœN†I
‚R—‡3Å'—†`ŸƒuÝI&—Lƒä<ƒQ—7
/$õq‡MGJ΂R íO§Aif‚ži
fs(7RRhƒz
6.(Œ*…ˆ •G
Š(Y‹
ŠM$%5)a@H9X(,V‚?„d
h‚
-ŽNzj
„“[
„XJ
ªe`Œ¢üJ‚wƒz"Je„=‡>,‡U™<’Ÿ‚u‡w“`Št‡R-b.Š[‡{)™…W—5[„$¨!†ox˜!…nN‚U„‡Fn       $†'†PJ‚- %0FÕ…Yt•‘…"žƒ3ˆ'ƒW2   &v„-ˆf‡P‚
‹5#H†5¦p„*7›gŸ´
Ž–DŠ+.‚8‰2`‡2½/ƒ3–i…9ˆr 7‡(ˆ#“8ƒ@Ç
`…DÉK$”3‹ˆŒXSƒ‚$„>ŽþcX_^J—‚^ˆ„@"
*e‡*'‚—9(ŒA’Ÿ‚u‡w“`Št‡R-—‡ktƒt)+‚l
ƒ2[B„K@H‡S'anN‚Õef
      J  -  %0FŸ?.t6‡[‡m…h…"í/
e2Æ%;Ÿ —7ý1M§¯‡Z
M7‡l„`\¦z>Ÿ)5—7N‡‚,Po‡ƒ‡Td
yGƒW‚)Ÿ!!Ÿ"F®EQ‡‚0¶„$ˆH®a…ˆp
TƒjfµU¾xl†1£8í!X‚       †xÉ,…ƒŽö…UX
]‡ÐL)istƒ
‚xgQ‡R&†:2¡3Š("61$Ñt‚r ‚%‚@‚      ü
„+&j2…€3g("6…<<8

.&<$v„
ƒ‚&‰P
""ŸV˜€€€_¿0¶—þPH‚r Wv%
n@¦a0idx1‚B,…|0„EQN&/‚~ˆVn“Ñ@0^QN&/
‚LAn2‚B‹X6/.8<“Ñ6/.8<3‚B Žj(*.
‚>‰P“Ñ5(*.
L4‚BY“Ñ'52‚t
„O–×-
„O_ex1‚‚.•ñdelet‚
·dGÝX
£Gflag9s„WQ< "ŽO•ùf
‚     "
‚Dg‚¸M¿,
…EÝX£¿,
…Et‚"¹ fŠUŠ>
‰}ü:†9Ü["¤A fŠUŠ>
‰insert‚¹NŠ_ÝX¥Š_l‚»¹ƒYÝX¦>¹ƒYt‚»P¡bfŠUÝX§¡bfŠUnumƒD< Œ“D„z„|ƒ&Žc-•ù„C„z„U-ptr,
ƒFut‚ì‡\/
–recno‚ü~†"owid‚¼Ý§Cstr‚h*Œ“I„W„}ƒ6:r,•ù„K„W„X6    ,eee$ƒpšX*n†.‚aGe,„
¹TµAC§ Ú\)
?GG†E¶‚!754y$†k‚t‘¸
_expon‚ˆ&# ƒQ‘¸!          from_blob‚ˆr!;‘¸;  mantissa‚ˆ$#ƒK‘¸       to_blob‚ˆti‘¸indÒ¾]|rrcod‚‘¨0f7Fƒ/
]y&$*>HL‚<>‚<F8:I, &+Xdƒ‚)/)((@'7E(?:
<I1‚  ‚.$.ƒ7B/‚@C/xI:*i8L%A

vJo‚s"$$(4(       %+L/.4,]$"Y=(DRJ!.4-ƒ>P? VN;d‚^'(-l@8‚/,4‚>G)1 7#*)'(+-K‚J0h<<
 >G
7 %N:W':(O@hM& ?%;#(h/061ƒ\‚W1tV^%@‚y5CD! Wi
E55!d       $&f*[rAU.&iƒMƒJ*#so/!EL/ G      B#"^'‚J
S\/xM‚pA<l`U/‚B„z…odSO)&     )&\"h! AV"bf> 0%JF'+0      >ADXzGr#,01*!&5$#+`‚|ƒa
8‚~c‚cKcY/MfJ/`7   PUeU!o
9#„B @F5&,&//
4A.::    4R3H‚0eIP_G9M

/|V"&$Vh 
       '"8

m 1)‚\
]L5"A        f;g
^
Y)D7G!
s$
      :JD=+X>M
6U$

'543b3U054'*2X'2U)D‚I+ 'PM

‚$1Q2
>K#U
K3,]1!V*!9]"+(#H
!!.A?{<
ZKO3=1*
N"?)t4(C<$_
8'/

9&
             #7A(`
H/?  *<>.g/%4G'%&
?
3fl*
‚:.?/$H<(ƒ]\#+ka3        
&9C

,
:" 
>
-+.S/(#$iL       =0!N$@.2=
SWN,e    
&<A
+,/!v5      (
n

S=#DC 9&D $$=!31+#"zYP6C;"
R!>


P?kO*‚)K‚#1
YKj}s#&! J(:(‚J::mRo
6"37}7]a8([J
j
(P‚'"$-&61A2A3O_  
f@3$W_t
= {]J
*
R[:$pKlT6

t,        ?o)0
2‚i,- &~(G+kE@*]^J6X
P
)
W

T%^N0&* 23V0J$9n8aAƒ
0@|‚>*%ƒ<6v(v 8"J,A‚7XP=h6:
w
1!|G8‚Y‚( ,'<       vp!&l‚ƒ`‚Jl
‚+C‚
vHdA'.   ƒR%
Jv‚
<$.X%$W" .UJg<S|„Y…p‚†R9‚uy‚FoAƒ‡!R. 2#

*

VaHm%$8%Y>1:
‚dJ\O6'm
‚GM'"yR"$&vNS9„ryS†F%0h†A<1E‚8'
‚:.6‚kƒkA98‚z[DW(:#L%F4@‚v‚:„7„*‚1‚z„w
‚bBe0+V@-*‚e&ƒ<97‚YF†„`‡abH+Lb)'IL…ƒ!'‚c$!
59W‚J)D^!'&%R`7\)?ƒ-ƒiƒ„$‚/‚4~>Y         90P„O…wh;‚:„-)[N‚‚ZJ„
(‚+F/!N  &
AN
# JƒNeevav7?C †b‚^SpIƒg;ƒi…4
‚5
JDA "Lq' \&.=1e  ]
BH'6'/A9(1=>,6
,E')B
?=593B/D4/
EFG  
92
M

       ' ()

%pJ"099)_;E
'6(C/.4A
DlD$&
""ŸV˜€€€`¿0ÏÒ
{E%$XCYM"M'
rH%jU#k&
7‚%>%$}5B5dgsS%"N;a
QN;|!NE2;H/B'24;+/I
m/(1\"*.!
)ZO())$<30
T6      $     7*!6<26%1#$xo\-4L‚o†($U)t~2,2.…BYlI+%‚‚zR‚dF^‚:Mƒ{-8‚b)…P7=‚i†>‡m
+…";;1&‚E&pƒ   (/r3†1!B 8‚*‚QƒRfƒ#!vL‚3„av‚@ƒu„7029„TyMB‚\  <
H‚‚K„A_‚DfTJ
"@
ƒ2>9Qƒ[(ˆ?+N‚!j`wRQ~#PA6$I7RW
/
]0‚r

.ƒ~ ‚dSQg^"FT}‚D65&"+.Q
E!=\'?luƒ‚
‚V5‡.’9,Xƒ<bM‚)ƒ1‚T-
yqƒW‚7‚ƒi-3=„:ƒG/´,M‚'(sW*„#A4bS#.„;‚UN4no.z‚K&/2†^k[1;>CU0‚‚/&‚‚E‚N(   =""%O#-RL P]P0yr&+0-‚GQI.u‚Mc‚LK…Q5H
D
ƒd„„"…i‚%=ƒ8s)1v=‚t ‚B>ŠW
‘9‚$‚
S†']‚‚Ua"Mu† ^‡g‚/‚IZv„&Sc5&toOS51L(.{‚9fEz‚BF.#)
M!#/5;„‚…P"@fT‚("#!‚cƒ(F‚M:,"$-}qB3#.$#) %
A"!7,-

E7"7=-:O?'2,SO?>ko     o x+$35#/       BP(Yw)%‚t$"#G+iAn1-<a@)#      &(
0,
E
T)KF3(#ƒC&4‚034NY@/&=$B P_)N‚X*AXƒ%Gƒi‚‚
s.…!„DŒkAd1!;F
&xXƒ
|X}
%"‚‚}
ƒ,0*
!B7‚690H& 1`q‚ACc        (OF'[
=J‚d>
3Œ_$Q…‚(ƒ}''"-   Wa&&G
N:ƒNƒ(Q„bƒst„!jw*7="*)8&b 6:‚F‚>o-1hX  )s95‚'(**…u‚Z‚C„J/P&#7/!!BN D!*-'W3y%y   'Y
!b‚I5S2\‚rC?r!ƒG5ƒ)E'-(‚K,E"[ly6R$‚f‚L"N'@„%*:U
~_`j+ƒ„‚ vq
‚"?C‚O'„#‚(<h2vDA(`‚ftƒ3RI„R"ƒZ\L‚Y~Sn!"„
„#‚v†n82b*n8‚)%x;0IS6
5$„ƒRˆ$‚<p.‚#> EU@
%y%
P„     ‚)E
DC%0?."4‚h+?r D‚X-(
†+^ƒPTƒj‚/5‚$1g[ƒ.‚G]V5‚a!‚#?6d‚Q„6‚[:*  ‚?N
}      };'+>

Mv3„0jƒ„'Iƒ
‚@‚s=D`9(*(„<p,) $86‚C‚\„…… ƒ2}Š\ r&f‚'    ƒU;H…86QF-K…eƒ‚mˆ|>&-Q$@3‚!IW"‚v*‚8uƒZ|‚
‚Sqw
ƒKƒb
,4zƒDh4L94ZI!ƒtV†@,x….PT  1A      
)A
A
5Q

w ?A},/&`,K=N7"jC‚e;Vƒ2RY#F]N‚-#‚
R47‚7$[!3„ !$‚]44,*7P3,‚‚4$„V
L/‚Q^"O6MD[yo/I-h'O"ƒ#@…A#N†[ŽL†M+^:)C h "'2!‚
?7…mZ27$rpy=$‚G(PKV
ƒ‚~‚:F2I8:-m96o_ztJ‚9        †V
10'q<‚h1,Iy/‚g3!(2XO        ‚
X8?R@N%X0#]S?‚Ik0z‚qm†.H'i:$%
)w‚++PX
‚V!6‚$3Ci7}‚R^:(#H?‡=‚Du..F<j‚„H;-ƒo<GA{
W@‚&|"B;u)?=',Aƒkc.#;  +'     U‚!g*9I%[_"ViWF‚FUƒ]$(i#i‚XK5xiP#i$-%I†P^ƒ^ HIbeQ‚GiBVr…  ƒ3"2=UYiIAT!&„@{(…$‚C†,‚…s@>‚20‚1k6/
,

$R |%-‚Fg$‚:\jT ƒ:ƒH7Dƒ'%‚G'!5,&.)3‚M ''

       n    


{!
)IL;s-„]M
5
b2=E_8‚y$ƒ9oYr   ]hF)L‚pNHl6IB"B2‚+gPVBG2‚Jq&‚0A{C^-#%/,.0=DƒV >_T%ojA
r1R7Rd+)=3.ƒ+Q9Y)ƒQ^\ˆ+
4Š*(v
‚7„F‚N„` … ‚N_1
^c     C(~T*N.aƒƒH@:Yuƒ<5Š}‚gŠ-"†sƒ\Xƒt1•ƒO-Y”$io‹o)%2›x‘]
´""‚D;L(†W‚NV tK;ƒbN*‚3J/;5


XA8‚q‚M‚3'‚#0(9DHTLQ?L‚\d,†aƒƒ*(Y\^‚`7i)‚?W1‚‚nHFb ;U?‚O%i‚IPgI‚Sr$#Vƒi42%Nƒvƒ!zƒ!ƒ!oXŒ]‚
+‚s‚2ƒ
„(%‚a:{/'ƒ8…N"‚G2‚
DƒB„t,6q:3zcƒ;…L%D‚Vƒ7…?p*pA&‚n[MG+A*G"uM7†7„X6T‚u
TEC'N.‚b/D‚3 7  \!q7        „$}TQl5ƒih5fg/-„4,db-a‚      {‚&‚gU :0c‚‚n„sd9‚{‚6?M"hJ%‚>3:‚^‚!"HT^&
‚ ‚9,*1c!-").K@&†D,<
'
.$nSR"‚3*&%
""ŸV˜€€€a¿0Ò~@0@ %3
Žú     ‚‚J?
‚+C+
@
d5'.   h%
Jvx$.X%BW" c‡YSJgS|„)}1‚L‡`z‡gw‚FBF‡k‚a!„KRd<1E'
/.66A98
‚l[N:#L%F4@‡‚67`D'z)K+Be0Wk@-*qi&)97YF
ƒ`
b4H+;b)'IL
K'‚c$!
9Wc)DV1!'&%R`7\)?8ƒ-‚;G&
~>Y    90P0‚c‡)7‚:C-)[
‚‚ZJK3(F/*!N  &
AN
#‡_/o8Vx+Hg
ph-ƒi…†Dd
‚5
JDA "Lq' \&.=1e  ]
BH'6'/A9(1=>,6
,E')B
?=593B/D4/
EFG  
92
M

       ' ()

%pJ"099)_;E
'6
{E%$XCYM"M'
rH%jU#k&
7‚%>%$}5B5dgsS%"N;a
QN;|!NE2;H/B'24;+/I
m/(1\"*.!
)ZO())$<30
T6      $     7*!6<26%1#$xo\-4Ls[YCI%‡Z2‡0
wF
F‚
":M%-8‚b)b7=‚/†BB
+|;;1&,   E&pƒ  (/r3‚u!B 8‚‚Qf
‚/vL‚3„
9m&27029„yMB`  <

5‚:„A_95TJ
"@

2>
Q ƒ;(ˆ?‡?5X1#j`R#A6LI7?W
/

-0K
8

2ƒ?‡S:dS*^"F—8…’9®²@‡fKa(sWXd#A4cJS#_&/‡Tk91;>C
,0I("‡]HE‚.(     =""%O#-RD( P]P0yr&+0-‚GQI.u‚Mc3K…Q56 
D
ƒd„„"…i‚%<<=ƒ8s)1v=‚t *

Vd~tS‚']+_5.
Ju‚J?‡g‚/M
2Zv_‡
S5‡eo
1)51L.<6vŸ~§.*A07AG‡e
w‚¶U8=O-d>
3‡—7"z!‡bw'‡g-- W&I
‡d:m
|Qƒ—3/w
o-LX )
95‚'(Ÿ\‚5
2‡gC?D!
5‚E'~-(,E"_6ReL"‡X
%@$ƒ(%*:U
~_j+R~v
;

,?C ]
)<
2<DA(47tw\R7
ƒ     "1\LY~žrl‡gb*n8%
j;0S6

5ICl

%8%
‡gQ
C'
":D‡W?‡g/ D®q
'Te)n5
k11[‚  wV5Q‚a!‚#,R)‡W)(?:*  d?N
e    *L;'+>

C‡.X-
p[Is
?,q=D`9(*(w<V,) $8‡j
w
Hl
‚&
TVR,Lw2RY#c
;N
|#,@47O$[!3
‚!%‡^@
4*7PE,‚_
L/Q^"O‡f
dDy$/I-h'O—6Y#NJ[
…
\+^)C h "'2!‡\V
?7…mZ7$py=$a%(PKV\ƒ‚~F2I8:-29J_ztW\   ƒU
10'O<NI‡_,Iy/‚ 3!(XO        ‚
*8?R@N%X0#]?‚IB0z‚qm:Hxi8
M%
wq+P
‚H63

i
7g‡N
P^0(#?6 'Du..FjA‚Hs;-ƒo<hA{
W@‚$x|"B;u)?=

,`]1b#;       ' B&g*9I%[D"ViMF
rU‡G^‡f
(#i 
5&K

P#
""ŸV˜€€€b¿0
®$-%I–«‡i
z HI95)I1Vrfƒ3"2=U3iIA.!‡Yc{N0$hk6/
,

$R *
6%-Hg$‚:\j  R7D%1*!E
)&)3P+ +&

       
.      


w!
J)IBL; -vM:
5
bo2=E{Q^Yr   8
L)LbIB"B!žW

‡i‚
41‡b
y
L
‡]‚‚N1^c      C(—6
*N*S&c‚NV tK;ƒbN‡dBJ/5


2A‡d=<k‚3'#(9D)T‡`N?2d,Yƒ(Y\<^
n`7
)
5A?W1h$5F3 ;U?r
t_i'
*‚e$#V‚=42%`.)<—6‡s
+*
h
‚
„%&:{$'‚.8
„a"G‡S0‡i'‚J5,:3#G
;%D:Uƒ7…?p*pA&‚n[MG+A*G"um7ƒ|
'
u
T0C'NG/D‚3        \!q        „$]TQl5
‚d
5g~bV-D{/sUJ
dN0/'[?MT:J`8#n
"H&
1\
—
*13!-".K@0ifdef‚‚6‹4@=5†%/óV„„H‡’ 
?/f‚
ˆÝóOnohop‚¼k˜u KÝX¨˜u Kt‚¾r}®g„ܪ$open‚¿ÝªPzero‚¿:ݪlulA„V  ‚S
£e3•ÚC
ˆ}3lrow‚¿mÝ«po‚À(Ý«Zsmal‚À\ݬgnor
‚l‚Y‚
„:ˆ=ƒ)4g
;
‚j   …d‰›LNe%
"4b%}‚rKN) LdƒC?E‚/_‚|x‚gŠV˜^pŒ,‹{u& -–nÙ8
•}7¸lD‚F£F„žvƒ-‡a›ÈQ)3ƒ(•‡7‡N‚x…7ËGª    ‚U„`‹‰
O
—9Ž™;‚l„„AŠ‡
ˆAX…Qd`ƒ@q ˜ˆ
¯M˜c
Ž„„
¦kˆ“"‹h£ˆS‚]™.
Š
l&q‚t…L…V„‹I’yŸ†7…‚ŒWŠE‹$˜#‰ (/‹F2‚d±E‘‚<–e…4
/    ŽþR§U:l

‡g+
ƒ<!‡3
7—;¤D‚F£F„žvŸJ‚uˆV)3‡c
6Ÿ…0Æ‚;‡ƒ3>
«pGŸ‡i
eÕ;‚g®o
"XÕ#‡`_~ ‡gˆ¶V
8Ÿ_—8'‡‚IMCƒ~‚>
§k…9—/
„6lK
q‚tkU"„B„Wìu%‡fTz—„lM‡j^    
823&‚1q     ¶)m§
-    e_check_constraintŽ&‚‚`†[ž_–׆[i‚
çfe
…Üf
ÒC†úG
…dx~áj„¾`I„fD„y“i‚vj£V¾&l‚t
…+–×-
…+angv—G‚(€G‚(evel‚SžV
ƒe .”Õus
ƒe .imitˆ*l       ‚7‚-±X•é‚V‚eg‡
¢}È9ˆDÝŽ/us‚H@œeÎ'“Ø+tra‚f“oëz}”w–(Éa‚$‚x
‹Š&ƒ[„8Œ0ŒZ“$Š4‰ž;L@
„KŒk‡µY«*ˆzvžQ½ŠY‡ƒV¶†fƒôz{—LSŸ>Yò3§p‚UZ‡B§ÕM‡4—1dP;΃„‚7Ÿ,y»‹å
mac‚„l•êƒg–E‚~„‰@
‡"
ƒq‚T‰z
µn †i.ƒ
‰^Š/
‚_ƒHˆGPˆ^ R
<y5
Ž÷õ‡ƒ;®r
…
Ú!‚:Ú ¾oÝc      Òr(„k
G
<C5—,in‚ŠVª\ƒE„m‰t“š‚×~gƒ W7‚)—ÌA
L7f)materi‚›`•Ò„ur‚…“šSediƒaƒ^„
‚…7ƒtw`ŠD:‘ƒD

-sˆgre‚A{„\4   …
"ƒG;…L        ‚h
‹0:ˆ 6*

&%&‚Lc2!
""ŸV˜€€€c¿0ÄŠE„[4„%•‹sH…tŒ+ŒPf´@”iX_›fF¢M‚=GƒŠ‚†v.…~J4(!ŽDŠ‰V«®<œ{
ˆ/%p     ÃUŠ ‰O
†o„f«p„&       5„†6ƒ#‚m
‰TãˆZ>
ŠN‡¡6–     3_7        OƒJ)‰R„»/‡i$Á=“9}

…EN‡V‡8†7•"“5Š0
‡U
ƒ~Rƒ(ˆ{-C‡YŸž7‡9      †(¬Xƒ™‚!ŽöR®‚%—9>@@
…jX‚‡‚j—8F‚=GƒŠ‚†v.…~J4(!ŽDŠŸƒ?
r‡h"õ
/Ÿ³U*Ÿ"4³[”}Ÿ)‡b"   3_7        O
N)‚IŸ.%> Î9en9
¦‡l®s
a
‡ej‡l
‡aH‚4Ÿ„^Yƒ}‡9‚6ƒhuŸ0immer‚ˆinƒ†un‚ŠHÏ„'Pƒ+“؃‚‘‚5‚°VOta‹C(‚N“Y       ú7bˆH%
 sŽ÷‚L
yÆr…ý$`%õ"
‚Ypactˆ~sZ‚t

†s—U¤‰0n   ‚ƒP‚
"¤x‚µ2Œ‘_›l” cƒs„       ’)–%@â‹b‘9KŸk  ‡OÚxÎ|p,„‹ƒAedfndƒ>„!"etr‚ŠXr‚n…‚–¨Ebkfect¦nV4‚P)Â"’úsv)‚÷]lemenet‚‰5“ªu      t@[
T‚:„?„`„6„5ŽuŒc‹O‹*ƒ[‚.„qŽ‡|”W
‚hX‘;tMI'B
‚0{'      k(ti

.;&)     
-\51
>G>‚0)…<
> ‚\Z
‚H2)*0$‚i%5:^mX
=dU$
j…X
ƒ1$s
94‡„=rƒFl‚>‚
1ƒ<'
K


&…‚M‚Z"w‚Lˆ:$#‚z<H

‚j+      
ˆ9ˆv‰wW)0ŒL†bƒ
8†&ƒu‘…ƒ†‰y„mU‹Pƒ6xZ…ƒ4‚(Z‰D.‚1G˜[
L…#†9
Es
V@²!šLPƒ…*       •kƒO—F‡5p‚ZŠVs‹xfƒ]†z ‚q…$]ƒRŒ1M4}HˆN'G†@´T)‡"‡fˆiŒ$;4„\>/x>Ÿf     ‚„i*(…a
‡O]„gƒK…‚o4"0=Sƒy(H&w;@--P$ƒ/TOƒ=\…<YDƒd…<2b2„_    Tƒyƒv9"R5@› „(ƒ{‚u„3EC‚`‡‚‡~(‚4†c.‚h_‚F S"…O]p#HUE…B9
+‚+ˆˆB…LM¡U")nŠ$o/hƒ‚'0‚Y‚|P=<†?„:‚ƒ)"%      >ƒN ‚t
:P„mW?†
<!:‚9…kj‚z
n % [„!h…%=(T„&?XE|hƒ^ƒQƒ<~ˆ~†!ˆPJ‡}8:„@^ƒ/„I‘IB]‡R&#‚n…J'
&
‚ iJƒN‰TŽ`‚yƒ0 ;xf†Žg„rˆ;£&K&Bz9—$‚M‰¦„N
J<‚;N5[…“=ƒQ8,‚Wƒ†<…}?jR9770H@5‚!$ƒR-UY}SEq5*J
ƒemxŽ]…lm„w$“:F#Š#ƒ‚mm–KEs   ƒl,%‚
ƒ]>
}&ƒ
363 ƒ1hM'„ƒ6`m‚=†~ŒBS$‚u‚948S;VpL?@HX1ƒb\„'u‡bGR/
;;”I‘‡M0‚ƒRƒ(…X{B‚<›j†2ˆt b„[ƒe4ƒ/„f|›e‰"†?
‚!'ƒKƒ@ŒHŒ%oAˆ#$aVƒJI-<‚$‚@‡0œ‚9‡gˆ‚iŠH«3ZŒzi=m’u”&
cDŽ.AiEŽ#Y  1Œ…z†%<OB(X;‚b‚2‡   ?+.&-9ˆ4‰

# "ƒ;&„Oƒ‰bˆ’'‚-2–0!‰4•y†)/n†=™^$ˆk#
d‚G‚†v’@]† ED7W+{
ƒC
m‚<Žös‚W)‡\.‚vb‡b
'‡g6x‡kOd+N‡…:"

T9*
G
L
…#
Es
V@)‡4%—0lj    >ŠvƒO—F‡5p‚ZŠVs‹xfƒ]†z ‚qR‚M4‡^‡j‚7'G 
Œ)†2v‰        2„3;4>/x>
ˆ7  ‡@H*Ÿ‚I®n-0‡NO\Yc‡‡ƒ9"R5@‚q„($ƒU‚u„3EC‚`‡‚†(‚4†cJZ_`"-#HUEA‡
‡l
ƒe+‡h‡kCÝ\ Æ(‡ Ÿ=‡09‡f;
j
D—2
! .nT
‚/5?…c9SA1
&&ŸR˜€€€d¿(¸E|“¬O

*ƒQ¦
TE8‡a‚@^ƒ\D     
B[#`¦ƒL—I+=®9fq
‚rIK&BzFHH—[ƒ+OW%"w
?jR977‡_
6@5t$@UY}SEq5JHqŸ‚m‚uCƒL$‡†qNx‡g!
‚/#0‚mm

KE   
ƒ-,
Y%oE‡O

y&$

363 ƒ1L'ƒr;k=†]„kS$-P4j8M5PjF?:BX1ƒ\6u‡E§‚#%      /‡
;(R—(P‚ƒR[G{Bc‚AE‚ bž3'‡ho[‡j$‡aiaAY§
† …z‡g‡cOB(X;x‚2‚T<+.‡q           # "
ƒ&„Ÿ‚vR‚H‡W(‡|G!…w,Li„
"<
dP
A—NNCD7W+{—7
0implementor‚
 ;ýŠilQ‹#|šN·†

’B!‚9¬<ž:‚nƒ.”K‚W ŠH‹-‚@³7“5 £;†}µHN§¢H®j4Æ'
n¬<¶z‚È„‚3]í‚I{…Z”…e  ¶‚6c~
×*B‹.…¾‚»    ’e‚°Y³vËkit
S
ˆ4
…‚69ƒ™[0’u*
‘ƒ¥C
fƒ*’`—L—0Ž]R–e‚µek‡,
*
‡c
,Ħ\
g
f …Þ*iRŸ"ZY li‚7Gˆ8„#¥¡@‚tŽ,Ìy®v@„é¤N‚‚ment%
‚#ort
Š_‰]X‹‡;Ž=f
O18Œb[+]…Y X‹aƒ~†‚ ’‰b…^…S…OÝw„ÃL
X‰l……t…;†   ÍtX„
;ÆI†Y‚
ŒzMA
ƒ#ƒZb—m‚šR6<3
A„ƒV’
9‹R†c1O—0ˆcŒ~ q§n^‚a–M‰/QŽ/
‰Eš
* e|…ŸŠEƒŠD$‰+
pSB‚„L^¢m´*U‚h‚/›f:
u‚t…Zš¦CÃ6ƒ‚z8‡[œF
)g&9!ƒ|–ƒ*a‡lŒy„"ˆ†bI†HƒjnƒAŽö‚UMMLvˆ†ž®~#p‚2‚C~ÝP
X/Ÿ%YI0&
GM~‡F

ÎA”
¶‚C‡qH+   ƒ=
"üX;     
…jÆn
S¶K@‚5
‡ˆ—…?S§       ,g®n:®¶        ‡g3‡i
‚H&F
)g&9!"     (
—ƒ ‡‚!0:ƒNŸ]MlM2—‚‚jsB…H‡xeŒ°A|‚rc…&M»w…>S%
|}’/'‚U‚¥
 
±=   µ?@‡‚1œƒ—K‡‘N„zËH‚¡
ƒ%}‡†‡%
+®‚¯K”O=Æs‰2†F„?§‚
š/…lˆL
K¾d|À=b•Q†b
“E…6      …Œ–'5âDZ…_¶Tsê5¾:I&pœ
&¾T¶1œKå‚@t‚5h4        U$d
5
%
,!
       'N
‡d’ëUd65
%
,!
       '„á,
‚Qract‚‹£ü+ŒQH>ess‚¸'“‘‰$‚Ï.op‚5I’ëTGerli‚Ê^ù†vX
:+%‚ˆ%„„e‹¡5òŠ(ƒnƒg‰a—cPp
^…+ž=‡2‚¥x”
–JŽ‚@       ‚~‚" „9„
*7‰F„M„0>‚#‡t pAP‚„…$}‚tbƒ&?-ƒ}“Á~‡“ 
lƒVƒ…
[ƒZ  Ž‚
„I‰YŒ‚5„
„#U„MƒV‚‰Mƒ2ƒm<i,‚<ˆ;‹tŽiÅeÉ+  RŠ3r‚`„Š$O½UWŠ]†Xƒ".&
E.'Ž÷jŸ"3e—DE,:®‡ƒ‡i!ƒ_y8Ní„Fx
m‚ŽdU,CMü\
6~Æ&‚'*7„C¦e9õg,—JÆ*E‚[&Ÿ.5‡‚<ÝW1¦N‡g
,&
Ýc
‚^.‡‚syI8U‡VuD.*!
""ŸV˜€€€e¿0Ñ0int3)7
).Mg
~
_;

`$(2Rw(ƒ
64U<7u"_#,)GL#+U
kDPQ/7DwR(        ,.>8<\

>Wq&>;P-G'0oI=r( 
P-y   
!T$h/#!]s?9?Zt‚,D,ƒlhrt1
:LKz


.'c?(*1#%     ONK#%1-
F'‚ELj0

L‚=/6
(   *n'1MSX
3
,              
        4
 5#v!'C  ;(R5"+        
YH
'‚*4"
F8Ut)?#)‚
O9
<s 5
9„/   "#bP&$2:@/p!0*        aK7((     '3LIb
10X*0LU,Ic        7?|*N‚*‚aC$
z(r:"2*Ox‚+j;J=O+Prj:g
Ku
       _HD=Q7Un."h
0 [jat=#N  0-    0‚)&JO4 HLQ!U`*%K
'?0<(*nU\‚7-f ^lqJ%S2&2
1(-7&s?ITIGIC[Z<‚7d:‚);m

x*!"gN"
 ;*~J~UkSA=33a!#&ZIlc$({tt4
(/
.[*GM9;:*4sDB       (V)+%34@s
>'
5‚O      4CW‚!
X,*!"I

o R
 .4  G&
:(
>;<T(C
3;&905
M6‚
#
t0(>eN8!8/GsQ"
 9`E*
82S
‚fJ1"     ;
"j.+Z>&f~&+ 
-=
cLt5u.D6E!''H+Y ‚ adf<Wh,LCQ
W‚9?:#;#

2ieB‚>Q'k&7+B%

<   6T8‚     :&#OEi
{w&o=Q
;E
"1UhC:&#'     !&"N2-(C:.>F
.Nj
K
& 48$P_ e‚5a^B;>

z
T
*I,)AZ|6&P#k728C*'<2G‚Q5>$;
8 (393!F&r?gg/tX)!+IE‚94,N>QP
fuJEA7!H@S)K.JN‚eƒ:^0{\)= D&?iM4%‚d

'@j      TO7
$y)*JpQ).%h  *"E]zT:% <q/H2<_&M]W%S%a,-@
*Iƒr0+&##;S/
.$      *1hR6x+oH* O
1.@(L9R"QeG]kG.-   >9>\![#a<Sbu`^)\'G% I+

*`'-O2\8!!   {‚5        ^JaHU
k9_'a   23G     NJ7>.8[
!0b"&
?KFo      ,GlW%c8qw'3@w‚B@Edi+5:58b6.   )

:
742Yl.e2
<X;O+-<6ƒ8"*:F+B`E
o

/18
!-VE3‚6-‚-#!‚e>!5v‚b‚6 _M‚C!'\'
Dp‚S
+d\+N
       9RE‚=

A.$('
4"
y,(G59s"8-D
hG;Q^)
‚0ob     
‚~vL@7  
T‚'2gy…H%+>b7*W^;#80<?z
q
U1&;>,/N#L8d
2P\J‚>LG)-G‚d<‚cQk‚g
;;(
),A@
     e#+!$-
6f\            &‚B7g+x~8P]\nU^"
vtpx-r59\>5"E~a3*.6   S$S*''‚f‚Q    )"     *X'
5a- 
&2d@beQOc;H/|D!W
,&2"(i
c#K/B

#0#qbAJ!C(['K%j[$oJ>)' YHH$425y/;5
:l)E]R+jQV=N
!*&/iaF,32$X
‚4f,]3I‚-X0dU…|VGB               \
‚O-\40k7‰i7      @ RKt0S     ;,
:%3%
FJ7
)=+15H     @C-,    >`)>k(
)'!
'     k<E'D‚
:ƒ9{.        ‚",+0&?   )Dp&N
+(        b$?;T33Z%V
<j%
,      0-KTD
%]'
K.
j7>n+\9L}E,^
$ *OZ      B%64+9NP
$)ELh0%E6‚T'<6 B<
 2}$=+‚D8 )sl    5\iCaUk>4W
GJ2W\6‚A
:(4|       H*d
)     9W@r %Gx2q0!       =#:-   8
@\:Y{.E#'      1><5&#e|/†~30;&$.75Ji/45>e‚I`Q1-H1.      VH;'xe<‚*+''G&      L.$k
|.?=‚xPQ6)+
 3*@$!k&U_3
!4e

#

)*;
G-b
:_.
!     6u.(0E. :    *b2       8e'H.9
MC!e01>

'
""ŸV˜€€€f¿0½Ò"z;IuSq/V' ?‚^/>
n;aE‚M?$&
6I+‚d5aF
` 5})‚&
+       
1e
0      H   v`Fg/ I;
-N&#bK_'%^!R 
v
      IC3!*       (8Z       d
.>W5‚du6~wR  H1Cwk‚#‚/„$8ƒ$‚vE$
‚"}v;H1Ka,5J
'!6!6[)D?
.UILB       3F2‚ -U+=
6A*
4tp8|Wm2DJ‚Z&8

f 63z
 B*96e7xQ LlEUƒ‚X'''.5'''''''''GN''''''''C'''''''oZ7>'''''%
C
-                 0PK6"'#Aw!)*c0   +;0JQ &6f9/A#A‚<s_R\*_4     '!*\
GB82j‚!     *      KpOK4R@CX
h4          ,/Mo&/!  Dv +ª8'        *R 0sSn‚O
q!F(T=91@(:2l@gfb/
      -       d_

@d
=
        -$5V2R5P0      `$
 "
:T$z;3An/27
‚\
6        >"X]"314
$)7%        )!9o
‚~#U{
Q-9u_"uXs7ƒ;ao8%GXa]uWU
^1kze)
;;B)d8,]5
FF
 C%saYdR/^.1{e% (Kj     ES8?EmG:B%KF6x]YX
',bG!&>„UR;I6‚$'+]1‚e;m~1@8D0`    q!.#![]‚br@
2U    i{"Y       e      =9
wyZ

5‚r
oL1hP6Gy:SE&TD#sd 1,?_*9U*^[.!!
l!     3
.

        
N

GBJD.    KE2
bT,[*m30[‚w<#A4*/%$^T/5$
P‚"[!_'Xz
cSAoZ9
\SM‚ su_P$))z80_'P
/`BX9?‚cP(  ,7c4MZ4%$-y+‚b1$^/2.'2HUI       Q
kAL'H
"3 9S  ZyA:"TA,Ju#=,l3v`8@@Y%n^1tlq‚3[PJƒ:A;Z#tE-
$
s‚#*D>EL%VFX'v3X
+&f,;kUg#
>4bv+CDm02ƒ:,>?:L+81>8)Y,jJ   
'

*n     A,c&d&‚WF+ &Bi       V"Rmƒ0
"i#kO6
+?e6">!q'
MK?qeN#*%h0n_
:       ‚Y)4.!<34aoc0@
43nxVKjgX&
o)e>'FR02>B?1,AMUY8A63R-iL
2=
"
%0I=
"
%0  0      
 &Gb#&:b j1
3&  0H
44$
!N=$Gq?Cb$?=O!.eux]91F@
J:!j4(uED9:@i9v.b' 8)b5    6G#*4C'/7r24%3CD"+- Fc-. >,,R
6
P^   
(T
z
#?s>$"ƒaH    Z Y
"haH6MiJ%,
n^=         P$U        32K ]]^5      #=Q#>'V?
%
,
;/A:78?;,q?^i.%$0ij)+L7>d#d30-,Z=>3%%#,‚! +;:6QNH82uf&,„n42-"ƒ4[ 5+O7He$<#>%$\)R)~3z.L8ow.&
W+1
&uY9
BS8'3Ee%        ="]I'6 
I81^::Kƒ$&$'%>YNN<eg\=WG/*,^/9QuN6
KR‚u‚.u" (pl9-=Tn,2NU=r     R %#
U_F,1 "%)# JN3hL

7@%!0~&4      4+P"+Zb`
h't6([AG&o
L";:,cN[bef‚ D
x?fEfj9bfp$+?i
M
TG68)(S#+U‚*
2
‚*.!LO(N0‚dG,‚0tJ;{5=;}      @<b
';=8U‚G52O.E
/l$98t8 
       
%K={@+'JI     K;D1Q+E;(%/ht‚2
ƒL
 .Xf7uy*(
x              <
>g<"
)!##=(4$>>
H8   5%.7Z`b868
i‚L`#Nƒ
z
MMf!u(%S05‚%7E+‚9&
"-xT:(82}:-/(+8["85.--TBz;.|ƒU
pDW-
)V.3s+V=g
"
C
k_H$qj/x‚C: Zoz(E(‚IS
'
;8(%9"d"M
$ƒ#3:3‚-     {'„0Xfd)60"
AN
p]f3QY:D<IT3
3I&/{FL y9$r'F$(?

/
$L      
) FBE/(
P!`
/+-M$
^SLW&D${     `‚@>;A0   ‚3!(!'$T`-R+*}ao +EL      ?K|         $muN8Y$_Oc%E($%+fT:9<+,
UjFdG;‚@#6`"P0U
";><\
‚N@hO#‚ +,d 
   >0
#:GO
R,G6>

%Su\kZ%>,:Vi
a!L-3 )JE/%)@?D 6bH>$|E_L<
&1?B%
S~)U"Z
c-b*@t8+1_$JJ`s    ‚J*1)pPH=E&<
V2+      .3%!B"!'6:#
$9/D%

CB#/)
.(W‚)G18V$L!/1\,8        
0
!!ŸW˜€€€g¿2Ó+.a@1~._
‚^2%)J
*%   9X
(:FOx. [V[8;6'     S5EA&-&&hT28fP‚/\?i6‚&/P0@V6`&…h>‚j‚q‚x ^i-T$#A%[ 
"# 
#D6Uy#?B.  bg,W-u
'%r%   

8
]g"5j!

  #-%10d_AE?I ==H\,  HU
l        
*q&     57dg&(7"$G        AcW‚E!
+%
2L!C2X5Z[ax|!‚/h‚"9+,5
;O^B+a

?H)
ej, '
<'‚5';‚?Jp‚nL%&7:V!;<',"G)#NH?.#D`%[d/‚." 6*1Y5:$NjB%t    
gy+@?3?%'=2m=:
$UOBWv
        )LNH‚%     g]%;5@{I7D
t1ZdQw$)$%-
g!S‚PVT9i
,HHU4‚$>(0^jK&=
?u C(
D;!    U@‚B 30d@"*(:Z/l
Hn
/2 ƒ8[>O0f@=DIƒ[‚BCd#-E[t"!5{7HA!‚"]B‚J|5;GFq2$!:3$-       #RD/Pe
N(g9x-S
CS1m"!! )RC;^*
~,;%1\H-<uCn R6]@($<P.7)-"G2d3i
6@f
V+
 '=?'1)8;_X"‚wb‚\]ƒA$m|  t},&ƒ]0@Z4eOiV
[+5%~%.]hC-   ,0F,,=E5a8RF
/:805.)<T$X6g„")/7P0-%5%ƒ7!%* l_H/45aQ!P[\l6q.    C_;.„}3I="C

[h‚Lw=/v8=)E‚{$4C1=+41",;{%$#fJ5 ^Cig(W@E=8AV0;/       (y 1ƒX-,N9>?N<)-/
'.Q
", =5#_ƒ,$9460=^3$,XF'118V+mJ:#A@
E.'!7)%U@Q.
HY&9-P$XqQ=z‚r^ 8y`%"+S!6!
6E?`_
ƒ\#7l_‚#+:M„W/_Lb?V,a~<L+
9G`\*([ Rjtf<„P2d0r8*"?‚=
0%,00;E
ll#
R      .z/+5RI*7[=`  ~Z&L%#?<5\T|041X
        N     3$D$Gl
$
9l$2
 Mg7‚ƒ*\'++q4‡c‚
+!ƒ=ƒP‡Q7 {(2f‚c#…36
08
N† I `4;J^/G}4(R’4`    &"?(Yx4‚rŒ282%!6M>(Š7@5
a<3L
Y&.‹|%/o}‚'E“X'-      A
]j9        =eŽ?G&‚6-!&-d‚^sAX@/M1B+Wƒt,  /#=' $-
^+‚$#7K*
K0 7"@     

 @kPY%$<\MAw=*D‚T
‚8>
;‚Ve$b
‚(18@‚
<
9$-1#~A v‚]H7‚L
y<"VDT:}X1‚
5‚683

.`y
Z4B3Jje  V52~>}M,)*$W#!I.2;F1…sJ55;‚b7*;m"&+?GL@Lh1‚-z)7S2')E
HT   v]]iNIXtMU3u7=6pV`5/+$+Kf(t*Zj
faX‚b]3/ 2Vcxnb39d…()‚
[
o,"^8eup9
Qf#
(.      $!~$Qw<4KF%"VP#t$!i|.2d
       ):
 L@QY@ h*$
!:B<s‚rƒ8M4'&     =:%R71
1C
PQ*

OV         4$(w:
 !?:$@xi7‚D3%B/‚2  

&, ?)1    X'*d*b 
:RGF $"_,NT?,&iAE             Q 0.:&;jtp9#.`=s [():JEƒe  FL&1"h)W)J1*HKK&~-
‚Ebs,tbwPH1']"Q5MwVn
*M       
a'    +#b-H%/EO!#1
HT
4$">"W##38
<&&NC$!L' '0
6/"'/$*64H7
+->4(1-|-J{.2H^Ih#%=%&,& JL7:Q 599cv58n   Tk% @P‚g87
P      . EWE13[:    ;T%<
-
6
Žös:Sbu`
 )'G%I+

*]'-O2\8!!    ^JaH
k9'a       23GKJ7).‡Y6[
M0b"&
?KFoo      ,GW%8q^'3@H‚B@
#d‡_
+5‡g38b6.      

%
74Yl‡e
<;-26=In{‚S
+9\+;
       9REQI&'
"
,(?59s"8-D
/'d)
ub     
‚f[L@     
&TB'2*y‡U%+>b7*W^;E0<

q

11&"|4/NL8(
2P\a
7G)-G<
cQM
;;(
),A
e(+!$-
6f\            
*7g
""ŸV˜€€€h¿0ÒÀH  68P-Hn
(%
vtpp-r59$>5"EIa3*.6        8B$S*''‚f‚85     )"     *'
5a- 

F2d@beEOc;
/D+!W
,&2"(i
c#K/$

#
#!"C
!(['K%j[‡)kJ>)' r
H$425y.C/;5
:l)E]{R+jQ]V=N
!*/ia‡_,3"$Xv4,
O3IVG
              \


{-L0k
      ‰…B7      @ RKt0S     ;,
:%3%
FJ7
)=+15H     @C-,    >`)>k(
)'!
'     k<E'D‚
:ƒ9{.        ‚",+0&?   )Dp&N
+(        b$?;T33Z%V
<j%
,      0-KTD
%]'
K.
j7>n+\9L}E,^
$ *OZ      B%64+9NP
$)ELh0%E6‚T'<6 B<
 2}$=+‚D8 )sl    5\iCaUk>4W
GJG
)    9W  m
H GP      /v"! =#:-   8
@<:O%‡B'    1><5&#
+I‡d0;$.75(i/45>e&j`Q1-H1.   V;'ND<‚*+''G&    L.$k
L.?=
9P16)+
 *@$! /&U_3
!x%e

#

)*;
G-b
:_.
!     6:U.(0E. :        *b2       &e'H.9
M
C!e,>

'"z;IuS /

V'
 ?Q/>
>;GE&3M?$&
6I+‚d5a,
` 58‚&
+       
1e
0      H   vRF / I;
)&#
bd#_'%^!R 
v
       IC3!*       (8Z       d
.>W5‡?3gi9  1C-/28G2
$
qv;HKa,5‡R
'!6!6$D?
.U—4O p3lEUƒ‚X'''.5'''''''''GN''''''''C'''''''oZ7>'''''®oB+       +ª8'        *R 0sS‡f>
q!F(801"(:22&g/
 -B 

:T$‡f
93A/27
m 
6       >"X]3 -4
$)#%    
)!9h
‡]!{
Q-9j_"uXH37ƒ;ao8%GXa]uWU
^1&;e)
;;rf)d8,]5
FF
 C%saYdR/^.1{e=      \Kj ES8?EmG:B%KF6x]YX
',bG!&>NR;I6
''1‚e;
~.1@80`       5g!.#![]
r@
2%     )
@      =
w2Z

5‚
!C1h
-6G
+-SET$#‡BG‡ed 1v?a_*9U

^[.Z!!
l!     3
.

        
N

GBJD.    ‡dE‡g


GT
[*B30‡d
\‡e#A!%$^-/$
>
3[!}Ÿ7c4@Z4%$§`Lv5D0
Q2‚.‡?0L8{1>8)Y
j¶S
        0      
#GX~&:b ‡g@1

&&—6uYc&91F@H

‡b8!j
[‡gED97@^
 v
$‡c` 8b5        6#*4C'/7>24%3C5—1(&
z.

#?sYV
"hUH60iJ%

"c^=             PŸ‚)[ 5"O7‡ee$<#>%$\)
4)V3z.8oa.&
W+1
&uX9
S8'3e%      "U7 
I81
1+:K(‡W&4'%>YNN<eg\=WG*"/QCN6
R:‚%" (&^-=T+,(r   R %#
_8
""ŸV˜€€€i¿0Ò1 “ÛU%) JN&&hL

7@%!0        [4       4+"+N`
h #6([A&o
":,c[-C‚ D
xžqG‡f,!LO(0;?,7I
     
       
%Kv8+'‡d
G     K
)D1
"E(%;Ir


L
 ‡WFf7Zy*(‡Vx®o8
i
^+Nz
Mfu(%S'5‚%7+&
'-x&2:(82}:-/(+8M"5.-[-‡B
zW
|-

pDW-
)V3s‡]$=g
"
C
_H$)j/m: oz(E(PV
'
;8(%9"d"M
$3:3}      
8'FS       
+
# 
        #:

‡S*      .>

%        \Z%>I,G]6>$XEE*<
&1?J;E&1$
V2+      .3%!B"!',:#
$ /(

C&B#/)
.'W")G1V$‡\(      ,8     
   Q+        a@1~._
I(:F x. [>[8;($'      S5EA&-&‡eT>8fj
F\?—2o5
 !i-T$#%  
"# 
#66Uy#?5.  bI,W-l
'%BXr%        

8
]g"5j!

      #-%1$d_AE?I ==
H‡Z
,    HH?
l        
*q&     57dg&(7"$    Ac$@‚E!
+:
2L!C2X5$=[ax|!fh‚"-9+,5I      +

?H)
        

_, 
<'‚5'#Jp‡J%{7:V;<',")#NH?.#D %[d/‚." 6*1Y5:$j6B%t    
gy+&3?%'=2m%:
$DOBG8
        )LNH
%      gG%;5@1I7D
t1ZKQ
f)$%-

I!S‡OTT!
,HiU4‚$>(&6j&=
?u (
D!        U5
‚ &-30d@"*(:Z/*1
Hn
/2 ƒ8")>O0f@=,I}.+#-E[t"!5{7H*!‚"T3'|&;GF‡E
o2
$‡f1$-       RD/P

N
&(g9x-
K
!!       )2(0;^*M9%1+H-<Wn R
z]‡d
($'.)-"G-(3Ci
6
     
<+
 '=?'18;LX"‚wb,]FA$‡X'4       
m}!K6

05
#|<T$#6gH,7!%* l_H/45aQXP[\"6q.    C;.    
C3="C;
:-Ll)'+)E{b$4C1=41",;'%$#f5 ^C
A(@E=8A"4^
/    
y
r 1RX-,N9>
N)-/
.
;0
", =(#.~$941žV=;,.~<‡f)
9G<\*([     #jt6f<„P2G‡a6     "2=
0,0
;E
8lXS#
M  .D
+5‡\C*7[=*       ~Z&L%#?y\T|
41—4Ko7‚
^N
AX@/M1B+Wƒt,       /#='‡$

r%;‡c! 
K*
K0 $7@   ,

 @kPY%
<\D w=*D‡
c>
;‚
e${
&(18@‚
<
94$-1#~A v
;]7
.
y<"DT:
EX1J583

.)`R
4BJG0    
H )W}M,)*$W#!I
     ;
1]5—
5*;)"&?GL@Lh1kz)-7S_')E
‡aS   v]iNIX>tMU
""ŸV˜€€€j¿0—î_eN73pV;5/$+    KPtqZj
f2‚dbR3/  2Vcxne3‡Rb‡i


[
o "^8
J59
;S"#
(.      $d$E4F%%VP#r@$!i|.2d
       ):
 L@QY@ h*$
!:B<s‚rƒ85 '&       =:%R(C71
1C
PQ*

O:     4         w:
 &   ?:$@Ui7‚   3
B&"X  

&,c )1     (D'*d*b     
((RGF $"_,NT?&MAE           # 0
\.:
e;tp9'JE9
     FL1"h)
*)J4Ifw
H
'.5
9n
*C     
a'        
#>-H%/5!!#
      p2T
4
">U##
8
<&N
"$
L"'0
6/‡

$$647L1-|-J{.*H^IN 4L7:Q 59—7
0in5 abl‚mccessˆ 
ƒ…ƒ3‰`Š@
‰2‹Fé®l„Ù‚JÕzIur‚„6Ú9%¾aci‚ƒ‘˜ƒtƒÉ%—ÌX"dequ‚§SƒS‘‰A}7=ppropri‚—?c‚#‰u„~ent‚„
§S‘˜t†Ó‚pt‚;Ž“š0idè<¾‡lud=k&
$…z‡3 „o$ƒj‚E„!‚}†F„oŠt‚~g„.P‚(>‚h3‡Rp’X‡m†a‹‚4…e„2gw|>
y9>'
„(~
|o[J
ƒ'e…T„
†
‚AXCƒ2       „ƒC  ‚#`Z‰=‚
‚ ƒ$       u
7 R‚‚K‚oFŽ)‚Z–&kS‚"‹p…32:†@„
>‚‡#¦{o¤>‡Ž‹UƒB‰e96„‚U
ˆ

‚0S”B×1‚S‚_‰x‚+‚j@‘P†+-”@…A‡4‹J‰e–Nˆo—$r(•m4]‚
B‹aIŠ})ƒ@®NŠ@l       ‹!
…%$XT†}Ÿy„qƒ
ƒ!o+‚XCN‚#ˆj‚Nƒ„p4‚0y‚YV‚h…6Š"†4†•…GŽo@i!
8‡"‚sŒHŠw*•nX„
†2‹RhVUŠ!‚"‚ZR]ƒNW>`‚!‚$‡ˆ‡’"„qxƒ1ƒ.E\‰%‡fƒ!PSƒUƒK<erƒK‚d6‚ 6i†4d„*‡Sq†7„2"V'%
Œ=†`’²h
‚#‚6Š
-    ?(Bz’l‚7ƒŠ@†8…#‹bˆ#
6Mƒƒ ‚S‚r3b†`‚ˆFsyƒz‚ „%‚‹f\…AŽaƒ1‚dƒRN„f„E‚A…y;‚i$…@xE.O4‚—Zƒi„Y9›"—RR_ˆ>‚i”+&…J…kƒm‡3‚r¦N&ƒp‚Kƒ‚(˜(,„r‘'ƒ‡w“qƒp‹LŒ.k>Bn
ˆ:4ƒ-dt„…y†‚,„
‡-UˆG’hƒ}%xƒd<†$dB@…T‰M4”Tƒj$ˆƒ~L:‰j‚ˆ6ƒ„ ˆ|ƒy„‚JK,‡(˜bƒfMŒ‡Ž%šSW
 K…i0‚u,‚R‚(+J…OLjŽös5?‡Z
P‚s
‚CF*I'—>NIw
!‡]
u>/o‚C†:{-ƒ+‡/5†ƒN‡bg‰Q×#‚SQ^‡Kt‡‚p
-‚.‚
JƒQ‚"Uz‡A„Ur‡2e‡[]Æ-‡nKJ
‚)$‡‡a„&:ƒ
ƒ!o+‚XCN‚#ˆj"&ƒ„p4‚0y‚YV(„vM90ƒ>@i!
‡du—62Æ&‡c
J‚ZÆ$¶]Q—3Of
‚<Ku‚x
]ŸF‡m!ˆ„6ŸŸ 
-    ¾A  L‡`d‡Uƒ OnLM[—‚

ME.4v—5%!‚K‚Q‡gP—ƒG‡LMz3‡h7‡ez„bD1T&ƒ‡Mn§        RL
gMj„r
D;\      k7B¦LN'-U}‡o
‡\i%x—8$—8
3N‡hOJ‡†}ƒXA-‚
      Y:    i
6   ž„K:J+…NƒfM&}
‚SW#      0§7P(+—7JsŠ…i‹G   …:ˆ^V !“|
""ŸV˜€€€k¿0¬¶e‚î3‘M
ƒ215…T™_‘lÀw"cƒ=‚HŽƒ
šw¢.‚vÜ¢Ÿ5»"~ƒ->¶bh”ƒ2§)£^L1F
?0incom‚‚ Í~ZŸ amodi‚Wípat”ªe™‚*„ƒ§!‚"        …TF
¤_c5
–V ?@O‡k|„   1
ƒƒI!v…ÄT±W†`Ü–Ÿ&‡kí‚"ú
JF‚¸‚™~n®—Ÿ#let…Iš‡0[L•G„…w‚
ƒ|ƒ§h‡@µdßp‚?“ØLY-     NÂt|¶`
.—-}—7    +¤$‚?rehens‚W”õ  ss‚ŠX‘ýZF…æ3nsistƒt†%a…kÝ
‘-ˆ  }šV       ¨l†
–x   ßF…1¡HÌy5Ÿ p…œ…|O9‚°d‚„JÚ‘ÆMzžyt
9veni”¤k4Ń5Ã<3rpor;ƒD‰Y
>„.‰dƒU‚K”RÑ1(v      ‘}È>ô‚d—„     åE<‚mt”0*ƒ†O6!¾?LˆƒzrectwŒ^V
ƒZu‚Œ
°hŽ@Ž2…t€0‘#Çc
„V‹’‘*„V
‡J4EŽj®ƒ~&„@„ˆA‡Xˆ‡>†v–a‰•u’4†u²‰K
Çy‰ ™?
…ÖÜœS
„K…D$$üƒ-      3…V*Òvdígƒ\â2—ƒ'‡‚P2\…O‚ÎA]Ý“K‡=¾D…=
li‚d]ˆr…i AŠsŸTƒ       
†U³‰3…Q       ¦aø”N        †?…€†P»‡åt‚‡rblobz„|ŸH!eas^9ns
l„k„]R/0‹U—‡a     õf‡J·]®>Šl¨bQ‚$‰<‚,
ŸU¶j‡zyHd
‚a
‹{3ƒD<‚…z *Ÿ"‡2‚Y3
 ƒJ…%<‚£!s-uU’_…Uš  ˆ"’2ŠŠ¿K£t>‹c†v‹5\„_†Bƒ„Rzˆ:
Š1
‚+„]z§M†,¨0“.s„M£d„‚E7
4k‚wŽöZ‡[7a—;ÆáN>…jT‚_ƒ.ü“b‘xQ<‡dò~Î(Y
:
‡bh…%<‚0
--žzB«‚Îq‡†2
…¶S\‚O§+M-ƒXN  
¦U
„
§h—I‡‚%§~„Av„)LŸN—‚g~7
4ingli‚.Cƒ.
‚z”$      ‚U•êÆ!cment˜]…
ƒtƒ …~0„             ‚†"

  ?‚](Àz¾[ \•I‚ƒJ<Š2“|‰J‰lˆ"†AQ
‘7œ‚3$;3@ '7Ÿd”=
ŒJÃ?_      "PAÀu„ˆn‹Q
†&‹Š%vBšV
2p(M‚e
†{•C¼HWƒOA‰Sˆx…ˆoŽz<Š'#7˜b¡>'“_-H…
®E$†+3„x_‚Wƒ¤±„r‡
½‚, \‚&‚‡ƒF—?8‰^‰J‰lˆ"†AQ
‘7œ‚3ŸƒT3@ '7‚oŽüYW‹B‡T]"
Aí1U„i
ƒ(§
!®/‚
O‚ׄ¦
#7- ®DåS
…@
Y3_
ƒ|I3¶‚C
        al_vacuumHa‚¿Zj†\…o™
’7,ŸO¢Z–׆\‚/£z,
Ÿ$<vacuum‚Àtݬ&ulc‚›FrƒVLRŒt•Òd&™d

*Pe‚¯,-~“?†A‘ˆTO„É…Q…q”finitv…
Œ~•zŠG‘˜ŠI†òhLmn‚ƒ'nt^“^¡a¶(ˆ{†*ŽK,‡@TÜV
ˆm¡¶(”4
W„ƒ\‚ׂ-‚.ifi~
‚N¾#…·pend‡Ž…o^
C
4…\›ƒ-’g‡vÎ1MU‡6    RC’8:!
†pH#¡_º
8+Øu‹/—‡aÊ       
§6C)Žþgl¾ƒ)vŸ0ŸiŒA
‚ I"‡q£‚Õz$Ý]5†;œÎ[termin(¦¶:5exD  

(3M
    /v…NT+b5B     ##

51
?
„
ƒA
„|”[‚?A‰l.…Mol‚ ‚
Q ‚w„‚es
ƒ_‹d
Fw0!]-,(ƒx
…,0…f?3c!‚C$
""ŸV˜€€€l¿0ÒDY"
7  ]†q†*91Wm
ƒ=
…?J7Xƒ_VKI6Ar3„4‚†(~n&BK?‚#‚0„+‡j<‡WˆT‚bp”zM!$      H'
%&‰U+cA    ƒ„2h?<]‡‚„=&HP5
%)%%i‚PK%!`ˆ+
ƒ4!#S%6(WQ:kV IAK‚/(`2      F0     
G3KU')%>‚†77 *‡=*‚V,/:ƒ…U‡
$U†0‚‚‡p•pƒ%"‚E^
‚;‚
„Kƒ‚‚[?###)FM‹Aa‚+!ƒNg
M*pQ…u‚E3<K‚lc
‰8
=,N…?KoGKPo
ƒ!ƒ
rP‚$
p6 ‹7)* #‚#…<‚jˆ‰|`‰fŒ
vK†'
„_

#ƒ‚TE|(5AHƒ+ H' 
        
     ‚‚^M#
J‚*hŽT ‚V0sS’N„U‰~…     Š^
      B        %

1)]    J+&;       >ƒ„„mZ
   @"„=QQM‚‚_[[[‚_CU_SCCCM‚‚‚YY_SCCCCCCCƒd2`6P:"'Œ8Œ?6•,ˆr8 K*‹2Žƒo/\2ŠL‡l$„jU!ƒ)    ‹b)l‚t
ƒvŒvc            0J
3%X 
=
%%
Z
$‚+i*&
<, Ce1)*
sB8‚?G†m=+
‚
v
†{ˆ‚}iŽk/!…i^Lƒs4,W   $Bd
&j                  Q'?(>$
$*:&{


!HG4Q<x{qX)NL[
"LEbD    1‹ˆPŒL4‚~„G2x‰[  `‚MH
 ‚!aJ:‚
„|F#+0TF‘VZl@Yˆk]†…P]‰+ƒ
‰;ƒ—J‚› †Yƒ*J‡|‰,mS|      I

,„A^1ƒ?
)0‡O_%Sm‚Mp8‚8.8†eˆy =C„r      7`†#*

:O-6MŒj,$           u&„ .’{S‚jN?"

 $ "
Y'Zd$ TLlJ_BqN
,4.Z867‚C*=†
 /M3(%[X
5    *
aMŠ3
G
"
V

-
%*V( ›K‚e!‡…Tƒ|8b‚mY
T
‚/!        ƒc~ƒ#b"&($!„X  +       l) 
HM‚~M‰Q*„CQ‚>(N„e’G†#H



 `q„fƒ}1ˆ?ƒg‡<ŠK
R‚\&‡W\#s3
?)
E
Ac7,cB
|If
J
k‡B!(0
)*@ka
ÎL7
;0
7&(ƒdƒ„ƒm5r
‚*68'‹'5
!


)äT“CP‡+<       qƒ˜“+       A
4*)‚nƒˆv„b
‡~|B>d      ,1K%‚? ‡-@g‚G"t…_H/‚*‚$z^    

 &
`X4/

()@kv6ƒf<*   
>
% gW%
.)^E()94*,3
)
„S‹n0)        D

%           ‚e
Žö‚       P(
&BK?—‚.u®n
l
^M$H'
%&|+cA     
‚
2h?<]71&HP
%)%isPK%
!

„C
!#S%6(WQkV IAK(`,F0      
G31U')
>,&†77 *
*‚V‡)+:{$Ur—4*~‰ƒ%"‚E^
‚;‚
„Kƒ‚‚[?###)FM‹Aa‚+!ƒNg
M*pQ…u‚E3<K‚lc
‰8
=,N…?KoGKPo
ƒ!ƒ
rP‚$
Ÿ    ƒ)* L#‚#LˆA
Œ

K 



(K‚TE|(5AH         $ ' 
        
 )M#
J1*hf‚V0sS…k‡;[‡S
      @B       %

1)>]  J+&;>—7
u„®m>ƒQQM‚‚_[[[‚_CU_SCCCM‚‚‚YY_SCCCCCCCƒd2`6P:"'‡oEŸ‰9ˆr8 K*uŽƒo/\2…
‡l—2
]Æ&
3%X* 
=

%%õEi*&
Ÿ, /e1#*
9BCe‡gE=+§

‚5
Ÿ„^‡K 3,W      $B1
& )j                   Q'?(>&
$*:&{


!H,4Q<x^X*K[

"LEbD        )¾0 4c?‡h
      2GU¾-
 !a‚
F#+0TF   ¦jVŸmS0)    I

,,^1‡_G®6
/.
)
2e =C„J       7`.0#*

:O-‡[L,+$             u&„ .ƒS—1L(?"

!!ŸW˜€€€m¿2
®
 •ô[($ "

?'Ed$ TlJ_BqN0
,4.Z867K*=(
 /M3(%[X
5    *
0
:G
"
V

-
%*V‡
\
I!‚(‚V§8'
T
$
5 ƒc~#b"&($!P  +       
) 
HM‡[5Ÿ„CQ(N
k
#

0

 
!q
ƒpP1}?E6ž^P>&R‡:1
?)
E
Ac7#c=
|If

8
k—(0
)*@kO—4‚<    ~ƒ
;
.'   A
4*)®R
_
-
       @BCB>d  ,1K%‚? ‡-@g‚G"t
„9
/‚**z    

0
   &
`O4/

()@k6,<*      
>
% gI%
Z.)(>E()94*,3
)
„:n&0)       D

%   Åwe
0index_constraint,žl•ùfb_,U¦f•ù|eq@$4¡•ùƒfunct_(¡r…) `%1R•ùƒh‚/%1Rg@¡•ùƒlob@   ¡*•ùƒ t@¡•ùƒ    i@¡Z•ùƒPsnot@¡B•ùƒ8nul@

6e¡JŠc•ùƒ@‡Aul@
4c¡RŠY•ùƒH‡?l@¡•ùƒik@¡"•ùƒmitB(¡b‰(+•ùƒX
†+t@¡•ùƒmatch@¡•ùƒn@¡:•ùƒ0offsetD(¡j‰"+†'•ùƒ`
† +…'regexp@
¡2•ùƒ(usag,    Ÿ3•ù)info9
@
w‚a3…`

:"=e08‡-‚ja’9‚ vS‹"ŒaŒL„I‚ŸOFx“‚T
"‚ö~‚j"‚ vS‚TrÝD„I‚Flist‚t†^¡#–׆^ orderbi,Ÿ•ùscan_„] •ù‚uniqu9s„fG<¡z•ùƒp‚Jxinfo‚„†_ lR–׆_PRless‚š7“Ñia‚…mcgH66
7m0x'&+–%k0

…J+`83
.l6
„T7~5ZI‚OJ‚B               9‡+…/Y       
‚T
/(
Šr]$‚JXI`‚0l„b^        †7ˆ`(±b‚  „<‚0š &f¬E>‡}Ž0„ŒE†r‰'ˆ6ŠX˜
q%…?ƒC.–+š"‚<¨p2_„m™—\Š‡<„Z‘D(™&n‚0AFhX5X5XWƒ?X5hahmƒ8X5X5X5VU‚hmŠ   
ƒ6@ŒM* s„DŸ8ƒZ       QvŠ_, ?…+³
Ld‹%„r‹
 .
„   *7‹…&(„9&
_‹Rgƒ‚
‚KO †O
‚"—@”1Š
1Œ`…m‚=
Ÿ~%<ŽmSˆL?‚.?†h‚\¡5‰r‘91…
‚*$yŒ~…A  ƒ „T0'O‹S
ŠZ::‚r‘"¡H…:—8y
}„L^%‚     ‚'ƒ~‚Tr6ƒFŠ7‘7„-ƒ3… ˜K K’bˆ=
#0<
.‡s{26<Nƒm% …
_k‹Jƒ(>‡Vµ§v^FM&j3…aW4 \/!@s26Zb_]#95"0#'/44(8†É@)‚•8ŽhŸ/Š8“}VŽö}hÆ??5
/0ƒj&f
Ežp7:]„ŒE†r‰'ˆ6ŠX˜
q%…?ƒCŸO[ƒt_c…nŠ:*Æ&leAFhX5X5XWƒ?X5hahmƒ8X5X5X5VU‚hmŠ       
§    
 M]‡2„D^\M^õ‡‚Æ&‚#*7¶„Î
     
‚FRƒ

‚K
‡`„m
‚"AW1ü‚‡"¾9!"ƒ T—,)'OŸ%
v:‡f‚‚r„K‡†p‚9
ƒ|‡Sw
}G…]S%‚   ‚'‚L‚Tr"‚M¶I$
H‡—‚‚^X‚)
#0!
¶}>O§d-W4 \/!@s26Zb_]#95"0#'/44(8‡fxn=—a—K5‰d     ^Ÿ
/Hrect
…[/(™L)˜6
        li‚I5*T!ŒRƒLÉ&ƒ"0  –"    ‘I‘§5…!Y|Æ++Æ*stinct‚RAŠN guish‚U‰qµ*†´,|vidu„ …‚Œ…‚0‹sWN  
‚8Q+$Š4‰*?AŽ,¿‹ †YˆM‰IÜ ƒ~‰tLp‰ŠA;Žyšu‡R‚ƒUµ[‚g“_Œj‡U$9*)%40")0Œc%Z#
''ŸQ˜€€€n¿&·„‚†?…k…†}„A¥J…8ˆl‹kB‹z—OqjI†o"‡F…)†C;
A.‡uŠ{0‚u5ŽnªC‰‚]"˜FŠ2D‚3…yE…     „]
V‚}‹L{…=Œ4†HÄ&*La‚ 8…E†}Ž7…;ƒ>¼DR†‚Žö=®S*‡}=‚uT.BÇR—ƒˆ
†ML‡‚UG·‚'—w‡&mƒUoP¦gÎV„‚ZÖ   Œ8
-B_—'gI/P0ŸL—‚~‡R—4‚]‡ E®jD‡cD0E§2§‚‡Îƒ—*      n‚ 8ƒn‡‚L 
7ƒ>^=0induc    ‚8‰4•S‰‡P—ë„astri‚V;‚t‚Heffici‚u„eVÚYƒ=†
‹M„½U‚bƒ=‚~‡‰yP¤‚xqu‚
ýŒ‚iw-¥~ßsÜ[
èA…Ö„`¾>Qwt‚3vit‚hˆrì‚Axactitudƒ\pens‚¨m˜5ˆ=(“Ø?Uf‚ƒ&erior‰
‚]•yŽ•Ò
in‚X´1‘·IS„ Dit%†d˜Wš’(‚k!1…,‚rŽB’]ŽÿKùŽŸ†wŸ„²x„…
pM‚É[•ù‚llat‚†
%     ‹:‘¸
%Æ(ict‚ÅW“Ùuenc
Š     ‹H„6T
„41‡å&‚9‹BšSÅ@Y¶lnœ"„ƒW\ti‚•+‘‰Jo‡‹—
t‡K(#*(#*(B?
ˆž8
‡)†X   ‡*/fS–‚PÚƒ
     ‡‹'„Lý‚2)Ërm‚C‚{‚‚(#ƒk‘
¥%|m‰mƒ‚c„>h&$&".r
h8u
-59‚]„C#( A
…8‚&  Œk'
‡"…Œh‚$.’/‚2…Mh+~‡/ˆ<p•.„“9–z{x‡4¨;Šw‚JCŸƒ—LU#…$&$|Z†\Ž+”…P—Q(„
º‡‰•=‡J‰*¤F‚\•sŠwˆ!M>ƒ:
‰q,‡@„_-F!C"A8-T,‚%$‚g<„7ƒ]‡Iƒ˜/ŽRR†ehƒ©=ƒ<‡&c‚%
#4;]ƒDV$dcŠ&…ˆD‚†0
†.¶ƒ„R‚8ŒF<‰\‰!‚T
pB~‹7ˆm…
…4‹Oƒ%a   ŽF‚‚g‡.†r8ƒ\‹<;0J?‹SOD ‚tˆ%
…*)ƒ!       %”‚5‚v‡X†@yƒˆj†=Xsj3‚O
A‚I
…R7$…]Š:…„Xƒ\…B…„v`6ƒu1Š7•Yˆe”b–_„c†Oƒt[‡ Šg
ŠD    ›nom‘-‡/?"ƒ‰$oˆX‡QU‚[A{†E‚%I=œ9‰9”`2Š ‹4D"!ƒGP
ƒO†\œ0Z‰\„=ƒI
…KŽŒnd^$y.Fƒ>(…z8œF`†
…;‡D    …Z(=†{HlL‚,…`†#‡Y‰C‚J‚5Œ0Fˆ        Š"
†‚BSƒ+

‡sfßãŃcS
ˆ"‚>…{~ƒ1Ž-‚"•p‚b:/ƒ6“,<<ˆw‰?q^Šr‘#‚j R‚      ‚%!ƒx‚yV
Qr“/u‚H…
s‰DŽö|p‡‚0vNMh+—@:U@‡„‚/
3{x„‚‰q‚JC‡4LU#—1!' ‹(†\Ž+”…P—ŸG…_‡{#0ƒ‚}‚\‡Ÿ
®m2-T,‚%$‡c"—.
Iƒ‡Œ<ƒ]RW†eh‚       ‚&k
‚%‡cr‡e;1_ÆXÎ
B‡hT—<_.‡m-§‚qƒ@ŸX‡f71‚HU      '‡X
?#S> 0<%%
J),      %N¶4>‡h
H‡e?v‡gH®#…B‡4M‡‚
YS‡b
    Ÿ(]c
D?¶aNo…uUu/—+Q.‡‚c‚+
2‡ƒ/„bD"!‚TP
O†\O-XŸ%‡c\8
"
[¦}ƒ>(
X8
]
‚
    o
=5/S3žY
‡o
‡H
‡g
T
S‡
(—7dR#ƒ6‚>—4h~ƒ1ƒmT—/‡ao‡i\‡h
‚56
<ˆw‰?Iq^?   ‚j AR6!ƒ
‚y‚%+Q
=J¦vu‚Hation_schema‚…o–×…o….JI (
#f!$_ “E
""ŸV˜€€€o¿0¶  0informixd‚ )1
‚Oa
rastructur‚Wš@‡X_%
„N!‘ˆ9‚*…æ#í!equ¥•J'‹ŠŽ÷„:†ò2‚°‚ging‚’oƒ,g‚‚|her©‚      ˜ K‘·‚¡(ùtIitƒL˜šICibit‚‚%¿2‘Ÿb†¬^=it‚Š&Pµ—¤,·<Š|     ŠQ…Ü
 ¬D—¤,‡ïv
<   4   }—wcoroutin‚-”ZÏ!ÝX˜K”ZÏ!i„Œ…(„ˆ/t`ƒ+"ƒ>!C3RKA‚‚x„0Œ

r^4
    
X)„
‚3      T$
‚0
I%  ˆ.B
+

0#

†c*
x‡:
V
       Z‘?F*pg‡3„k,‡s¾,,‰vYR…i ch*”4‘Né
rˆhŠDŒl/†hr„ŽD‡q:…U          ƒ"‚*…e^†<£9ŠW
kL•3‹ ‹HNœ1RŒ>£t“>ƒmŽK„
’
_…ˆ3ˆ*†u‡}‚5œFƒd,C”F—W+6‚@ŽY4”^†?."…$QŠ/…† .%ƒ!‡:‰b—]C”#‡K™S†‰o         ‚a\„ŽR‰I„I.¥/Ìfm>#®k¥M¢‚@¦…V‘=„y†¤6["«6[MŸ’‚%o|…0ƒn3F).‚$ƒ'‚'Ž÷F‡(A‡ccŸ#‚—:‚@ž/1&ƒO…i ch*”4T]^Õ^l‡j
r—0
‡d„p              ‚k…e^ƒ
„=Ÿb—4iúU®m$Í‚C®]ƒ‡"
—CM‡XAXG¶‚t‡eQ+6—4
(…‡k„
^l?."
…Qf…
).%®{‡&‚H
IC§     /@e
.¦MI‡t§ƒ—8O‡m(‡n
‚$%Ÿ]
[T|[Mƒ‚%o|&$Z13F).
z§‚ject{j1
‹$+þ‚…:cƒl*% •C’t'ƒe1‚(ƒ.û‚Cœ
7cg*%       „Ñ`|1‚(urip{‚©'—ëƒXlin‚
QƒAžUZ‚ ôNƒ0…˜‚ner„†,„a*šR??     <}svwZU
’3
„s@˜      ’]
‰l‚IC‚U.™8,UDƒe!W8M·‡&KChJ·6Ž2aŽRR
¥Y&½`b»
„„ÙL
BC
 Ÿ       8,U6ƒe!
8\‡‚/”„Œ&oc‚=Ž~'“ª='u)$

Ž™6C…>‹s“ª‚{ƒnv‚Š%:‚4‚:ƒh‰aì‡ÿ1odD,Á"“Ùgrdin‚Oí(pG  •H‚bP‚*0!xƒc
N"+"‚2W4‚0;)C#<gb$k„a˜w>:`ž#_ <ˆ    J‚7‚Mƒq
&"%„y†!
‚'bN    †0#41ƒv5˜".‚&‹SÆ/
„$R5%§UŒB‰$@•lƒL‚$@‚0 †.–g ƒpƒs&„5œ  (… &3ó##‚^Š!e$ƒ&s‚ŠBƒ{‚…JŠˆ+‹U*ƒpHL‡}‚(‚S[
ƒ*uƒ9‡O„8‹?n\juƒ —=<‘K‚   PmŒ
ŠU@‚N
w>”   ,

„…„F&7"z…ˆ
‚Aƒ
Ž0
cƒy‚[ƒ%^‡1(Š,±8˜1†2GƒL_ ‡%ƒ
 „h‚‰@HˆO
0       “2ŽUX
…iƒrZ‹|ƒ
Â"Œ d…ƒO`00f        F#†z†c"z1H(„P!B@„S %R
é3b‚zI„g&Žþ…2#4
ƒ;5¶Qg‡l:%y
„$R5%
!‡5‚`$—>@ƒL‚$@‚0 †.–g ƒpƒs&„5œ      (… Ÿ2v#‚^!e‡Ja%']Z
CÕk6$+®f
‚bH"
/ ‚P
      unŸ!Ÿ9§C@‡aF
}w>ÎŸy¶‚ZŸ7"zÆ4
‡<ÎQ—&C‚[®ov¶Y
O(…b‡ZdWGƒL_‡$
‚Z -<‚S8-FŸ$
M
0Õv6‡oK‡‚§†,—4ƒO00%       F#†@
["2H(R!B@5@®   b¦ŸIquir‚v‚žSsensitwŒ`1X)~‹X†ƒŽkàvJ”qFŽ13O
“.^Ìp‡@½$`[j¾pƒ…õN‚3Oå+^õ6rt%‚@‚J„


.0-7FOD
3"`!Š94z6-Šx
  ŸX˜€€€p¿4È `
P
v      ‚`‚%"O-Y5
‚kM!
„Wl0†>M‚|‚;28G …*S(Q+‚JAY6>OI(:7(B1/KL<       &%c`<        5
  +
 g„‚Š7


)..X<11e 
~skKQ4
0
*6T
&)!"NM(b|=‚.ƒƒ.h,„
AKJ;(‰Kk2†7

O‚=F)†N…7…+!†
…I…_0„{",##‰:4--*+„
‹3:ŒI]…"Ž‚
‚ 
‚]@vŠv:
E
ƒwx>yCS        )UC/&       mƒjb@0;‡BƒN–}ƒKU‚bƒ”<…~ƒB@0;?h‚HoƒL0@x‚CEY@·ƒd‡/)—]‘m‚_P
’yŠ{N2†P ;
*ŽRjhr2
+-h'C3„d‚,s…dŠ„F‚-Š+
l‡dTŠO
 „O

‚A‚5V
…a      
rƒ"'D+"„3Ž…=ŠC  "       …Mf‹{/3ƒj‡L„5‰6 m
Pµ‚}T
†C‚@¯K<ˆe„G
‰$‚
‚H‚!ƒ^‡T‚~ƒ>‡‚!sžU„a
‹_&HAFW
T$%       ‡=ƒA„zu
       …Ey
ƒ   /
w„O ˆm]PƒdW^-O,/>"‡(‹‹Hƒ     !$%Še
Z
xˆG~‚,‚1[‚q"1
…u†>™ƒt¬G†
„"~†g                                                ƒ>U‚6„‚E‚F‡-. &9‚Hi™{‰> ‚)$Œ·…,™Dƒ7s
ƒ:F‰?ƒž=c)$A6[@…
*28‡T?1>5ƒz£'4‚&V.*Œq…#-4#‡f
“O¯x‹u(;†pŽD©#v4(l
‚t#
0`gC$-%:…='!#
#$CT/%1,h=NO("3Š=Š~"/¬/…3<ˆn„
Rˆ\„P(0‹$U   ,&Gƒ

„);Z„      E1    5†B‡l‚ZŽ)…’T…DG—(!<.y5’_“`„?–pDM
Œ„`2     ŒƒA˜a  
2‚K‚r‡0ŽvN²IUGr“†=M¢=.=v.>$
O.^
(?$ˆ{
1      "7      0ƒ„nN 
. Žþ[K(bY‚.ƒFh,z41KJ;(|‡gQƒN O",##4--*+U‡37
(
‚5v:
E
Up>
kCF     )U"&       GG2/„(fƒKU‚@FƒB@‡)
7?h[0@x‚CEY—<@¢Nƒd‡/)—]‘m‚_P
’yŠ{N2G(SEF"r2
+-h'C3„Y
!s…h
~
‚c‚-‰
l„[T=
 ‚t

‚A‚5VP   
f~"'n+"ƒ.3.…=D       "       ‡[|/3OŸ….®oP³A‡h
l   
'FcU…"<„#„G
‰Lpaƒ&®F&Æ%S
Z‡bKs¶WQ
F‚1‡g1—9q"OW‡k
‚w—:h¶!‡k3 ¾j¾?Uu
‡g
&E-F. &9‡‚C‡!„La‡g.Ÿ#^$A6¶T‚5‡\ lV.*†‚j-4#†j;‡pYiu‡9`#v4(l
‡?‡g!

XBgN
$-%®qx&!#
#$CT/%1,h
#N
G("H3T
"/#¶ƒ§|—2
J
„`2  P3
2@‚ Ÿ‚
N^

cUG+†(WMk—;.>F
O.^

0insertaddƒ¸—ÌNGidx‚í5ÝØg'M…O.
~  

ƒ[‚:
mŒ'ƒJ‰ŒÍ1¾\ŒxSƒt†\ŠEj‡6ƒs«
…^!•ˆan+ƒi–Š‚@ˆ›
„`
„L-žH
Š1—%
„FHÄ2”
-X„}ƒq¥ƒ—9mŸ#¸c¾\‚HŸz—V΂^‡‘wŸ\Õy
‚õƒ¶ƒ(í¾Æ&Z¶P
M‡M
‚]H‡_‡„Ë
5ght‚Zj@•Œeù>nificƒ‰st‚’Oƒ,©ZìLêGƒû„ppect‚YU
Åvy‰ƒLÆ‘h„(‚[½‚Q¾ƒÜE„J—7,¾‚”:=ir‚µMƒ$?(‘‰Bcƒër&onƒŠ{—ãotal†v
„(_d††KL
%cn  e…Uk†J„s‡:ƒ.‰z#
„b¨Œ
d‚“!‡@ƒT%†a;„n•'†S`í4+
ü~

ŒOK‚¡w‡fSåMV˧&‡g
)% ;Ý]—Lƒ: .w+
""ŸV˜€€€q¿0À0installiert‚ˆnc§‚]
>
=
!
ƒ=…[
‚/  p%mƒbh8‡ &2‚V_NŠb„b
„*L™/‚I‚{‹{Ž[„Q’P. !LM}AK  /
      #+NŠ2
Ž0
mO"ÁˆƒoR‘ ‘
Œ;$
Y‰KN :‚³}—ioCˆnƒn‰nHŠ‚Dg
:‡3y…<ŠD‹V‰Y¥8b&‰$Š;`1¼I‚+ˆ#†S„qŽ¢t¯5®í%Š;Ž7Žþ]k‡g‡f8®p.‚V_ce
LW4/‚"
‚

‚C%‰c. !(XM}AK     /
      #+N
(L


mO"ž¬IO>‚@ˆ
?$
Y‚Vƒ
 :‚   oCˆn‡B)‡„ƶq
~…6‚‘‚Õ §ýƃ;‡‚+M‡}#
„q…†PÒoW¯!žx7Dt‚+‚–gtj’>‚    “Ø%anK¦5‚J
ƒs3(œj)’Ô%õ
‚hO
1( li‚“Ø\ead     n/,X‡B "ƒ=‚n ƒ>†¢vKC
Šm"0„a‘Š!
p‚    #
mm
SY„{]O     …*2
L(Y      „Cƒ=1–X†>ˆT‚$„z$ƒ6C–z@ …)y‰{ƒ.Š‚:‚®S†u‡.>…re"=" ‹-œu°•o†)ƒU=
…:8H–dŽ1‚‚j”1‹cJ„‡gƒ†‰d‚s‹:‚‰"Œ<†5‰ƒ#{D‚‚k…/…>ƒF?„Eˆ8$
,‡)"EU‡ƒ‰'ƒž:„…X¬P…"ƒO6†aC‹"ƒ4ƒVs‡JŠL‚
‰97*†‚
„l&ˆTšPD   †jG‚C&b.žG…M‰ˆmH‚aV“@%§™B 5\‚6„q†L‘1vŒƒk‚W7–[‰[„a—$‚PŠ0‡f/’QA¥`ŒQ„  „X‡=‰V…ˆ` !‹
‘iPŒ#>ƒPxƒ=ˆ‰]$†:.„x•1“=ˆ_0@8©:Š–'Qw2„4…J„H5‚4ƒ'„–Q—U.z‚}Œ
‚rž'‚s…s;‚/O‚8,‚F¢‹\^#„s×`Å| qrF‚   …O†p…-I‚$‚%8“i‡ƒ-ˆQ%‚'‚~‰3‡4‚L„ŒF‚4Šh‘S…„3‹J†Žö|/9‚®f‚$Po‡‚)      FS‹=j†W>‡0ƒ@="—<"ƒpœu°•o†)ƒUH~‡i
8‡
7‚M…k„7‚]„%V‡~w„^‚‰A)eÎQ1‚KD?‚J‡kQ$
‡e="EU†ƒ‰'ƒ•Uj„J 
(fž|S‡jyÎ@í`!‡‚A‡iL®D§%H
WV
9f%‡
    ¦bs:—‡]K¶a‡b#‡cK„Z¶ƒ"
‚!‡u®p0‡_
9>‚8‚RTb‡‚
_#0[‡Q6…ƒ=4OPr¾M~.zfxf®C®"b†p‚0‚OIpM‡†d2m-q%28AWc‚—-t=‡‚E5F\inctªtut‚‚‘ YrH…%+$
™h‚‚S,E’¼M,8ucty| H‚3        |ƒ"
t‚"d$
Ž_$9ƒm]3‚gƒJ…*9„4
        L‚%CAgC    JCƒ'(0
9‚Z     „6%3„J‚D\]p,ƒ1†}dEHYXƒ9…z)ƒG‚‡^…9k|Pf‚^ˆ‚6
‹‚Z’{…x&‚X†PX,S"  CWƒ^<    Æ+„_¬p”"ƒ`G}s
f‡y       ZBjf0S4.-+A%!"5@ƒ:      *ˆY& #+'*a--†
14ˆ(xL"h 5&0$49%7G]51*Q‘"&59-**&”.‚E!CŒ
,&H/!h
›'
=‹4o&‘%f!
)”>\,
ŽSOA,
        \2ƒBT–Æ)"
tK,$
X…,$9ƒm]3‚gƒJ…*9„4
        L‚%CAgC    JCƒ'(0
9‚Z     „6%3„J‚D\]p,ƒ1†}dEHYXƒ9…z)ƒG‚‡^…9k|Pf‚^ˆ‚6
ý.—.-—I
H7X,SÃ
UÒ{>‡e:å)òFåEM¾W   or‚Œ%ment‚
Ù<‡,'('
†l£2   •„@§W$„{J#‚T"øfK'('
1UüNƒÍ‚m‚™JJ#‚T"uffici‚)     ´•ùi1r‚‚bU˜p”OP
Ì)„‹@t‹ZƒS‚rŒk‚+†f/EŽo-†~#1
""ŸV˜€€€r¿0Æ-FiC‚
{‰ˆ6„J†M‚ƒ}"
—‰J
†f…~„w„
6q
A‚8dÐ
      Œ\‚9

b
pIX
>F3$I?
žm
‰%‡ *þQ3£IY7L   ƒl  ‡>$´
        
                       -
¨K    ~   z‡X…vS{‚=        @ƒ_
        y(7h„Hˆ%%…~ID…e                             a   $

‰R
7l‡‚H       Œd‹b
M7    ‚ 
‚)!„:ƒ/‡h‚NƒB-&yD`‚     %@ƒD
ƒ#Cc<K        ƒL

„I
,†b&˜     
        ƒT‚%'
(M   ‚1.
¥Cg–xL‚%‡ †>
”?«9†LˆI‚k
ƒ‚S‡ ƒ"=
1‚•(nk&S;Np@‡#
ƒlc_/-!f‚-Zj‰
f
„)‹#'ˆs   
                ’             {t„3œð[ƒrŠ`†*T‚

‚b
‚zŽþ{‡k
‚0Ÿ
„
&
d
A6ˆ ‚
       D‚:

b
pIX
>F3$I?‡D
„F‡Ÿi‚{3
 Œ&Y7L  ÕP$²J
        
                       ‡qU®
u    Ÿ/Õw
5Î    
Ÿ +!—<R(A3Õpi®|       
        ‚?'
‡aƒJ>       ‚.
‡h‚+g—4
4§pÎK(N‡ST0‚k
‚S=
1‚


/
@‚-®pjPJ®q
tÆ)^‡j@‡G¾CDT—8

G0int2Œ.¶Rm32ƒ
_
˜¢c
64
>
'‹Fƒ}*á5   7a„ƒdÄ,µd˜.‹Džf¥GR
;Œ!   “YŸD‹`½P    7a„ƒdž¯^„øK‚/R
;”3
    u

ÊzdÝ]d8Œ/¶Rn_pag‚´LÒ³unus‚´aÒ³act/ˆ…rMže¬6@¶‡’úVÝpK1ƒók-copi‚Ä=ݯoefac
g

ˆ\K‡'Cy
e  _‚/‹0†fZ„†(n6r‚4
=K       
/
$ 
+‚H
]
†1B‚Q
      gk8!ˆ†i‚

‚7#ƒK‚
37!
'{Gƒgo      
!,
6'
‚P/Yo       ‚      $V=e
‚F
0@
y
d* 
%…fE

H
O0\#‚N'u  V:<:2y-ƒ8†
ƒC!‚#ˆD*
ƒ‚*z-‚+
o~4‚ >kx,}D‚‚,
G‚J„az##=J‚9


†M2”‚P‚
O:!‡I%‚TG!Œ:Q
!9"2(]a%#)# yl6-„H!     $             @O
5I#W(
*S3…qH1—r4Ž:‚Y.$]„=Š~ $ƒEJ‚s"†H5*FsY:ˆ$UHƒC)-‚A.$‰Bƒ
…_x„E‚TY[•vƒp„       
c‚+†Lc     7ƒEˆe,3K3ƒ„Zt‚8„6/‚R]X]G
…<rŒ,$0@‚%(‡e‚/R)Ÿb#"‚1…f~ƒH~-‚5.<9„N*9)„6u‚cƒ#ƒ Hƒ„ƒe…mY‚•9el‚
ƒw9>cC
0‚„6I…k…@i‚J‡
‚
 ‰f`ƒ6a/
„bŠc
†h    
‡3g*‚y
‚%0SySˆ
„.‚+…y!”@L"„Ÿ‡ š—,G“‚c    k
        5‡T2‚o!(
B='7#     †B* kžKy3
j`ƒX.pCR!‚zEQN&!‚9„.‰8„+‰4ƒL¡             z‚Oƒa…ƒYw   
(Qƒ„eƒ[‚hjƒ4…8&;K        <mD‚Q\  wx‚6†g,„0,!        ‹‚W

ƒ'2‚C74Šh‰i"JT$‚?
ŠWo‡<‰TÃ
™Zw… l’Š6X4‘tƒ$…if; ‰]ˆ2œ_§m

C—[ &&jY"$ˆ~%2571‚‚h0ˆwVnƒ"?ƒ7ˆ,ƒ>BƒE    &MHˆ-Œ‚w‚…#„@Žj“H„
ŒW…mpƒ,&Ž…?l†%.
…1C†K;mC‚‚…n…<S& (v*8U„jF‚†s‰=‰kb$ƒDG!W‚LM=b„Fzƒ‰vWƒB%Qƒƒ\‚„e‚fƒ]s8vŒ[ziGOP

!!ŸW˜€€€s¿2*‹"8|ŠL&…w2ŒI‡<2‚ˆ‚;„=ˆO…o‹„uŠ"ƒ
o((†
LpF‚
N9nm*‘"ž#
        ]ƒW‰k‰D&‰wr(H…L|ƒV‚&{S
„+‚1xb‚
% -
V%m‚f"!  &KU!„4‚=V5-*cRY1,M:%„R†
i




…T&‡7VC„QF#TL'%  I‡N%'„{>6  ƒz"U'a"%
 6P&#ƒ      +Oƒ‹f
0')           „&‚Žþ\[z#*]JH‚7


w—‚
LQ
!9"&(.0a%#)# 
+
e6
$(!    $     
)    O
5#(
*37‡-
4.<Y.
]…f $r‡05*F!Y:
‚uU—6&)->$‡v,5
…_x„E‚TY[•vƒp„       
c‚+†Lc     7ƒEˆe,3K3ƒ„Zt‚8„6/‚R]X]G
…<rŒ,G./(‚<
U/II#"#,2~ƒH~-‚5.<9‚U*9)?uaRHƒ^(Y
>el‚
9>KC
0DI…k…‡@7J*
‚
X 2`6a/‡X—9
…¶Wh
0%
S_
ŸˆM‚"„„‡ Y ;G‡]MLNF
        )Ÿ*i¾A
®U
%O
h‡g#3!,EQN&!‚9§
H+%§§&‡ƒR—6#¾0(\  5a2,N0!     „.‚
*

‡YF‡e
‚>7nhƒ&"J‚TJ"§cw¶U0„A‡_4†}+‚Lƒ^f;K   u d2‡f‚


JC‡W
zk+‡[&‡gA&j
8"§B%25G‚h0„:‡nO B‚  &MLk19A‚

‚/¶=—89cCPQ&LpF N}nnb‡fƒA"{
        ]K$Ÿr(Hu
R@2S
%+
91%-

U"!        &B:U!„4‚=V5-*cRY1,M:%+t
i




-T&‚YCC
F#T}'%      I‚U%'‚p{>6  ("U¶*#
 P&#ƒ O+Oƒ—7

0integerinteg‚^ír~Å@'
š4‡1‚N è&q ?©!e—S‚r™({
œ

`ƒ.§y
§,‚ƒ%ˆ!ƒ5„?ž?&«3n/‚J‘Q       È.¶c•G½F'
‡O
®nˆN ?
eü‚
_a—)8‚¸fü{ŸåƒW‚OíK8n/‚®Yƃj®„$Ÿ  ity_check
%USÅZêYÐŠ8]•m›~ƒˆ%§kŽbÐrƒ'
$†`¤3{#–#+·
¢tܱŸ3Cü‹P‚KŠ<‚°‚Œa:³‚Ά`"3{#+ôÎV
ck‚ÄbÝ°lƒ‹—ão
%lectu‚_5=8zˆ'—†nig‚ô$‚7ü‚Fndn©r@‚J+"+      †%,        `ˆ,#‹j…/WW‚”3hšWµ2“3D
ƒ
‚
Û&K‚‚f„9ŠSž%  
.‰
‡x‘,hžo3˜rˆr'ŒmˆD‹T‚:ƒ‚|Â2‰vŽ    HlLe–1ƒƒPd–©v/›9¨„(›fˆb‚-‰8Tƒ?‚@‚Žöy(‡U‡iŸ Q—E^|‡‚D‡cP0õ>‡i
C—
+‡yK®@‡fd‡k1³U,0—7cÕydýbŸ"8®l}    ¶T8ƒíW.>
93W7ž‡hN
®p-‚‚Lƒ3Ÿh‚-C
+Ÿ@§‚?‚@s‚šF·Vœ
Ž]kƒ
Š`§SmøŽSrk‚‘ƒä6¶„lå‚ty†£;7)—#Vñ|Œƒ9¦mˆ„4
‚T”ü;@¶+§‚K®mCion‚„EA•³‚7r‚NõKactBU{*Iƒ^ˆ@
‚Ž
‰J_¤2˜S¼;ž;(e®}ŠM¥5‚G„:„qŽ÷.å@Bü|7¤GÕs‚Ï‘‚Ei!…Rij
""ŸV˜€€€t¿0Ë•¾
b_Ÿ"§Ö¶¾J
(e
—†-‡3Õg
G„:   0interbas‚R
…8ceptiy…2—h¾Bhangƒ<‹4‚_
YHƒQVµpÃâKS„²>oest“ET
q…–kƒƒu‹WŠ{„l†)  •gƒ$”Œ0 R
X…_]™Wƒ}1(2a&‚i¬T’j{ƒ(ŽþUý)
6ƒƒý
,fQ‚‘ 
      ]¶‚ƒ-Ã'yf‘s‚a„'Ž÷34†¬/ac
ƒ@%ƒ,‚)†"„)‚S‚K‹T8‚…y„H 
…#=
ˆPR7‰/‚)3–Z!‚+ƒB‚uM-H@
#"
1Q%W
3‚?~2'HH,,Z#
n'&]9@r2_     =-;I‚O‚|G>w!    1K1%',
      8I9}K
d[h3
D
‚.(C1R+          ƒ*‚.T
;$‚
M‡;?
U‚I;\ZK5
$  
#
.)+
<<
#
: .       …D[IAFWscI
X
)&
‚E"‚&!‚0"
".
†H
J‚"3([Gh2:,S(4 l&6dM5    g
*T&%„*…llT†G4ƒr‚,"]g,Aƒvƒ%%…%%:u((4W;\^&@.:. ,5cm
Vƒ„0†x†]…]‚b‡+L   6812i,8J#ƒ}5‚jb$ žÏ—L‚W†A
“hŠF¡iƒXøŸR2‚JhS#%@<!1D*p*L/ t‚‚>1:ˆucŠw49‚0cw$ˆR†?Š#‚u‚…k+.`s‚0U-r-/`;„f‚'†L)
‚‚ƒ†P.I%;! nm„7Š
:Žmƒ|
j‚|1‚‚SO‹N‡U (   #pšR6<3Œk\T‰‹9\\%          6%
5;
*m
‚T‹R‰J‡1
#Ne‚g5‚Q‚~
/‚!&tŒ*…PƒrƒlƒQ$†_vb$‡SL71N~…]Iƒ:?‚Wˆ‡"
'…>O&†     
?YD&Q ƒq‚   -ˆj—'•A]zQ]$=
l!K[ƒN!–
…d
ƒ‹]-)‘t†P„-S•'‚|ƒˆfƒaQ~†=†
…a&dT†Cƒ‚A&h„!‰E(F„H
h†
‚'Š5 ƒ7    
&h6ƒ…wžs$2(B$ƒSƒ=‚H"„UB 9‚S`‚R?ƒ`tc 'XsB4J>‡KƒWG„|Ž'‰Ii‡$Ši†XK

w:C‚5qN+{Œ[†
Jro'„K… ƒ#S‘Oe†fŠ
iX!K„c2
ˆ9)$]‚~K.„*G  D4"     C,‚zƒ‚
‡u‹O>81)
a

5†\‚#fe†1$J 5      „/"'(3*S…$V‚VLK6„Gƒ2K…FƒG†!OŒ^•U‡iŒn„     
UB8„0…/*†+„2t‡#„5G/#<…‰¾
…*
a&>‰k,7‹p‚4 !”CiLGZ„J1„V…JrŽöƒCP®g         /  02i,8J#           5        ‚.        &             ˆy‡FL‡".ŠF¡iŸ
„E‡@íl‡cT‚0c
f$…Q†?,‚P‚>ƒS+.`s‚0U-r-/`;„f‚'*„>L)
‚‚ƒ.I%;!`me^u
‡F>K‡‚M        ‚‡:œ‡g)—9F‡eZ‡i
c$‡ƒa—6;8$4~
fI Ÿt?YD&QP‚‚  -W*
/¶1y‡d =~)®n5#‡Q.‡‚  §
&6‚V‡[(B=D‚H—0®p ‚D`?btc 'BF
H>4ƒ31*ƒ\ƒ{
†bi‡
7…HK‡
wŸ"
Cm+{%j'[KS  t"
.
iXWHH
OQ,]X%
""ŸV˜€€€u¿0°2–ùB
     
‡g3u‡f=

f1*ŸCO
v $V‚VLK6„G‡e
‡ekK
:F‡d       

—
‚nB‡ƒ'
*:C1ƒ=G/#ƒ5D‚4s&>0,7TBw h)‡I,7

ZŸ
ƒW0interfcerˆ[‚ƒ@¥c²
Ž÷‚ Ÿu®ƒ<im‚™–×<Vor‡m$}      ƒ)

´P>Ùh
Jƒ—j'zƒYn7†    [zƒ:Ž!íS
‚)$
     ‡DdÎ
³¶‚v†òe
S>V'zƒYn7†  [z)leav„ink‚
‰wmedi‚†ƒ%"ƒ0”ÉDƒ(ì        ƒ–!d‚‰‚>Ýgní]p
ariwM[‡OIn
‚  ….…_ŠGƒd‘>
‚F 
…Z‚A
4*%
8/s"‚`ˆ…%==
l
‚[ŽcH-8
•Oa‚A†G˜f@‰.ÅO¶@‹H;5ƒN*"y…t£z###wŸs–Ž ÏŸ5
‰Z‚1"ˆIŒb…ƒ‚Q¯D›'‹0’q˜?   ‘    Š

ŠJHF‰… Tdmƒ{O+…XƒA„T%”'ƒƒˆ1•S|(ˆ
šV{…3Š)Š9‚*ƒ_)ˆ¨kŽy‡F§1%ˆbSˆT     ¨šˆT%†Un ƒkÜdc- ƒB…‡`
T"KŒƒiƒr‘‹)¡s.‚Pš
$ŽoFƒ o$
` ‚Ap˜%ˆ(†mkƒY?ƒ
Žþc
=a‚?7§„QˆƒH4†^;5]L+ –Q###wŸs–Ÿ„9…=‡‚\Õlo—‡l‡jˆs.â0Td®m®„M_¾A
¾/BKŸ®nR
§„I—‚b‚Iƒ"1%‡I({‡
Õx % Íbl
IƒR3‚Q‡`JR‡t‚3—(‡Pƒd‚!‚JiFƒ    !
`Ÿ
Hx—P{ation‚Vï‚etZ‚eµ2…!`8ck‚7
“*‰/E…[ ‚{?…/Žt—n‘ˆX'‚ƒÜRu9ÆL®ƒ     ‚°a=oper‚—4*pos‚„retD
3ˆb„E(G'…/„P6Y‚S‡!D’I F(/(‡X=
%:4
„~E„Jˆ0
"‚>„)]"…gƒt 5•,„`‹†/™b$Šxj„¦+š7—W‡N0¥‚
‚X]ƒ^Ž;—¦%‹Y"‚c‚AOn*ˆ‚˜3
.R
Ÿ`>«I˜6Š
f>ˆ-{qIƒ?ƒW‚0ƒU‚mBƒˆ_Žw?@‡j…4ˆH‰\r’Z‡SE/œl½l†       …BµBl
‡<‚E0Ÿ
 ‡„¦+š7—W‡NŸ 
2‚

5]3‰e
„   )`ƒF‡A0OnN
‚
UÕBFPƒ– 
d>ŒD®
;I&¾<‡h
BŸQK~¶—:Ÿ‚‡f!_
orO®^
 E/Šs„KÅ„ocessw .ƒ@†k‡¡relationship‚…xog_…>LMƒt‚G

zV¢O‚Žþvb„ÙE‚‚GÎ
7V®„lupt„|.&W

D
.y‚6„}§
)8—T†Pzˆƒ:-
…ió‹½t"ˆGƒ7‡,       ƒE…
xƒ"„i–`ÅTƒ{z„ƒ‚/OTÃ»Ý96‚j
—u®‚NŸ/sect„˜G      +
‚^
œe   £M…NŠ=
Í!,
–"3   ij—&(…W      ”Y‚vŽ

÷jµgƉ=„=üˆ\‚×`
‚\3Æ g¾(ƒ'Æ#
&‚vòpersœ”lƒ4Ž÷‚¾L„›&‚ç+kv„%‹n‰Ž'ŠM=©I
ÜLEMŽö'‚ƒaƒÜF
‚‚Een‚‚9ƒB‚0ƒV¬<žGq312D
Ê%qË(¹hŃR——nŸ„7q312Dý
…>%…€eCÒ‚imid‚Patingli‚
kei‚
ìyÝX
Ø+oƒ
ƒN„„o„ƒU&ƒ68‡&‚9†)†‚7†Z„<•]Ž!(‚j:2
=F`6‚vL'„mƒ%‡
&%c#ƒ@ƒYU‡O       ‚ƒF(‡l*ƒ3Ž5E‚3S$@
‚GFaT‚A8:Y‰3…O(W‚.<^
""ŸV˜€€€v¿0Òa‚A0\‚
;6>Y;Xƒ3
7
L
4*Z-$1-
‡=UF       "f*
+@u0‚f)&„*
3
ƒV>‚
:!g‚6]*1…‚5„Cƒ
Z$
‡uU
ƒC
L^„^+Ad‚H…=‚…j9J„;‰n(‚BXaj`‚0‚0ƒ,
uZ2„
+3'ƒT‹Qƒ)„-9NN(b|„h[ro
ƒul(k‚N)?|}‚(‰Lƒ#4†8

O‚=y)…@ƒ@…'‹E‚"‚,9Bƒ>K„Td‚<‚B
52h+;K‚I7a4--*+p    |‚y]"‡1:ˆ    ƒ‚"V ƒYW‚
…@‚‡„u
…L7TOS        )4!       mƒ39(<@0;‡BžU‚bƒƒ7‰!zl†J„6S$‰iu)EY‡3‚9‚
838"„FƒvBy>…g2†„Œ‚5†‚ƒdR
‚'d†Uy….‰GX†Q<k9|"<S‰{`%4‚$H{ƒ}†U48$,xh
‚elbP‡##‚%
oJC(Š9?
/…ƒ!ƒ…{…dŠ„F‚+-Š+
l‡dTŠO  „O

„FTA
†       
ƒ&]
…^5
6
Œ?‚E…RŠC "      …pP6‚„zŒ.†-+-ƒ8ƒ†U#‚V‡O†t$ƒy      …Pƒw‚%$†Z‡f‚^¬,†6‚m
$Š
ƒ(‚R}dlR.
. "@‚gL„…ud|y2*†ŠŒ…Š:u…@‰ƒ8,›…„e‚wy11ƒd‚27‡8…f      Œƒ„X‚?ˆr‚E&y0ƒ
J
*#$/-…B†N†…ZQ0>‚B-    7Qƒ*ƒ5ƒK–Iˆk’J‰        ŠgZ‚@7ƒAˆB†'‚6…(|5&ˆ>{r1‚c%O      ƒiƒ.

@„t…h…Hƒ        ,ƒ Ja>‚r1S…x„J
Q‚‚s„,G@&O8…H DZ‘‚d…7ˆ{ŽT˜,Xg
‚_„W'4ŠK‚>ƒVƒ`h<8‚,‚#‚P„{‚YŒ)‚L4‚x„k
„‚[*m1UŒ      :„+„%…[„@3%†h                                              ƒB@ƒ&c…+Š,*‚Ii‚’mƒx
‚|…2Z‚ƒ6dŽ‚B‚Ž;;;‡”PX†)l9…Th…+‹‰s…ƒ†fƒ;Fˆkƒ:T'‡S‚‚{#‚3u „e‚bƒ#‚Ž…+„S„1K7†Z‚s‚e@$ƒ~K       

?1ƒ2(„9h‡YsW„4†        ‚co,‚'
TJ%:Œq…N6!‡f(J‚"‚V…‡&':5B#qŠ ‹HŠWM‚CX!„!;Yuƒ[fH‚:†_$w„}‡eE‚R‡h`!…#†Z‚cf"$@$j
UZƒ_i0C(8*0$‚}D*0 >)$(%1H>
<=ƒb‚ƒAA\„4Šp7 *HƒX‚[4w…7h0‡‚600…‚^4Y„OF!
M?/%/,w=7)!
3ƒp‰W…ÑDpU‚]:Š(ƒ0yƒ‰#‚.‰c`),&G-…d…6pŒf+ƒJ…‚P‚+‚7Y‰N`<8S„jd„Qƒ6“ˆR‚Œ
›‚Nv”Z+!‹[œ‚‘~"F¤2"‡.„Y'‚ƒC„"z‚ƒ`3‚2l†<
N
‚Y‚%5E‡xM„B‚ZE‚g
"$iL
o%‚E„6       Rj‚bˆ„o       ‡ƒ-|f*›‡4Š.CVR„Z‡aŠ-…Tz„({‰/…EŠylŒ`ƒI‚
….‹"{$„JR†x‡$7"F†i2ŒWk††rEƒ:
‚26]$W„…"7   0p‚3owƒ
$01   MŽöt
+3‚MLƒ)xs‡ZL(b
„Fro
Jl(_$)?!}‚(}‡hi@
‚K"
52h+;c4--*+
G      ]"V‡W
      4
                8‚:
‚K-
,7T
BG     )(!        
9(H3 0„)…0U‚A`„I!zlGS‡-u)EY—3   "‚9'F"ƒ]y>…g2†„Œ‚5†‚ƒdR
‚'d†Uy….‰GX†Q<k9|"<S‰{`%4‚$H{ƒ}G*ch
'b;3#‡       #p
o‡gBG‚9?
/„Z‚…i

‚d‚+-‰
l„\T
>  ‚u

„FTAQ     
$]
i5
6
‚P2…RE      "      „uP6‡?   C9.UŸ…1®m
     X¬†6‡h\
r,E
, ‡h>FgL y‡`7†Š†_#…Š:u…@‰  ‰&X@=Dy117-
8    †n$‡f‡lQ
G&ŸQ§UZ‡T¶TN>‚v‡h>—8
    A‚G‡H‡i
>
1
S‡i
‚zƒ;§
ƒŸ!*‡o‡#
_g
RAh98‚,n‚)v'
‚#4žr‡R`‡h‡]
&3‡e#®r@
""ŸV˜€€€w¿0¶$”ØGk‡Z@‚-‡‚D
ƒ,ƒx
„MF
      ‡h/        H7SH#
kuL
ƒ +ƒ5w‡]
%7Q‚^8—2
OK
       

$
ƒ—5NWH
ƒ>o‡_m
TJ%:†ƒ6!†k?J‚‚V\
&:.‡_‚{
M‚CX!C;lu
f ‡qƒ4;>E‚R„e5!#
‚c‡F1‡g
"Y$j
CZ‚Li(8M
$6D0 >)$(1H>
‡f>L‚0x#ƒ†      *H‡[{-!
M?/%/,
$
K)!J<ƒžW       ‡z
,+‡k'
#‡^
‚1Y
‚i`—ƒ'ƒ7„Y'‚ƒC„"‡c;w‡C3‚2M‡_
K
M=5„wMz
E
"$
HLo%‚
:E R       7ƒkA —
|f‡`)

QƒsCV‚F‚    z„({‰/:Md,H
ƒX{'$RhL#"F
.     >p@9‡HP
60intricƒ
ƒ`oduc†…f„[‡v‚8ªc„,‚=    …:ŠC‚N‹4›kƒQZy†*‡#QB;„~¾AsŒ+(@ŽtubEƒB„ n¢‚y‚%+‡`‚'^ˆsg•f•i
)ˆ]†n„L‚N„ƒU0IIƒF‡>
‚‹Y”e†6£µƒ§–üƒ
®‚‚G     ‚e®L*âMT¾s&ù\z‡P'ƒŸ()åEG‡5¾A§
<e¯ t=>Tj e
—XŠN‚\7I7        5.ª ¥gS¶QOQOåH—85õ  ¾@®p—8ÕxÆ(¾@H‡h¶X‡h®p‡i—7‡hP®pΟ +Ÿ4jÕd
ori‚‚espect‚‚•ù‚

ion_pragma‚Àdù–;tre‚–_”ÕrusƒƒD˜Á‚Duit£©3Š;‚=ƒ.5
6žt•Ò6
…+6‚È-ur‚”Yvalid‚n6~*†       Y0 
‚\
m„X
‡   †gƒ!
Ž@ˆaî;Iƒ/
‡
-     †‡x+›L“?^Y1¥S
†V‚Š<<
2//)&("%3*
£*Ÿq¥~—l pƒŽÒŒÜQÙmIƒ/ŸS‡D#„e4‚σ
LŒ‚;„`,]l
nž~2//       ("%3*
—6§
K)ÝŠ|‡e&¾_^@u‚¶\‘‰Qri‚«aE‹t
>‘ˆ„šrƒrI
7entƒZŒ<ƒ5     Ž|†5VÍ!»INori
$…
#
     ,rsŽFµY“–½|…ŸaHtŽ4~„FÆ(Œq×QIƒC`_M‚^M{24
‘DM¥/?•I     Ž÷6Lå±PŸƒ
I_M{2„á=3  stig‚/ƒ}—ãis‰^\[o„oW†Nµ…t‚—x•Ò`oc‚…
¢+„lKg%
jG„7N‡|ƒ*‰aŸ]Ë>”{ˆC5 ‰}ªP¤!‹ªƒ[†8X&
Œi„|]yª_‹?ˆD%/C       j‚h”lˆ    !¹0‚ƒc
˜~S‹2ˆd†V‹v¬'¡q–IŽ÷     ƒ&Æ‚
‡W5ž6Ÿ}¤!‹ªŒI_‚ÀLÕw%%/
JAƃB
e3§#í@+
Ý>S¦|<‡iÎ&#Ikƒ              „<‚1‚      „~
„JJ‚Q„K$„PQ+B?IZFm#)|@X

|C)HI‡+$n‚H"U
)
c1
bW‚@†h-D.@Jh#

5= ;-9Z
‚3B
+D‚‚J(‚$dCmx-*‚w&8vb>"
P+5Dg'        
*R‚@&yƒJ6*35((‚n„ƒ?:'6„4‚!ti>+d    ?Ga†aY+H‡ƒ`2A‚5„"…UDWl^1‰*ƒ<ƒ9Iƒ-3<,
ƒ-
--ŸK˜€€€x¿”gcHBS‚);‚^‚% 9P,0     h‘/NˆVw6…jpO{,|/‚"  $dA&„!V.„xA„$‚V\„A-E …o…ˆD…8&ƒ"s‚/6`U)q‡w1R‡U! /=ŽQS‰‚dB…E„*Ž]u\‰=‚f˜<‡+bˆ<f%ŽGÔR½ŠWl‰O…*†T“74‰’s6$#B£1ƒC‚        F«[F*K\ƒQ2pg‚p,8?$_#;oˆdœBˆ:‡0‡
\‚#„.Y…09XT55u‚ u$Iž,‚"„;KF+‚3"iM&:ƒ&ƒ\
“S„?‚wF0Q@i
U’)†lpƒ £b-<%ƒ@(:"
‹u
ˆ…7¦$*¶‚
QR0…Vf!‰*3š6ˆƒ@ƒx‡$*Aƒs(^PA9R‚fƒ,ƒM†
†8™^~+0ŒMF#%‡T™!7’F
‚Š<„D‚+7ƒm†yƒ&‡‡ag†!‚D2C‘W6¡S†‚j‡ƒcÎŒ'L6Œ|”Äq”j‚‡!Š((ˆbW„8„ c†}M*ˆ:˜+N
‰2…sŠ'‡„*ƒ|†.iTbU‚(ŽM
‚~#…|„J,‚U-Žöi®k‚}AH‚+—„=
a %‚    
t&
\sd/6`U)q1R†J! /=‡?
„oS'b—‚(&:ƒzu\‰=‚f˜<‡+bˆ<f%Ÿ„`k‰nüW
…2G4
ƒŽ<„T$#B`@
2
‚3 Ý_lÆ'-Ÿ$,O
?0‡„—6!=KV 9XJ5uyu$IŸ
‚
&y¶WA
FQ<Ig—9
®‚#‚ƒ ‡‡jJ-<%ƒ@(:"
¾7
O
~®lO‡‚ƒS‡J
t
Q‡U.4<n*3ogG@…W$*A
ƒ,(8
%O97m‡G-§S‡j>z—*@\+K‚3F#+1       
   BF
‚¦†v¶Žv‡d!‡=‡ƒO
e8Lc
>M*ƒ@—L
…f‡fN6Ÿƒ.iTKUj‡^
#Ÿ„|0involv!ƒx‚Q(\5‰¤‰nuŽ>*-”q “ƒ”@…EŠK„3‚d¥v.¤:¦…†>Œ}‘‘e‡VŠ>‰‹CŽZDƒa‹1™„v¦…t„?¢,‰"„NªtåCLƒ®sŠ›HŽö3
å=QT¶PeÕ‚Xc1‡Uƒ¾;”<;—ƒ6Æ$#f!¦_—CÆ,        ŸŸV‡O®‚&ƒ „#U—ƒ
‡>4
X?‡„"¶R'Îí…=®e&om@„‡'
ã%nBÈ<„~+ƒ.f‚W)0„qN9!2$½i
‚n#=³nŸ8_methodD(
)
†wž.¬j+–"<LˆB  !@!p
U"m‡sv
—14Ž÷a‚‚A„ªZp
U"ŒS„a‘)14cap_atom)
ƒc'¬u
 ‰Aø‚Lic16kƒi+ kƒe+ 
2kƒf+
32kƒj+         
4kƒg+     
512ƒd+ 
64kƒk+
 

8kƒh+ 

nnnƒ+3 ,
batch_atomƒq+
Nimmutƒp+
8Œ‰•»powersafe_overwritƒo+
†iI
‡zsafe_append)
ƒl2PX
 .‰
“؇equenti)
ƒmOnX
 Xundeletable_when_openƒn+

,tl‚›;éVerr‡s;@J„>  …p1ˆNƒ,     ƒH?Z^Z/4.]—µ9ŽZ^Z/4.]_access;‚:
„k’9—µj‘uth; ‚E„n“v—µm
’n
begin_atom;!‚„q—µlock;‚„t—µscheckreservedlock;‚‚
„w’—µv
‘los;‚E„z’(—µy‘
ommit_atom;"‚E„}“}—µ|
“   nvpath;‚E…“G—µ
’Q   rruptf;%‚…—µdata;$‚E…”ƒ0ƒ5—µ
“,‡eelet;‚…     —µe_no;‚…—µir_clos;‚…—µfsync;  ‚E…B—µ
Ž^fstat;›e…—µ  ync;›HT…Žd—µ
Žgettemppath;‚…—µlock;‚…—µmmap;‚E…!’z—µ 
’%nomem;‚…$—µ#rdlock;
M…'—µead;™\…*—µollback_atom;#‚…-—µ,seek;‚E…0’9—µ/
‘shmlock;‚E…3’,—µ2
‘i
map;‚…6—µ5
open;‚E…9’—µ8
‘F„}:3)/0$\( 4'#5#'"  "$
""ŸV˜€€€y¿0·0ioerr_shms;‚…<—µ;   ort_read„N™H…?—µ>trunc;
š{T…Bn—µA
:unlock;[…E—µDvnod;‚…H—µGwrit;šM…K—µJxxxWƒ_
ff~ë<


¾`Š


setK#)$\"
st‚,˜/B
t‚e&rac‚²<ùˆpw$«2
†‡N œ#
ƒuagy‡*—6‚tc‚ƒJƒB£,†…hon‚.ƒ.†
z
'“š?ras~.á`+‚\
‚ƒEzG£!1#¾X,?+‚\
‚ƒEzG¾=ŒL!1#k‹ˆ}hÄ\

'Å"ƒ$†¬T   

'od‚.ƒ.row?
4id‚Sžg…     ”Õu…      relev‚•–×7Iparƒ‚;lacƒ©-—ëƒ^vers™C‹›o
ƒc/µ†ã}/oc‚‘!s$!
-I        6rM?*


U^&  68'Uk;
@-Z'#J
Q'!`'-##5='2(0             "
       ^R
XHCp-
H)A
:E`?V"%
        K             Y1F
2K-y|‚A
7
04D4
]:&6#5.5vK1g    
#(
5
6PP&
E  y  
a]#1U]
$5'+)
        
:R'',?   
D
:<
&e
     #"KA1rP . +
O/^
9Uc d!:<E! /1%a,(
‚`
9i!


#"'
0('?9
"
(E)    L58^$&;,H

 %%Hd$=%"fQb$u+D(L:e
8


      !
<
7 f‚#(B:;a-3*$62#
E%Y2>!B$
1  %yY L%
,[L
#
  
8J0>$
#?F%, H
3       G
#
?)J0
kn‚NL&01s0K<.
aA     "K)9-.)+ - B" '@ J?>K%$|      :L9.)xE[",,?L
#  ;
6'IQ^
;i1=hYY]f);];91E":-<= 
="   
(^)?#>
  0X'/'^(&  
 

-+dT?
;<KH;W1,
N8~xvDgJ&P

j‚Pz
*8;X(


,jX    #]0
0        2.
H"9(")    .
)7./3



‚;"9'[1
5O'>5i
K*4#E\D -24=&*,          "/,H(   )6

 T
D
 (a J R3N    ,
:2
-b-H&+"(/!=O$
>
#
$<=



     
  /a2
"+-1l*;V<*

     
        *S

(     P      %
x    %,
   Q
#.80                      
4
%6
)B+@-
<       M
                       ;.)        $a

8I*0="!;(7)
<
$      ((
-$X
i
(H    5      

:c
I%
1  2      >      
+E

A? p" *

             +

-
@1:!
 N&-'2
`C7%1
 
#$  C!&( 30 
%%
"

     Q=MFC
\D/8
!J'$\82^J'

    8

@3     
+       @<8
&N"    !9*

&(          3I
N,
/1$QRH?*
<      +S. ,
+
#
           +\
JRE!
2Y             1 7    /,


,ZD.
]K,*"
        &                   >  +

(      #= %&/&H
(
!#    ?
">j    'K;
!

p5(W("#&?
 B5%%     5i9$,E.C%*%@-     #S
b V!!

        .R
>d@=     ED"    5
"-#/W(
"]      /%
'* ";L8''I'  +3+"


$
g,7z#
-=>a6%

 5
5Y
,
T'        
!
I)  A*j
8<
+/h8[3
!T"!wY#


             &

"
!
N()   , (S8
0
""ŸV˜€€€z¿0*Ò+q=H&#%1#

         
CV

G);"[

.&>(*
":
%$ Y  
b
"'
'<IM mX (''$
(hGN B      
((*<     /
PG.
>2
?
 =J"8 
P/     11
&2'*
+%)
        8&$v
'4K0[%               %3 D-/#     
f&

8X_>+
!(3L<       " %$

(
3w
       ,       CP!b~W4"
n
C2
E/  "$0
      1/

#6 
M-  "3,
*M&*0y0G'
/  
      
 
 
      .       
      /6
*P
 
,0.G
V(<         -I        

-L!#*.@      E
Sl
 1C<'=C
)>             ,O 


       
3  UOI@O2WE8)-(_F(.%

    $Kh1Y.W 
?\V6_3147 ,

(("?,("mGf6]~%
$f
!
      EE!\\
      )Q7=        /"
k(,m^6

e
yN '[%      ##
1
0B>7#M"#*DL

>1Anl
/!]|%.
,

.
&y.I!S'E><
       :C&
;%‚
*d6l6
85‚S
V3/8ƒX2  I
              +$        )W*3#G    0B%F&r
+
‚`

#
!"
$*       BV
80W$
!

-!+    '      R' 
3 ,&!
<+F( 
D#!

-$14&19 (%  
b2!!+@'T
!-'(=r%3en3:7b."8‚"8A @‚v
;      *  6,d'&#     y|<(_‚H `(.

;!z"5^>s
%#"
!#‡:=9F#`U"D:

yF=:9b+        ƒr*   #s6:A!%Y
R M %#[+/0BI)$-+qNS"A
d2(/2,#%‚n\
'G/
‚r12x}
F$/$
Mh    
 @# 
I/6
!!
+9;kV&
M
P%
.B- 

o4CIFvJO
I‚0" 1
pBv-5=%      'I<9^11a+‚*H_6I=9 H)DQ*H 
KA%<6$,C]B B4F?!('(M.!-%B0ZI9[;-Ii    (
4L   (+X
0=
'      +
%)/i6       (43KGU'

".+"}x4)j]B9z+'X_ d

"c
#

"%%
N'7=@$
`H0'2J`&[k
I.PKg&l2 aŒ@'
;
?K9%;?)  44D3 /Rˆ@
5
      &
%            S).<
-
f     

F    
,'
7M
)J9!     +$
        
/
       .    
4a;(
    )F'?*         
      0#/
=%
Q*).1- 

:!33%

       ,      )
 !
      89
   
3
      M      !
                      Z
!
P
(
Q$E%$#)+):)
#
,!8U
%A     
       
U7       ' 76%%:
 &-
&
J   
#
'!3%6>

TS

0
! ,+            ">3)
e
6<-)
2#4-)
/,uN
&&

        U      ];     

D$M5        L49>,
              5
!
%           



       +.7;3    
&*     
3B5L
-

0J<0f2*z.,F2@,
Z
m
t'.=             :M3
525oQ=;F0)

m'gq+
AC[@&8xNY       J
!PX/‡#tT‚LQ/9+0!U!P*Ta,,+Eyp PZ6S*3>;4U!
/.k$)‚A%G <DeMASoy>     <$/Mm!&$#ZC
Y      1!<j*     
&"D6I
‚
M"#+ &"MB336+
F/D<)!"#
      :S
 
GH

       ;I32HeEL75
=+&
5C)-)
"D(?&.,V'
f(
       
      ,+$/ d/+T*
'N."' :6/-        
2‚4!1>"9^ f707
.n(f):}EE(oI>";)/)'!O(Ey‚')Z%+zLG"A;
l`p#6"u/ p69

t@
TD-d9    
       eE     
0
B


^/8{4
,+e?e
$
N-{=LL7/+_       
(G<?xMm ,*
K

D4R1&`LA
G`)
‚4% Ou"d($l s>&_.'"k#)--,
M
A&9J -~ƒD)2P1H=.$
$%-CJ)
y1B
$/(7>*)C

?H
+_"J*bJLZ4*!Hi0
""ŸV˜€€€{¿0Ò Nq~8
‚>
+="cLw†z1b'ƒƒ:s
,$+B
O¬)'x#0&Q<2((*%)n?#M!B^# *{$?KB‚<()       ‚V o        AbMyHG51( 3        6,D,        <$L6)y      5M8)S_39@
{       'Z)JMEf3)#Gc0J5F%l) Z#‚a…DIR%W&;q K"4C*

""
                =
217!j)   &
.    H.*#+%#2-I!7'!

R\
6C!?     %N
8Y";V(M%*
#& )h!?
cI
CB4#
TW<J'
Bi":{V."gF*21(Bga-0##{.0n
     q)   3,#    D/'-=;        }%<9'G!O4 
'6H+GOVJ1
,@4‚z

9"#.zQ      [    w2C1/0USr(.s@
@        k)
'Y1T-G  FM!!wJ%  'd

0    I
%
)2p@0)K
%5pD ,v‚//     --
1F ‚$E]$Us-"` :s >9%a;r3   ]"-'
        6

7
2T!=i=U*D#'W%R.
/.2 '
,o            '5c.!&)     M
*\
k=N!=L

.
")@
      P3\&
C$$U S3$pH. +x5  
#KA*&   F     8
B‚
$0J26

0#H       X$+D">N-'!Z*1*Y'&JH9I
(0b#!^~X8    c!…dsA
$PD'
[

a!V@   
"!+
""   6d
bI~        !4)*        t5X,.=
V,6[ 

O
39046)1M^&    G:
        !ro      %        7!,3$:'19/
     7-f6      %2
%


9!   !ƒ!9&w>$
9. %t69#I 2H !
6T
>;-9dH
6#PP#".L+|/#W       7JA0
+O~h9^!*$0$yNL%,H‚9"''P[)O
":&
0p^[6: .iK,   3R        ?j71i8+'E   ‚N)4UR^?2-CCAI

9BU"U


)#("A
"2)\A
^>  5V!/F 
       k.
-&      P"!MM
>y
6X1o(6pu

        
,L"E:049O%R*",3Ph,3Phkb/!7<   @`IU6

       
*.*$0! 79:$4:Jq
‚[h']‚?
t
`
k&+D,4J%)5221";
T *;    ."
P1:!-Y\''@%A
(
I:<    

K0Df _<~/g&3# I4<        6;f(#$\":IQ48D.%G#.HJ I$0:*]I
HV

3g(d?"@"/2" 
D       $(lt5
      9
L"E[".Neu)
        %8'# BRl&D       
x{Igz#0K&^B@#

.IlW7P;+86K_&]%,5; (-(f(7>%BA'a!%L=*8I
GC*>&8#,m5
5H$('#  !#|-Am (d\L'
@     EE 24:
        
N-IDDA(;‚y);aX#6t0-*     (;*#=#/*,-

A$       ..             ^na
)'     `JtI -%){
)#,p(&5)-UB"
L$„h'8$
C<z:,S/
%            2
!9'jk 526
1 Jj?

a"      +89T7=R674?'%E
   $a*
5     05$$,p17"0
'/0
!9
" #0< L /':
'I/&$l2".        !=v.8     +.
0V?`^L
p,OI(
D= =;+0/+   D9j'>K*NC pd
>.  75c<(""S98e,9#Fc5
%g!    

=
Y
‚55QE'2X)]
p     5<*' 
e%#R!& Dn8       nK
l

QD!B
"M+/'+E#               Sj-!Z2  U=
 =^w0
7&ƒb.
% -   ,
sP9G4
C%

$'.
&"PV
0""k‚$*I">

     $
MZS=_S$*

($
4 1\ _jd3]

[$t,Q<
^.W'^@‚%
HY" Q
!Q&<J$z-)J
3E#

        9 Et‚<3G
+7$MB2%"'
0)Ha38Ch$g    AALV#=
E)`<
,%ZUJ4X -W3‚
4Rqf,""        |+F&N94*/D      '2   )"E‚6 
`S=,$@'


1


‚I0z,!"CZXg)…l O=4H"8J"#3-m,xO(Dp
^
@(5
B
!
&.D<$%


:7
\%%D
K&+#[!:|%LV).:]#14%-m:>6$E/Bb&        Q#Fr-C        *=I$
U%1j.$#"'.,
2u      
%B
 ':"19V
""ŸV˜€€€|¿0’Òk(!%3<Jc8V/="!:DjB/=#fDVL?L9I
        ;
H/V)*Y16>^0^;7LUA&      Z!R04g3@

W‚W~)!q'1$ .9I &;2(" 55(C
^.#,7#8"N
Q>$L

=Q_!‚")9C%`\@9       R:X#$OrPF FU7Td
      $&V'"|f!>8
      2"'Bn$A7
*1%0‚!    tjA)R%b<(-!D*?H+ 

      E>J
   (
3'
52R/%!eG/!ui$aT6%`- B&D%`1k'     /‚C^
$7):         
S    &3 )6%4b=(
5,#3
      

tD&  
gQ 
/
&7tN
V6=:7MVg
!' 4zPS.?$8 "@:|18fk.     6            A$t

*        
#@#  !
)>@*

1)3'$c
J
- 
`8C_$-
r

&p"Ho7"3"
vK"%WI4/#       " )w     rA           c}mD9             1:5‚,
-&.@0<!){&
II?%=&`&-49&";d
\("I6
               #5g        
'
ZXJ)S+zPn
@
>i
G
9       
>U3/1)?(R‚B]M@1)XD"Y]+
("V*    +$Fs
%|`F
@>1/#6!4#%o-)
;I‚
6A*#RQ<  @02
%
dn3C0-~E22-`K8
B$>9NT
E
v
02D >`"ƒ::X
)&
; 07:\1-0?39P9
'
%p!^"g    *

7'


!&&
"-O)!      QZ2{#+0&N6: 752R
6)+(]
‚Bj%‚J)
P
v
z)
;(xA*=P.+R
&\W/
Q&_N|@$*,
>
) 2IZ       "$;UA„<\q$0
D7@10+*-`lS

#3~R:H
:NN?$\
Ie+( (BG;1wLp$     V
9

1=j
 o
7     d
FH      M1y
($"<36              #
A

 S+&)'&*       Z+S)#J4B:)6KH`-
.)6
:+
y@Z -K        "Y/]]2B    ;   *.&
*:R,45G.N.
$
e>dY
=6"        6‚Ag   N]/6:U
+
$:4*'
0#     P‚[/!3.&$/4B#
?&(1$rm~E"     % "QV8&
qj3; &9*.(n
/=-

I(+%Y,NY
        
#"P6P')r"4{=
6 ~L00A‚     E
&
>' H=
)$"VJT+{^I-@
Z‚M=X!;(I&8/-6<=q  x-c.<TX#  
            :,
 Z}     .       H%      >='‚†b!
G d
x"O
)!@v"%@%FA*X&      '       

05)                   -)C
#'/

'a!1!0'
E
'Q
       I2t
#'_:&g

/:-1R!
- l
.*@"-F
#*-#)I-4#R.
#a(
5#@D  cE %`W~3E
*& 
GI6"0$%
F@'#/
*      D
 
3
J    ‚%
        
 J"g&'+'-
I3E-
,+'  
1%C'& N3h0r         $(%C ]N0=4(xEk‚Q;t9#ƒ$9-A              
)0+
8 
#  5&4,V H9
6

%
D3(2#

<o?%%=!1#8&Qkm1rE9<40
 ?AO 
6<0`,
       &G.+QB>=O

        >2+S!$#'"[
4
B
}‚,MyhQ?8Š8%\ 5L!j>/'=uS+2 ZazM !>B&YWH8n\#"%TN*$:
$QJ7
=)"*+
^TsDFK2%

        I3,        /1jvPIR0<+"
        76/…2#5R       JMm‡5

((+$.;A
        9L#ƒ(,C5†o
‚8G
T`'Px.'„` )g   c *
4„Z?3@'WH1"n[    7
 
.T%-- 0%8(&a 
UhRƒ(‹B"uAJ(%Š:{     ].-Šq  %     !!%       ,, !,
<(
“JuŽC.

+Z
#.8     
Ž%B'%]


2; ':8/ƒC_i';  ($ 3'

(l -<%
(AJ"
#'%+.#J     1mO8j:00      ;APQ;&w>
-Mj               


                   
                '"
                     *               
N5

       

"       i4    ?Ib"ƒh0xV
„OQ6O=B>C/
;  !s$R  (R2L$0}

J             @ S
JB‚Y4        /2
$‚
h0&!$"f5;#'67 ~H,9  
nC.w‚4P_Iv
(
X3\6‚#=5Ey %
4‚h2c
k#K.I)
D=$1

rl[1NU

-ƒ eh
tL+
&eaoER /*   
{‚rGI)((`

5
""ŸV˜€€€}¿0«Ò;K

930@     D!6&7''#"E
/*   -5)+
        
   (8h

"‚ 82F%gMDAH
+            Q_   #F& Ij+
7J%
 .i N{%+%        4$†&"~!eg!Q‚o%
N2>%P5
+


%*0rk4(p
!f/!  #-6  '/f"J$  HZ6-(1    !
$/#R>
0        "!1l)gA
E
f

|Q&FKZM_<




M'!W6F,*A( 0C2*>4g
19F:J^/6*!
    66(7]7=       '#   

=?+)-d
 )x
   5Uf(Fv*,(f""=K7($*k55$NT~OS*X9W      /
<       ')9
4EbPX*"W5Hs)Kq(}5]$
V4mF!2/$a cD^.]ƒo94#<T#AL+1‚;% ;TK:"5‚B
cH!V*H05"  1H!!'-&m>0I2
D0>     C;\*D‚%S917'
K
LVP"m1M<'D
"HETC 3

     9)I:
E=
u   UC‚',E%*03‚Mh"^‚3
E V,
.(
     C86         4   M)6 ZŽös
1Y.W 
?0!C_3147 "#

(("?,("m
')
~%
$_
"
      EE!\\
   )Q7"    /"
k(,m‡Y 4

e
y4 '4N%      ##
1
08>7#M"#*DL

>+A
/nd
/!]&F%.
,

.

y‡_$G!8'E‡g$<
       :C&
%w*d‡f    

‚
3/8J
*
!!+@'T
!-'(.=r%en3:'b*H8       @6k
;   *  6,d'
&# |
(_U(.

;_!4"5^q>4
%#"
}!#‡U=9F#`U"
,/


F
:9
m+    *        #s6:!% Q
R M %#[
+0BI)-NS" #
d2(/f2,#%u(I
'G/
2x
F/$
Mh      
  
I/* 
!!
+9'k&

G@"
.B- 

o4 {CIFvJO
In4" 1
pBv-5=%  'I<9^1 1a+‚*H6I=9   )"Q*H 
KA<6$,]
 BR4F?!('(M.!-%B0ZI9[;-3i  

48      (X

  
        +
%)/i‡)(43KGU


"!+"} V4)j]Bz+'X_
d 

"c
#0/

"%%
N'7=‡_
`H)'
|AZ

IF
$


      89%;Q)      44:3
/5ˆ@
5‹dw       &
%            S).<
-
f     

F    
,'
7M
)J9!     +$
        
/
       .    
4a;(
    )F'?*         
      0#/
=%
Q*).1- 

:!33%

       ,      )
 !
      89
   
3
      M      !
                      Z
!
P
(
Q$E%$#)+):)
#
,!8U
%A     
       
U7       ' 76%%:
 &-
&
J   
#
'!3%6>

TS

0
! ,+            ">3)
e
6<-)
2#4-)
/,uN
&&

        U      ];     

D$M5        L49>,
              5
!
%           



       +.7;3    
&*     
3B5L
-

0G%=          
/M,
5
25Q)F)

m'g"+
A
 @‡Y
5nNY   J
!4X‡"tEkQ/90!U]!P*Ta&,+Eyp PJZ64*3>.  4U!
/.k$)‚A%Gi <DeMA&o%>     <$/2m!&$#0C
Y      1!<j*     
&"N6I
‚
M"#+ &"MB336+
*E/D<)!"$
      :S
 
=H

       ;Y30HeEL75
=+
5C)-)
"J(],=,
f$
       
      ,+$/ d/D+T*
'N."' :6 '-    
2
!1>"<+ f70
""ŸV˜€€€~¿0Ò7
.n(ÿf)}EE(o>";/)'!<(Ey‚')Z%+zLG"A;
‡@
7#"P/ !9


@
D-z9     
       ]E  
0




/P4
&7?e
$
V‡R
-b=:L*/+_    
(G</—!
A
&+J -®m
2¬)'x#0&Q<2((*%)‡f
?#!B^# .5$Gi(    ‚ o    :
_9@
{       '‡f)JM!f3)#

c      0J5Fz)Zp‡]G,4%W&;q K"4@*

""
                =
2.-17!j)       &
.    H.*#+%#2-I!7'!

R\
6C!?     %N
8Y";V(:>*
#& )h!?
c(

CB4#
TW<J'
Bi":{V."gF*21(Bga-0##{.0n
     )      3,#    D/'-=;        }%<9'G!O4 
'6H+G3V,*'
,@4E$
9"#.-      [    @2C1&0US!k6s@
+       k)
'1-G      F0!!w%     '*

0    I"
%
)2@K
% v?A/       -
1‡C o‡fB]$s-" ]    :s 9%P;b=3 ]"-'
        6

7
2T!=i‡cP*‡#
W%.
/.2 '
,o               '     c‡d!&)     
*‡e

I=D  !0L

 ")-
     3'&
Ÿb!^
3X§H
6#P#".+/
#E      7JA‡a
+~h9^¶Si\/7N
     @`20U6

       
*.*$‡g!        9$—5
,       J% 5
21 
;
T *;‡b 
P1:!-$\'‡f
%A
(
:<        


*0d‡c
P$/g&3#" I4< 6;f#$\"F—1HG$0:]I
Jq5
       
L"E["
.9u)
        %8+# BRlŸ
5y)
(a‡f#6t-* (

*#
#/*,-

 3$     ..             ^nZ
)' `JWI %){e
)#!(&5UB"W
 $‡W
'8$
T<z:,S/
%            2
!9'j 526
1J+?

2        +9T$674?'      %E
    $*
! 05$
A
"0
'/0


" 
0<      
 /'2
'I/&$l".    !=.8 +.
0V`*L
p   O"(
D= =;+0

        D
s9<'>K*N
 pžq

Q')‡f)]

      p       .<*,'        
$%#
!I5&.‡d
%-       ,
PO

C



!

0"V
0"‡UDX‡f*">

     $®o,Q

^.W^{9
HY>" Q
!Q&J$z-kK
3E$

        9 Et0}3G
+7$0B        %+'
0)‡UFa3#
$        AAL"!#=
)`<
,%ZU4X -3‡]4Rqf,""       +FLN96*/D           '2   "ECN+
`S=,$@'


1


‚I0(,!"CZXg)F)!'

\$ 
      9I &
2(
5

.,#
%" 
%>$‡S

7_!(")9C
@
""ŸV˜€€€¿0Ò9       ”ÿD:H!"8
      2"'.n$A
*1%)!    J   C00$7):          
S    &   )6%4b=(5,#
 

3D&      
&*Q      
/
&7\N
6=7M‡\A
!' 4P
S.8{8 "@:|18fkH*    
#"#      !
)>@(

1)3',$c
J
- 
‡e3_$"
r


&""HU7"3"
—3-&.
0<!)
c       &
II?%=` &-  49&""
d
\(":6
               #g    
'
*X<)S+zPn
@
>i
GA
9       
>D3q/1)?(R‡ZA:cM@1)XD"Y]+
("V*        +&Fs
%|`F

>1,/#6!4#%@P-)
;I‚
6A*#R*3<      @02
%
dn3I2-`
6

,$>NG
E
v
02 
'
"‡8"
)&
; 07\1-0     3 2P9
'
%pHx^"g *

7'


!&&
"$O)!  QZ2{#+#&N0: 752R
6)+M

j5)
P

t

W)
,(xA*=P.+I
&\2/
Q&'|@$*,>W)> 2I    "$;8A‡N\$0
D@0*-`l:?8

#3~R:H
:N?
I+( (BG$v;1wLp$    VD 
9

1=j
 o
7     >:
FH      M1
0
$"<36             
&

| G)&
     Z4G)#J4B:)6KH`-
.)6
:+
y
 0  "6/]]‡EB      /       *.
*‡f
R
,45G.N'
$


>d8
=6M~xM]/:U+
$.4*'
0      P‡[
  !
      .&  /4B#
?  &1$
\m~"   %"*ZV8&
qj3; &9*(L
/=-

I(+%Y, Y
        
#"P6P')r‡X2j
6p
~8K+c.HTX#   
            :,
 Q/     .       !%H.!
G d
x"
)! "%@%FA")&    '       

&5#           C
#')

'[!
!('
 
'K4
       2-
#'g

/1-'R!
- 4-
.*@"-F
#
*-#)I-#R.
#(
5#@D?       c! %`W$3%



 
9A06"$%
F&'

*    2:
 
3
J    
        
 F&&'+''

I!))
(
+*     
1%C'& žV!
J'[
4
‡f
}MyhQ?8‡T%] 5
!‡a>/'BuS2  W
zM!>        &W(8#"%‡\N*${:
$QJ7
='"*+
^TD—<(*+"
    76O4
9*C_i';    ($ 3'

(l -<%
(AJ"
#'%+.#‡b  mE!j: 0      5A‡cO2&w>0-MV#              


                   
                '"
                     *               
N$,

       

"   i%        ?Ib"‡_e05V
ƒ@Q
O=>4/
;  !s$R    (2L$0}

9          @xS
J
/4!    /2
$vU4&$"/5#'67 QH9    
nC
w:Q?
(
X36‚#=5 %
"‚'2c

:#—
j1N9

ƒ eh
cL+
&eoER /*u        
‡F)((<

5;K

930@       D!6&7'
0#E
/       $-5)+9     


""ŸV˜€€€‚¿0¹    (—îgh

"‚82F%'MD*H
+          QV       #& I,M+
7J%
 .i N
7%+‡S
%       4'‡        "q!eg!
%
I
=2/P
+

&
%0r(

!
#!  -8S6  '/f"J$  HZ6-(1    !
$/#R>
0        "!1l)gA
E
f

|

u&FK),A_<




M'!6F,*A
 0C*>{8
1F:J^0/6*!
 667
D7&   '#   

(?+)-d
)x       5UfFv*,(f("=K7($*k5$/T~O*9    /
&   ')9
4)Kq(}]$

H4F!     /$a   D^J+
% T%"5B
:H!V
(*#05  1H!!'m
Ik8
0>  
;
A*S917‡

LM'D
"HETCN
E
u   —7
E       0is_index‚Ò²=     team_lead„i%
Œ;_%
canstatusop?init‚‰Y–°leaf‚‡>£… n‚!=#‘‹Jƒ9‚˜@ÁU†1“™an‚ˆ     ›Pù]
ul  „1Å\}
ëVܱo
Zƒ|•v†L‡       ŽÿdÚ^„¢r8601„¶O*859‚ŠMd£y4l‚5%‚- „M,uL5Pƒ
XŠYÃv‚j¨lÌy|g…æ‚e¤7

£Ž2scel‚‚V”—-pƒK‡Prim‚bŠX'''.5'''''''''GN''''''''C'''''''oZ7>'''''&&£qb‡dX'''.5'''''''''GN''''''''C'''''''oZ7>'''''&&sav‚  ƒ,2Eul+ƒ.ˆ^„R&Ž8l        ¨}¢hÇ_ˆ$X
ƒ0"cƒ*
xæk  Ž&‰:ÁA‰‡6‘/‚(g‰C‚ ‡ 
Ç…G7†\‰z ‚u(ˆd„8„%$†n~          ƒ;Y‰O…%!#ƒ!E‡|!†)¬sˆd   /2<ƒ.4‹l#Ž&*ƒq˜b“@˜T‚t=„
ˆXa‚,š‡&¡Ar‰+
'GÀt”…m
Ü
ˆ½
‹Ž÷ƒ%Æ*@îbŸw  ü—†‡6St‚Dd3
 ‚\ÒwUÝ|H¦oE  õH¾‚Ÿ} 
#—ƒŸbÎ'G5ô‚qWÍDt‚4ˆ
-artÑz¾]sru‚Åhݱyp‚Æqݲ#t03
"ƒ/3Yz_W.XJ‚>!„!F
.&]„r‚O_D=ƒ"Gr:‚Xp(5ƒ>4OXd‚J3)3p/0„zrS691._^‚8ƒK
FM‚DB‚@Z:W!xƒgƒƒƒ%5…0)„9‚"vH(Mƒ   ‚Zf      ‚V'ƒb;,‚A1
& <s&Iƒ;5}zbd`#ƒF hq 8/x{‚lB;h#…$ˆ‚X!
ƒ)‚P‚% 2
;X„q„jf>>#Ro
f
.  f
m7U aI„#v…7ƒ^†.
ƒ,?@qQg1!QNtE&        PK
‚)
#&f‚(7%q""'c3oh#B3^r
5Z
!
/†V80
C+<i0/>JMny&3&-P;#2R T=
p,2=
)\$Mp6G5\f
:‚9&Y
.K0E3Iu]T‚/C|ƒj.
 „h
 ƒ?&8&F#)25p
7m‚~WxeE‚-J‚ƒ,VF
P 
0m +5(zƒf
bA*
)>jHXX?‚4Kƒ$G
oGT‚;=b‚$‚S249J D0ƒ1‚
E/])219(f3,J/
ƒM`6%{((4]
)H{Cbb/Kƒ3Lƒ!‚M]C
8‚vƒ   ƒ@*@ƒh&ZJ


x('g‚eg?CLod,.
    $F†‚2+23U=D
"g05vy' knjd4%
[‚E9
JK<#^nK.Zj‚-#V‚Zh„FP1?
U"#3|       AzZ‚;7 <: C[~„$y*‚?‚t‚ ,ƒOZLBTdp„^(]+$‚
Gj5>‚O„S.    ! ef‚I"(QO7z'<0c
 Ze%‚`E‚:ƒ8$mp61"„C‚G%%-2Nƒ?D%$1ƒ$7/Sˆ4!2&3n„U
""ŸV˜€€€‚¿0Ò&e„%MŠJCB8ƒ>~ƒL.„e‚pSL

(/Bt„xfƒ&CƒB"‚<x!/;<3‚&;
†j$T[K‚
‚w9„,G{)‚
<),‚‚`
4
*<b‚m#ƒ2-L‚$!Y>0%†4Oƒ       <[A!8Jaƒ‚(        "‚U‚0=+/O‚e0Mo#
0U‚@;‚X‚R      ƒC‚:
~2Lc‚%‚      „<4‚
U…$-ƒ:2n/2W‚.|.T‚HpY<#d‚R…
2ƒS+ŒH+3\‚A=‚2ƒaU$OX79.)A„Q)           y‚Awp@gtD‚d~M]Rh3MlŠ<5L$‚+Kƒ         @R6|&TQƒ
Rd(GQ&ƒƒ+ bAS^Fz
oƒ+‚90GFP(1:‚WnpbXBL&$C}‚@%w$n-!Rf>uhE_(‚^p
f‚`[†jVA†AQ^#‚ƒ‡Gƒbƒ…|‚X&‚di ƒR„Z„
I†|N
*V‚D
*;‚?!xk‚       N‚?:)RJ^ E(„,#-!1ƒbAFQ
!9‚$l‚!QO    „}AR7‚kT‚C„Id‚CuBƒBRp‚`d8@j†l‚/'
‚6(
L]Hkƒ{)‚IO‚3J‚",pj2
„v,ƒ#‚}6'‚+TDU c cP?M=Y       ƒAr
'Y4#FƒB[o O1%/utB4…ƒd†6‚/  Aie‚Y4†S‚‚„j‚‚G…   ‚‚‚ƒ.‘%2nƒ'Dƒw‚vb‚D6J(4D‚:1#S'/Aƒf]KAJ4+Mƒ J8‚0]VmU ZHwvz>v
       ,       ‚       
9%=Q#‡{LYPu…J„‚?)J@a%#5‚4ƒ*‚‚\}Uƒq4D
‚Q
V';R$„ot)P!…DWp‚.tkr#LV6K;=6G…ph‚
y(z~,AcKU‚‚4‚%ƒmƒEgLƒYT:0
d‚      ƒSb&‚e6„.721‚K9Y‚*6kfU
c:‚_]/k,4;`390I@+lef‚.bD*
.‚#|" :‚/
‚ƒq     b?;<)Y‚ns Rn)‚OM‚4g{ 
d:2P)‚c‚w‚q‚pv8+ID!Hk„‚-        ;j"w‚Il0G‚;^txN=g$@/9820-72‚#
ƒH„‚R
‚+u‚a3QA1q)‚        LƒP„]3Z‚y)I‚8„_‚Jj‚ACCa‚:e1K
?'6F=i     ‚9Z‚%A%"+1=n)%n,8H =…JdDI6Rd3t]gaGI$‚^#‚NB#‚3%U‚3%
R'"ƒ/
>WW@F(&ƒf/)       $        
%x~\bƒ*.;ln*C%PxGU$6{       
*$[.Bƒa     ~‚
S
u2'‚y(pZ7X#N1MKQA
A8 m 
%„N:   :q$ ‚Fr
-8„bA
?   1L>    ‚ƒYF@2
 pƒk@…‚T      ]i‚?E‚#   ‡D‚Od?p
dUj(/(8 S‚,0   GJ
        ˆmp3.*5,!‚)[ƒSg„? z„F‚$'`I‚r!H},VTY!U
QO-H~j
J2
l;T4cdYBra,#BD|‚s.A‚*i0v       k50
''lf‚y‚mF]a      3>/|ƒC;89F‚96(6wO<-&‚ ‚wI7n$„n4G9#H
@tC:#P:‚‚>
z‚oA<[U„L?…=.    
ƒp@   e„ih„-‚t
‚=:>‚EO-‚"
`jUd%G      ‚z:\ƒ4KWEƒ]T‚/"zQ&>‚qM4‚f†EA‚       8
n„
FQxg7?+9ƒƒc?!]A>J„G„-†‚…:p‚AEA(+,„[0-_;bn^(s(PJ,KXe;fV,[‡8ao<K…y‚fAT%‚^KA‚dEd‚KDO-…wgl{„^„‚2)Rn‚ƒ?       Xr$…j(‚!‚LV‚|&        o‚mW†
\4     /r„j‚Cƒ@/)yR8*
`ga
#A,
bn
„LJ‚q„MTxUUqa(N1
!f    r--;&H)dU%*6SS‚P*B*5‚{
<ƒc D‚‚eJ\5‚7U‡"…h‚R+7ƒ6!ƒ$I‚8"#R-m‚>‚s`ƒH@‚<NhyV
i`„zMBb,‚s‚
P*+R@ƒZ†
‚"5ƒ=‚/
u'{t%ƒ7f:aBN\A…;D"5(5(‚lL#
%…$…‚SB)6†Q$„U3  DDƒJB[PaLv5uO4.&**„%~ &wˆ(s‚9!‚t‚C7fƒ
‚'{†!    ,M+‚O‚Y‚BE%L~$   D
i~T[V:{;#‚^„$>p=:p„x f…    Zic…{/gq‚M$1<rƒ;ƒIA]i+b„‚    u-'BB&ƒ;$6I+c&#;:        !m 3fal‚f‚D
^i‚c7%†9 „     ƒg2‚\G
`>
L+o<K‚#Y)eƒ8(tjƒ:D
&


[o‚\aƒ4#42N>3-,&„r:Ug2e4‚R*&H%#?$YL_Tƒa8‚BD…ƒ?&6yN‚3‚…i„09„y †u@T4R]G$c†5n‚Vgu„U‚JajH(ymyƒ~*HlL‚*CKGX0‚3*     „ƒ‚@ {*Hƒ}$‚ 4‚
qZ/|# *&„Gh@<?‚rt61[v1[/‚2    S‚1|‚mV<0+MO"2)S
‚*      cc!$sƒd-"‚t!‚v"$$…KƒHq‚‚
‰.Q+4‚'.ƒ|_Š3~u,[W…|‚&k…
B‚8u‚c     ./\
b' %
MOUo2J;hn’cVŠX6q~‹v ’E•4ži9;Y,‚…FUxƒ4‚6iy…RN   p[!"t*Z‚ƒd‚P+M…Xƒlg…9nK‚„Eg%ƒ1!#;C3‚} psƒ/U(H^#^nCBzR0Pƒ‚‚‚|„
""ŸV˜€€€‚¿0Ò        9†GQ‚ƒ‚?2?*b‚T9|<‚ƒ^„m$6ƒ;L
#?v
ƒS"OB
‚3K8m9y‚IXE„)#‚=*
‚)ƒ3RA4„9%+2 ‚L^„ƒF"B)$‚@Y‰=@   ‡7‹!ƒcƒN†-…Uq‚nHkL(V<‚fŠ7‰F(-r‚Q
        ‚3 Y5&K2yF#c„@ta
.+l<
‚-)zM.‚=7 U7^ikq‚]U0L?S^‚_!0#aG66D*[>‚PMI‚;.fƒ!5xw
(iC"‚$
'ƒj‚U&(/F#~
ƒxS2ŽösI.Z=-#VZh}1&~
:"#3|   A
!Z‚
 v‡YC[~
‚y ‚?i
,+4L‡>d‡n\‡i
]+       
!‚
jK‚H‚h%=
2NI
!$1eU7/S&e(Y3(JC8
‚#>‡VH.„e4'L

J
t
;xk
,       "7u!/'<3;
^$L[K‚
w
G

‚

,C
 


bU#ƒ2-8‚$!Y>0
n% „KOƒ   <[A!Jaƒ "D‚0
%+(‚0Mo#
0U‚@;'*   0‚:
~2‡)_‚%Je4‚
U
ƒ$;‚;P/2W‡`u@!L
q
J+‚@‚*H+3\‚A=‚2ƒaU$OX79.)A„Q)               y‚Awp@gtD‚d~M]Rh3MlŠ<5L$‚+Kƒ         @R6|&TQƒ
Rd(GQ&ƒƒ+ bAS^Fz
oƒ+‚90GFP(1:‚WnG$    C.
+@       $$)!f%>uRE(‡Z~p
*‡KDVA„dQ(#_S‡G‚8x9‚&‚
i ƒR„Z
%
IN
*V6D
*;
     !Lk‚        N‚?:
6
^

 E‚9-!1(ƒ2AFQ
!9flQ
     „_AR
7[k."‚Id‚CuBƒB‡@   
8@?
&'

Q(
L
LW
})‡p
wJ:—oM=®o4‚‚„j‚‚G… ‚‚‚ƒ.‘%‡f
‚D+dK=6+
D       3AJ‡)M‚O(‚01
V[UX‡]FXvz>v
       ,       4
9%=Q# ‡ILYPu…J„\)J@a%#5@Tƒ*‚‚\}Uƒq4D
‚Q
V';R$.‚<t)P!…DWp‚.tkr#2VcK;=6GC?F(z,
1l
EK
C 

GCgLt:0
B|
&‡DL‡g72‚&9$ 6kfU
cK9
5U_‡D/‡
,`9F
+0fŸOg8§'}L

P.‡b)I¶TPO 
V/‡gk
—~P<‚h‡b;ln‡h
C%PxU$6C     
‡e?0       .B
‚h    B‚
S—20'7 #
01KQA
A8K
t$ ‚2r

-!‚NA
?        1L>    ŸQ_,0   
‡f
              Npz.*5,!
[0gSg l‡X"'`$%‚r!H},VTY!U
Q   O-H_-
&2
0;T4Md?Br ,#3F
Q0m      k5
O''JfSn4]a  3>        r;.‚96(-¦Y      G9#1

@ C#&I.  

"@    ‡e<Y[
‚‡:8+O-‡_®qK
CE
1T"zQ&‚qM44ƒ=‚    8
1‡VpO7?+9    Yc??A>‡^

?GZ
‚q#i:p‚AEA(+,H-_;bF
    $#.   .5$'‡UkD<
n

J‚F(5H
<
< K&2\5-7U‡a6+7v!H
B‚"#-L‚>‡f
&]I`
H—3*b=P*$+
/@‚9‚_
b5‚d‚/
u'tLƒ(f:aBF‡Z@„;D"5(5(‚"L#
%…I‚ScB)6oQ$
x3IYJBwDa
<dv&uO4./l‡pg;~ &MsG!‚t
X

""ŸV˜€€€‚¿0¶r7f•ôf
y4
„\[!      ,M+‚)<YOE
L^$    D

6~n‡N
YV
1;#=‚,OCp=:p f„Zi"…{$gq8‚R<2-)mƒIA;i+b
B7‡s-
'#B‡f‚#
G6,
:+cKL
     m 3_l)J;‡ci
c7XSB‚qƒg2&r\G
`>
L+@<K
Y)e‡[o

"L2e$4MR*&H%#?$;h7TH
‚BDZ?&6yV‚/w!Y9; 
@4R]
=%$   
>n|5cs0(-mp6Z@:^>2*¦@]o
|V
\R‡)K2)S

m     cEA!‡a
mƒd-
g!—6
‚<H
(FUxƒ4‚6iy…R‡bL
        pP!

‡d‚B‚P}<b‡`g…a=KI„Eg%!#.C3
+}Bps
$U(%@#F [P
R09t>B|
„_9>G—
`I9E<‚
ƒ$M‡a;L
#?vhƒS"
~B9%8mTy6E
„#O*
c-RA4
6%+‡T
B‡i^=P"B)3$%^@        ‡7
0ƒc‚ii"‚nH*+(V
‚fLa

rX
        I
yF#ta
ZJL
7 67
kqK0L?F^\
_(0
66
67F#<M‡H.5(wPiC"‚$—&/0ital‚°f•òGemsY„>°:Œ[µ</„=$…Qˆƒ…W/ƒE„9‡gPŽJŽÿ
K#¾‚*®‚+œ91/®O5‚™ ƒ'‚,!0/¤cY‡fPid
…?J0r –Q-$l$E"°{/

e5
        8ô3ƒY‘+’n B‹‡L…
~8=Ž5s
br!1C!.B9XGO…ƒ-Œ6%/$‘w#4Ÿlg"„
¥3!½‚k‰`/

e5
        8ž|ßeƒYŸƒg
b‡ƒi„#‚ƒÔd"#4”6…g"œatorint‚%0ƒl(Wmoffset‚Ÿ•ùfyhreshold‚,
¤J self‰k‚rŒVƒ$Y…M‚1Š„#‚@‰YBˆ4“‡kH“„ˆsšBD*•u„.’(+˜`Š‡ªh4‰f”Šj¤L§iˆ@°ˆ\Œ(“9ƒ„p…y’(
‡ƒd‚\‰+‡cŠQÉ4`´@‚$ƒK‡bZ“H¢‹#†'<kŽ;˜ˆ$7„ƒh„xd„@‚
‰K†©2Š{‰†5ƒb˜X†§^ˆc-¢M±b_ˆ/ƒ&(l‚W š7§y—597[Lƒ‡ŽyUz
…e/YÝÃ
‡cƒ …9…Y‚3‚]¼_„“¸]’e2…S‹p)†„8Ž÷[„/‡=L§@‡sYV+
‚W†]S4‰f‡ƒ*—:Nšf§iˆ@°aJ„09j?p{[Œ,"‡d1í‚j‡„oJR‚!?
‚Zíƒ5õ®k!\ƒ‚
wd®B_
{o‚O¾h¾q„    Ÿ—3,ƒY:¾ƒ<‡d+
=
J‡…&‚u9f®o]xlO9]@*6.(L=ž*‡ii‡S}ŸWo‡P&@‚E žƒ5*b
L2‚{1"(un‚.ƒ.>val‚%753ƒ2U3‚U3n‚ˆfersE<:.‡E9Б.ŠPŒ;G‰<‹TL½‚†»h„;Lx86‚
…j‚Q\f?G        Q'7“wÖ-„[ Et
Ž7‘ 
¥d
³W‚<Žþ‚ ý
ƒ „›Ã
Ö‚f»
Wack
‡i‚†!l‚žK•œ]pan‚…tes‚4
Šar‚
…M¬—ÌGMgon‚W”õva‚…IX 5b–â†,“š
 5bƒŽ6mscriptU‚^
`A‚0‰
L)
F
""ŸV˜€€€‚¿0   º‡2E‚–$%…‚.‘˜
‚E… Sn0jean‚)de‚ˆJssica‚„ximƒ‚m—ãm
ob…U™a‚'
1™'
¤Q1ŒQq¨o’!š&‡c«W'Hƒa†!ƒ4ƒ      ¢   œ=‘ˆò     MÕw
1«yrÕp6
§‚        9„‚g‡6$#e‚&hhn‚‡’†min „ „U'
!/<…#uRQ/
2
BB 2


O™q)            
        




(…r‚ZŽ]u‚r‚{ƒ#œeWq= 
Ùy,¶Zäug0!ˆ F#‡G

Ÿ_*†v„†/\ƒdM5Šs<„m>z‘.ƒR
•Lˆ-Œ,4„S-–V…)ƒunšFƒ‰gŒJˆMqp“$+w
]FZ\‚
b„#†e2‚…J„;
znƒ{=F™
$   
 1…e
N4ˆv‚7‚
?ƒ_Q†Q5gJ*<
 (j-    !
)£X„
„
&…        
†w$
†0&²$‚]Ùb&‚rk
×SÜ[
Å+,Ÿ„g…g0!'
6—:†F#Õx
“lƒÜO
4F
M
 —?M%pŸ ƒ$+!¶P!

b #K2s‚J„;
z[ƒX=Ÿ$
$       
 &  
14
N4S9‚
?‚K)
5g
D*<
 ( -      !
)‡…N‚p‡\
&Õ…       ¶Y
ƒne
‡urnal…K…‚6.    
$#4('!
ƒ|- ‚Dp„'
J0‘ƒy
‹8%=pZ#*…
…%‚t*‹$ƒZ8ƒCNO@•U²G:Oq‹s¯u…ht

w
‚tƒ‘b   :^$\9
:2J+90ƒ/'%

)+M   /F@F     4)   
/


       "Y  
        3
6gt
H7    /'E`F%e „u/


(q‚~YV%
       "\'


2‡C!'K        %"-
G‹¸"‘&ƒ%v…-$4

        

M
)'&
8       


       .m
S$~
U 

&fƒ8)1
2d!$$(-
          
        
 ‚u%-APE6 C         ,!Oc‰
/‚-$ˆ5{.n-!
%
#'#
";d-7!-(     '…&“Yƒ$Š'{ŽZ…~“#‘|¥wdB*‚\&„ÕL!G           %!.
c
8P-K7ƒ./P„&"     
2     
‡   %…hI2&JŽö|%=pZ#7
 %t
$åD²G:œ„q‚xkŸ=‚°\  :^

9
7:2J+90G',$


  F@$       4)   
/


       
      
        3
gt*     H7  /'E`F%X j/


n‚%V%
       .!\'


2&     
!'K       %"-
GÂ{
T$$(-
           
        
%-AP6 C            ,!Gc/‚-‡^~U{.ŒL
§(B
%
#'#
";-7!-( '‚KFY¦My¶/®ƒ‡v(>%*‚I&$H!G       %!.
c
8P-K0žp!       
        
\.%‚&
2&_mod!
‚‡7‹W]‚W#;ƒ$ŒTN¨’‡\@5‹
É\ƒ1‹o
†1„g†2ƒI$†a¦/„$œ,Ž8^‘C=àCŽ|
Ž÷

#;„ásx2@5ÂY
w2»†a#„\
Œ‚[K;ˆw;ŸW        
size_limit—M^†b¨'‚YrvŽ÷ 5‚„Z…Þ†bzrmod‚ÈݳIvial
‚zp‚ŠZeg‚ŒG9d&!ƒ: d‚:‘ý‚5…ÎdYQgƒ
 g/—Ì\/r‚d†/šP>•Ú>
„u…pP>s‚
Ž‘˜|
‚eonƒ?Œ’H`ƒG‚T‚d(!$

 
+,?

    
 $#1
(O       




)92
).       ;N
%/H
O+kg‚_!8~    
   !A!_:3)1³"    :
(y5$V…A;   Kƒ6‰p†h¹‰
ƒ
ì,$—12($

 "
&?

(
     $#1

(&  




) 2
).&  ;N
%H
6
G   ‡,Œn‚O
9 
""ŸV˜€€€‚¿0®†h%+
g*
8~    
   !A!:3)1ˆy‹d§8‚÷$Võ‚í4Òw
†h!
¾]¶U
‚
0json1‚‚Bˆh‰HOZ‰ó#O@ <@ˆ‡X2‚C„RA_arrai‚.+…|‚-.‰s„R)
3.Fs
y_length‚.‰\D            
        
„,
D               
        
each‚
„8)(i›l   2'‚16
Cƒì)—g2'‚.6
…õ‚È
‚xtract‚>3Šjp

$
“L„R14p

$


‚(group_arrai‚^›G       „R\object‚`›G„R^insert‚:F Z      „R8
F     Z      object‚2>…%

‚n‰B}0R„R<h%

JH0Rpatch‚A•y,0
„R?,0
quot‚V‚E˜J„RTTremov‚&D–,7#
„RB6"7#
plac‚G‚„RE
‚set‚$K„Œ‚+‚„RI!  ‚+4tre‚
„2,n›i
87-KEē
—l8  6-K…õ  ‚È
‚yp‚*O™

„M(

valid‚T‚E…“
†„RRRh
udgz82V‚Gƒ.ž
•Ò†/ement‚„3”õLiciFŒ9Dggl‚Š'liƒ¦—ëe3an*`]‚g]‚EQ G)ƒ)
ˆ0„†k—!‡µt5¤  8„¢rdai*Q '„‚Bƒ?>o
ˆU#Ír£f
†7#Õ‰-mp¡e
‚ƒ…     ‘W‡%bƒ‡&x;?IB'       XGaA‚C<#"b$ -+<'#A'ƒQ^RAOBƒ3pF(]F>{JƒGˆbl:‡;ƒV#ƒ>#6g@Nƒ/+$<ƒ&^ˆl\‚e£‚   §ˆO‡
”Hb„ˆ5™+‚z)‡$i‹*k!ƒm       "70!V”*¨½V~”U.>’T@Ž÷\å+       ‚†‡%bƒ‡&x;?IB'  XGaA‚C<#"b$ -+<'#A'ƒQ^RAOBƒ3pF(]F>{JƒGˆbl:‡;ƒV#ƒ>#6g@Nƒ/+$<ƒ&^ˆl\‚eŸAŒh‚   Œ@8„ðja„jlÎ„}@ifnul‚
Ê:ÝX
µln‚qŒJction‚
Š8k‚švrisdict‚Ž,Š1*
ƒ3st
~ƒ
_‡„.†LyŸb…T†…S
fƒ…Kr„  ˆ„fˆ‘&&c]7† ‡G~=
‚…p       ˆ
Žg%‰M
‰?"
ƒS&ˆQ’2,|ƒW‚ …$‚›S©Z RŒdŠibƒy,†?ŽQžM…Vž,•~Œ`d?ˆ†=‚19‚r00ƒ‚\„c@‰V°®K¤fƒk‚q„X—+‚A„A…t.Šu°@ƒO‰7H‚P‚b‡šX@uŸM‰`…ƒrY‚+‚…4„tv‰D…e„…‚"‹{†}7Xƒ4‹L†0„E† >„Fž‚-~j 
Š> ‡/w'
-/0–rH‚%‡3‡5
\„0Š+„‚]‡DX‡r†K
‰^¨\…5U¨sUrQ
Z‹ˆa‚y„PFŠŽVœ‡<ƒG,‚Š^„y‡‚h‚J?…mƒ0ƒO›V¢'D“‡S›$`‘‹1„ˆH/y‚]J‚•pˆN=:2†‚GO„*‚:„‚-„
&>ƒ.„~˜g†"”z(‡=uƒ\‘Ž„a‹QP„9Œ?ƒ_0¥dŠt6ŽA„p„&_j‚i“˜|‡XŠ2*…9Ebc.…tƒPp“†y„q•j”a†c]°="B4ƒT†‚<X‰‚9ƒ‚Qwƒ†D
X&®q,‡… )(‚‚
‚…<‡‡d]QA$>žM…Vž,•~Œ`H%?        Cqh9‡Y6t
%0‡g
|‚I  @& )
‚qƒƒk‚q‡w,+‡h—7+®®u‡h    —.e}‡c      Žn@‚iˆ+‚$~¾=§
‡‚sí-ƒ">Î
 3C'
‡co
0Ef¦k

ÕwF‡&—G
`Q‡SX     ‚Z‡b®k^‚h‚J?R
‚U0g‡`n„1‡k
‚F/‡#`P‡‡jLtQ
!J        
‡r*"‡Zz,Ÿ>ƒ.E 
IS7¦Fp‡N<    t®dO‡9
…=bq.               W92Ÿ  OXI
]~&@b{<A—6§uifi‚«'•>OˆA‹ZV‚2
‘(‘ˆY}‚Àwƒûl
.V1BN2iZ% 0P-/<(<n:9&P:ƒ9
Ž
""ŸV˜€€€‚¿0Å—Ç
‡ƒ0jwaight‚…k„

,,.“U‚öV˜>”&
ÏXÖ.„[!3),‚[Õw‚:œ„ Š
ˆc!‘.‚
Ž8x†
†cN›-)P‰I…/ƒ/a?¢‰.   ‚@Žþ~¾l   
‡5ƒK
—»
Ÿ!3),õ^‡‘2ÝZ<ú
S
f
‚_
q‡c
Ö>³j‚—L0s)P‰I…/ƒ/a?
‚X        1vŠF96O‰´_ŽÿvB96O
E`¾2v‹6V‚D@3†&“oŽÿ2V‚D@3M†Ó‚aren‚†n‚ƒ+eanƒ7Žÿƒ5akƒŽÿƒenƒ8…vŽÿƒ6†ë„
pZ£o
Šw‘'rU'Š0
‹c‚t`F˜Œx©}©fZ11‰†3=ÝO<Œ„s„N„0„yƒ38h?†
’4†aœz‰F‡H
ltŒƒ
    ‰V‚<‚E¡<œ#’]
ž‰
œ8wƒ<Š>†‹fŽ#ƒxGƒŠ
w†Š8-=Œ:„G†4‘(†2‡“i†0ƒ8%Î‰ƒc…:Žö}‚t‡ƒ\§
‚r—‚*Ÿ•Z11M%‡b:‡|…P}`¦‚Îf?&—@qL/a‚k‚°cDý!Ÿc®hDm®)#ˆ;
G‚h¶P3ü®‹¶‚3‚)8%a|ŸK—1si6sP,‚)I>‡)
{\kƒ)ƒ_


%%=ƒ5I
/.        ,K    
/A 
4
mZK†3‚KN)Œevƒ<‚`6gB+‚G6‚9Y
_n3$
–)   ry
/
3c$a„~+‚-‚…C‚%9†„-R‚P!
‚T„?…S‹;‚lŸK)§=Ì>!).$%‚Q…#                ƒ
!P.1eJ`D81‚V
%‚h,2I=+>Eƒr4 *C‚!UwT°,
0>„til$J„       ^‰/ƒ
ed3fj†T†}‹e2ƒx#w"@Z@i<‡rmƒ&n4+ÉvHƒ¥tel‚4e†‚SŒwS[L‚}Qƒ
†f…lK’g®}e>{,‚]„x 
2
ˆ
‚]"ˆ`9*") ¹-†M„;qˆ/m‚{…S…ZL,\6
+
     
Z
†k|ŒN
,„W:ƒ    ‚;‚$!‚_‡0ˆ::8ƒO    !G‚B)%
.%?0.D†CO:‚3‚SL„(4$Š%‚1'a\&b{‡X4

`+P‚ƒE^K%.

!A<3
     1#  ("‚>K‚
ƒ@™‚+‚2&‚Of3…ƒ’kg…'‚    —D
}‚ƒ{ƒg
6vƒ=&>$C      W.‚S\#‚1ƒ+†~rƒ+0l

Hƒ        `)(8J479‡u‚Ei=²&w‚/
‡X†9•@
†V

9    U„(–oƒd
 @]Oaa!3]I2)      %
      )
 ?*
#8"
4

        
2
X
:#!    (('3
     
P3J*'
5.-
e@':%n
      4C   *+ ++#1
!”&”9ˆ*”ŒL,†i

C*™Cl†‘WJ!
]‚r@,
r†uX%K1c"„B†U‚%…,…>5…
N–&…*-ƒK(!!K„A        s2.gJz¤*PƒJ‚"‚ ŽSŒT           .

‚J<w‚A
‚90‘,‚”t‚    ‘2„+4„M\“#$?8‚W”%/+‹y-1O‹[V‘=$ µl+etAp}“vj$‚R“^Ÿi‹XYkƒ?‰9ršA       /
%R
C
‚<"„
…IMŠn „‚qU

4
2
 ##. 


M'C 6A
‚6SdF†&N='  
(8J'3&‚8%f„89‹h‚cŽþ].,R‚P!
‡fY‡hEy‡g95A9‡U
~)>!).%V#                  ƒ
!P.1e‡041
2
%$,2IS+>Eƒr4 C‚!U—;T›I,
0>„til$J„       ^‰/ƒ
ed3fj†T†}‹e2ƒx#w"@Z@i<‡rmJ
@nRK Hƒ@el‚4e!‚S‡v‡Sz[L‚4‡SxZ—9ƒNK®o-2e>{‡hL 
2
a

;9*)Qƒ„-†M„;—2b§ 
K+Ÿ,'§/¾A®p
V


'+P)j‡fI
!.
7
n
!A<&
     1#  ("‚>1Î

v3Jh
I‡XƒE‚        V¦x
{‚Õz
*\#74rP
,

‡Y<        Q)(8Jm47)9(‡‚@—>ƒ
‡ƒ02
!
""ŸV˜€€€‚¿0£\•¾%

9    —‚‡_

 L@]Oaa!3]I2)   %
()
 ?p
#8"
4

        
2
X
:#!(F('3
     
P3Jr*'
5.-
e@':%n
      BC    *+ ++#,#
!R‡dE
‚           e
ƒ0,

LC‡YC…v„=ƒJ!
‡N(‡hL@,Ÿp‚&N
%K*/cŸ)S-K(K   V".gJ
q@žf\<w®pAA
‚9TŽj—‚O
J&      vY—T‚—LV  /
%R
C
‚<"„
…IM

 .U
6
4
 ## 


MC %A
‚6m
FFN
W';
(8J¶.
%3\&
%fOƒ890kenagaƒŽÿƒesawƒŽÿƒnv
ƒ-VŽÿƒ+Gasaw‚uŽÿ‚sedi‚&6‚g‘þ4iƒ6Žÿƒ4sawv
ƒ'Žÿ{
ƒ'onƒ5Žÿƒ3tonƒ4Žÿƒ2oshaƒŽÿƒ
ptHšlíj„Fˆ2„L¡h°5‘dŠ6‚"‰Ž     ŽÔ<„

„
†p‘j…vŽ÷¾Fl‡u¾‚ô‚I‚ß+‡‚œ"0®ÕwÞ6åP‡l9Õt9rnel‚3F§8‚œ!“ØMl„ÂAy2‚¤•Ú‰*6‚‘B7‚‘x8‚’-9‚“asdata‚
ùKboardƒžI\—Ì@
\info‚¢¸]‚<dÝXI¸]‚<dstrok‚V
´X
wordzR2
*

"2,`1}…E
.?‚o‡
O+n"„l‚+8ƒ+„8……„2„z‡ƒQU*
S…%@"ƒ'uA›ƒ/4]‚‹ i‡I‹$-      K6
;
FS64U#¢OƒQ
ƒEµ-‹    †0—y„Š‚$†"‰2  8

8J
‡L)„]™<ƒC7EƒM
AX&Je‚Iƒ;5ˆ-±Xž
”LbŽ'“F£U‰Iƒ0ŽS„2„@#cm'†YF       ‚M‚i+µP
„/
…"
ºMƒZS'ŠµˆPŸŸ
…0J
ÎB        8

8JŸ`)ŒR[
Î
u9®n
&J)pâ0u¶^
b¶‚7dŸFL‡Za}   #cb'ŸMF#Ÿ‚i+~Ík‚lÖ
ƒM¶5
R_check   ƒ+3
‚‡8–‰9
ount  ƒ(0 nam   ƒ)3<,hash‚Ådùibœr«sŽ÷Bibyt‚-^Ž8–×3lobyt‚q—Gƒd+’Rˆk9„;‚`—ãh)‡^<„;met‚‰Tn‚&md„"‡T‰6 1    †{ƒ
!‡g)ˆz%„
DƒUzƒeƒaƒ1Š ,ˆ.J’;Ú7‘u†8„gm„jT„_‡bˆXž*
\œjņlƒ…sˆk…@‚(‰‡QÀN…Y‘<=—CŒ
ƒS"ŠG‚—*‡9Iš˜‚K‚
ˆQ†ŠYƒo°7§
û‰ªx‚C_‡~†G  l†CWeŸ!—;Ÿ 8+1—7õ
‚M
%O
Q<ÚbM—ƒQŸVU‡uˆ:Eƒ¾¾EfÆ;
 ‡„}L‚S‚¾ƒ6„      ‡Ge%5ýå„c>Ÿ
/31l‚-gdom‚>
…c
tchen‚lingon‚‹m~
£R¾WRnopqrst¢l¾E<ogk‚—D“Ñpm‚
·Xüx
…en“Z€‚ight“[€‚owˆ@‚QŽƒeh
xW¢†#ŽS‰½LîƒJ‚vŒ=Œ*d‰JN„G‹7£      l…Eše
…k=ŒT‹‡\‚)ƒ.6A‚“…Wˆ…Tˆ„S„~¶
†ox‚“,žE>‡]ˆ8‚{š>a‡LK]Œ’y‡R        “a’)M„jFª&¢^Šl„{‚}?C£m‚$¡1–Gƒ#e ^Ðf8x‚™.¥2n‰=Ÿ‚c…V
‰     U…zŽŸm_M§¨~Ÿ‚7‚qÎbeŸ„ŒB‘Ÿ…;Õ‚''¾=G®o?—;΃‡ƒr.^       J¾AO‡¶ƒ&§†2i5



)†$J  …&

!!ŸW˜€€€¿2‘•¶Z7KŸ#‡`     —4M‡d
†M
ƒhF‡„TCW
-?C§yÎP‡cx¶‡h`‚Y‡‚)Ÿ03@„Ÿ
7U—3      0knowledg1ˆ.šI‚6ŠD‚s‡q™fˆL
ƒ5]•³‚PŸƒ   N—‚d\nŠ;ŽŒŒE˜bke
+f¦1Ïö

…
[
w-,   Sƒe†_´dƒOˆ
ŠLY
YŽ5’n‡g&ƒ…œ'‡IÐX‚x»t‰m—OŠ©F«f‡CƒI¤ž;ˆ
¨B‚kœa¨UŽ÷{b¶I]žá?Ÿv‚EÝY,ŸŠ;—6‡‚\
‡#Y‚g
¾*¶+8ý§‚Ÿ„\§†|†k‚Ýj¶„mÝr
‚s"…uthƒ      šU—û8son“\€‚oennen‚ˆSrea‚…rstet‚ˆ
reibich‚†#iegel‚S”ÕQsloc‚$&‘‰)
"&
Wumar‚4
ƒ&vƒŒi—ã‚testƒ>„)"
 u0z

]j              VTŠ.S
—ãn, "
 u0z

]j              VT  S
l<?
/>
”Dœ+‚¹J‡Ž‡e„[!‰[O ‰A05ƒ‚3Bƒ9ŽE
\ˆ,Šj¾_?˜x‚DŽþ2C¾I2‚'¾?‡‚
ƒ     !QíY„é]05
w
B‚M‡í‚UýJˆ8'®h5abˆy…r¡K•Ò

‚Qel‚ˆA†7… ‰Œ^‡ß2Ž
Š\]‰9!
BŽP‚>wƒ^z87" eƒÔN ýŸ/^‡]
1]Õu
U!Ÿ#
‚jÚ‚!
O1‚?„R=oratori‚‰>–c®-’ë95i‚ªp‘‰D^ck’
ª`•mˆ5›&
Ž
Œ / „*ˆ)ˆ,‰   f‹¥*–n:
"ˆ‰
Ž÷ASõƒ\Œ”<ƒ$„;¾;"Ë\—‚VË
=¾ƒ®v@§c¶‚CÎ g’X‚2šk…+?”å<ƒd…+?id‚ƒ–þ/jolla“}€‚&lr‚F¡[) i$…UˆFôf„j
•h)˜@$ŒJ.„¢oDn‚‰gd‚ó{ƒYŸ
Ý9ß-ƒYe‚-„g‚‡*
–a
Ÿí#ô8+aggfunc‚>‚[„Uz[Z[ca&‚-r‚{^‚ltert‚J.W([qƒfW![Z[ca&‚-r‚{^‚nalyz‚<ttach‚>Nf[„Uz[Z[ca&‚-r‚{^‚com‚nflict‚ƒz
reateindex‚B‚6[
ƒJzWZ[ca&‚-r‚{^‚t‚\)[m>ƒ*T(W}Z[ca&‚-r‚!>^‚
rigg‚LOq[Lc‚*za6HZ[cay/
XWr‚{^gUOview‚@‚B[\‚{z[Z[ca+      ‚-r‚{^‚
tab‚…delet‚D‚F[‚)'‚   z[Z[cau8  T[r‚{^‚tach‚…yropindex‚
t‚†rigg‚†&
view‚†5explain‚–e        r‚B‚3[„Uz[Z[c0Va+     ‚-r:‚C^‚=     indexedbi‚sert‚DS}[„UzU6TZ[ca+    P_r‚{^.[reindex‚‘turn‚>‚R[„Uz[Z[ca+    P_r‚{^‚      savepoint‚‘3 elect‚‚VR-„!1IqRQMP{X"i@‚4U~transact‚\fupd‚FW[„Uz[_`Ya_N Bmr‚{^E5sert‚D[[„Uz?_`Ya+      ‚-r‚{^qvacuum‚šwith‚F‚l[U‚~z[_`Ya+w‚-n‚{^‚.aug‚‚W–¨Didv4„-ƒv……
†?   
‰DŽÿs\-k2…c
6Æ"
ƒuagK?‚6‚w‰Z8„SˆO‡Nƒc„`Qi<
„KXˆs‹7<„K0v
ƒi…$ƒR‚^U$ƒ}       3E‘4‚b
¡)    …\ †8„S0<=5…A*š    ‰,¦W„“b(‚"S‚2‚MY‚Œ—Z„|"[Ayƒ6„0‰"†A†>5’]‹o 
#±c„5
‚_„<ƒL„E~ƒ!3‚}3…E`0‡U‚GL1
0& ##ZE-0[‰`†p„:y†L‚d„^+‹-}zˆ(*,m§P[ŒwŠ‰>†)¼>†*‚‚qb”?R„3©1,“(‡R./`    ƒ2   +#9o@4*n‹x…~ˆˆk)‘T”j3¬`l
,‘I‚8ƒ$‚3Ó
S[‡F2ƒÄ‚" #|ƒg:p‚5
ƒQbŽþ\WK0o
4…$Xy
U$

        ¾9    Ÿ‚?S81S0<=‡U‡‚:zƒ<
"Q‚"1#w*l
$,/
)04/),



'+(U++,Y
""ŸV˜€€€‚      ¿0lj#ÿ„+Db
‚ÝA
qŸ‹g„|O:5T

"
L5åFq‡e

U_í‡l}Ÿ
-
#L ##Z 
-0[‚ 
ƒ
ŸY‡Õy*¯‡UY—— *
!‚qV‡`,P‚%Ÿ„‡‚}j      UŸ        Ÿ
-`    2      +#9o@®l
n
Z
5)
!,       G¦G
,=¶R
u‡‡k9F2ˆƒ¾!.— ZŸ8
(‚50languageid~
‘
‰74ɃL“)  
+!!F¾fY‡0
ƒ¶d„2")        
+!!FppendƒˆStopƒŠ|—ãorg†()
ƒA
.1&0b6-
U9
‡H„RmLƒ+I‹‡GƒP!‰g‡„v2&‹ ¥BŽ#‹±G‚—=Q‚      Šo†šPãB4W‚#ŠØM%‚W‚7›9„?ƒS)eƒEƒoS~$UJ$ž44„}‘8Cƒ;
eˆ%
ƒ!À2‚ƒJ„o„u…Tƒa†D„+‹ZENƒZƒ35¢Bkƒ\ˆ6“k„u:–Ÿ…M‚yi.0:ˆ}‚,„x’|K¦-\ˆHŠQ;‰5…#^‘X‚”[‹®'–7
‚s„ˆ„aŠ"‹m
‚‚qˆW‰4 
&„9;œ …„t†`6š9‡.U¥^ˆI+4‘AKˆ'3ƒl‹     |]H
+     #*œ:6ŠRŠ;…&ƒZ…8™„`K…>“k‡&Žö|
ƒ)I„AƒM!‡]¶‚7G‡b"+‚tW
ƒ7L
‚=Q‡)
‚    ƒ%—8
ŒãB—/‡i52„#%
&
‡'„](5—6&/‚pÆHS
’A4
s‹|Cƒ;
e
—3
õXÆ‚§)VENÆ#
`ƒ\‡‚z      A
U:‡bX*¦g—¾<gÆ
‡c‚O;®nQ‚]
H^2LŸg…‡k…®O‡<§NE¦Tƒh¶[la‡UƒP-Ÿ
MK{3!"|]H
+ #T‚6ŠRƒ@K‚„Už=er‚ œS•4ƒ D
f+/
U3\?†        @Œ-Oƒ/0—I‚¥D™oºi" h‚RL´u %¹C’
…=2±ŒHƒ&A’ˆAM†yˆ]…dƒO ƒ_ƒ@h…qƒ,2©0†‘†M‚PŒšU…   N¡!µ
†‚‹WŒ]ŒŠt_S§¡BXAŒ:³Œ3‚
‚‡ŒO
‚‡'ŒšZ„J‰8?–¦O’n‰†o¢lƒRqŽöw
ƒ-0„V‡‚¾S\
c‚g"    ‡B¶$rL‡ƒDŠ8Õ¯O‡oUŸ‘N…4J¾?Æ%zË„fP
J2_ ¾/I¾84QƒN…     —5
‚PD‡‚r®j—>,‚1lÝ;‚sí#Ÿƒl‡‚"?
;?R/^ z.gjN—| Oqst•`
‰ac`…Y6
X‚f„E†}Цu]Œƒ@ƒLS‚h±Sžƒ7\I
2ž`ƒPŽ\ƒ7™?S7‚-y$†!ŒE“HŒwœ4šV…#[‚AdR9
ƒHŽ‚dE¶YH—>»D¦u]Ÿ‚/!
o@Õ§  ’'ƒÜT}ƒPÚ]"ƒ7»F
tS7>yO‹p`&o¶&Yd
#9stƒfW8‚\„{…
‚v~
„"GŠ‚D&J‹'ˆD†c’-s–s›Z=ƒ;‰d…?‡I‚L‚m=ƒc‚O(‚^I‚w„i„jƒœt†‚m3ƒL;ƒu’m£;…KS<,‚&
Kƒ"x:ƒr  …Fƒ"$
(†Nj‰ƒQƒ…T„Apœ"„‰r‰c‡6ZŒq˜Ow¥&ÆX«       —KŸ?
‹`
ƒc‚3&„~¥„tŒi‡y‘+¯ƒV‡7”‡Ié3ž/W„*!žPŠN‘,:š8“7‚ohf»=“1‹,„…OŠˆUŠrÓ›0¸}„(–O‚=ˆMƒc
i‹Rƒ)q¡{….;b
<Œ0‡L‚w‚,)ƒS‘bA‹ƒ‡$ƒK…}ƒ1Œv‡F…Bˆ8G…
„M‰‰c‘Q‘-‹‹`‰%•]…;–)’7ƒK…G™DI‚]‚d”       ‚0jŠš†‚uŽk…d
‚7Tk„l‰`†*‚h
((ŸP˜€€€‚
¿$¯ƒ‚PwƒNˆiš`ŽW–/‚ˆ`‚"¶T(KYDv††~Žg›Jƒ!>(†—W„lŒp‹3”P«S‘0™xuŠy†b„+º3ƒMˆD½7‘JW8B„=Š4ƒ=„z‚.Š7 …I„L=”ƒ`‡Ÿ4„9» e‰6ŠO”ˆC”~„–]’Q!‡ˆŠJ…Y&ƒ;ˆc‚%†ÁX‘i”‡B’eÓ‚*…–/-7…‚N0˜Zg!ŒP5-Š)ŠM–:˜I*ƒ6s…D‚a…‡-‰s§x„„M‡t†1Ž0eŠgŽöjSYSzA7‡‡‚!‡‚#‡NQAƒ‡]z„u       I„W‡…‡i

a"•E„tŒi‡y‘+¯
‡_‡|y    
„9        ‡e!‚@‡VY—˜®¹r‡t%‚S‡‚6)‡„     ƒ^kq‡E‡‹‡z‡k}‡
‡ed
 Ÿ&§:‚X‡¶VC„‡ik—‚<:‡dA‡kB‡je—ƒ8„Ÿ.‡‚j2‡ƒY
lƒ.M9žsQ‡hl%‡iuwE‡‚D‡f
tT®}f‚‡`\‡bG‚ƒ‚"gd‡*‚5&\
*‡‚„|‡k—‡ƒ|‚5N
R+‡s
ƒM‡f 
e8B‡>‡kN‚RI‡h
"Ic'>B‡3h„9ƒ`Fž‚+‡mf‡m
‡„  :—71—"‡(y—‡„‡TI‡}g!‹r5-Fu


Uss‚q‚:‡KCƒ-…1—80last_insert_rowidK†
H2‚z„~‘`ÂqÍ<„…~VÁvš“j
ƒÜD®#Í<ƒ¥kƒŒTê‚,nam‚
ŠtÚG
*valu‚U˜%„uƒI”å<„uƒInam‚X„!&l      ”ün!&l      t‚S
‘}”Õo
wchŽŽøƒWe‚’*‘GŽ‚…Z©‘gÙ[2®pù‚U—8‚¸„/ò6nc‚~h … ‡q[‚
2
Šo0P‚< ¢u!F‡Àv
O2
‚K0P‚ t‚ƒxˆar
ƒ0U‰’        

‚Alž$
†UM= w†Q
„D%ƒ/,‹Vø<ƒR*•$„&Ì1®q†
‹P—‡nƒT:‚kˆI       ¨[[‹l›)ˆ†
ˆƒ    d„~‹2ˆ2„
†LFsƒ9ž‡eg‚
ƒZŸ%¶4ŠB7”g†‰„†LPŸ\’     „Em©0‚[”(‰gŽy4Ÿ~









†j†DŠ;”r†M
ƒ4
%"~
†C-¯|JŠW£Q™hˆM”›’`”_ˆ3ˆ‡0l7œR‡
†.¥P—c{‡8
ƒN*‚ƒ—8·c®qM     ‡k‡FZsÕn—9¦‚hTyÕy!‡hRü}Îw‡†P5"s.%ž~e—9q:¶+‡Y#—@t‡4Ÿz¶„F‡!—=4‚&*‚s‡`$t









ƒv‚fF11
M
PN—‚D‡o-Ÿ‚ož~Æ'K†<
MŸ*%
ˆˆ3?O
l7st…i‡R
’#)]¤x…      „<…_
„o*
ám‚#‡u‘7„”        ‚GŒe!ƒ<½$=³\)—8"Hs-<ƒ†P
O*Õx»I‚}„Õn|hin–œeN2'÷d$02'Žÿs¾IlN2')¾P†$02'1‚g
Ž71•ñw
‚ 1tud‚ˆd”Õ/t‚’”Õ‚terUqÐ
‰†#
”qƒj‰nº\“Z¢}”U s“9£F™
¼{
Œf,‹iƒ’}½z̓GýEú‚YÖ;üƒTW퉗7%‡7‡8Î;%¶xÝY[unch‘$.i†{”ƒØ[ˆH
×{#žT-'
ë'¥ÜM
ü”3q‡ˆ„ª\F´*#ôaM®6Ÿ
w¥lu
      Ž
†3Gt]`’”"[ƒ&Ùj®qAyer‚‡(yer/
PŒ%‚q(º&ºƒY¤vŽS•) l‚C-‚]¤AK‡-ƒr‹'®ŠÍe‡F…"‰6‚uƒR
hF…ƒ".
ƒO
”Z^K‡-Žz
·)œ(ÜM¥XºƒYœ‰‚Ïs@‚V6"Êf       5
hF
‚FÝY,³^ŽZ^®‚d‡‚|
_(ŸHout‚µm‚R/ƒD‹1Hѳ9‚þgg„ªƒzƒ’r—Ì…‹O%XK†~8@wA‚?=
""ŸV˜€€€‚¿0º0lazi’O‚_
’W\—Ì<
…\dl‚Z„I.:)=Õ„_ŽY•Œ   .:p=‚ÀOS—?§)e‚É\}
È^ܵad
¥e"‡3
›U„rd A›y‹!‘†#wNˆZÝ( iƒ v‚-‚hžs“†‚{ZƒC›`Æ<›m„*7
(¢v¢X‹>ŠD73ƒp†MƒA†Hƒ*‡Q EˆrpŽ2Çw
„]rŒC’|¨ˆ§tË|*c„$ƒ(Hd„.†l;‡L%
,)
Ž÷I¾*—43Ÿ…)‚9‡K[ÖŸ5ŸU”5œfŒ0„f„*7
LHÝ‚i
ƒ*‡‡8[í^[̓Ÿ‡e>&ƒ*‚QŸ‚%ƒ{žOHYmv8"¾er„NB*„8‹lDB*„éQfx‚B„C‡Q:ý     =
.‚ˆr$‡a‡Gt+?¢+
‡l
´ 92ºa

¡p …*
™;&^ƒ2…#c'
ylJg‚pY[†?e&#t‡Ž‚@‡ƒ§4.=
.
A‡r$¾„:bt
‡TŸ
…N®o
²U9ƒ†r@

ükƒ5p *üw
`‚¨iIFc'
8ZlJg‚pY[†?e&#t     _entri‚´Ò²Qpag‚´SÒunus‚´jÒ³k6„&!+Œ)~{™D‡ › ‘@/a•.
…yš!
†cÐC"‡E(K#K{‰8¤$’2†(ƒ3ƒ^–(a(‚Y‚M@$…`„|¢¥…âY     ^/‚0³TCÎ#ƒ>Ÿ V‚¡

K~
{{‚
ò
X(-‚M@$¯n1‚D–þ„cp8yearˆPrn8‹,m„x»_c1……@“~‰–¥{!¶_;ýŸ‘6„ªst‡2‚h¦'8       ‚–‡:62=L13
\(#z
‚S
‚“ZƒN‚~`~†"1™9       8ƒIˆƒ      
„b#‘q’\¤GƒT‘X…W‡ÀO®,ƒŒ‡X@ž
‰39‚<ˆ(r…\ƒ4-        ‰] §Cœ1•‡X’Hˆ,‚4žYœqˆXmŸ]ÅjŠcˆ0Š]5HvHƒo‚
ƒ.ƒ^
…pŠ3ƒO†²‚D‚4…C¬“s‰A’}’„kP•:‹I„‡a‚_¤.‚r¤gO„qŒ¢:ÜGqK‘—>•D™y„}‰S†2˜:ƒ%‹x
‹‡8„eŽ÷‚kÆƒIeY
‚       W
‹{
ƒ     TJ…Wž
²LO®,\Uƒz‚_9u_r‚Tƒ4-  
ƒ ‚#‹vüY’"Yb1‡OA‡g³xή…„
¾"Z4q¶f—;‡aNŸ\—‚S§%‚i
—;
 ¦~.Ÿü
K‚;‡‚Z
?Ÿ‚„@‚v…?Sw#‹x
Ÿ0—,Nv,¦Q
4ƒ.‰„[TRˆ1QB^+"‚3X‚^`‚0‰
.ÅŠ¯(Hˆ$‚/&
        †g:³/Œ:‰\‰&E—ƒ>„B}gW`@‰‘,
³vˆ&‘O¼*

‚U
L
–5Š03k–)†E‚?•^Ÿc®;„bƒh 5‘iŸ„o“)kŒ]“LÁT¢     ŽŒw†P‚µ„0ˆ‚3           iHm†R‚/&
        Xžm:žaŒ:‰\‰&E—ƒ>„B}gW`@P3l
ƒA,ŒN1ŸVÒt
‡n
OÕuQ4ƒ3k‡dVÕ7§F‡…‡o„b®,‡‚§.
ƒ_:FkõOŸgL
B†P!es_end_block‚‡\‡Nz%ý„5dz%d‚…p

”˜šK
Kft‡)„#B2T)&Zd†[d…?#
JSQZ
1W ‚*‹t4O
< ‚‡RM    sj‡1D„y2H‚D‰BŒ`Œ,,imˆU…o//#ŒKƒ
'^‚
‚J‰\A„"
2I‡`ƒVŽ\Š@…Vu|$‚DªuŠ‚¾i’m^‡6™P,§0‹fŠq †p¨5"‚2ŒH>†=Œ{‚~„V–G†u>Œ]”G¥5„Š5Jƒ+†…-…5…Y¾s´…„p‚`‘.ƒR…[‰dŽ | „4r‡v zyŽt
Œ‚>‡‚`X˜wŽ„R-–QŠ_byšSƒH“3664—0ˆ'†&‚A§k…x`‚„(
‚TCƒp{.3)7
RA4`D@†0ƒe„>‡* (j-    !
)(”}‘Hƒ!E‡4‰F,@§‚9‰ "
Œk
Ž-x±P‚.Ï}Ž        ˆNƒ V‚2;‹8ÄVŒOBk4‡a…Y[fI„@%ƒ‚y d‡@„T,
!!ŸW˜€€€‚¿2Áš"xS‚~
#,jƒ§    P†iyŽö‚M—.(
2I‡ƒ*ŸZs@cu|‡‚@‚FFAUŠ{ ‡‚P—:,’70‹fŠq †p¨5"‚2ŒHŸ&ƒx{
~‚'    '>‚3…Go‡I/J;õ”JmJü‚Ëbo]‡Z
‚RrZe
U¾

Q‡N¶j‡‚Ÿ  Ÿ:‚F664¶‚A‡z&‚A‡ƒI—3
Q`bg
‚TC{.3)7
T
R
"45>D@‚=* (-       !
)‡„yYƒ!E
†u
ƒ¶<@§'ec
"¶1x¶‚j
)V
;‡ch‚c—h—Lƒ14‡a…Y[f%S‚e
#,wŸP 0leftmostK%AB fx(¶h_Ńnƒ,†lN‚¯5Ž!ÆG‡`Œ(½Y
ƒfKƒ†lN3¾E…6„ƒ-A‚Èovƒç
—ûgaci
‚{95n‹hIo0_        ŒE<*v"0PG   O
.ƒIž‡f
þŠ;„ˆ†‚5”m•2       ¡TEˆM„@Gs‚Z„ƒ'‘v„'’,„M
ŽA0
™y£\-<%"•m†?“)ƒCh8
s$_       ‡*O‰<6Š*{•Q¡4”iŽ.6…0
ˆ* Ɉ"
|Ž÷Põ
h
‚F4FÎA;Ÿˆz‡        Òtt«—‡¾>LD-<%Õo
—7]  /@O‡[6*Ÿyƒw¾8§I
b,£^

( ^y_alter_format‚Íx•ùz}t#-Œu,•l)
ÍD†c-Y
•ùI݆c%file_formatƒJ.ŽR^†d¯w‘8ø‚_…Þ†d&£fl1‰-
‹bD‡1‡3tƒG

.ZAÙH¾qmon‚R¿7†\
#<!$^s
2!  Uƒô
r„•ŒH
#<(^s
!         par‚(e’†8ngth.L†2
   
             ‘^žh:?o„]iƒ‚];
6
&

„*=    „"xK.‡.‚)‰\
˜sÞw†&š$º{†,£r„p"‡t¸`:-‚m‹y•>&¥eŠ7‡`%a)$ƒI(<b*hƒw?3#„
‰©Eš&‚~…Q1‰0
¡;)Š_‚
ˆ…f
#k     ƒ,„ˆ'’C$‡ež$Z‚iŽR‹l…‡Vw®#®H¤Š" ‚ƒ$„g        ;ƒw£X‰9-\.˜>‰!‡\"Ž‚X¤r‰q=ŽþW¶W~B
‡o`#'ž*‹~º{†,£r—1Q‡]ˆ
:-‚m&‡N-õ†W\uMgÕv¾9!
í0i®†E
‚&$12$Zœ
®`0—%¶…I¾GI§%/ìA6   ;4‡‚
NŸ„&S{‡#‡\"s‚XRcÝ;iz
Ÿzdovoƒ‹      —ão"ss‰sƒpWi
¡cd
‘IŠSƒOn…pI•s2
o‚#


;()
-%       ]ƒco
ƒK\5ƒV7|‰~    „{‚;Šƒ
j‚ƒJ„88c„‘+‰JŠ$„Ub&,‰2¢41™X³ 
‚^‚5Œ     ŒpFl‚c#„ƒi  ‚i<…m‡t|ŒdŠ PPƒf?‘4
„93,„5›”E²j‹|™~ŠIRschƒBƒ…ƒu‚c’'…Q„o‹a„=„,‘ƒdL†b˜l–U†N„
ŠQ‘Ft„6ƒš>@Q„S†J!ŽV„™~mƒ}
U       ƒ7ˆ~ƒ…>c|‘X…‹…}‰V’†
ÏMf„L=Œ_‚u”vƒU‹Œd—M’
¯b‹U™Ÿe‹*„Y—EžfC0‹L˜“]$ˆ!’j‚7”373§l
&‡(lƒRƒµq“—H‰b‚&Œb‚
0‚_’Žn‡<Š8'‹,ˆ‹yƒiS=1;‡L
œZ„@„6¦R   …2Žös
h‚‡i‚)*c—51Ÿ„

lb‡I=
5Xƒ‡)
‚—A^‹:‚5Œ  ŒpFl‚c#„ƒi  ‚i<…m‡t|ŒdŠ PT‡3‡ho…%‚|zhRsch‡A}‡‚E—9)I¶‚^—‚@‡h
ƒG‰pƒdL†b0Y1®e[yÆ  ‡cý9u—~®„r‡‚7&ˆžsŸ-'¾;^<…rüˆ
:—‚p‡ƒQ
lC‡†-„Q¶…#…G„.JQHD†
""ŸV˜€€€‚
¿0±–Ú*(F?¦M
&‡‚]Y
®ƒnN1Ÿ."‡N‚7o'ƒZ‹yƒiS=1;$
ƒ
C
ƒ6Ÿ0lesserƒšO—ëaon‚†tN ‡?‘˜‚tZHÍM‡@¢)…R/
a‰<
…(‚>‰_
…_8
C‚~¤aƒx‘VŽxƒ“W   „N‡F(ƒ~ˆBŽF†4”!«7
”n’4‚5¦…!0¥u‡q=V![ƒ%£…&†/‚Ž÷„<å¸N4—R‡U/Î
_—UƒäQ
míC‚s—‚‡…?„¾D
>ƒÕoÝZw‡z8pT‹;‡q=V![‚ƒ`‚ter‚*:‹B†(w†Oœ.¥
‚ÑYZ…G):Žn–ŸB„<
Š/Ë[Žþk
>
*w
ƒ7¾G
57¾:.‚‡…¾t
x):¶‚W‡l«‚yŸ¶ƒZvel
ƒ*
…-…=M;‚

ƒh"$„D
       
‰h:
…H†
„xj‡bZ
ƒ…@˜:‰bLÀ
`†"K«†
s‚I
ƒp
K/1ØŠ`4B@4ì
3Sy"’„k'†2  %u‡•g
!‚-+x„q‰aœ:Pªu‹;„“4†XŠ
„3…9
†›z
Š     `6‹[)‹BE&ˆy„ 
žWƒ=
o
‚6jŒ‡*Œ‡¾%
L_V«
˜o‹1
dŠ*Œl^  § K‚a–V
=ƒ9
‰-Pµ…ˆM
*\"K‚?
cK


Ä1R04B@bA3S      "
„)'a      %u‡I'
!‚-+õ:ˆec     #‡s‡ˆ‡dH—;eÆ'o„j
‚t—4‚S®‰yýtƒ=
oüp{—9‚w‡„‡i…w®U

L_‡V§*¦ZPL^„z¾…Ÿ#‡c\‡.   
 Ÿ
nshteinv†9…eŠ5Žÿ}b‚rag‚–ƒd“ЂI„ð‚d    xicograph‚26’Óƒžh‡'ƒ:Z’Bÿ6Z
ƒ]b½‚$3%…¾W
i‚Œ?Ê“Ù!iablƒ¡`—ëc>rƒ“_˜šb5Yw‚q…éW‡¡Y
‚‚#c‚E
;er‚
’
ÚKfuzz‚„JVŒ-‘ˆƒ

Vƒìjpeg‚…F+
51‘˜Nmathfuncƒ‚{˜Š‚
png‚E
44rariƒˆ]‰4P¥I„>‚Œr
NzO        2%M)K7oW ‚>Œ
U3Q+[ƒYE‘Jš#
*‚
‡a
d"™_ŽE ‚ÊA‡…       )3„9l‚s 6ƒq8‚F9
ŒM?MKˆ1Z'!5L‚v}>."/—@‚2OŽ]‹,‚<Bt&b‚5l6ƒ-eXB,evn-‚‚gK/1#!¥
ƒR
‚c…2†[#‚FEW
A{‹?‰@o…-”B$ŽB‚Uƒ.C$        !
‹XX0ƒ|6-fH#
„~ƒ:
U…1…pn(†SŠ;„R(oaŠfØ[Ž2†X"-8D‚, uy06rI‚x
.Œ@‡k
ŠvZr¿ Z‚iecÓ>;&ˆTFŒ5‹t("*6   "%„K…:ƒWKSQ„*2>‚[i-V”‹x¼-7zoS?yKŽ(…&‚g™'…2–p:ˆ MPˆo‹s‚K”}¨ƒ!&v-!ƒ\8Z„G‚ ‚„]~X?T„9S –O`tQqÎ       
‡n
mƒb 
‚„7‡OÕZGXP
%!)L‚v}."/•WO‰y‹,‚<B<&b‚5l6ƒ-eXB,evn-‚K/1#E
!p

‡OJ‡l#‚F‡cOUÎiÎ
AÎ2
H

#
‚:üzPP&Î:—2
;8D uy*6r6—4„j®ƒ‡Z—Lv‡‚P®c3e®o
c?u¦KKh¾?     ‡gS?yu
‡a
‚g  %w&YZCž{TS‚'U‡XF‡z      (4-!

t8ZJI~E
¾Q eoffic‚q…ƒ=ª—ÌEN
tclsqlite3‚‡S•Œ;jvers•-
Lion_numbq
†!]] k‘1„é‚az‚E‚
ip‚…H‘˜ycens‚
‹H.@

‘&R

"B‚‚
4-RBBf$ƒh,•xN”¦QR‚×f$‚~4‡p&((8.-
‹z!:
""ŸV˜€€€‚¿0Á0license‚ˆd‚ápQ ýDQ e‚Y9
’W>”Ý(ƒ½        >fe„9yB^Dˆ„8ƒ=‚$…{ì8%ê*^ƒž     õMcycli„`–°/tim„
%DC&òG„V¦N›`‰9
’^ÊXÀÜÝy…¿X΃i݃@Úght‚‹B•7’Bñ96room‚.
Uƒ.weight‚†^
‚     keoƒ<‚ ‚b„$…0hB(„QM<N        ‚…t

z
#…7“0¥$B
ƒ~b$&
‚
$†C…ƒM"‚‰9ƒ`nxH‚
‚R‚tƒ!
)
+,
‰=„XO$
1ƒd*@9‚o…('5KQ;‚Sw†V
>‚
‡e’mC%„sƒ9u^†o…„‚%‡„wo:…A…‚Hz)ƒ'ƒU„‰#ƒ\z=dˆ#{‘       B†A6‚‰`”
‚2"9†T²pˆw‡z…*S†\…v6‹ ©:„SŒƒ9…V+…1ƒq†”M-ˆf ‚'z‚+‚i%‚6‚?‚T/&‚Nƒ;Æ$‹‰:–7“•R"…FE^ŠfHŠ       ƒ^T„[ƒxŠ
 †"ƒ-ƒ.„8+
!2}WA#e‡sƒ‚j„
„„„>iƒ^o<C„~BƒK   

‚*7ƒr‚gƒmtšH] ?„oj‹Fƒ”+‡nl„[„AQ<
x‚9‡Vo3‚kHƒeˆs@&[wPYTƒ
Z…3Y…
Œ†„8˜)"s`]‚'Fm„s„8‡„hƒ@\7-oI6u)ANB‹DmNX‰ŒEƒQ…x…rŠq‚"
Š0Uƒ/–w†RUq…Ž5„"†RA"„5„r…O‚$‚n
Q…B …-‚†3„ƒƒHf6‚ƒPŽQƒ"S‚‹}5Ž+„j‚^†–J‹i„A]ƒ{™Gƒƒ<—2……J
ƒ ':z$@$*Š7
†"‡
‰rŒ1]„x>ƒ    ‚;<?<‚w
‚#!? 89%=.N'B?
!V{A2‹‚‹n…?ˆ3ƒ*d‚R„8BE‰‚~ƒN
‚`9†k@ƒ3
7VŽ~‚'!UnP…=ƒ
„<vj‚#w9u.
‚v9‹V!‚

a‡<?‘P>…L•@r‚gˆhs‡    ‚x„*‚vœ9$„H„FO-F&†]g„4@-Žk/Wn„+*‹*D55Vƒ:”o]„]$6L"0-‡        „(…Fƒu’wFC    ‚
>”Š_YLÇ<Wƒ]ˆ!QD‰v…1„G;‚o‡‰i3ƒ/+‚"…w‡#j„Š2„QE.#Ž1‹ ˆMh‹…h
½5*u‚O
[\†‡ …pJ
@xR5‚
}Žöƒ7‡h
s^ƒg„I‚#o‡k
AoPGN
ƒF{#B‚g‡V‚z$"9ƒ8…Dup‡‚B
Sƒ—7/2 
„SŒƒ9…V+…1ƒq†”M-h9:$%
2‚6‡_r‡e
,†^‚
ˆs…I‡‰Z‡C
)FE7
4V
4T‡ƒ*Rƒ— „¶
W#e‚-"‡‚A‚o.C$‡`‚f       

‚*ŠV7ƒr‚gƒm
<t•9‹xJ1
‚J‚.i
#Q<M)TO   Ÿ
PB§!8
f¾K$®o
'F‡fk‡‡:—231
uAK
Q,m§<-F‡^ˆV‚I'Z`¦[$Sdp¶XgQ‚;F‚‡\:‡ga§]7Mƒ<‡_$‚MI':
o$
O$3Ÿ‚"T…81—
(>=‡c
       ;<?<
$w
H    #!? 89%=.N'B?
!VgA2†u[7Vƒ&‡Q
‚=)BE„Y$
‚9\@ƒ3
7     I‚'!Q‡L 
BP‡wO
VMt"Q59‡pt#‡-N#‚
)‚/ƒm &;¦N
Cgr4@‡d+
h‡—4-—‡h‚=Q‡„cN„G
\‚o
{%
F+xpjpy—1E.#‡GBh4A[
.*
[;RFA—)§v5&_doesnt_match_blob‚ƒB“ù‚]ŠOlihoodU‰-#'RŒYu
–bP™·
§t+žFü-…Ö+
ƒ
+‚Èwis…HB‚j–oR”Ý       me‚(
†’†it
b (…(JS/„%ƒP„P"R

…
…0…V
ƒ'>•eƒ‡:% 1)>/     
D&  †4‚#2„63r      Eƒ`0H†t„.‡N `"
"N($
 
‚V‡,„ZAm.
            #
>
'†RCƒ| Sx™        +L*
""ŸV˜€€€‚¿0´j7Šj
N8{‹H.      
    A

ŽC
ˆvŒZ]Œ$°E‹]…C!+™M®/ŒEW„•c×LC
‚U'„P$¾-R¨K„\4>cx‚W*‡!ˆ>p3
"2
FUS|3(!'e?
>MhP
*n%hcJ*HLˆN}ƒ+@ŽL
‚}uV
‚>'"7„zUE5       &r)`Gq2,/‚",x…   •O8FAƒ,Oƒjƒk‚ƒs?vp™t2–
‚Y[Ž5
‡n

ª2ƒP
Ž/!¥M†&P‚&ƒ[‚2…—Xu P(85
¢%ƒ\‚{ˆ‘\dŽt… r‚bƒ)‡$·X—$†9… &
R”‰V‰=i       Œ?cš4§aw(—“J‡D)]'"„6ˆFG£=…†ƒU„†Df‡M 9†P•^#+3/       '†*        8
q3‡’   ƒu‡„uk
J«õ‚0K‡t6‚‰4”R‚23!Š>o:=)‚BØ3£-q‚„kAŽö‚X‡g
„?—<‚TPJ‡‚5

U!+ƒ}
ˆ*
‚oW‡*—9Â~C—11‡…F
‚L4>cx‚W*‡D$Ÿ† Æ'tQB
‚>'"7„zUE5      &r)`Gq2,/+R…  ”y[
2Š\Ÿ
     Æ)ÕxŸƒ‡iÎE(85
‡h®`
ƒZ—G0¾<„‡`‚,Ÿ!1&
RŸ„k‡c;i     „Ÿ‚Y‡w—ƒt‚{)]'"
X6H‡E…„~„¾)Ÿ 9f##}3/     ''     8

       ¦9‚M
ƒY¶X1‡h‚aŸ‚12!†5:=)y       Ÿ¾?
0limit_attach‚[s
        *j
100‚‚2“É'column=†
2‚‚(“É    
mpound_select¤!l‹ 5003‚‚,“É!
expr_depthax
ˆa81‚‚*“Éfunction_arg
!iŠ1278‚‚1“É&length‡{%2„L
ù^‘
1‚‚“Éike_pattern_length

1ŒZ50‚‚3“É(nam~O
sql_length3‡>1‚‚#“É
trigger_depth
KªuÅC•Ú‚ý1‚‚6“É+
variable_numbŒ)
?Ž(er99910‚‚5“Édbe_opw250‚‚-“É"
worker_thread

S“q†>^
×aHù‡~†>…ÞHn‚œ
~Qüsz~Qdex›nJ
j    ,?˜[Z…G        y-)!“%S‚8„Ž[‚K®m“m†!0S    š*     ‚


9g˜2
¡ƒCˆW‰M
‚\2"‡?9M„$ #¯u‚8Šƒmh-       œ47<‹Œ„Œ&ƒ

†<0Œ/‡z#ƒ}…PiWo
*
„F!ˆh
C#je./ƒkmƒ;‚,9'ˆ`ƒ0@†C±ev
ƒ*ƒ(ƒs‚O=‡1
‚‚$<‚_  8Œ<HG‰d†@N†C‹<ŽnŒy„R…,„2‡lˆTƒ6 $‚‚B„&ˆAƒ&…?c[v{|ƒjšF„I‡wH3
ƒg†W‚=/ƒn¾Q¢c-0ƒ4r ‚†F‚v
‘v^jŒ,„mRcZ-‚…'!
0%F7)v‚x‡JƒRZ‚lƒ+=3‚XW6;…&‚/ay       ƒ`ƒ‚0)w…rX&!MfkP`†[!08v}nƒBB1J
•*„7Žö~l}Ÿ‚§]Ÿˆ|…>0S     š*     —0-

9g‡m@‡w
(Íz
      —     2‡i9MPj#‡e…L‚8ŠƒmhJ
+     +7<‚*
‡‚‡kuƒ
N
‚0Õz
Î
g‡i-
*—;
‡cf
C#j.!‡h݃3ŸŸ|¾@6Ÿ$ 
—'$‚I
&—9?—3R—‚k‡ƒT—ƒ11
Ÿ!q{¦`h'    *†F

‡n&^‡d¾<     cZ     
0%")v‚xy@jL=3&6;
y     M‚0)a?"&!M
k   `—‚;M

0—8
‚T`1&
‚Qar„¤yV‹1‘‹=–-„[·P5“a“~š½k¾3V‚     Œ
!!"A"
3(;Œt
""ŸV˜€€€‚¿0¾NþüŠ‚ßF
‚y$
>%¾3Æ-Ö…D  0linearli‚ƒ(“ÿƒ&nois‚M†`’Ó|‚¡Bger‚¦MæDùƒ_ƒûx
uist‚œü‚kŒC5   $ K„QR
…
~
„=ˆ#†T46      4Ÿ
Õ…„‚~Œ_xÁc–d©P7‹B‹ZŠ‹R„+ „aˆr–†KAƒ.†G†4KÍ_‚qŠ
ƒb¦R™&ˆVƒ2
›#‹5‡^ƒ2ƒ‚r-ǃSvŽ5
 ^7NÈy†—I$ƒf'!—wŠ`5yp&7„q>…!K.1$ƒ*†Y2‚y{ƒ}Žöƒ—5

‡h§   ¾„zƒÝJlŸ—:”‚z„åJüZÞ  \Å|
~¾G1®k
V@§ƒ5Ÿ‚võ{2‚r-Q¦V
x‡l¶O`K„5cŸDr‚‡%A‡}4ˆ@p5
K&1‚        -   {ag‚.Ú*‚³øs‚‡‚GHer‚œÂ†~û‚
ü—s‡’id~‘$
¾n
q
od‚ˆd”õ
*leum‚Ÿü„wtƒ‡—Ì‚lu‚” ˜v‘‰?x›W0‚!%
<˜q  s
*4S
‰sÆU¬y
‰t   ‹.Š<,‹\ŒH‡Y‹·†"
α,\
….?
‡Kx™Z|       Jˆ>“©…kd‹#Ž<:\Ž'„]%
<h  s
*4S
„ü‚f
0‚Ï…w$Ic›?—bxò8¾:Gp—K
4‡‚h®
<:@fest‚rophob‚‚iüGthreadƒ
™WD˜šR      Dsp‚‡ot(…Z%‚ZL
w;7           G
BBƒH„w„e&ŽJ2'‹|]‡S

l‚ %.'E
ˆZ.ƒ;“FV7„4ƒ=‚ƒj„]‚ƒ58&)F‚'_)3m‚fƒ„-5‚‚1,y>?-*U9Uh{ng*l#LGWzA‚!m‚s9Sˆ~sx.ƒH1y6)
M"c‚ T]„Qh‚z&‚$?+ƒ$‚?‚
‚T&ˆ‚R&ƒ0.
"`v‡J0#Kd‚`‡T…%x…`‚U‚n!<‚8O‚„FH‚p.…ƒ.‚†J>8O;POG'J…f‚A…cd*Sx~‚J”T‚TL
ˆ!6ƒ<‚wƒ|R/‰T‚&y‚$”ƒ>„ƒTp-D‚DƒzX‰wO4ƒ>X‚U„`U11‚:…2BŒA…†~†`—‚]
 Œ/6N‹'…(t‡n‚F"Š3ÚyBF959
        ŽE        "‰B†W'J? [•i¢~mˆK‚lŒ8?¢[¡+•';”)  ‚,55©Q
'„d
 
N‹S-‚7=i4i   ˆF&‰R‘6  ‚ˆr‰'k—PA™„ŒloT„u‚<‰x‘L#†%‡S‘?œo‚    ƒ4%U7‚8`9
…S’#IŒrƒl)‡G{¨u‚‡§+‚@
“}&
X„'‰oƒE{“3s<…*ƒM‹Žy‚dŒ11ˆz‚aƒ$D‰ˆw‡|‚ž
…<<•&¦P„K"‚4e‚MØh           
‹W     ƒhŒ-‚%b…hgƒ>ƒG%†/?fd*„^Ÿ]+=‚Q‚R†nfu/ƒX˜lƒP…z4Ž7†1ƒ]Šˆ~[M…  ‰*,†YŠ"—b''‚V>&‚:*ˆW‚S!Žþ@ƒ}>§b
  O4‡f/tI
" WBF959
        
E      "®:CJ@'J:,
ƒ#…ImMK¦cNÕy<^S‚{;
„h'N9®m
"§F'ü{‚Ÿƒgí.[l‡W¶Z/ƒvO8‡b#7
      
‚U‚I‡„pLƒ)‡Ÿ$H‡i}9"'…x+.‚|

%%ŸS˜€€€‚¿*¤/•ô/‡W
‚>
        
8&
{
lI      ®n|jŸ…*J        M
H1‚U
~9       
®q®q
^‡cUgƒ>%0?fd*VZ4      I7eŸ
s‚?KN5]ˆˆ~[M{‚R*,ž''—;O<&‚,*        0listlistƒ¸"—ÌNSpush‚Ágread‚&¹)‰7dl?,T+Šp‰Xset‚¹~Œ}zCwind‚¸o‰writ‚¸-†">34Ute‚N
Xr  jy|#
„IŠ.†  *!Y„C“,VU‚j
†_„8ˆR?`
*„…3‹oƒ^ƒ*
4#6Œ •B
ƒR'd”xŸy
ƒxÍ°r”St/)M…Pvq†[&†.†?-2d’O»Qˆ`u†M…kZ
!‘‹:ƒY 
‘j5œˆkŠXƒ8'nˆ6Œ/cŒc‰ŒS
ƒoƒ2¢D†ˆ0„‚z
¨
²\:
ˆp6ˆ^„:‚/ƒo-Qo¥iV2‚(
4#6      ‡f
&

!'‚….ž[Ÿ-H.t
B)M‡D
P‡qÎm$-2Ÿˆ>
ŠlQùxAåU7ŒBi7„hb‡c<
ƒo‡dc

†®f.PEŸ‚zí4
ƒ6‡ƒKlƒo
oovski‚ˆgtlˆ|„hŠ]wƒQ.‹!ŠA…kéw„7‘&R
„cl=ˆP…}m„(Œ&¿˜>‘%‰D…
…0„=ƒ>
‚:V…D‚3Žx
Z‚‹w”•l        „=•6‰9Œ[‰rg‰+
‚Œ
M‡?$‰NCˆ3©4·yƒ…S†uŽþ§Õ‚%<üc
…m
„"‹O’‚‚%®Î‚>ý@—‚‚ýI»7G‡sÝ6§1¦ƒåHƒ$ƒE——+2i¶‚.valu‚verŽ8Y¨0       ŠR«= ƒpŽLƒ‘ˆN†ã
ly…V
†b‚1
†w˜HˆG
Šy–- 
‚ï5„ƒO~»Ydy
…6—6
engthƒ
Š^"iy

—R
vm‚„JA‘‰ƒ
m‚Z„J.?eÕ!•Œ.?-‚ÀOVn%3v‚
ˆ(ˆqEjBs’ú‚¸>qEjBscurs‚Z
…mJ•Œ:
‚7JoadƒGˆ`‚w1>8
2&       D,(H…/[‚} 
kšX
•7¯qæ'Ž
…L•…)©Šb$%E$‚R
J1cPƒ<]‡x’®9ƒ@‡9¯ƒ`V…4”A8
‡P;*G$‚rO“H ˜+…‚6ÞIˆT
Ž$)r^(„A.ˆ˜A…XJ”ˆIˆO›$:    %Cu        :Q„b
U‚cC$

+.Žþ\i    :¾a(
‚!‡„(—‚/†
…)©Ÿ‡;„O%E$í[‡m‡†–[Œ¾=M”36Ÿ$
‚F;‡(G§TÝ^9®oåK.—5k‚‘=
ˆ0)‡d^(M
‚r   <‚J„T—„/‡tpŸ%$u     :I5
U
C$Î  
)._extensZŠqF).#/TS9|…Z\0…oÐS$
…Ž"‚
 ÑD
%
Z†øŒù‚™#
M‚¨ˆ.‡d
     ¾0D
%
ZablQ%d1‡2S3\\7(
„A  á‡FF
{        \Žr_9¡7’1‹a‰*Qƒf1‚OF        8fN
Žþ\b§x—3   2SƒŽ6Z7¶X%Î‡i§?åL]í?‡Æ)íˆ~‡9,
-
P„9¾O8—2¶Wnalysi‚Êݵ4erƒ‚+˜Š=librariƒŽ`˜Šu0orsavedb‚ ƒm…`c‚
N‘ ^
+al#^m†l_O‚y[šÜ‚=ŒÐz
*‚CS(<
%1
'ƒ;„o+†?œB¢Q™B„Xv
–û‚
„JIõE‡Œ5§ÝYË%\c‚‡iý®g#"¾60Ÿsfilenam‚†&“ÿ|8auth‚†%£„db‚…O”d£qƒ1”dhosta‡<…ª;J
ƒ7ù„Â
tim‡]…#Pzˆ8Ç‚e™+ùLŒƒ–%ÃP   e_‚ˆSùgr
ˆ3ùG‚v
…Kƒc
^R-6…@@‚q!‚-J
""ŸV˜€€€‚¿0½0locatX
XS„m†KK  ˜M׌R˜M…P–A«?‘%ƒ,Ÿ ŠC‡0Š,…<
ƒL‰C!ŠD´eª$
1

‰m‰cºO‘pN-
’Yz‰e0‹&¿ˆS#?MTƒ†T‚7„Xz“Ygƒu„H(–_eˆ…ƒƒp”‰S‘6Ž#‡$‚qƒ=”)‡z‰t º\&JÅaJ«'1ÙM
 |›}N”mªGƒ:ƒŽö{
KÆMYƒtžjs«?‚~‡‚L‡ƒ-„W…0‡d
"‡2å‚]‡Š<eÍ1ú.

:N¦Z+Ÿ"
h¶[0Ÿ!-u$==
¦u)/?f‡^}9Æ"f‡m‚)_‡)/z¶P*„;¦|BFŸO‡lM‡fAõ3ƒ=No
'ƒ:?k‚T†s8
&

M$`"
+@?+<$ #mƒ      t,[)1ƒ%

(Ž‚4@ƒA*I       S‹Njž2:R[(IPƒ&Œ}…S0-!# …4VNs39K

=@1¥À{ #„e…V
3"&3^†H.ƒd9"‚]        Ž *:Šw…%£D
"@”;=ˆ
&P
~,›v  9$
)

r6=S
+
?&            `
9=_&J
1F‚6 >JBP        N    „!
#

           „*$[‚.ox%^&.„8^ˆl,-|
$R     :SŒ~@8$
…N
M
vLÏ/”'‚pO]JN
'!x-#         

‚cG_:
u.
h
LB'O1 +…hT„# ƒ#
)l‰ˆx'(/„0‚l‚(:h+‡;&
 #$,    A
     "     )
26@%(JC)-‚H‚':‘ ŸS…!        C$„`>*1'2ˆ,
MZ 
‚‡y#7ˆ3u†¬:ƒK„>]G‡,Š.ƒ’d( Œ‘b†=5!
 [>9Ij


ƒ\‰Lj…(‚@Ž÷      e:RM(IL‡ƒ$¶‡g;39(

(@SOÀ{ #„eœ„„',‰3
"@
…9=‚ßDO N
   4
#

           $[o.z,-|
$R     S"@8$
ü^
>LÆ"~#‡i+
)>:—5'õ/
`
/‚(M&X
 #$, A
     "     )
26@%(J)-‚H
‚¦D .     C$Ý=<‚]G‡,—„y®=$(      ‰‚  Ÿ   

 [>
I


  
(_exclus2%u0iœC–i‡)3O.–°RD
)3O.non)
-+%u+i
œG°7Bpend0%u.i
œy––°7Kreserv/%u-i
œ]––°7Fshar.%u,iœM
C–
#4‡m–°D#
\
ed_sharedcach;&‡ c…N—µvtab;'‚…Q—µPfil‚—eex‚—-ing_moduk!
\F„„w…~†e°[Ž÷"
‚^
„i„¢‚&”:§†e'[g‚$ƒ*5y"        %,
\„!ID,*,.‚Nƒ
‹(5
ƒx …+‚d‹ £$‚0Ž=<„O
‚A‚cŽC$¢‰k[„L”µ7„%*2ƒ.
r $!"       Ç„E4‚
Šp6‚)o!u„$‚D+#„f‚n…3NUƒQ‚C   †^…‡ƒ5ŠfŒ    ‹V!l‹‰b„R#fi„’'‡q
½%mb       *¯G‚vª
M K;%!‘8Ž‚ˆÉ3MEãh„-‚!‡`Žö|1‚®ggü}#‚c¶WŸ
„1ˆ‰k[„L‘0l,‡G—51   s
a $!"‚°T1Ã)‡cS΂|¾+%§‚:^$

 K;%!®C®kˆ‚—4
‚y®I0
E*žwwJ10%:y2%<‚_Q
>¦b‰Žþm
ƒ:ˆì†-arithm%ƒ,=(•u  M…Œ*ƒ9Žÿƒ$úŠ„ªVc®t$M\…Oƒ9gerT‹N#H<r#O//'&(
C;m !7
ԬF##O/#'&(
;m !
ic…WŒ~ƒ
4*…jKE((*?-p†3d^
!!ŸW˜€€€‚¿2¿ƒ>%0‹{ I¼4“q…%-™L
‰Q
† ‹B
n8s•"{‘…,ƒ}q#†3Yƒƒ&‚ƒ|’f
‡‚3’.„N†=‚:
ƒW
^Ï
…5‹Šv
Žr…h‡˜¾!…†§[¢F—ŒŠ5´)•Z      ‰'ƒ_ˆ„2‹f…ƒV¨ˆTg61“R…P‚‚,ƒƒyKD‚G
„
µ‚‡s
m4Ÿ‰„F-™LŸ†*7 Ý^‹ {‡/…ƒ}q#†3ŽMYƒ‚§j‚
#:
j‡e\/8¾ÝVÝ‚q‡‡^—ƒ{m‡i<ƒñ„#
\‚|1“R„>‚ 0logik‚‡n‚†7
 lŸ' v-‹5£„
       †ãhn‚B…!…     (ºq“ÐV!l:‚¡So‚‡„F¢…ndon‚…ag
q„\•W¡       ƒ’i‡+’6£J?     (ˆƒwBu8;NX2„vq
'Q
U‚    QX3ƒX ‰d‰o‚2…Eyn‹z‡†Q’ˆ2ˆd³{<ƒ#h@–#†¯‡t‚;ƒWˆ>GŠX—‚5u„S¦ŠA‚ W‘_—q„"‚
ƒd"ƒ$‰pX…)ƒ.‚`«_–8†Q‰OG†"GŽ@!ˆ/2;‘~’O,ˆ z’l†}– „˜L‚‰(„Y…‹~…0ƒ!b’Š3„}
–x!X„o°M2¬~„OŠ1‡      ƒ
GUƒƒ-’
ªy&Y„7‹< 5Œe„!ÚC†uŠl‚¸
E/‚J»1°
†$
„f(Bƒk„‰
Žöƒ)'AIW
yn‡v&—‚ŸƒUˆZ2;žsU†¯®‚$8—9¶`3Ÿ‹‚5„DZNŸL
W»>õx.‚`kmZY¶.0Æ1
xS‚yR‡§M®f
‚C[‡r!ƒ‡.ƒ_‡b
B„7
P%Ÿ QqŸ"O$
+&Y¦‚+‡kd¶VU‡hL‡~‚=Ÿ     
v/ržrYjK—‚kerW   Ns8‚‚X…=‚
Ž2 ¤8çKƒWÎRŽ4ª@‘        ƒuƒ5„+ƒqƒ?‘]šzˆŽM…‚'‡E¸L™e‡s‹>†‚Œ‡gŒ`
£ŸO‘w>‚‚Gº}       …UŠY†]°'†:5¡$    ’o„w’@×!¢,    „{ŽöƒkÆŸÒ}Ÿ‚
ü‰”n‡X‚.Pejù-§|§ƒ(‡‚8K_¶3{¤
„$Ÿ)
Ÿ„w      ‚%>‚‡‚E+݃Ý@Œ{„w—„i¯eŸst$
›Uo^Á
-‚m&
†²uû|ˆE-‚mƒÌ…„ƒƒv‚Ž(itud‚Sˆb‰)”Õ-‚path‚]…#•£p
##ok„B?@…/#ƒ5V‚$ˆ>œ;O$0-‚GˆL‡sˆA‚$„vo…@‡cƒ!†z†'ˆ"’B‚&y‚,…z‘.ÏEªM…F‚!ŠfH„Z‚}†_
ºk{”C˜k3v‡U
’7„‰P‚[‚A„r‡7f$ƒ#e=ƒ(^‚
‰Ã…S
‚Q%
Z’2C£x™Žt[„?]ŠN„7„e–-„„w+XOJ¬™s( ˆ%BO“‹PŸP…<
”+7‹‡p«ŸN‰WcY†[h…„P.j„ˆ>ƒ;D55Vˆ†.ŠH‰c‰B…F–j‚\?(”Pl_Š^8“˜(°ƒ‹{‚‘smŽ^’H•5Œfálƒ#U„        ‚
?
„b,Žö8‡‚j‚"‡n
@oŸƒE"B¶g79‚‚Nˆrˆ‡(F6
3H‡]P‚íB†UbL!Ÿ'Uœ6—7C‡k"f§‚c§8N
‚
‡‡2?X¾‡f
?¶VX    ƒ‚`4‡VQ        ]—‚L‚)&Ÿ&
>‚{„w+‡a‚$OJ—CW[(‡N(BR…@
ƒ     §
…q—‚m¦i
Ah‚a‡g‡—4,†—‚†/
‚—)—;+Lƒ:YIasid(L   db
%ŠSH3vÀ
)
Ÿ0»-
ÎVjš3j+#f&   % 
&
3-        -„A„l
9& ?#Yƒ&„r   ø…Œ<†Óg
-4g+#f&   % 
3-  -;l
9& ?#Y)out‚ГÙ%Tup˜5Ý%fŠUŒJ@$ö¹r¨G*@„7
h'‚:d*E_ ƒR/ƒ     ‚ƒ M„a/0
ˆt„I
ˆnk
""ŸV˜€€€‚¿0¬“^‚…1¥&†/Žd•2½O"ŸÈWfŠUŒJŸ
`$ƒ@üIdq‚Çx

h$‚:2**_ {/
lMÆ sÚ_/M2¾†x0loop&T†e[k
S $%"(“b“DŽ¾p‚[…-îŒ
„t•°j.‡H        6n‚Ix™V‚UŠ2’)ƒR%2…,‚rŽC’w”˜
ƒt‚e^…'‹dƒm
&       „'_     K8
$‚N     }~…s">ša
  s‚8Q!B
&9ŠR
¶w“O
” †P;j¥18#
+n†-‰jksf\L$     
@vF/        ’ AšLS        
BW‹s1OP9K)‹/%*\?‘4~#1 
“hŸr
QC‚"¥ƒ¶[
ˆq"’hŽ¾p‚[…-Ÿ‚Müd
„Ž†(L    6
:‚IW
‚51†xƒRƒ½‚q‡‚1®i
>‚eJ‚§ƒ$Ÿ
&       _       K8
$ 
‡T~
ƒ^"Ÿ2      
       s‚8Q!B

9P‡j
‚¶…Î
DKƒ<;sest“¨¾5¾ƒ6ap‚
Ž`'‘‰3%se…”~ƒ7W
˜Lpˆ‹i…(ƒF
ÎEc
‚TŠ7µV>¶‚0ƒì†9˃g´
‚cÝ„CrƒŠ&—µ„2s‚:;ŠzÏ"„{ƒr‚c+™
pŒ1„\›=ƒxŸV˜!<‡jƒ7„
…0ƒ;†‰Q…G‚p„I~8†={ƒW
‹,¡Y¸
™2ƒ
2‚JE„Rg-hwÍ&2C‚3f•
=©+À¡4""!4   \a"f“dl‹8Ž÷
3åºTüaŸ
~+
0N!‚WFåJ4Ú^ƒ7i&!
[_}ƒF
'8Â||2‚JE(g-Œf¯+b2C¦Md¶¶ƒ\=ƒŸQd
4Di™A›
¶
less™S  li’<
•x$¡h
‚D3
ž@k‚F
?{–‰'=t”{‘*
†Q"…
ƒ]‚b ˆd–      
.I33ŽJyœ"—Šu
³"Ž÷4ƒŽ$"õ4Ý_‡`.
‚%3‚þ=[õ)
ƒD
_and_found‚7
…'
L°E
    /V’úX
K
„Ñrg
   /V0ƒ
³     —ÌJ
ƒ+1ƒ³—̃4tƒT¥C‚ˆ     
‹]%
Š:—"£]‡vK†=B?Kƒf…PŠS¡
‚ ƒ   …]—f‚˜”^‘ -„N‰‚o”ƒy‰#‘‚
     
Œ!&
Pš2‹~—x½&t®y
-%‡‡Tjõo„dk‡‚^”:¶<‡h,I³F>ƃ"$‚³ &ÆŸ‚%¯Gup‚*vingli‚#w—r        ,
fƒ…@Œg     ˆ?       ‰s„p›BD:”F¸6Š\
=†_  ÀBŠ?‚T 
‹V
VA‰ž)
Œ?‰
¥@œDšR™S–.c
‚¿"(5«‚HŒk§ J‚SŽþ‚cÆ%³[*BD:ˆp*.gL<‚oÚb
‚s—3R»NŸQÝi
0dc
‚Ÿ)}¶B(5‡h§*”Y4 Ÿ?er_<ŠMƒ‡9…q•.†^…}:u4'ƒz=\!†rƒ[-Zmb‘TŠ,†^¡n‚aÂ:‰

Š_4Ë3ƒQ¡Aƒ       4jRIES#NY&<PD}
‹}—5
œ@Žx±‰Œ( .
Žl    –‰!›¬O†fª=ŽþG-Zmb¶fO‡[YjvJ®/4T
…:3‚O‚2Ý
‚þ~‚_M¾,P¾<
 (ýˆSŸ
‚U    ‡lÝ_Sí¶cas‚§ËQR½C‚V…+û‚6
R‡ÿ<h‚st$+@†“¨›¡„ Nƒ¨x…±YŽþ(„¾G¾ƒ4_ƒÔq„ƒ.rüw(§
„ap™M7ar$5thread‚Z„Hƒ=Õ„`•Œo=‚ÀOT—@rangƒŽeadlin‚Z
…kK•Œ:
‚5Kwxrw‚‡–Ç+sˆˆ+Àq½"w‡Š‚T…&modeƒÀ—Ìqb$&

       
.tˆ4/‚c‚FS
‚*ŒD-‚e
ˆHZ“B‚_3"2#"ƒF_„77
ƒr‰_”IG„3„Jj…K$†G5*Ži…b‚SQ‡#$‹G jˆi“p)"‡v-
…,V‰:9…# …N

…

ˆ…Dš)› 4‚‚WvP'G;ˆK/(ˆm†(7‚_‚O7D…[)zƒg<+:‚_ƒ#ƒ5B    9
2
""ŸV˜€€€‚¿0µ‹‚>‹v;>JGKLz2sˆ …eƒ`9qjžŠT‹]„%  
N‚E,‡RI


:%J6„T„dV[‚Y„Cƒ’#
”}-0n
*)L4 W™



“? 
„t†;„Mž%¥Hj      ŠE”A·r   ‹5
°=…s        
¦g  †      –3Ÿ`6P"2#"9_‡V„37
:"?G
‚p
Bx‡P5*(\‚SQ‡3SV —aˆi“p)Ÿ_-

„_
#…#   ]

…

‡G…5)
6‚C4‚‚WvP'G;)‚{/—8(†O†(7‚_‚O77>Õx(;>JGKLz2sˆ …e‚@9qBjT
‚®`DÃ Iü/‡g

iI


*%—@XJ¾4rV[^
‚Q
U   g‡_
ƒ-‡E&
*)L4 WX—.
1U



¶V
§…a?—6g
 $„M

‡e
^jÒ†j     —N—L
–;
        n
)0ltcl‚Z
‡Z:•Œq:d‚>:rimaŒ. už/¾‚6cid‚‰     k‚–B•ÒSlu‚4‡[‚nch‚“\ü„|re‚UÚIiwr‚ƒoyƒ”W˜š‚       z‚Â*ˆÕ ø˜„“,‚ÀOUm

‰1ƒi!ž‚>7–P&9
ƒ-
‚.
g8(%6/.
X&12
"(P        `$
ÀP¶Ÿf&ƒ
      gh
J.FŽFžs
Ï"ŽM‚
c†D„…0Šv        Ž'ŒE
A6*%y4‚6ƒ[:® 8
#A
#
C³@  .Šv½F
‚¾/
„»/M
        


.
(„¢—=„ˆ
¶B ‚
c—1
@DJ…”;
    )
A6*%1‚6ƒ[HS&“f8
#A
#
C…y      .l2—\32‚y
+C–þ4
…JCacD
ND   ’Pƒ
³I3·›=-
‚Ao‚A‹^’dµ_g…b,
‡>Çv
…/?
‡_f—^ƒ    ”{ˆ;–2(ŒŠm‹ƒG9
ƒ‹%Žþi
BPú
‰ 3o2‚Ï6~e›?—vf®nZœ(.(¦u;‡]¶WQ$fF—'
.ƒG‡‚jŸK
 !bookƒ‹—ão1hƒ…      ˜ŠpTin`‚IJ Gi5
Mˆ9
‚KH]Ÿ(/†0‚m%‰+̈X94
eŠnU¸|‰9Ôr"„%…>
3
?4
ˆ?…X|‹¬n
2†R‰
Š}„c
†@ˆÉ#/r
2„XŠ
Õ+4™ˆC-,†cF…Q†Dœ`Q…C‚
‚au„b9‚‡vB…^‚Pž;¼lg@qIG!7(I,‚% I$-O’21‚”        E-‚j‚
.MQ¯*{‰DïHœ5ˆ_QLŽö~PHQCÆ&1/@
%ÌR>‡]R‡v
4‰9nôq
H‡f
„cE2=$‚j®k‚œ     -,
uF—$
‚+Y—+Q
5‚õa>9P‡k2
KB§2ž[1‡l-Æ#?‡zR—&=V—fFŸ    ¾Jeriƒ¥}—ëe.kai’€Foh‚
½0‹!ƒ—ão
:ƒro‹qm>
*]^'!E
4]Ž(‚Ì_˜
T
ƒ#    
&†r…=:\7J\>(3r6uƒWˆp‡i'k+ %ƒpZ%4ƒ*^ˆAC)k„d  ?.,
'8šB„V      0Z
""20#&‡X&
>      ‹&
ˆH‚’$   8$%?$w!,$~H‚
.¡n’         2nˆ£Do•x‚       “ZܸŸ
Tü{0     =:\7J\>(3r6uƒWˆp
†M'Jk+ %ƒp%aƒ*^ˆAC)k2 ?.,
'VS:   0Z
""20#&
>ƒÌ\$Ý_$%
9$P!,$QH‚
.¤‚nÝ$Æ69B"dejx‡}‚7‡,’W‚)x
„}Ž        a@2]
z\…/x  
…
C‚(      ’      v&‚’(šsˆl‹Êy’bh>…,ž8‰_…W†7‘Š!™J„+‰j†A„u…ŠuµT–tHe§M†RŠApŽ
‹*
*9…l‡y‚‰Š]„^ƒF‚4Š0‚:‚%
6„‰ƒJC”ˆ
62…V’&J‚69„0†’7‚L\‚x‹I†i‰X‚,‚‚rƒ6u‡l  
-ƒh‚l†"„G
""ŸV˜€€€‚¿0ʇo‚‚=‡v…G¢‘jŽk……(„‡`ˆEƒQŽ<…[ƒT†l„Nw3‡†2Œ'Õ5‡1
ƒv ˆgƒw 63ƒ‚,ƒ;W‚‘L…
‚ M˜‹-‘O“rª ^‚.‘BŽ‰Žˆ$‚‡B‚       ‚/‚R†^‡T%a8v†$‚iŽ!†3¬…
ÈB"„Cƒ‰U†T/ˆ\“P‘NŸ~ƒ+ƒš.ŒWƒ<ƒ.ŽöƒR‡jQ¶Wƒ;l‡i%
…„nž‚:‰_…W†7‘Š!™J„+‰j†A„u…H^ƒa†iOY‚U*LÎKKJ‡g7VK ‡^4ƒaTj
‚CO+¦2‡Nœ —‚l—‚IÎ ‡*&
8(`       j¦&N‡uH‡‚;¶+‡k‚*3?— ‡}Ÿ=‚¶Y8)Ÿ„†l‡…;
^‡Ny®,¦~O_¦z"~NÆ%ˆ
ƒ~"—ƒ
‡e‚#/9
'|
—Ÿ`0magazinƒ“˜šK@ic›O‚˜¤,ˆtŠ
     „E†|'ŒRÒ<‚"“ØFT‚Ïfr®nU¤n
Y/!nitudƒ˜Ønet‚‚J–itud‹"]‚/…6¿PÇ…Rlz4       Žam°zÏ;4’&‚µD2‚+¶pŒ<6»<Ÿz4‚À\‚À‚wì_Ÿƒ>Ii‚M!m‚ƒ]
ƒKZ#/j…tl…i‰>.4…UZ‚+‚jh={-„.6ˆqˆvR…m7‚gdG‚4+\E‚P}hm…CB‚%]kƒ"             2z,˜‡]&ƒK
;‚ƒo‡8lŠ+†uƒ)G.E‚K6-
‚\‚`‚:)!
2#L%s^‚@B<'df@nO_0
5+‚'‚\D
‚p„17(u?&cn*`
1$[Y+K‚^ƒ8
,‚:7D(sg
.G{bs1Q3(|1"Bs_dC‚
W‚@?†Q‚7p
‚j‚K

B(‚N[i
‡L.
ŒubT‚q‚8$C_O'ƒm„@!U„c_dWp‚&‚PF(?RFP
y.‚1‚hƒE‹S„f
˜lˆR˜S“‹w‚n.ƒBkŒv\‚"2w>~r0TDx(_a
Iv92ZHJƒ†Rƒ(Mlb$SN‚1‚;I$‚U/<6;‚-…[@v+\ƒ]}j    „‚E‚cƒO‚R‚p?‚+iz‚>{ƒƒ\z‚;‚>r…F†i1ˆz‚F‰#ƒB9mP"2/7‚h;„)P@‚9Hƒ:E(‚^‚TJ‚F_„@R^w5Tƒ`5¡     ‚ˆ3‚G      ˆ[hƒ|†Q`‚Ršƒ]       
‚GI…u*q:‚t‚@‚V !s"Evƒi`&[iG‚6
ƒX;g$0Y&~‚Qw)‚N2y /2…w|~†w#†j<‚lƒ\dq
R‚hU'‚"     wpƒ9h|‚fG/‚‡~Q„uELƒ"†$…H‚i‚|Š     /?"&3a
7
ˆTb‚…]$.†M‚\
„
@D†l…[    N„<†&‚60‚0†Z…/‚"A
Y‚H‰V‰BŒƒRTH‹D …W„O“`N† ‚m
!‡g†(9‚~†#‚6‹v†‚W“Eƒn?)‚E(<  o…[…2‚$7;$H1„q  „m„#‚L†zFe!kOi‡/…B*…hL‚†9Œe‚Z&„‡45ƒ9„v„?…N‡„Z‚5*7gzH‚1…qƒLxƒ[’b..‚d+;+OHB'.ˆ%†FÄ_‚=ˆS&( O2J,d
„KsWbzƒ5ŽgŠbCƒ‚*6<‚j‚6_"‰k>‚=
"9‚‚Z‹0DŒQÂ@K
„$
ˆH0ƒ+/0V“iM
„    ƒ(0"Lƒ.ƒMd…Z†|ˆh”),)^ˆˆ#2†‹%%&‘.&’-“a‹Wn1Nƒ.…I‹R„sƒ|H†
‰':w1N‚c‰[‚*‚ƒz‚pƒlhZ/Q‡"ƒ%9Q„ƒ8Ž-R‚iq 
,5#„"‚+‚"
a*H8_bPY     m‹HƒXƒ'      '‚{ƒa0‚Ž3-,…„B7‡Adnƒ%‹~=„
i::Qƒƒ@H1‚^—*x‚d#;„v‚K=B—T'‡F‚<‚IOŒ5P…$W2‚'†H ƒ#A3u‹]ˆ<‚FŒ4–R’Q(Šz‹vBbƒ‚zŠl‚@‚Wˆ@…$•w6H
‚ID.ƒŽöƒC„O3‡g
`—7=qL
C.}       ‚|‡U2w>~
0Tx(X
(
I92
HJ‚‚AMDb$K
)
J‚;+$
/<6
'‚-r@v+\8j       ‚>7‚R‚p?‚+iz
~{‚{ƒ\z‚;‚>C-ƒ9R„.'ƒ9m‡)2/7‚;ƒ8@‚9H2E(wD‚9_‡3DwP
G5J‘P‚ˆ3‚G   ˆ[hƒ|†Q`‚Ršƒ]       
‚GI—‚‡ho !$"EvƒF`&(iG‚6
†yi,
""ŸV˜€€€‚¿0Ãrþy&
g$0Y&~‚Q)‚N2
[ 2|~ƒ9w#†j<‚Fƒ\q
RWU'?        wxpƒ9h|+c/,
‚>Q„FEL-…+‚iv*ƒ/?"&3a
7‡?T‡a
     „Î
D
VT„Xo…W„O9N† ‚m
!‡g'9‚~†#‚6ƒNÝW?õ5*7‡= H®q    x[Ÿ‚‡$‡i
„d+=¦\& O2>f YQÆ‚ƒC‚t‚*‡Y:C
S6d"
|>&
‡]4‚}ƒk
*=—_S
ƒZ‡b
%    —7
O—4bTF-&‡(K3
†
2ƒv+‚%%„W‡†E‚Bn1‡X_\„A
‚/H…wj:w1N‚E+
dƒz%=#M4—:/
f}R‡]       
L37"
‚+
a*HPY  mHR`5{'l0:
$-,pz
/A;OC     
T=¶
‚d

;®ofV
‚p',WO`PmW2.
‚'ƒ#A—1‡htaI‚5Ui
Žg(‚U
Bb
3‚zu‚@‚Wžygj[`‡^D0mail–e„`ˆL   
‚E
""˜ƒ              W
        •K
  ™   †"ƒŠ†X½>¾6
C
90S     
‚E
""0              W
„ø`7õn%I!+ƒ4†ƒe9W
‚96ƒ:5Š(D)?
¢-eM   %

R.k
B   „!‚Y‚#
‘p

!&jŽv
Dƒ`‚Y.'†X¨Xqz«
Å
‰:™
O6ˆ ,†.…œ$”m‚*‰!™f‡t‚u‚ •
C±X
’!Ád‚h‚             X…g    Žj„<‡Š    ‡¬\N/cK†'FXg       ††ˆ)ND
@œn—} ˜n•dƒ.4‚`‰^>ˆ IŒ4‚L{ê7ˆ{ƒp„9“]Š„pZˆrª„Y4ŒK“
ƒj…k>        @gq"|„;‰"?„2A&Q<ƒD#‡ƒ<H-Ž†Y„R‘Iˆƒ}ž`‚;E.>‡Œ#u‚"p[‚&¤J‡K…=³O‰-*†‚T$o=D“i‚&yk”y1=[      /HÇdq†_Ž÷ƒALU‡h,'q¯
‚
 ‡,
K6‡nkS,‰1†.…œ$”m‚*‰!™f‡t‚u—0%‡l† 
C
X
‚…,Œƒ.kÒzO,‡jND
Î)‡m‚g¦2ÕT>
‚2I‡g1‚L{X—:A—0:>2]¶QŸ/‡ 4P‡k§        ,‡f
8@"X%a„2A&—+OƒD;H-0‚7iWRžeME.>‡i‚!—6‚?ƒ9—4‚T$‚=S9:®I[/Hƒ U16‚–þ„._db‚¢A‘‰Pli‚;£<•ù…2tain’EW    (ˆ
ƒP‡|ƒF˜A‘ ƒ(zÇu“8‹XÔ,ƒ'„7+„ ƒQ,n"8=1C9+%Îd"’„>’pRv…n]‚
‰„ˆ 
*ƒN‹X’ ’5‚e„8
;
¦J•Zˆ
"Œ„A?ˆ Q"…nZÒ3
/z!ØuPw‚}‚d“/†C‡)‚X„œLŽ_îtƒ!
‚ei‚
ŽöRK¶d
A   ®@+‰¦‚Î
6"1C9%‡ŠJ

rYY"
Kü‚|”?¾‰v))Õ|*#+®]|‚w‡h¾‚k®M
-z¯2L¦K;‡xå‚sp¦6en‚
„lˆ{5]„*’p‚^…ƒY(Zd8‚5`;u‚-‚Fa!%Lƒ      59Q},p‚
ir
ŠH
l}oh8‚f„t‚*w‚y‚‚*„oˆM„.'‚uJƒ‡
)`‚ˆƒb#8£A‚b,M
5ƒ`”ôJ,
‚‰KjorjgR 9—G…$´f‚?[o¬U…I ‰„W& W Gw…%L†'“VŠQ…y‚yƒ„X„x

‚Š>Ž÷y9‚‘!‡G
&[oƒä2‚‘7
-
ke%R„ƒV
0‚'§wŒ[„*6…    (9†}]"‰`pŠ/…LL"
""ŸV˜€€€‚¿0Ä]]ƒo-|‚šCs‚]
G~"_"ƒ2
+   
‚O7‚<‚)[
7ƒR  X@-‚c‚t‰>…t„"‚7W‚      ƒz?0‚t„Kl‰a   †0†_Jo@†4]‚H
‚|†s5‚0†95ˆqˆ~H2*‰‰}ƒ
ˆ)’}‚F‰i6‚+x2ˆ„Š{©ƒw…‚?£`˜!4ˆ^„ƒ*›8‡cAœA„••
ƒ[C‹)ƒEƒA†%‚U&‚_1‚IJ
K‚E'
&˜:¤3«n†}ŠY
…#…{ƒV   ƒ[3ƒOT‚T0nƒ(‡-g„t‚8o+„`„†(ƒ ƒ1
‚*‚W!jF‚U‚\1‘W…u)Žn‚y…'‹;
„‚;"B†18‚U`/‚
‡Œ$‚‚e8ˆ]1@GƒBƒ…ƒ„.B
2‡|ƒ
…53ˆF›[ `ƒ4N‹CJH&ƒ]-E‚i‚Q…d‹8Œ  ƒ>‚,…{†&‡>uK;‚ t‚=Fƒ/`A…d‹
`ˆX„KbaR†)n…"is,‚M‚|‚[(‚†Ot†v6‚J‰!‚n‚8†‚\8‚D_‹7E„:…%„0„<Bs1„!‰’K…
‹@@ŒS‹v‚ˆq7„mƒ7…g‘4/F?]…2†X„|ˆPvˆ_4‡>„
„S† ‚/&S
‰8ƒ}Z-dA‚d,Mˆs†„7_„„Yg„+‚56‚9‚J†5‚{„)„S‡Nƒ†‚`‰6kˆ   †l$ŒjŠ[ƒ
,‚+Œi>‡ ,“X‡\ˆld‚
k:e„?r.Ht
b@Jˆ3.†1‚0ƒ‚Lƒƒe`M„{'‹Cs8@‹dº
0j’d‚G
„.¤„ e†,Q‚s„:‡Cˆ\0Ž0!‚‰+‘›/“s§.Ài´•…  ƒC†=
h0‚˜<‚/…KƒXˆwCŒ]‡+aSRƒ…1„…>v‚j$+0„Fˆ@F/ˆK‚`‚ 3o0…TH‰1ƒ‚‚WƒB0ƒC(‚[
„‡‚j„5;„(/ƒEe‚
…j%U„
Žö‚z
ƒ25
b0UH‡ƒH2*—:yK
K*B.‡aqrhC‚<)ƒ

ƒq‡0
.„—=*†j‡cAœA„••
ƒ[C‹)J_v‚wS&"_‡Y.‚J
K7'‡jH„#.Pˆ

ƒ-v—9q¶‚w
—#E
H]‡ap‚\1Šx…R„
)Žn‚y‚
'‹;
„&#J
8‚
P/?$&$8I1-G?QƒNÎ]
‚9NΗ‚4#K‡9‡l0Ÿ9oƒ!ƒ"Ÿ‚>‡)‡e_O†)n#s3/
/‚[d(:6‚J;Cj¶,o‡igd‡`¶[jƒ‡Z)—53v"‡V
# 4‚ 
{J
*M/‡9'
‚Jg®j
L9$5‚‚
a‡N.Dn‡&*RE‚‡fSƒOs,g
c>‡ƒT1†‚b_‚7h‡—9

tH‡R—7FJ1
(0j/¦IƒR‡O
F¶u‡‚k„w
Y‡"j‚$(Lpa2—„veG‡`*PlDF/3a‡V‡~…yom5Z|_M
("!'!B;
>!‡ZO
#   0makedfltn<‡fil‡Yg…²d[ƒ~“T§ÖaŠ"(ƒ@‡v‚dY
;ˆC       Ô"‚%½+D¶E„jˆ;[‚ƒû(J—
zúNÆG
m"¦` idxkei‚ë^‡\),•vkei‚ú=¹x•3record‚.Ÿn“†h‚hR„Z‚u¬‚?}2Šˆ4+…4‚#»:’:£KðM„3ˆ#Ü[.‹ “†h‚hR„Z‚u¬‚?lform       ‚IˆJc”>E|Š;g/    {™y     ›2†–|ˆ`üEŒ(-g/ùr.Æ&‚punctRb‰?œeª|†‚9!¬yƒ-•NŸ~2È7ŒJ‚ZÑ~ÆpŒq˜0k6ørƒK<!E2‚Hƒ-âC Î,,Ê„H¶ Ÿ‚6Ý,0h
iciƒ.‚bS‚„2Ž7„-2,†Yˆavo$(4H#34%Œ9‚"<_‚8$`‘ˆƒ$
$nA)U,„1vo$(4H#34‚°S%<_hloc& $     V+
\3+‚Nt4
)wˆ
Q#>
Y/‡j„O#(††@-(h
‚n
8dg…`{‚2‚Gƒ_‚W      ˆ7…t— EXe-
""ŸV˜€€€‚¿0¾‰b,µ1‚ †5C'('
““‚9À6‚ŸTo!#5‚P…]Ú‰‹Gˆm‚¤b‰-*‚*‚Q
ƒ9ƒ‡‹O‚FŠ™pˆHL&%"yH„#‚]WEZq.,dƒƒ+     ƒWøkbƒ_‚    †…t‰b
”        LC'('
‚‘2‚ß‚„Z‚HP„p»‚T¶S%"y
AOWZ
      ,dLF    ƒW      0malloc64&_‚+]?9("mL¤l
&}ø+†Ë[$I _usable_s‚
ˆstù]
‚tn‚˜"Œ<—†;ag˜IGB&
088….3-H
  WThv¥Eƒd µv‚l†2%ˆC
‚NÓ$ƒP
‡s5
        5Š$^‚T©ƒ6ƒ.…k‚}    N‚B…Z˜cŽ    ‘_
4œU
È)„zn?Š9‚D‰      ƒy‡/        †    ‚P¹_¬
‚’3ž~†Ld
a¶j#‡ƒc¶…t
3ÝO2—
N‡ŽWJO:åL-


        «r
«2$Ÿ$—[œÝNYÆ$
v‚P/Ÿ‚W‚LŸ7datori‚‚ƒŽ— ìRí1
ƒ…ÖQ+7elbrot–‚•IiG?;ƒ[$ƒFˆB•’9†oŒ‘¡017        
1ƒcnx‚E’ƒq2ƒUc‹N‚-Š<@
‘z&†     ƒ2‚q{ƒaS‚S„`‹H·ˆ=œ7™_— ‰y:¾E¿4Šy‚h‚Zƒ^3o
oƒOƒ_,V”¨&‘=eƒw™ŒƒOJ
‰ 7„a…9‡E
‡±…dƒ%†y&5ƒhˆx‚K…_žy¥V:‚‚q)NƒƒG†@…%‚-ˆe‚CG]ƒi†h|† 
‚Xˆ@‚M‰)Š1XÆk‚\}}Šu,‚‚9?2„8&‚V5XWHl
Q¬ƒ.
‚?‚‚"
u‚9„Hf‚E…P$‚FŠbƒ)‡i"r„mP!ˆ‚‹@ŠjŠ^A,()•w„o„aƒ%a^K††r
&‚r‚NS…,wˆB}…fƒmŽPt‚†]8™ªP‚‘‚N…‚Y}’6Š8„G*…Šwƒq‚f„4E‚y‚~‡ˆ(ˆOˆ„‘‚=
Gœ"Ša†;ƒƒ:!^”So„›&…"‹Tn‹'A‡KŒ@‚[ŒuB–6‰e†!;^+£o„M4…j ‚UP’e„Fmˆ6‚k
‡[0…5„(’0ƒ
•D    ƒ["…x„„‚fŠZv?$„Wª4‚c— MWŠV„‰NŒm?      “|˜ „È_ˆ1„Q—5…
‰rŽö|ah‚-
‚b@‡#—3$wHv{%SeN‡ƒ6„v       ƒ‡)6—A©w¿4JE3

o‡‚o-‡d4…Iƒcƒ‡ƒO¦^4‚x®¯8‡i#>&$‡3‚S;@"‡`
„5_‚…}Ju     I
)NAO>‚5iN+SZuNfŸX§       )
}„hA‚>—MGA‡&)
‚(5
a^K4¶,"‡u¾1';…ML'y
+‡ZxKJKEh‡‚_-_Ÿ
@
]„‡d>Kƒ-‡ƒ^)
ƒqA…hju‡YBƒ0+®_
9^‡{¦x
‚UP
4m   i¦E
h    ‡d
0"c®g
„gvRj‡wG.‚c
,—†6‡‚zB  ?   †QS]x†C)_
‚
fest‚
†    *\`ƒb       H„G‚h^ƒ'u?Af</        ’G7…(‘@R—†
4G‡ƒFŒQk6     o‚µQ‘‰MFpul5Íj¡R‡i ƒf’
†q‚6
†[ ,µ8
É%ƒä,    ü…7Ÿ‚4Îù{*ner•Fœv¯-ƒ(½`
*l…Þ}tissažkzƒ#„D‘¸U%ualƒ‹\
;lc™v
ŒH*ë       „/ŒA†"¶‹     a|nƒb0¡S8‚!ƒ‚=ÐX‚Pƒ;Ž÷ƒ(üvJˆ|ô‡…=sxâ&
nO‚÷‚        ÚT§
8ˆl¶5el‚”1‘‰6Pfactur‚‰M
|„1„)¹$˜:‚f““Ø‚G^ƒ¥œ.5p
%'
Œ3ŠTZ)ƒ"•m
M$¼A XŽ:‹h„·6R‚ZˆCÌUŒtùxƒV‰
&JL‚fJ„zAhht>"‚M
""ŸV˜€€€‚¿0!·E.0z4I'!!W(
-$*K"‚^ˆR

F§Xœg“g†@™I!„ZX‹#ˆˆ8ºH`:$à˜7y8$ƒ6Ÿ|By7ªN
˜c‚CŽþgPZ)ƒ §a‡}+ X        
\„R‚Z‡‚—¸Ÿƒ
ƒCƒü`ƒc‰
‚Ï‚8Î 
5¾-&ü„)‡_-‡2F!Ÿ%(~¶v6ƒƒDV§!`:$Ý’C®nƒ8—m
!
By}
Ÿ
co0mapl‚+„scap‚§frch‚å#ginžz‚Ÿ1‹9±U“È‚}‚‰‡VùyiŸk3ƒi‰8;ƒu
U*!}‚,"[aG#[e#
8+
†(I'†Z
KQ    Œ'«bX˜xšx/ú=b™9*]
C
εk       šX
³2‚% 
”?—H“°b–.B.Št t                         -
8MÁ3‹%Ž÷
KQÆ+X‡x—:…3xG-o
ˆ_b
7*]ü‰Yl`ƒeb 
®y'„Br—C‡`#…d¶S‚8   &„                              -
8Mœ2.Ÿfdownƒsƒ
x¼j—Ì<ƒ
x!
9er¹æ1½ˆ¾
5t‚
Œ9ŠORƒ
;‚/“ÑDup~³+„FŠI½?+å‡|„Ñp
shal‚ŽStin‚d„aƒ$>–&'B•Ú>ƒ'ƒ$>ƒ{'Bsk
5~‚_N
¥{
ÑQÛŒ¢8! •|G
 ¼\     [a#:½JžÆHŒ«~G!„ðv
‚
Ý~ [a#:sT*¾c-4;2 „…Tƒƒ4ƒ8
_”8    ›.‚=*<’Tø”:‚ßB9              „'!
5X›~+‚È
:Ýoiv‚Ä×
ù"\t‚ÜD&#S’
Ìt—¥)%Ö,er‚<‘ _ytchw „&…‰1

‰)K>• Px/o‚`
"&‚‰r
.
^")#O9†U   ‚1-VD       <‚V:() $s%]‚F5‚
Š4†(—I+‹)‚~‚#T .s7…T0`%
            E        Q         


j
/
"
.

++
      ‚\‰-&
%'$6IˆX‚fdKG8+@
      q4‚     :5
xg_uK:8…6†=ˆL‚P‚X4( %ˆ)  +I“7•-       6‰    >³+„b+…,.“Q     
‚P‹X’t‚Gƒ Sr!‚_‰jd
"*`F+XY[EE‚Z2/mb5 G
+
!j',‚s 
        #
{
!9p

-9 =F        :j
zx+"1Y+ƒt4Mƒb‚C+/_‰Tˆ
!ƒQ#&",…Q+‚fz      ,       ‹N             #F    (       Q‚04?6\LAWC8F+‡H%#‹-:ˆn•#9**K”q‚F$§Q0=“_Œ}S~A‰SŸD‰"…!HhlIŠ,–7
"—6?M‚‡w-2…m‚,LW+¯C£j‡o‰^‰h"EeŒiŠ"*       (`C$T„'=ƒRˆ!Ä
0—G)`
<.‘E„fˆ4„‚i„Gˆ”nÃ9££K8ÃA„h*†Ka~Q«mƒT‚ )Y>ƒt:]“1„ŒaŽþ_‚V:)   $<%]y5‚

ƒ>4¶‡c"‚#T .s7K!%
         .7    Q         


(j
/
"
(&

++
      '
%'$6I‚<
‚dG+
      q4‚      5
xYuK:8g-„F $‚X4( %„g +I„ (  6‡‚T—>>ž]„b+…,.“Q      
‚P‹X’t‚GŸR!!‚0bd
"*`F+XY[
?EF&2/mb5 G
+
!j',*? 
        #
{
!
-p

 9 =F    :(b
zx+"1Y+ƒl4Mƒb‚C+/_
‚(U
!ƒ4#&",g+hT    ,       "?         #F    (      *‚04?6\LAWC8F+)x%#ÎNŸ‰09**Ý^
a«‚
§‚^i§       gI®Õ)?MP-2‡‚
:L
~+Ÿ!\—‚Ÿ‚eƒ'"*         I
X$T2=KR=‡w7‡<!„b
<.   le‚ruŸaQ}‡†4§-!í ‡h8a~Q{c)
®[
]/‚j
‚xÅ|5#abl—"-KD+…   X„n
z¾7$¾?oD+eXl
zinfo~hG&„5i‘M”/m>‹PO‚cC
‚H‚^A$
'01‡W}
ˆ$ŒPGŸj“V0/(#RnJ$\M#;‘|½
t“k¾5G¾A5iTm>6PO‚cC
‚H‚^A$
'01`}

>$Gun6‚]V0/(#RnJ$\M#;›†K„Ñ\2      Elenv
‡Žÿ}
eri       ƒ9
Bƒ8&!'5
(".   B‚
""ŸV˜€€€‚¿0¡„'*œ#P5
"Oõ   Ú%
‚~   93‚@Œ
“KsŽ)
$FA'ž
^
‚‹:½ažÅWŸ9…ŸO$
$FA'¶†)»9
ƒm0math <q£yŽdUˆQŒ@ù
ˆ2¾;9„›       …eemat„3
XšRADƒ%G$“‘/µQRAD‚
Ÿ@ƒû…l‚™‚'u         func_initƒƒ˜Š‚rix•‚Ž+;7•G”ô}oÝaÝgt‚b
‚v eržt•7ež!Ú]ˆ"¸1      †nˆi„@†}’S…³Ÿ|ˆH—k
`«p–‡—sµ<¨:E
‚L
œ*“-Š>…k‚|IŽ÷I¾ˆ‚f‡m—£c‚Yhœ‚ù_2‚NÖ~üo‡b?‡kl§S—l?ÎR‡ƒ)Ë
Õx.ur~
M‡s]¢j½c ƒÜ‚„ÑHxfŒ"•FC% |8#—
£
^
Ÿ   ˆq8Š7„†)
ˆMƒq
…
¹k&ˆ\

”.7
Œ!         ‡Bw…%ÜF
ŠDÆ"†S8¶]mƒ¥k;ÕHÎ3Î       &-œ‚0
_allocation_s‚¤„ù‚σttach‚G
¢`Žpø|A†…„column…Yx„TSR
¢aù_B
mpound_select‚Šq
¢bù_Cdepth‚¡Qù•^
expr_depth‚ˆ53 
„    ž\ùƒ$Dfunction_arg‚
‰%g
¢d'Qƒ@ù8E‚°TN
Llength…g‡}-;Œ

–cƒ$
¢e¶9Iˆ‚n»Fike_pattern_length‚‹k
¢fù_Gmemori‚‘K†ù^…X†map_s
Brˆs&
ˆY»q+ø{ƒˆs…Þ@¦„Jnam~`
page_count‚„t/
¢g^†f³ùH…Þ†f(schema_retriƒW™L‹:øY†¼…F    ql_length‚†5
¢hù_I
trigger_depth‚  ªsÅ6•Ú‚ý
variable_numb$‰L%fŽ
¢iù_J
worker_thread‚”†ù^ˆ'†i‚S$†„WS‚Y(„0‚<^”Õ@WS
X(‚_
^m£=`
Ž…íEV G…eŽ÷2
„¾@B‡}z¾y£lum
ˆHJ•B3X
‚:†]‘$‚#‹f                ARg'

,    
>7
Œ<‚80      W=ƒ,„)ƒq„…lsƒnº|…iG‹b² Ÿ4¥Yˆ72‚¥]Ÿd“F¼Hp‚h
d4
B           N.1gL&'$8
/,
))
:2|„Qddd\[X\[X\V[[[[X\[\rqhrfqqqd\[X\[X\[XZTYYZrfqqqqqqqdXX„T‚}>‚]2ˆh'†N],„6p‚ƒ‚‚`<ž™{

        b‹ƒ&
ŽPŠ\‚™M†Hƒ+ƒJ*Ž:‚K$‚?ƒ#       Â
&Š8w“xªyF†*ŽU•"Ž>Q‚>ˆŸ4\|Îj™pŒ#V…T?G"&‚ƒ…+’ w ¡IBˆo–
„ Žþb7‚‚x¾
‚        HRžv Šf¥Yˆ72‚¥]Ÿ…T5JÕ\|ƒddd\[X\[X\V[[[[X\[\rqhrfqqqd\[X\[X\[XZTYYZrfqqqqqqqdXX„T‚}§x2('†N],„6p‚ƒ‚G<˜r[


‚ yhŸ‚?*‡m®j‚KÕx"8
<    
    ¶AV
'‡‚6®‚&‡Ÿ†-ƒj¶\§
Q


\í‚'ˆAŸ
&p_Vƒ?G"?
H|‚[whBž~H—)
‚q open‚H…S
2“ÿ{R0pgcnt‚Í;ݸmsizƒÎh—Ì?x‚S…„Uˆ‚?[”Õ9
vU‚U
[yb‚°9an  6ˆR…_†0Ü›kƒ½!&ƒì4*5„aJnard‚ˆjb‚
ƒ    ‚`„_SŠcû^
w    ŒR‚ÀƒTcv’P"0‚3“r        X5ŠF$9-6†B„*/‡4„Tƒf"‚w+Žþ}
DP‚‰%
X5     "9-6[ü8‚ï¾M
*"ËB+afe‚.‚dƒ.kai’€Hd‚‰‘þash‰n‚a‡9œfa6ƒ=¥!N
„c†_ž:‚U¿aA "
„
ˆjó~3Sx„~_®ƒÅp‚ÐlA "—
§
;e‚!…Q#g(
˜-  †&!
ƒ,eˆ<—†an‰N`‚0„q’2~£mƒn
<
=…$‚$ƒ@
ƒ0„Z‰‚Vƒ'ƒ„=ƒVh…NE       ‚Rc–Vƒu ‚2 ) P
54
 
)
@]I9}‚‚_ƒC)Sl:‚U5W,)$#*9O(B
H11-"=Wˆ"/Q
90&3
""ŸV˜€€€‚¿0Çm$‚Q
HJƒ_H‚#&‚Š-„]S„o"1‰5
ƒ
&„V„4‡A‡"‚Oˆ:g$=SJˆ0†L„   ‡+„u‚‚  ‚[…e<—|Žn”l;*ŠzŒnD„C˜.Œy‡@-8‘{†78]uƒvŽF¨3:„F†d#„
…z„H‡@ˆ0
‡}-$Äv†Ma‘,†\Š,¬HT„J]ˆ
ˆt‹\’KPŠ‚
Œ(        ‘g<‚L‚7„,d,1`…q”'‚+*ŒMƒ\()’(„_Dƒs9‚z…]†rF‚MFu™…Fk¢"§bŠC…C‚FˆK[:‹tƒO*.‚`…ƒˆ
y%ƒB†V‡|„Œ…#’l‰U.‚hj.ƒ[8†]š„*ƒ#ŠVST‡uƒ/„v4e
P‚l†5˜vdŠ/0*r‚P´gƒ\‚
„9J†'ƒ$u‚‡/‰‚bwX0\'
‚D…?…g…“_ƒq†?‘)~u„t&„ˆt–…},¨ƒb
‡:V†a†+…\!†@„VLS‡U$k„Pƒv„B‚z"9{ ƒI„W„:S‚3<s$Y4w‡6„H–@D  ‚!Œ‰eŒfj„F†cN„‰S‚?ƒŽIŠGƒ’m……J2‚sFÃhÍ$å2)……b8„p>†^ƒ8‡'„&‘&ƒH“ŒTƒƒ|‡”®X6†:         Œv              a’Cƒ’i‡‡…n!oŽ‰'ƒp`%(„&ƒŽöu„3Hƒ\P‡‚‡i  ‚‡gY
Z‡f:Ÿ-
,;‡p8‚k
„!
„GLtYH,:¨3:„F†d#„
…z„H‡-Œ.
…da…K*„_T„J‡@‡‚/Î5T—9 ‡^7L‚7
ƒYd^1`…q†Z+*‚Zƒ\H'‚*"        9`-DF‡«qz®*‡gA
—TƒS§k9#‡Xj.ƒ[X\T`‚¦ZQ—J
T
P¾2%FdD
*
9‚P_E‡VŸ+jX0\e—      DŸ"W‚@%‡]‚7†?m~uQ?2&‡‚xk  xz‡\
„@
R3/‚b!R02NG‚‡o4
E„P
q„B_"9{—‚Ms$Y4w-a
d    b        ‚O!-UEž‚‡ˆ‡Q‡ƒA—7N1"…b8„p>‡g>‡‚`=‡f
ƒO"!
S
/ƒ|‚Y—6‡…"@h             
             ‰o‚?‚]‚)žv
‡0meaning‚p‚1J
g/*‚'”T‚„=
‚b'ƒo•w‚'ü…t«2‚°‚[Î‚‚°ƒo$less:UƒUŽ[‚*Z>«:ƒ_‘·>z„†P݃_t…e‚„!Œv·a”V”„t‚×u.imš]Žø„sur‚*
$#TM

B1aˆ:‰1453p   
*.+   ƒ~+[‹Hƒl…
m*Šx‘&"‚2MC‚.V:n#  „C\‚S ,ƒ+ƒp‚ ‹WŒD†7¨‹„^2Œ/†a   ƒˆo,ƒ
        )x
LT„…GŽþ‚cb‡e3
p       d++[݃Ý_
3¶0
""
2üQý‚Æ‚eÝ`]&¾Cí8k«NÆ‚-FŸ)x
Lhchanƒ
!
('*L‘v %!
JF]`
Š<†y_…}ƒ•ŽQ…‰QÆk„&‡~
‡>›G… Š/‰j
‚*ˆ(Ç …_^$W^„UWˆH
r‚
*G„^„14HY@†LN
‚A        «w—Œ‚__%‘IŠ,‘PD=Ãr„—z¯f¤JÈHƒR‚J’e…I‡m·®$Žy‡WA‚D‘4
 ƒC„>Žö„Q=¾@k—
»l®iíŠ_… 6—,
g‡gÃ,U^$W—6WW—‚rJo7®E„A„14@NÍ~¶WŒ„r‡‚6"‡`B‚9¶9§f'Bõ„lžq      FYMV+IQ
A(‡O2Ÿ ‚adiaB
‹W
•fe‚K‚WdŽ+†'„Z=‹ˆ_‚u‘dŽ÷:eƒ†$ƒ¥ƒ—6w‚ßQ‘R8„‡
  ŸX˜€€€‚¿4µ[˜X0medic‚um‚‚D‚VšF…+‚e‹ointŒ)¶Rhety
Hƒ9U6?³{œ‚eˆo‘;     ‹N—9”l
ñ<ê3g—ƒ»5Æa¶‚J݆2ÎgabytˆKdƒ31„‚
›‚p„
„YR…n
‘X
Ž’Xî[Ž÷
ƒ11Bü>ˆ„jƒaR¶‚.Î9ƒÌdWm‚‡(•RÉb/_hƒ †XÜX
,ˆAÉb‚ït
_ƒ 1‚£2‚,
£
_blob‚Â<™FÝX-n™Fclear‚Ö$ÝÁVint‚ÂNÝ®methodjjƒ%R
Š%‰5•Y—ë]>subtyp‚£2ÝŽdundefin‚ç_ÝÓberŒQ!Ñ-

„<‚…q‚#†@
‰    

6fC4
œPØc=.,"\(E1 #$*½H&Í2ƒž«}
‚%Pship‚N]&U
-ƒ*cmp}”:‡p®%%
’‹| ‚;N
½(
„]…(µ?j*
2§™9%%Ÿ=8ƒe„á|(pi‚£ÿ:±\‚<‡ÝŽIŸƒdŒR^‚‘db1‚)
ƒ$
_default_maxs“ršOùŽ\ebug‚
Ù6®S£ŒQ…  ‰Mø`f…õpí.XM     1‚a–þ…   2‚t–þ…load‚û|†eßqmax‚Íoݹ!ov‚3‚=“šAoƒ¶,—ÌM
-ri
ƒOg   ƒ    P
ˆ.8¥X
Š^’IIˆ*'>"

(?Z/L
(<
j.     I0‚L
)B
1
%‡{*
#E(;>'
`
#        ‚\‚ B
w
6+
Mw8†;N ;M
'       .T
&(c
…#$„B>Oƒr…S,L<‚kPƒ6
!&2E5
-      

       l‡` O
R ƒqƒ
 /?‚ƒ2XThƒ…2<F)'z$,V  Ri…!‡g‡*ƒs#+@)      !$K
&8‘5‚
©9†‚]„‚=–N@Š"D…‘-’C‚"11œ8…uM„;‚*Š}’/Ž3‚ Œ_Ì v®8P6"{]2ƒ+‚j-
4„pm‚CBT„\2` „bY
‚<F>p„3†] …X4
,‚Sƒ{‚P8
ƒY"†1†,"‚zR†eG‚'   †f


4g…D…g  Žp=    ‘;
~…M‰,E0q@ƒ&‚
‚&m•     ‹RªŠ2%‚^        

       M1(……iL]Z–g{‡,  (1/ <
…
Db‚
N|a5…xFLE.0z4FI(       (
AlK"‹M%‚…!‘2…        "ƒ)<ƒ4—~.yZ
‰J†>„E„ˆl‚\‹R‘6|7Z1%¢wN¨QƒqKˆW\
#‚}†KŒO‚‰JT‡*„B„l ‚+ U&†Z…zTm„2
"

‚&
ŒxWJ,#‚0‡k
ŒE
‰%#q<ƒ3Š{¯‡ˆ{(W‡='Š"ˆmk-‹`Š{‚!$†y(ƒ?“A'ˆ8"
2%†
M      )
I3#‡Z%&‹u/V ‹@b…mˆ^PI f‡A”(u(|  ‡
E"`:$ˆe&g„@Š4‚'‹„\0…@…g‚>†iƒ?„^ˆ)ƒ4…IkDƒLŒa‰*;çž^^21w–yŽ%4_ˆ:‰…p‚,
${4ƒD„KX ‡q‹b    Y=E‚2Nx8„BR)*    

    '
        

4
    
$     

N,-/U;2B1-0
I&T4
@1:

 &+   
  +
   2
        *?
!u-$((A*D
!
L)      
? 
<
0(/





"& 0<+
=\  Z&=
"G     ï


  „s‰(e=!‚D“X!t=Z\
‚CFRƒ^„00
Žöyi
U!?n +@)!$K
&‡&‡1Ÿ…E
ˆ&‚N;
o@i’C‚"11œ8…uM„;‚*Š}’/Ž3‚/†$)
„vP6üW>p‚Bƒ] …X4
,‚Sƒ{$8
ƒY"(…/†,"‚zR†eŠ‚'   †fh



      G
p    
= Z
{‚…BE0qK?
M
bÝ
Æ'cbÎ
"PZŸ
"‚B)<‚7‡*‡`Z
c0J     zRÍ1®…Æ„
*"

{&
WJ,J‡]rN
ƒ-
„Q‡j
=#®Jm{‡q
m~‡
%E
9vE
$O
""ŸV˜€€€‚¿0¢U•üF
y'ƒ6"‚Dr-"„fŸ     ":‡i?
ƒ'U"
—$ 
…mPI f     u(| [E`:$&g¦I\
‚k¶[‚F‰…p‡d;‡f"E‡h
d„X    XK       8=]—ƒ8‡d>)*      

    '
        

4d
    
$     

N,-"U;2B -0
I&"4
@1(


 & 
  +.  2
        *?:!u-$((*"      
!
&)B
? 
<
0(V





"& 0<+
=\  Z&=
"G      l

  "y=!Z
!     =4Z
C\*^M0—
0memory_alarmMÎ)¤>,iù‰highwatK,1        „f‘C
¦$ƒx‰bø…P‚Ï‚usK+  „e‡‘A†g
¦]‰`ø~…N†gƒ-pag†l—‚6set‚3‚>“šA izƒ/—ëX"t‚Md”¦}!at‚M40
S8„N”¦740
S8ƒNor‚ú|†?×l„:ys1ƒ“G—ë\2‚®=-“M‘ˆY-†ã$3‚¶1q“iø†òl@4ƒ”^—ë55‚¶r   ‚% $H6‘      /K6
$        “X9}‚X„)øŒI†òk"      /6
$           
‚J9‚X06ƒ”`—ë77ƒ•—ëh8ƒ•—ëitracƒÎp—ÌGvfƒ‰˜Šrlntal‚‰t‚2‡4ì1Z…æw³[ion“VgƒŒ"ŒŽg$:‚kƒ.ƒ—d¨·S¥ ³P\¾Eƒ6$:„Âœ8… orship‚ˆ8u{
ˆ=0
‚
        c     Z…^„v¥h
bar‚‚3rchant‚’guri‚‚Y‚#ñ6\ƒìBe‹p
Kƒi¢/„-G1ˆJŠOƒt„D
…+„t…—4Ž‚”Kj“Y† ƒL‚w†HŠŽ‘M‚F†zž1Œ{ƒS ‹9‡e†.…#ˆ.
‚‹6™6Šâ-
…bŽö‚^;®‚I¶ð]ü‚c—8—
‚¾KN”a¾=#‚'dí8¾8G‚F΄yÝ[TÆ,<¶U
‡hX@®iO—>‚¯ƒFgƒ<oy_¿!'#140&#„k
2
       ,/"
I^               k-4%
O‚z“„5£CàX`<:Ú;ƒ      G#1043
         x˜3
5„o&‚B-$Y„&.†83‚‡,
}°0
˜I‚Q˜,   
‰EŒW‚%)½TA!'#14&#.2
       ,/"
I^           #   ‚/4%
_
z„5žjŽuàXŸ
ƒU:U  "G#10( 3
         x†13
5‚pôtE-$Y
#.03”2S‚×<}õ!
n‚Q³i‡‚f~)epatch‚–D   „a       r‚Šit‚ƒh›NÐ%‘·†•‚|ritt‚<%í)%ss‚•zƒK8“Ђ4…ˆag‰8‚lŽp$‚,i
B
^|8?b
"8‰]2+%;'‹~
‚:‚5¶[ŽÁy’}™G–G"…
+9$@iN      ›N¬Š|<

n(
^"e(,2:  ²•
”hŒp„a
"‡h3½*ˆxA&ŠYˆ_—k(‰%…?ƒdh"‚"‚?.‹i0*†   ‹sµo…‚&‹o†M:Ö¢
ŽÁyU+U"¦Y¶VgB  PŸ[jž{P

](
^ "e(,2:Òy‚¨rJ¶‚—‚v‡X_A&
„@
‚.Fj„b®VG®odÝ…—s¾QP
  F{i‚ƒ?ˆYtƒ•°UŽ÷,S†ú6a‚´8°;
ˆ'®t¥Nƒƒ.Cƒ$ÜiŸj°;Ÿ…ü„Kdata‚K *#!
"eUK#ƒp‡iˆy¼{‘ -phon‹wŽÿr‚I„}p„2Neorit‚ƒ:r‚N”—=hod,ƒ2„x       <)y",t#g#
91Ld: +7 

4Ee__
$GK'      m
†\)HG>&-j.)!ƒ6ƒc
'-…%NK
""ŸV˜€€€‚¿0À&
        
‚%q)(C
Aƒ04m!H#.‚ #Itl     ƒ*"!6n"
‚Nƒb‡I% 1„:xU]
7%[     p6!#(2‡A')W-0
       f@‚y31

 +(P›z%j‚„_
2…y        6y,H
$%%wL'q-$1?3ƒ ," l
A6CL5*E:BZR5!)}
^
#D'

ƒw@Ïth      R„z‚Xl])     
-/q $‰uXv"‹+J-)#F'ŽEÔp’l%#ƒjŠ4¢6¢t‡0
o©3–)
‡f
rŽmF3,LG8"Pm&U#%=W!     #!!?
hJ
        :ƒ?5D
ŒFˆ-$ƒm‚‚&²fƒ1`=£T-.‚Ál
ˆq
v…y…:) !eˆ„ƒv{¡nƒJ2ƒ‚!5"‚!?2!$!0h+
c"4XAqU‚A‚"3KLX)ƒY);C*R‚"R)fE^
8‚9(3‚OEb!  
%
8*

2      
V‚R89A5C%
-
Pq(*S`Bj‡s"ƒz…Q9
d”f&Žj’— 
ƒ'
#
Žb‰/Œ‚NˆA14ª‚H–•\
ë{ˆ!„)ƒ[…p‚W…z…)"#ŽöuN
Y%j®c‚—_ih  F„z‚$l])     
-/^ $Xvž| ö]J-)#F'Ÿ„^‚
„?ôy##1‡ƒH‚?bõ
g
«r
‚S§‚q‡f‚‚‚&$Qü^‡:‡j<-.‚¶R

‡PO) !eK‡Rb
{¶\‡_0t
5 k‚!?2!$!0&
c"4XAqUQ3KLX&ƒY);C*R‚R)fE

8‚9(3!Eb!    

%
8*

2
        

$V‚R89A5C%
-
Pq(
*     R`B¶@—.\„9
~R&
Pr¶!f§
†‚NˆA14—AZ
0Ÿu       ‚4

)¶„z0methodolog‚„!—ric9¬œM†„M‰ûy<ŒZ
†Ã„        o‚V
§S)flagƒ‚˜¢&
1ib~± 
       ¾J‚y
       chael‚‚l‚Žz‘‰3roy„
‹o–X!ƒZoptimyƒj2 ~–o2secondˆ)g‹@‹&
“6œ,“Ðq
U‚¡Toftfƒ(†]ƒN       ˆ[—R
‚pƒ.§W‚|†-í3=”‚@†Û0t‚./ƒ.d¥>R„X…_9Ñ\£•Òbdw‚;„>Mš3‡r„kc†P“ˆe‚v-        ™>lƒ{ŸZ…<‚$…
’zœb
fuÚ8ˆ0Ž7ƒ2‚JD„I„PŸhL#
…/ˆQ‘\Q‘e‹.¯†]q‹M‡9×
xƒ7’q0†=‡   Ž÷ƒe*ŸX‚%§   6œ'®g0v
?õ7¾=œ!ƒ/<‚$:Wc¾+¾.uÆ"2‚JD"¾‚+—>…L#åG!‚¦‡¶Ziq—5}…-¯Qžx#%d'pointݾ…ght‚A‚B†O‚+ƒQtqoŒ5‡[‹f‚LVQ•~E
)„q'„JN…[…,‡0
‚9sˆƒq„rRxƒZoc‚XŒ’k*]‚`‚‚wC)

T
<=p   H8B
‚$Ns
†‚:`G
„* m
C8
1‚au
?Sv‚a…‚Dƒ~
ƒwk7&-1

!X/PE‚p:][%N{`
q5„!#ƒ.G‚]‡u$„‰=ƒe….„~„~${L
„3185†h…‚5‚F=        ƒy}#/Y=„kk_„8‹ 
k‰3ˆr˜rŠ<ˆ3‚pˆ!ˆ5†v…:¡V8•8”$†*ŠVƒV„Y„6®vƒ\‚      
‚e&…H
‚4*ƒGSƒ_ãE²k•69„"„J9cf(††#±‰v‚8‚y
Œ<ƒ‰!`‹o‚I
†ŠbŒBO†\ƒU1ˆJ”h †<…X‡<†)‚.w†b‹Wu1ƒ<‚A!~‚'o"„Bƒi(KŒjƒG1I†Yƒ#
ªQ
Œ;
„Q…%†o†Hƒ;N*ƒHŠ?k!‚m‹+5pƒ-†[‚,ƒ.]\ƒ|/     
       
X/'z‚h‡NˆƒZƒZ0,‚'‚H45ƒe[B #6_3ƒ\
""ŸV˜€€€‚ ¿0
º,ˆp‚@Š-…G‚Tƒy&"$E‚U‡'Š*j/‰2xuƒ9‚/…\+†#1…a‚
„5ˆ_‚B‚ƒd…
GzBƒ3O‚j‚#‚CƒG^4&
‚O
ŠHƒ&‚1
=j
…X‚Wƒ‚9.‰o9m36S{N4…eƒŠ‚QX‚I’‡F“]N…9-†t…}‡{M!ˆ‚‚:„y‚Uƒ‚c‹!8+‚j‚=S%$X>„…8DVT4A
‚„>‚&
p„7)„v‚o&m‚?ˆUWUˆ+otgv6ƒx ƒ$…iƒ‚q„kR~‚$‰5ˆ'‚ZŒo^‚$„%YVJ@_ƒf‡gƒu…Y(ƒ2,9.‡‹`.>ƒDƒG‚2P&…m…dFs“‚y*|0;ƒ_ƒ,‚DO…C‹h„"uˆ3*
Y‚B
‡BYŠ=e‚`„q„=ŒN0‡..ƒ#„=&Pm}‚#‚nƒ.:‡z„,“{Œ@>0‡_$‡AM
‚E
3‰pŒ.‚;Z‰W…
5
‰g‡yp„&…3©‘1Ój"ƒ„_„X!ƒZ‚xy.-‚GŠƒm…tŠMžƒ(‹4“‘T
ƒ'•~‚‚'

.ŠO_ŠZFˆl™^kL˜aƒ[‹s‡V…ˆ7p<‚RH[‚gƒlƒ#[ƒ1‚<7Š;pRI{*‚<„3
‚bO…QŽös5‚{ƒn;
w=    ‚)}#/Y"2‡i‚'E
kd‡l]
ƒDE     W‡WCƒŸ6j”$†*ŠVƒV„Y„6®vƒ\‚      
‚eM
*BS+"!‚‚‡LE‚c‡S7O
ƒQ9ƯH‡n,9—
‚
\‡‚ 1`‹o‚I
w„ŒBO†\:1Mp T‚+
%
Š>&1<‚A!uMwŸ>§‚)¾:n/‡gb"/    
       
X/ŸxOZ‚    ŸI1&"‡fD
YU
‚j%
=2‡Yƒ9‚/:]1N,\cu‚8 
GzUO+‚#ƒ
K4&¶);y‡u
‡‚8‡‚®u
e9
136{N:"‚…U?L—xoS%M
?

‚1
a[)ƒf$‡_RMaWU‡jCotg—5
 ‚=$
dQ‚wƒdRG‡[
j†wqƒ‡a#‚7?VJ@_
ƒ9ƒ^m…Y(+,9.
^
>

[ ‡N$
@…dCs„|*|0;ƒ_‚b‚D‚)‡#‡gO@K%Y
(B‚‡l
‚e'„3X‚‡\4Ÿ:p jƒR>0      
+$
‚M¦O
Q5@‡;g‡„e ƒvn„X!ƒZ‡|y*>ƒm
ƒ2taH—N‡`
X
G‚‚'
‡‡l…x‚[kL‚tG…M#[)JZ
Qc(i
‚
7840>*1<—
ƒ
‚W0migrat‚‘g 3„   ‰kì
8 3ü
ke‚„pábldli‚†•ê„*eag‚ƒ$ston‚‚;lion¦+

ŠJ…)Ž*ƒR„(ƒ0c‚7…Cˆ¤;_9f @Ž} A„t

…@„LƒGuVŽˆrˆe‘^ˆ8h pši¬F
…8‚}    Žþ„&õ     åL-ŸM
f @
‚Àƒ‡gK‚&hCÆ
¾=O…NÝTDŸ-Ÿ†th‹e†R‘¸_secondoŒmœ8
.^„T‹jˆO’)%y
ƒj    ŠP‰]
0‚•Oµ>˜m—Pi¦J
Š¢y
L    Õƒd„Ù„cõ„}metyp‚q‚cic‚ƒni"•FC% ~j%—‚7\
Ÿ¸CˆPŠ5†(
ˆKƒp¹j
#ŒZ¯.Su*Ü[
ŠCŸ†P¦†2¶]
kƒ¥k:ÕGœ2#Œyd\ƒ‡c¡…s‡Ro
„HŽ÷ƒâN…„
œ"
ogw‚†H…z„:ˆ:…Aô(…€T\—:‚ÀL¾64‚Œc•Œi‚Š+> †„_[‚Y„M‚@Zñ‚Dƒä?{_[]‚Z
Zatur‚†uñxkfi‚‡Z„Zm
ƒ:g
ìtƒŠ!ƒ‰
yªR‘\G“u…,rŒp?¢l †YXb‚,0‰¨1ŽH‰
@¾i¡p
ƒuãd½b¾(¦n{Î4‡d ƒÜ… Ÿ%ÝQ#Ÿ>å”"
‚l…umŽ*•@3X
‚n
ƒI+‡`NˆT._]…Eˆ–ÊDƒ)Ÿ2·?    %
³V„IŠK‰4“I9
‚F4:PSFr
""ŸV˜€€€‚!¿0œ‘‚‚.„6‚D
©pˆi‚        ‚?"‚?ƒ#         …Nj‹F’2¡Œ^
À‹31Š>‘~2™~‚ƒ?…%6•x‚uŽ÷b‡l¾]!)ŸŠdŸ$…L       %
9ô‚L‡ƒ_•¾E@âC¾>b
<H¦‚Õx 6
:    
    Ÿ0Ý‚b„jwg¦}Æ*
1z‡…+Ÿ'

2‚t?Pj“i‚u0minimum_file_descriptor‚›‚[ø‡¡GorjtR+]‚D*
‚Z
¬jD„X/J_\";4ŠFOr‡&#ƒ!ML/`U„\… ‡RƒX†G¤pƒ!Av‡pƒ;„;(‚W…5VJ
ƒ j‚Q‚Pƒ"›^’ƒzFÙ8‘,+*
‡¾Auƒû„»6@uƒ%§,•ñ‚‰ŒWÝ*t‚C…!ƒ8…W G„T
’D#=Š7‰$‹G

ƒZû‚Œ„Iƒ–4‚ß;8‡hzx‚S…~ƒ]‡‚CW”Õ8
q]‚PWrror‚k†I‰bŠ
…|#
 (ƒ–1ƒÔ?«wsÝbr‚‘,
 (     sbehavior‚„*— ù‹-cvI1
Q„6W
˜
K¡<“ ‹ˆD$
S‚?Žþ\G‚þDÎ   O³Y§4Ó3Î
õ+1


_¾%$—5}¶U=ellanv
?“J‚y
“
0‘;uˆÊ;Žþn=‚0í.‡à8hief‚b‚“©SŸW‚¡ 2onfigur‚•Ú‚kuntŠreant‚‹Tfeaturc
*/?Ge)
‘kfÙE
SGŸormat‚«#–×O(giv‚i—†handl‚…p‚˜#inform‚Ž@‚N‘˜|ƒ‚Nl‚Nead‚„3‘˜match
•,Z-‹
Ï.D
†K=–&o‰)…ƒN†h½‚)‡+—º`…ýƒ    
‚?oÚ]?‡iHnam‚Šgpairƒ…9˜šAs
ƒ/ƒFQ…

ŒD‚j‡2‚b’#ˆ
_½gK†"Fk0‚o….…XƒED6xŒeˆ!‰ 
·3
L 
«%ˆ      “@    »l†t™8‚+(–"

Õ‚ü
Q
F‚bZ`Ÿ6¤E®‚„iWD63Õýˆ%‡Ÿ‚S¶GL‚>§*ÝLÆ„9Ÿ'5(ing_udf‚H…Y„"Yu“ÿ{X
^YLon‚…+    ¸x†2
%²3‚,‘‰lƒëupelCŽÿÚjWtachkin‚&ik‚«&‚w
¤cƒYÓ

™1ì _œâ/y‚ÈK‚™Í|enli‚V”HÉ>Æ=–×ay
understand‚V‘¨sƒg8u‚66‚]‡8=3j…H kljg-'¬F-)QŽU    †~    ,`‚9[Y‚N;ŽG‰ƒECŠ†Q
„0$Ž5‚s„>È'˜f ‰/…E†96       ƒQˆd    „V„‡nø‚…,)Qz       ®‚SÃ+"¾ƒE‚‰H
‚"$¶^^‚sJí8ÝB†?   ¶T%„®vtig‚‡]x©?Š`B
‡O†!
‘…KË"%‡eƒh…,ºŽþpJ¶_
¶TP…E„øa‚ׂDtur’……Xì-‡’‚   jhhhhhhhh‚¦H“Ù5kdir‚T

–þ‚s‡)
keywordhash‚Å_ùth3‚y†%5
nƒ –þ35
nleft
†mˆ8
<‚`‚(a
„‚'¶-„éapTL!
›=~ˆ‚x
Îw
šQ


~†¤P*”8œC
NÎ

_sizŒd
TB‰;&2ƒR‚W

I
 
^,ˆ\3†g³M$Qù„‰;‚Ï‚BƒŽ†g)$Qn~
Ÿ\¾B
ƒcreqƒ‘6C—ë[BCobil‚4„
W!‚<
ƒ—†\d%>‚he!&b$„h

-=.~       ,
qH@PH=" f(#‚zw *4D7Vm&…rM  D       ‡l4‚"9/$V!$YH‰
4m  &6#„a7)!,
‡3ƒ7L{q
4
VG‚P‰%‚
'#gK…‚o


/
!#ƒ7£°?…
•D034M8‚"4&%>7"œncQ—¨@‡ij*ˆ4‚o Œ_‚N:”,"%(£‡ƒ@>      >


       
                       ' ‡pnlŒ†63‹ƒ#‚Zƒ„88&¶x/9‡\45ˆo‚:*¢}…U'3Œ‘     ‰vŠ1$‚y6D4}._ <F.;
       {‚o(:!Z‚fo'#"
Jar+
""ŸV˜€€€‚"¿0Ço!%#1A‚„g]…U—2(2„
76
&t]'ƒ$!b‡b!j)V
Ž<`!ES‚z#&&"   W†'‚]4ƒ0ƒ96    FI‚%"H<Š2&
.˜H‡#

)+('("J_E„Y )$


„Mk‚D‚<ƒv„{X!
N9>N6D0|‚&ˆr™
"‚„'ƒ_#„u^<„;B‡6e…[%
/D.
k7?2
#]#ƒ=‚+‚†
;F"9!ƒ&(jŒXsd2ƒX
_&I…f3‚ƒ"†>Ÿc²m…”e:…XG„1
wŽö|TG
%
'K"f


/
    !
#—ƒ
27¯‚/‡Rt'‡`03Mh!4&%   7O"ˆ1ncQ—¨@Ÿ1Wüg‚
 „$‚N:„h"%(‡*‡—'Ÿ>


               ' ‡k06RÆ43¾:4œ$#
/9/45~³1O$76

]'
‚!Ÿ]
ZŸ‚7
J—5S)V‡-!E+a#&"        W '—+
6   FI


"NHKe2&
...

)+('("J
E2 )$



pkBTX!
N9>8N6D0¦?zP‚&§
2ƒ_#„u^<‡'O‚#eL%%
/D.
k7?2
#
J#mU];F"!|+
Pf K28—
1_—4,
[3U">
Ÿ‚
4G0modelGŽO‰uvgÁ]ˆ‡‚H•F‰‡5‡5‚y¥m{§

Ÿ([
9g‰„Ù.ü{-ÕvÝa»yof‚‰N•»frnœ ‰$‹vˆ_!‚‚I‚iŒC¼z†R‹L1‡•Î7ŠhÇ—$…6š
iŽ8íDÝ\l¶Yf‚‰QK¾
ƒƒ›ycÝa0…sìz
Hˆƒ;®;Ÿ ?st‚ `icum‚’#f
i‚|ƒ0 ~Y†c‰"`´‚QFŒR‚4 =>‚Qƒ8S…S8‘>ƒqž"0
„N\Û•T–…%”K-}
„Gƒ7…k½„l¾‚%‚QõDRŒ;>‡k0ÒvZD„q\õe„lGÎÕ‚~¶$i„KX9‚]‚}‡ƒs„h
.‡V{‚E'Kƒ^
6'(ƒ7 ‚i‚&‚$‚WIEŒŒN."T‹‰~tª1…@‡J„W‡W)‚_h…F
&!,*'       !(R
""',ƒ0„j†…eGŠe†‚n‚=„l‚$„n‚c1ƒ=‚x"ƒW!ŽJ”t…Lƒ+             -&v
‚B5$}†yhDƒ
/„„;
>/64p3
Y&?

-
‚}64‚      …^(e£1œ#„‰s‰dœ!†‹x¥,_’‚+ˆ    ž‚$¬”˜X„N‡3’$S…'6Dƒ}†¶g¤V¬K‰3‹†‡J"•t°)†X’V°_†–W)ŒŠO‘-;š9“8‚p‚K†yƒ)g»>“2…{„x„[„H
ŒA†2*ˆ>"‡‚    '›…‚‹$›1‡‡~Š‰o•r„)–P‚>ˆNƒdŒ:ƒ*rŽ“a…/<cBƒT‚ƒQ’*ˆ„#Œ%„rŒ„1'/‚‚Œk‡M…"‰
8…Eƒ…'(‚ _dƒ‡%ƒL…~ƒ2Œw
"‰$…Cˆ9H
Z„3„N‰…W„ŽU‚¨‰
£X‚ƒŒ‚.A‡a!
†Of‰ƒV„V‚.)w9†f‚‰L„%‚eŽZ…2‚1‹n’[‡%‚fƒ)‘r…elƒxƒO3‡9`ŽZ*„s       
3    .G#,‹
ªQÆG…<—skw‹'q†mƒN„#‚n‹1Ÿ
‹W
’+„m‹e‡vo‚S”Q¡0Š&Fƒ    ‚B‚[‡WƒT‚g(„2[r„9E<6eƒ&‚vƒ'
’dÆA
¶FkŒ„>Š5ƒ>„{‚/Š8›dˆf
6†T•&Š„L†X‚q}•|‚I¡P¥l
ˆeT
n…ƒWœU0”V„–^‘e7Œw,

‚.
!!ŸW˜€€€‚#¿2ˆ6‚‚~…    ,‚0³
¤7²5‘8‡C„J†M‡S£•)Œu…–0ª8ˆ
7‚*„‡G*P‡I¦OD„R F…EŒc‚A‰t ;‡@„„N…a‚†2Ž1fŠhŽ÷8‡‡‚"‡‚$‡OQBƒ‡[
Ul‚‚$vŠ@=„X‡*8ƒ<…‡_N69       O¢¤V¬K‰3ƒO‡_‡h      >†„
:‰†‡)‚A‡VZ—˜®¹s‡t&DL
‡5*‡_
R"„‚  †     ‡
…‚ƒ_Ir7r‡E‡‹‡{‡k~‡‡!Ÿ'§‚Y‡ ¶VD„‡il—5 ;‡dB‡kC‡jf—ƒ9S‚Ÿ/‡v3‡X
*ƒfAe!'/‚|
*%Fo94:žsR‡mm&&‡wF‡‚E‡‚G®w(d‚‡Y  
3    !G"#,]‡hhe‡| |‚6j
+‡‚Kƒq‡o—=)‡[O‚B‚[‚CƒT(([r„9E<6
6
&‚J
|‡‡UN…@ƒ‡?‡kO‚RJ‡…‚T‡X44O
iH
8$‚vGž‚,‡mg‡m‡;—ƒF‹D‡#‡u5‡O
r   
z—‡ ‡R5J‡‚<#*        „3„'
‚‚G$Gre8‚;‡KDN‚…2—80modulN3

=
Q           2&‚"!”
‚)ƒ
      $
Pƒ;s#<‹D…-Š;‰_-;Œ+"†T]™nhƒ—‚lŒv
V
j/ƒ{&f1‚
*Š0‡gšB…g@‹h—Y†Z‚‚
“U‘h¥
6¢ˆaie‰T+s‡!7O†jžhƒ

"
,„Gˆ‚I‚ o"5Q‡ƒW†N,x^ˆ5µT‹w—p‡*Œ*†s1L)‚q ):_‚q!;W,
-a!

 &‚zƒ
‚{„7%#¨I‚CbhZ/
AsC2„&„¶†<+„‚z"ˆ@4ƒwR3
/
Sƒ A‡sW†+S\#M®HŒxŒ3
„mUƒs5ƒf!1!,Žþ&Pq#®p5[9'AY

]
`‡
M—8
ø(
Ÿ
      j
\&1$
5*‰mB…g      8      >
]‚
„-ü…uŒJ‚¡ü|
















j

X
C®o
5Q‚B‡Xv
u,x&   —>—+

1—4
:_Õx"!
;_J
-a!

 &
zƒ
OP%‡‚.ÍpC t„m
N¦`;R3
!
Sƒ -W¾<#MŸŸ!¶S
ƒmUar‚+
Œ9Ó9e_list‚Àx*^†hµ_ù–O‹[…Þ†h*nam‚h
ƒ     •ù:m
ZlentŽ-@Vƒ
†2¯d       ˆ“®
† )œ‚fše’#»`©}…8¥ˆŽö‚‘V:‚Ï*‚ׄ§h=”
G…8®um‚½“#ndai‰itor1j°/„r¦(‰C‚j"-[3
±`6‹r‘ˆY:ƒÔE("-[ƒŽE
6E2oton‚‚W{„‚E7ðzZ‡À‚f
}7th$‚(…:Eƒsys…ƒv‰yŽX˜#
‚„   £)Ã}‡
&ƒ‹Uñ      „‹6
-
&‚<‡li‚ŒG³,‡
)`‚‹yot‚£!•Òb3rew‚<…P„
ƒ~;†‡tZ„rX„.ƒ"kd…Mˆ)ƒ   4‚‚76‰J„B?1>…s#Mƒ>$t17C
ˆ&„W*
ca†}=‚4 ‹*‚u„ƒL%‹'9ƒt'       
‚F&Lƒ=‚‚d
v†;-M‚d
j„p"93jt1‚),„S‚]‚%‚+
,yPS‹3ˆ`‚+„H‚n!‚<J0…A‹J„"…‚*‚)ˆz"‹{J‚†ƒW"‡{„M‚;/‚R‚*{        †kdS^‚$3#E‰8“x[,1<„"|„ƒ †oƒvpv*ƒxŠx‹08
!g,n
""ŸV˜€€€‚$¿0?Њj…I…l     „)‚`;`†'qP‰NU‹G‚_|‰=?G‚‹;ƒg‚'†kF5,CV-Lƒ`†)ƒƒ:C‚OL=ƒ]…L4:‚p„)¤l„!—tˆ-E…cƒC,‚;‚„"ƒ4„q‡E&‚j‚g
2M‚YJ….&…e.‰.„q2D&,ƒZ‚.ˆ-„LQ‚AI‚pj
¤)ƒBL‚ |P†2‡lq5Y‚- ƒc-eƒ=J‡0ƒ?0ƒ-_‚4‚„ƒ8ƒˆXh(‰ml‚
wbƒa…&_x7?‚  ‚a„zj!#‚-ˆ…ƒu±e„4.…Xs„;‚E&‰s„R#‚u…<#‘v‚&4F‚p‚v„m˜7„%ŽlrY4Q‚l.v„x„ƒ
Š&‚-…6vg‡~"ƒU‚3s‚O‚„,‡(‡6‡3

iTg„„/jk“_‚M#.(3„7…|#†‡s†"'‚=‚0=„{„eR
‚9I,#*(#*(B?' ‚7lˆ
z‚~ƒ#‚`…8ž;9‚>Q‚>s…Ph…ƒ„       kqˆG(n‚ƒ[fcƒg?…)ƒ#„‚X      „n
†Sg!…*„/ƒ1ƒƒcN†z&uƒvc…Yfƒf^‰       †0„<‰a†V‡1…‚=7‰nI‰xˆ
4v

Zc‚f„3‚…$ƒ?‚w‚ƒct‡X‚4…Uƒ8ƒnQ,‹Fb…ƒ/‰‚M
EvMƒK fM      ƒvs‹†%‰8z!‹kW‚‰YH‰I„„n‚p‰
r&„K‡„S4A…Oˆ‚Hmƒ3/‚…\‚4E…‹H)[…
Q‚X†`‚\ƒg‚2r‚@†“f„F
„[„‚„
ub> 7^
"7"e:‰Em‚S‚oY†a„;ƒ'…$‚d†…Yƒ8ˆx‰Hƒq…6#Š„a:Š/‡%„
‚
Z~Š"m&&Š…fƒPŠL,ˆ1‹,…8JŽ0“‰D#……-†T`‡('‚3‡GY†„ˆtO2M‚"„9‚9      iw?ƒX„‚2«>‚;…t‹$‰:        ‡F(ˆNHlL„B‚w„4$„†-9z[„!xƒK…j…d‚‚*†^ƒd†^…f†zq‚18ZŽ\š
6UŒ'¨b…%˜wMžÉ0V…ŠwƒE[…„0V&‚3ˆcŠ^ƒL•HˆŽG
zC"V„+8ƒ†,ƒA>0‹Ut‹1‚…Fƒ>ƒz…GWAXSŠ‹\=ƒ^I$HBŒRG‡q†‰S„n†!„o[ˆ…P„ r…wj†‚$Uƒ.4…Ho{‚5‚bAƒ‚Dƒx…P†
Xz
Y…SƒW‚'Žö?^MS‡]
‚)       
‚7"H‡F‡‚a‡i`d
1^/#l
[‡V-<„"|@ 
2&*ZAV„
      ‚4;$
U8P
‚(
…Uˆ‚_|‚I/G‚     ƒl;ƒg
5‚@F5‡)?V-L5ƒ/ƒ
‚{Ci.=‡co`F7   *—k„!—tˆ-E…cƒC,‚;NSU&‡‚

0
‡g+
^J
1&
‚?.g„q2D&,
k‚..‚uQ.I‚pj
‚     ‚;‚AL‚    |P;ƒXlq5< -&#=J‡‡Az(   
‚  
h(‡„—5®°‡h
‚#.
2Xs$G‡i!‡g
>ˆ%‚&4F‚p‚v„m„%‰ YH*      ‚.#:xFfOv‡;‡‚P—"‡Ÿ

7‡fƒ¶U8—7g]Ÿ‚|‡‚*3‡f \„

na—3+)V?‚f
‚X
`    Ÿ`‡g
-cff
‚>
R5‡‚ZZ=?[`8(¦[—?¾‚<F%@‚M
EH|‡YjufM        Ds#‡]‚R=E‡S'Q@ƒW‡N‚qJ‡bG
‚:—^
"7".:‚T
y‚
]Y†'4v‡[*†‚&ƒ8*JJ
ƒM#ƒ0‡‚9…;f‚
H~)m&&‚‚dQ       ‡ƒWD
8„6       i
†$#90UM[S
i'‡fYZ„t…PO2N‡[/Ÿ@
Ck1ƒ6
    V4.R2¦B>
T*3‡cd
‡]
`+p‚1§
!Šw‚mV
V‡‚0^
f^SXq    ‚A—&m8ƒ"x.‡d
|

‚
>*
`z„6W‡U‡j
 Q     =)I$HBŒRG2‚[‚
ƒ

rjhiU{O@
d{* A
XD^e.‡HPVPx0most‚ Nƒ‚R3‚]‚
“f†ƒ-‚Pd&2\•„G"ƒ)‰ƒV‚ICi2‚_ƒS‰'ƒj%l:     •q‚1…@ƒZ*wcZ[#yz@#
7?)H
'‚4V‚uƒ`(J
""ŸV˜€€€‚%¿0¶‚#„vK Yƒ…YNb
‡K 
Q
=Œkƒ8‘`
P„#)2I†…)‘C…4…;ƒN ‚H‰,‚‚A
Y(ƒ3±4Œt´0‡wi„‚hJ‚p&‡›˜uƒ#…rƒX„(t‚nVƒ9‚*‚fˆh†$‚1¡±5&‚&‰62;
a,kƒ6‚^
‚v
…|"O‚VWSgv…O†M
/$‚*„l`…D„ƒV‚B„.ƒ    &–=ƒfˆP>‹@
…2…7Š„Z+(zƒ (ƒŒFT„`$Cƒ      2Z.‚8‚h,9a„†6‰OŒ$   †Ž`ƒj-=†$„Y‚S
?‡r„,?•Q‰(Fƒ.
[D:.‚…H‡1O‚2$ƒ{šXƒP‚$q       w‰2ƒ}„Š!|ƒ-.‹J‡‚ƒ8œ]„Sr‚&’1I
8FSƒ…‚W‡z‹dXw¢=r•U˜8†}„j‰._„_–
ƒ„j‚@‰«‰ˆq„9,™@ˆƒ]G‚jK„%‰v*\„S‚      ƒ*‚Eƒ;„H;&“t
N‚b
ƒ`„‡#‚{.3:7‚†~‚R…PD@ŒhO¡c†6 j„‚:†9‡}”(‚ ‡e*….8‘f•+‚9‚$ŽC…o„J‡ot‰…>H‡oŽUŒ[      S       Œ?…
…g„t‚‹:„A‚4.U—P˜"§Iµ[ƒŽ5êj
‰h2 …§j‡]„|†D„Rr`ŠB‚(lƒIƒ
…
:Š‚I‡"Š'.<„{‰.2†_J°+xS‚~
#,ƒ_=ƒ’B‡=\YŽös;‚_-‡g       ‡c
P‡i))2I‡aK       k‚w
H

l‡V
ƒ3a15
‰(i‡‡i+"5˜uƒ#…rƒX„(S
ht`‡Z4‡g

‚*‚E‚b
‚d†fN&q ;
a,kƒ6‚^'
‚
—8+®oZ‡k5   —-‡hŠMƒf
>…C
dŽ^J
„_+TctDF‡Gi‡@42..u‡eQ—8
,aÆ(%í,8—9aI§‚\gSŸu‡p       bcOp^&‡‰h|IA
J4     ƒ¦[NP¶X„mr‡d‡SQ—2^N!‡]G—6—6
;‚    ‚~‚Eƒ;1;&‡†@O
‚‡g
J

R`‚r…r{.3:7#,?D@gO‡a
ƒuc„*ƒ
Ÿ6No‡—2lR+fd
e$X4!t].¦^‡9
'X‡^
n‚2§R
„2‡f<IT‚p—†"i‡dk
ƒ
A
‚R.@)„   2†_JS‚f
#,'O9>0mostli]Q       ‚d?s ‚(šH-'„D†:›‚ "|³‰hŽ÷‚båsÆ*
ÕŽUƒ(Ÿ.‚¸x¾5~‚÷tiv‚ŸUunt‚Š4™ƒ]‘þCaintop‚
·O;üx
…\;ve#I=‚Ks7@2…0†`ˆYÉ^B©\Q†R˜+„kˆ
–r†}gW… „Dµ„p„„-„o„m‚=ˆ4~~¡2¥Z‚8£$‚‡|†ƒ
Ìh?}„O†9‹S       ’*¼&—].„œ 
R    œe‚<˜t‹=ÔP‡r‡_pRt•}´Z]&… –Žö~G‡ƒv¾‚^ŸB•Q†R˜+„kˆ
–r†}gW… „DŸƒÝ‚Q—‚p~‡•?‚E‚?Ÿ‚&¾h
e?¾ OÆ$
>¾6ÎƆ¦|
=ƒ®+9Ýdd—J‚]&Ÿ
T[9ment‚*      ‚Rp–Æ•:ƒü‚R¾_to‚û9‚„,Kleftmost‡X—ƒ"z_anno‚‚kf…X_-|‚xÒZ f…X_-|‚x                _attribut‚‚gfƒX_¯YÒZfƒX_¯Y      s_placeattributeindex‚ƒS†8°uÒZ†8°ubookmark‚*‚_z‡
X^W[[[§8ƒPDÒZ*z‡
X^W[[[§8ƒPD
s_guid_uniqueindex‚ƒ[‰
®ÒZ‚‰
®        itemindex‚ƒ_‰b¬;ÒZ‚‰b¬;lastmodifiedindex‚ƒcŠ7¬ÒZ‚Š7¬parentindex‚ƒg‹«ÒZ‚‹«root‚‚o~‹aX_¥EÒZ$~‹aX_¥Efavicon‚‚[FŽ6hu¤ÒZFŽ6hu¤historyvisit‚&‚WFhtgqqƒ|ÒZ&Fhtgqqƒ|s_dateindex‚ƒ+“)£ÒZ`“)£        fromindex‚ƒ7”¢
ÒZl”¢
placedateindex‚ƒ#•ÒZX•ost‚‚s~•2X_›.ÒZ(~•2X_›.inputhistori‚‚w~—7X_˜yÒZ,~—7X_˜y       tems_anno‚‚{~™<X_™:‚xÒZ’`'„7C+,.;+"*$'*;$"'&/
""ŸV˜€€€‚&¿0¯0~™<X_™:‚x#0moz_items_annos_itemattributeindex‚ƒ{šhœ3ÒZ‚0šhœ3keyword‚$‚c›=V\UY”\„(ÒZ$›=V\UY”\„(s_placepostdata_uniqueindex‚„7™rÒZ‚87™rplac‚8‚SBŸUhtgqqqqqqŠkƒ$ÒZ8BŸUhtgqqqqqqŠkƒ$       es_faviconindex‚ƒ;¡g“*ÒZp¡g“*
recencyindex‚ƒ?¢R’}ÒZt¢R’}guid_uniqueindex‚ƒ/£Q“TÒZd£Q“T  hostindex‚ƒ'¤HsÒZ\¤Hslastvisitdateindex‚ƒ3¥+FÒZh¥+Furl_uniqueindex‚ƒ¦6qÒZL¦6q
visitcount‚ƒC¦yŽ<ÒZx¦yŽ<illa‚.ƒƒ.&    0(,‚

        §tÄ”Zp3‚q—  ˜šN@rintf‚u4de‰LBŸœZ¬=R‰‹Kˆmj—›
:$LÅ„Y³g„P…€~„\‚Jw„nÊ$1tester‚„V‘‰ƒHr‚d…,8Cš+•Ú>ƒ^,8C…zight
†s       ƒ
&-Š8jyI
‚QašA
Š    —Ì8
„anƒ
…c‚†f²~]‹D    Ô "‚&ôF„jˆU]„“‚4úOÆG
n"¦`!ee‚&%vc‚Â5‚¦=Œ?„(   –!†„)†gv
^-‹+@     Ô„e…*ø˜‚     |5ƒë{b—3s‚08
^-òJ‡oKÆGh—E§uy‚„;•Œtbf‚ƒOime‘0X
Fl‡     
9A"2#:>‹
1Š^
E™*@J‚$ƒQ„u  ƒ&H¬B$g¢y„w       
9A"2#Ú8>m
‚þi3
EÕzO@J‚õ3
‚m    

OH„,
Nuch…+„#ˆS
5¥"’]…
‘n…o#m?
ˆ{Gm„7‡‹*‚(‰wŠ…        ¥C†pQÈ<—n
ƒ‚‡9ˆ4Ä;^¢ rƒ…<‚fi…E‡]‚‡mŠ=’A‚JP’+¥    Š8ID–p—W  ‰))‡$‡E"ƒƒE†ˆwƒ_¢@„P‚Q[MƒR
J‚hƒc¢pƒaˆ=Ž‚`†‚[?¦S‡f
†:U,‚7‚„;wvv„i„  †™]—‡\zY†`g—„~V„j>‹0z{–o‚ŸN(l‰‰
L‘C‚_Ž +_ˆ6ƒ`-&Jœ8‰”\‰v.„<
‚U,ˆq°QŠ"_•äbȉaˆ}‚+"‰0d‚uƒV%e&&ƒ!M(’‡o>B†N‚›b•k—L_ŽöƒMm.‚6‡&—ƒ—I[@QP@‡2
ƒ§xW‚H‹sC…Hr‚D—84®o‡n0—7z‡^
eP‰N
(    
IIHB0p[ôf]‡ƒÆ%bƒ7®nA‚V΂V‡ƒ
!%‡Yy6N›yW‡qMu§‚pŸU‚~‚—2+‡i
„v(‚$—AŸJ‡tƒ   ‚_§‚
"J®*,‡h*§ƒm—ƒj—9„b0F8#
%e‡a%‚<
_(T
>‚3eT(•kŸltiˆ9„yq/l:[#ƒ()-)Š ƒ–|‡o¾–6¥^
†S† X‡¯p!,G9*G‹Q‚o„k_Ž4+$‚‰V£W‚)N‚|J¨o®q‚u‡VŠS!I<ZY‡8‰°
ˆ3
×!ƒˆz¡f•zñˆ0’ŠSŽþk?§K¶^©6–6¥^œ”e„skF¦h2G'GÒ{—5Q¶[+$    S‡p@
N£sŸf!I¶T‡‚.¾>T¾>¶…¶‚9]‡nŸ_‚žv^q
bytƒ      „pŸ—û$‰Bmedia‚.8ƒ.S+?†1ht‡=…ƒQ‘Z‚      _’n„
&ƒ+‚1
Ju
‚xG„‚5ƒvˆ\
‰]ƒ0C‰J‚'8ƒT‚t“$„6UŠRƒl„Ž$"‚wƒ
‚CËŽ*W>
4¹g
*‚k‡j 7lˆ<X&£{š‚LO“(•v;c‹r•7
„x‚zŠ%ƒ‚*„*qq„!‡wJ}
‡Aµ˜‚‚Tˆ9…k,6‡ddYŽ]…W
AT

¦
u
†(‚…c‚O"mpƒ–]†(„'‚$ƒ@ƒ.ˆ2‚RƒO-:0„"ˆE†)ƒu ˆGX„S‡…\…cŒ5„I’x&"©'‚.
c*<<…/S2‹[ˆf„G²4-d‡Es†Nƒj…<‚T‹&ƒG‚3Œ‰ƒ%ˆ^'C2< *n
%"‹A!]ˆq›K‰6ƒ%…`‡P›;‹Š„†r “^
ƒW‚!¤1‡ „—;44E(%)"+(#2$
AZ
)M‰<„'
""ŸV˜€€€‚'¿0˃C‚u„cFO‘B„Q‘Z^‚Q
õ\ŠB‚q‚Dˆ,¾'‡'ƒKŠ4œ!Ø0Œ.`ƒ4„!5
" ˆf1„l9‹Z„uQŽö6„P‡|U…U‡hŸ"
|ƒ
—WoCW>
4‚%"S$“QŸˆ‚[‚LOˆ
†oc‡PWP‡n—9f¶UH—<
7‡ŠsˆkJ~‚T‚|
‚¦*ÎB
í4$¾=-:0§     S‚L‡Z04&Xž*å‚#—"                t‡VJ]N}C2c‡c[*®‚/b—‡q‚?‡[„
J8)Ÿ`‡n
    —1k%T‚Q1b¦T
6‡b‚®„N‡‚A—„
‡g[f~†>^
#5%
L(l9:¦rƒuQ    0multipliˆIµD
Îhƒ‡#4ƒ@xƒhŠ$§…½gŸ
ºÚYGK„›+‚™<‚ctest‚y„p#–þ4‚5„p#hread…n
‘‚$(„‡¦;@‡2Û/      ù „;ranƒ
Š—ãn
…~ud‚‚•ÒWEst^a9‚S.ƒ`#„‚e‚I‚~m‚J&-ˆtG*ˆ~*…~‘K…9ƒcu‚        Š
X4Ev h }".
!.Q7š{d+„7‰)‰Gƒq†7!%        
„ƒ„P;‚#
o
"‚'J>IA
†;%‚

MBƒN
N5ƒl8!‚++5Cƒ&tƒp4n‚IƒEI
‚./AL7
.V‚;‚}.
T-I(„
l†‚-
‚,n‚cƒN
3
4
ƒuf†‚ƒx‚ƒƒLU<@D
‚t'pY?…‡&!…j>‚ ?‚;,7KH&  /6
ƒt~$I†2e‚_“
–Pa"

_ƒEŽ(…G†r†bn‚^‚y„yƒ%ŒLƒHŽ_&Ši‚r‚_„$‚@ˆL-n2…%˜C•I‹…}&„!xZƒ
‚L„m‹2…0'u)‚kR0*6‡'y˜{}z‚M/ƒo†V†a„Zp‚"G…\g†0
ˆuƒD#[#‚qqyav
ƒ bR?a‚Z       KA‚0+‚
U…0ƒjƒ$‚~M‰8h’yŠy„‚‚…‚ƒk‡   œAƒ=ƒDV&)UJ‚nŠŒm„t”L‹cƒO‡Gh‰e…=†)y‚X•‰$Ž
b„s4„n3…†~m‚?e/ƒ0‚„†…™        †uˆCo‡!‚+W‡oN†U,ƒ%…>„(‚l(Dƒƒyˆ%N‚dc‰gŽg‡rBƒ
p‰iˆ-‰h‘Z?‚vƒ  †{ƒB„N‚Tƒo‡gE„4ƒ=ˆ0
„W‚bŒ…(c.K‚…p‚(„qN:1…‚L’(ˆ8…c8      
0-h‡"‹7…†‚ƒS…j“_l+ŠU0„XŒ`(vMh‹j…k       ‚VS™3ˆ5—t•ƒtƒsM…v„|‚&|‰''Šs‚zA!DjGs6*a…G…;ƒ‚]†
ƒ‡QƒOˆ_,6‡d1b"^‡ut’K‚„%Rjn)„la„
h‚;’H/    ‚4A%‚F;‰1L)„?ƒLˆ&D…
qLDx0ƒƒQƒ@\„…ƒJƒzZ<&/U‚X‚(TF„    ƒM)
ƒW0Aˆ‰3x‡sdc„nŽ7„U‚:O%,""ŒK…x‰?‰.„Œ>ˆO‚<‘7ƒu‹+‚Ž¬?£s²Ki„fˆ‹2¬:k‚a’ &p;nZ‚(ƒe„|ƒ…Z…@
        nQ\„ƒY'‚H˜J„n'f£(/„3%†/Y„X„&ƒ-‰V„|zŠRƒz%)
‚vŽös"I
ye
b_  U‡J§„w5—2‚Z‚yy
BL‚'‚&##r
y:D$>
>-n
      …%d‚D     ƒ`‡
xZ‚9‚Lƒ„}‡Zr )KMy }}z‚M/ƒo†V†a„Zp‚"G…\g†0
ˆuƒD#[#‚qqyav
ƒ bR?a‚Z KA‚0+‚
U…0ƒjƒ$Q„ƒ`„
)‚
T‚4fN7ƒDV&
.UJAz^
‹8‡B
‡wÎ[—1`‡f„      3„@†5%‚?e‹Cƒ0‚„ƒwLG„ Ãq‡e*‡ir‡gIj—‚E‚C§‚Od7‡c

N<11
¦^6 
0-h‡en‡j3¶ƒY1+
b0‡`]‡e Mh„e   
3‚VK
‡f#I 
U'SjG—29
ƒ‡gm(—]‚‚
…bF‡5
,‡d

b"ZKoO
t‚c‡`
Rn)P7h‚;/     ‡o#E
""ŸV˜€€€‚(¿0
Ÿ3‚4A%•ôk
‚;Z-)o‡rs‚A&D4
q(Dx0‚GƒQ‚t\…(ks/
8uCX‚(TFƒdq0
')q0—7„Bx
†d‡P:O%,"N
hKA
_ƒ#‚T    ®J‡i:‚®n‡       ‡b(     „—#‡b5nDx}„<L(AB@
        'Y+S'“nU'f
‚/
„%%†#$r:M‚?S?;n‡[)?¶U'
0mustbeint‚Ïݺ7tat‚.ƒl#‹#‚!r“@<OŒC"“\
    B‘ˆJ‚^#f!r<Oƒì‚‰E

    Bion_test‚t–þ†ex*H*L(       
8LJLQ*
-‚>)* 

6R
o

‚^
`R]†6
&2
‰
ƒ?
Ž
\K?

 0%

"b   !
%‚XDmo¥(›F“
t‹XJƒ£OM


#%‚(=(mR
Š)‡r—m¾fˆQƒ/„f `œz„qSŠ#¥rÒ
„'^/
¦hi…§eY”
‚FQS®h_alloc*YNRL+§D.ppdef*k‰ƒent*ƒ'T‚A'§J!fast*?/8g¨re*
ƒSn§G
held„XWO
8¯=‘‰Ileav*„!*V‚K'§P:method>ˆR ="ƒ†noop@     theld„ZXOP¯?‘‰Ipthread>recurs*@=8Y*g¨static_app1Gg2Hg
3IglruEg        ¨42
mainA‚d'¨0emBƒ'¨12¨2openCgpmemFgrngDg¨3vfs1Jg2Kg3Lgtri*ƒ)I
2Un§M,w32?ual‚A‡<Š©_   x_payloadx‚d„E´G‚bCò|frame‚o$‹3"19Au„?Ním
‚–° 19.
…auƒG
9Ë1
i
level‚Sž^ƒV]”Õu{ƒV]pathnamE9…s9gŠ[‚†\Hxy‚!R4X)‡>„ƒb—p†„v‚^—)q‚w$5•Ú/ƒ<‚^
„q_extensƒ³p—ÌK7malloc_implement‚Š1riad‚„scriptƒ
Ÿn—Ìanql`1„`‚U!" „bSV@
T‹Hk„NƒM Š–
    †R…q…(Z,=
T‚Z`yP?
9U;l 5*a,K$3N+#z‚,‚L/†ƒnwS
#@ŸJ¶T  -k

®‚?…€Ÿ/O3‚„"4‚„%tifi‚˜:thic‚˜!nˆˆo$-(u&z#
‚.… ƒf!G
H      7‡Y0‡!
…x„Yƒ@.7r


_
d               
     &            W


.       q
gYJ?
        !
?&…y‚m%ƒ&?‚l/.„ =53      
S
…OW7*:"(P
In  ‹]#5?
Nr
.A      )ƒc(‚sFƒh<‰…WAŒ~‚'•{VO„·     ,
–%¦~Ž³I™R†         ’@#!"     
ƒ†MƒY„
A‡G†B       DS…p9_“3S;ƒ}Œ
[M…h…SŽn`Œl
Dq`‚6!V‚Pbk\!!,:Nv C‚p…5
±Œ

Z¤F
‚_„-‡&
Š.x…„{8‚nFƒ& ‰>!‡}(Œ8      
4  ”]5-š&ƒ"ƒ   
-X
ƒ  I*‘NH
)3
  ƒuŽN"ž{šCE
)R&±f     fŽ4*"6ŒLi‚_
rˆ!/:
!~‡H"=7†
QhD‘fy0     
„f`     …ˆ!7^
‚…0„
ƒZŒ„k(
«‚#ëq‡\‡
?©;•3
ƒˆ#0…S:ˆ‰M7¦>…qŠT‚B‚
hŠA‡#†aFƒ<ˆ8+#c
%?-r8I‚
RSHº.Žt„r„Pˆr
*,… &†6Z‰ESp)0Žþ^)(
‚JFf¾@-
/A4‚'‚     V     
~M      ,
žtW¦~Ž³IŸ`
…I    "+#!"  
†MƒY‚
A
ƒ6,  D^9_cS;‡I8
‚ŸM¶‚ŸRy
Dq`‚6!V‚Pbk\!!,:Nv C…5ž8Y
„Y¶W
„$uƒe.$)$) !0\ E
{




""ŸV˜€€€‚)¿0       Éi-“¬O;x§
H]
';Æ+ 
4 Æ#‚q5-‡fƒƒ"ƒ      Æ%`—?(H
)3
  }‡—=„#
+E
)R‡b…*

    
<5*"¶?
SZ
r ƒ`!/:
!¦{"=7   
Q

hD0       

`      ^


0G
(ÍJ`—i
‚?0
0‡c
ƒ„[7j3w/
ž|9A#Fƒ+ F+#c
%"
,r8I‚
RKW‚{DW‚
*,ƒr&Z0n1‚c"‰E†` ,9I,C
„C
"      •ÒWa
} ,PIŸ ‚GC
_
"      2‚c ‰?†g&(:J!,
E„


•Ò?[
~&(TJ!Ÿ ‚
E

3‚c‘R‚0"‹`:•Ò^    ‚0"
ˆ9:a‚%
nch‚ˆ/idx‚1‚&‚,’Ì:
@‚,l‚ƒ{9me*‚I
O
$9
!&=  C7|@ # :ƒ       h(,@
    ,D}7J‚Lƒ{w†#"„ …‚ ƒ[ƒeJ
2
,H%!

#/9;*ƒW‚a„x    N      ƒA"„{‚%…e…’w‚E0{~‚2.]
6ˆ$A‚`
/$g+5x
H‚A0ˆu8k       
…!G\‡?X9HC)8;‚ƒ'TNRT
NZN7<ˆ.        5ƒ…S)F‚;`‡![‚Ra       
.       []/6
 
7
3
$
&/&-'?R      Y        
6=
3Mb/T…     ‚f3p1Y!<
…&S
}ƒ9„I‚tƒG#!
s6,‚Žs@%*<>"j(mym‚f‚^‚"p,†n“c$86‡
†J„7‚*&&t,R%ƒN\+^
T),
I
       h*:tj+      
./%=[ƒm7
ƒj‚C…r       1h   gY=…g4ƒˆ$‹Ax
‘*5‚‹o
;ƒ
I]‚-‚9‰AI5„X„ „Z<‚(‚IŒm0Š~F
"Yrƒ;
™L„`g#%6o†ƒkƒj   

*(U
‚M
‹"5'‚1f       
1H@‚Bf‘V†1u11’W›„)‡
ŒH•„3.X‚z ‡>/    „v2†+"*V
FDG„„W!^‚%…`…m“<M0…_
pn$K0†W‡|Rbƒ&Ž†>/cƒb”7a›c„%X
)Aƒ‡    p…R



      '

        


        
S
        
6
4ƒ ŠZ            
‰f‡_‡b
³v†ƒBƒ)‚k|.0+x%)†Fƒqll-
‰\V       &‡6–‡nR†XŠ2…}4$ƒQ2+qˆ<ƒPƒIn#-¨F
yƒ4ŒY.<‚tˆj


m,(dƒ‚B•‚yB„E
Œ*X&,‡a†K†"Ftf.4ƒc„ƒ&‚4ƒ;}\#ˆ9<…)‚\C‚v   ƒ=
Yd
„o‚Zƒƒ‚0 O     1?/'ƒv"u"@9
,JC
¤Y4‚" 7…a•S*+P5J
Vs ƒˆb„yK8%^8ITf‚oG(
9}r@$I


:%‹$ŒQ
ƒR&u‚h*'
X
‚L„ w‰2ƒvcc‚Y†aY…S-s3…N8 ‚…xŒ5ƒI‹J¨bŠdŽ!ƒ†S
ŠE
2†cb0Rƒ7_„CˆoT‚D„X‚ƒ^Šc‚I…})‚Q!Š|$9,¢(‰K‡”x‚Š/K   Nˆ„~‚F„cc=R†    &K    „P;ƒ•wOd‚!.= …%!†
!%|Z/‚E‰¥H…IadI0ƒ
o‚]|ˆ

<UWz„…:ƒ'‚J7
=
ƒ{%H)!      ƒ<J‚Il
.jŽWƒ‚S‚.#*4G
ƒ
i5%C)b+'N‡}J(Vƒ}a

F3M]
w‚gXƒ5?* D`h ƒ{e‰{ƒ8‚„ƒ$‚y‚Oƒ„x1‚]_/†$1$ˆ]H„U
k 6
„>uR1‚xbƒ`,6=
-<
/& ,„;
Œ‘a±:“zÕZ‚+.Š   ^9‚5sL9
=sƒ„
>f
‚6ƒ"
&>s83[‚agU56ƒm    6<ƒn0()„
$ˆH\_6pLƒE†tŽ?„‡9=^È*]
/$   
%'6+O‚?‰
ƒ@†p‰=„-8_#<E‚  
)5…%s‡y„mˆ0?Z
;F
mH-ƒ'ƒ(lƒg>„ *

 Žö|
‡_86
u0&Hr,R%
\.^
—yQ
j

‡V1‚        
;:
I;?
/A
I5‚Bfƒ-+
NT0m9
"Yr
 ‡.„<fj'
""ŸV˜€€€‚*¿0¶JÈ#%6o„d
T+-

*(U:
‚M‡.K68†1u11’W›„)‡
ŒH•„3H% O/  ‡\i‡h""*V
FD
„„!^f‚6vV&M0
pn$K
n‡|„1>/$#‚‡>_%X‡PA—:pƒ4



      '

        


        
S
        
6
4ƒ ŠZ            ®o²+‡i\|.0+%p-
‡u$       ‡dˆA&‡nR‚Š2…}bp‡O
M‡h
„Z.¾<,§
,4
U‡c#f:ƃ ‡f
?—7
G‡cM  1?
`'‡h"H®CI
,IC§2‡x

  %+P5žr#
"‡fGTfp
2(
}@$I


,%—&‡%
G*‡fd®r        L.cR
[Y-s3‡q‡^‚d:‚ByZ?‡TH
/SM
g
M6<LVT      ‡_,[_})H‡mƒ—!‡ˆ
ƒ*
@-K        ‡e
z‚FBc=R‚
        &K    h;
s      
ƒ%O‡T!
. ƒA!"
!%|Zƒ`
a)I0‡G
‡gI&Ÿz‡e


3
61—7
     7
=

'M)!      H&‚Il
.j-Y     #*4

i%)b+'‚3
(V
t>

F
M]
žbo_/‡
   ‡g
G
H
k
u
3     6‡]
*u—74
- 2
/&     Q+Œ'„%‡d9
}RL9
=!‚L„
Q>f
T".
&

s'3[

wU*>ƒ#    rz
fn(!$
$G$_6 L—‚T‡g{/‡Zˆ
"*]
/$       
%'/+9W 4L']<EI 
)5
c_M0"0?
;F‡\N--}‚0namecolumn‚Èü‚7nt‚ƒ&–Çdescript‚•)ÜH[ˆäxsem‚ƒQ•£oYlessO 1
œŽøQock‚›–°„Iminimum‚‚<“ÿ‚:offset‚Ž–°5:read‚›–°„Lspac‚CeÏxƒ6…0hƒ
H
†FH„Òƒn‚ˆZù*¾>Uosecond%‚_§.…C†*‘¸7oki‚ŠUrgC…%ÑDƒwR
<#¥aŒ>º:--Y½d=ƒë4»H‚a”…%row‚Žh53ˆR…‘
žP"“Ðr
ƒ „ý
†u"sa‚×Gù“l‹eŽÿation‚‡%‚Eìv&#„m)c‚CK(c     
RƒL!~Œ;Xˆ9‹¼’n
®ƒ.ƒ%=È3„ASˆ%¦¡še
Œ„D‡"aCž:Š!ñ      µFzJT³„‚Pd
 ‚ lb¯(³N®‚õA
EC§®2åK‚ur „(ˆ+8”Š$M        d
ƒ+8†O” «#{ =„CŽ˜5ˆ4=‹m‚L¢+8ŠU
”
ZìAœŸ,¤ ‚]ÝgW§      *„`üƒ    ‚GŸ$
8Dvig‚Šƒƒ.bV¨ƒM
.fŽÿƒRÝ“4ÚYackfil‚o$Œ? 
*‹FˆP‚–°k?
*
‚FƒJ‚  lattempt‚Œ]–°*spE"P     )‚)ˆ.Vu„IZM„&7-3…pj„*ˆq‚Arv~þq~‹4&@*fD‚3S3D
""ŸV˜€€€‚+¿0åÒ‚™.
”P–`
                
          
  






   



          
                                            
        
     
                            




          

            

          
?*6¡Ÿ^‚?ƒ)xq

…i      
<       
r        
r        
q        
8        
y        
Q        
Z        
n        
g        
>        
3        
1        
_        
-        

‰G5!ƒ%„>‚Þv…5A046Eo @   ‚!
""ŸV˜€€€‚,¿0ÒG;WwX‚7…@<Q8aK(ƒK@
""ŸV˜€€€‚-¿0Òˆ9Z6oƒ[
""ŸV˜€€€‚.¿0Ò„7ƒ9
""ŸV˜€€€‚/¿0Òƒ\u
""ŸV˜€€€‚0¿0Òv‚f
""ŸV˜€€€‚1¿0¦´ƒXƒ"§      „*‡!…0PŽ>-$


    ‚X&‚y½‚žv|Cœ
ˆ]‚
!ƒ–%5!—í1B—ƒ">
‚w6P      ‚K®g’j

0nbyteˆ/. 8‹'‰B`‘X-ec‚/„ˆj”Õ5ellx‚F„Dx‡;‚D$/‡ƒhangeset‚%Á
ƒ"FŠ/‘N‚&”ÝV
TN
‚rŒ9¶Rxol~‹¿sâgS=d

œ‚#”2 0-ÒV½¾
‡+Œ:S=d
‚ÏP
‚‘@‚F 0-ú3oumn‚wš&K„Y¡`6…]nstraint‚hžd†7Š•ùfZ/‚tord‚S˜*‚-ƒ~`”Õ[n`dž1˜W½‚8†•|ata‚%‡Y¶/ƒ/‚˜¢&)ebug
E¬•v‘ˆ_@lier~
ƒ/¾8kƒ•,        —ãs      ltƒ   Ø+Rr‚.—ûyRq‚.e‚Ï0‡fÂDd"šQÂ
Ü[ºb‡†‚zd"ar‚Bd:N…sƒ
„BX
   %       

       r2>&šIü:Ÿ$
_C#+O.ƒG‚?„–       .šŽ2‘4ˆh§Yl½…o%X( %       

       r2&3ŸçMŸ,…$
_C#+O.j
‚Wüx
Š.†‚‰‚tÕxlü3ƒ–‚
ŸPbi‚}estW-‚5‚
•Ò]
group~
ˆ|#¾##li‚r)_ƒL—*£U  –c‚I‹=˜0“‚Q…D>ÓE†H' ~½>‚}ûyý‹7edÊ{$®ƒq—5¶=¾=Y‡eõ}Æb—ƒP‡†&åkh®GRtƒ•_—Ì={li‚H‡Ñ|…ÖZcessariˆ=F„,†v‚     ˆ6‹˜~~‚m/†‰t)     Š]M_‰C‰ZˆÌ'¨^¢_ÙLœ&ŠˆˆfBƒfŒ>^³Žg‡NŒE‰‹:–|š!      ƒP…/Xˆ6…\)‹P‚o¤†Œ?9…e     ‹šTÍC†^‡g0„;ˆEœŒ)ƒFŽI¿fƒ;†Pž ‰L
”Š3…©_ž)wQ²}µW†;„Ož!‚Žö{=—3]‡.Lk—Z$
ƒkžjÄ~œ&Q~‚[ÝGK—/\‡nˆnŽg…ŒEŸ)Ÿ'!³Ro—5
—‚`¾‰n|„M¶9zÆ‚‡}‡ƒMQD—1
>>Æt‡?—s‡8‡j
_žaŸ#rRy¶2‡W¾q§N=,„ŸP
li…#fJŒ+¥‚wŽ!–O0Ÿ%ÒcB‚Ç ¾A7ŒVedE‚DT„ ˆ^‡;
,Š`‰pƒy‚]O
q†%[U‚%OAbK9+R          
   aW
012x'$$ !3‚/
%j †g
!!ŸW˜€€€‚2¿2¾Qƒpy…%ludƒ>?Šƒ)2…qMJ*j*e%  ƒ„„Œ"‚}‘‚a‚^†1•Z„†n$‚5†?q^"ÄN—M4‚‚W2)\ˆAH|‹os±"…”—Q„Xƒ|]‚t?‚zJ#‚+„DÜR†4Š‘0ƒ/F"‡`‚‚       [ƒmH‚HƒRz‚‹mIV„<ŠH!„W‡XƒHA„3!…—–*¢$Œ"žX‚
fƒ0„‚26dv†A‚V0Š:&‹‚!«        ¡@ƒƒ
‚e%…(N*ƒE‡JU‚f„?M(„EN…9
‚.ˆe‡\ƒ
‰T)'…i3‚I ˆ(d‡r…‘3‹Y`‚]‚
ƒ‚N(       O8-
…"‚7gG† ,„0…
ˆZ„)…wƒ(-˜ƒ„)‰O…f*ƒCƒƒEq‡0
‚-B‚
„FƒyƒUV…#2…i“3ƒGR:c0oƒZ„b‚>C‚hƒƒ_…)‚„Q.‚=2‚@…A‚X’/‡r…R…@(‰
m‘5.ƒ^….„$5”@‚A<‚Ÿ}h/P%ƒ,$œT‰†U‚F‡1†eW>†!ƒ<…6„&[^†MQ„NEyjƒA‰%‡˜C
@+ƒjƒ(%ŒŽ-h†\/…a$Œ)„\‡k<…‹=ƒ“-)" JŠƒr†v…P ‰
‡J8‚V‡ˆXƒ"…Am™.]ˆ%§pÒ»_‡9„[‚2ƒbI‚N 6&‰.U…_…DŠzU*(„ƒP‰tJŒ+
…yF‚`‰GKƒM‚kaIruR‚…„b‚D„x hƒ3‡tŠ<-.Ô.„o0O„‰6‘Y’LlP†7tƒfŽöƒcm}‡]
 x ‚^—{5]j^"—s‡OM—1&{(‚=|‹os±"…”—Q?J‡b l‡„S8‚\‚V—:‚      ¶
   
I.—-

!SRA‡`ƒN!„–}Zf‡^‡c~B&gNqIÆ[‡kí,%‡k3‡K ƒS—4
‚ƒrŸC‡g
O‚WV

j"
}gG(‡Y‚N…
1xP
<-|`‚a¾K‡gY¶‚#2ŸAKa(‡_:N
.
%=
‚@Ow
‚q('‡]
G®‚#&<5'‚A<R‡…K
&/ƒXP%
K‡|v
yƒa‡Q‚BSƒ/[^2Q„DEjƒA†S‚a®)‡/%†t¦‚‚W       ,D.‚{1ƒn¦P\
c ‚‡8‡^‚—8S9„[‚2ƒb‡cr
 Oƒnw   F'
cU*(
8H\—.+
ƒX‡W#
K^\XuR‚
L8„x>
‚Pg
x-.Gb .\
w#WPl—‚      0needless‚¶a¡i“Ø „Â| li‚‡9—†
tofreeidxptrƒZstr‚hŸ\„\‰0•ùfR„\0fari‚‡“É*wg
ˆ_D‘\LƒW¡64
‡‚O9__auM\
W4+:uE
ƒ    ƒW
†e
D.ƒv‡)Y‚+ †}‰ƒƒ
 ‚3X‚^`‚0‚  '
/  1dŠº:ˆ…:`'%R˜rp°A-Y˜?#„c³ƒ)Öƒrƒ{‹X‚ 

±TI]ŒZ‚9
‚p
Ÿ{z‚^ŠP–o–i  Â(
 ˆ&‡":,£ˆ‘'‚MWŒ3‚y‘$ƒgŽþƒ`\J¾THB`'%R

Kpž|›s-Y˜?#„cŸ$ƒ)]‚e‡G6õV®D  rŸ]‚À7"¾‚F
$‚^„%¾Xcå1d:,X9ìU‡ƒMå‚Llect‚–•Òƒ*ig‚ƒ/‹V‘LŽiüˆ/†k…Ö‚yoti‚‰Yighbor‚c6‚
•Ò]
ther,d–„n„ ž&‚'…
]%e6n‡z†E-yœ,gˆn    ‰~ˆ6r‡u¬V”'‹BƒD‘,¨cU¦8‚“qÉT’JƒZŠ{›0"’MÃp‚L…8¥dWQ§    UT™+œ,Ÿaü   Š „)‹B¶SnÕwR”8H¶^+ˆ,‚?—>X‚‰X+*"$ndƒŒ7>tri‚´Ò²Iow{A{g‡c?{gn
‰=offic‚q‹Sqƒ    Ø)*d8^K—ûI
w*do^Ks
ƒ
 5’      ‡‚ŒJŒb°Pt‚4§E
 ƒlO„/—T~…s™yIšk #v‚LƒK‚ˆv˃#†6,%ƒÄHEI¥>/µz‡fÆM‚
“!&!„j0#‚d

&
""ŸV˜€€€‚3¿0Ɇ'•Õ;O
U~ƒ_‡`ƒsI—;   #v‚L
‚O‡v0”ƒ",Œp
/0net‚Ø5†!‚G»p      š.‚1†N…ø“pŒƒ/‚‘œC¾"¶‚/œ:bsd‚V¹2worku1‡‚ :‚.:{S1!J46!")
=
´
ˆT  ˆƒ.+ƒv?ƒ9ƒ:[[0,O…JÇ^>—j:†_‚oïA‡ƒ.Žö/‚N=¾?³‰h‚ÐS>ƒ-0DõH?žu)§‚.ver„m;„Dƒ„OU‚akhƒ:TN+Q
4‚„@ƒ’O  Š%‚(G*ŽŽeKˆ’$‹.Jl”Zò®eÂ?™s ‡Jƒ0Ø8ŠM4‰yw™/’dˆ
ŒY…E…?‚u‹QŽ        —\„y*†H‰†?…
Ka>%,1–Eˆ3QƒXÃt‚t‰f‚,ˆ-dW
†SŽ9‚b\—
„>.ƒ'‚‘#Œ!'‰…t†5‚)Œ
ŒM*…ƒN‹o‰s‚K!ˆV™l‰!ƒ…<3ˆ4ŒH‰/u."{
d>
3V pz(ƒ,xK‰IŸA“-t&‡P‡Y‰]‚p†L‰a+‘"…e±
$‚!ƒu‰hŠ-eL‚|‚X+ —@dŠp‡1„ šIˆ‚Fƒ|‡A™kfˆrˆM‚cƒYã}Œ}„(ƒQŒ
$‚^>‡@ŒDt…/‚k –D†+’%h†)ƒS‡6{›D…
"„   
j8xŽöGs‡‚0ƒ¶Yy‡P„yžtšÂ?™H
4    D‚\Y9
`}…'„{‚AΟ
:Ž„yQz\
K>%,1‹OcÕAÎlÎ}Sx‚bŸ‡‚Hƒ
]‡bE‚  
#%  E„0z=¾):¾9M§?ŸN+—-{
d7
3V uz(‚ixK‡a—‡f—7‡anƒ…+V+ƒD‚‡„ZŸ ‚‡l
+NeL‚|,WƒD,n   ®Ÿ ‡       ‡§fq‡d
}^>

‚Lt
„p/zQ[‚3’%hƒt‚Q‚ŸrL—
‚n

28thelessg‰‚=‡Œ„JG•¢<†T‘V„O_`²_ŠA0ˆv‡.ƒ2Š/ƒ!•
Š9Lƒ1‰1”@ŠA‡m•S‚@‹¦Lž¥nB³‚9ŸE!Q&‚°VY2„-1‚˜‚KŒwí7®uHw„O
‚R„%‚„1\<SŒ*       7@‚ƒ% …7¦ 
ƒ        
GU‚uB,F5
$ƒTˆs’5W„X0@‚'G Z!„?‚&
        ƒr¢<0[e
-!       ST^
>

$=    c
QC:        Xƒ‚]
 ‚…&'d…$4v]N
;
+ o
@U+ƒ0
ƒ'YxƒQ0'‚-…6%ˆ/‚<ƒe        
'‚.ƒ †Hki…C†aŠzDƒp…u‚`>8lAƒ
‡‰fL4†p„l;$‚ƒ4&4„BQƒ‚p

ZX‰ Ÿ;”…M…9„
,.#ƒeŠdŠ<‘-…TŽ}Š/9=Ž‚%Lˆœ<x‰J‰jƒI%$‰g/2"ƒf‹n„M}ˆ`,
‰L„‚…q‚D‰G-Y™k1Ž/
j%‡`„jŒa
FŒn2‚x
ˆX/'![ƒ.‚o„Œ1*‚4‚OE2„?+4‚.ƒnL„4UJ!+M%k#(Œ,Gˆjh•_ˆH&,…4…{d‡‚ V‹n   &o‚NbJ‡gT„rŠ<„4Œ,„
Œ6ot„D+8Ot      
0
1
0

m@r†{‡"~ƒ]‚ds…/d„.†‚kxP2{,
aƒƒl„ƒ#?T‚m[y=N
 t’9‚5@†$@…‚Q‚s‚5‚q/Y‡ƒ
v
‡R‡ya-ƒ‰%P‚!„‚9)8…„dƒRg1‡&zb&Šm(/‡
„iI‚(1‚        V…}+
~I„m$„^D‚WNCŽ5DT/‚ƒNYA„,ƒŠwO8ESƒ;†
„F‡9‚O‡u
m‚!ƒONu„ƒWE-/ƒKs”$„ XT*t‚$…oƒ;r
‚Ÿ T‚ƒ6)(C"…c$ƒ%…x.H…]ƒr‚:|J0ƒ‚       K…_T4D‚ynD"ƒS<‚};WD‚]L5"(]‚Ns--ƒ<cZ>s&‚1!ƒ3E&9'Z?/‚
‚UhˆL-‡(„9†gƒP7R<‚]‘lF‚ƒ]w‚HƒdL`Œ‡{/t(‰ ‚K†m"†NŠ}ƒ(Ž0ƒWƒwH…]vŒ}ŠG„|‚#7!‚v„pR“Xƒ=—cŽAˆ(`‚h„6{N„R8)/12p`†&H–†
 
‡4h@2ƒ}…3_s‚Vu
–‹ )‚5„.j…EƒZ„,nƒD
'^$s,%‚5
,gro‹.‚
!!ŸW˜€€€‚4¿2¾‚t\‚†-„3†ƒR.‚{†(Š…Z‚'!ƒ„Oe~=<D„N„-Œ9„R6`…2@
z&WŒ ‚uŒ]ŠS… dm„;N„u‹87=.Ÿ–,’@-”c .„Žaª’        É-|‚|ƒo&‚y„oˆd‚T0‚'
_g<YJƒ;“K%™e„N‚N‚ƒT…<0†q…&(‚9…D$*‚*„2Œxƒ0‘½-,7ƒX^:…ES ˆ~%$p-
7‚7v†-W%ƒ_‰v•)ƒ
r=7‚.‚+0
o|Q>f…7„zŽöt(kiB‡Z6Q—52‚y!
\

—T#‚@;   ^‚N9
,.#ƒ"sˆ$‚-‡31/9=;‚%—4SHX<x‰J‰jƒI%$‰g/2"ƒf‹n„M}Pp
CL‚&‚D‡U1
&%
‡%>‡D
%   Õt>m~4—.1Lƒ
U]!+*T#‡`%,Gˆjh…ˆH&‚z
Sv‚       ?    
2    ‡Eg
F‡f_J,By‡fp‡qQŸ
§w$"2‡cx3Æ&k‡iN—7
q/Q<‡h—4BJ^-z§N
6I
)13‡b„+
~I$
xD
DNC
D=F

d   O¦ZH—N‡]
_W¶W
"s
O‡]CXTtLƒn>r
‡^
‚   TJCY‡kuLL:‚     NF‡`
f#w*
L„‡j/t(—6
f>‚
#H‡[
„#v†ƒ)„|
7!‚R‡‡Aƒ
ƒ)‡O{N4/12p` &H†[

 
0h@2u_0M#OT—DL‚)‡[Y
LG?n
^$s,%U
‚
‚Y  Wk%
GO
!‚
|e~"<D
.  z¦J]^¶mz&‚y„oˆd‡dcn‡d
g‡VJBH
%
;‚Nn8<0*—‡0"R*hiƒD
mƒJA1m-,7ƒ(l)x
‚?
r%$Y-
7sM
v
—‚
0
§0new_address‡Zrchƒ¹~        
      ;—ÌN‚/      
      ;tablƒ”9—Ì<†bx#Š      ark‚L
L!ˆX:
‚t-”ž:!Öcom‚…zdbƒ
†M—Ì8
:erƒ8…
’1.Kq{9•[       …{
„W'
ŽÀPŸa¶fK0™h„§
…G–h•B™6›I‰UU+l/…P…]    Šf‡EŒNÑk„$šŽ÷/Æ‚5¾‚5ý‚*Š&‚ßü‚[üzSŸ*@—‚®|ÎYõE‚      fŸFst~
€s¾9keif
‡}
li…‚5\Š@„8
(©_Œ‚Y˲F„.”(’"Á,Q
ÁZÊ#†)ƒSi   ƒ.Ü•œ
‚Y‚ßfqâ!B¾[
IZÝOÝ05‡e?®RÆ"t.>¶y
ˆUnŒÂiû…õn†Û/Vman‚4
Œ>recno‚$ˆPˆ4†1ÄYˆ¤€]owid‚ÏPÝ»tab‚KƒDUE”—1
U+zip‚r
‹r–Çu=
†X    ‰|†^Ÿz‚2
Xc‰@‹F‘XiT 
BL‚   
Ž+l
‰N t‚†‚M‰`A„GfVÈ^²Y†2
›-0…8BX‚ƒ     ‚ˆ„W…h„‚x…‹
HƒA‚C„M8‡vY†j&‚Kc!ƒˆhƒ/†
Eƒ]„#}iWRFƒYƒJŠ)‚A"¯>“5<©  @:‚y‰Ž^
‹!‡t‡d¶z=
}‚W„E… ‘ —Ž@”†…[‚+0
‚pM¤
‰Y%a‡^  J•.*”5ˆ‰b‚WX‹Eq`‡_„xƒ-“R†A‚+¡?†œ„$…`“      ƒ7cŒ?‹XŸA™Ke†P‰V’R‚…PƒL„8tGa–T5.R»d0BŠŒ<
vŒq¸‰J„X…_’s‚M¢ƒ„im&D„|ŽPŒQ…4‚B:
‚…+‚ Qƒj†l&-‚n)
     Bˆ~‹b[‡\‹„!Œ1ŒG‰|†{5'b†3ˆ‡2‰5„6‚~ƒ]‡w‚`‡!†ZžD—;"„.‚q…=)‚$„K‰p—1$Œ]‹r3Š"ˆ¥&ƒp‡y‚.R

*Ÿ
‡kŽö‚Q—.M—7dYcˆ^‚pZD‡:
0—/Ue
‚S    …K*C…h„‚x…‹
HƒA‚C„M8‡vY†j (‚[
J:

""ŸV˜€€€‚5¿05®&‚Kc!ƒˆhƒ/†
Eƒ]„#}iWRFƒYƒJŠ)‚Aþ}N
Š)<}@†‚yƒ4åJ
‡ŒQ
‚p—1Q9—9³Y
Q‚+MVÕ`u  
~‡bW
T
1q;x¾n¾ƒ\‡‚4‡l„„—aPx>z¶U6-t‡ZF—8_T5
R‡m
!®](‡    —6W
t-r¦:‡j
m‡ §‚‡doP!;>ƒ#—‚q
‚s))$c‡cvK"
D3‚z}&ƒp‚M)+
0next_stmt?JV!}Š(idx‚ÅMf‚!ˆ5Ça—X†\‡!„v“ØVV„Ám,Bieldƒ°kI—ÌJ
IrameB/globalhitcount‚ý
ŽSqp‚œ!
Z=$%‡=ˆ‚v)10>0 0 QG‚K}6q29‰)f     £•ÒR;$%b
‚v
10>0 0&
PG‚K}6q29f
$)Ÿd    
‚uyen”€‚7hitcount‚¥ýŽLicht‚ˆght‚‚p‚l‚¹iÉmÝX¥Ém      changeset‚ƒ)(ê
-(mbl‚‡A#Q”õOn‚%“Š~ e‚<ø_5ƒfƒ ‹
U
…MN
‚„Bª7½XD„ÁƒdýqŸ‚ß}teen‚’ji‚b…aV‚„Bth…øªM½XZˆ½shizawa‚ŠVsan‚.=ƒ.l‚ˆW=…lŠLñZp=Left
†vel~
€:¾ogn‚B
š<(%ºGvÃU“Ðh
(‚¡
)våd=op9
$tƒ       Ø*>‚‚—ûx>p‚mz
Ÿ9ake‚†c³S†‹A     Ô"‚#ôC„jˆXSƒûjz—‚1úLÆG
j"¦`tchinfo‚¢fýŒ1n‚c"87tƒ‹Z•Ò]7t‚]‡dZn‡B=‰5
Z
<2
h
&

KˆZ
™w3Ó}¥u
‚
ˆÕR‚Qn‡Io\ƒ\P^+g…a„)
ˆdcv‚\ƒ"ƒ`†arˆ6X‡R„|X"‚S2‚#PJ„O:‚A‚u‚(MKL‰=„L,„rH‚supdpƒbO!s8!ƒb[m…g„u"„?/M%VQ‚…~r}‡d‰7
‚U*u…\ƒƒdƒ=…Pa
Šv‚&qƒC       G!^~$UNDvY
kK*ƒc
\[‚-‚EHH&6tj
,   4
[i‚3
*0   N+3
&*4Nn
#:
a7
7p…'"‚Fa?},
1a‚X9-+ƒ6?30
v„‚Q
Gt<‚W…9'U…-„M'.‚\P
iQd){gLS?6‚z!†‚b‚A„s‚ ‚?OB]<‚3†)‚=15[0
Ou"‡H‚W„Š-d J3ƒy'ƒB_0>L:)4‚f4‹>}ƒL‚<„:„7!*„{ˆsƒ ‚sD…j†+l"LrXle.yy'-(/&‚9r _1<)((D)]ƒ)5P'L‰Ž†bƒ,dŠid…o†!      “([ƒ^ƒqƒ~„\"…"‚*A‡64‹K]…
G&ƒ,ƒs%H†H‚…%‚     r‡1
‚e‚:„w
…r0+‚<ƒ2"-@‚tcƒD„m‚sDk…Z#…B|ƒ…:Q‚‚Aƒ.UTZEZ‚Z9†q^ƒqG…L2ŠKo‚.:…JlŠ
‰I…~„{‚IQ‚Jj3fjƒJˆ)‰Y‚j‡QL‰8‚/‚#WŠŒƒk ”ƒ>•ƒ;Š2‚1ƒˆd,{‰ƒHn‡HZ‡x3
,
l†&…=ƒ:rƒzu†n²&‚SPrƒR†6ŠZƒ[ƒ)Œ]x‰2‡ƒC‚O`‚Mƒ,‡%l‚;ƒ4…ln‡H=
tf…G„]
ˆU‚h‚A%6.Œ‚‚k†
‚9ƒ4‚†ttŽ†|ƒ…4Z YƒC„w
0`Cˆ9E&‰ ‡ja‚S„'N„j%v„,B‚ƒW†
„^@ƒv…3ƒs‚Ht?&…mh‚Q‚5O‚N‚%:„)‚J‚t‚u‚_ƒy‚h†=‚„7Zl‡ƒhŽAƒH:=z†,ŠsPP!ƒ/ƒ_„ BmC6
1'‚:"‰|I†,‚;…6ƒ     ‚)‚†V_NC;q„‚_ƒo‚wˆ$†,]!Š:ŽNƒ8‡‹?…g"h†0‚w‚O\„…4ƒn„"…U:-L.d|J‚^‚q‚…<…%ˆz… t‡c~ƒY>‚Žbƒ9……‚Uƒeƒ#‚&SA„…J„g‚Nƒ"<ƒ
L
  b#”W*Z-A„4FK"ƒ^ƒS6†Yƒ8ˆ1`Hƒv=YBDB:„F„zN‚a‚6v4‡%„<cˆ‚2†}ˆNƒ6%…yZ‡7c‹I„Xƒ@‚V‰_ƒv…'[-z‚E‚1Œ )#
b‚#‡r
>T
‚HƒOS1‚n8G7>
S‚!d$‚9[‡,(-„+<,‚…ˆB‚M„ƒNjp5-
‚QS K\*ƒ"U_„L„}"9"

m
'&3 h!3q      
  ŸX˜€€€‚6¿4ÄŠr‚b‚…K0ˆ‚Eƒ%;7†_‡k@„c(/†@ƒd‡N/Sƒ…8ƒ‚*„.?†"Sb&„>/0TLˆ*AD6ƒ8‚;<ˆk‰      Ž%ƒ\†>†<„/p–ˆ&†U   „BƒW‡wzƒ/T„I:
w6l&O/|‚F
ƒ$$[‚QˆkBŽ^„ ?G
„Fg+†]ƒP]‚.o\…‚Bˆ>‡S‚(„g?‚z7„"7‚_:‚C    ‚ƒ>q ˆb‚v…`ˆ,Pƒqf4„?ƒT,„W…‚/l…yˆ]‚=F„/ƒ.Œ‹;‚
Slƒ*‚t‰@Q†//°`•P™|¶yÊ9†]…†p„  „q‚F&:†[ƒZ=R DM"Le‚#‚o…J&‚`‚yˆ)‚0Š^z„ef…gcv‚†+„vƒG‚}ˆ},<_„<ƒ)‹7‚
-sƒK‚‡$‚?s‡in„1†z†[M‚FƒrE[:(‚oqG…M…‹hˆ=C”k7‚G$„2Œ`KQ,„„u‰        3…_ƒNƒ1n‚pcRo‡~Žöx
‚Wƒj‚d J3'‡\02‡c
H9)4R,O%‚s/‚RONl"L_-e.o5'-(/&"r_1<)(h
,)

ƒ)&‡E#t
dBd
F   ƒ|‚7ƒqƒ~cY‡z*A
†4U
‚R]‡c7b&nKL>~…%‚        r‡1
‚e‚:„w
…r0+‚<ƒ2"-@‚tcƒD„m‚sDk…Z#…B|ƒ…:Q‚‚Aƒ.UTZEZ‚Z9†q^ƒqG…L2Ro‚.::‡+‡j#„q[„6‚IQHj3
ƒ.j      ˆ)…r‚   
sL‰!‚!#W
ƒ,‚
‚           7‡y
S%‡Y=—*®°N‡
-`H
nG
)‡Q‡‚F„?ƒC‚O`‚Mƒ,‚\l‚;(‚v…ln‡H=
tf‚l„]
ˆU %6R%dY]D11
>t8‚Z
 …,Z Y,h‡.‡EÆ5*‡E¶B'—:—6k‚i‡‚9‡Z‡j‚)NU—17P‚M4&„Ÿ„\‡m
‚3+
‚ .‡[‚1…4s      )4-L.d
J~Jff
Dp‚<^qP
L>¦ƒ7Qz
,A‡heEt¾8?‡_y$A
FK"‚
2S‡`0
$`Ht=YBDB:%ƒHI
     )   ‡S`0P
"+ƒH<,g
mC‡VjA
-D1*c"U_„#‡ƒ
—7)~‚;7a…^@
j(]x‡‚*F/Sƒs
‚uS„.?ƒ?
SbJ‚(>/07F_
&+D‡‚ 
&;^„$‚I‚$>‡UM.†I†<  „1U*$T-:‡B6‡h
F&OP‚h‡i9FL4†zƒN
1G‡rgŸ]‚.o\V‚B
_$$Yu‚y"7[:    w}G     W;ƒ)F0@f¦?D7
h.g‡hn4ŸQzS]…†p„     ‡]‡db‚/==        DM‡_b&`
k&‚y[Hƒ
{(   !c7‚-—\‚"U,‡dV3<Q(*‚K‚W‚?:‚h5!,(R0KE[:(‚oqG…M}D
\:$$DM]4}H     3]
0R
—Uc0no_ckpt_on_clos2oth‚U“z”å:/bodi‚†C
>—%‚#ƒ.¶!…@™3$
ƒ¢„%Î<‡‹2ƒûecasz
 3/ƒl$icq
—)5æ6Ž!Žv"½0 ˆ'µ*‚kLicq
ƒvƒ†Rm—:mv‚‰h) 
^e_comparz
 >onflict‚³Kž#‚s¤^ÝXž}ž#‚s¤^de4


     Y
„"ü]‰m#!P‡

4ƒ/z(6i
(ƒ
Žf#BVm+ZD?ƒ"  ‹‚Caƒ-!1
"6œ]
#%
/)‚5‚:½VšjŽ¯ƒI
5]†_#!¾.„

4((6       
    ›~
‚dåD3„meÒz^+ZD?lspür‚7
‚ aH!1
"Ÿ ,‚
#%
/)5”/0‡g4¾\[Ÿ6_idx‚œf•ñ‚no‚S¥}
”Õx
)
follow„1Ï—Ì^is‚‡rŠJ“؈hlfn†W1‰5…l       ƒT—µEocka‹   8|†‰m1     •£n
O—8—h^(ƒ[#
""ŸV˜€€€‚7¿0º‚1 0nomem‡;A
ˆ      RLG)ƒZ*dIå?†  ‹Z~…;…@…ƒ#Œ$„r…Z´ˆ8ƒ    ƒW„WN§<½W„‡„aâl‚¡ƒg‚°g»4H
‚8¶SEƒ9in
‚(l‚Cž:m¹\-üs
„*m
+\-utexƒn…p„

ˆlD„8…LZ‚‚Z‚I†Lw*ƒ0Š-F7rU‡--<… QG&<X:*…j‰w&‚W/+˜qZ=œ"„:Ko#?‚#b  Pl>L+
‚yƒ; I
….zC
k49
1„%ŠS$
†u    r‚G Q<„({…W}!„,8ƒP
<(bFc‡‡&ƒ2Œ}J†A)G‚9,Š•xƒtƒ«OŠYYƒ^p†Z„E„?ŒJ‚Tž$…u‚!„5„h‚:9†
„‚5<”Dc$—C‡&‚{‚t 0‹2²ƒŽ•u‰”:…‰dˆ6ƒz{ƒƒ.Œa„AMZ2’hqXUqq‹Uqqqqqq† =ƒ/…{       …Jˆ,^Š†r¢*‹i‡/¡j 
ŸP(„S@£bmƒ3‰#ƒGT,„6„Y†‚p&1‚'&A‚…S›ƒ~ˆ|:
!ƒ.‚\ƒ/‡1‹4‚|t‰‚ˆl„J‰ƒ#±/,.
/+
6m+^†?j$ƒ
6‚;ƒY—/‚&‚RˆSQ„SB…_1y‚\ŠPŽG
º"70‰]‚r„eˆ{WŠx“j†+ˆA‡5
M’ ‚°2)šz ,;w‚X1ƒ".J'‹j—q„s‡Z ‡µ
‚D…q"‡Q‚{„ ‰`‹Q‰
ˆ1Špƒ+‚LWò7sóW
M‘v`‡>…‚$OŒ5ƒ“\¡O‚n&†Y†Vƒ8y†q™V‚e!1–F‚YaƒgƒZHŽþOR[JJ]®rGb/Z…AwJp†Z‡</‚MO—;T‰V…u‚!„5„h‚:9†
„‚5<”Dc$—C‡&‚{‚t ŸK
†ƒƒ&Y
…„‡B5‡"Æ(2‘qXUqq‹Uqqqqqq† =‡_Ÿ\ƒu…^‰P‹i‚H_"}Ípy®¶XVI®rY‡„
‚|§Ÿ‚‚}¶9/+/S+^‡j$¾0‚&‚Q‡vB
81‡g#‚\„L—/®ƒŸ†6„
‡jI‡e‚x‚/)‡Y;.
|.
r'§7e‡QBZK
 ‡‚KG¦‚‡k#®kŒMƒ8?
~O‡d0`F
‚n®‚r8‚^‚e!‚"Ÿ8assign‚”
cƒ(ˆÆi   ‚c‰q×{_'—Ì2
ƒ%
g    ®O(#‚6{_'    disclosur‚=e
rZ„kS ˆ
E4%64
'‚†"2¤*Š?<´5…(
…Y„^ƒ
´yaÇ ‚s8„WˆZH
£r…p‡b*‹
ƒB¶9kk…~˜HƒHko KœSÄ@¾MC"    †IŠ#‚$>‰_     C    ‰`
‡gµE‡zW<„3…(

…žAœ#
ŠPa‚¡^7®k5¾2ÆdÆPk
;    *®„xŸ/m‡hH  t"ÝA        ‚$>®Æ(sens‚Ý+Žo…\:‰,û…,ŒE†ã
+:
'tandard_entry_pointƒ„1˜ŠƒCd‚volatil‚C”B$ƒ‡“Ø$pzero‚àÝË9onC„#¶O=p‚~‡YB¾d–p܆
¾GƒÌtfunc‚‡e“ª%r‚f‚r‚„#ž)1,†_
t#Li  …b-q‡y†G‡v–2¸DŠr‹N–ŠŠ'‡w¬V”'ŒI
Œ?Lƒ“. (ˆ@…¤|»Fƒ\hƒZ•SŠ}›2\u
=žG‹J°-•+’OÃ
e‚L¥qZS§     W®qV
‚,ex‡`EõŠ"„+ŒIŸ
L—6+‚©%×LŸ(d‡a—>Z¾C§0D”U-,
$&bert‚O”ÕMderbiyqoŸ‰ ‹!•ùƒF‡mal‚k?…„k‡4‡SkK
ƒbIiƒEˆ  …Tƒyˆ1ŽkFu‚!…7@$‚Q
‰jo&
„=H
†I}Š‚Oˆo-!‡VZ‡V|ˆ6
†Hˆ4¤j†¬‡.‹o"‚
Qƒ!„±w|»ra‡‹        †l„t‚ƒ%ȉ‰@‚pŒmC„‡h‚n‚+,…VŠ=„
Œ(V‚x%‚/†5ƒCŒ…<‡Žh‚^†(p‡`OKK;H+G
a1
8UƒG<$
'0ƒ>+
""ŸV˜€€€‚8¿0Ë—‚j
…*‰XŽ<?À7  ŽƒS5Ž?…aŸW
‚qdƒ‰L†y‰D„.™[‚UMŠA†ƒ ƒ/…P‚Qƒ1Ž‰S…\ËyŸHƒ_‰~ˆn
‡y‡6‡K‚*a„`'’e‚d‰:’^‚wƒ\„dˆQk³5ƒuˆc„#ƒY‘%‹7”      ‚O…V3”#†d‘,‰f#!‹zƒƒS"<^iA‚v‡eI„<‚}
‡I„M‚xƒT„hG•6‹æM‚h:‚„L ˜L—1…D—%…XAŒWƒU3 ¯PTD‹y¸Hb…h…X„@ŽV…!‚ZYƒVŠtŽöu{
P‚O
-!"Z‡]
|
d¯†‡Ay‚@‡@Q~¡B|»rŸ
    ƒ‚‡Z,(SÕm‡f2‡c‚%‚/"ƒCŒŽh‚^†(ŒNKK;H+G`‚9®m¤    <‡gh§~¦‚>ƒ8‡…w5‚UM¾¾AŸ}—*NX—‚=Ÿz
ƒ‡ˆ.‚w—‚DH‡8/‚~‡Nv‡=—9†B‚¦y
3
`f#!
*"<^i?¦)§
‚Zh —7w‡)g‡ƒh
XBAE—pB3 ‡w
†T"E9u
ƒ;hLž}F1—%
‚Z        0normalized_sql30
0;-·ùŒoth‚
˜?'‰~easterli‚
·Tüx
…askipscanƒ Ô?—ûƒync‚b4†W

Slu     YNLzH‰f—ã…FtIS#@ ‚($8%#$D‚Os%*'%(*       4j|
w(=AYJ
c$+#
l)a4‚%
' b.q**‚+.(     (
[‚!"d"4‚Ud#M&d 0;4ƒ,b$LNX#…rC‚.'ƒKN-Qf,;    ‚!I<‚=:t &
'%‚g!mg^&Dˆ8K‚}t‚fZ4
ƒ{$\a[‚y+$jqf=4"
4U.>HES&L‚8["Ea$e3@3]
[7-ƒUa‚@<>/9<WjU-5F^\Q+TM|^v>Jo
IzQ„U|
ˆg?

8f5 30$faU‚E^^:([R1@R‚2>‚
V
+CD<7$*?MY3‚|
7di_$               
      aY6b{‚hvƒ$&"3%Pz„„=(5C:_\        LU:+‚e
‚6B
W$vvB6" :"Q=0ON+z!S(.\
F'q(1H5P[Q)
:

WAg;T@]|‚Ro!(F.
H
E
‚q/*|Ud7N@M4*9 ='ME'      
$/3^
_q-]R75        \
:|D+yKmKG$
       j‚~CT L*`P‚Uƒ 
"nV
GSl[‚dzN",D)F
N!`XH**
8BfV „5|X‚q6‚~f= p
s.
 :e$
     %
Nu
8M
XW91:d‚E
4
$_‚$„|zS\‚*G:&."(‚t*(pK**l,<0bx
,$(oe)(l(z‚E D‚Ul1(y{ƒAXƒjO+|ƒ|;&G4&I„a-[NC
$(ƒC,n!%_9#a:"R>‚(‚?c   
-}M&%5u6A#V+"V.ƒ7l
vn)$‚ 9z.1B[$xfL4;_*X;+%
<hyoNF      S.0‚h‚9‚*…nƒ:JS„<
U‚Kj |i(Q
„U‚+†b‚g…6x2ƒ^I‡,:b`]pa„'c[[…1#‚sip-„
+9/‚‚]‚'‚U‚%‚
‚K‚}qƒ[OVE9‚'=ta"nh/]…(#†E
‚q6‚B7‚…A‚E&I;]PS
B


P.=…dO"^%3g+‚*,
ƒBI#‚yƒ3‚     ƒs9ˆXw$
Qƒ…hdƒ.‚'=!E;……/@‰$Y/‚CJ†yƒ]‚2ƒ*„y, %ƒbPe=!C1
s‚#V7!!U„ „#bqkƒJit]UƒTKE5ulfP
a&oƒ( ‚+…_kDˆX}#[#ƒ[ Ws<%‚]„79uƒNf-ƒE                P/#/ƒuEm)=*
&iC‚        %~$@Sm3! d<{<HC-D‚-(‚‚7‚#J      m‚Ia‚'(T%Fl
R&6%}\#F#6# 
J.Aiw$IYjH‚S‚‚V
…ba)NAƒ9ZJy4!wƒw=‚\\^y"-ƒ
WB‚D‚Z„R„[i‡&=]?fƒOW‚92(&,!T
q>9ƒ/†‚gCz‚M
‚m&"‹aBS
+9B+m
c'$K>SD…1ƒS>M')E
‚ˆc8‚I$/X?*D‚WsL„M(2@"‚y(‚TŠ
ƒHƒ9ƒ4‚iAVr‚A‚.%‚

„‚wE‚'‰p40
""ŸV˜€€€‚9¿0Ò3>,"†F(,tN1
B‚&D&( \$EO„Y@…   A@O1!!ƒ0T…U&$r":   !pƒ0{WX'''.5'''''''''GN''''''''C'''''''oZ7>'''''&A-‚p‚aC(‚„rƒ1^8&„O7#7LM   ‚Ra)Z4‚*„S"„<C&ƒ$‚-^L
L®<ssJ]%t
‚46!"=DD]o`;.‚4 !‚G?V*5M‚M@apKwA7 J‚nq ƒx1‚$ƒH0^C2KD„fb‚FIf&,W‰$L†WQXƒH†ƒrdm;qF‚THƒRO…O01?u
AWw
,‚Y9N:-9`h@r‚J„ƒmX‚H„…‚@4ƒ72ƒte*ƒ"„Fw-4N^tW|>ƒg
@W
9(*JF#[0#=*!"
        b!
#,

 P(~‚@
JY"W'/&‚72_M5\"‚l=V‚{D$hjJP3‚F3whc:
‚n‚2qW+‚V‚#
G‚"IXW/[7?ng72‚@F"H)*1%GV:‚hƒ'‚*=C
9l‚"…n6vƒ
b<‚Lo
T‚T)…q‚OX   `L
VQEtƒ>     
6%=4.ˆX[Rrƒ(‚dO2‚T†1…5!…b5# G‚?ƒR3…jiL‚……O‚Q‚F‚WH     T‡+pg3a31f3lb
ƒa6 ‚QKym.‚Ho{!^‚=  Dh
W)J%&;!!QyE*[DS#
  3- „EK\.     A-"s+:#l<I‚Yuˆ)‚‚-VN1#‚iFO.Gƒ{‚v‚nƒlC‚qƒ‚  
ƒ…_ƒfw<„F‚ 0,†,‚#Ys/A4L‚70‚C_ƒq&E        J‚v3ƒz‡d.]‚He(K[E2&04*ƒ:‚;&BRƒVX@+I`8
„aD-;?ƒF†.2ƒZ,$
ƒHv;G=F=)5<   E      M‚Pƒ=Sƒ0ƒ<)9‚`T‚2‚;pUFJDv+$[c‚\.d0%W‚O‚$ƒ5rd6Bo‚$N…uxP$%F|Q?‚j‚wZ
‚>>9/@
GUG7'ƒns,q!Fƒƒ6‚jM‚OtC‚9bf‚
?„ƒLƒ8‚=4‚r‚
    $Sr>a*\ZUO>ƒKƒ6ˆ5„sAƒ{…(/ _J$$ƒ…Op+WK7ƒ)‚Qk…AF!…
‚#‚‚wu…„QC‚A‡…        
…‚71‚k†hƒ5ƒFƒ/ƒhw8†
„'\1
†=!]…N8"l6=‚#S‚=5U[$l"<T N'Fz‚-‚Y‚=‚bVu‚‚}R_-‚0wwk‚Fƒ&66:K`? WLƒ+!Tƒ;
^U‚%m‚@„#‚lx+„„bƒ'T>ƒL MF)ƒu‚6‚>h
,‚%ƒp`|.% ]ƒXqv‚T
‚†`n‚;‚8;        0}‚‚F9?‚G`ƒ0>0`'„‚?/=HO!tZ0oie/$
‚P6#m Y%J2%g,za     ‚V
8\&V.cƒM
?O1l
#e_&`1k
9<f3BƒV,C‚?f2#G(8k<h0SIk8Lƒ
G18   %
(
`#31?y
=ƒ)DTI.M‚{T=#…K‚‚>‚Nƒ-1i   

      2K‚<{ƒpa„,_?).?)ƒ-Q‚…,…#N+u]ƒ  *‚qYD†0_M8j)-‚J‚6H~9‚‚~†i<‚S5‚Au      ‚ ƒ1BPV$‚I
XB‚c.2=+^I<'K?Uƒg^mwt\<.P      (JZ;
„ƒFo‚.X\D‚*L
_%},;$%‚H6! 10"D/H7‚< ‚ 
%Pv8p6ƒI„+xƒD~ƒ&ƒs‚1*‚GA=‚;vE=;ƒG\ %‚MI-VH+‚gn0TX-‚L‚'IƒCa‚rI/"‚0)w^‚|„Aƒ=‚y( ‚. E-%‚‚O‚?!A'ƒ#-,C
ˆ
E\;R-G‚4U"‚K‚I*$
‚,X‚I‚H‚3Sje‚D‚4‚‚Z7ƒ]Xlƒ7‡Nƒ!I‚>?39ŠˆBL"+/'   UDB40@.$‚Qƒ6"0‚~*Hƒ2#†nŽQ>ƒ‘Gƒs‰5#ˆN‡Zj”RT
ƒ/‹K„ƒHQŠ{ƒN]ŽX‘h–d-¢r34*†-‚_ƒo)*z.…4lp(‚6Pƒ~‚Lf‚
Y‚{2Vƒ,‚4„J‚.ˆƒ<8ƒ‚Pƒ[<‚_‚_ƒ!ƒ4!‚r,T$ƒ.8:„Shƒ4XQbdƒƒ>
\‚†_J‡‚j„U
,U=‚=.;6o=V`(oƒ‚FAƒƒ„x    G`„B‚A$„@ƒ=‚`M       .FR)…h‚+<D‚„$‹1‚[M†[ƒ
ƒ[‚?…a…73ƒ4VO‚„ƒ
†}ƒY…d‚LAc*‚D‚‚l‚s5„/{\ƒ)     )R^9oƒeG2‚,
l‚Y(   ?9‚M_0†"‚]Oj8n
C‚o‚?$,"gtUxL,%‚`
L=*
}ƒƒow"+L-9‚3‚+(ŽösD        S.0t$1<-S
V
U`    i‡O
r~„10V66x‡`.
Q‡g\‡j/^:K*‚
j
qH
A9a"
?h/]
(#
a
a
@‚q"‡U3‚-k0Y

&I2
VPS"
B



\.
HOGD'3g+t
!
ƒ4#6$‚     ~,w
k
"‚d .‚'=!E/ƒ<…/@Y/
Jƒ‚2ƒ*9,
%‚y‡)a=!C
=lV7g!U„ 
ƒ2bak]t]U‡ac
#QMPG
% k
ˆX‚v*}#[#ƒ[ Ws<
""ŸV˜€€€‚:¿0®Ò%‚]„79uƒNf-ƒE         P/#/ƒuEm)=*
&iC‚        %~$@Sm3! d<{<HC-D‚-(‚‚7‚#J      m‚Ia‚'(T%Fl
R&6%}\#F#6# 
J.Aiw$IYjH‚S‚‚V
…bï"
Q!w8=#\Cy"##
BB
8
lR
‚ai…s=K
?f"‚`W‚92(&,!Tq9‚+‚‚gz‚M
‚m&"BS
+9B+&
c'>FD…1
[>MX
"E
ln8‚1$/X?*D‚W
fLƒ@"‚y(Nƒ
ƒ9ƒ4‚iA‡ 8J!%
F
PEEs]
0>E<(‡SN1
B&D&( —4!fcƒ0{WX'''.5'''''''''GN''''''''C'''''''oZ7>'''''®o¬8<ss‡f[%-  ;
"=MD
o5C>aOwA7‡H‚9* R1L‡`"0^C2K
qD ‚b‚FIf&,W‰$L^QX&†ƒrdm;qF‚THƒRONfO01?u
AWw
,‚Y9N:-9h@<.‚

XAy4‚2Z1*
3"UA-4N
d^oW^‡N‡f@W
9~(*/F#[9=F*!"
        b!
#,

 P(~‚@
JY‡dT‡hN<'/‚72‡fF
‡e
W"'=.(Ÿ[F")§
42‚%h‚T‡b
‚r!¶Tj]Q
a‡g]—74v1KYm.$‡b
Fo{5‡hE^
f    ‡$`)J%&;!!
}QE*[—4 A-1Jr\.VN1#Ÿ&BYs/A4‡e
q0_
q&E     8<K3z‚&‚
‡,('‚He(K[E2&04*
0pBE.u@+A
x
`D-
+?89F
ƒi2
K,5

@Ov;
Z=F_)
(
5    m   ¦Z7‚`T+3
%UFJ
6‡L-;9&*"z‡V‡h
{>®qn;
:M
$tC@bfEbvLM‡1
        $Ir>*\QZUO‡ƒDe‚kkkƒ{m/ =J$K@-
   4‡9+s
U"l"FqX|B6‚"!h

U4m‚@ƒT1
`+‡&|ƒ'TpH
F
)‚0~‚>‡f
,|T`|—];;       0,d9?t`
‚4009'„‚?=dO!tZ‡ soie/$
‚P#m      Y$J2%g,za `
8\&V`cƒM
?O1
#e_&
1k
9<Jm,C:f#
(k<h0S/I!
88‡_rGc8    %
(

+#3y1?G
=ƒ)DHI.M‚{O=
_)|‚ 
pN1.-1i    

      2K‚
%{
ƒa
~_)‡O
=)A4P#ƒ0N+u
7G*‚ Y9_M8j)-‚,‚6!*9T,‚<‚S5u/       > ‡@P/‡hkI
XB
.c.
!HK
&^
<<
'K+mdt‡<
P       (RT&
‚e+o‚.Xx0‚*L
_%n},;‡Y#
"6      10"D
w/K
wm*‚G3QIE=;ƒG\ aMI-)&+y
0T
*-I*CIJ*D6/4)Q^‚|a
‚
 r( 
` *HB-8
     U‚?!&
l-,
ƒ;¦?=9b'‡a"+/'PD
B40.$R:‡[
08*H§
(9‚_ƒo)*z.…4lp(‚6‡bNK
     ‡d
‚
}o{2‡dS
,7B[ƒ<'$
<lsa4!
,$|&
8:
Dh‚XQc2i—Y„`Jz ‡d$
,U=‚=.q6o=vJ(s2A*ƒ
‚@    jG@‚A‚wH0f      FR
""ŸV˜€€€‚;¿0²)—þ;
Q<D

‚ƒ9‹1‚[M
{ƒ

)ƒ/I
#a
3
SV
4‚Kƒ45H
L9AcV'`
<5K8(b'A
F,
U(O?‚I+0}DCA$
%n‡HEM,"MgtKxL,%N

L *—7 +L-0not_within‚SŸQ‚*”Õun‚*a‚J¦]„Q“ØsJbl‚¦:
ƒËi„'†WŒ)•é‚>ݶHdbn‚ƒZ—µKt$…`'Fiˆ/0#‰0‹…"‚V      †3Y
¦
ƒ4µƒR‚Ïv-‚‘6åPÕ‚-«Æ+
O‡‚Ÿ=
í2e*
†Zƒ|ƒ]?„qZ’d]„ƒ  „f
kK‰rnƒ‰cˆt‰[ƒK‚i"‚;#b8V…vV‚e}
„D9‚@<‚b
‚<„ssl      …‡{A-J]…'aˆb/ƒG†‘]‚eƒ)*H†„}Zp‘„#£oíF„-W1k‰:‡9’†!ˆ„’!ÊIƒvkM±%ƒ0ƒ
‡J‚¨4mI‰}“1^$    „D„I†±x–X‚.‚-‡
††u‚7ˆg…&ƒo!/‚}WŠrQdƒ…Pv
².Œ‚ …‰/‚S„bƒXu
‹ƒ
&ƒr1‰=š:–@’BFL
ŒW!‹
†&†‚;„—}ƒ~‡X
‚"‡„6”f‹’@ˆC‚$ƒ|„(L„K(„.ŽT„Q†;„‘`“C†8•
-™G‡„…9\„%„m¡.        †ž;‚9 š(l}ž7†•ˆ

„R2˜zˆ#ƒ"8ojE„P
ˆN#)‚*…
†S‚\‰AƒX‡$Œa†w‚?
#‚=‡wŽöƒ‡m/_-—:
jƒ)H<+pW‡?žn™  1,
s‡c‡ƒ6C†A„…tƒÆ¯ZŸ3.G‡…FZI‰}=N
S$Íyo”k‡‚5R‚*—2®„E‡‚Aˆ
ƒd.¶=%‡o@|O¾‚:—)

!ƒJ‡—'—‚7‚o
ˆ\‡Vj‡d
M‚$‚H„(@a‡Do'…!S‚#„8‚j79§†K—?*J…9\u
„.¶§
.ƒ,‡e
>2„8‚Y—]‡e
„#Ÿ
;‚*-o7k+—‚0worthi‚Vž~xist‚³LŸJ0‚¤
}¹=‰7‚gŒiˆ0Ü[ž~ŸJ0‚¤
foundƒ,EH‰hE„207/2¨D‰Khy“p61         }‚A}p1†¬6ˆç}ŠPŽeƒ]ÜZ2“v‰Khy“p61      }‚A}p1†œ‡L»6Nh „+ƒOYG<ˆXj
¦-iUŽL%T‹a„)ˆ{‰>ŽÛK;qG°A†$ŽRxY…`„
T.…^†‡t²g‚ƒ
=¡hQ•_8‡K–w,š      ¤Y„
‡UGˆU¢3‹=      ‚f
‚Šˆ,”z©'W„k„(d~ŽöråF‘8-H
*U‚_„,‡l^K;qGfLX1ƒ!x
Xòƒ®†#8=‚w‚A
7„GŸ§?Õj;¾‚H‡kŸVO®hicƒb…,‚lg[`Œ_ŠS  
s   “AI
…*‹r…K        ‚&šR6<3Ÿ†aŒ_ŠMŽsF‘‘,T1 {’i~˜'™$ƒW†M˜u¢”}
‘EÌ:Ÿ³=‰X‡QÛÆIƒ`Š†d„2(†1Žöƒw¾ACÆ‚-ü„EŸ$A ÒwjÕ%]*‡2
Aü‚cÆI¶‡‡—    å|RÝ*Q‡o¶‚3te_recover_rollback;H…c…T‘§8†Sw;G…jd…WŠ4‘§?†V
Šf]3†À_̓ø–6…€ki$‚7
0.Jc!b
ŽLR1@%$LV<„DJC#Fx]i7&I 
ˆDndex~uÎT4•4+4¾B8¾
‚4)4on‚„s„•³‚enul„,8Õ_Ñ
ÜÁ†û#lconst‚„ori‚•us‚ƒwendigst‚ˆv‚·4ü…AembG„'¶OAic‚D•ê‚mw„>.‚†FQ*x‹OƒOEbŽƒZ‚j‡Q…a   
“I±$¥9˜uñjrAˆD¦

¡;Œ
ŽS`‰ƒnk½H<ƒ›a˜$ƒ‚%(c(‚Z?"Œ3ƒtƒ 4-=N54
""ŸV˜€€€‚<¿0µ‚…$(P43:o¤YUƒSƒ.‡<…@˜A…GL†4Ɖ.‡j‰"‚\    •W
©>v‹Š"/t6”#%q‚I‚c‚M„Y„/‡…‹l‡mW)‚?„wEX]943     ˆhŠ …8‚{£a
†$•ˆ‚r Ÿƒ`
‹N‚x…M)¶o‰j¯j()„ ‡{ŽC•^Å Ž4‹XY
‘!”.„jƒ,!‚1›o‚FˆŽöwIÆd
žkœV¥9˜uŸ rA‚I
u‡60Õk$—k‡g“<ƒ‚2hÎe¶Y
\ˆ
/¶+Æ?P
…|>Î  tŸ)s‡]
„j—‚9‚r OåV®S  ®m
‹-¶®W‡Q[0nowher†‚‚{y‚‘v„_Hparam‚Sœ<R”Õt‚<@hrase´¢x;G!¾E`¾PŒC;G!refix~
ù?
¾z
tlƒ
š˜šIrebas‚%
œg$f‚hˆJ‹5•ù^
1„
ight
†ow‚wš$K„YT=s‚
Ã^S‰4Dûk
‹Scan‚1‚S’Ì:
3Size‡—‚Qort‚1‚ }’Ì:
:}ql‚@
„!tep‚1‚-‚V’Ì:
G‚Vtext~ÑYƒŒY…9¾]
Rƒ
$…9h6
Kz
ƒ8\!
Œ.<2‡Zd”å
‡ƒ†Jƒ)d_valu‚U˜'…‚hY”å< …‚hY        e_3‚U
 CT”å<
‰<Tile‚U—W‚P…


”å<P‚P…


_2‚U
Ÿi(”å<
ˆb(4‚U
Ÿj-”å<
ˆc-oken~Ñs¾]lu}‘M8-(/&¶V 8-(/&l‡‰$/‚ ƒQ
Xƒ0„c

&
]
Ó|Çv½bƒ     “   š>
*
 1ŠB  ŒD"-!“5~‡*³2½R‚už³(½býâ:
    ,        í3O‚Ðe
ŸyâM-ƒ'l/
?j
„-JH=/Tj„(d6ƒ->lƒLƒ&"wƒ
*-&@
5J
3…
Q<‡[\KM~2(‚y†mz               ‚M„0vHE,RG&'OV‚#Š;3      -f†H†@b‚4
‚r:ƒz‡[3^B4$0
&^‚~‚D…>t‚A2n@V†n
:„"L=3)61[[M).:L(P@/+ƒ#K:
(|ko:       

M2] KW==ƒEWIƒv*
    
Q     OP
 Dƒ(`2d?N
L(D‚I‚E><‚q
M‚„`*
*]&‚I
0P *j4        (*<
R%>6zB+u+‚\73    ‚9ƒ…b{b‚>X‚b‚oo
<Bƒ.y‚[1@t†*ƒƒv"&,.Fu
‚;‚
k1
F…xeWƒaO.#}A‰U>‚EVL 8.ˆ5‡q    ‰‚UI
‹s0BA„y`Šv9‡F

†!.§:…HŽ-“`(ƒ"Œ0Šq2ˆ>'„F†<‚CD‡\B‚„@
N>…4ˆqƒHI,4ƒ&MC;…29‚+_l‡V4…
‚5QƒM j0„5R>-:8ƒIK‚0„…{‡V…"’<$2ƒc†T‚n5‡pƒEƇzQhu
†}
MN+&OV
e+†'{5 


‚@Z,H‚]CYX7„g&(F…”oˆJ/4
‹&‚{¬OŠU‘F™SPŽ‚}..IJ‚Q ‚WM
Q*ˆx‘+($rŒ^„%8ƒJ%=2<J%ThaJ#B2i.‚*~†„‹ˆXLSƒ&‚\‰1‹
Pfƒi„+j„|%>…$‚†V‚$T‚{†hn‚‡Xƒ"‰6S†M†axP$%F|S>2o'o;
7-l+P!f
 
$&"
                
%ƒ@ƒL†b7ƒ3‰H‚y›@8@+‚:”5²y*–'8
[
       
†7Pƒb"„H‹l…M.           …n4&ƒm*"ˆU‚9…:&D3|*‚‚%/?Ž…c§U)V
P…mH5,‰<GƒsT„:\£cO;JH0#"ƒ7ƒjhZ/‚B     

IŽj‚l<„q ri.*HM‚=)œuƒ‡C‚B<¥]\u‚,)FF‚=H|      %Œ+„-‡
!+Y†n~‚P0ƒX=$‚\Šh
¤¦S-W•*…J"‡/7
 ˆ2‡4¡PMŒs+ &(d¨+ƒ>ƒŠ~<ˆJ›‚$Nˆmƒ`$‰u"7ƒ2‚IŽþƒ~
‚C;L 8—;
m0``b;

1‡0:‚"(
([xˆ^2
„g'‡;0‚CD
ZB—4
#
>
\4 ƒHI,4ƒ&MC;…29‚+_l‡V4…
‚5QƒM j0„5R>-:8ƒIK‚0„…{‡V…"’<$2ƒc†T‚n5ŸYL
c‚YQ‡V

w
AN %&OK
e+„@!+
 #D"' ‚
!!ŸW˜€€€‚=¿2Ȇh
W / 


Z,Hl‡RAAX7‚P&(FÎ.4U‚&ŠU„!M„6‚}..IJM:)‡?Ÿ‡‡k~%>§*
$T,í-3A?!.1-B,'o®<
‚|7‡R‚y‡h„@8@+‚:—0*
       
<0ÝY‚("„Ho$W.         …n4&
)*LO
qN"&D     |‡/?I0)V
‡
5,FGƒsT
H:\W _;JH0#"ƒ) 1B     

I§0‡_#"5 ri.*HM
2=)[KO

5+žf
b0®p‚=6‡f
1"‡h*/7
‡ƒ
‚
P]Mužz"
„&ZB
‚w<ƒN}($NS§e0null_always_distinct‚‚trim‚4–þ„Seq‚„1ª$<§%Ýš<§%iflŽ"ŸÝŠFrow‚¿0—     ¬~ÝXªb—     ¬~valuz„ƒB’F ˆ+Æo—̃om„1ƒŠ;—Ì…(2ƒŠ<—Ì…)bere‚

‡
}ˆI&‚‚k
"k!9ŠSƒ8UƒB‚'s„0(ŽY„….„dƒ‚YD
X<>[g~T]‚<
e
Q G)U(-5j†^/S&†Y‚$ƒ‚^bR>‚qƒ"ƒ-      
P‡uƒ3ƒr(/(‡*
‚
ƒ#‚
&
ƒO-‚
    4!m?"1s/
!M‚:!/
 7 3TF      ‚y
uƒd‚"@
,y0UF„iƒ:\‚+| J/+G"@\‚Dr
‚+
L$
Xt"Œ0ˆ
!         …K$l‚C†G‡>/3       
        
<‚p-4‚F<
;'
D,
¢IV"‚G‚&Z‘U‚;ƒm?
NX      
‚‚46‰3„<‚Gj‚\ƒM„!ƒ,‚†O†q‚.‚~’`AN<>„o9i‚N„ Œ‚(Ž‚if‚$
k#„'†>>e†C"„,      cP(2c/|‚
ƒk‚$u‡#Œ
„OP<ƒY \‚
‹q])U)„"ƒv3p‰j…+††nc‚N"       ‚ „%ƒd +…/s‚eXC|5‚r7ƒtŒQˆo  1A8(‰H„%…U‡„8cP‚PHƒ
%[„


-
#!RA"ƒgƒhE# ##…+š‚_
„)p‚{*(1‚U-Wf†Q5iƒ? 
GA!„ƒc%%h.lnS…]‡u‰jƒL1'

,Šf…P
ˆmƒz
pv‚p$                       :GMC48*!&
/KQ2‡\ŠQl‚'   |ddhX[\X[\XZW[[[\X[\hqrhpgqqrX[\X[\X[\VXUYZhpgqqqqqqnXXV


      (&%K    R



K
%                      
†Y†k
        „:{ŒCƒ‚„(iBƒ!K¯`‹Uz       „Rƒe.ƒ1ƒy‚&ƒ‚mG„}…ƒ        ”X‚q(
D+A
vADzƒ       ˆ
†=0HZ?PQ
:8yi  7‚i‚q–…f%@‹!}‚{@J!c`‚4`t=,¥&ƒKJ$ŠS(‰@/^e‚1ŒW‚m‚ƒ.‚p&‚ 
W_73-#{†]1~9wˆƒ7‚bƒ[‚p1$Jƒ
'aID‚16…Oiz…OƒL–D‹„v"„$„`ƒu„f„B‚~$’I‚T‘9…Iƒ.VC†rH
ˆ}‚D6f‚j=
,]ƒR‚z-##„.‰OP6jY‰?‡{‚[ƒPƒu'm‚3B„>(…T=&.ƒA„w†}…:‚C?OƒMD‡'…†Fƒ^B3„NL+‚;K‰p„2œ‰A†p‚w~‰P      8†I\
‚Q>–T
'5ŒSN‚b2‘…d1‹F…{
lq&‰[@ƒ4•C
…j0/6…ƒ2…Ef‹.„&I#†0‚i…>
pi8‚VF7ˆ
G^32
,Ho$+o*
Zh…g‰
„SŠrƒih‚.{„2R†<‚ƒMTƒv
‡8‚5ƒ^‹…S7\…,ƒ
…0‰P…ˆ<…n;‰mƒ‚2 …R
3@
K…"$‚78‡<’ˆ†Nƒ 8
‚Zf6‚p‹W
3
ˆˆN‘CŽeÀk©]’Q
L
„W0‚j…W

pa=5d    D2†<‰#AWn      r)&ƒu‹ˆ7‘F„)ˆ#ƒ|_L…S‚@‚ <
‚!Z.6M‚pM' k

'.‚<I &q%„.„,2ƒ
'c)##>$e‚Ayg‚
;,kn‚$‹~d‡]   
}Li)k~s*,J‚xm‚3‚*Uƒ1W‚‚T9?NƒZm„-"
‚+"…    
$
‚^5Y)RŽ÷PV‡‚!&ZƒX‚9B?
X‡e.%‚
„T‚WLF
7‚V
A‡ak7y
|c9D?NM„Ff*?$
k#„'ƒ>e
S"t, cI(&G/|‚
ƒk‚$        
‡‚=‡gBGO
<\K$3])U)„"†K!+     
""ŸV˜€€€‚>¿0Hȃv3p‰j…+††nc‚N"        ‚ „%ƒd +…/s‚eXC|5‚r7ƒtŒQˆo  1A8(‰H„%ï&Z‚?‡_!‡fu…U
;|
%[09

-
#!RA"ƒg‚E# ##‚<
d/
‚     U m*(1‚U-W,
G5i6 
GA!„ƒc%%h‡@rW‚^'

‡SS—8%0®pj\    |ddhX[\X[\XZW[[[\X[\hqrhpgqqrX[\X[\X[\VXUYZhpgqqqqqqnXXV


      (&%K    R



K
%                      ‡&Ÿ.Iƒ‚„(iBƒ!K
Š]T‚#‚ZG
C
[‡E

D+
vAD‡ewkaN
‚0MY?9Q
 :   ,  Ÿf%®t
YJ¶VjP$      
W_73-#Ÿ‚‡d
[1p9‡h‡l
p—6DMG
'aLD{|§‚9‚{
MƒVa‡dgi?V,*žx*(‡f

ƒRi    -—!
.
(P+¾.hƒq$A'm‚3B
9(‡w#&‡Gg‚w=??OƒM‡8   
Ÿ%
(¶R
cN
]2‡d
ƒj—…„
lq     T.‡Te  
(
[0/6
ƒ2
;fr&(#X0‡4‡6P‡iG^3
"o$+o*
Zhƒg
K¦x
‚.{R<4T
5Y>\ƒQD6q
‚t¦‡6‡h`Ÿ
fT
‡X
‡C‡‚‚[

a6=5O    D‡)‚Ao       r)&(       7n—‚‡i9y‚
ƒT_1@C    <
%Zo
6MM'

'?-@I &q%F„.„,2ƒ
'c)##>$e0yg\;,kny
{d
     
}
)ks*,J‚m‚30U

Wdž@
=    ‡KC ‚?Pƒ-"0numerB~ƒqŠZ…„‰ƒ)‡`D&„‚Xƒf’
$
q)
ƒ)W‚‚l6•x‚-—VF‹ppƒ‚x0%3      u]'@ &„>‚EqJ(3Lb1$l58Y„$ŽY’KÅ3J†k œZ{dŽ‚5‹}dƒšˆ‚]ˆp‚‚
ƒ0‹ŽXŽ˜KO’‹‡’H
‡m   Š=o
|‚¤L-Y•e‹Œt›h
…A
ˆ2‡ƒ
·V-#‚DƒÀ
“k¨gƒx
‚{o&‚=zO9-71rNMjŽþf§js70%3   -'@   &!BAJ
3Lb
Z$l8
!.‡]=K
‚>J‡:6—> ˆ{dŽ‚5‹}dJ)wƒQˆ‡A
0‚IÕŸ‚e])R®,‚ß@FÎ
&‚ŒP]#—.

Ÿ"0‡k7§ƒ
)-Ý
#bR
H‡®bJ
IÝon‚ˆRy”€‚9val~Þ]‚¢\7¾W
E‚¾>Œ'7rcharŒ>‡(‚,µ9}¶Yisit#ram‚ƒUo˜`ƒS†w
0
†%
‚   3„*‡s„X‚&’X‚t„X…QŽk8†ƒL
‡x•n¦K
b)#6ƒ,ZÖ2¢Nƒ…g…V0‡(‚‚„j‚‚G„y‚‚‚     ƒ@&X‰

„X‡3G8j‡L=

2
‚Ž#”'‚
†+9’g‚`„ŠVq†%„W†)RW@L      7#04IF
AlK"ƒƒˆT&‰:7ˆ(¡{"ƒ‚|…w„)Š6Š
  
¤;©a‚3Œ^Š
„K.-…†}‰r‰C†fD‚c   2ŽO?CŠ~¯    P1S'
(„#›-Hh(¯‹3`:$L…p    …BQ"+[;#:dGˆUƒ9Gb†NŒ`H
”      Z^Z/4
%†t†t‚˜ƒV„5 hD†W0‚+D,‚@m@<…:%ƒE{„[o?
®H„N”Y»„R&Y"‘p$†U‚`‚+‚|5+6Žöy
V‚teƒ
(8ŸN
9
§ckŸ‘MŸ‡ ¦l~®o0…]‚‚„j‚‚G„y‚‚‚     ƒ@§     ƒe‰
ƒP
k‡3‹EI(=

2
‚
w>S
‚9Úaƒ+Æ‚:O‡X7
3
"C76¦^+ŒR.-i
¶Q_
Dx     2‡—5AƒI(P¶C
'
\‡?—5*‚`:$†J
+(

""ŸV˜€€€‚?¿0¼        –Ú5   
@Q¦R`
0H¶XŽZ^Z/4‡N‡t)‡ƒ ZXDM—
S@m<…:%ƒ|Y`‡t
…ƒbƒ+&Yg$eq%  5+6—0o1‚ñx2y
‚!ÞVL–Q
…õ‚3‚ÞQ#ŒPƒ“
–þ'oƒåJ<6‚</ƒ/_creat…exclQk…asi‚ƒnbei‚I      rflaechen‚‡|jƒƒi      ˜¢'      ectU(,l,
#'   5B      „
¡'„6ƒ?‚   
„J„_‚ ƒ7\8(+H‚)05o‚h@

Bƒ„/7‚‚ .{@A/W#W!Kl
    g" 
c,4J&%
4I
`7Y|C‚#
o‚u;U„|

ƒhuz06‚OEf
/+       H$e‚"V_x‚a~j‚|(‚&)+I-ƒ&‚A‚v)‚zQƒAY+‚zP(ƒ2
@bx‡
:2%Mf‚b‡V…'z…b
‚L

‚<6#>‚:Q$P+


„H      "5‚r0…ƒ   )‚†L       T@:Q=RQIq…h‚C#1Q„f,BzF<‚L‚†<‹^‚V&]:U\|„8ƒ>‚yƒ~
;;b1‡5&

      EV(q>87xˆ
‰ƒ‚d&ƒF5‚B6@ƒM/3r/F‚
FD„u‚v †'
(^ƒ|Z„z„y
%6ƒ@ZA&`„bW3‚<"ƒ‚ž/‰kœ[_G$2W "
        A       
‚9&¦?¨*`u#‰rˆx—|9/\†s
—9‰7‹0©Wn…C…†'!G’]f'„g„U#%‹ã X‚V…>ƒ/T…:\ƒ7
~=eR
>,2„}…NU‰z„L‚m„
‚OR%'‰$¬VŒgš$B1‰>h
PZ  „o
7       J&"‚cWQ‚‚2ƒT‚3!RMƒ ‚y6fj&5]5%
#$-
5DR!"7!QA4c6
.4#L^ ƒ
)VyWH@4I':#‡VK‰
        †
|‡:‡e
†=$BA
        
$ƒ‡
U…4
%]m
“N     i0‹-„s9   ^ƒ(        ‚/:‰6(‰=‚^-+,§˜”k‡1‡0$0
0
        (ˆ8„
‚Z‚>       †j …&…k‰_™_q
ˆp      ƒU„M
†wKn‡s
œ3š!¸)ƒ‚†]‚
'Wƒ:‚I‚TLe)@+ 4‹BŽ_ˆA14†|‚'‚!†0*]„f…ˆQ‰X5*‚.ÈU
c)@+$
`Š„'‚R       *…:Ž÷b®c
* "
        A       
    —H
3?
u`J#b†O‡B
|9/—5s
NŠ)‰7‹0©Wn…C…†'!G’]f'„g„U#%RjZq ‡V
w
PT
6
&
77
!*eR
,2Ÿ‚.Õ{‚-Œg-B1  —%Ý`#Lý
‡h
ƒ?—6D
A
        
$‚KO?
U«‚#9 ^    
T:„j‡_"-+,—®d"
0
0
Æ!Y
Nƒ?
%wF
 …&‚(k‚t,
‚m  ƒUƒm®W
8K‡p§*-až
‡'J%e)@+TˆkˆA14—i—‚‡e
`‚      ??‚ ƒb5*‚_T
c)@+#
`0#¶Qint‚%‹~“ƒIŠ
…Xƒblabel‚ƒp„V+sint‚void‚%‹w¢Tid‚ˆ&F#Š}™t£F#„ÙRÕ‚nam‚SPv        \>”ÕoJv   

>typ‚SV„W”ÕoPlig‰)&‚Dƒ=4‚{NQ†"’—û/"scurc‹„G '?‹Ov‚)9ˆsˆA
‡Nˆ&:ƒTƒ‚u†Xƒl‚IWc„iiyƉJC‚c‚wA5‚^y‚rˆmu‚Iˆ]hƒˆ(„Lƒ:„‚„(o)„+<„8@J†E![ƒ=‚K9       „Šr
\ƒjžDˆŽ÷
®h"Ò„c
Z9
F†Kò‚P¾;+l(*—o
2%.
""ŸV˜€€€‚@¿0Æ–«Wò1}‚0observ©8‚—&
>‚f–‚"‚o„‚Ž®3ŒRˆoš‰¨%Ž% Q"ø‹3§K³Yl—8q‡Õ‚wλ5‚™„j|jŸ1NoletŽ@nÀh¶$°d]>‚Çs‘3Í®omý–?‚ßd:‚™E]>‚ålWÝ‹?tain…X„t
E6       )y:=Lh
$
TY12&ˆn]!Q6,hykm‚7c"^

O#.‚X<ƒ…S    ‚$…d‚,]ƒ‚B…YM#†    @„#Flp‚>v‰/‡PÆ|‘<L…2>Pt¤    ™!¾Š`+1……
†q6˜
‡NA‡F/‚:‡Ž…J‚=ˆ}ˆ|¢ #¥Ÿ„p4S
,†x†<‚O„ƒV‚l…M”d      ‡[„"‚ad…F9%ˆd(Ž
‚;„p
‰He%‡iv        ')1„‚&^(¨B(9"ÁnŠMŠ'ŠB‚Gu@h&S;—Hƒ+Š%„-
‰–LTi—Œ‹ƒ
„*”<<
·Q0‚(I5W‹FRWƒOˆ‚Fˆ‚
“@Ba‰FwD‹7‘`
%|       …i‹q„u‡}šm…~Ž`®o;?‚ŒE'\&P
!S;™!¾Š`+1L‡gQ&ˆ
X‡Nôq‡‚†‰W #]$}[S‚Çq‡hL


Ÿ%)

‚3¾?(‡h…*(9"—"Iƒ‡b3CÕNni…b¶F`\ƒ
e—*v
V¦@‡@‡h[§‹lJ#G§?k3„®xviat‚‡
i'ou‚†H‘
šM˜JK‚
¿iì‚[„…Ö
{s‚
ˆv†K‚wž0„(\Š†a‘Öt@‚¸>Z¤
Sccas‚‰" ‰S‘˜=…îwionƒR/ 
—t”ìx‘-‚P‰?ˆƒiª|—I…&‘…%Ž÷‚hƃ®@s,Œ>rFZQ1ƒÌyÝi)ŸƒUu‚¨v       i‚</ …a…'‚6GL5‚z†/o‹ˆ,“zjƒ
d`8@IZ$)„G‚ˆFƒv‚c‚y‚_Ž*M0]PKYƒ_]‘G
[
DLe4O‚8ƒE_:-&sXKJG‚#
_2‚‚ƒT
G3)Z2ƒ3Mƒf„n‚     L‚7!ŠF†vf‚9:qw„q       ‚)ƒ>‚m3tm
ƒZ„<#=&‚I†9‘p‘KŒ?1–u*‚L—N(3*)(‚k0ºq”+…‚}4‹Anb[yq3{…&—A%+.0¦ƒj‚Gƒ59… ¦HŒn2…„}&‘^K0“=”=…¬-dŒ’ †‚bJ ‚bqn/23Œ+ƒN„@‰‚w,†CˆSŠ$‚&p…4”$ˆbƒ=W+Ž@„‚A„/‘8
„q‚_‡  ‡B„Bd‰O
Wa‚‚VG‚~'X{
‚3+{‚&‰z‹]„'„F1‹ku‹)…%’NO/‡8ƒ ‡h…xm4‰„Q‚e¡b„^†ŒTr#nP‚bŒ„Va‚RA†nuƒ6ƒp%†&o-Y„"ƒ ƒhŒ I$‚‡-‡I9g>~šW@‹-•IˆO„N*‚h…H‡*Jw…„[„S=…0‚7WŠ%‰$w
8‚'!*i‰x„Z‚‚
„Wq&‚‚<ƒ2‚J—„Šk„—Sƒh’‡
"…ƒG†ƒ[ˆ“J:0‡Ÿ^ƒF‰L‰p‚{i%ƒ
„‚`†
„…e’f….ƒdƒ*‡`……F‚+~NŒ9…N½cSƒg‚†A‚K&C06H
„F
}“´1•´$‡-bGMƒG/‡JŠ1b
‹J‹,A‰&œw¤H† „
[„`ƒ)‰WLc‚j<V‹N6„
.!
 /ƒAfƒ%(‡v
‡I%ŽöB#‚I    /‡a¶bM(3*)(0‡tƒ+‚}4}nb[yq…w‡‚A%+.—80‘Iƒj‚Gƒ59… ¦HŒn2…S`‚~ƒ@0ŠQ‚'„r
…udf‡g 8å:R‡‚CXf‡…'‡ZˆSƒR‚Ž*&p…4
M-U ƒ
4†
fÕü}`Ÿ‚®kZ‡wD‡X
ƒ,†##nP1@a
8A9`
DƒL?%   o-Å,¾P
ƒ9o
p~‡ƒP%r‡hzŸ}2‚J
—‚w‡p—‚dƒ^‡„Wƒ,—2h^ƒ:ƒ[   
:‡[g
‚ƒFF`&i%/S:" —   y….ƒ=‡\aŸ ‚ƒ,¶B—:
Lu‰"LI'1
""ŸV˜€€€‚A¿0     ¿ƒ
—¸$9bGMƒG/‡JOe‡zŸS
A‚=m‚D
ƒd
‚„-ƒ)žrY       Y6oh!
?I?30(0occurr
8…v2Šk2‹|
x¶9®_"±JŠ-f»y‚
/2ˆ´zÂ>„F½B
‚99„        „K¾
‚Zƒ2ƒHfƒY‚
ƒƒ†+
rƒÕA¤kean‚ˆk”õ
1lot‚ƒ2talƒ†~—Äeta
Ž#obŽA‚¾7dd” ’‚@6Š 4¯v‚-@ƒ]V„ÑUƒ¥W4ƒYtiti‚Ú?er‚‡xp‚I=ƒp:(&7"9‰,H‡X¬—ÌGPt‚I/ƒ|:e_abort‚¶<Ý¡nfail‚¶3ÚÝX¡eÚignor‚
@Ýûrreplac‚
>Ýûpollback‚¶9Ý¡kf&  ?;*E,94-

S\
z*&
JI     !cH]I"4
 7
H2IVS&,<$%/
;"         /C
%y>
Z,.G
:Eo
f'0.2;R ~#
C
6Z+   Mi`a^#49 >,'/<L[ 
X.%)@E   
7.0C,
‚9[(<+!23[H9@:Z0
C0GP&,ve!L9@1o4.!0_k"@
        
674*/ $I(6( 0g#)

_0@
‚\
Q))N     <l#3

$
*           >(230^+),HN
!LQ;
ie

$*    %$`0
993[b)W)
-2Jd )  .+VJ%o$0N_^2+::>i<B,"


4E8#%9&"X; !
A.<I
.KZ+~XAI-VT7FQ_
7       B4(
B!
O@.

.732
1'$<Vx1‚:!-]*      %?EB‚&'"0$"E
(
~F%F'
        
‚
2* ‚BG@T4 Q
Ocf(:.,
I8u0"L)‚!G.Cv  )7q[
"19
        W]$($&t&    :$+vv1;GE@0<K$r" Hic"-a1la])
l b"$[1}J,      .   6     $3
+
=&$
6:; 
 )!5"5"

in       
1]6V
s            
A$u
&*@06>"
'9Jd
o## &[$%-.$
*$!E3&u#*<B,$
3tV;69z
       F!7 
    


*^EX
      5&*

#
= .!N!% $#V 
"7+B2#?,       3i]
r     
'2‚ 
OD  8

k 
        
D+B
%6"?::
E
n

    ~"S@6o$
&        ) #1#2
29

ss&
/(!
,

!m-#2      X#&;
)! 
.M$.Z
#!?2[++)/ !='6##&
<
)e

;G
N        
~
X

*G
0A       0'
+2
     4+$l2H`**              7 #


&T"
Pb,~
$P&
e
j;
0A3RA'AH12
6
E5N"F
]b_`=+Y
KV"!Gor*+c
.4
!43L&
    

,   
I
y$ 
Z8J
.h0,
#       "1mK8C        ‚W
2I.
36%!C?\# /L"3_B`N66      b

&>* 8 
->!%
F,92Q
>+00.H.>, 0RHw@</    Q&  %<#)?
J3>              6pO16G
/#g#
:
*
E|
L   )J

(5‚/oE&.M.O
*PMB+'0Y#!
_
WI+T
:teR9"%.j+J'($1?("%?g SI$?)7I#‚^49(‚7t!p?)J;Fj'j2 y<??5N+)3@(J#  9TROQJG`-tb sB#GB    `&F(-BS'5(5)r+:,  
D(=

W
 ;'Jxm‚
3Jr
      20*33',=Z
>'QO*
S(,969NU-$
+O       D><0%<ƒ[@
    

93J/

""ŸV˜€€€‚B¿0ÒpX`6/c* Q. (     
 (B05(
$=J 9B(rSELMdvj?A?9+‚nd+,
4:

     Ln
HSbTB
2Y^7O(2USW 
 (K 
:@      EJ
*2   $N!Q4)

[LA$NM<
HB
A5" )7#?:
$@
 &
 *,To!/&(
1+R@*0,h9/,$
+ 2‚\%3w
`V9 V&Jk        =,O!‚4a>hfA/P$ t+3/J}6(a54\"%+R$CCf
x"#&Z$*?KZ
#,-1!)br!ESer*84-
$#=9.6
!-.Ea5?EQ06h
N8+#'0.%8EH

*NL
1*-ep#& $    $!‚@5
‚75)FWQ(;AK?7{3 !"/8)1*9‚\V!3pkYxI!+,h^#      gtR.
d*F$# )!Lo+"'bd=89*8AAQ
&2/%'S‚)P;@&SqL
Vd1 $/>W7s
"+b
:‚
$
 >C
-R    48!.D #XV
[q    .e[I_!]/e`&OF%#
>

 
,2‚=‡v&
B
<_$!
  B
%     ^Y,/2
Y
1g*}

       SP7TX
;TU#m"5#Y
yE
 o: {"+"!g/
")"c
B_\5hr$a:+ o G

"$/?       +     8tC  <,*"
) G/    @\$U4&
&.V,     )7$n5 ‚QM%

H#q:[
'\`T       nP~.8J3
(Bh
D,"$A!]</<)tX/.!S; 

}$
        
%   
1

‚!$
"j^|/$Q
c6(      
1"Zb 
B=&
= +
'
,1H;
y9
]51N
Pm!'n;

wOfD23hS!&dV`9><+-&R=6>'05$|#Cq

?     
.<=.
P>}<?G
8&/s-=$.o!pT~Md"
9c  i4X…f@
Kt%      $g- 1|?4_‰
L

7)6   )pG c,Y}7:#A bA$        "P%ZB
P112%%`5+yf
Y& 
/'
[[>CDUA\ )!=p!7U5<;?
" F
c&
!Di
0%`5<$pwy$H^1lm*++ |@+C        HH.3  [      =6#       g
6#P& *Jy*Nb^
X"! +#%e
%9&6]t8]Z<
'drv(~*N)
MAnae     CX"
)2"#>8
4DN =#/ :MLK"E3;'f4.-6%!? 
</Z.%\EBQA*f^B0)GM-L
F.
       AS‰R$ C1=]
T
T"+%a
p-=BB^

_
    ^
 &‚IuybZ>V#
$+\%E6\)‚
2
"!89$(V-%H
g>7
.
B
 Z               Z
      +I! ?,
##&I~5Q


0

+0
V!'51"%
)VO[%
.%*0f!&#)9O)#    0T*J+‚%,Y%A;!R+58Y$-#1!8+*
+/*.‚[F6E *5
0!
5&f57E        ,07-@(@@D0?4$
24+-
)P-YK4
r5 
$,

        #      G
8$(
6
H
$B%.:(D)9*/""A?! D#6O'N0z"4% "            &")]*,sT}mC%!3j\
/.
uB/%
=%Yc
($xG/‚5%["+n6 JF
?o   =B);1?
-?,z


;
+)    r      : M    "
"T
;OEE)6V!n
r">`(N'2%P 
5
 AK     -.*6'?"%!7V  KE']
h             :      1-G +>3;
      #!Q
5      X&
"-,$ 20
C?3^\=ch-#>5DOD!=/  B$I*)‚$ $>h 3 5Rg#    
        (<0.       +-7%2#B*
- <X)')&K0+   Z#w4(        J)#
…B=
|
             HHGDHHHH^]T^^HHHEBF]T^^^^^^      


       
       &

           





                     hY1/zc2c$       T%a2%]+V:E7!Rc[ Z)pK   5
!:]FQb=e&cIU]&
>:d
\S68dErR%

<?O8
LG%2G@*8+> 5I(„/     > !\r&7
k}"$+2;3N:>eT>d1"
"       <%49+=(_   ,S42A!KO*
-$0n3) 
'q
""ŸV˜€€€‚C¿0Ò8
 *8!F*h%3++
#$RZg+,*9)1U(5g,-E1&.‚
';/K A(#/AI#&H)#5"
‚,T^‚y%'F={]_8'
/ +G+R#WL9Ys‚‚f        /c 9(-7?4/@H&i)v3+[
8+ /6Y+CYjX?7!%A2

)6-/.=0
\9(
/K*       03!!6Y‚/'-
Y S,f?"e8733 F Qs&l <?=<! (=(zC&
8y&d!q:L%%T52wm,       
#,%&--#2"-D        ./^)<
       =& 6:       J8}N"R%$(
>)/
&8Pn
EN 'P0zY)ogz(2N+MZ.G XF*B?%#6=2'Yh
"
r4

+K-
Bl      "BMKK   (
*!$M1
-/\D@
?t..Xg1uFHs

rR ƒR@<$]      )T@    -,5#129J!'8"v(+     &‚(+   
F]<    
F6
(;a2"
BJ/
#(O~$$
"Rb 4?:

$*"pJ2v0EDWN^"
ngfV7$‚6/!945/+vT?X
>_18}‚*)>&T0
#
R(
 T;:F!P@)V:+"G4X7@#K0VI        #
I%#    P?28   ‚}BKI‚A4-+#;!+2^X-68,;-:.xvgM%O0z5
1$J.%ƒ4*r! ^
O806+zM+Cy&J[2-;=Xe
q3R2 NX      DwU.[/)‚AE((!0%/I/
,Ui,}‚6:{>.!   8
        6!
#3
MI!
#3
MM4_,6f"      


N&7!-#B}
I0!\)!C &2      ?N    #%*>33L      62DX
RQ,@M
65#V

&&       
r /
       .#@09 %
N‚9X%;<A~?/+$
!R;
%<WL    VTA6
B;,D /      (' .)^2K..
B9a]2
N#:0Q  "'P Z
 9+38697-
A"
/       
52(>f

%*
 D
A
"%l‚        ?                      ##,d"s#!       8MdMw,j_AdC3U+_8
A(tm$0t;.',=% u1‚=0,q!
eg@-:K%
#}:YAx       
g0ƒo5‚*ƒ%6UB8Jq
ZMB?#
87*CG9~*!&{"CA#;
O'&6      
t5'
$       !5);&%P>x
,3N_ JZ8]
1wuTD1T3%/=           -DF{
.>+$8&Fow6
&G"&Q#".
‚%:?3$A%5!c
tn#S/        *#6Z45?pi

"0S_%   3c/
ZrvT
    f<q\/~? 6$!f<"**i3$"F<L5++@$"?  +6YV`
%"/
LmaU1h^y l"Z9


OV "   
JM

hUQ%:X^'KM1j7AD4Z63
:       
P| /- $f 6
D/U'#Xi2d##-9Qxe4ZD#`;  .
@+'
8(*)+oL?+R" !N             KC   
W1#(<?)Z"P\        
       1Ah;7;6


&!
J,:]
I~$-.;1$S6oR        
    
$S!pLH) :PYR
[4'pmT/,81%4    LtK‚c‚kL=GbiR:
T+3O‚&,3r`
-`/
7H
XX&
-MFH$
 !' 1"#:
L2E/#D-&=:(&G//,_,

     L
      
J}6"
*!1%R^ /J-[
k=-/z$@`1"      
"h=&w<
     %&F  +Zo2 9ƒ'>'"$X2L        35     35(+,   \Z@Oz  'E7WGHx!„@J\1/S;/-7%,!4ALW 
4RAtZ3-!H
7,f3.F!6I8
L #;#p];M
5Z%DdR
wƒ
%),:]5)6)55#"(A4A)
##'
2 ( YC
F!n
?8:,'b}W/F
(!,:]bX'?*KPb(*"SFE!B?   =/
4E
‚e:UƒAe&$L_$?M79PfX*9\.J
>L0>bY=,U(o*W89z+  - Z&      2 2V!LV)8PE*(+*O
1>oJ],7pB,+N(6)Q;ETL!'8
M&Qo6‚<Q'=E9        ][S.m%2+
4
FKeO
#‚B\A
J!nk0
QlKW4T*
‚q
\        /      ?
$R"%1'AD$SNBOW2</"GG7
   2%
:6e     -540        
4!-$r b`+-.YB:,N4!fM@+!:FK&6    '!!-("$ ^
-)'$
;"SJ[Z61!N@3dK1H
kBvM1G#D!2-=B
%h^p+ƒje‚lr>NG‚R?]>&#T    C*R;N
a8

$
  ;
22
#SC
,>+GD8Hh      ;.$'!:&fI82
%-'.%:H%L     #!6Sx
;N
C./'
q*('4.
""ŸV˜€€€‚D¿0Ò‚dLg BD‚C(‚^
-&0K3H-7"Q! 'Il@
8_
B
‚H3YP$}N\=<Ka!
?<*.c
'    #T&?/-p`8!
H"c'|;
I
&R7B.
b5R
B$
a#&&'w;,V1ƒ`          4-&UA:*%+B.Q
+"I  K4;0$=
dD'l +=4!7,X) /::
n;
SN:
-'>"708"        [ a\)5
Zn*;'-' NL        =0.twVNd!"#&       0&^-

#ZO1/0/‚H$ +,
rdƒ| 
[$C‚+T8*%Q&      
)GVlR#
-^nq
<     ?
E1A
e(5 ^5‚
!+(
)61 K(2!#/q0.O*
?7O
+ 4?%
C,7w
Z!cd !ef?8
7C  2R
J%?9‚$6V%(
K+'(   ?V%W5'/-b!"()B       
,7
u g(*fLJ}PS
B|&2V$6&'L/<
WHOj-"8
E
+? A3
6:`      
‚.
*b[%yt$/o
cPu‚;!

B
Y
32
~;*)orNc
.%S#5;h. F4$m       >‚@
@
V]
#40
8#
(=:PVC   r‚
  (
CIE/A
>D)X  # pQ\0(.@4     "
hFR^.l]=2]       2N&3P

82_4Mƒ5.
vo#2/
&)("u:&)#-
&
„H'T&DA "#        "+\BU"}6S=
0  ) 4"
*6
v,I       L
'$f(V*W
 %GNGC:/:((6&

       "8%K:E     
(9P-o1*O,.!Z$s- )1g$$2
#!Qj
/\G'ICL&$X "
,_ENj8-m
$@<0
R2;%
*G,[FD^;%       
@x8{#dv"=Z‚{]@#'JAiW    $t!)TE"F(WN R-T#S%'B
+)*. .:‚,4h      Mf$
C,2N  WM9A  JQ

|7A! ?0
"f?4@  B1
3" #<      )u!%-$aH8-,aO$E‚S
,M        >j'`$/M4[%9 B>p.(+
>
F"7b8       0(VK!
PQ„3O!#$:&
P/f$?H  KT,>
'$W#   >6&N
%
ag
-d@\(@WS
&7!V3
F$o_$$$X*mY
BN‚a<9$13Fy(#)74D
B!G#%$0+„$)           "H#!?85NBˆc~>#$„l*ƒ:u?†W>

}Uu#6vu     
H„t,n5       'J>
M…)dKBgK)]
   h‚!z  _
%#.2
/R$  M-/
@J-o“ H‹gD'04W‹'/2
0
 -
'Ž,‹C(T??
!^!:#”AG4ŽCEt&01'RŽW!A3+b-1L
j9,!N:8ƒ=qqcQU`(,9TdjP‚H20&B5t       S%.X*
R‚F-/N
*+jIG* +3%t9
RGBƒ,F+!ƒ
        *&?-4.
&7Z?/E(')*@ 0%YJ #IgDK"Y&E-!)c$Q2
*A%%(7F9&"BGK(4k
!GT;
8 h%(Vx51:[?#i
-%        P&+8!
8IV5I[MUv'
(UPt@BL"6uB„Kw"pMu"!ZR)      3"^%&=tg   5C1~#<P<PDPI{? L%0(`‚TC?)&p S
1#^F(A        ,E9(J-G">"
d-!r"?(C&W(!bT
N   :        ML_>
"*
'$#+U #a/'BF
p}M!
x2
 1 ‡Fb$       ?AN
PB      $            }.(%  0*Q3V O*
&~8ZZ              #D. sHQ
$ V

&<+
        J
(1r4ID(!'-&4"*



-$        :,:LR0"
5 7

8+*Q
+4
 
%
!
CK              QV^0
:46>?        
d$?
"X/
"    "
        
 S
B F#%$[:3=])     
/9-f       *@?/%
/

#        


yl
>D 0$-#6*i0^?
        
!0.$Q"(7OSL0=
ƒL&DT‚P^/
DpMSH6
m[!<
%4J:&‚   
h%!       S
P

        o5   R3<y
    68-QwQ1Dm.
*x-0
1"=8L
"       
T~        >H6     >Z=7ZMBF4;
 Z!,
#'T)$sS             i'
    4d
               7*/1(=!:+O%a%:$G5
$('   +/,h
F*
0$
bI#NB<+c
<+P"Uƒ*‚X:#&&J H
,P7/f5@  ).&\Žös0‚\%
w` 9 V&Jkx=,O!;fA
/z$ t+3/J-x6
(5‡YZ"%+R$"Cf
$8"#&Z$*?0Z
#,-1!)bN!E%e=*84
%
 #=9.6
!-.EY5‡_
?$Q06‡g&
N8+#'0
""ŸV˜€€€‚E¿0Ò
%8E‘CC

*N‡e1*# 
# $ $!I
=8
9,8AAQ
&2/%')E;@ S
D!H1      $/>`
"+b
:‚

 >
-R
48.  #<   
&[q .C[IQ!]/]
4&&F%#
>

 
,‚=‡U>$
B
<_$!
  B
 Y,
2
Y

%g*\

       SP7X
;U#m
5#$
KE
 %:

{""!/
")"c
_\5hr$B:  ,d G

"$/     +     8C      ",*"
) 5/        @2$U4&
&.i,      )$ 
‚Q4%

H#q:[
'\`&   nP~.83
(Bh
D^ "$A!]</<)tX/.!S< 

}$
        
%   
1

!+$$
"j^|/Q
c6(       
\"Zb     
B=&
= +
'
,1H;

9
'a
P0"
n;

wOfD‡)3hS!
B$`9><4
-&R=6>'5$|C.

?$ 
.<=.
P>}‡_:G
8&/
s=.
!c_MFF=
B&%       g- |4_%‰
… ,

7)6   )pG c,Y}7:#A bA$        "P%ZB
P112%%`5+yf
Y& 
/'
[[>CDUA\ )!=p!7U5<;?
" F
c&
!Di
0%`5<$pwy$H^1lm*++ |@+C        HH.3  [      =6#       g
6#P& *Jy*Nb^
X"! +#%e
%9&6]t8]Z<
'drv(~*N)
MAnae     CX"
)2"#G"E;'
4.6
!     
Z".%\EB A*Ja‡0$GM-L
<.
        ‡c$ ;1=]
T
A"+*a
p-=BB8

_
    ^
 &uy
VZ>T #
$+\%E6\)‚
2
""89$(V-%H
">"
.
$
 Z           Z
4 +I! ?,
##&I+5Q


0

+0
V!'51"%
)VO[%
.@%*0f!&#)9O)     0T*J+,Y%A0;!R+58Y$-#!8+ 

+/.[&E * 
0!
5&557E       ,074-@(@@D0?4$
24+-
TP- YK4^0
r5 
$,

        #      G
 $(
,
H
%.:(/)9*""A?! D#6O'N0z"4%    "            &")]‡?0,X*
AmC
3      !\
/.
B/%
=Y
($     /$%["+n, J‡R
o  =B)#1?
-,—"$$'?"%!7®m7
…4U
             HHGDHHHH^]T^^HHHEBF]T^^^^^^      


       
       &

           





                     ‡fW/Ec2c   :
%
%2]+V"E7Rc
0S'8dE‡f"P%

4?O8H
L!%2G@*5+ k‡-,     > !\r&7
>}"$+2;3N:>eT>d1"
"     <%49+=(_   ,S42A!KO*
-$04Z3)   
'q8
 *8!F*7%3++
#$RZg+,*9)1U(5g,-E1&.‚
';/K A(#/Af#VH)#5"
‚,T^‚y%'F={]_8'
/ +G
R#L9YsE        
*T 9(-7?4/H&
1i) 3+[
8+YCj7?7!%pA
""ŸV˜€€€‚F¿0Ò2‘‹R

)-&*.=0Y(
/K*Q   03!!Y‚/-
%
Sf
0"0733 F 8I&6‡C?=h<! ‡f"(=(        C&
8T&d!q0
j%R%T52wm,     
#,%&--#2‡-D     ‡.A <
:&
6‡e7  z‡e"R$(
$)/
8P1
0( 
+0#YŸg1JH"§&
        8:F!=)V:+"G*07‡a
.V
( #
I%#    
?2¶S

M'_Md2  


N&7!-#‡f++—2/
e
I6,@M
‡c5#V

&&      
C /
       ‡#09    
N‡c#
<(q./+$
*N;
%<WLQ VTA—2      9E2
N#37-$
A"
/       
52M(f

%*
 D
A
"%R?                     ##,dŸD(A
ZMB?#
87
CG‡e*!&"CA#

O &6        
t#'
$   &!5);&%P>x
,3_ JZ8
O]
1       TD1/3%/=        -D‡XFJ-
.>+$8&Fow6
&G"&Q
.
7
3A
%5!Z

&"\#S/   *#64,?X

")I_
    3c/
;O>       f<       q\/~? 6$!f
"**i$"-<L5
+@$?      +6YV`
%"/
#Na-UFTy l"99žq+ $
 ‡f
D/U'#Xid#Y
-
9Q    4IN 
          A#<‡d
5;6


&
2,]
"*$SM0   
    
       ‡V!pL) :P‡fR
[4'®o
iLbi0:
@3Oq,r M
-`/
H

E&
-MF"%$
 !' 1"J#:
L2E/#D
-&=!(‡U
&5//,,4

     L
      
D}6"
o*!1E%R^ ZJ*[
k=/‡]$H`1 
"=& <
     %&&:  +Z       2 9B>'"$X2L       35     35(+,   \@O&c   'E7WGHx!F.
,L     Y=,(>*a  
C    - ‡S$  V!
8PE(+*O
>'

M&Q6‚<
H'=E9    [SJ /      ?
&R"%1'AD
mNB
OW2</G1.7
   2%:6e 
$!40  
4!-$= ‡[
`+-.rG
),(4!fM@+:FKH
-*)'$
"SJ.@Z61!N‡.
>K       H
k
vMG#D!2-=—3?].&#
U    3*R;N

+6

$
  &
22
#SC
">+GDHh      ;.$:&fIL2
%-'.%:H%L   #!6S
;
C.0,/'
q*('4
‡Zg$BD‚C(^
-.0K3H-7"Q! 'IR 
8_
B
‚&!3YP$}N\=< )a!
?<*.C
'    I*-(C`8!
H"c'j;

&R#B.
"35R
B$
#&&'t),V1‡^   4-UA$*%+B"Q
+"I  K4.20$=
dD'l +=4!7*X) /::
n8SN:
-'>"7"      [ 
\U)5
Zn;'' &
L      =0.twVBd!"#&       0&^ 

#ZO1
0/
N)$ ,
d‡N$ 
S$C6,T8*%Q& 
V,R#
-^nq
""ŸV˜€€€‚G¿0Ð<     ?
•üK1A
@(5 35‚
6+(
)61 K(2!#/L0.O*
?7O
+ 64?%
C,7w
Z
!d *!?
7     0)
J%?9‚$6V%("Y
K+'(   ?V5-V!""
)B      
,7
u‡E        g(*OL‡f

}>S
B&2$6&
'L/<
K8
)
+B?M8` 

Q
b7%K‡d!

2Pu
D!

(
Y
3
;:HorNc
.%#&;h.   F4$m       >‚
‡X
J
#0
8
(=:PK0_@M:.
v\#
/
T&)H*'T&DA "#      +\BK
     }(=
0    4"*6
'       %   L
'

f(?*.   
 G2G
,:/7
((

       "!
      %@]     
(*[Po1!O,.!Z$U- )1$$2
#3Q
\G'   $8L&$X "
           ;E8-Q
$@<0
R2%"
G,[FD
=;    
x

{*"V‚u9ž%
?$/M4[%‡f
9 B6p."
(+
>
"7b8        0()K!
PQ„3!#:&
P&‡ad1H   P,>
'$W#   >

6!&

%
aX
-
+@‡\"@W*
&7!V3
FK_$$$X*Y
—4
D.
B!G#%$'M,!N38LQqqcQU`(,9TdjP‚H20‡B35‡cC%    X*
ImF-/N
*
      jI7*    +3%t9

(GB‡_C+!&     *&?-4.
&7Z?/E')*"0%YJ #IgD "Y&E-!)W$Q2
A%%(79&"G(4(
!G        ;
8 %(V51:
B#(

-%     P&+
[
8IVI[MU
'

U@@B"6uBƒK%"pMu
!=R
v     —
e 
5C
~&#<P<qPDP*{? L%(H‡a?)&p   S
1#^(A  ,E)( -G"P"

3-r?(C&*0(!bT
N             
2L
(
"*
'$#+U4    #a/'BF
p}M!
q2‡R
1
‡f1$  ?AN
B  $            .(  0*'V 
 G
&~)@              #O&

sH(6
$ V

|<+
        J
(1r4ID(!'-&4"*



-$        :,:LR0"

 "

8+*Q
      .4
 
%
!
CK          QV0
:6>        d<
$
"X/
"    "0
 S
B F#%$(03M=0#) 
/9-1   *@)/%@+
/

#        


@l
>D 0$-#6*"0^?
        
!0.$Q&"(7OJL0=TP/
 
M%K      S


        
95         (|< 
  68#e41DO.
*Z$
&
1

482"      
P> 
   >)6         $
[77
B4A;
‡G2,
'T)Lb
           7*/1:=!:+N"65
$('   +/,h
F—7$&0off"ƒsƒJ‚‡X…v
-X‚‚ƒ„B‡‚O‡/n6†)ƒ6xKa…)/L‚B‚8™QÈ3¶
     
…K
‡VLƒ,ŒE‚E–vƒv…?‰3ƒ%œ:o´Vƒ7™ƒ',‚s(ˆd*ƒ?ƒjœT‹1’<ƒl
OÐ9…e…DƒNŸP"…H…ƒF‡v‹57
„`Œ5ŒQ¥B‡.
++ŸM˜€€€‚H¿²ªa£
‚Žtx‚h‘d1†f…`IkJ‡R‚f&J#ƒu90ˆ!a…MƒkKƒ‚,9ˆJ
ƒFƒo†\Ž6›R‚
N’HƒcH’S˜£$Š+†?:†      
%   >Gž¦‘D   6£}„ƒˆI•V‡,Žöƒ"‚N¾
‚Q—:³e¶
Æ"
ƒ-¶[I—‡jR‚Eƒ2ƒv       …>‰3ƒ%ojSaž ‚‚iŸ‚4
\u
pœl§ƒ:‡gXMƒA7Ÿ#E‡g—ƒi‚N‡a
…wÝ‚h ? g&
‚f&J#90
‚W
+K       ‚,9[
>¶‚
N§„7‡gM.{    
%   >Gp—‚\       6‡‚[Ÿ‚._      .,0offendÂ…¾xr~ÙWƒ;9‚A‰'…KŒB]‰…fƒD…‚Q9<½b`ƒ;
/‚A®N
‚õ[†• ?
:9"ic‚‰*A
…e
‰_+ˆ!Hc„:”ÕE
U+
‚4H‚°‚i‚ß=M’
–I„w‚3
T‚
‚ X‰
…y$–;
6ÜÊo”:C§‹ƒ†LBÖ^â=
…y$§D‡joffno‚Ey‚Jnnoal‚Pset „0‰;’U
¡x $-"
„84‚.9‚^"
1!8"#\
R
ƒNF
„]ŽV‚r„EP®0
x¡M„eY…†z%+†
ŠHv1

4

`‹Öh#=3~—.”/dRAg>##'?’]
M‘\Ž;›^ˆCˆ

$ƒd)
‚‚W&·sƒ@
™3B"f"šo*
*Â8G…;
0\
r“k
²Uq«†Q9Š,Ž6‰U‘6¬-’…>TR)1xuM>b{C-
V%mH„"‰+GX@,H=Šk®{N%Ž‚pQ¯ 
xu„e……„;%+]$qv1

4

`žlÂ#=3ŸRdR
g>##'?‹z
MEs
A…`CL

$K)
‚‚W&ü\J4¾<rƒ-^"ƒh*
*—5L
0\í,0        C‡o
ƒ6q‡e†…6¶K„N¦|D$£H6T

;1  uM


-
            
      
‚K" ‰GX@,H=g‚r{N%        _sql_func‚5–þ„Tlimit‚×BÝÂtread‚›–°„Jsizedescriptƒ  …Ÿ¼B{„]x—û$2‰[‚  {
-xtenŸ‡
z5l2ˆ†d1x–0ƒW‡BÁ¿bƒY‘Xƒ$‚Su…qÉh!W3„
é*¢-ƒW"Uƒ     ‚^„:ºH¯#‚P6†(Q„uaƒ@…V‚p‹&

‚mo(‰b’^ˆ°^ˆT[†iƒ4’7Y.3F[%r]~‡z„S
rŠqƒX§8Ä*®    hk„hˆT“"™X´.!
 ¡c Z†y‚KŸh
J‚ƒc—X   u„WŽöF
„X®\—RB‚\
‚4‡ƒ —:\)n¾M—ƒ*ˆp       ˆ.ÝH‡‚=‡ig1
‚M6}Dê„—6O*¶       ‡†<"_[d¦ƒ2Ÿ%ÖK¦{o—3
„SŸ‚
;Ÿ+W‡M®iŸ@®5Æ46/—
‡w?®s'hn‚ˆ"id‘Dƒ,–##‚ŠXƒ3;~›wLûeqí.7‚™n…¯@1kƒDl
‚~~        
rI Y~

‚"]g^)‚‡_
1ƒI/      sG
…‰t7„Ud
†p!D$‚ },;ƒ,&ƒ*%="^}0‚t’s‡Sœ{‡4Ï4ƒV'ƒ!‡IBƒmUTœpj|_§-Žj•>À8v“I”.<ƒ^T…]KEƒDZ‹qB‚@

wBk‚z‚Kl‚‚/‰?;„zop‹}™Ew?Oa‹(
‡    W,{     ƒ{…$
›  Œ: i
z‚`(>4-    òQŽ*ƒ
(”&ˆm–e…]ƒ1p8„[‰&K
‡3«x´{†m\Š^Ž
              











•;QƒŠe…
†:]‚Žþ—ƒ§)‚'ƒ! BƒBUT‡D‚Ij|_—8’_ŽjŸ†^Zv     ,
ƒ<¦&‚×HÚj
     (‡]ƒi
d‚(>4-  üyvƒ
Ÿ„"‚:;Uw&„A ¶AD‡§}‚d¦C^ƒ4
              











¶UTˆR‡ffÎ
T]7_load_perman;K‚E…ZˆH%+Š/—´Yˆ,%+Õw4…!    K 
    
†s:…~_‡D
''ŸQ˜€€€‚I¿&¤0ok_symlink;Lapi‚Å5üŒmld‚5‚„.†aŠ?+d
‚i‚S%tŒ;ƒ37ª+à`ß2že
‚RZ „;?'Ž)„
%a‰       #‚ƒx‚HFŸNˆD       “D-
†"…l        
¢&pˆ      ˜?É|Ú
æm…X
s†$9‚%Š&ƒ%‚~ |Š
/½2‚XŸÌŸ+
‡3‚O‚þI
I‚Ÿ#6
fFÃ,X-
ü|
‡>pŸÞ(£qAžr% erp$j

L|'e*
qBƒ     •.…d‡5G,„~Ï[«vˆhu
{…„_~ºo
PˆJ¢…’^ƒKœ‚r…˜G4š}‹…O…J†deŽ_ƒxˆ4ƒ#ƒ`[’1
•=oŒyƒ™<¡‡‚b)…[,–z.‚{†(’•ƒ&‰†`’#Œo      ÑR'
™QvvƒŽ÷„B5GŸ*ƒ—ƒ
'®hz‚>ý
‚„6ŸM3‚W¾I:ŸyÝ:üNo‡‚)‡m0‡‚xRÎ'^r,#5`‚®<Sõ4‚3U'ŸvstŽ
_
€q¤n•=½7…§Vˇmiss‚»2ƒ·h“Ø„¢h5t‚1ƒ
N&‹pD„*.g‚r/‘tƒq„'š
†‚)
j'
6>‡*„h‰„e!)      0‚20

~m‚5
‚_

2$
’ ‚(
‰    ]ƒjnƒo„‹”`‚Š3ƒ)
gˆ[”N—I“vƒ{~Ý^q,¡ŽˆKDF‘;„-‘7˜K‚äl !Ž|:f…}ƒK™d‡MH
ƒk'ƒ‹GB[‚:0dƒG‚j„5ˆ5Œ%b.†~ƒ}ƒhRƒ‡wa‚QQ'
\-‚v(        J!0   ,Z#)M"521OF96.0r„4‚c&‚jf,,?-7M2¯j=p…”'’8/3D{o+ƒA'0ˆlŠ˜o‰†zŸ‚Œ.=J)„…
‡
‰f‡vœˆ‹~‡R„6a
„j,…Nˆ'„Fƒ08)&…@c[v{|ƒj¨z‡(Œ|¤‹
{*E„9*‰k8H(ƒ!˜ƒa;9*.‚ZJƒT„T
K.‚{†(‚R‡!‹,„mˆtƒG†ˆn
ˆ’S™'ƒXU‚#‚9ƒ|™3†'ˆhˆ!— ’G`‚=…u[M™A¤7NSJ‚v‰)•[bŽöwG     ‚‡‚‚L‚Vƒ'‡M§‚-L
/{~*Qžr,Œ4ŽˆKDF‘;„-‘7˜K—4‡}(5e
n|‡A‡g8kf—:—FÆ'!‡l;‡b‚:0d‚M.„5ˆ5‚Jb.…ƒ}ƒhRƒ@~‚QQ'
\-‚v(        J!0   ,Z#)M"521OF96.0rŸ—8lÎU¾B—9QŸ
)
A.ÎRE‡…ZEŸH)Ÿ#a¾}‡‚?‡ao‚dF_—;
4,ƒ@(—‚8‡i
8)Ÿ%  —3F.    {‡W
A„97ƒn8H(98‡Ib®n;]&‡ckŸƒT%T7"n<O.@aEK‚  3¦B‚T
‡x‡¶OD‡‡‚ zƒA
:|—„H‚‡pSˆk‚=…u[M
A#
`SJ&@)Y_‚ÅH7!
 S‚š}
0
ùX7!
 Saltert‚Çv‰tùƒ1„“nalyz‚ȉuùƒJ„“ttach‚ȉvùƒX„“uthor‚È-ùƒh  oincr‚ÈC‰wùƒ~„“itJ
‚AL…N"Ã
3       ù\
„i"„13    
matic_index‚Œ-½½ù
:…„ø‚e
resetƒh'ÉT5ùc…5
vacuum‚Ë(ù†c
between_optim‚Ëpù‡+   lob_liter‚Ìù‡<   treecount‚Ìù‡Suiltin_test‚Ì&Šsùc‡aŠscase_sensitive_like_pragma‚Ì0ù‡k     t‚Ì:‰xù‡u„“heck‚ÌFùˆompileoption_diag7]Ìaùˆ
let‚Íùˆ=
ound_select‚͉yùˆI„“t‚ÍQù‰
datetime_func‚‡CÆùW‰ecltyp‚„.ÉZùƒI‰prec‚„KÉK^ —.‚{†(§@Œ9øƒf‰O…Þ@+wEN     ‚seri‚t}¯<Ÿù…‰xiskio‚ÎLùŠexplain‚Îo‰zùŠ*„“flag_pragma‚ùŠoating_point‚ÏÄMùŠT
oreign_kei‚ÏQ‰{
Š|3Pù‹„“Î
3Pgenerated_column‚Ï_ù‹ƒ„X6(_3%$$$(1  + '*'Y)&#=
""ŸV˜€€€‚J¿0®0omit_get_t‚Ïlù‹' hex_integ‚Ïxù‹3incrblob‚Ðù‹
tegrity_check‚Ðù‹I rospection_pragma‚Áù–]‹Rjson‚Ð$ù‹_
like_optim‚Ð/ù‹j
oad_extens‚ÐE”4…øŒ„“`‚þlcaltim‚ÐUùŒokasid‚Ð|ùŒ7memory_alloc‚,£W‚(Ùodb‚ÑùŒ?or_optim‚Ñ.ùŒipager_pragma‚ÑFùragma‚ÑT‰|ù„“ogress_callback‚,ƒ>Íù\
Gƒ>?quickbal‚Ò!ù\reindex‚Ò<‰}ùw„“
schema_pragma‚ÒSùŽ
version_pragma‚ÒaùŽ
hared_cach‚…Ínù„,Ž8ubqueri‚Ó/‰~ùŽj„“ tcl_vari‚Ó<ùŽwempdb‚ÓQ‰ù„“!rac@Ó[ùigg‚ÓjŠ
Š~‚ù%„“"Î
‚uncate_optim…NÔ)ùdutf16‚Ôdùvacuum‚ÕŠùN„“#iew‚Õ*Šùe„“rtualt‚™ÕbŠü)ý‘„“%w‚Õnù‘)    indowfunc‚Õ{ù‘6sd‚Öù‘?xfer_opt‚Ö[ù’nM^<-`
9":‚?""D$e?LGHQƒ/.‚gO‚[iq:(t


3oa‚ w'l9n9(L:*RaQ:gN
z\OAEd7*!+‚fx6*&"†ƒ]ƒƒƒCF„]
u>ƒ6<?Kq‚Y‚\#L8d5j@‚3d‚ah
7AKƒ  "_<‚)Ec*@BBGƒ[h
 bP<‚w
(24J‚c&R@(-"
L=‚hQ03q;!p9‚      D=$     PN$o
      *ReF„i‚k‚ƒPyS‚?   i‚x*Dq"hr,x
‚hCC
)IKP&8‚4[      Vn{‚Yƒm‚9;?1#M‚Cchs&&Be'0V     ‚N"   C<‚m
PsDO}!@]!) R&LD‚X‚$kƒd;*Yˆ:
*a$#44‡0k6\M‚)ƒ&<ku8%Ka[UW
2"\J2+M$‚
K‚F%|2Rg
'PoH
n>ARR?
*+/]6
:8C-_…\NM
ƒh
X-
%Rk„D
‚

b
]9_‚
…(‚"(_18cz$$z


DI4#Kxi@
*79l./G„R[f^ %
4I\ %N9
""1*MH!‚d(#$
P‚!~@0MRƒL3Z42 OX0KK‚18x!3 AQP1
U] fl>)R!Vƒ„\=M)‚
C*?M)"M6-‚#o‚‚$\‚#>4(‚.        
*ƒw 9ƒ!1x‡_1ƒƒ/qa"     (*) ‚F:#8g:B4‚,
*yP
Qg$*^‚K5^aQ‚!"/B ‚Q… &ƒB0a,:#<0‚80‚CK
&#‚u]
'F]r!
F       )X$!-.‚\dn:4E:K(?9,    j&‚_1 %
/Y]%fg
\TI$‚9gC‚$ƒ444ƒY‚/\OU‚nO‚pƒ~4„‚
.H'.1IX.D‚

,5
3
tY&#o:i‚be
P[1H‚S=…TQ#‚W\)ƒT„R†3tEƒY…:&‚pSƒ8&AmAƒ9
      }`eX"Uz6ƒn‚ƒ:qTU04@yƒhW„ƒ(/'
Zƒpƒ4
z-R-Y

   E       
‚                       )‚    T  
'‚ilƒt‚I…C;hR[‚

.
('g,‚U‚ƒQ‚H†„:/$…'‡4Œ /‚o#ƒ[&:#r*‚[‚-$%v$‚T[kS      `%M(O1<_
E:{.…aU`;P
+qHi‚‚‹‚u{Le9)lO50n3‚$/&d)|l{{(H D„I‚ZRxR*n

_7hdrS‰Vƒ!&‚   Bƒi‚vKB)    `3711/ƒ)lP>…JEF‚*dq6Y
fD8A„…?jP4‚!
G‚#†6qhc‚X‚*r%‚6dC6#i
YD=ƒB(ƒ>D;…ƒDm(„K|Y*94$'"2Y+ƒQ‚g o(5„3LP5‚

~K.ƒn
‚p [       Vv-%V/‚!@Z ‚D XE„RG„9oƒhM9ƒt‚<Oƒ~B[x5d;Y&)ƒ8S†R‚, )‚jŒR ‚!ƒ  >‚E2rj‚-‚r6)ƒ)s0ƒy„Lƒ!a‚4na&‚
wb2@&,5-@En#j%-‚S8K"qƒJƒG<ƒ$E+ƒƒJ 4†Z‡P‚tDLK‚,-.‚D`5 O~4u
8&k@%_cR#ƒVz0B+‚%(V'.03
H%…i1^7 WNRF#”}4=S='iX‚-'|$j‚p:„::6Hl#Y&2ƒ„"5,H"q(ˆ%JDƒ        „!‚RIz  Eƒ<9*<$+&#&$4#%"2
""ŸV˜€€€‚K¿0ßÒX‚Y

N

N

J
N
M
J
N
M
J
N
H
M
M
M
M
J
N
M
R

\

[

R

\

P

[

[

[

J
N
M
J
N
M
J
N
M
H
L
F
K
K
R

\

P

[

[

[

[

[

[

[

J
J
J
X      <|Z



-†7‚.j‚1…vYC&,ƒLg9.+9H{!„9 ƒ,S :        O*.h0L2d?2/o‚-$.\9ƒL))…6l%1ƒmƒU.9„('
GZƒHWz |
=ˆ/z5\;ME'JC6&0G„.‚6~rU|E        p-‚B6 :C    p1=…†EƒK„Di- ;F42›28‚2^hw;b    „+7@ƒ>0s:V0r@Qd:-iZ„0<% ƒfyBu_rF->(
p`rƒ     30`S‚X‚ 7rIƒof„3
zGƒ ‚41 ƒe&J‚5).g_J‚H(‚rslZ-hrI}A<=
ƒt‚fh)*$jƒW}‚a2+ (VYQs{D
>(‚I<‚WV~-†=‚A‚,ƒT   >ƒ‚`‚#.bt6gUu†‚  udUˆz?t8c‚b‚0[E   
      l%"'@ƒw9‚        ‚l2‚te#<‚

B„c:S]*#*(#*("
        
        $1-XM`:Uhh%2"‚@ƒ.gK+."QLp‚/"nT98…xl‚1‚hEƒ;w?F?1…4ƒYU"bR*A
&‚{       
‚b
‚'ƒMZ‚‚(ƒ

&0y9W.ƒv
‚=%$e11Rp1‚L‚~‚H‚  >‚,‚*:k^1J)MK‚$Cp"?{:
‚~‚.ƒ
]~uƒNXX WLEWL`‚fKVS0‚coƒz‚-- '>.4‚&F/
‚5Qd#d…F-K„:zVJM4%:Ad%„=!lI!Bƒ.2‚‚        D;„?n& f/

g)/}‚J TC‚‚R#%V%D‚H"0UJ
'1wf ^!

=`Ga'Agn/ih8{FIC!@zJeO%/‚i9ƒA0j   dc7dAYg3*_ks2gƒ%xYeXpA‚~ƒmii`F‚f‚2zƒa^>,%`‚%#A9%'     &     %jlyn|'7a
K
K&Z+‚uI#…Fƒr‚gMb\/„:EC‚/\‚9        h+l.D
ƒ6=!1g2goBX‚T+y6A28h..‚!,"=!-4t~ƒ5]…Z6)B$B0N"*/+$;,6*QN;$2y
;@+''Xy
[‚wDF^†md3(„h       ‚/4‚`8%!Fui „UMƒZ0]N…
m!4!UBƒI7TjUs`D":[ƒl‚&Ylƒq0:>M6(‚.#Oƒjq‚94‚c„3/Es1ˆ‚8FNBa-‚.z;UJ
r${YLQ†U&n1ƒ)|"‚,'8‚I‚G3‚p2%&+A^f=#‚‚O…p_oP2AG/U3X}i‚"‚aW‚"i:‚eq"‚[‚3%‚x8GEIaD‚CQ){( '!L~ W:wN3qB%
&~K9_+-T,;u…2‚p>‚3<"        C       ‚HhMg,2"Do!L8yƒ q6Dw

iWJ #BdƒJ]!:7Iu‚Gƒ+ƒIR"$Ff9oar_#    `t‚U{kQT,_eƒ6l$B"‚.s!+@‚/WF:CXA;ZT   u\G5\A1<i‚B‚(v0&"w‚ƒV ‚&<&l‚^?(‚B"^?        ^eiD K*+"80 -$A‚d
_!k"& Yhƒ".ƒ9[Q+.cUUEAt?,PbD
E:F:Y;a$
e]!‚\r†-l`H           #„"JK…E
y  E
@LNG;R.&6OL‚'8$R<
=<BmUq‚=^gEƒHN2‚
‚|‚'`SCRƒc ‚(=<T
0zaI
j!~2(P
=#‚5W2B2d‚?Mf6)   &6ƒBI„Ws)Q‚7      "i$‚6uSUOy'V
)f,1NvƒQ
%…C„{m‚-{q_192ƒ>ƒ!C!1‚_jWJH1d'lkdƒEd,‚08
*qF‚~>#
hZ;S7/„:sG:WQ *c3X$‚<     aH
‚W‚‚g
>t
n‚ƒ"H:i z
Z!-ƒ
.$6…i‚"ƒC*DCG
.
X$&I6@%pC"l-fF+:‚2‚B^Z„C
3Jz1u$'j%Da:†ƒ.r"ƒƒ?‚(R‚,b/""
E‚Ng+‚$‚9
+&‚9"u mSOL‚_B52H‚Z/F7{‚#)0eiyWH…
,#"ƒ}v<Y&nc7H‚?+‚b@>co‚~;M\‚I~l#‚
]/ƒ>‚$v…&A‚b7Emw)9‚'‚*‚'#Y#8ZG4>  ‚K4$v‚@,$0!‚}APJ7‚C…e‚*,<t ]p7‚ioV"")mL
 /‚a‚4„,H@[@5Td"4?TyJ!(8>*‚8$F[B$X!5L/RK3S3F/‚p‚)Nax‚V‚B's0)ƒ0‚‚j1Pˆ'‚&uƒM1‚V$!*†)*g‚kƒD   7s…R,ˆ7{
‚‚l+
<ƒ        ‘34‚{0‡ˆ5„>2Š:zk:‚>Œdq"e‰~WS(’w
•ˆ†Z‡d˜{_g;F†}vM
ƒ%R15^{‚‚114X!ƒ?9P@
)>hY5<H.…<-f‚(=N   fSmL%(uG2w9‚U
{.LNN)'‚8!"I2a
_)DƒUC…C <-
9‚ƒG`08]"kh!e‚mR9…3MS‚$+wJ  D)J
<'j?GZLL2}[1tC%:`h/90WiEe)     %}5i7*k*‚"
!ZG2‚‚wv >!E‚
„X
‚1‚D ‚}9\{P
,P‚l+O‚}Qs
 ‚+        0B2‚D'2`
""ŸV˜€€€‚L¿0œÒ\ƒs‚/d$,„w>s^!X
^  %,VgHR%'%AJe!L‚@TMZ[Mb9&%C$C‚aI!‚.AƒQ;=‚        mj(2'"       T2X2/)ƒ"-zƒi‚J‡O
ƒeƒ{‚mo%I!n‚b    qƒ
5FH#[+Ru6-xyPG+9
e‚N     ‚L:K       C(Ie!D/1m-A3:9$=f
?ƒ(31548)("    &9A1'dq CA+‚8‚r3I2‚;1B(^3xx1Y       kc,dQ9Y\_:/*;nNS$6‚!+;p‚Fx$U$@r‚P6:!$!‚l+ Iwi9MM"7]g.*{3bo)7‚

.MŽösl:4E:?9,  j ;‚_1 %
"]
f\
\T.b‚9
&C
_$
4‡Z/\OUnO‚pRId‚
‡_D'.1IX‡gB‚

,5Z!
DY‡e#,: ‚,
‚S
@/&AmACHa
"U@R6ƒnK ':
"q>U04@HWƒ‡U+'
Z4
-=-<

   9   
w           )"dT  

‚

0
LX_};]hR[g


('*,
‚!
4
      H'KH$„…^ˆ/‚o#‚f&:#r*s$%$[T^:KkS `%M(O1<_
8:!eU`;‡)
+qHi|‚‚
^{
,R9)lO5‡_i33,/d&
%)l{O_     *n

V7'r/
+‰‚,=ƒ!&‚       Bƒi‚vKB)    `3711/ƒ)lP>…JEF‚*dq6Y
fD8A„…?jP4‚!
G‚#†6qhc‚X‚*r%‚6dC6#i
YD=ƒB(ƒ>D;…ƒDm+G(ƒ8
P5


‡+‚w$


‡)[  VH-%/@Z  XE
FG‚oƒhM9ƒv
nO B[x5d;AY&)ƒ8Sb‚, )N g ‚!ƒ     >
n2]'
%)5s0ƒ„L
a9na G‚
wb2%&5-@
Cn#-$I-‚S8K"qƒJƒG‡A_"+%x    
4(DLK
‚-‡R‚`p      -~4S
—5RF#”}®m3ƒ8D‚Y

N

N

J
N
M
J
N
M
J
N
H
M
M
M
M
J
N
M
R

\

[

R

\

P

[

[

[

J
N
M
J
N
M
J
N
M
H
L
F
K
K
R

\

P

[

[

[

[

[

[

[

J
J
J
X      <|Z



-†7‡fhDC&2^L'(y]0L‡fb?2
o9.R9‚0
U))!+‡^@1ƒm‚&.9,ƒ('
GZƒHWz |
=$z5\;MRXE'JC6&0G„.‚6~rU|E    p-‚B6 :C       0L…†EƒK
%`- ;F42G2^hb         ]7@0
0:
I"
0!@@
O-i6<% 0y-
/r    $>(
p%s‡CF`   ‡e`S‚    ‚
WIƒof„3‡d
7G‡h
‚4
\ ‡‡).]9
"Ÿ+ (VQ§@9Y*2‡ee#<!¶VEZs‚(‡im—6?11R71‚<‡‚|C‡g/>%:D‡d3GZ1J)M%‚$C`"?
':
—
>CyXXL
 o- '>.^F/ŸIC‚^#%V%0‡f]"0
U4
'1.f    ^+

=`(a'g
,i.\F[J!@4‡W
HYO%/‚i9ƒAPj  1
7
AMH3
       ks2g
2%=
)
,~Y
ƒ=i
F-
ef2z       a^>,%#A9%    &     %AynR'7žqK<S‡fZ/
"E'n?2ay
!‡d
 =!~4

~.6)B‡U@ *"*/+$%,6*QN‡fx$®10
        
i4K8%!9ui 
}M‚J]N
i
!4!U‡Xh!Tj
:s.DJ:[;‚&^‡]
ƒq:M6(‚    >ƒj3
‚c„3/
      s1i|     H
0F%
""ŸV˜€€€‚M¿0ÎqB%
”÷b!
K+"-M$7‡X
C;!H] q6Nw

iWJ W#Bt;{k+T,_W6l$B"zsF+@
A
WF‡!A;    uv5\A1<i‚Hpg;‚‡e7wW?(t"^?
—2
i"
&      Yh‚..nQ+.
U*=EAt?,PbD
E

z:UY;a$
e]‡["r†-
`[               #„"J„P
y        E
@LNG;R.&6(LH8$R<HUq
^gEƒ)N2}‡%`SCR=A ‚(+<T
0zI
j!~2(P=#‚W2B2
q?ML6)        &
6
CIAs}Q "i$n
FSU@)'V
)‡N*1N;v4
%…C$ƒUm"{6_1*2‚&ƒ!&!1‚_jHJH1d'ld =,
30'
qF‚~>#
Z;

/s‡F
SQ ‡g=3X$S     aLv‚M
n?\_:
 ‡c

-d.dO"ƒC=,CG
.
X$&I6@%ps"l-fF:‡ZV5Nrv‚(JNjHNg+‚$
+k&4"E -0
 B5
+!  175

)

     i
N
H‚*
#"
v#Y&/c
q
p+b@>
)^~
M\
R~R##
(ƒ>ž5
@o‡f      "
)m&
 /‚4„
H
9[55‡ab-?T\6!z8>
*&$F‡[X!5./RK3S
W3fF/<—@'
0)3SF        vM
ƒ%R15^{‚‚114X!‡e
+9]
$‡d*
XhY<
'.‚<-f‡_=Nf,mL%(uG2<9&?
{.LNN)'!"Ia
")DC- <-
"P(08]"kB!
R9|=‚$^+wJ  )J

<' G
!LL

2
[{—

9,iEe)       %}5i7*k*
!      G2‡a‚‚Fv !!EZI
`Fp09\rP
,
?+OIQs
 !‡R



2‡fr2`\wp
/}$4>^!r
^  %,VgHR%'%AJe!L‚@TMZ[Mb9&%C$CGI!!A
o;!:
z('"    T2J2/)'-o
M‚J‚
Reƒ{ro%*]=  q+5yP
+9
$'        ,:g     CI<

?`1     48)@"    &
      91'6L
; C+#v       3!lYB
^3db1Y Rc‡IAdE9(NS$6‚!+OFx$U$@—80on0‚‚e–ׂe_delete_set_default‚¢•Ú‡1c‡3-†o5=ˆL‚!{Z
„‚iƒK“nŽx|-@†ƒvH,:ƒ?lx/„  ‚_+„TGH‚|)v
Y>*+`
ŠU„_‹Bˆf„p‹8„TQˆE&y_¼m`‰rˆ
;”F…W Š7…‰•7“a‰R;„? §<—:¤&‡z‚_}‰‡‚Rƒ=‚¶F$‡4gA%’pƒ&†6( o‰8=’CŠœ7ƒ…‰A„.ˆ‰^‹U‘bƒ_ˆrM†"„fF„h&‰w@„@…Mj…o‡K@„K?‡]
K‚-
‚f/e‰~Š#Ž@‚œw
‹UpŽ8d"Š;‹Z‘9‚„O‡'“Nˆ‘n‡tŽ|‰J–a„¬C„        S      „KŽŽK‚/‹w‚ŒI‚„E‚CŠ@ˆ/”p2‡xˆu„D‹,f$Œ8šk“\QžCgd"6ˆ4“?HP     <‰9Vb"žRˆ2P      ŒÂ8ŒV’z‹P‚WŽ÷
„_
ƒB/‡Yd‚ §:
—3y_x‚;ˆS„Hƒo•7“a‰R;Ÿ‚`†:‚…‚_ô‚9f‡ŒNg
,%2V—9$
""ŸV˜€€€‚N¿0Í‘‹dG¦oœy‡gi®t]M§$FŸƒ]ˆ

‚*@ÆId¾DF‚3Ÿ‚*dŸ*¶Ri‚mW‡†RW‡‚z
…^
‚f‡2‚nh;ÝI
‚/
CCE¦^‡j(‡b,f¾ƒ!HP   <4Va"—N      —T ƒ8UJ
0onecolumnz……:r‚ÀTgoL
2É[µyƒ5—m
—6   
hŠT†KË?¯2½‚[
‡ƒ1      y¶‡ï…Zli
‚tLPƒh‚{‚2>…ƒ;<[Lro,‚i#
„L‚:ƒ-‚‰ƒqZ„\"†,ƒA‚aF6ƒ=#ƒT0„c‚EhŠO‚
‚R„v‡O:ƒV‚)^o8BD‚ V‚F% „\dzq_]„:&,

ƒk"„-…@+ƒPp“w
$ƒUƒnO#„N#%2‚      …Db„<ƒ‚]ƒltHRƒ „/W‚pTC‚X
6
C@c
{5ZzSL2N

6f
Nd_+[
oE+t>‚`,‚g      8Zn
$i$
g#Hve-o@‚F‚P'@I,
„C
„
w]‚v\‚5
}t„a/*ƒFe
X.v‚86!'7*2G(ƒK(=‡u;‚D‚gGv‚3}cwUSV&"‚lˆ>
}5j†O…=-‚
ƒcAƒ0ƒ}P
‚='H 59ƒ2„       ‚5[‚&„\‚.
gDd@p‚Ig6Wo‚"e6‚iF~8„[^ƒ„:‚e*+NUg]jr‰)†‡v+d:S‰.2Y+‚#9†.„…:„N‹„Sƒlzk…c…G‚+‡*Nq}‰ˆhDhCƒLz‚:bŠ|‚@ihŠ|Š'…z}%‚$7n‚/‰‹+ŒE‘I[Œs+„)‰/‹Q
ˆ9ƒ`4ˆ‹B>3;‚4„"s""#‚KŠc‹f9~ƒ{<X3ƒ1…0ƒG… (‚`+n Yf!]‚d_?-Ma†H[Qˆ  ‡&„Dƒƒ3ƒso„1"ƒ‚p‘fˆG
+„9$D‚^ƒ<VJj7…P‚.†`&"…+„p+o‡mM‚ykˆsjƒ
…|‡1……a†C‚!ƒ)8&=…
„Gq%*Z‚…)…t‚L
R(j'\
'…8P‚qql#RAy‚3ˆ@ƒ‚„"ƒoƒi‘E²‰W[\…$ƒv0…‚!e<#‚M…*ƒ.9…
#l‡\…k‡=[MMƒ6{cŒEsˆ$&ƒs„%\QD‚jE…@‚rƒ'„H†j8‚Uƒapoˆ‚"s7…=Kˆ%6GpHP2(s
"ˆ=„:%„-`J
12S‚7 \‚/‚
*s'6X„7ld„i„Bƒ!…‚0%‚po
@?;Rƒm3Œ(‚.7]‡X„k,DMŽx0ƒ8ƒ‹8@?‚xƒS„„T†~‚##‚…†;PS†0}/6v1„B…D‚‚JƒR‡09„w‚T„&<
l‚Z†3„kWd‚&?G.|†J?„
!‚26`%
…?D‰†h‚j (3m„-„ …a†B…lFg„^A&„ˆo'vƒ-Œw‚"`Fƒ)„…n+K
kD:ƒd†x‰U…P}A…s…=„„~ƒ5‚_ƒ*%eƒL„t‚85‚_xƒXCQn}‚
‚0c7w!3ƒA/Sx‚f
D6^cƒ5‚J*ƒ6‹Fi…
‡=Huƒ‚m)‚SH$
":”VƒmˆpH2(ƒUj4‹…3‚†  o„
†)„[…ƒp†L:ƒm…c„W„w‡v†4ƒVƒŒd‚Oˆ\„R
„pFE>‚bƒŒ^:„w=†Y80ˆ<D‚1h=!a‡G‚3ƒu„&‚^MaŠ_….‚BB$"’]‚C‡(4P1†{„3‡B›=…6‡‚ƒn![jr‚ƒy#6J?B‚LyƒdtE† ‚nG#!‹Q‚N;*   ‚xN…Y
2ƒ] &t|OƒR^‚Vd…~FXƒ‡G‚TPyZ,†(‹-Zx…‚V‚gm


„MU‚[dD„5
!+B%…1‡dLSV!FL"…5‚*tYtI41‡9^‚‚^iU!…2‚l.2/)#?‚N
9(bƒ^Z<>‚1+‚?‚!z.G:K&<Tƒ(R‚2K†t'ƒ*„sƒx„  ‚l‚HJ†W"6†uƒw
ƒ     '#lL„(>‚h…f%sr8J-[<‚y7„I`†M„
`)1q„n†>‡‚      ƒp_‚…C„…QmŠ<@‚]6Œ?ƒI*„c‘†OŠx¡/±fJšuÊ(J†3ƒ[mƒa0‚'…V<#ƒ=Š=Vh‚'Dˆ=Ž3${‚ŒuŒU†qr(p‚(ƒ…%…„J        O‚i‰r‚ƒ(0ˆ:‡J†:‡C„R}]… ƒm&U|ˆƒy.„.…#„K‚Qx4!‚O’mƒ\5†dsL/it‚J…\„„Q!r
‚U^‹O‚$ƒX(…g„ƒ4„-ƒ6‚O‰W„M>
…"p
FKeƒUƒW%…_GnIŽös
|8R
      ƒb=+N‚Ug
n
?jr‡ƒR
…B
D+‡`‡h :S‡JT(ƒL‚MNq8YD‡sz7/;
9iN'WY%
F‚/o†ŠFS[‰+‡4ƒt‚%‡N;‰
ƒ
k
""ŸV˜€€€‚O¿0¿ßZ*p>3;‚4„"s""#‚KŠc‹f9~ƒ{<X3ƒ1…0ƒG… (‚`+n Yf!]‚d_?-Ma†H[Qˆ   ‡&„DƒSH‡^‡b‚,z†
+9$D3V;j7…#z†`&"9„p+‚,jAljƒ
vT…‚ w‚ƒ)‡?0zq%*-1N‚L

C(j‡R%(
'ƒ—7®°I‡n

[TE
#MM‡h/o9
)#‡5‚‚‡=[MMƒ6{c*Dsˆ$&ƒs„%\QDE…@‚rƒ'„HƒGGƒ

pYfa'/2s,$6‡E
pH02(s
‡ƒD%„-`J‡c/‡h
q\N<Ÿ
o§  c
‚"‡fQ¶$O   
(‡i5—1'Wd‡‚$Qr.,‚]?ƒ—5
&`%P
P‚MŸ6‡‚Lo'
X‡ƒ)„
E+=

D+"1XVh}A*‚`C
v5¦]
3‚_?@QLa‡u!H/VdC       6^®
BiƒG$uƒa‡)H$‡5F‚rA2(ƒUFbO7I‡SN
[DPX
!M3)‚‡_
utZ„
‡eZ
<vB—/„i4P1‚J‡ˆ„LL‡‚V
S!(j
l‚‚L#6J?   ‚LƒdtE‚hG#!rM* ‚x8‡0=&G|O;O‚VdA
]FXl‚v‚TP\yZ,„DZx$$[m‡E

‡j[
MULC—Q^!
B
     %Z†dd$SV!FL"5]‡X(YQ
BtK'?%Kbƒ^Z
 >!13‚'7n-
#V'&T$'R'‚b‚(=q‚l7--D
8
n
B#`@žZ
)‡/q‚PgT
s‡lpF1‡_    m—6,P&ƒ[mƒa0‚'…V<#‡e)‡j
VXC‡ƒ*‚
$l8w@((
](‚s
‚P—MK‚?
<ƒ(‡„       kj8„J‚,G]p ƒm‡T$Q‡iD^j.5$-‚Qx4!‚O
‚/
C59L/A\„‚fWTDO*‚;=‚,
/!7>—[pOeƒU—#0onlinL&2P)‡
ƒ„2off9
‚W
¢,—ëc

yesal‚Onyesal‚Qset‚“ØyDto$$6!2–FW¢Z’'¸b…“Mƒ@ŽH’bÁCˆ·CŠ‹N†Q‚ˆ.¡,
‡rLVb55V”QŠ)"‡^ƒ‚,tA½x8ã|œd-WEƒiŽ÷
åGŽ’'¸b…§‚ƒÌ³2—:,ŒƒÎXí‚0Y
“Eom~ã"n…g$†TF,'@„Ž†  ‘4„k‚y†wNL‡J{r½Q‚n…gÊg+F,'`@rŸcò!N„Ñ\‚iJ{+p]…Š'dŒXpŠk
„;m…h„u‚jœ9lB„U
\‚Fpuko
&…1
s@
B6ŠŠI
„+e)…&†‚b qƒ}žrŒOŽ‰`3ÈG0šp‚        rˆ?Š†ˆL¨u‚/9ñ]œ‰
"³
‚}‡H=|‡+„e¡#†t
ªp„Wƒ7‚P*ˆX‚ƒ&‹Aƒw˜.…tÉy”:+®nƒOX…r"U_Šs‹1§T&“f‹†C
QƒY+–Y†a¡•g…KŠb•;”D”/àU
D†l¯>
—2„3Œa   
ŽŽ÷%¾p3‡GŸ0†"‚       rˆ?Š†ˆL¨u‚/9Ÿƒ9‡]&õˆa‚}‡H=|‚m„e_2
?t‚ÈAˆQ„G‚N+Æ!WBNd"U_‡ƒŸG—B‡ƒblM
QƒY+‚:tÝ[~f
A¦EhÆED‡Y)Ÿ.ŸE_add‚
¢‘‰@
ggstep0‚˜ ݃R
releasereg‚¬:Ý—lsult‚
î}ÝX
Ú/subtract‚
¢‘‰@
vrowid‚ïCÝÚuaquFà)‡~ƒ6      aƒB“8/
‚    †-
))ŸO˜€€€‚P¿"µƒh‚wf‚U¢½‚ƒëq>0opcodk‚BG
‚u%
`-DRI)j
%
N`i+",*m„i\RR4I;/r
vEYŸ„,L5+}[Ob'9
 

`ˆi<&C=S1„'$G
p‚.‚_f11*.‚?H‚-56‚jƒ1
^_Yty5<(‚LA%m w‚(';1|F
-8(?<f$t V‚T78~,7:AU##       L41pl8uƒ:           }h*        {q 2<?‚4/4L‚{

‚J%žJ
»Úg
|d4m^‚K‡~XOŠ“˜/”hŽFeŽWŽ“n•      ]‚P7‚8    ˆh‚g%‰ÜG
L5}[9O!'9
 

[ˆiƒl<&C=S1„'$G
p‚.‚_f11*.‚?H‚-56‚jƒ1
^_Yty5<(‚LA%m w‚(';1|F
-8(?<f$t V‚T78~,7:AU##       L41pl8uƒ:           }h*        {q 2<?‚4/4L‚{

‚J%œ_…Þn žÕƒUen…H–Z„ZdŒaCƒ‚cJ‘Jƒ*‚/f
R6>@s
i
Uf6y\  
9F0(
W;1U
2      „ ‚N8{ ‡&Tu‚^…d?'ƒE'.*Fo"`[ŒMj.uN       HB)'(%x1#„"‚T#*&

 )ŠA‚H 
79
C6+}0;‘Dg
‚?†MC*6o5  /Z‡‡
Q‡d>.‚2&1i‚]
V
ŽGª>—„1}‚sc‚y‚D…‚8–o
…g ‚‡+}„LŒ6‚/ƒƒ$     p
#C#{‚vƒQ‚h{‚E„3‚ƒYaŠe„
        „;z%6‚kI3‚l‚
a‚BJ‹F
…C“‹ƒCD‡"‹4†1…WƒW;_ˆ>f‚P
…7
„/‹z,ƒc‘D•K
8ƒ+SƒJ‡fR‚[¸o,"m &e<…t†?FP„?Fsvƒu(Xr'-j\ƒ‚:†'ƒ:xˆnŠ.4d+A+M‚X†z
ŽtJ/:I3\Šl"‡",„5ƒ+„of™¥
d"E!‚b[+v„88wp?0ƒ
&'%,A&*61‹N
„
 ¨Jt-\l‡3‚Em
6‚#Š=ˆ„!ƒGbCƒRƒc,‚T’&‚fƒ|P=„S.&H}Xƒ^1E3(    !†2–~‚1Z D
¦g¹}9Š4†O8A†š>!ˆ9†5ŽMŒ„·
ƒ
ƒ     &OˆPLH5b8$#5„SH3vH(ƒ-ƒ"OUp‡F‚;S–.‰1TƒFŒ>Tƒ Y&A ‹oƒKˆV…6›*“V 7Ž#›Ê@T‚
„;‚"mƒ&#m1bfM+V
 ‚"2‚‰J‚?J"ŠO3\ƒjp.2ƒOH’\0„›‹2…BƒgÛ</1/1ˆXDt.k…YH‚JKX5J

;††%ƒ„‚„gI†Žöu;     Dg
v‚iJC*®b
d&1i‚]
V
—=‡T‡1L+3}
Š
…g ‚‡+}„LŒ6‚/ƒƒ$     p
#C#{‚vƒQ‚h{‚E„3‚ƒYaŠe„
        „;zÆ"
ƒ%Î
‡…LƒW;_ˆ>h„M‚P
…7
„/N2,JV*5K‡RtË
+‡j—9:V
3JŸO‚Sƒ+
f&
+"E¦Zup?0
'%,&*6Ÿ
Õuk§
DU,BT‡^Ig/.—Ho]V1E3(    Ÿx‚1Z D—‚ ‡]
u†H8
"8Ÿ?‡n       
‚1!¦!@K}¦M‡l9®k‰LT‚
„;‡1NF#m1IfM
‚P 
 "2
l
*"3
3\sp.2Q—
Fr‡ƒ„e…B‚U/+/1K
k
"JK"5J
;-T%2¦ƒg16AvWƒGŒO
%s(")ƒ‰3Ñ!ƒLFR„?7‡UƒJ/Š0†a
„)¦§,«Œ\¶SvƒìC‡—3‚_„e    autoproxiQcrQtƒPD‚‡JdeleteonclosQtƒ39g
5exclusQ
\t„k …K
6rescodQ„    fullmutexQƒ"¨ ƒ9ù…2¶Vcmain_dbQƒyS
¢G‘‰,
journPVƒzHemoriQ
‚XnofollowQ„mutexQ‚}¨ƒ*‰Gù…0¶VTprivatecachQƒ~†V
‰_&Î
X&readonliƒ^e‡`,
writQƒOy'‡H†D•£qv
sharedcachA
`'ƒO†q0
‰]&Î
V&†J“1
"&/(1)',
""ŸV˜€€€‚Q¿0¹0open_subjournQƒ~       per_journQƒMtemp_dbQƒ{S
¢[IG‘‰,
jjournQƒ|Jransient_dbQ
ƒ}gKI/uri„]: 
Œa
‚J„!;•»"Rv2!E 
tj)Y        ‚PƒBŒN(4v4‚i%$ 5‚
7] „$(~ƒ‰5@‹¨#›qv4+HK„S=‡>ŠjŠ2†$00ˆ‰Mƒ‚‰e¥§
.@«…5‹Œ^¶Q]R+‚ÏOœE‡h$0—3_o‚f  Ý_wPX„       autoindex‚ÙYÝÅbsd‚ˆ}
½;.–3‰f–þ)<í,
clos‚H‡r.:*$t“ÿ~r.
[*$1      e_udf‚HˆFUf“ÿ~
t\UUdoctre‚‹u‚qJ +2!‚4‚Q‚g:2i‚=up‚ÙzÝÅ,ephemer‚Ù`6™\ÝXÅ6™\offic‚I6„ƒC(p†++•npseudo‚ÛW§>ÝXÇ        §>read‚ˆÔ+ƒ‰O#}\)†s‰ƒG†&…FŽož‡I†r8›N8ŒF&“n“|†uˆP…n‹„tÜWVÇwƒ‰O#sourc‚‹=sl‚…J‘˜ytemp‚èdƒwrit‚ˆ„nÐ|‹g}4ˆ‡#0‡.K”"‰$w“6ƒ[ŸSzÜWX‚É6‹gr
ƒ-ˆ
„4„.„n,#„ZV„(RQ9QK8

!T"4„!‡w;+‚6„5….-j †[‚jF9„a†"ˆ1&

4'        #*
4

>
/„R0U-)"‚Q&"J >{"ƒ,‚"‚c„4)„18$
!
(
Y*
#g!     ƒ5GV
>k,"O       7
‚„

Kƒ`       
ƒu,-ƒCS]f$ƒT?!‚}ƒqƒKD=j?
!‚l

…„cŒH0!$:$'a‚    &M#tX ‚ƒ=ƒ‡S\P&'##;‡„v6Y7rr\^‚?s\-2D(”
L‚gO+‰   ƒ@‘/‡|…ƒ4Y
/8&J-`B„m‚$ƒ‚;-h)^‚ƒM…5†AAG;G*
Œg‰)‚M„‰z[„o¶V’'P…N78+
&L^A$†3‚?Hs    U}z?w‚„*ƒ>ˆqŒXŠ/ƒ_‚
…‹
‚3‚DŠ;&l„e†ŒŒ1!‚‹G‚ƒ2        \?…ˆ0C‚>8`F+R‚:Eƒ
/+ƒ‚"6

J
  fpB'&

&!‚6.ŽGŒm“2„9H‚J=8…tG*Ÿ…pBV„@?C       †V
Cƒ‚M
P„    ‚$"*9‚$]‚zM"ƒN‚HCŠ7…*&‚*TZ„>Hz`Ir„I‹ƒ0TƒN ‘:9*I/[‰‚?‚>uƒ`…f†V”qGcƒvˆ4‚s…9‚t22‡^,@%dP?{

kŒ{‰XŽZ‚*}ŠK_„ƒ~„Xp4„&‚’o˜L‚„DƒNŽ(;1ƒ]ŠVqƒX…A${o^‡D„ˆqŽw‚5ƒ.‚%‚R
e
‚d(ƒ)…#†‹
Nd‚T…\+><2C‚ UƒCœgŠO
$S”
$("!…^
Htg.w‚‚^2Qf‚[l!@K9&       †mƒqLƒd†qF%…7‚n>ƒ2
yMOƒAt…kŒ+‚^….‚LA
N†i$—7?‚P‡w-"Š*,‰sˆ*‚f‰E”0T…7\ƒ{‚*`„‡ˆ]NrŒY(Š-†"ƒ?-Oƒy‚B(—|Y‚.„H‚„„R
ƒ2‚~‚g‚F‡s‚ƒ7Anƒd &…Vtƒ_…=&Tƒt776,+ AXƒx`n7(ƒS"Bl
T‚O-Pƒ‡"v$)W†g†[a‚hˆR‡93Ub0$…eƒ84!K87\1uZV‡†?…(!.Š=„vK@—H‡2†O&{‚k
},@FDƒz
\‚uƒ,„K
I…c‚a„]˜2
‘lD’}me'‚–[‚e  ‚„;“GK@Q…O‡q Gƒ2%‚9‚"+PI@Y$2ˆIƒ.d‹?ˆ$‚&-†A2,)x‚Tk0u‡ˆ4ˆ#„n‰"4X•E”‰‡wƒo…Kg‘cN
_‡?3R…&‰xƒ(.‡>‚K˜n–T„aS/ˆ[‚o‰M„Y1ŒL*˜L‰Q„Z„ƒ/
I%0–,#7›-„0•h’R‡„W‚],ƒ}ƒhDŠT†9>(o9B"ƒ/$‚<ƒt[… pƒ_†JŽösW7r=‚?,\-2D((L‡‚ezK:—6BV+`B$e8;-h)‡V‚ƒM/
iA
;G*
Mƒ‚>
[o‚    )P
„7‡)'
&L
$?UHs     U}—/<K0/
@ˆqfŒ(Š/ƒ_‚
…‹
‚3‚DŠ;&l„e†ŒŒ1!‚‹GŸ>‚
„"C‚&8`F+R
@E(W/+ƒ‚"6

J.
  fpB'&&

&!‚.„G„P…^hHj\XoG*‚qu‡?
H?
        $
C++‚;,-.+$ ZF
""ŸV˜€€€‚R¿0´Q†gq‡S
4P1      ‚$"í.
‚i ‰19*I/[‰=‚>u0…f†V‡;Gcƒv‚=I
5,%dP{

k\
'—:—@`Î            1‚$Æ&?‚R®oBP‡ƒp—66‚X¶R$(‡`
!…
Htg.>:
~2>8(!@Km#]/@.R
u]%.Jƒ2
E(
/¾?¾M*?Q-"‡r,‚Y‡^
Ke4H
V‡a0ŸTm&T‚1776‡_ T?+`n!(—$—8       ƒrv$)‡‚o‚$I^YR>3>‡_$
L,4!K87\1uZV

!.ƒdI‡=n"[&{‚k
},@F?ƒz:c‡@—eM

I
'‡#

¦ym
'
t‚e
‚D     @Q      %ž)F‡/u
O‡fj‡Z§
K3R…&‰x‡eO‚+‚K
(
%T
.ƒUJd—‚1a‡oSy$‚Jƒ/‡G%‡~C#7
„0
hO/w>N  _>(-9B"
$:[*—‚D0opera‚‚~•»#Ondš@PW,+ B!
‡      …:!!IY<‰!
ƒz )/$[
        Q"*\&…
P
`*O6J/‚ (4-9^ƒ1     e…V  $E
’1yŽJ„i‡m_ˆD‡#‘p
R‹52a#8m9{‚}ƒ
/‰a‚o‚[ƒQŽF(ƒH’aH«v±Y"©cE1&„rQ˜"‚>2‚$

Ž\4>r’(‹n‹~šxš?â&.µQ$(
P
e*6J/uF (4‡‚HŸ
        e
     $F…S
’1yŽJ„i‡m_ˆD‡#‘p
R‹5Ÿ#8m9{S/
‚o~‚(‡i0(õ
‚cŠ^H„ø‚:‡e„yE1&
„dQ
ƒ üf)    tionsqlit‚Ž„‚eorenhanc‚¨üƒ)standard‚«üTflag_append‚ºÝ¥M      uxdelet‚§JÝfordelet‚§r·&ÝX“$·isupd‚¨tš:ÝX”&š     lastrowid‚ÂbÝ®   engtharg‚ ;ëcÝX‹mënchang‚§~p‘JˆÝX“0p‘Jˆ     ochng‚
ŒÝ÷3_mag‚Íݸp2isreg‚Þ#(ÝXÉU(  ermut‚¡w¿YÝX)¿Y    reformat‚í9ÝØ       saveposit‚
¦xBÝX
’*B   eekeq‚"ÝfŠ6!Š#&ƒ&ÝX"ÈNfŠ6!Š#&ƒ  typeofarg‚ _ëAÝXŒë
useseekresult‚ºNˆÝX¦ˆinion‚-M‘‰D4—
portun…'`6
7 +„2"„*7“8‹UJ–x‰JŸe
LJ'$‚”s.‚{†(§@Œ9¡f„U’ËX‚%*7„ƒ‡6§/úÝ‚2i}7@  ‚s‚‘s¬  ñh,it‚¥i³”å
‚Qƒ–0Mt‚
<
…vO
zƒF
†úS
ƒim$p(‚L/'$9ƒ,)
Š,dŒX‹.  .~‰q;O‘„[(!
„„ƒ‚
R
|‚Y70…2ˆJ‚q.˜‰
‰/.™°@
\N°Y
KN(ºƒ‡4—”{8…G„S†fRƒ5>ƒc:‰D%
 ÀRO–"2m""4…‡h„n±6ƒ_ 
›q;‰t< ‚Š)V:%‚,x§j‰O
&     &dP      X49A       Dƒ„„(„tD†9+„*‡1ƒ'EB/$oJ!k‡9.†w“eˆ …Œv„jJ‚r‚
†wx‚%¤ad‹p
„yH…?ƒX„ \
‚‚fƒZ.—3„‡Nˆa‡+F…l7&…-$‚4ƒK‡G
8ƒ       ˆCƒ@+@r‹#&4Ži„Žw{ƒ‚A‚)‚‚&w.‚a.#$        6ix  ƒM„‚„$qnD_†W‡\…C…eyF7      ‚_>š(‹V*ŒFK–‚‡„J„E‚<;F†i‚&¥bl%W1'
     †s‡G…<!ƒ;‚ƒ7Æ7ËrÄ~
‚Ž«fÔS¦E–"ƒ[(jQ
„R.‡qm
‚>
Lƒ‡7
GN—A(¥Hƒ‡4—”{8…G„S†f—/O
‚v5‡:ƒv%
 ‚bg2B"4Õ¯;§‚z 
”ƒ‰t<   ‚
)5:%‚I)‚
     "

&     üaX49AÆ%Y¶W§‚1|®…‚<‚     
T/Y¾IW¾I$¶B‚G
x
R
)ƒ    ¶2u
‚c
Š„'#0& U&)
!!ŸW˜€€€‚S¿2Ñ@{•ÕF‚X‚Ÿ
6‚)‚6‚&,-‚a.#$       6ixƒLr‚LD_…xF7=‡
*
†,K‚W®‚‡f§†iK8%W1'
           ¦-‚ F‚I¾^:—ƒ1‡‚0ƒ'Ÿ0option9ƒPeƒ
‚^„@
6Mƒi_…
ˆ~‰} 5.h&ƒi…œD…5‚f„J4…‚A
ƒ\:w+‚'*‚iƒ{  $
‚I
!+4bMh
.‚h(
       >‚F#‚„‚M
‚\Lu„T     =
)"‰=ƒc‚G†G‚ <
 
%+ 
Q

N=JD
{@        &     2%&t+
;'4%0_k;

7E$‚E6j‚
bG)ƒuP    
%D_V
V
d=8N$aIU<&$`c
‚ƒk
8„P!…`’/S›Q} *R~.XO  ‚w‚~‡   v„L'.!`5-ƒl‰ru}%‚C…‡|†cU        
        .>*AC‚<
fD%#
@UM-T1qa‚'RQ‚+$KyŽ+‚@6rƒ  j,K-- P
)–0/…(„eH„„l’;w
C      ,‚=„…ŒV‚I
‚#8†U4¸nŠF]‚>.„ K
‚P6¤|Ž5
-9'3[<3(‚E>&ƒ(ˆE9     &KEf„)   $f"~
'
ƒz‚WƒD=~
„A
„“K… w0„‚ƒ*†„<„j    )$$
/%&f+Y2
&D-""  O$2ƒn$# ƒ
C&U~A6QaPJe)&
-H
L‚$y‚!;)

"D%X'%‚.9    (HD       ;+)$
         .?'
'I<   *c%-#
)%
9       $!+*4"E>


1*+&
42
#5!x9!
0 )B@&C„9’n&¤F
b8‚‡?x:
Œ'-ˆJ‚6#E‚”‚k       ‚r
.ƒ4„pz      „ZB]‚Z>mod
‚    Y …E^,kn'‚^„*-XYd       Ea/,:'3ƒmŒzgCƒ‰ƒj@ƒw‚'ƒ Œ@ƒ„9…j…X}‚‚‚[ƒ5ƒ   ’NŽzƒ6_w‚*‚JŠj…-D‚r
*ƒt…‚d)…P‚d]5nƒ„=ƒ|‚)`„d
†'ƒ.$…-‚I2C '‚4Œ
„ršAƒ…2
Q‚0ƒE…1…@
‰#DŽ
AŽ%%3W2
,#6$
1‚‚"ƒ^‹‡r,…HŽ   ]ˆm¦x‚0„%hZ/P*1ˆ8
‚JR‚\‚lG!j‚{ƒ„f†
 fMƒ{ ‚Iƒ=1‚yƒDY<6Z:ƒ#  ƒE<¤Zƒ(BQ
l ˆ4`ps      8ˆZ„>ƒ2
C ƒ‚8„OHeFA†37jtˆ   a(‚G~‚K%H/†.‚s"„Št1    ‚$=
       
1>H,
.)oV†LaP„‚D
xs‚>,†\e-"M&!†q04‚C‚E‡]?‚%††T‚$|‚egÓB„&”x4e
       „…‡@‹gu‰MFHŠS7Žösg    ^S‡fGO‡i)O—?%&&U    
        .
*
C
fD%#(b`UM-C1

aQQ*$Kyƒ/6r:,6-
)ƒ
/…(
„H‚
ƒ1
7   ,3‡„‚h
v‡SY
‰¸/ŠFH‡^‡i; K

^PS6…N4
-9'3[<3>k9      &Jx†Rf"~
'‡!Ÿ"9¶ƒlj‚F‡f( ‚}‡c        )$0$
/%&f+Y,
&D-""  O$Z,ƒn$# ƒ
C&U~A6QaPJ6$&
-H
L‚Fy‚!;)

"D%X'%‚.9    (HD       ;+)$
         .?'
'I<   *c%-#
)%Z9    $!+*4"E>


1*+&
42
#5!x9!
0 )B?&^
b8#.:
3v-ˆJåE
)z    ‡hÆ$*
l'W‡iN-X9®uƒ /Ÿl‚'!‡‚‡=§        —6VQ:®p/‡i3‚1‚8‡i y'—3c-
521 '
lJ‡`$J—2$-—7I‚—.‡hsA"ƒ%3W2
,#6$
1>&G
‚V‡VxƒK]‚0„]‚0ƒ-
""ŸV˜€€€‚T¿0Í•üb6!‡}*‡iŸPXŸ‚lG!j‚{'y

p
<    e1
'><6Z:žZ‡j‚4`:s  8‚‡‚5¶l ‡‚DM‡`>_7jt„U     a(
3~?%H/."s51     $=
    
1>
i
4V‚7LaP‚D
s\—‚<e-"M&!0‡c
:Y+

%           ƒ,YZ]‡W?ˆ‚4Z"a8Tg‡IJ!0optioninterpret‚ÍBü{zlongƒ
¸P—Ì5Ppurposƒ
¸P—Ì7Pr.j?
4 -3!(G${        0"#P>
4CB4,!s„W
,d`4=.kG
<#
@<<
T"6Z9]4‚HP!bW2MB@d&ƒ.‚     DZ‚mA
-<@‚?X);x>"6‚i@8=3
_'{w\_Vf&!&^VpZ8"
‚
C
>‚49GfƒQ94
 J&G-xL*x=xPw??,;‚(‚;V5‚J+#S85[-z
j:„A *Y|ovPx$$.~K76='
‚       l
&!T##,      Tt8y?1'&7‚   OT=)s*1/
(
U
‹n‚v†7^M
_.*r%/?D9‚I]40B!.
@e50(C%LWMD)8SIXDQ9
#' „@,|[I,"
R3Cd      %-      |*x‚lkr&"Aa1gfA"
‚ƒ&6g?,^/S+
&
XP-d V,86 f;/&‚G
l#$B+XL
l).!/\O1
J1 )P'5-Qcq
*‚@nd 
]5

M
%
 58
U    <=,
OJl
     W   !/n%$
$&

<        eUJ:,:1lQ        
GMEn 9("
1%?"s
M&l+
.|F8
‚%"@k'B&Q;) acK:
Xl>Ci
V%&8"`27 k^M.G1FI@
(=        =
X&‚E?VY]Gv‚&9*
k%,
/44:OB:SF+5c$`4?EA"EIa&*%-%-+2\B  ~qI!#~4)!, M; !,.w,2$/,,#
=A@5.Or9)M"*/JG‚^un !IY#+f
 21 ;.2*"*/5.
WFR-050+EpG3
    * YB/‚,‚Yu(‚("7d/
mIuex]MLz=k0‚<$c["G
3OH*
$7TV#[qG‚?,"*  #..*}+&(XBE(( :C‚`H8,Me.‚#bMLai
0 HQ7; lEBCQ]1YTFB
+yP1
OA= :
 
4Z&e„q9rrc/:   9a%lUnCdD-"!
@
@$
 Pi=i"TWI<*V/Fi
tPƒE<T!Ds
-
^$'2
P(        
"-$S
./+%
 Ak5''p\9vW‚„EP3y&
#/3%:U4m‚;L_ƒi5‚6†…d7
-&‚r‚„&
‚7(7?; ‚/

ƒx.
{‚]A[!‚
‚.‚ `X9PAG;‚;‚}B"$BJ      `!T?(F7'dP,&,!>J>g-:5,ƒ w+%ASA:G
/a]9
24%-p‚68?^‚ $
x&nƒn
        B       F>s&ƒ     S7,‚$V‚‚"ƒt0<_0
ƒ!g(4iM
;:g" cwƒ
#     "(%LF6MjYY0lU>&+JlETƒ_:`.†        i
9@‚>@`L&‚MS<'‚wC   >„A2K<+8$J8bc~*S'‚G(3&+<0[.ƒdo…!!}QTW$,)‚JeF8
ƒ1(4‚L!H‚X{B        ‚D‚B‚4$^B|!k!%KsT?Of2‚cMƒUL_5‚vo2/8‚i?   4G    u,!
E*C)V;I;#ƒXI(:_KcE%!}):&yG&v)" ";z;‚7kAeƒ
l]Bv‚W#qR6C-%ƒ26`zr=‚1 ASaV‚3.(2‚‚Pa#ƒzY  ;u(FJSƒRy|
=<_*IXF9(e&E_{X

Wa:^V=K~V],At7enO=$9 
U‚!‚;‚%-(o-‚&‚       /J‡‚Y;W„ƒ&6 LrU‚f\2
7r‚7!ƒh6rfIwV.6‚=2Q.->
7BMO‡‚F0Y^‚$
CI\0"…‚r}‚Xv2o@‚
B #CkLJ‚<X…‚O†]ƒM*G*&ƒ{M;y\8w O3J
'!ƒfl3jƒs-‚I-i{‚@d‡]#‚KQHoW-%/(#
 G"c„K
""ŸV˜€€€‚U¿07ÒU
U(AjHD9iz3_
)>g
A
/h(&+      1ƒO'4.o><4Fp:k‚[$

‚/‚f6$:$‚\s2     ~4ƒ‚,‡=7‚_‚[CC>V4)@)
       iX‚Z‚2
n7
!2G5<Alo
<6\*u
#&U?R\2‚")Z*WQD (!;‚U"i&Y!/H1 
 h
R       
M     @
M

.=-b‚66‚9:<E(‚-4p‚*"=          lƒgKw:„&ƒ+
#% 4
,D
#a*mp7 r(   l†‚|‚3et)ƒ1‚X.>j9[)UY;nGx@-ƒ f‚*O7L-0
†|9   PGU&d115jRƒ$H
ˆ"NB„'„DG8,‚7V„‚!#‚#!))$bYr ‡!ƒj‡i>$ƒQz9z0‚ IKE&wz0.9|2‚x‚!„ n6gr/‚fƒRRƒ
5uG‡3N\‚
p=i
*:
H‚_*l|dƒ~  „aE2O94Ho     /z9'M ;&7+(ˆ+;'MRl8>\w    W?uGuqI+
qƒ=‚,+b‚2**0e      
NRW8‚X
‚,f"d_<<.-No$\F-?Yn;‚% ‚H*>5<*>=:D0ƒP
?g2K_|.N&[CQP=Dvf.;‚0=
o      0V,t
>~)|3   'Jj=s2u'UO6r=7‚0_DHBj#+*0KF3{nn      "/ZLR
‚    G)L;/3 ƒp2,C‚8ic@ƒk0O^_BQR^g<+7Wb‚wlhƒz‚>?y"5ƒP‚X )1„TBO:+('„8W‚V~oDI]ƒ.
D„~s              M
!†+p
ƒeL! F†
   &a?~/-}ƒ,6S‡_ vO3c_
vhy
‚5;   +‚AVKƒ*@&%  }„`eN‚T1‚X\#‚7(ƒ?‚FlS…}‚=K    4{,W‚6^M),'‚"sc/j .7
g0|C6H
VGFH,‚Lhƒƒe†A,\
Lyl
†D>1"‚zh6e
I‚"(W‚'W…    ƒ F#&6+Diƒ*LiGx)ƒ{NLK‚  † B‚dE„a!‚05‚mR\ GbzN
\       -K$l‚2>„)^E7
#t_
ƒprs95"Gƒ
‚pvojO+ƒY       D7CcJOQ       
1W7(TM
3gƒY       ‚,a2'ƒ"T)[ƒrƒ *     b1*
n      )!w!
‚
#$D0   }‚z"pu‚jj>F‚w=              ‚(†ƒ‚i&*-E3ƒ6z\'Z%MlnZ0^  ‚R*$+Q:ULI=&        cd!!-7R0-12B5M…'‚NB5„!I     ‚,‚B‚ho=vH…T"^
ƒgƒƒW     tƒV{†lbw_GG-8D„6p‚‚0o…!„>U/Z+ƒf‚QY>I6‚(‡kƒcn‚V}‚&QGKi†P„
(‚B&8?I„}ƒz N'Ws|ƒ#‚1‚y.u‚9h‚O‚\Pb$YHw ',N‚4yZ       W#5%dxgK< -W1‚,U&|‚        ‚Wz‚
‚]cT.rH73@8LLt?&2GE#ƒOd$674‚i‚?
6„Q4E)"V.I\o‚1ƒ      c‚$#v)j\/(k
zm

#B …d\4+
&g^]‚0C"eJ*Y283‚6&-‚~…ep-4{KPq%BƒƒZAWG{{\@h1‚`*Z…zX‚p[%C„‚(‚~‚,&(‚C        O‚$^&s=‚K„/EA52X‚‚Jk/N"?r<m.sF*R|‡_     <‡5/Z%+)‚JYƒ$+  , /!'
+
Q
Q@     EZ?!|@Nv%qƒzcg2bPK$JƒC[‚"BƒMkk.„Y)!ƒ_…<q).‚#
2ƒN&t r9}‚g7‚_e/,0ƒW‚ag0ƒM
6(9M$, "i‚71^$‚K…Sn}Xp~+\>g!
Y&#*?1=z"8ƒ"6‚8!)‚‚Lt
'
!‚Y>4j,.7p2n
&K)sm‚OR      " :q m       >‚.bcX‚\‚‹[„(\‚b<? ‚    V„
‚4!"„T5P"\C<w;5.p+UD0&v&-2<
6‚
-c%P%p    Qz      ?y\*.+ƒ
          4

‚|`NVcazI'((Q0707kA3Wb`1'<<L@
HY}E       3oN@ sN.*7&|
4{NE‚7.bx/7E2j9‚tTeD      ‚}  @{k4
m'.<bddƒ"#/JM‚/ƒ=/H:ƒ~
„|Gh(#{:ƒV^o_6wƒqx|      LJ5ƒ
K0
-„     #‚[o†1-ƒ/ +'t   w1 ! /ƒ{K„DŠ>&„4Z‚&R'6qxBTN():i~79%,
u/    
,        A‚5‚4dƒ0ƒw8&
(+Nay$>J.
‰q/…0†%¥†        2–|-
F"J@DM”rŽ8ŠAM7šHh“.¤f$b’>‚
F†-d)iWtQ ‚7d‚7^Ih
L(‚,‚
<„#@‚@
Z6<[2*|,„{093 C)?Q"#7K!1‚#ƒ!‚wB;J\7dƒ7Y6C:DU‚Oh1‚Eqxv=!
‚‚V1R/2‚TV($ƒeƒ8DGk(
N>m]`6„AiuY >  ƒ}B
ƒ
&1@T?01‚„JT6ƒ^„N/sH‚#‚\gS‚ H        ‚miHa=6or
'e<6     ‚CI`‚Z
}t)3n‚zrƒ4BR?w=PHzoJƒ‚ƒA1h''„<.;%‚ƒg7">‚ˆ^&‚#e
(*Nax"ƒXMMƒ,)‚%#}.ƒYeUtW‚7(L…:‚3RD„I0ij#N(^$f‚ j,2 {X>„^z1$‚N{/#
7C{ƒ|ûûñçÝÓÉ¿µ«¡—ƒyoe[QG=3)÷íãÙÏÅ»±§“‰ukaWMC9/%
ý
ó
é
ß
Õ
Ë
Á
·
-
£
™

…
{
q
g
]
S
I
?
5
+
!



ùïåÛÑÇ½³©Ÿ•‹wmcYOE;1'       ÿõëá×Íù¯¥›‘‡}si_UKA7-#
û
ñ
ç
Ý
Ó
É
¿
µ
«
¡
—

ƒ
y
o
e
[
Q
G
=
3
)



       ÷       í       ã       Ù       Ï       Å       »       ±       §              “       ‰              u       k       a       W       M       C       9       /       %                     ùïåÛÑǽ³©Ÿ•‹wmcYOE;1'      ÿõëá×Íù¯¥›‘‡}si_UKA7-#ûñçÝÓÉ¿µ«¡—ƒyoe[QG=3)÷íãÙÏÅ»±§“‰ukaWMC9/%ýóéßÕËÁ·-£™…{qg]SI?5+!
ùïåÛÑǽš˜€€€‚S_˜€€€‚R^˜€€€‚Q]˜€€€‚P\˜€€€‚O[˜€€€‚NZ˜€€€‚MY˜€€€‚LX˜€€€‚KW˜€€€‚JV˜€€€‚IU˜€€€‚HT˜€€€‚GS˜€€€‚FR˜€€€‚EQ˜€€€‚DP˜€€€‚CO˜€€€‚BN˜€€€‚AM˜€€€‚@L˜€€€‚?K˜€€€‚>J˜€€€‚=I˜€€€‚<H˜€€€‚;G˜€€€‚:F˜€€€‚9E˜€€€‚8D˜€€€‚7C˜€€€‚6B˜€€€‚5A˜€€€‚4@˜€€€‚3?˜€€€‚2>˜€€€‚1=˜€€€‚0<˜€€€‚/;˜€€€‚.:˜€€€‚-9˜€€€‚,8˜€€€‚+7˜€€€‚*6˜€€€‚)5˜€€€‚(4˜€€€‚'3˜€€€‚&2˜€€€‚%1˜€€€‚$0˜€€€‚#/˜€€€‚".˜€€€‚!-˜€€€‚ ,˜€€€‚+˜€€€‚*˜€€€‚)˜€€€‚(˜€€€‚'˜€€€‚&˜€€€‚%˜€€€‚$˜€€€‚#˜€€€‚"˜€€€‚!˜€€€‚ ˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚
˜€€€‚˜€€€‚˜€€€‚
˜€€€‚       ˜€€€˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚
˜€€€‚˜€€€˜€€€~
˜€€€}       ˜€€€|˜€€€{˜€€€z˜€€€y˜€€€x˜€€€w˜€€€v˜€€€u˜€€€t˜€€€sÿ˜€€€rþ˜€€€qý˜€€€pü˜€€€oû˜€€€nú˜€€€mù˜€€€lø˜€€€k÷˜€€€jö˜€€€iõ˜€€€hô˜€€€g󘀀€fò˜€€€eñ˜€€€d𘀀€c€€b€€a혀€€`였€€_똀€€^ꘀ€€]阀€€\蘀€€[瘀€€Z昀€€Y嘀€€X䘀€€W㘀€€V☀€€Uᘀ€€Tà˜€€€Sߘ€€€RÞ˜€€€Qݘ€€€Pܘ€€€OÛ˜€€€NÚ˜€€€MÙ˜€€€Lؘ€€€Kט€€€JÖ˜€€€IÕ˜€€€HÔ˜€€€GÓ˜€€€FÒ˜€€€Eј€€€DИ€€€CϘ€€€BΘ€€€A͘€€€@̘€€€?˘€€€>ʘ€€€=ɘ€€€<Ș€€€;ǘ€€€:Ƙ€€€9Ř€€€8Ę€€€7Ø€€€6˜€€€5Á˜€€€4À˜€€€3¿˜€€€2¾˜€€€1½˜€€€0¼˜€€€/»˜€€€.º˜€€€-¹˜€€€,¸˜€€€+·˜€€€*¶˜€€€)µ˜€€€(´˜€€€'³˜€€€&²˜€€€%±˜€€€$°˜€€€#¯˜€€€"®˜€€€!-˜€€€ ¬˜€€€«˜€€€ª˜€€€©˜€€€¨˜€€€§˜€€€¦˜€€€¥˜€€€¤˜€€€£˜€€€¢˜€€€¡˜€€€ ˜€€€Ÿ˜€€€ž˜€€€˜€€€œ˜€€€›˜€€€š˜€€€
™˜€€€˜˜€€€—˜€€€
–˜€€€       •˜€€€”˜€€€“˜€€€’˜€€€‘˜€€€˜€€€˜€€€Ž˜€€€˜€€€Œ˜€€€€‹˜€€€€~Š˜€€€€}‰˜€€€€|ˆ˜€€€€{‡˜€€€€z†˜€€€€y…˜€€€€x„˜€€€€wƒ˜€€€€v‚˜€€€€u˜€€€€t€˜€€€€s˜€€€€r~˜€€€€q}˜€€€€p|˜€€€€o{˜€€€€nz˜€€€€my˜€€€€lx˜€€€€kw˜€€€€jv˜€€€€iu˜€€€€ht˜€€€€gs˜€€€€fr˜€€€€eq˜€€€€dp˜€€€€co˜€€€€bn˜€€€€am˜€€€€`l˜€€€€_k˜€€€€^j˜€€€€]i˜€€€€\h˜€€€€[g˜€€€€Zf˜€€€€Ye˜€€€€Xd˜€€€€Wc˜€€€€Vb˜€€€€Ua˜€€€€T`˜€€€€S_˜€€€€R^˜€€€€Q]˜€€€€P\˜€€€€O[˜€€€€NZ˜€€€€MY˜€€€€LX˜€€€€KW˜€€€€JV˜€€€€IU˜€€€€HT˜€€€€GS˜€€€€FR˜€€€€EQ˜€€€€DP˜€€€€CO˜€€€€BN˜€€€€AM˜€€€€@L˜€€€€?K˜€€€€>J˜€€€€=I˜€€€€<H˜€€€€;G˜€€€€:F˜€€€€9E˜€€€€8D˜€€€€7C˜€€€€6B˜€€€€5A˜€€€€4@˜€€€€3?˜€€€€2>˜€€€€1=˜€€€€0<˜€€€€/;˜€€€€.:˜€€€€-9˜€€€€,8˜€€€€+7˜€€€€*6˜€€€€)5˜€€€€(4˜€€€€'3˜€€€€&2˜€€€€%1˜€€€€$0˜€€€€#/˜€€€€".˜€€€€!-˜€€€€ ,˜€€€€+˜€€€€*˜€€€€)˜€€€€(˜€€€€'˜€€€€&˜€€€€%˜€€€€$˜€€€€#˜€€€€"˜€€€€!˜€€€€ ˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€
˜€€€€˜€€€€˜€€€€
˜€€€€       ˜€€€˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€˜€€€€
¤-¸>š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(

ö
ì
â
Ø
Î
Ä
º
°
¦
œ
’
ˆ
~
t
j
`
V
L
B
8
.
$


       ü       ò       è       Þ       Ô       Ê       À       ¶       ¬       ¢       ˜       Ž       „       z       p       f       \       R       H       >       4       *                            þôêàÖ̸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(
öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* øîäÚÐƼ²¨ž”Š€vlbXND:0&þôêàÖ̸öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4*˜€€€ƒv˜€€€ƒu˜€€€ƒt˜€€€ƒs˜€€€ƒr˜€€€ƒqÿ˜€€€ƒpþ˜€€€˜€€€ƒ
˜€€€ƒ~˜€€€ƒ}˜€€€ƒ|
˜€€€ƒ{       ˜€€€ƒz˜€€€ƒy˜€€€ƒx˜€€€ƒw˜€€€ƒv˜€€€ƒu˜€€€ƒt˜€€€ƒs˜€€€ƒr˜€€€ƒqÿ˜€€€ƒpþ˜€€€ƒoý˜€€€ƒnü˜€€€ƒmû˜€€€ƒlú˜€€€ƒkù˜€€€ƒjø˜€€€ƒi÷˜€€€ƒhö˜€€€ƒgõ˜€€€ƒfô˜€€€ƒe󘀀€ƒdò˜€€€ƒcñ˜€€€ƒb𘀀€ƒa€€ƒ`€€ƒ_혀€€ƒ^였€€ƒ]똀€€ƒ\ꘀ€€ƒ[阀€€ƒZ蘀€€ƒY瘀€€ƒX昀€€ƒW嘀€€ƒV䘀€€ƒU㘀€€ƒT☀€€ƒSᘀ€€ƒRà˜€€€ƒQߘ€€€ƒPÞ˜€€€ƒOݘ€€€ƒNܘ€€€ƒMÛ˜€€€ƒLÚ˜€€€ƒKÙ˜€€€ƒJؘ€€€ƒIט€€€ƒHÖ˜€€€ƒGÕ˜€€€ƒFÔ˜€€€ƒEÓ˜€€€ƒDÒ˜€€€ƒCј€€€ƒBИ€€€ƒAϘ€€€ƒ@Θ€€€ƒ?͘€€€ƒ>̘€€€ƒ=˘€€€ƒ<ʘ€€€ƒ;ɘ€€€ƒ:Ș€€€ƒ9ǘ€€€ƒ8Ƙ€€€ƒ7Ř€€€ƒ6Ę€€€ƒ5Ø€€€ƒ4˜€€€ƒ3Á˜€€€ƒ2À˜€€€ƒ1¿˜€€€ƒ0¾˜€€€ƒ/½˜€€€ƒ.¼˜€€€ƒ-»˜€€€ƒ,º˜€€€ƒ+¹˜€€€ƒ*¸˜€€€ƒ)·˜€€€ƒ(¶˜€€€ƒ'µ˜€€€ƒ&´˜€€€ƒ%³˜€€€ƒ$²˜€€€ƒ#±˜€€€ƒ"°˜€€€ƒ!¯˜€€€ƒ ®˜€€€ƒ-˜€€€ƒ¬˜€€€ƒ«˜€€€ƒª˜€€€ƒ©˜€€€ƒ¨˜€€€ƒ§˜€€€ƒ¦˜€€€ƒ¥˜€€€ƒ¤˜€€€ƒ£˜€€€ƒ¢˜€€€ƒ¡˜€€€ƒ ˜€€€ƒŸ˜€€€ƒž˜€€€ƒ˜€€€ƒœ˜€€€ƒ
›˜€€€ƒš˜€€€ƒ™˜€€€ƒ
˜˜€€€ƒ       —˜€€€–˜€€€ƒ•˜€€€ƒ”˜€€€ƒ“˜€€€ƒ’˜€€€ƒ‘˜€€€ƒ˜€€€ƒ˜€€€ƒŽ˜€€€‚˜€€€‚~Œ˜€€€‚}‹˜€€€‚|Š˜€€€‚{‰˜€€€‚zˆ˜€€€‚y‡˜€€€‚x†˜€€€‚w…˜€€€‚v„˜€€€‚uƒ˜€€€‚t‚˜€€€‚s˜€€€‚r€˜€€€‚q˜€€€‚p~˜€€€‚o}˜€€€‚n|˜€€€‚m{˜€€€‚lz˜€€€‚ky˜€€€‚jx˜€€€‚iw˜€€€‚hv˜€€€‚gu˜€€€‚ft˜€€€‚es˜€€€‚dr˜€€€‚cq˜€€€‚bp˜€€€‚ao˜€€€‚`n˜€€€‚_m˜€€€‚^l˜€€€‚]k˜€€€‚\j˜€€€‚[i˜€€€‚Zh˜€€€‚Yg˜€€€‚Xf˜€€€‚We˜€€€‚Vb˜€€€‚Ua˜€€€‚T`˜€€€‚S_˜€€€‚R^˜€€€‚Q]˜€€€‚P\˜€€€‚O[˜€€€‚NZ˜€€€‚MY˜€€€‚LX˜€€€‚KW˜€€€‚JV˜€€€‚IU˜€€€‚HT˜€€€‚GS˜€€€‚FR˜€€€‚EQ˜€€€‚DP˜€€€‚CO˜€€€‚BN˜€€€‚AM˜€€€‚@L˜€€€‚?K˜€€€‚>J˜€€€‚=I˜€€€‚<H˜€€€‚;G˜€€€‚:F˜€€€‚9E˜€€€‚8D˜€€€‚7C˜€€€‚6B˜€€€‚5A˜€€€‚4@˜€€€‚3?˜€€€‚2>˜€€€‚1=˜€€€‚0<˜€€€‚/;˜€€€‚.:˜€€€‚-9˜€€€‚,8˜€€€‚+7˜€€€‚*6˜€€€‚)5˜€€€‚(4˜€€€‚'3˜€€€‚&2˜€€€‚%1˜€€€‚$0˜€€€‚#/˜€€€‚".˜€€€‚!-˜€€€‚ ,˜€€€‚+˜€€€‚*˜€€€‚)˜€€€‚(˜€€€‚'˜€€€‚&˜€€€‚%˜€€€‚$˜€€€‚#˜€€€‚"˜€€€‚!˜€€€‚ ˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚
˜€€€‚˜€€€‚˜€€€‚
˜€€€‚       ˜€€€˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚˜€€€‚†˜€€€‚
˜€€€‚˜€€€˜€€€~
˜€€€}       ˜€€€|˜€€€{˜€€€z˜€€€y˜€€€x˜€€€w˜€€€v˜€€€u˜€€€t˜€€€sÿ˜€€€rþ˜€€€qý˜€€€pü˜€€€oû˜€€€nú˜€€€mù˜€€€lø˜€€€k÷˜€€€jö˜€€€iõ˜€€€hô˜€€€g󘀀€fò˜€€€eñ˜€€€d𘀀€c€€b€€a혀€€`였€€_똀€€^ꘀ€€]阀€€\蘀€€[=˜€€€„.<˜€€€„-;˜€€€„,:˜€€€„+9˜€€€„*8˜€€€„)7˜€€€„(6˜€€€„'5˜€€€„&4˜€€€„%3˜€€€„$2˜€€€„#1˜€€€„"0˜€€€„!/˜€€€„ .˜€€€„-˜€€€„,˜€€€„+˜€€€„*˜€€€„)˜€€€„(˜€€€„'˜€€€„&˜€€€„%˜€€€„$˜€€€„#˜€€€„"˜€€€„!˜€€€„ ˜€€€„˜€€€„˜€€€„˜€€€„˜€€€„
˜€€€„˜€€€„˜€€€„
˜€€€„       ˜€€€˜€€€„˜€€€„˜€€€„˜€€€„˜€€€„˜€€€„˜€€€„˜€€€„
""ŸV˜€€€‚V¿0$Ò/EAƒ~‚H9pM„‚ƒ;ƒt‚0
,A'gJ17,ƒ0‚
S\2\C}7H
e5 !… 
@„)l‚$
&{*8.5pŽösZ9v&
4P3&
#3nU4;cL(ri‡Ya‚7
-&@CG
‡a<(7?;‡g‚-

t.
‡g
,K3,2ƒ +%A0A:G
/a;9J %-b8?^
;$Q&

*
           F>s&  S7,~V
0‚"‡U ,<_0
ƒ!H
4a2
;}
 c@
#     "(LF
DM
Y0l->&+
4
$T':`VI
    
q9@r>@#L&‚%B
T<'C    4w2K<+8$C8bc~S'6F(3&+<0[.ƒdo„y!}.W$,)
‚$8
ƒ1(4‚L!HV

        Q‚4$‡)>|!-!]4sTOf2‚
cM
d-_5#vo2/‡`\?4G~
,!
E
PG`x
_Kc
(%!ƒ0}):&yG&v)" ";z;‚7kAeƒ
l]Bv‚W#qR6C-%ƒ26`zr=‚1 ASaV‚3.(2‚‚Pa#ƒzY  ;u(FJSƒRy|
=<_*IXF9(e&E_{X

Wa:^V=K~V],At7enO=$9H0-`)2s‡[W
‡5
* nr
U\2
7       ‚7!
P6^f.
wV.6‚=2     Q.->i
7BCOƒ‚&0Y^‚$
CI\0"…cr}9v2o@bB #'&LJ‚<X3tW‚J* *&ƒ{M;y\w O:J
!ƒWl3jM-
-iUd‡]#‡@?


EoW]%#
 "c5
U(jHDi 3
_
6)
)g
A
h(‡SF+ 1O'4.o—   L4*‚‚,‡=7‚_‚[CC>®o¬‚66‚9‡:
(T4^\"=                l‚;w
D_,mp7 r‡f      l

b3S2‡_'‚s‚XG.>j9[)UN;nGx@-ƒ f‚*O7L-0
‚B9       PGU&d1(5jRƒ$H
ˆ"NB„'8<8,‚7V„‚!#‚#j)$bYrE.@IKE)w0.&2ij"nG/
R!
d

uG\4‡
*‡f
H
*|d.~       „aE‡d
oO‡h
j4/o'/z‡e
7'
T
 ;‡e!7+_tŸNR8%§#B+*0
,F3 n/    /ZLR‡c
    Æ&BƒZ‡g
I             — %
‚    ‡d$a0~‡g&‡e
86
=
„ vO3K—3F5   +J
"     ?e   (1_\Ÿ7mg0|CH
VG‡G     h

‚z:,\
L+
I
4‡X>1"*‚=h6e
I‚"(W
Y5N. #&6+Dq_L2)q?-K
Z    
3B
tE
!~3‚m
DR\
7b21\        -Kžp       9‡f3"G/
JJ
]         
,a‡d%$T
H8‡W        b *
n      ‡e'|!w!®o
<FXv
3     >U]*-E_z\'Z
%{‡

\Z(K tR*$+<:U3I=&  cgI!!-7R0-1"‡]
5MB5TI       m0tho=v0
>DI@‡S

'(sNI
'N~y3        #5%"J
V&2GEDd$6]74‚?
04-)
"V‡[
-\oM5 c‚$#4H
d
zH

#B ‚\‡e
+
 g^k][C"eJ*—3
-4
,K
'%B‚‚ZWx{I@h1‚**ZXV%C|‡[ `(‚~‚,&(/C    '‚$^&s=

„/"A52X‚‚J/N"?r<
I.I
""ŸV˜€€€‚W¿0Ë|•ìs

[     <„m
5%
)‡J$$J      +        , /!'
<

Q
Q@     EZ?!o@Nv
%Lƒzc$
bK$J
[!Bvkk
)ƒ2E
&).‡N!
2
&Qr9}‚g(x_e/,076g0‚CM
6&@9M$, "i‚1^$‚K
nhXX*!+\>g!
Y&#*1=
("1
}6‡F
i8!‡gq=T
''4,.7Ml
&KQsU‚     " ‡g>sbkX$.ƒqM\2‡PX] 
    K."*&-2<

t
-c%P%- 3H"        4


`NazI'        0
0*3    b+;6@
      
8
/    
$oL4@  s.*7|


{
E


.bg/7E
    TD    }      @{
%4

0

      <

"#+JMž)'
j     Z1 !     /‡h?K„i‡b$55'67BTG(H‡c~&9%,
u/    
,       
Af
—8
(+NaNBKd)iWtQ ‚7d‚7^Ih
‡bJ

‡8#U@‚@

6
&*‡`

,$4093 C)?Q"#7"#‚ƒ!,w
4-J\7
76C:DM
'1O
WEq$v',
p

K/2%TV(
ƒe
G3(
N&)—AiuY >       ƒ9x
@‡1@T?01x:fN
`H‚‚\V
.‚ 
2    ‚Wi:a=6or
Je‡S
6    ‡h&
      `M
vK)*!TW!
 ?=PH@XoJƒ‚ƒA1h''„<.;%8ƒg<">‚
&‚

(*Na
"
}-MM

)#}.keUtW(L,{Rg  j#Nd$UjJ
1       t#
?c{t/
A
R<M=

I-
1‡GG?'0J17,
NQ-20oraclc …
VƒR       –W †P9hªR‚0ÍrÙV®‚Dõ$ƒÜa®
ÃM*l‚ŒU…j…5ng‚B\†_‚6
1       ‚',lˆcH?6  
%“Ñ#$6
1      D',l
%

H
Æmder‚c
ƒ?=„3 ƒ<J@<…&"‚ha@
+
ˆ0„W^…M…†+‡l‚!

*& 9%)^„0‚m‚=„i‚+&9d$…xC‚@„43‚q
‚|ƒt‚? 8
+>"LJ
‹~„F'z
,
T@%.8)\(en‚!
=M[;4‚
)e       }ƒ6p„P*ƒ,„K‚‚[ &…$G*B‚"z#~Š „„†…eP‰-…\‚W‹t„2$„"…"5SM…X+kƒW†|d)=F…]‚Pilˆ<†;
        …($#ƒ8

"‡-‡uF•BJ†w      
u,„S+l;iƒ}6’fˆr‡"ˆ'‚|‚7‚j
M‰ZS†+…Z†)s    '&9%:„Lˆ‚'ƒo‚
<ŠF–|>‡G~^111ŽA”N}†}gW„n‡„ Ž+Š[‚Žw‡‚"‰9‚O=‰M'…PˆOuƒ‰ƒƒ]s†K‡/@
F‚*9*(7"K‚$4‚‚Kƒ%‡b     T‚U…Pbˆ90X'''.5'''''''''GN''''''''C'''''''oZ7>'''''ƒ‚ƒ‚.ƒc‚#‰M…mˆ:%?Ž|$„G‚mfch„
<„.:wŠ(,“5+      
ŠE‡u‚T†\‚W†z*ƒY‚ 8…[„Ks„
ežj~ƒ!‚ˆ‹‹‚79†
')x        .†LJ†v0…’…%…‡‰$|1‡^ƒ
(„B‡ƒEt‰@„q†/0‚Xq:IƒJƒX
ƒeZ‚:‚Lƒ'‘0†(:…-‰Aˆgx‚R?Z)V;yˆmƒ(‚Y4&    
)   ‚WI;6(\&
)x
0‹V>‘di‡r„*I$‰n‰„X„„‹r‚BFb‡&‡yhŒ‚0ƒ{_‹‚8’/ƒ>w' 

</D’
!!ŸW˜€€€‚X¿2HÌPVDF
Da     e&‚XSLFt<        C*%K.
ƒ%&w."
/…G‚VT:ƒMŽx„@‚6E‡YwDCƒ        ‚Zš)‚K%‚q‚urm‡$„[!&s0…ƒ…Lƒ?…C"‚<‰$”69)#
‡yVŠR
‚E‡e
lƒ\g2„:ƒ\„<[%/ƒj‡U‡0~…s9Š„g)lƒ†!„,A2‚A‚rb?Vˆ%|
#zj9L/ƒ47N‰+J˜s†'>ƒZ‚Eog'‰PŠ8ƒˆB‚†9„<…]
u6…[…‚R"ƒY„H8D…5ƒvˆ`A‹l„‡R›G#
ˆ4‰<ƒwƒ2ƒN&z˜R‰2ƒg*„#‚R  WS*ƒc!&‰2³y‡;ž˜
 "Ž'k‹g$0”ƒus‚W
ƒ„&
r •B–=‰:”#‰% >0'+7      +‚¦"Nƒq„I‹pƒ|„qJaƒ$   „xƒ1;b|
Z‹V_ƒN&    ‚5
]"`ƒ*’[„`…@†Y†?‚ƒ …ŒƒV†l
|A„D
ib
‰Po„mŽöuz
.P‡+0‚WAK
8$‚—…
:):O@]‚Pl   
        ‚r(#‡Uƒ4

"
F
J
C‚J.w   
u,+l;I
76
†#‚†O‚|$5
-S†+‚(s '‡)5%:B†IuB‡cQV*8Œr>‡G~^111ŽA”N}†}gW—4‡e
P „}ƒ[[‚k„k6‰9‚O=‚@'…NOuh4$†%ƒ5@
9b6*(7"$‚$4‚‚Kƒ%‡D‡c&b  TT—8b†0X'''.5'''''''''GN''''''''C'''''''oZ7>'''''¶‚‡f:‚k‡h„(,“+    
g‡u‚T†\‚WRA"
<d<‚TN-Ÿ
)
G    ®pOÆ)
rq‡gD—Z‡ƒ\Qe§dŸ!  ‡f&R?Z)9;eke
W4
&  
       I;6\&
)x
‡‰t

'B8
$p$_¦]`—F
X‡[[¶‚‚ƒA(r'   

</PV=F
Da  ]&XSLFj<  2;*%K.
ƒ%&w!"
/
„y—."!&s‚+„9)#
V‡\`
ƒT
‚W‡g‚—8
T6O[%/
‚TV~ƒ`‡[
8OC„y‡‚C ,A2‚A‚r?V
#8j9L/‚^
7N
2‡&>ƒZog'…[
Z‚u4‚i/1Ÿ‡j4
4G"—4…5
gYA.#
‚uJ¦H+O‚R  S*ƒV!
|&
‚W‡d
‡h^
)‡f
^
SM1^`—‚W0'+W7      +G‡SN'ƒe
]J"
ƒ$    „xƒ1;b|
Z„       &      f

Z"
V‚„*…MY‚    ‚2SE

‚‡Aƒ)§o
0orderby01‚yˆf<–þ3‚LconsumyTB‚@!
ƒ^<Ÿd’8(•ùZ…^(id‚X‡};”üp&;nari
/…]”Š‰26" 7&
=ŒXJ&/‹;›9ªu‘,ï7-6p5j†,9J‰d!¿[‹
ˆf¶:X„
Wr‰l†?•h@©|2ˆp‚)‚x4‚}+   .5V"+/ƒ[$_7X15¢X
Ë„…"}‚…K–iJe6‚qžbˆc†Ng„g'a&!§”šG§9ƒr3Ëjgƒ!.J
ƒy0vq7Š,„-¯U‡eqƒ!‹P“u$¾a‚v‚DƒM4…q2Œ`
kš}R„ƒ~'Ž÷
      Î     Q—Úi—0M‡hN5jƒ79J

!
I‰(‰h‡@x‡crÎ"—45‡g
‰u@•w„bí0'‡‚vT(   .5"+/
8$7Æ"‡x
ˆ¾i¾@\
(C
>
Ee6:     ¶Ÿ"
{—‚4—‡;9‡Q
#3m 
]g.
{.qŸ
=0P37Ÿ„„'¦K§.—9
¯M‚Kp2‚žw—!7‚~g<Œa
&#
;„%b
‡p‡+
‚=D…'ƒ}
‘d/—Ÿ…ƒ"MX
‹>
ˆƒ3dk
 !;l2        ž6M±%ƒA0ˆG5x                                  1M      M       J‚y            qEjBsƒ˜TH        `$Z#‚{„A”n D‡g
""ŸV˜€€€‚Y¿0
¹…(FKU2ƒ‚j                          …½ [¶[,ˆ‡J¦aÎ/‡‹%„@Î
K‡j"§¤!;‡e0Î
5
1             
y             (A        A     =             ¾.qEjBsŸ'y³NX$)W+FU20organŒT‡f0„@‚'‚aƒ„V
˜cJ
 
*T

”ƒSÃ6
—t…t‰‹:6„Ê‚8ÎTÎhB¾F[Ë1ƒ,‰ient‚‹ƒ@A
        HšK8“™jA
        H„áCg‚gœm
0U„e?•ñz‚
0Up?in‡GN„4*”‰!Kœ'ƒ#9L
'2‚=‚‚H
ˆ=‚
›p‹,!„l
^   e
$‚„+  ŒEXC0
ƒ<ƒ*„-2‚3-†/„‡A]¥ožT¥“eƒbŠ,L cA¯8Âo˜>I‰b(Ó-‹G‰I@'w•k{›2’ƒ$1Ž%.‚„k‘3
‘{*¸~w.ŠK‡OƒD…6+Vy„6˜fŠ]‚Xv0Œzq
„ŽF@‚#B,!AFŠ:G…l/(‚*ƒbƒ.
‚p„ 40xƒj(+B‚ƒg:…g#h*./‡6).w    „MƒANˆ-Z‚r…        !]/#‚mHtd…p„%—S:
%
ŽF
‰<…Ju 'N ….$CU
‹£=l—^ƒp•B7ŽeƒP8"2Š†>I‡m*BBŠ.„@‰_(„gW‰X„5‡$Šj?™/%š@µ@
M…
l‹D‚  c-b‡Jƒ~™;„X>’^
Ž     
„h–
‹v»…P‘x•,¤- „&†cÀ)h–C‹4‚9Š@FUK‚Žöz
-$-‡gX;'§[—fˆ/X‡ƒ^„*L —=šjÂo˜>

y
‚4ˆ@wL{      ‡‡Kƒ2‡‚KƇt—4[‡fŽUwL /‚E.R+Õ?F|:‡b/(Æp®pD®o++B}§        +#h*.\
‚/
;).    
‡[†KZ7!]
#GHd
pqO/
:¾M‡‚*¶U
'.‡]$.$
3U
6B—.—(.PA!(—‚Y‡hn—<t‚ŸB…u?   
-/%‡6-K*Î1Uq¦W‡zŸ
‚Qh=‚b
/m®K
‚>&
ƒ„A#M,F3|5—s_6@lean‚íphan‚d‚@œV°JCm•Ú„,ò&lCmed_rowƒ
³0    —ÌJ
ƒR    s‚T>OXƒM ƒa9†)‚$
B„hƒe     ‡X¥CŽ3‘° †/7B˜Q‚h2"l5‚,y5Q]’v‚Ao‚A‡R
…£ƒp‡3ƒwƒQµ_‡T†Z8Œ&’~†kŠ[Ž‹5
‰…@…h†
Cf„—_V9~     *(Bƒ
”|‚Œ³ˆ<‚+/‰8Œq
‰$”ƒk„U‹ƒ=‚eŽ! •b†O_~*®‚ ³‚U‰3:i+Ÿ‚‚°V‚‡3U7f›yJ—3
‚TwfwW‡[(B—2[œ(/e)&
P¦‚¶Ž$L#Ÿ!5m?Z‡‚k®Av (_endJ?80'
¥d‚;ù‚vinitJ:1('
|Œ¥b
‚9ù‚t
os2‚v
ƒ%"thƒV¥-`
ƒ&"ù‚?switch‚,
‚yunix‚ƒƒ|
ƒ#"‰Y•£win‚
ƒ$"‰`queri‚.sƒ.dƒ˜Á@‚s‚;@„'‘‰4
@fuzz‚‘o‘‰4S8xm
 ther67t
@2ƒ„
*‚Vy
!„‚WcD(‚.ƒV
J†
ƒu'.\"…<…?B9„gSc:$F„„kƒvˆC‚rc{{ƒ7‚!„XMh[ƒgvƒWz…V;‚d]†*GHy„7‚uƒI„z"‚hb‚P‚8R‚(y‚‚BL"…ƒ'_0ƒ[z9f‚
z‚Yƒ=…gŠhFƒ[H
7:UFgDQt    
c   
ƒ+1Z/;jcjTH*„     Z7E
+a
ƒ]
n"Uƒ15y7ƒ
‚
NMƒbƒYs
…FU{:‚am!C
X[
‚j
Y‚5bYg=L     $†„)<‚x‚f:b
@Yƒ_`&(
1
G
%„
%0[SX^…‚4#ƒpei„K„K3io
'‚[„tIgYt‚2f,‹„-‚2Jm‚ƒ!J3${„ im=%Œ
0…/9
 ("$

""ŸV˜€€€‚Z¿0
Ò…tF/wuQ†*‹p…"$`ŠŠ!ƒg‰‚B"N„L†R‡ln
]D^‚‚A+‚‘R   „D2ƒQ†2i„p‘,1ƒ?ƒ8…jŠC‚H…g„{|††HƒE$S5‚‚‚UF„v…!†L}+C26‚R‚7]•%‹|‚.„S‰`†j‚‚5‰4K†-„‡
,ƒl‚.aƒ }gWˆ‚d‚rƒq
„F-$…bz}„‚‚(a=
‚bf…^>„eƒjƒL!‚D…a†Vƒ„H…SŒ1„ƒ'ƒw?/,$>#8‡H6‡„6ƒ•x…DŠ)„CM‚i94†C‚#‰1ŠZy‚tbd6`‹#
8(_5"V]S„
=‚5ƒƒ6'J4/‡r$‰GR‚44BN„L$Q'±<,0Kb%0P(&SO„…‡D3„‚      … ‚5{L‹W:‡    ’;‚l(‰s‡L…m“C‚B*>„h‚9„9‚mL2x)m0[zƒ4Š9?o„)@f‡J„ƒK‚8O‡y&XƒjH      ‚†{
2>ƒDbr‚,B  .ƒ>‚bƒ?†nƒS…;…ƒ|SV†FŠROƒ‚yŒ u6‚JƒIQ…}[„\†[3ƒ~ƒ‚4‚NDN2Y`Eƒ,=W       5IƒZc,Œ14ƒS‹\† ƒOIvEn‚z1ˆ A
}D:‚|ƒ.ƒN‚|'‹d…Lr'@/?‚J„V‚
…V*=.B^%„n„r‡}„bƒ0Nƒgo^{\[*‚9nƒ)‚:ƒ:‚K ‚m?‚nd‚vr‡Mg#g„oMƒƒ."cŠ*†BFƒL‚J‚Qz)ƒTƒC‚„‚I
‚. [2„3‡ƒvƒƒM…‚,SGuk„wƒo„2‚|
JHŠe‚]Tƒ
ˆ."8kƒ1o$|Œ-]]ƒ6?AH‰Pƒ`…]‚t_ƒOSB„/‚$4‚UN‚R8ƒV„
…W†C‚'†u‚„2%>h„?)Š‚†1Dm)ƒm‹D†3ƒG‚ZsmAn„o/‚D
9‚rG_‚pƒ$‚;T‚2‚Mk„zBŒ†‚$ˆ
†\…rƒ‚G  M‚
-ŠL‚‚.„09„0c‚4‚B‚n36…B‚3f/hL4D‡
] w‚)[(… …4=„q†R‚0&&i)'n\t‚ƒ*ƒR"

4ˆFƒ ‡-ˆˆt?8*Š{!„\†U†
        {„/„k‡ ƒ6„-ƒr;„#ƒ_0,„]E‹        Žƒ
7…H„B…~<!ƒ]‹!+\ƒc†s•yK„B„v†M„nm…‚SX+‚U‚;)z‚0ŒF‰q7
`Lvƒ2>‚ƒa'‚V    **xb„.…=:‚„=…eƒi…~X†@FWDk/&P-
‡XŠR…
”5‚nƒGJ]~ƒ-…Q†ZƒE…‚cƒLd‚&=LsQ= 2…`†'ˆƒC‹
7‹j‰B‡eU
ƒ$Gk‚7ƒ)8*Ž‡C„<KŠ—_“½“t"]…98z‚OƒJƒQ9HYƒ"|…L‚9Z2‚E„Mn„‡EIJƒ}‚h6‡u}„Yy:.‚`‚wƒ8„:Œn‚….?…:8T,Fƒc‚p‡i…ƒ%6^&‚‡ˆQƒƒ‚=„rZŠa‡a‚0…%„a‚FŒwU4ˆ’oˆt„`ˆ/]]}…?‚7…w#‚^‚+22‡RQ! v‰x„„!
†Lb.;„-
?‰@Z$v‚$VŽöw
S„-6m‚J3+$)‡\f0uF‚y‡
Q79l‚p
NGD
]‡[@^‚‚AP
w
!    2=id       
‚cƒ.ƒ8…`†w‚H]gwƒd†\ƒ
‡)O5
%F„vc‡g\
+L@u„g‹|‚.„S‰`†j‚‚5‰4K†-„‡
,ƒl‚.aƒ        }gWˆ‚d‚rƒqLgLI$‚B[aO‡Z
‚f‡‚
ƒ…!‚Dƒ‚g‚n„1ƒ-„Dlq6?/,>#8
3H6sa…3i„CM‚i9‡?>.#‚
s‡ a{d6Ưq‡f.
b%P(&SO
]`‚$‡g5{‡aO‚l(ƒUƒd…m‚t‚B*>„h‚9„9FG0)m0[z6_k
+)@$+8 O
>&X,T  ‚„‡c0+‡-O@"BŸ"§
D2Y`‡d
:W    Æh‡iW—9Br'‡d
>/‡p
F‡gL—3>DJE‚@T‚aŸTƒ
‚!‡fbPƒ.
‚2‡'ƒƒC‚
%I
6 32
)b'o
% S0
Wk‚T2Qžs>‡ƒ8Kv‡=A_‡‚=‡‚1®q,Nd8tQF%‚'…y3‡‚S
v>hQ‚C‡`$AnDmgQTU(    (‡TLI^‚#sOƒ =‚7‚0‡C
'nƒ*I
h
ƒP‡g
qƒ
—8
‚!NX„t    {‡_‚u„k‚i„M
;„#‡_`h†:†V
W7‚4`e‡P
-
q+u
Fƒc„8
kK„BM‚5‡‡l
""ŸV˜€€€‚[¿0Ä–ŒG7+nN        &Nj>‡o
`Lvƒ2
%‚
‚(‡'F   j'XxH
-
h?vR3P‚n
UJ
6~‚        ‚p
V‚T¦?5s‡dhN=‡‚{—7Q& 8z‚OƒJƒQ9H‡ev‡gGv9Z20‚R‡1J‚}‚h!;E      w:.rTsJ
zƒl*.8T
,—†7{5m‡„bnTL „r/-j„a‚FU4h  p‚„2
]]e!
Q‚7
:M
O
Q
 :PG—
ƒ
,;0other_stuff‚‡.”üoBwis„:ˆI…Oƒ?aƒ<'‹~%Zx‚aN†E“$ˆ}‚$M      

sV
p ‚    ‡
‚-Y‚Q…%-       8‰.†&#
a:dŒ†0‚u‰‹ƒS‡#„H…~ »?—LŒ2…/ƒJž=‰+SDJƒI£Jˆ0X#†VA‚Cƒ/VUH•… |Œ.5„vŽj–#“f…uŠnƒag†bS”/‹Hד1ƒ9      Pˆ‚4„*‚‚v%u|%‚4\n+d….‚ŽK‚O‰/‚KˆkƒwH‘˜      ‡‚i‚rd…†^´x¡X˜eoƒ3¢6
›!„_‚>…%ƒR^»&
ˆZ5ª™N“p„±A„¤rX†"ƒdV®_†03¨&~…;Žö‚y¾B^AG~‡s)‚!ƒEƒ„C=‡‚v
|D—       *B“Aˆ0X#†VA‚Cƒ/VUH•… |Œ.5„vŸ
/
'…uƒqÝ~Ÿ’?Ÿˆ"Õ"‡å‚
í(Ÿv݃uI^oƒ3¶[
‚!‡gM—6V®ƒ_̓54Jž‚Ƈm0‡‚j#Ÿ…)@
^3
”K~ught¨çtª
…X–9ÜÓ&…ˆ:$r‚š  Š 
‚.7“GŠ‚6‚“W~‡O²?¿>     „yž1Œˆˆ—Q”]F‚{M“Ð>`6;‡eF@ütÝ‚kýselv‚‡7“šasterhout‚‡’†nt1‹X‡K
‚&E‹m2uK‰fˆW'cR     j‡9
#
!$ˆ"QX3y<…#
4D  ‡-
n˜z†„1
ˆw-“‰ ƒi0Z‰Y’~…  ¶?‡4ŠT-~‡sƒK   „k…9ÞdŒ"HŒ'‰c
.wM‰}ŽV±‡aŠMO†?˜
 e…D,†*‡bP‘cŠ=†„{‹QP=‹‚jv‚FBƒT     
        o‡
Š‰/
‰Ys†ŠK›
7XK„Fƒkƒ‰?ƒ~ƒ+ƒK
\‹ 
„     ƒ_0ƒ‰h’B*‚7
g„dˆƒ+£]…„79Œ!ƒGx„E'U
\0…v’‡t…4„
7¥4>c„7Œg‹……B‚‰~ƒq"‰#‹}…‡>„        
‚x4…HSe:‚‚>‚hŠ=žZŠ=„wŠ”2Ž†“_xSu…Ak‚n;‡Z&…_9S„‚A“,‚K« ‘„>Ds     ‡C–\\ˆG‚f‰n…ƒ‹6X(¯2Ê6_†99KŠ‰n¥Yš?‚…xL†;^‚UqqŠo…WŠ0á.ƒ,‡n‚1ƒ
‚C|R(ˆM=†tƒ17ˆw‚‚Jf0ƒ%…UƒEŽ÷‚,
+
‡…-P
(-—9ƒ„|‡‚`„'žj ¡q‡4ŠT-~‡sƒK    L>†n‡MR
‚Rί5‡l
—‚f‡Œ‚5L(
.‚B:H`PsÆ&@‡ƒ+Æ%`ŸT*‚B‡‚*}—61JY‚Ÿ‚T‡g/S‚
?‡YUcW:]‚nÅ}
dE¶o
‡a
ƒYŸoBBk‡c4„Q{Ÿ
H4q„E—-
1‚>y/‡„1‡ƒE
††rŸ
#uMk
1;‡ky.…_S§%n¦_Zƒ$‡®q‡k†9‡cb‡ov‡„m†tN—„ZLƒc‡f
‚
^
qq   Vih‚bƒ,sCV{q[7    6"agƒXˆU…N®‚OÐM¥qŃTÃ- ‚ÐX‚‚ÿ„ Ã3castpr‚…om‚ýM‡y¢)yL 
‡
Üèý!®8/†‡f0$ŽW
""ŸV˜€€€‚\¿0ÃL 0outer       „5ƒ9 ‰KF‚Vš7=
9=       B‚O˜\Z
’œv#G†G\’v      .‚N‰_ …A"‰
f™O=|+„X+m‹+5        k*8K"L\X†:¶um@k’d¸,Ži§½`f¾.†A#G‡&„Ñ‚pÆ'‚N¶U{ ˆƒ}ŸC=,+„X+@"5  k*8K"\0X
:‡‚”ƒtm@kŒHmostd‚™`Še›T†NƒT…΂„ulandish–in}r ƒx‹E  Pñ„›‚gÆ#NookƒDput
†2ƒ*s_'ƒ$‰KBƒ †fˆ
#&
„k8•Y8V((Va
v%=G‚0#
5ƒ.„B+‡/

‚5ˆ‰5'%
‡„]"+C‡<S"‡|˜s{"²
Ž?p‚`•$0‚dv&?…œ¦A„‹B‚Y˜D†r„/0…O±T‚y8ƒ
?'„°GŒKrŽS‰%—-
./s‰P&9k!&^‚a©Q†/Š
U–xl8~‹o‚’Gˆ*ƒ&„J‰ƒ"1
4E  ƒ‡&*
<—Š9‹
”
PGSH
‚M‚$„…u,>ƒQ…\pˆ7„D       =C21[        t‚2‚6      ‰s    ƒ#„V}”§>J‰9?Š<:‘[„$73
Ÿ,!"‡O*˜:†y8„
X„xƒ…."…Mfˆ(8ŸIX†O"œ]9……h+'‡\h
‘I‚*BƒEƒ&+6O/  /Tz„+H‚2]{p‚?n-'‚+[W=2+„¥{®gçl•Ž…B2}c‚~&0a'.a
~)R…CiU3!)ƒ#,[~1‚
R
*_!‚X     I-y…‚V87
#…9‚lƒ0‡z‡l.ƒ
qf 1yRêAiR‚N…OƒŽþf
‚—<'"+C§g
{"ƒ9p‚`‡A)—4mˆg&?$„uœ¦A„‹B‚Y˜D†rK‚   ….P8ƒ
?'„‚G
(r‚k‡L9ƒwÍ(/‡n&9kH&
EE‡‡†c…'/Š
UT;
Y
)8~   Y‡Ÿ"Ÿ2§
q¾9N&S&!M‡hÕfcpJ7N  =
2[    6KoQÆƃ‡ƒNN§L'$73A‡„X!"‚!‡`m'8„
X„T…-"¾y‚Q`
#X
RPI95+%!ž[<‡h        "O+6O/  /Nz„+HJ]{d‚?n'@[W2+§
ˆ(‡f)‡e
%cU0a'.
       
")‡b0iU3!)(#,[~1‚
Ry*_!"
        I--
"87


c‚lZ*w.

c J 1¦a*ˆxright‚„y¥—ësid‹KƒV88Ÿ      U    ‚s9‚r<!‚/š5Íwœ‚$ƒ.„x‹‚šz„jƒ-ŠOÄ‚›N…DM?IµL5‡5
S¾/ü!‚߉5¾%¾ükŸ4LÚ‚1Ÿtand„X"
&oŒ_‡HŠ%œfJ
ŽG‚m…¥‚YˆÅ=
 f‚mward‚S
ŒA6”Õa6eigh‚-g„U•³‚Gver„7„6ˆv
©`¢X%*O‡B/‹oZ“{‰?G…w„¦\—JƒmŒ-‚A`ˆƒI"4
‚ç?‚
q
4h’wwˆV
Žd˜<•{K†~H}„af•u„‹AŠ7†hF“ƒ<”4c‚ƒŠM„‚mtD‡7~/‚
…GŽ%‘†i;¬‘:‡w~
*‚@o      ‚<™q‰,sh1    yg2x2S‚
‡‚J$)ˆ       F9… Œ.¾jŒ&‡(I

ŽNxži‹„N  ”.‚\`™:ˆ-=²Y„8ƒ……2˜>¾+§y‚'rŒ}ƒ     Œ\$¥4…+†-¨8š{ZZ¡]Š>…WŒs@…k›gŽ$„ZN‰(p|$Ô
‚A'z‚1Žö-‚UZ¾@„—A’—JƒmŒ- 4"4‡];‡z‡RM‡f —8i¶UT—@0‡ŒI„KX:#qa‡‡‡e¾c®t%íÝc
-‚n‡}bnü‚d…8‡‡g,       yg
^2
{2
:‚
„]‚0

)ˆ      09„xZ—&Æ‚\M,Ÿ.
‚‡†CŸK‡l=§U¦
8'e‡;G‡i[®„J—D„~@„3—‚?9Ž1‚b!
%%ŸS˜€€€‚]¿*«ƒ=—æ+N‡d
„wI#‡"ˆ‚c¶0overal*
‘vb™52‡…ƒ…xƒE¢gƒ„ok
‰ /
¶f
²•)"ƒ;P™üƒ2‡¦‚dâI‚߃`—8ÖˆTŸ(
‚)
‡…U¶†o»5
‚2P‚qcom‚¯gîh
v•ñTH‚‰dflowm„:
ƒh„GK>‚C‚% 

‚p„Y===
A
@
=
A
@
=
A
;
@
@
@
@
=
A
@
AKJAK?JJJ=
A
@
=
A
@
=
A
@
AK?JJJJJJJ=
=
=
Gƒz, Wƒ-£FI!™P“n„vŒq† ƒJ³„"Æ(§S’c‰y?s zRƒ2™0…fˆR?1]F‚3!"*6*@‚c+…Ž7
‚Av 

Ã)‚pƒ===
A
@
=
A
@
=
A
;
@
@
@
@
=
A
@
AKJAK?JJJ=
A
@
=
A
@
=
A
@
AK?JJJJJJJ=
=
=
Gƒz, W§XI!  \
<v3@† ‚°Sp#„‹‡e ?sƒri6‚
0…fˆR?1]F‚3!"**7‚c+head„]E
6
‚:„0‰
þ‘IˆVƒK‚#¬¸ y¦<”0Ff’S‰
„O_ûjƒjˆ,†e¦-®o
X¬§w„R„ø`Dòdp‡|2Ælaiƒ(‡#     !3.      
—ëT‚r      !3

p™2      
¸yÎ\±_  „Cƒ:(„SOˆ(@‰y
9'{Œ=`„X‚RŽ÷‚dÆ8
Ÿº¬    a‚öƒ8—8&;*¾/>-
9'H
‚‚i„5‡Ÿ`˜šWOoadbI5†))jƒc…]M—%!  OÇ
1       “\•ñ8‡!
1       ÝLY  _functb~ok‚¶eƒl‘‰Zƒ†/!night‚
•Prid„-…–~…*‚Fc$}. „ ;CŠT‰    †RƒW1†`‡^Œ?
’5
‰A,¨
‚
©±pšCC!ŠW‚‘JÁ!‘£!›q
ˆ¥‚9—od:,®ƒCü|
†,¶ƒì#LC!Ÿ‚oœ‚a7}ôƒ/l‚kÍqdenB1 "‰=aƒ-‡œT‚Œd;…&BƒG™n
š·³¾PŽþ.ý‚D†
üdq;…&B¶
ē#
»\#õƒ>®‚Iun‚
 F-6?…|ƒ`FŽb˜üŠŒDV7‚‘&‚þc%Ò~K®}s‚ ighth†Jˆj„>Ú!ƒµ<st‚ƒviewP?š-
R5e…i
•Œ ‚fL
‚
@dŒ     |N5S=Žöt‡hP‡h‡q¶O‡hÕvŸ ‡h‡hÕxÆ(‡hŸ Ý`Q‡bŸ‡hP‡hP®pŸ —7Æ'
>d‡hP‡h„6Æ(®p‡h¶X‡h‡h<‡h—8P‡h¶Xwhelmjfkrit
…;
„C‚†`Šx‰7Yˆ¡)
Š{‘i‡
›D8
“š 
„o¤w
8U9†‡0‹,
Žn7ž,‡*.‚_-…T…ŠZ—‰eœ|•$Ž& WƒB–k
Ûx„l•    ¡ æk…/a8+"‚1Q!&`g„4’SŽö@åö-§;í+A‡c
Q8Ÿ"
‡aí/
}õ/1®!®n‰J

‚(7,T.‚_ß‚r¶ƒ"‡‚L¶†,¦Cn1Bkô‚V—$
!—`oažqIR{  tengc<†MK'„„TÂ6ƒ8…I¦2j¢sRŒ,„¤‚W®W“<ˆ<‰"…Yà(Œ*—^Ü-hœƒD‚ßW7‚7‚ …y‡"ÖJí‚XŸ…‡(\NŸ-otƒ‚:˜š&zeal‚Ÿvfl_cnt‚´?Ò²tpag‚´ZÒ³yload‚´5Ò²junus‚´sÒ³(5S&…QM9<] ‚#4a
2
†„q

""ŸV˜€€€‚^¿0Ã0owen‚„qácnA
ƒ
)@_ƒ4   N
3v
ƒƒ/Bƒ
†s‚:‰c‹[‚2…q
9;’#—J 4„$ŒA’*„9Pfƒ5
‚\„„Q¦„/6B!U›„4
 G¦L®r…L/
^ˆ!ƒzƒ)Q„ˆ@‚GÄ"
Ž?•UU
°7ZŽ
Š
ŽOZ‘!“g Š4…”H•7cˆ9‚O·P“3S‚7ˆUƒGƒQ„^‚kŽöy8ÕQ
í)ŸM5
9;Ÿ†rí,¤X®‚MB      ƒ%ü‚d‡Z+—I6—'YSB. ÖO‡U¶†WÝX¶Tc‡†

ƒ—g‡c„‚j        +%I‡\ŸO„:er‚bý4‡\g·   Yshipa.Ã|‰\’$Ep&4ƒ"ܯ.†4&4‚¸7xid‚C±X—mWJ’s;“؃&W„Át
%;pƒ1’        
 '
6 u/
I$!7
3E &†7,   ƒ'II/"0F?h2


        
)c",
‚(
a
‡t&/



        "6?
M#      8 ‹\†+.~'3ç9!–F.¹FvEd‚‚”¨(#.Š‹\8UƒX K†"FŠ9
…nn]Xˆ                        Z
J,‰B„)‚2,EP'‹;?
ŽW‰ˆ-a ,Ž‚l%Yˆ…Q>-~E#Y"V¼
nŽþX..-'3!¾g†!F¾ ~vEd‚‚
ƒ#‡R
NĴaF
í2
£{a—<^
y,XP'ˆ?‡a
#RaÆ,*‚l%Y”0
‚v¶i&“DE#Y"V
n
e0‚Á51|
v…pƒ3   „
1       #%*'V.
- rt+!16=!`4
0-&P".kQ#11| >Vgem)5k#E"R%=k3+J50  @E

P)/khV"@'CCB%m#
Qy2-%%
11VIX-W
75"3$-\$6      T/$.

{l)K bI?!#z 
<OA$%%dF$3 %4G      P?-QU
JcI
WF1+
\(scn8{
-V:‚~AdO@V#1%G>‹ BD,†-
        %%~"‚?ƒ&‡xe8z/dx          †Š4RƒA‡T‚2ˆn\khƒ#f>‘8
†k“H"Œ_ieŽWŽ“n•  +ÜU
     
)1
     e…P#%*'V.
-       rt+!16=!`4
0-&P".kQ#11| >Vgem)5k#E"R%=k3+J50  @E

P)/khV"@'CCB%m#
Qy2-%%
11VIX-W
75"3$-\$6      T/$.

{l)K bI?!#z 
<OA$%%dF$3 %4G      P?-QU
JcI
WF1+
\(scn8{
-V:‚~AdO@V#1%G>§

B„“
        %%‚ßC2|
|„xƒ4   $…‚hŠ  !
:N+3?5*Y:p'
#${
A^in‚0p

Rd'#‚0JC7rI 
3[+A.LC0>xC,,;'$:    <.8   +/Z/    \*745Vs4(m'5H

wL*#+UPF1#+"\cEXOMc'p
71 ?{=(#\\       #/     :(     @     O1ow+$
*8(‚X@^3.<H:‚
_;TN3uNoa
‹!WD,†.

        %
%‚
‚@ƒ'ˆJbƒC\…{Š X%ƒ8ŠˆpI{2w<‚A˜/”hŽFeŽWŽ(ƒH•  z‚3ÜU
     $.j„h!
:N+3?5*Y:p'
#${
A^in‚0p

Rd'#‚0JC7rI 
3[+A.LC0>xC,,;'$:    <.8   +/Z/    \*745Vs4(m'5H

wL*#+UPF1#+"\cEXOMc'p
71 ?{=(#\\       #/     :(     @     O1ow+$
*8(‚X@^3.<H:‚
_;TN3uNoa§
W„“

        %
%‚ßCth‚
*Ýú\3‚„0ƒ5
ˆ%ŠJ+3ITRW@U
Y?
_1!=     ‚9O‚!B‚2hhsdSnDlFTHk9;n$Ic^>AB?P‚,      L=-q'>@O
b>28J‚~,ƒ‚_Vh"C`>"l{;V‚PtbPoHƒaN=(L,}Y/M8   ‚/xOG,
&R‚Z‚Bƒ'‰wd‰aO‡E‚A“˜/”hŽFeŽW‹ ‚^“n…kU.‡H
‡<†0
""ŸV˜€€€‚_¿0
»•     +ß
o„&J+3ITRW@U
Y?
_1!=     ‚9O‚!B‚2hhsdSnDlFTHk9;n$Ic^>AB?P‚,      L=-q'>@O
b>28J‚~,ƒ‚_Vh"C`>"l{;V‚PtbPoHƒaN=(L,}Y/M8   ‚/xOG,
&R‡™i0p4‚‚fƒ6/†|
Š8L$+3,9$ƒ‚C<jz‚i‚9‚E11‚
xhjA&‚] >D\%F"eƒD‚]wc„

`5…‚J…J
‚76-6‚:=N&~ƒ
‡*                
J]]a]‚X†:!‚W"gw95_d 
*A#%‚Ü/At‚XML$+3,9$ƒ‚C<jz‚i‚9‚E11‚
xhjA&‚] >D\%F"eƒD‚]wc„

`5…‚J…J
‚76-6‚:=N&~ƒ
‡*                
J]]a]‚X†:!‚W"gw95_d 
*A#%‡™i_int32‚
Ý9|ÝX
Èk|64‚¡"ÝŒTarrai‚¦%ŸÝX‘WŸkeyinfo‚ÝA|‹ÝXÈs|‹mem‚ .Ý‹`
subprogram‚ã'ÝÎY5‚Xƒ8^‡?‹1ˆ269ƒCA8….(=‡M*\#=_"ˆ‚GGY:‚*%‚„>‰2‚
W‚i(iƒX"?‘-EZ
      …2ƒƒ)„&‚Ü\^J‚Tˆ269ƒCA8….(=‡M*\#=_"ˆ‚GGY:‚*%‚„>‰2‚
W‚i(iƒX"?‘-EZ
      …2ƒƒ)„&‡™iis_in_c‚Àü‡>a‚%$gbpk‚%›4Jce‚ukˆ3øcˆI
ƒ†+]‰.ƒ©hŽ;d¯;ƒ†+]ˆ¦

—.ag‚¿[Ž
j‡Tƒ5ƒ.C
cM‚;„    ‹1…_ø•2Ÿ‚\»=‚‰N®r[í‚9„jM‡ld»„_et‚ƒ7wfil‚„9t‚4mBd‚‰I‹Pƒ1á+8‚xƒ:T–°
”6
$>Ÿ~—c‚_8‚xge„IV7‚[ƒq„fŠ‚C%I‹&ˆC˜p,r–rª/…>;V†&
„U‡U'‚]=„h††‚l‰1’l£:…J   v7        !mT"6%.{ƒg
/’\/„K*…H&ƒP"…vZƒLƒ2/h
2[ 
*9&4"       
2       
2D>‚Q5\5Hu„("
ƒ!‚2†!D‚\ˆ
œ!„b‚5

#E      


;
;


J
L‰b-IŽ  o¥Ç „² 
$     6/E…C!)(' E&E

‹|Ÿ>‹g†N3†0O„D=        Fšiˆ
Žl:VŽ
˜$Šd‹
”†A8‡>     „     2ƒ8äh›,_…  ˆL…[£ŠM6‚…R$H).F‚T
cŒ($R A!
v
;“& ‚O#/*q&J‚nge‡t                 
.BU 

;    

;    

;     
?     
>     
;     
?     
>     
;     
?     
9     
>     
>     
>     
>     
;     
?     
>     
?    

8   

7   

?    

8   

=    

7   

7   

7   

;     
?     
>     
;     
?     
>     
;     
?     
>     
9     
=     
7     
<     
<     
?    

8   

=    

7   

7   

7   

7   

7   

7   

7   

;     
;     
;     


                           
YV         
                  
†;“0ƒ.
‹q…N’o.Œw„]!5        f‰7°r›/¸|„'‡)'‚<ˆLƒbŒ8ƒ(p¡z…-:a       Œi‡K… ƒ?<.ƒ‡#ƒJ…|ƒ0Œuz…Dƒ…A„[ƒ;Œ=`$q…      
„C‰
(‚v
/)
„‘P£`‚QP‰‰h™@@I
x       H‡m?
       ƒƒ(PM_       ƒ<1


&,/6#!#*…-%        
 1‚3
&#„y‹A
2ƒs‚c„DF‚/‹l‘+†(‚F†‘p>&X2-‚j,       
y)&     vƒMˆh©4–.ªOH-7‰v.
#†M‚%P†ŠMŠ„F1‰dƒ2Žf„ƒ&4IƒM$‚F„P‡_       H1!$œ
@*0Ž        „kŒo‹2
 ”1«R«%t–Æ?‚DÐ&$'$      P#Š3FJ         
KJ„y‚-Š66‰y
„9N$+o‚pU…?ˆg‡ B"26ZF#ŒŠd;‚?B
        1B  &kc†2
‡9ƒT&…Žh†.      5‚…n   ’aƒ&}‰5
ŠE±U„
x•f~ƒ/z
P…C†&5"‡w          $Aƒ=      ‚²BÉ_™9
 ƒ
‚.c’d °Oy"†…‹`†      ƒL,;–?
*‹p‡!…‚M†J

I
!       %c''          ‚4ƒ     xcQ
""ŸV˜€€€‚`¿0d
3!&Tgƒ     T
‚{$.


    

*!!       .

            $W!&

"
 
'

     
        
        
        
5
I*
.@     A
#!
0    
3   
%   
*%
(&8%#

 6  
                  

              
  
    'V?‚S       –&F
"            8
2%G'&Q%„n.iCƒ
…C .„fg
S $¢**…„„L‡s#}‚4    f
Ž)dŠfŽösbe"
j!‚2D‚\6‡‡‚ ‡g"‚3

#"  


-
;


J
L‡MOl@ƒ‡  n   
$     6/
=N„J!)(' E&E


„V‡…‡ONˆQ3†0O„D=  Fšiˆ
Žl:VŽ
˜$Šd        ‡\‡e
'    r 22ƒ‚^5^      ˆL…[‡‚?‡VX—5
 !
v
;“&®o‡)                     
.BU 

;    

;    

;     
?     
>     
;     
?     
>     
;     
?     
9     
>     
>     
>     
>     
;     
?     
>     
?    

8   

7   

?    

8   

=    

7   

7   

7   

;     
?     
>     
;     
?     
>     
;     
?     
>     
9     
=     
7     
<     
<     
?    

8   

=    

7   

7   

7   

7   

7   

7   

7   

;     
;     
;     


                           
YV         
                  
†;‡t$‚R‡(‡`„]!5      Y
‚_ƒ]kp‡E‡{‹‡y‡k|‡‡Ÿ%§‚W‡¶VB„‡ij—69‡d@‡h
A‡i`$d—ƒ7„Ÿ-‡ 
1‡\T
I
k)+
       JP[            1


",/6#!#Pd"       
 
&#Q8žsP‡mk$‡wD‡U<
qX2‚‡‚E¯‚‡`[‡hfFc‡[9I`Q
I‚4V
@*)‡\l‚„{‡k
—@‡‚4z‡‡‚Bƒ‡E"$     
NP#‡kM‚RH‡k=
 N$+o‚p^…‚R‡2gKJ;&B
        1B  k



&+
5,
-    -
‚wEž‚*‡fve‡b'`z
P<‡9—6
z    0“E‡b

     G!‡3‡s0Oy"‚x—y     ‡a2
*5ƒm‡TH‡iB

I
!       %>''             
3!&?#
 $.8



    

*!!       ‚4.

            $W!&

"
 
'

     
        
        
        
5
I*
.@     A
#!
0    
3   
%   
*%
(&8%#

     
                  

              
  
    '
‚S      6‚&F
"          8
2%G'&Q%n.cC%pg
**‚9‡KBƒ,O}‚4      f—8
0page_cach‚‘–ׂZount‚š5i†j¹bŠ9£˜†´†j,slR‰o’?‚0%†k‰ °R~     ;„YŽöP‚†L…Þ†k]'~›s9cachs
]Ï!¥8„6ƒƒ%—ÌxŸ66ƒ$ount‚à!
dÝËSnox‚8ƒlJK‚6>J1Kumb‚q>'rA&AR
‘-N2åx™fÑO„6¶pÁHŒ"35G‚q {   ‘P     
ˆn,Ü]Ñ*™fœ
‚ßÊofÝÕ08‚yˆZF–þ3‚@F_journalmode_xxx‚È'ݳYtypx‚?ƒ\k‚‚=5k6in~
†¾„i„G†Ó}    Œd‘!‚4–%   žxŽS
’L¨>„}–_å‚»/_ƒž$Æ
Õ‚<d‚“ŠnB
‰iÚ$n‚,„¨o…“š]Y
‡!g„G‹5X…(‚4”PÐPŒNf‚~‡L¡~‘E>       1‚0‡6¯bi(hÁr‡hƒ+'Y‚X
†X
‹3Ÿ(TŽF¼1½FŸ¼ŒNf‚~‡LŸ‡n‡m>       1

'Í®—(>ƒ-h'Yx¾0/åJ
'
–Y4qB/(!%
#
!!ŸW˜€€€‚a¿2•Õ‚OŸ„P§O®³m*0panic‚¤n•Òckƒ˜X˜šPXper‚ˆ{Ä0ƒe|Šo•=Cƒ_ûn
‚d
mƒelŒE'‚Ï„‹1
(_work‚W;”õ9i~$Ð*{‚ŠOF

†7X„_½O‚-‚ŠF
ˆÍQXXp‚…J“ªƒdata‚UBŠoƒ”radigm‚ã^k•ê„graph‡l…AiA
„UD~M
_FX8q‡O      ’¤D½&”6n‹¦Y„yœ„o
|
…a¡ŠŒ-
£Š*™("Œ^§Zº\Šµ‚rÆ„c‚Œ>U®ci‚¡   ƒX‚>ùm‡ˆp—>‚‰T#w5žwllel‚‹3ŠN”Õ‚)‡c'®pm‚Š        Ö(Â?ÜBËa‡ï:1‚hµs'•ùj'et‡s‰…\J‚4.‰


B?{.v
Y
‚*I+E/

(:0        +/NB! 3
):z1=   rˆ‚\,[kmWiN2H$)1HH *    
=,
#-6
2N V=^/F<*--(FMKo0,UJ:0
   * N%3(U22

"&WJ/
"h&G/*!aG#[3
'""‚B
e
0
        :
@''ƒ|$<M%!„'…AiKˆx‚8?„
-o
@< 
N.v
1&$I^T.3X4†…E
E‚$
/4ScCA%7 ^|
(J
‚8C
>>K
ƒ%G‚X} 7Q@0`]<jx| EGC‚0‚Q"FLB
9$
      $(
/.j‚F-
–'P„.$™=ƒo
&!A-PZƒ †
H$

!
VŽZ«(…4

=„yL]'(R#‚A„zŒ0ƒC7;5‚9ƒ_ŒL›6‰c9%wƒ‚AD‡_•#‰†ˆ‚" ‹s—C–LŠv†Q‚]…
     ‚
î=!2‹Gm˜†‚ƒ‚~„'‚v>„1(‚O‚B2
                     
!wƒ@RL$1‹DƒC„@†O‚N‚
 
„*.ª&ŒQˆWp,O‰{t‚Š}ƒ‚*’       r$H{!‚‚1-,   ‰U…CN   †0
‰1,uQ1t6e)N6+ƒJ…;   &„;‚e~ƒuƒ\a‚e2O&…+     
'16~„}„‚#‚K Ž2„o…Fƒ&8j'‘"›Qz#Œf&˜vNN        *>†*#<;a‚6‚k(8(K8 ‰at„p+'H‚ ŒVƒx+)z$—T‹6…$1n…A‚mƒ/T‚O„D"
†gƒMk‚N2ƒRƒ#ƒ( xœq·+‰]=5{N„BQQŠS&##
$I‰(IO‡H
 QK„.FˆU¸/      #
f
‚aŒ}63E†(†jY"ƒy4'.‚*C†F%‹„ˆvˆ])dŽ÷{‡"Pt§X}C$

!
]‡.'}

#&L]'(R{,]z27;5‚9ƒ_h‡‡h
\9%RK@ˆ2‰†ˆ‚" ‹s—C–LŠv†Q‚]…
   ‚
Ÿ5!24m‡X"
D‡'Æ'L‡‚`Ÿ/ƒA„@††`q§
§        :§
k΃]‡g$  —;0¾=x1t6e)
+fƒQÎ
0‡i+     '1N‡hA‡‡®wzƒV
‚
8j'‡bqŸŸ""KN    *
4‡a
A*#—3
6]K2(&8(K8®p&+'H
S ‡c?ƒx+)n‡„T1ne@‡2zO."
a%k‚N2
Qƒ#‡N)®‚^§G,
ažXw‡.¶‡WLf‡h
ƒB>        #
f
‚N—‚‡g/3E.Y"ƒD4'^

C!EƒY—2',
er‚
‚     j      ”8‘‰{j
sint‚ªmount‚4Knoid‚Œ)ent
–[
ƒB|)‚-.
‚)[
þEcàJ!‚z\P
‚}ÃG„Kž‡~9š|NˆFS

C2
‚h
           %C/  XRD%%K'…        V'c!G$aL#-x!)
;!
Z&1&#+
³--

•m  …>Hžu:“-1‚{O½V
jcžwË|!‚z§P
‡‚$í6!òYê<
xüwƒ!‡_‡S

C2
N
          %C/  XRD%

K'>      V'c!G$aL#-x!)
&!
Z&1&E#+—A
„-”*s‡BíH„;(]R‚.3 •


""ŸV˜€€€‚b¿0»:—þC#1‚{Ÿ
F0parent2‚d‘:    •Ú@„            _key_valu‚“•Ú…ofŽ.po‚k8&Œ:‚8&hes'     †{„%¥Fƒv•Z|Y‹qy’Z[
u‚o‰$      "‚@È~ <µ90f‚…Æg
õ.Æ%_Ÿ‚@
i~ŽHu%a¨¨b°Q‰w½
5%
K‚¾ƒ>Cü†(…nod‚¦        ”Õx5gC
6SB|cD46}     ªrA˜Y‹Gˆs:„(‘§k.‚3kƒL„)/odi‚Œ6—†5rai‡.s=
…@‚2ˆ(%)‡%
&H%qgˆo‚k‡&M
Ú{!© Œ&‚#áA ‡‚ŠB‡(n‹‡[‰V‰F0„
»†‚7…^5ƒ:!$©[i4!        ‚YˆU3„r“+
£>Ã1
ƒ‹'žRƒU       †‰q-„ˆ?]ƒL,ŠW9·@&šh½U
ƒ!
‚A),žÌ6—0
a    ‡‡gIÕ|WŸƒ*
•$‚7…^5ƒ:!$ƒüf4   
‚,Òx1âFeŸ1'ŸÎ‚h„f       
‚G&Ÿ4eƒO¥~&…Z
‚N‡Q
.
‰w‚á&
S‡
‰#¡bŽVƒ5‚X‡6@
1%G%Et%#X20O       ‚9¢X=
‡S8 E6
ˆHÂ"       ‚.
V†Æ.7‘y„P‚
-gÜÌX—sU
õ•o†
ƒ5
‡ŒH5
1%%*t%#X200 ƒžåK

8 6ŸF¯”
ƒag_trac‚”Dr†l»Ü‰S†ú†l.schema‚áÝÌ3t
czB‚-‚‚&ƒ†D3‚P‡ŠS4„nƒ+†J
#%4D[†G$,ˆ>”

…„#o#
t;b*
 @-       Z„
…‚ 0ƒ%‡r +ˆWŒSt=   „|N‰8‹
[ƒP
†‚Q˜…-ZK„i†["ƒ5„6„%…vo:‘eFq‚ƒ*„>ˆ([“…)PŒ–[‰n-C‚r
*”y®=)‹„.
„nŒo|ƒ;‚ƒ*ŒFƒlŠ…(„5ƒ)4‚JˆM‚Aƒl›YŠv†Qk„.q$:4+-‰+r„rZ”E‰Š@`„o&‚sJŒ\‡]‚
T°     'ƒaƒˆ8Š
›Eƒˆ›7”z

š*
!†-†4‚…%Y’)Œ4(•[ƒƒ4ƒX‚I'‚~„a;¢/
\ƒ.ƒ|‡F‚29U‚5&ƒHƒ%
;s¡#
„| A$‚
‚p
–‚@‰•\…%…f…|/‰*‡?R‡|•
†6$E‰ŠY„]‚8‡m Y…uŠƒ@ž®
fŠ      ˆo„L‹9-EˆlŽ~Grƒ7-E…ƒ)T† ƒ+ŽzƒA„0/¬:8‚n„G¡;ƒ9‡ƒ]‚        ˆcŠ¾G‚ƒ@(‚@G ‚ƒ@§è?•a‹rŽCˆlCo&ˆ•%‚j#¿£Tƒc
ƒa&ƒe
‡
?!_B† ŽR‚=n5+Z%Žö‚}       ‡_Yo—=
VŸ&jZ‡G P2ƒ@7h&)Bƒ[‡`P‚L‡0-C‚rƒE—8(+®=)‹„.
„nŒoŸQ)x
.Š-
‚5‚b
‚J„M‚Aƒlk„.q$:4+-yr„r‰p¦‚Q®o®K  '‡r—‚#‡fRƒƒb—\’8H
8.
;®Kj/*Æ%‡lÆ‚§‚0‡h0
2‚5‡j
Jƒ%§‚2Ÿ
ƒq‡w‡Y,
‚p
‚k      i
i¦e$J&‡n!¾:D‡`
‚Y$>‡f
,‚8.Gd`¦     —3
ƒQ§,
<c‚CGrN‡uuƒ<E&ƒTM‡X>‚50„0/
8H4§ƒ!‡]+Q9ƒ]!D5<¦M7‡®p7L’F—„BCo&‚"Ÿ
DRF…*
[‚wO>J_Ei—"Pn5+Z—7#iLF†…Ft„6*3" DZ>!4a'      
“a
‚O‹?f-„ƒR†W‰™„ƒGl‚O†DBƒd–}Ž÷‚‘E‚L‚[f-ƒÜ9
I‚‘#j
D,å‚[alC
†3‡7ƒDI9‰[v™&ç(J"ew!8E](I; +ƒu„c™y¸#i        5i#Š“gS¬K>ƒ$„H“q„5¢Y
P„t
Ωm-m
¨\ƒD/„)„0£-‰7™,ÄY|!C
_R
ƒx‚q1e
""ŸV˜€€€‚c¿0»È‚&¶c8"ew!,
](I;+„\—98«mÖ‚?§_#‡ˆ<6:¶>>Œ
r¾B|—@åX^#/
ƒU)~9£'žy §        C
0partialindex‚@‚p[W„z;"_`Ya+    ‚2m‚{^‚cip
ˆˆq
‰Ra‹§(‰]‡m,„
‚|„ ƒ        ÌK»B&‚À£x2„¶Y3Ÿ„ular‚u
†lŽ,‰—=O

Xw
K
‚)

FJd‚Z
„H‚.%x‚

P…†y–7ƒ[DƒN“e‚s c
(”M
†ªqˆ'ƒE{|[†!…<‘z’k(‡CŠ+O”.›c
w
ƒ[t¡,%
‰uRƒP&•f *°ˆFS‚<    –&mn‘T‡X„8Šw„4ƒ‚'‹& ‚'~ƒ)›„‚RSœ†ŸO #¦v$^‚k‚\–ƒ9ƒJ¸_¯4†
Œp…/ƒ=Ý{ͺ/       Œ´_–D>œG”=щ4‚f
‡#Q   *†QŽöv> ~~‡ZBV
g‚q—?eI$
3§ñPŸ:‡f`‡a
‚l>|K—ƒ®"‡m/—M—EM…2‡d
4‡D"®%¤  xD‡mDÖ¶‡i*¾
 m‡\
Æ<®l~S
‚RSŸ-    ‡†
*$5fc&‚%Ýd¦‚N¶†)—&—V‡‚T%)yžv. li¼†XŠ.ƒ[ƒ.XŽ.
…4‰ÇsŒMŒgŒxˆ½AuÊw/ƒÌwn‚Eõƒ/Ÿ
9Ÿ\R<t    „7‚L|ƒz‚0
6
Bi‚+DI^k‚ƒi+mLE
X7O7Oƒ9#$‰_”å    ƒu*
6
BQ'DI^kr,+mLE
X7O7O#$‚σklist‚¢Z$„h‚$y_within‚SŸR‚”Õuo‚scagoulaAŽÿ…=lˆd’[kagulaŽÿ…s"5/P&‚/
C('%7
KX($11F    #;

O?  N„,f~4ƒ3

1=„=)
U&H]S
=ƒ‚[[ 
"3
 &ƒ‰@†gE…]`
U^ˆ[Y
@
‹96U‚ 9Tcƒ*8‚T2
+qw5‡_$„+
‡Gwƒf"oƒ=?Ig‚6«‰/\‹5Sƒq‰V—„V=ƒ>–P.@f+DA‡RE.") †X‚•ro ÀV¢O˜^‘(3)
hB‹v‚yX†U/Jl‹9„™[….™P$Žc‘q„w)fBy¢e‚dx$ƒ…
‰]l‰0„F…1ªT{?<–\ŸE ”>…e
‚/   *""r‚f%a„bf‚ehˆi:ƒƒC

)Vxa-^O‚3K‚'JuBF+
0W%*e$‚=`"y‚B9ŽZ‚‘†[
ƒn‚Hƒƒ
Ž‰•v
´A„R‚b‚N‰{L›|(‚WŒKa£w
)t²>±h‹ƒ{…O‡t…~B‚0`A, ?Aw(aQ‚ai"MtcY$05’¥n8ƒ;…='ŒaA|…‘A%‰FŒP#‚‚“s
„+4ƒgy„K‡z…L‚‡.„I…XV‚`Uiš‡e$… †k$µM„TBƒe!‡=l‚Š[†K;Ÿ#—9tWP
)
‚C=%‚Z
@f+DA9E.")+†X‡;
‚‡ajY ¢O˜^‘(3)R
RvFG>/Jl†
[N4P${O   „;„w)
CBy
‰~‚dx$‡ABAå‚5T+{?<ŒY^
i 
.7ÕõV¶ƒŸ!%‡‚0ˆ
J¦T&B(—      ®}‚(ƒb‡[/
‚dK^‡i_
)t§Ej—9VLp‡gY
0®k ?Aw(aa["MtcY$05‡†h=‡Vl]'oA5ƒBY
{#Ÿm>—„\—S„+ÝŠ—4

$qƒBUEž|ƒlŸ%PagCer‚;sbi‚‰o”õ(ivBcv[=‘`+Ý`Ž÷
!+‡àYM`s„[t‰#
·'Å@‚ƒ9À6Š{Š‘IZ'‚/·„E       
ˆ     „Œ^ƒ9¢.‡7Ž÷q1‡v3Žp
4

""ŸV˜€€€‚d¿0›‚hßZ¢YÅ@‚—‚Y„–
<         †¤X‚¸F
…@Œ4]„Q0patchˆ
„
‚KB‰<W‚U‚|d‚LS  v‚'\0t}‚J‚YUƒ6HPƒ<Q#MaVÏI‚n!       &9#zQ@JU†h4JŒ$!#Eƒ„OŒ*‰x‚W)‰?ƒvŸ:Kƒg

8Ń4:¾ŒC
2B‡.<-‚ÀS„1—<
set‚%VQ"…[„\n“D{“C&#=P†t‚2‚^ˆRF/6!‚"‚#"$
RxL ^~$+‡”ÝM]‚#"$RxL
Y^f$+ent‚?
W@
‚‘ _
Qha
‘[B‡[…f(‚1D


K%\N‚s2‚†TMA8(.Js„U(ƒ/OP
'-@ŠZ5‡?      ”Y+
„%
±  6†‚>;0!2‹H‚i‚0+
;"
%
Œ_3
K
‚=o‹…       ³n…5•iŽ;
‚/

K%4N‚õ0&A83(.Js( cOP
'õ       ƒŠZTUNƒ–
œ;!—‚d‚?7+
"
%
ˆ3
õo¾BG(Æ25R—(PnamrƒO@ +†%FYX Š^‚5…§‚¨……   H—8ƒx¯‘ýVWÚ
KÊy
(—7:Hœ+$õZolog‰‚
‹K3
žYù’fternn/„T„…”K|Œ      J        7!ƒ‚z'…d‡žB…F9‚
T`M‹*
)
°5†ŒWŒb…I‚]…v
„3Ž|µ!‰a  ‚dT„'=ƒ‚Š…9
‡,³‡UR«a†
…^:Žþƒ
>'‚T¾‚IF9å    MÕ{††ŒM<”V3¶YG¤®_Æ#
{T3=L‡c
…9Ú]‚BRqC
-:ul‚‡h        
s‚…;Y
 
ˆzÜ‚x~â†Fj‹Y„&aŠ½v
t†F†»h
„@ayloadx‚O„-
Ö}‚v‚FxNNRFEFFEFFDEEEEFFEFRQRRPQQQRFEFFEFFEFDBCCDRPQQQQQQQNBB‚P      
‚W#ºZ>„'1@Œr5hƒ1‚!
        …      –e
ˆb6(>/W    }cGƒiQF‡SŽ8‚M.ÎÂ/õ‚t{xNNRFEFFEFFDEEEEFFEFRQRRPQQQRFEFFEFFEFDBCCDRPQQQQQQQNBB‚P      
‚W#§1ƒä.5'1@
Cƒžh
~
        B‡)
ˆb6(>/W    }c
ƒQ6\zcolnam‚w‘…0dvalu‚w‘…lb‚%4_ackup‚   $„+#        †    +indirect‚%™Guf…!"‘4  %†W„S%—ë[@     %
cƒ}%c‚‚&Ž¬@ûEachF
ˆ_‰e1‚‰
truncateunsaf‚£W     _methods2F+ŠDg<‡9pagf„yhangeset‚%Á
ƒ&FŠc/E@W‚#”݃B
RW
‚  lientdataY
ontext~Ð/$‚"Œ0U˜ƒJ%r¾
‚$$j…—i
~%9tx~*ÑN‰S                                ƒ/fN…¢Z/&·O…t'…~"/
r
¾Gƒ7                            >/f
)…6¾=Œ%/„áA
urlG
&†i              

o
¿–G&‚3         

†ãrent5Dwx‚¹Zˆ*üyˆ*da‚pta‚
o5   6‡[
µ\KG


/#P,‘¨= b(Š](HB;PnXf‚I[ƒeac‚z
ˆ=—†
efulli‚h‚B.ƒ(        @
*##(!ˆ&“Ñ=@
*##!
‚^k~
–#  R½‚.ˆ-iQculiar‚Ú?dant‚‰.“؇Ler‚U6Š
1o‚$‚ („8\.Z*
÷d”å
1u
w‚$8 (U8\.Zjor‚‚9ÚA(naltihV
šT. ‹mšO•Cˆd£[‚Žÿ
ƒH.ù…ƒL‘Rƒ‚¸FmÕ‚cil‚ƒ-”õKd„=†       \
RC4/F
I…&o‡<Ž   t!žK‰PÄo†C™DŠ'.„n3`„\)„‚:‚   _ ˆnŽ6¡„+$
‘!ˆ‚Ü‚   ƒû…Z        t!ýh§|Úo(Ã!tiumƒŠ}—ãoultim‚“s”Õƒmopl   -ƒd5Žƒ^„y‡
’+7±E†R   ˆp„Zƒtb‚W„5”„d‚#„3"ƒ'5„g;&(;P{E5 F Tca
!!ŸW˜€€€‚e¿2Åß,‚W…„„\”5W=
R@
 ‹y‚C’CÜD2PWŸoÎ3¯G ƒëy,Rõ‚s‡lAW=
R@”2”:0people_idx1‚g”KbN•ñxWbNrƒoU"
B4Qja$
†¼LÁI„k„'‹Ê…‚‚…TƒKˆ$‚^‚‚2       S      S      W     O       N       K       O       N       K       O       I       N       N       N       N       K       O       N       K        [      Z      W      [      U      Z      Z      Z      W     O       N       K       O       N       K       O       N       K       M       G       L       L       I        [      U      Z      Z      Z      Z      Z      Z      Z      W     K       K       ƒ8s0„&Ž)SZ‚Xƒ9]–
'k
†(
…mBƒ6oƒ:†H
‚)&ˆ=‚[Ö(‚N
V ŽL†q…)uŠb›M†7¬3ŒšccƒM†Jž
dƒq$‚.‡™|•(™‚!…„`…'ZŽ#¯68"   O-Ÿ„A—
®o‚\G‚2       S      S      W     O       N       K       O       N       K       O       I       N       N       N       N       K       O       N       K        [      Z      W      [      U      Z      Z      Z      W     O       N       K       O       N       K       O       N       K       M       G       L       L       I        [      U      Z      Z      Z      Z      Z      Z      Z      W     K       K       ƒ8s§  =ƒ

‡'—8Q
‚ß¾02Ÿ!<§
W»: Z|ôZƒ
'-—‚*‡ƒYF
‚<Be‰     6
O‚!fƒ|ceiv‚
ˆIK…}ì:¶P†•)nt$Œ3Ž…tk
Œt9ÇMû‚.‡Ðg‚LM_rank‚U—Us…G”å<Ns…Gag‚ƒy
„+ddhX[\X[\XZW[[[\X[\hqrhpgqqrX[\X[\X[\VXUYZhpgqqqqqqnXX:)b‚+((*œi„L@ÞUût3Õx
‚`ddhX[\X[\XZW[[[\X[\hqrhpgqqrX[\X[\X[\VXUYZhpgqqqqqqnXX:)b‚+((*¶k)õÚb|fect‚Iƒ8ž•é‚a‚°klijb0s”,
ad‹‰E‘˜pŠlâD
dÕ|^ƒµ”sorm†StQ
‰},Lƒ^„!‡M
'ƒ).
$
uƒvU
9!+…ƒ
5„X4 ‚O ‚@ƒ‚~
‰MV‚‡Pt‡Ldˆ'‚"X5‚l=ƒ#4d6Y      
*       =-la3,ƒ¢I‹‚6.”?†8bu„:i!# 2¡B†H¬m˜:=$¦D–kƒJ“&ƒ¢)!–…Oo*‚ƒmLƒ8   3*ˆŒZ‰“5˜u0        '       [2)“+ˆ‹NƒiVŠ„^>‹>„RP‹p„3‚@…†A‘`"…‚S„`‚4‚9‹
?!8‚”K"‚‚3‘ƒ
U-fqj:T/Z%#S‹¸=ƒ)6J‚#Št…Iš1<‚T*7%
‰+ƒL6‡pƒ&T   ‚„GL‚1‚#W„{‚2„E;u‚+‚2!6I„.(Fƒ
JA‚#ˆQŒQ„Lƒ"‰=‚<‘—2<ŒJ†‡8ƒGX/„F@Tq¥P‚7†mƒUƒ"
…R)‚':‚r‚ƒ;‹u}‡NGˆfe/‚}TFA‚^P8G8ƒTƒm„Mƒbb‚l…
‚;“4
„&†?5‡2*ˆ*4„ds1†M‡|ncˆc‚J4QŠf‡jq5‚
~"‡/ž‹GP/;]…,ˆ›¡[„7
‚j‚2d„F”™‚L4”<c•u…{†@„?G7,4‰b&…K.‰YŸO„>ƒ&%j„w„„•Äe‚ABN;!MR2‚#.&‚]0z
`"
IS„XŠiŽAÑP’Sˆ8‚ˆq„Kzƒ{‚a
ƒŽölV5‚l=‡ƒ!—9Y   c-la3,NVEjVi!#‡e0f89‡:—:$‘v–kƒJ“&ƒ¢)!–—ƒ
‡g‚
   3*ƒ`‰„xƒ
@   '       
t2)9‡t
2ƒi&T—9sÕx
„8…‘W"
z‚S n‚4‚9‹
?!8‚ŽeJ‚3
':
BW/‡$Î76JÆ%Q‚(*7%®‚r‡g4>„ƒ—2PƒŸ}‡fP‚e
$‚l‡a‡[‚l‚/B¦b:§¯T?DR
T—Iƒ%‡ad1Ÿ{s
‚^
{|nVl"Q‡‰,…‡wq5gƒ'‡d
M!‚V/]6‡S……-‚=®‚0X‚‡…L§1J,L.G7,42&¦
H%‚c.§"—S!—
9M   ‚#.‚[0
`d\I‡aRx‚r‚/c$
…Ueažs&¦ta
ƒhap†?ŠelR‚]‚UŒ ºpƒT-„j§H…‹A†1:Ÿ4
Žw‰y
‚f‚AiÉ
„"”l‚Jå%!‡+0<#U0X‘F
!!ŸW˜€€€‚f¿2f‚cšCŒj‘E e¥9    ˆX‹KV‚
¥‘i«!–x ˆl‘Žö‚S„Æ*~~‡ƒP¶X9Ý‚YrOkË‚d¶a(¯'ù‚h‚A—„n‚[†RŒAÆ‚Îz0peril‚†4od4IŸM¿-íT“"ƒ¤
ˆ`Ž-«mæ<ždŽ÷ƒÆB_‚`¾QƒÌ‚
‚‰‚©@Ÿki‚ƒl‚Œl…J– á|†-–¨Fnmn…:1ˆ‚      ƒf‚8—µW(an…D‡+Žk‚W‚1‚1~ªb’ë'Y‡‚/‡i$‚ßqissƒQ$3†2
•o ƒ2%LŽZˆ_
89;’Z‰v!…=
5‰a
 AƒP„U‚k…2‚¬AŽ÷C ‚‚gR*õ7;ƒ½yõ"
‚'—2‚L„tC
‡'W†4N‚/F—…t”y‚W'¡G…Gƒ}/„ÉDÏ}‚
$Ìuv®*M$ƒ‚‚cŸ‚UÓ‚T!ÍrDut‚¢!¿
,ÝX7!¿
,edindex‚‘,—†7niciƒ
ˆ‹Q˜šD=petu‚‘ L„^<ƒsist"
CƒH‚  …N$  C      ‰$  ‚n‰†/;X@¼T:Ul¨}˜Q-kšI‚jÙz”r‚Nƒ‹6À:0
,P
3‚7
Ômƒ+‚
‰G.†4L‚…9ƒ‡Ž;
½41†¤-„šs’&+(q‚„V‹LˆVƒ1Ä+\à>Š@†‰z
;‘"C3o‘\Žö‚lC;<¶             k}    žq™šI‚jŸ{
Fü„"®‚C¯ -
,P
3Ã
‚v9h   ‡0Îƒ1‡Nƒ5
$¶'§.
+(q‚ž{I¾F…XˆV—3>1„8—t—r‚#;C
3E‚on„CS†OŽAMƒ‰%”‘p‹A9S„é!kü{
Ò{?_id
„afŒWfpect‚h;•ùGŒ9tain~
Œ¤Ežpij½x¾Š5Šk†´jin‚ŠE”üurbƒ…q˜±*us‚*”õ(vad‚† —†Ussimist‚CˆM¥x¡X“؆kkter‚R”ÕPxtra… file‚     .ƒ{+
+S‚TƒQ‚7rom‚  „Iqt~ÞM‚ŠOF
¾_5‚ŠF
s5api~
Ðu¾\
‚jg|—2bno~öE’CH-kZ‚$  7°^ &½[‡H-†ÃD%\$        7Ë" &o‚ffsetx‚oƒ.‚m
7rp‚%

sizex‚z„F      ‚xZ
       z~Ç9„K
-Âl¾V9
--hantom‚\‰X'''.5'''''''''GN''''''''C'''''''oZ7>'''''£q\‡aX'''.5'''''''''GN''''''''C'''''''oZ7>'''''se‚ðQf
ËT,ä(Ü܆,‚…\d‚&*enomenon‚ƒgighwatU
=k losophi‚‚
•³;wtrlPone¥[n  `


5]‚4ƒ.&
W!‚'¢l%‚aVŒ3…Ìo5¶m 


‡‚$
6VÝLbook
ƒ8
2„_
      gap‚‚@hash‡0ŽÿYnumb ƒ        
W
‚ÃZ—Ì‚Utv‡5Cƒ!†%Žÿ^7Cƒ!,to‚‚Î^shop‚.
Tƒ.p‚.ƒƒ.…K‡$FázŠ/rase
ƒ<
£iC&
"g„œUP5D_@…Mƒ
     ‚
        
 +
&="C    }P|Œ~Jdƒ;%
 c_5
>7zŠx\       %eƒ7+ bE‘Œ\&^,:ƒG+ƒ/
<     
-‚K~x,+"1ƒ
      
"  *    
*<U
.$//(*Å—c 5   7d;
–/"
ˆ%—q½M
…I   
 

&"C     P8JdN%
 c5
Xz.ƒa\       %eƒ7+ ¾D‚q&„&^,:ƒhp
<     

‚Kax,+"1^
      
"  *    
*<U
.$//(*†
Š` 5     7d;üY
Š/‚‰M+‚×kysic‚+ƒVŒw©(t—ëƒYƒ:i%D‚~‚‹Z—†
cƒ£/
)—ÌBd
)k‚MŠˆ3'm‚S„73‚>Ž[Žk…ƒA“™‚]¶Rl¤AÝQ
‚>
»‚‚&ol~án?ƒG6†K¾`M?ƒG6†Ktur‚q‚K
kd‚>‰u  Q                               '       .                                                                               @       G                                                                       <                                                               h       S       0       7                                               XšS(£>‡Wm)+WKB!„jM!6&
 'S
!+'k0  


'("„j+$
!!ŸW˜€€€‚g¿2_³      Q                               '       .                                                                               @       G                                                                       <                                                               h       S       0       7                                               •ÕC‚<S(0piex3•_Ž;1ˆÕ8Fc‚ƒmŽV>z…;®!쇒í„kggi‚“•êkchr‚!
žH?e‚˜Lle‚‚nRƒO$6.
k+'ATVƒJ„0 Oedl‚(„n…FKGnf„gr$)?8“    Š~Ÿ)
C
?
4      a‚¾Rb‚¾\k‚¥C“Ùmemori‚        .‚n  B"$-&‚VaƒBt‚U$¥H    >”å>$‚0   >off~áp?ƒV=†¾`O?ƒV=†peƒŽ-Ž-’      —Ì<Vz
hras~ál„1¾`K„1ter‚%,3‚\(G%bI/vƒ'6-”ÝVE‚'6-falµ>¾ak‚%›;•wO¨K¨K–×MM4laceˆ?$ ‘H 9†

œq@
™(‚$A
†a"+$‚E7e'ƒ
‹z;Fƒ#…?Z‡1‚{n
a‰`†$”`>4ØG
@ B$;.’|‰ i‡:‹(-w1™v‚i‚v,ˆ,Ä“Ÿy‚u‚i‡
UÀ—u”6‡Z…J      ©f‚(ˆVŠ „tFˆf–%¯A˜P
ŽA#„V„5   ŽV…aŽ<F‚ˆ†j† ƒF‡¦}šy‘C‚ešW‰Tƒg„V‹xl׃H       š`«jŽ
ˆ0£/‰$ƒ‚3‰ˆ1†
“h’XŒ~‚Žþ‚y}§„)[ ‚ ˆ&G
@ B$;.6„L‡‚—<™)1™v‚iJM+
‚,
‡}
-Õ
§•iQY‚,Ý`ƃŸ#I¾‚§‚_‡¶1jƇ‚9—E4‡U/Ÿ!‡jR8‚oŸ‚‡a„l6†ƒ$¶r§[݈—ƒ—…‡y,S‚IRGŒŸMhold‰>a†Yg!ƒ,—@¥1ˆÅk;mentƒ+i„+“£R‡uŒ ˜:+ŸX‚q9¤`ƒUßb¥x-„!Žöt1åPÞ«>F‚Ïc?ùIŸ%ù‚LŸ:no‡:d‚Ÿn¡:ƒxC=…ÎU3text‚Š"£ˆn(‚Q
‚„8*%8.
ežmHq$
‚"
xG*
ˆnM
„91

‰.ƒŒJžJmžl`"
]…!<›  (”E…•=Ž‹8!ŒOˆ–     .2
‚g‚JŠG„n!1.#\                5OJgO
7Pƒ.ƒi-(…r4&0ˆEƒlƒ$'T{0‹E>Š†
‚*‚C9'?‹{®L…ZZ=+3]p(_4
rHB WH
W',.‚4c
aŒ*‡‘E-g%ª‹+Ø~h
7‚7ÜøEœ
’Wm“v`"—3
1‡{‚g8¶Xi£w    —iÆ#!B.#\         LgO
7‚\-(4&0
‡nE
ƒ$'T6ŸƒO>‚$H‚*‚C;$‡f
]LN3=+3Ý]¶X,
(_4*hrHB WH
@',%‚4c
a§
†6—‚ƒty%Ÿ[E7…[ner$‚$';‚P4
ŠNcŒXœJ<Z:I(}'ƒ
(

ˆ+£L‰@‡n
žn(™;…)ƒU    ‚+o*‚8‰`P‚=‹7r…ƒ&e80
™
‚H9ˆ3+s   -8…\4ƒ%‡E‚[i‚MVƒe
        (4PF0
&8I"
/‚n‰2.#0Vˆ:6‚1;3T#$^“M,
.%
Š+ˆ`’{L>‹T¶3
ŠÀ…|†)Z
…,˜e®KÎHƒ‚#:ƒt‚:ÜŽ~®ƒpí0’{(Žb…)—<Æ'
0+où70
L”‚í0(4:F0
&8"
‚n8.#0V‡]6-;(            3T#$—39‡_.%
ƒA‡=
‚#   L>A‡`'3®&¯ƒ.  :¶#¾„‚j®%‚#:_Oteƒ‚Fformb‚„py&     VmƒS#vƒ%L…_ˆD§=„W‡E.†l„UšGŒiŒz‡.‰e….†Cp‚G‚E§w#i
ˆ#‡‚-ƒ
–:p‚H?ˆ{£”|/Ž9‹
Kžgž–F
‡/‡lhG‰
d˜
‡1®o’ˆL ƒG
'‘
:V•Dðp‡]„L      2DKŽö…l 7
D/

"."? ‡;=06…u
""ŸV˜€€€‚h¿0©b™0/âC„SƒˆBŒz‚J‰e….‚CpG9‚E#ê=§   C¾HJœ{#—3
h9—®s2Ý]P§b
0žt'‡g)
'7‡R¾?,Ÿ'+—nžv0platter‚‚N˜"½.“'yback‚ªM“Ù`er‚reas„FJˆ{Šôt‹…f1„|…x† ÜB‡1?‘1Šì3-(ƒÝA^¾ENŸ^„²„Zdg‚
„LË3nti‚q‘˜nink‚n‰wX'''.5'''''''''GN''''''''C'''''''oZ7>'''''Xš
      $ƒ6£n‡YX'''.5'''''''''GN''''''''C'''''''oZ7>'''''…¯G‚/  $ƒ6_i1‚cœ&4^ƒs•Ò`„K4^7u†‚ …d…€„i-‡L
“]
ƒR:ƒZ
‰ n  Œr‰„ÓZ©8 ²o*Žþ^¾qZƒ-‡¶:ôq
U:ŒR«tŸ‚{ƒŽu#£b
Ž~    ‚2Ý(g‚†gablFR
®Ap„‘ˆY†âƒ
smnˆ?maT
‘ zù•emT…@O!&3
•N—ë3thod;1!
…}g—LŠodul‚hˆH‹J•ù/„n“á}‚:"%y‘…=_Žþh¾h\‚:"%        changeset‚%¢M.Ÿm/       @H”ÝUƒ@Hkpt8‚.HOdol‚%™8K(odata‚%,M®]KG/:&eumat“A€jonia“@€ixtEP"gŠa‚cg‚ŒKJ‚M#‘ý‚9inst~áeƒ?¾`Dƒ?log8‚oOdout‚%>^‚.DnŠJ!patchset‚¶rebas‚%¾D†fˆR'ow~á6‰¾`
‰token~á=IO
e
¾`IO
e
o_nuƒXŒ‚par‚hF:Œ:‚F:int
„x ‚F‚$…1N…T…b•T†]2‚Y$!„   !
ƒj—6$1ˆ-$ƒm‚%•IS)
ƒ8‚L
I@‚r5H_

"4<*
ƒs\x   E&"%     
`</ƒl@M%!‚2     &8u)9„ONH<?ˆ<    C&JAƒ"Žm‚gq„tqA‚
†WC‚<T…&&g†,2:
#ƒ=ˆ1‚;É>&…‚v=:ƒt‚0YŒ.†jƒI…7=‹R„tD‚F:ƒ?ƒ^Œ!Y‚+;T‚{k]†(‚0‚‡ =ƒQK]a]‚V\!"„ƒ=Š6‚:•aÙE´*kž5ƒƒg†‚^„@=‚ƒƒ2‚',ˆ¦@ S‰s‚pŠW‹{Š9„XL(:    J/8w
Y"$#r…WV‘ƒ{==P?
Gse.„.ƒ†$…\3r
Š\9
‚%Œ7ŠU…n„[\‰
ƒB[…Mˆ
‰c0‡/‚-fq^ƒ[‹
'Œ
Ž…<@ƒV…@F„CŠˆc‹qƒIy
        $b‚‡v…E…3„9ŽY6ƒ#–fB
‹^¦2ˆw
†:‚0
ˆ93m‡"‡p„#„)–p¦]ˆI$w“ˆMX }l’„^ƒbl‡f‚I—~†T™tŒn™5ƒK1QLp‚‚"‚‚1‚RkT%U8‰4†M<‘‚    †#0Žemm‡xw
›¥&‹Eçh‡0‡‰M&‚V,„$…Lz´?…Jˆ‰D ‡Lˆ6‚r¶j†l–—L„A,Z8{-96>5…3Š…2‡1…„=ŽövC‚Ÿ:ƒ+<ƒ,2:
#
    ,‡ƒƒ)…%$PW&3D(i†jƒI…7=‹R„tD‚F:ƒ?ƒ^Œ!Y‚+;T‚{k]†(‚0‚‡ =ƒQK]a]‚V\!"„ƒ=R
‚:KŒn*‡@ƒEÕeM—6
=iu‚HH‡&„'Š\>‚       >>®N#: /!8w
"
$#ÆR%Õx2—D)®‚
PM®l…M‚-'fq^W'5We
¦ƒTn—@m'y
        6¾`R:3=‡]
‚V60#—9=—0
ƒ—;‚®‚‡‚;‚v„>0v!{/:uLg‚'O7Ÿ47ƒ=¦ƒ‡p?®k<‡‰MK
~&,‚V
z‡ub—*‡ƒba „=l…9)‚'f
   X"{-976>5N3S§„2—/er&/  3)(Qps>
     QP*‚
$‚-^
(
l&;&C'N
      ,UD'I
#r=„H]V'+
‚9
9‚(ak4E"
S*M"Mz ‚D%51.c"W,$W
-
!/*!‘
""ŸV˜€€€‚i¿0µ
M‚[WBƒi
[5
^J<{2\\/O?1  6f"74
P0''?6CNRƒ      
4     7B<$Yv,K'@ƒ"V:ƒ3‚Q"PA…]=!+…&‚h-!
&
AQ.?8<ƒ=s\=4[%&‚w‚%#&1‚`M‚]k0l
"
O…
,e[ :hvz  
`‚0 „vE#,%/ƒ!¦?*ƒo0HÎLQq'=ˆRq‚7…GXN
/—x#/`ƒ}’dA+3cƒS‚B”e
T™r‚[‚]
‚†ƒy”:„I‚=c#%ü1d#ŠN‚=Š£‰5„ªd™T&QŽ‚}34‚*             HŒ7#(+„/:;ƒP_‘wm“@5C‚]‚‡       P…:i‚
'ƒ
g…4&5"n)„g        ƒ5"‚~‚w       †„`-dy      :%‚v‚{‰TƒnŠƒg„;…B
_ ‚
š
\‚4fu£[›Ž        |@Y3'BW}M
 >/,
)
$30$

/**'0.
      3
3D‡‚dMƒa(>‚\ˆR¨
ƒl/hZ/r‚        +     13"#!‰‚m‚)u†{!„&H‚3‚@R‚`>2-9‚RŸ
"„*‚gF5bˆ|$‚rŽN„gƒ„W„|ŠI\ƒ5†,‚I     {      8
h‚A‚VJ…[…u!~
i‚‰fw‚
˜c
?†+‡ƒ—:t0—_AQfq'=
q#…GXN
/‡Bx#/—`Z‚A+3cƒS‚B”e
T™r‚[‚]
‚†ƒy”:„I‚=c#%Ÿ7E1d#ü ‚'„
N"„7‚}34M þ=|  :‚v
;{«y\‚4‡ƒc(Æ
Æ U3BW} 

 >/,,.)
D$30$

/**'0.

      
3$Je‚ZM.(>‚\‚p7
‡
ƒ_ü`+
Îb+F5b§J;4k„‚„Dl
 )8y     {      8
h‚A‚VJ…[!~
i)‚T\c‡V

0pointless„;[ldmemƒ–O—ë^0i‚‰!”—92ciƒ6<        ‡`AH&
2%‘p‰tŽ{&Ù‚)¾B…€L
ticianŽrlut‚Ž(í)     ygon‚K
&8I"Q=%a)C)@
U   /     "
C/      
F
p%”—.
&86"
-%=)
)



U
     
    
/
(
pnomi‚œ•ñ>nder‚—z•Ò`ol…ƒ!ˆPz¤‚O–ãb1:˜7ƒ#9&g‡#‚dA%>ø…‚ßOY„“$>#9&,‚7A%>rƒ ‚F’,B
©^#Œ•ÒL
„t#³Rli‚Ê/†(†Zø…j†êp‚%™@B"JƒR`†TWŠpŒ3!…j”.
}™&Œ?Hî‚s—Ì7ulƒ1       n
<„UJ9l&‚?†
s†%‹w‡xƒ:†‰N£nŠ&’Œ3)P¬CƒV¡G_‡2„#£U§6§H¢iðYŽþr7l&
?$¾=
s‡jb
Iwh¶‚…1‰õWƒä*L
    „^í‚L‡ƒ&Öuar‚“hˆf†A
hvD\T\Œ!
I<bp
?»n
‚si¯LUm‘ˆ?„²*DõGœ1tpmenu‚‚#rt~
sˆWƒ:¬{-=0‡#ˆ(:‚/ƒ‚½U›f8¯„šb'abl„V¨!9‚9œ‚~±|"
‚(
VÔ…$
I‚
‰ LƒF[ïKtŽ÷W‚‘N~‚‘-Úg®;Ú`?Æ‚n‡}¯]er~8–a„4…-F‰È9¡W2G
…h„‚¾Ew4 ‚  ¾
‚l
„|(j2G
        "‚ion„V‡-/1
„a¶=hŒCœ
²«7[MÅb—>˜a1Ÿ
…KhŒ…Ö„2‚™SS}[Mse‚¡.„hWitt7‡“j
-
‚IP‚Z
†t‚
 ‚-Y‚U!X‚8ƒ(?‰)ˆAT:™ «ƒ‚Hƒg„T¦/Š0F2Ž*r<¤"„"ˆ0Y‘'Z‰_‡VˆK‚z‰gŠQ,µš[•u†F”0<%‡‚f*†ˆi‹[Œ~œD¨69ˆb-W‹&»X/‚k
„+Žgnr/'F‚        u[(}
""ŸV˜€€€‚j¿0»7‚µ1—l–dº&7•/‡#„H=Š"ªƒB½.

X
@‚H+6%0F2
4ržj<T„"ˆ0Y‘'Z‰_‡VˆK‚z‰gŠQŸƒ+ƒ%b<%†K*Fü†R`P®4AuŸW®r,¶XeP
‚E7Œo+ül_¤Ý¶„¶Y
=N¶U¶‚'0posix…!\ƒw³jJE
—.ƒ&…A„0„GÊ~
,‡J yP9I=mŒL‹Høj‰AJ„ªU.cŒL”6ˆ   BÍu
 yPI

=>
'list~ƒP¾hYsess‚ZiblC…/ƒTƒ…s„,†Ž,<¥|r       X›hO58†X….•XUN…7ƒ[6u
‡q(ƒ 0My
4ƒc‚8‘Qy{'!Š
‚Ž'^‰N.Š‚d ‡$4ˆz‚8‚
šV-}›g¬%¼’Kg‰‹G¦`‚w“}¿X‡z‚(ƒ1@ŒI…„[Œr©‰{Œ
ˆ#‚;Œ     ‚>•Jƒxs‡L‚‰ƒ@„Œ'ƒ4„s—!Z„WˆO)"†CƒS„m¡ ~‰N£_ †A’B‚JƒB
‚vS!‚!„z…)l‚@l‚. „“$Œ*‰+O‡%‡W{„AI„0
‚iG
 2†6‚‚J„wƒ†E…l‰M‚%j‚m…Ž}Œ<…_! ‚
‚/ƒ.‹;™d‚e…&
Žƒo’8T‚8l„+^…!†”,•%ˆk–‹n™oƒ#ˆ‚_‡1…@tˆG‚_ƒ1†)…ˆe‹
…p†d.‚ƒ`Œzƒ[ †…K‚#„9@Y< †
C#Y\„mŒZ‹3†…}„9"Œhˆ(•D’~‚a^ŸW–7‚e’n„y˜bƒl‹k%‚šœ8‰
‰˜‡
‹FT‚[Þ®ƒ’…A‚o‰§3ŠO§_„G„mŸ‡bŠyŒRLˆ„„ƒ9t_nƒ6Žöv
L.2‚d ‡ƒ#,‡f"®oy‡n
ƒ

ƒ[‡c
—;’‚w“}¿XG&U1‚b
‚
L‰&†cOR‡Gƒe
x‡A!Ÿ"¶‚— 8‡d
^ƒSƒe‡E‰N`._ Q:‡‚J+‡ ‡f#
!Æ&Hí2>‡‚g‡2Ÿ =
u‚4Ÿbm‡k
ƒZ`#
o!‡Y(‚/ƒ.:S/‚¦ƒm—C¾6&‡D‡‚ƒ2P"‡b!m‚X
k„j—]Ÿ!Gx
B „uLƒS9@Y<‡\„SC#Y\‚!ƒ]r‚,„
?‡hQ   x^‡M,‡0®„4‡%NP
Q%BGr
l®‚?       ~‡\N§‡f(‡‚‡ƒm
23—†/‡‚
‚n[S„^‡b=~U<‚i1—
‚tAt‘'ˆ](‰z•&fÄŽG:‚G^†/=
œl’
‚rµ4¶()í"dŸ']Ÿƒåƒûs
k„‡)œ^condit‚Øl«^ùbdel¥j’ÚK
fixšS„!v3Y
Ÿ
j¶Ojgresql„[I„?
/ƒƒvœ9
ƒO4^
ˆg[Ž;B
V‚DƒL      Š–U       ŒCŠ
?:h—’f
X%'&A~dWT;
=Q:l/H  F+9"N-!z‚+‚M/†ƒƒS
%BŸK¶
V‚®‚>õ"‚ç7
£Ÿ/P‚™‚ivdFul‚}•ù{tenti…V‚\${ %†p,†
 I‚=
›WŸ)¶@…S>ƒSž9ƒ@ƒ2
v
“Œ*ˆm‘R–Uµm„Iƒˆ„‚(¶M‰EˆJ
+ˆÉ&LƒŽ÷5‡e*Ýd ŸŠüdU5.
%>í2a¤
ƒ5
ŸŒLŸ ^õ‚%‚(m|«‡7—‚o&x¦`Jut5
d7/p&¾`            (       
                      ƒ
flagE
ƒ[    gŠ„,        w%Bƒ2‚‹4#&)‘¸#&)er…‚NECB

‚N"…]‚gŠy‚<
48%
ƒ@ƒ8l‘F
‚b+"‰yš@o‰v6‚  ¢ls†@ƒˆ%•2ƒp‚ƒw’LŠ
…6/‰ƒŽ‚{‚g„‚_5H
!      ƒ…0ƒ;R#pƒx;<‚_…TLƒ+CpD‹~9IF„+ h8y8„
h‰%„@sx.U‹+¡Y C—@2ˆ=‚|„2,‚‚
„.2yHSNOkƒ  2‚JE„Rg-.Š<B
„K-
‚b‚g…)†@‚ÀpŒ7.ECTq8‚2eˆ•   
‚U6"
%"&‚1
‚\!
""ŸV˜€€€‚k¿0µ<‚mƒ‰O†%c’R• \ƒ=‚H¯9¨(‚‚      "AD"!4    \a"f.„C3‚Hj …Zhˆ  7Žö{2‚<Î
ƒ@³Y
}+†8‰yŒRK 6‚ sŸ "Æ!3í3J
®yPŸ\ƒ*‚_5H
!      &h% 
#p
<aG=+
C>D^98F
ƒ' 8y0
9Â|{2‚JE'g-‡
ƒfB®Tb®pR§e¯a.ECTq8¦Mc¶®…/
c‡l$R
‚?@E*n‚‚       žu
3
P: >"2¦g0powerpc‚½`oint‚;saf†_Šw›y-‹+
-
ŠY,:+" ‚1Q!&–Gø‚ßF‰I
â‚q‚ßU   
e_overwrit‚›l!ù^y!p‚ÿ Œ5(²*q)7ü>ƒ= „Ù5agey†m8—6‚78rg‚hŒHº:p•ù…/pblob?         changeset‚%¢S‚xœ|/_@”ÝUƒ_@ontextÐA¾‚6ursor‚hŒ-*•ù„j*data‚%Vb.new‚%out+T+SÑF‚]&'GV‚tb‰p:-¾6?‚]&patchset‚%
¶rebas‚%¾B†fˆRsession‚%¬^tmtt‚$L
t‚I9;valu‚%*;+%.ƒM#32;M#Jm‚ytab‚h‹`„&‚'ˆY•ù^
„G
‚'
qr£¾ERractic„„t.kz*¨
Œ0i‚Z‰3/‘
‹§(¤x¿5‡FŠ|ƒf¥h†Kˆ6n„,
ŸƒˆVœ;‡
“Kš^n‡7–g†O…Š      ‚ÕrŠR”-.¥
Ž÷¾ˆ‰'¾‚L†Aˆ*ü‚zO"‚È„_zŸ1\®a®x…YJ§‚p®‚¯0<Ý„^¶\o®tion‚>gmaƒK4
‚J/'$9>,$‚
„9†-“(Ž%R0f6„y‚…'
‡,,J-…qOcY‚,HŽ       
‚x    

RS`
R
`‚‚1
5‚8‚+)        „C(~l…X,ƒ…k!*        
‚….A(SJl‹Q&s>„A
‚\
4‹
‚P‚       s>#;ƒ$J‡k„•]L‚B…~%”±º9êX‰n…I”VŽnRˆ0‚g‰
g;3UcKr/f„C†h?‚_‚\L‚8I—
Š?uL-X   +Y†*a
„VVŠ7_•l’
‡‚dm~…      ‚y
‚iŽm„%ƒTƒ"WB(‰Œlˆ‚x      ‡%%$¨ˆt‰‡\@5‡K„J    
‚1§jL„ƒ        ƒx‚=‹^’d     /…'‘ƒl^ŠrŠmŠ
     "2+‰‹n
†1<„Y„ ‚X  ƒ|‰O6!\*>[Vk£-{ƒ(‹!9      I  ‹O‚LŽ'"®–I¶|ƒ&„?o]ƒ0#%…}
…D‡t!  ,        "'&
($U0]m<     +X‚-A)%UJm"$;H(
q
!K        +
&`
GGG    `b 
.< *6C
a!MA"&3{X‚Yb<13
{_  ZC%S<BVTi*      
0%
DQD)%<K
Pp8
!„^ .N1#57
K

2&D$%
X%
Š:†WŽ‹)7„+•{$‡…!        
>·&ª0:†VŠSfq#Ì‚„X •=‡#…Hƒ9
ƒn
‹sŽöy@
‚P<
#;6 
Õn%S‰"±
º9Ÿ3B¦oƒ+”V¶[YŸ‚,g;3UcKr/f„C†h?N‚\L‚8I–H<†vuL-X       +YL‚LŠ;»>T—k—=§
‚gŸ%f
n
‚Ey3@5
üh9Æ‚Y%
o    
     N6!\*8"V¶W?{‚W‡]79     I  ‚!„"‚—5‚"‚<‡\>H0
‚o]O
J#%—;‡f
pŸh!  ,        "'&
($U0]m<    X‚-A)UJ$"$ 
q
"!      +
`
 GG  `„A
x6+
2
(ƒ

""ŸV˜€€€‚l¿0®–Ú7 b 
 *C
aA"(3{X$b<13
{_  Z%S,<BVT
%
Q) <K
Pp
!„^     .N1$57
K2&D$%,
X%Ý(‡f
>—&>‡wz‡8‡l
‚
g<xŸ       ,#Wn¦h
‚n0pragma_‚„!–ׄ
database_list‚„.–
index_info‚t
„ZT–×-
„ZTlist‚…'–×…list‚À{*^†n»Zù–R‹^…Þ†n/   temp_stor‚Õ–×buž{        Æ#„T   e„…73Ž&‚›A†k      .‡
¨4!™kÜ‚K      ¿Z-
-f"…u˜.‚2L‡~d,$w¦ZŽ÷Ÿ‚5  .§XŸ(
“f!Ÿy„&ü•1ƒÜ!Ÿ —7Z§  
d,$9¾=uÚ‚8allocCt*
Œ^›,‘§[[†Äxmbl‚•2bas‚%œj¢Tuilt‚D
Ù'!‚{•Q•Œ‚      ‚×f8caut•).
&…gUñ“©|
eŸ
ge‚†R–¨dD'– †y’GŠƒBI'   R= †U…2‰š#‘w‹4“e‘5h&§‚I  $á)¢L¡)<ƒtC„[‚b`‚kEƒf‹l<$…VH‚/¤;¸v…¿
‚'‹<¿‡}ÓTŽþƒ¶$
\‡H¾?ƒ#2        $Œ[ƒÜƒo
;H‚kE‚7Š5$
„9H[íM…{ôtl ]®‚(ence1$is
‰=pŒm‹X‡2•$KŒM†‡-¾6‚Xˆ”:M
…vfƒ&…5
qr…[t»,,ƒ{?„ƒ0 )$‚"ˆŽö]G®§"S!…nü$UM
¾f‚‘0„*
ŒXl‚‚ß‚*33ƒ` )$‚lud‚–_ompilƒ¯#‹/‡vQƒ8
ÞS†j°QQµ`§šUƒ¥‚œí‚utƒ‚,—ÄTndit‚Š"Øj«\(!‡eŒÜ{
õTœ d(‚n‚‚™„"dat‚nŸecessor‚
‘y†8”(ü/‡‰måOtermin‚ÆD>ùicƒgt–ˆa†eÝ‚Í“G„14ì W…£D„Ê3‚_3omin‰[—–Fˆå*exist#
„D‚:/ !¤T„k‘jŽN•‰)„n»gƒ]<…˜
MÝ‚Ò‚¯„4fac‚‚–ׂerƒ^ˆs©]“4‡
‚5„0
ˆO„'$%‚?#„PƒÜd| ‚;ŒŽ1Ý`—–       †7Hˆ[„I!"/2  ‡l
˜AŠ*\Ÿf)‡‚0my‰
!
    ©|Š!Š&‹dÃŽþ‚=¶ƒˆ„m®F=     í1*—E‡ƒ3Tt?‚ l‚!"
R2«4
…œ„@f)‚_p—%wý
1!
Æ2GŸH~`}ix
‚\ƒe
Edƒ_m
\‚!˜f+,+.#VG‚33† ƒ ƒuvƒ†1      
ƒ{†/)
          
¼†),E›!z     l†HWƒ5‚1{
"³Ÿ)‚T¥‡Gp‘T‰M"/$9`s„V† ƒ$
¡~$•:    
¦„+
†‰k82‚H‘HW…'    ˆ
´;y„W‡1…B
l›Z…^‚/‘Sƒ0…‚UŽqv^™7)&W’+Žþƒ<¾>rƒ      

X,'
          
…„8,Ez    l HWƒ5‚1{
"žtžIŸ)‚T¥‡GŸ‚t "/$9`s„V
c 
‚

ƒ#6       

)¦e
ƒvÕ‚Ú_h‡6‚..Fƒ
‚On^2
c$nƒ!
!!ŸW˜€€€‚m¿2±’õ‚F݃΂ÆXŒP0„…/
l ‡[DÝ]^‚/
z¦‡qCp
0preinstal‚È>“Ù3judic‚–Fliminari‚‚ƒH—ãm]matur‹t‚N©A•Òc„Wier‚˜ms‚*
ƒ>um‚O]packag‚ó      …K—Ì88id‚•)rU="/…I
       M<e2
&!+


,#
!! h+„yJcƒ(
F‡JU"~\v
#yF
‚  ƒ+I:‰V -5j  
?2
3 "sŠK

!‚!P 
s6]F 8
JTl#N        1
$M
"K# ^q
Ï5…@&z*J…&+v©˜I‡G‘7™,„"†m

†z$‘*…>$„B@…U&")ˆvŽK•v
… ’|      ‡+"p "M8bŒ
„}‡:
#9;"…t¤ƒ‹x
i‘Gs–‰‘x”G•D¢;†<‹[‘eW‰@
I*!,Ÿ/    £    ƒŠ0"^
<v„
•e¬#†CŠo‚RŒnˆBd˜`’Cu!%Fƒ9ƒG1Ž÷/®b!N2          1
$M
"5,
#^q
—*‡A—7
*J
p&v˜I‡G‘7Ÿ:§‚ÎC‡ƒ]ˆ
…U&")„R…2
…vQ:ŠEj ¤ 
M8bÝ‚ù{C®‚!‡‚?bN(‡h„mx'       ƒ‡„1„a†g®X
>
!®k!,6     ?%ž_"I
<v¾D…
o‚—7"—‚‡`lƒ^u!%FI
¦NŸƒG1e16$
0„%jÕ#
‡K4‘%‹øJ„ø…Ã…
_v2%F9
3„&ZD‘‚•ñw„w‚3
'./;!
0„(_…       no_vtab/&rm/
y   persist/
   v
?+S2     M    "["ƒ-E>‚I7"3„)va‚
„y
…`¨U
þf<†
„~2“9¢ez‚8
Jp<)„{‚rˆ^à6]
‘‚G‹,„|šJ’T¥t
‚~¶W!lšmŸ7
ƒ<«S2ƒûf7Î„u‚Ã)…8„|¶aƒf
3#.0

1„3n`‚#end
^žg´+ÏVŠV‚D*
†'§G
¬[5
Rû‚8X‚ö‚B‚È
X¶aÒt
`
Rflag/E7„]opul‚§•Ò‚/rocess‚ˆ2ªrŠ"ÓuñK‡iI„“D‚ÀMCor*l‚2)]T4˜ƒ"
"‹ Kd%”H%…8¬L   ‹%‚’#    ‰D¡m’       2]
ˆ•w
“Yûoü„&2d%%„de|ƒÌ\#ÝP¤‚
]£Z8requisitƒd§isenc‚U      ‹307„7$eV „X S
.ƒYX=A*œ¸>‹Žþllíyƒ–ZÖ:Œ?)
¶K—QA‚ÈFƒtMƒ‰R‚!‚•X‚‚H†ZC?–0.”U\ƒ-ut’W
‡U2Zöp/…,
‰°7°
ŠgeBƒuˆ&›b$‡0;k…|„      •Iœ
Œ+i‚Oƒ‚a‚Œ_Ž£%.‚9¢‰`ƒˆA‚\™„@’2G„‡)…7#h¢(Ÿ?Št‚*‡‚   
<Ž}
„    ™w†s“m‹cÅU‹`ŠAƒax.‹s–!’        ¥"¢(XK*1b'fl(18?M/‚QƒtH$_‚ƒƒ
‹|N4Fµ[:qÓc¢D½N
‚/„‡:
‚]—>›i°7eG/‚2ƒ…(†;k„    e
†=i<‚SS‡BGí(‡f7.‚9ƒz‰`—2nŸ‚™‡k‡i&
D¦‚(&G—B͆wW—7§‚?—322—;‡gŸ‚ ‚I¶W4Õ:¾PNF‡wv
Oq®‚7Ÿ&¦j  or‚™qrv¦A
‚;Y%#
+‚4YU  ‡5ç&ˆL)B)"—I
‚5<‚`ƒ.{‚
    ©HŒ†h„7ƒFƒ
‹#°q
„q4
‚f
ƒmŠ        µ¶a„GŽö{R¾‚X§ÒX§
œ
q—8‚¡!7K‚™R—g Š*dO;
‚03p=g1†6
""ŸV˜€€€‚n¿0µM4–›d—      ÕDÆ9*®„"0preservationist‚P„5‘Ÿk
id‚‚ort‚°>ut‡sEy
†

Øh8
…     —Ìreleas‚>ur‚„v-¶H0+tig‚ƒ{‘˜xeum‰p‰L¥#‚ƒ.¥%œpŒnŸ•XŽƒ5õ2ƒì%r³$t~Ï.
¾\#
end…Fti‚ŒkŒ.qÛu•Ò@>updat** 
 3f

[B
…¸XùaŽ/      
e_blobwrit…<count‚W<depth‚Y‚hook*‚F-Znew‚V*    old‚UQ
vÒ?@ˆ2«•HOˆKŒ,1Š-‡~}eW¾8ž{l<žx•HOˆKŒ,1Š-‡~}eWentƒ‚`‹2‚U…‡"ˆ‚C…ˆWy>  rƒ.‡]]‰iVƒbŠ'„I…#e¿
„qM‚*Š/J'1"+ƒVïEŸ(
ŒƒŠpJHŒz ‰@$•>@‚a*‡?°nŠ|Ÿ,‰^‚2Y“V†
0†#S„H7>/=uuD(Ž,‡[uŠ"Œ‹q…+mE'’»o„Bˆ?ƒV‰d…'‚‹38oK†B80
7‚i‰=
§e%Í,„_—h‡
…#’œ/‰VŠ2†B¤N¬A‰n9‡"¶Tw˜~Žö|
ƒ.VƒVtY1Æ7K‡[M‡hIŸ*J'1+!'ü^‰K@‚a*ƒY’nN48y‡o‚‰X
O0Ÿz>/=uufRk
COmEƒ
‡<Pƒ?‚;„PM80
7&‡.%‡}1‚A¶Cr‚9¦[
65       
ôug_ž{
9Q„ƒ      P¶|iou
‡67‚+…e‹žX‚ODhY"w
„"v=      },
&‚QRn
":‚v’yƒKˆK•h‰_7?3‹[“a"ŽÍ¥/‚#ƒOƒs‚
‰C§
…?)µ’en¢Œb„’S—i‘‡nY‚LŸ
…‚!H…Xm‡CƒT‰H„x¡<<‚k
{8ƒˆL“e…`}Š†Š‹]„o…`
‰Bi•a…J•<v…‚KXh,‚%SOw‚L[#L‚*ƒDƒ!†*pS!^†jƒI†ˆE‡K…
T‹Ok„
ƒ ƒ$‚TŒ,’I‚24‚Lƒ„1“;š ˜V§G…X–3Op…“e”q
…eªD«p‘£Y
?]   ?–x¢D—C\„&„Mš…&Ž÷@¾>‡]YlƒOƒs‚
$<P’?…?)µŸBn‡BÕ8—Y—H.#{‡—-Mhò‚w§     ‡ƒ~      DW‚=¾%1‡‚@¶8i‡m‡4
ƒ}M&‡MS=Ÿ!‚:G¶q#„1Ÿ‡$
     u‡       Q®XŸ!TTb§K
‚Q§
ŠK]ƃv;     4žqf—s    „†„x|3Yƒ
K\P
^%Te
e
B‡w      ‚o”t‚xª(…qÔR(—|…K’FžM.†Fšk
Y’JÒg†ÓW•~   
„I6®Qƒ5—T‡\ƒyŠžjŒ9žÈŽA“hˆƒˆeºD*£vŽ(…Œ”š=”‡ƒo•>•
’&‚8d]Ž÷-®iƒq—ƒKž(‚G|…K’FžM.†Fšk
YTjüUCò7,݉FŒ‡Õu
'ƒ¶Wo‡y)¶‚¦}EÝŽ‡gwF3Í—
‚3dDice‚„>,"
"
„>b‚-m%p@rD     2nƒX;5C"?<ˆc‚T#’J‚‘·6,

"‚™Bm%@r"   2nf;5"?@#marir„;‡(zzjƒ')ƒb


%%=ƒ5IK.    ,K    
/A 3‚Y†2‚aN)Œdvƒ<‚`ƒa‚p†,x<‚,Š/‰G#¨=‚kŸK6)§=Ì>!).…:Œ+ƒdJ`„o:„G
ƒ,2I=+>Eƒr4 *C‚!Uw ‚/¥>t3n3ƒ%,*ÉvHƒ¥tel‚4†sHPƒ†i‡4’f‰Kz„aMMIMLIMLIMGLLLLIMLQ[ZQ[OZZZIMLIMLIMLGKEJJQ[OZZZZZZZIIII ƒI99ˆE
2
ˆ

Œu9*")
ÈUM¢/‹C&+‚aSw+Z
†k|
+„Wƒ$…!‚_:8ƒO      ,!G‚B)%
.%?0.D†CO:…L„(4Š[‚1\&0‚,R11z‚$+P-$,a 7"Z†vˆ„B9
  ŸX˜€€€‚o¿4Ã…E‚8PJ%.&
!A<3      1)*T"‚>K¤T‚‚Of…Uƒ“b
|‚‡R&  W,‚R\#‚1ƒ+†~„0l

Hƒ        `)(8J479‡u‚Di¥^‰#•5ÇLX‰p?MTƒH
BY‡h„
9‚t
        ‚w;?ƒ-…vs‚gb‚(r"”8ˆ* Z,†i

C&‘C§ZJ!
\‚‚qjW%K‚Ac
Š ‡O¦QsI[¦.ŽRŒ^8
ˆg‚A
‚9 b!./2%0†<!‹y‚QXŸi‹[b¿^&
4=
 ##.NZ'3C**6A
‚6SdF3Š4(8ƒ&3&‚8ƒ  ‹g‚b/Žþ^+x§@8‡U
})=!).‡‡1
#,2IR+>Eƒr4 C‚!U—48“t3n3J
?RJHƒ?el‚4 ‡u'wY—…®ozƒMMIMLIMLIMGLLLLIMLQ[ZQ[OZZZIMLIMLIMLGKEJJQ[OZZZZZZZIIII ƒI99‡m
2
`
E
:9*)V
„J?i—!l—A*Ÿ+&§.‡k¶V®q
&+Pi‡fH
 .Qm
!A<      1)*T"‚>0Î
uIg.®_
z‚Õz
)\#6
3O
+

‡Y;        P)(8Jl47(9'‡‚?
PK,t#<<å4
‡h

9‚t
        ‚w;#‚Mƒ_s‚g[‚(r—7D

ƒ/,

KC‡SCƒJ!
‡N'g‡gKj®p
%K.cŸ;
(U
8[?ÍV@A
‚9P./-%ƒS!‹y—‚N
sX%      x®n
&I
4 ##
NZ3C**$A
‚6lF3F(8¶.
$3[&   ƒ       
0primarili‚
–9…      §ZVüN‚öX³Wykei‚
|Hê
zee‚ƒar‚—itu„QŠ4_j!Rˆv%…@ˆZŒ5‡P›Z
ˆU•w–7‡.Žö<@Œ`9_j!RƒÔ…n„“*\[NŸ9keyconst‚Š8Œcncip~‹(+¢RB'³V)‚÷»0lW
•a˜M
×H‚p(ˆdÅU¥{@—l»        
“t(‹
™/
       ¬8“vM.-„CÛ<F…B…+“eˆ^ ˆ[XOG£I‚'…r܉E¬2ŸOƒµI‚
M.-ú6®,w¾‚z‡fƒHXRG`
y'ô„r
_changeset‚””Ý‚fo‚n‹V       [|rœM&`'…#
ƒ
M   ”X •{
Š`§(
‚A?ˆZLZ
%36:
M‚.‚2‡/+Ì0øqZ&`Ÿ‡W‚°T„Î
Æ#‚l Ÿ
5‚ Z
%36:

MS‚2‚S/+ˆ_precision_limit‚œ?!"ƒørL!"†Ë‚Gor‚2j„ƒ†"p…RƒU‚394‚\>‚R‰n„}›.ƒ…;‚‚!‚AAŒZf‡{•M_W4
‚yƒ6YG69L…jB
W'
‚8G…‚‚
g‚KF?-ƒQ…,‰}n40L‡{‡S_
ŽkŒS‚4†](*      y$‡@„=„†‡y?‚>›LˆŒ“}„+‚B0‚rHU …‚RŒZÏLo
gŠ1(¨E„…
‰
ˆ-„‰{ˆw£/‰e‚Y…yÇ*¶H‘&†
Š
B0w)u„Gygpj!“…3‘\$ƒ‚ˆeƒœ_…„/‡u‹"4‡d ‘ˆGˆdEƒM
‚{"†…ƒ\ŽC9ˆ78ˆ(†8ƒbƒ$ƒv7awŽ‚}+„Qcf ^=
r‚&‚cŽ      Tˆg‚|‡{‚c!œcƒ2‚?1‚Y†Vˆ.‚A‚&ƒmAƒS‚ƒ*„1
ƒ
†Fƒ'‚y[%’D‚   ƒv|„I‚Z%Šˆ2(‡X‹uR‹“S™ ”K†Xƒf0†U‚G„Z‡9‡b‘"‹z‘T@/VƒW
‡W
-)†;„7•-
†™J‚Hke$†/‰£bˆ(ˆ:„@„ z†cƒr5‡†_†`”V‚„R™—E%q‚[Š3‹i£d’A‚_’††1ƒ
š_(„E”hœPZ…vŽ.–pƒmJ‚‚Td‚
ZƒC‚[‚@ŒBƒŽö|

ER
i?6‡bE§‚0‚B0HU O
:‚R   ˆA‡ƒH‡_b
6O(“w„…
‰
ˆ-„‰{ˆw£/QK‚M‚‡I"A‡ Ý\eS‘}j!ˆb…3„y\J‚‚')bW‡Dí7tÎ
9
EDN‚I;
""ŸV˜€€€‚p¿0¾+’ý‚s΂O&ˆ(${Br
R?I(‚¶6pV‡
¾>‡b‡j3<
‡nH3hŸ‚p%—;‚
R‡^$W?‡fu‡Y)‚…%m
-$$M  ‡EU‡§
A‚4‚‡JŸ†/‚‚/‚
;T8¦C=§ƒŠ}‡dj‡k‡/
I\‚m—ƒ&‡U‚\)
g‚|hƒ:>ƒ„žuv
%U@:q—‚0priorit„i“#ŽEúx
„P2]…Ž]    ~+#tBq
‡6
VƒT½‚3…—fƒ+#tB
e
Î6vers‚“    v†e—‚/at…3‚ƒ0
…jLƒy‚ZCœ7ˆT Š2hŠ8''''<''''''''''"7''''''''C'''''''5%7%7'''''''
†zW?<'K2,]$f
1Tbf=3"M!L; F3Ú        l
‚u ]„66‘[‰…zƒY“d»G¦M‹JD7,ƒ.„kb
ˆ3ˆ|ˆX=™lˆs
†
„      ×zŽ%`n
ƒHƒ
‚l&†„½,>! +Õrhˆ''''<''''''''''"7''''''''C'''''''5%7%7'''''''Î
U?#'K2,]$ 
1T4=3       M!
  =3‡g®òƒ1¾Bƒ&œr,D1%8¦cŸK®pP?=¶ƒ
i
”)Ý]ilegL‹k‚†q¼´k
ˆjŽ÷‚„ÑbWng5(
•9PŠ%o‚*‹—ão2babilist‚
Å-ˆŒz–+påŒe‡lŠ[„K%cR‚‡Kƒ
  
cƒ5ƒd+M
!=˜4‚GÜS“%ƒ…ˆ—6-'Š
ª–x…Q†T„#ƒ0šF†)Ž‰ŽR"…I•t²*§ Ýq„zŒŒ%2
“3K
¨     )¬ƒ<„Î0ƒyƒv
‚‹Pˆ’0ä‚9Ž†X‚Žþ(‡aL·„\®TŒ‹C
Š
cm5å‚
‡j'”9SS]§‚‡ƒxüL¶L[Æ/
ƒ)§ ‡4ŸV¾l@eÝ‚®ƒH‡~…DŸ3h—‚lem‰‚k
!ƒv”p•-ƒ|
›r…2&:W†n0ŽCT9Q
„+„mšt…!wñj‡•y
eI-Ä[Œ"!‚P,%/$h4“a‰-Í/ŽG…–e ƒ!vƒm6ƒu$*;
v‹‚jƒ›X®V,m„1*3sQwEƒWˆP.ƒq‚lƒC†~ ‡NLA…I‚ŠR‚ÀZ„…!*Q“LŠ ƒv3O‚
„a‚f^  0M`)]fKTS
ƒ0sCZ)
(†9I‚0…gw……?¯=‰“+Œ6ƒ^„C
'„I‚“W‚g‘N‚H       M @ƒG9:A‚gZ{=4cn‡a$Kd`L‚S…D‡A)‚g5‚IT„W
‚qƒ~(„†2)†wQZJWƒ‚f+"8;/s†NCƒlˆa‚I
$ •_)Uk2#~„I‰{‚„g‚VJƒz^5‚(@…"‚wb,…1‚p@
TL>m„0
,Š9…¯i‚!†Z
‡eU¡r‰Z›7ŠƒwG:†8;\‚8#‰p‰dMl˜`‹&š.
™TÕ„z\‚E‚h!vTZA‚G‚9‡]9)=6N
‚d[bGJxE5ƒ!YƒmŽöwk/u‡‚1¾~‚|‡/~‡,IX¯P[R
r!
h,-/h…
‚|6‡3‚<           d{ƒ!vƒm¦^!       8¶l$8Ÿe…gS2; 3sQ
‚VEd.-[-'…gKLÝ*å3j®q
!®„‡jˆ8
GüƒQ#Ÿ%
$¾uŸHh|k
0‚(r‚;~,ƒk‚pTA
m„0—+*nƒ‡rJ¦ŸŸOKq¦SE+‚;¶[ƒ|‰dMl—ƒ|ŸM
‚fž1n

>Z#M5)
N
GVD.Ja,5
VY¦‚at‚‘Nì‚s‡Ø%<czž
H<-AF†'$&!B
675E83”Õ+e…o‡g‚1…  ‚{„=T„$„?
—ŠB™u‡Œ}
Þ_DŽ÷Rò(‚ïN        ü‚hƒ"Ÿ#â
KDdur@…b ‹V
>/V„+r
…DD9„(Œ=&E
""ŸV˜€€€‚q¿0ÀO†Z‚V”M,‡Rƒ7‚(”sƒ;À}‡MO
F„&
.‰P"‚G¹{¸d„!s‰o \‹hL„w
‡yÄoŠ²B ia‡IƒF•W„s‘f«O"£˜DŒ1ˆ „,Š-‹A“D‚YÅ
‚$+—8¬/‡M—/LýNsF‡RpX‚7¶S‚Sˆ
¦ŒK\?‚f§?Ÿ)h‚m—6‡n¶ ‡t»ƒoŸ#2=0proceed‚«C“ÙQss‚R‰!‚g‚H‘9:t+ '%X‡‚'ƒ~„a]ƒH‚ƒƒF‚Q‡4Z/ˆZemZƒ|Aˆ‘i
‚     ‚6xIH‚O†'?

.ƒF/      "J
ƒ
E" …ƒm‡jQ>%R]-
‹(…dƒ_
‹4
+‚WŠ2^„R:$#BR
)Ks> e„80…l7„>I…;‚
DB   ƒ, +akg/„Z(ƒLƒ"‰K‚
.ƒF
ˆ}0‰5„:"‚?&‡:ž?”…}‰Q²Nšzy„~‡H†„_‚†9‚¾™P±7ƒo…l‚p„ ¹m³:‚_‚S„ƒr$(ˆ‚3W‚"!=+N13m+al„ƒ~‚7‹#Œ=#‹Š7ƒX
b‡"–q#‡;‰D†w‹ "„_†j,;˜DQ‚ƒLj
[‚a.‡`Wd59‘4
‹V™o•JF5†B„
‚5
‚k#†0ŠZ\4@›K„L‰K2Z‡#‚S\„
m‚Y
^‹1„DŽ_‡Y‚F…~ƒY…mM‰4‚].‰`ƒFMK8
‚E    E2
f.ia]K)?JMtO‰QxƒVƒ'B ,G‚‚yU‡8/%gNj‚0=”k‚=qO’D‚l‡54F†kŒC„L —~‘‹•8Žvla:GƒK4†GtB1fs-1 J-‚j‚D)
9(%h~>\6'@uƒFHz ƒ4N„NƒG3m…rE‚
h]‚‡C‚$‚„ˆ‹6—‚f£8Tƒ‚n—O„G6ƒ B‰yŽ$‹ž~‹P’‰O„i!"$„-‡{/
‡TQš"^Šn‰ƒ‰“ŒB“v<†T        y‚H5S‚oEn
‡
‚S< ŽGŽ4‘'Š@“-‚$cLN„
ŒC‹a
                Õy
Š
=X35ƒ)‚>B4
‚ 
U(' ‚t3ƒ)Žöw
e!,ƒ
7]ƒ5D
,    
. B+a
/g/U$N 
,:"‡i%    <‚Yƒ`‚<z‡u@
„#HM‚F‡aZ

9fO©3™P±7—‚‡%Y
^
„ƒr$¦k`¶0H—/
`$‡fŠ~#‡;‡.†h‹ ƒQ,;<
^-6O#ÕyIAü|)0‡l§[‚Ÿ;‚(‡n|T{H‡‡~f
.K&
N      2

*ia])
Mt   `V
' 
!Gv‚!$/%
/‚0¶,Æ.‚.‚l‡^
X4F‡eBa4L…G1|4
b—'
P1NMLƒ~3‡b3>]HL—;
‚     —7d‡8—ƒ(t‡….Ÿ3P
R‡enk„G6
‚$B¦}A
v7I      ‚M¦C
K‚%§:`      y‚H5S‚oEn
‡K
{<‡mp f

[cžƒ)R!
                !
‚My=K2

cC&4



!'     
J 3¦‚or‚`3Ž'‚ˆQ‡‚™lˆE…vf[–?<§Y¾z„'livƒ   –c—û6zdid‚X‡~E”üp'Euc
Ž1V‹ˆƒ~{^
„9Vô&ƒh
C¾#wš^ˆ ›/“|
‚(¤7ƒCÜïk—0vˆ‚HílNA”;‚J‚Ï{hÎ     LÕ‚¾JPt
„N…< 2/.E')
.†'†
…sB”˜1‡:ƒd8‘‡=†^?@V^D^D
Ž62F'K23˜&Ê2†„<b(?†7…Cƒ5†|‡aHT„_…Wƒr…9‚o‹$_„–Ú^@—E*j-.NO7Îý‚xú

‚‡¾=}®q
nW‚&Ÿfession‚

U„or‚œiled)h4‰N"…¡ 65…   ?     ƒkÓb†5T¢MÕR R‚Ðt‚„K˜g•ñ„soundli‚ÊT“Ù,gram
‚~+              
C5
‚Q‹0„`    2

`B="#„;ƒC“h]#7‚~!
!!ŸW˜€€€‚r¿2¸‰%
‰E#
‚y
_0—
h.D
''„92„T…w…,8—ƒ)ph;WU9?‚19?   (Mª    ‚‰hŒ|ƒ‡M‡$ '‚!!
1
†ˆ/ž†9„UT†i=Hh…B‚/:"62
…Q
§#B„C
Š*‚sƒ†‚„P†…Œ-‚ƒŒ16…y‰‰J

#F†"m‚I…96JI¥V‚j83#‚&83#…=P†PƒuDF"C^‚[ *l@
I–#£Ki‚‚Y[*?>‚2j‡MRˆW?0(&
ƒ‚>Œo‘C•L‹TL…Fˆ7M„2ƒe„ƒ¢Oˆ'‚ 6]‚]x&       (S>=HK
w‡’†U/‡A‘„(˜e–hŽy‚-I^‰&>NŠtdƒw4ƒB
aIN/‚C$_
‚`‚bx‚

,3I.#‡
‰*…ˆ†9!#b„XƒS†-‚OŠ4.!&@
¨WŒw;“jË.N
*l-ƒ&mR„L h†)‰a„ ;…HT-R + ‡„+F?ŽiS‚šZƒƒW‚¥mƒ=‚
ƒbQŽö00‡j‡`

h‡h,‡i 
'wK
‚YL(Ÿ—0WU?%9?      (
F Q‚‰hŒ|ƒ‡M‡$ '‚!!
1
†ˆ/žM7T$‡Z
]HÝ_—6‡k‡j
„5Mƒ5

3* S13|ŸmÆ-

#‡,fõ‡‚—2?EO      lS
¦‡}6ŸE§
X¾3®q,T+G—4'P
‚$
2„‡gSŸ$
‡g
‚
OP‚ '¾9[|&   (S>=HK
wŸ!
~/‡AP$[4ž‚  ‡h
aIN/
$Î
*l-%mR
h‚',
7;S-

K —F?SH
‡~ ‚in/¦
        0programm      ‚ˆo‹?˜†9
‹Š(‚!j'!“w`-
Š-†&„†ƒ/Œ~…
ƒ4ˆo8†%L‚ƒCŽ‚`!–)‚y
—&·      ž1*„M„‚ 0|‡3=›~;…2y
 ‹fÈr‚Hm^}¥iC¶SDU‚‘1&‡e킧
TT¦!Î,¶&ÎUxŸ e0
O„—‚f‡i&;”õ5qess       ‚++[     ‰
‰n…šB%
—ŠQ&H„m,   „jÍ(ƒ
½“C(†^‰VŒh‹w6Œe

ˆ`¼!„ŠmŽö
ƒ3…gü„KÚ[h…
0ƒ¥nÎ
ƒM¯Ÿ`       D    _handl48Ðbƒ6›O2   ø{SS‚Ï‚       bar‚‚+hibitY¢a‚>
g¾6
ŽA[…“pˆ†:šÍmÜ©h…ý†<    ŸÒ|q¯
Jject
H}wi‚Sa†h<18z3ƒM$
^,ˆJ?
'—X

ƒ-.!Ef.A‚ž>
–<6‰c¦-ÇpƒI‰ƒ…]‚J)1Ÿ1ˆ3‚LKL
¿‚G]‚%„Qówsa‡
§„JÎx.D($

;,M—-=
'ü‚™$¶\YŸnP—‚(
‚Jù!KV¶NuOôz%leptL„/¶OIifer‚ƒ
‘˜xx…mogu‚Œ"min‚…fs‚Bl3…QŽÙC<)
›OtG‡Dƒ+&ƒ/‘·#„á)—C„tGò@ot        
oR‚1ØpW†jZÙ\z†¬‚®Šfpt†‚‰xƒ@?ƒvˆ'
£‚m
@I'‚Lƒ‚o–9…-ñ‚J„›@
QòÎ=I'‚
ƒ—=}Ili‚ŽK   ”
\‚'C‘‰
&C
Y‚‚°X=ne‚·K#gŒr
r‚ƒ‚(‘a‡lø"ŒL ƒ-Vkb‚‘PŸ‚y¶[ouncv’"Xç3†jŽÿP
KXýn;3of‚9ƒ*f    
*M
(&/†[ˆK…zZ‡%:“Ècê/
_     
M
‚¸A5
z
:pagè3—6R
Å0>½‡†œ‚j—L<er‚ŒCŒiÚPli‚E…r‡ •%ðs…Z‚•éƒq‚ïtiŠI
‚#
ƒtI+(IPJ
‚Šy       ç|:†:ƒMhBwƒG     sM3l6x>E
""ŸV˜€€€‚s¿0»‚;'=8z‚‡rÏŸj„:&u…M‚P‚!C°J‡{Šx‚&-DŠ[¨&Ã;‚‡U™C‚ ƒ(¥ q%+"46…'!#]’1
†I½†[»ŠS‚°w®ns„^‚P‚!C$J}Œ‚!¶_qŸ‚sŸ„—v$‡S<Ý”‚
‚`q®(—,
‚   0prophesi‚
‰7ý†ort…iR‹;>“.6…… ‚z_…QŽ;‘,Ž÷t„)„Ùhn9«ibŸp¶‚„ls‚†@
‚KŸj®aÅ        ñK‡“w…€‚%Ó
Erietari‚ƒ?ˆf  ‚&Au
Z]‚#‚L‘_Œ   Šv–

™‚m‘ˆ0A
ƒÌYŸ'2ƃÃ*΄1spect‚‘F•œ7tect7c
ƒ01        

3
      ‚      
#‡Wz‚a'‚5
wq›Z‚)q       ‘„6ƒ@‰0‹RÑJ—j¾f
ÃE"”Š$’*

ˆ|‚xƒ0†#g§f‡"‚°‡N‚¡‚ÝKVôx
‚@"—$¶Z 

(obuf‚
“*‘‰5
C*colnGyƒ3
´0
† )ˆ~„.      ƒi†S
‹T'6Ìv
3«t
‰q…·"0„lZƒuSåL     &6typƒb}2‘bŒW‰<’\‹K¡Z‚Zì 3†‚X‚¨fov†`ÁbŠ;¦[‹=Oý†Û†‡xn‚
‡D«C‹
‡eŠ†&ÆTŠp½t„3ƒk/ž‘ˆPMŸ‚¡w        ‚°1õ-œ:=r†-ƒ2_Â
9`&‹]
]ƒ2…æ-E9`&b‚Žíƒmid
dŠHcŒX†Co-
\ƒƒ=„
<œ    ‰x”%!&i7!‚P@3ƒ@1(*ƒ,‚[
^      Z„3†>|…
 ‰       ‚1S)†;,  ƒ]1„L3V
@œ‚’KU^%-GR`c+‰ƒ™9GƒB>.„>¬>¡
…Yk+47L¯*…x mX†q„\Šu%“\lÅkl4„jz¥3‰jD‡i†m‘!•K‡7„‘3ƒ:-„$‚3G|„5‚2„) ‚|„(T‚
%20en/yL<+4}5…F7†…Z…,¤^ŠƒI ‚he5‡&k†‚,Y”+†~&†uƒ1ˆ@i‡c.„fƒ{
—
:¼jƒ0ƒ$‰k7
:<uN’8ƒbŠw!JA@.%_|‚Q(lˆ]t…<ˆc†w+Ÿ+
ŒA
HF‚-.„(ŒG†w•6–V‘„f
‚G+‡fa
‚3‘Hƒ}„O‚„…q–…AEA.
Z¦fˆ\H-‚M‡%ƒ5 ˆSˆ1‡<‰L„C
‚|ˆU‘S!Šf‚W…6"U2¥k,„AŒZ…f‚`(0_„S†ƒ@Š}‡A©))
3fm‚/…A˜2†[%"‚
Œ‰fZ–2ƒ    ‚1 š
Œ%…+=nfƒ'„iP5ˆ(y'Ül…*ƒ!<%_ƒc#‚4$†ŠAŽ†3…\†zŠ>ƒV4;Z7†F‚@2…o“K<7‰&$š@™Q^!{‰2“NIˆQƒmƒ‰1t!=85!U#Žöw>‡~7U;‡!UGR‡g^c+‡    J0ƒ‡h
.„>‚[Bk+47L>     @‡…V‡iF‰ÅkG0$3
„     D…]†mx
‚{‡E
ƒ:-‡U—‚®m1‡kM‚—2 ‡p$„GƒI   ‚he5‡&kƒJ
Y
h&8>iO‡d,‡k^
Æ!‡j2Æ$
‡hFŸr‡`‡j
+§yŸ=F‚-.‡e'ƒdN‡)?¦fG*—C"?|®B+‡Z$‚*‡hD„AEAR‡dPtGrtH‡]„fJ("UŸ       ƒ:—2
),‡`
‚u ‚+‡.>
E†!…U‡F
‡gdQL‚-‡h‡mL

ƒ*%‚
*   ]        
Vƒ    ¦o‡f;b
Y'c5®i ;‚I‡%ƒ1#‚4$H
        
‚\bžu:
7
…‚$ ‚&t ‚<7
7SP^!‚{
ƒ‚/"" B‡`/Ÿ!t!=85!U#sƒ\@ˆ:"j9ŒÈL†aˆÆo‚®ü‚0ok„   &‰c‚2   A
‚}WD
(“2
!!ŸW˜€€€‚t¿2–d‚?£~¶j¥Œ7%Žþ„¤åQ_‚=†¬Š10prowid‚hŒ"²s;‚'•ù…     ‚'xi6~ˆw
‰e…%Œ;Âc–Zbƒµƒ4m…‘bL#‚B]¦T½…h¾ƒ…#‚B]„Ùudent‚–
ˆy¦U¤L‘˜ŠY„Ù‚Úbesv’6€
+6almv’        FJ€2FJcopyfrom‚ç-ÝÒ_ession‚%2ŸƒI‡Y„.-ƒMw"D‡Y/k
”ÝUƒh
udo
>s~,¨›a…J…*-†‹O”s  ’*•5Š2Ö'
‰MVÜ],“G›a…J…*-†‹O”s  „¢cod‚f•ñƒnym’
€3ize‚,˜Gƒoriasi’€4wC
†b
ŠnŠP,‡A•ºz‚hqlƒ¯W—ÌItmt
>
IÏ1 þ]
        

:ƒ  ‚½L&¾7 ƒ
        

ˆ¦#ychv’.€
5.olog‚‚:t“H€q erodactyl“I€rxt~ÑWƒŒP…9¾]Pƒ
"…9hread‚‡v32
‹Qc¹-
„N ˆ8
™`<•Œ
 ƒŽ
_cond_destroi‚‚=init‚]sign‚@it‚@5wait‚@‚/Š!    equ‚ˆ@       
mutex_destroi‚‚@init‚Ylock‚@
aJt‚@<unlock‚@
mIo‚       „
.-
     ken~Ð1+¾\
‚&elema“J€sr‚
ýy(®`·QÊ|6†i2‹#6ˆ.2ƒü
,ˆ¦$
mapƒ       2’D.ŸQB''r—û".
.B''rs‚‰C•³Oublic_‚d0
‹
†Q
:ƒ…&‚f„B4pAd …X<L‚LI
v\‚`ÚxRFŠ
’ŽZ  (]&d&^1/&W[E;‹3$-D%&4bW&V(
Ö›'‰i\„aˆ
¢}53M@N•~
™R
‚IŠ¢h
„3
ÎnA
 
*<LSInv‡h
KRG8RƒÜQ"!®bŒ    Î΄5liÎ5ŸU
i‚Z89ŠE‚>½g*Ÿ‹…˜
1sh‚†8…‚W‰
0c*fe18q[ŽE„`Œ.†ˆ{Ñ{„+Ia#2¥jƒð—Iƒ†ê,G„h0íCÕ‚ll‡3‰>’EŸ|5DœW”(ŽöxåKw”=~‚߃µ:5å‚#®Znctuat~œ
‚Vô÷Aƒ6ˆ+½R
‚V¾#…"A…ý2g®s)rchas
„~~‚w     T‰i-^T#h#ƒp–W‹I‚ T†òneord‚j*7Œ:‚*7e`
žr‰ƒb•B[‰zå „†|Ž:p”'@ZƒZ„O†1Q‰
À7ƒk
‰D‡N‚`ÀÔB
…g    
••n„F‚sˆX„>Žþp0[§e¶ÐR+PeŒV)‚?‚ò®\®nA
9f8Þ<¦K
‚+    Î'  c—„8‡g
func‚´S¯6CÝX ¯6Cgƒ\†1”3˜>Éz–×&pl‚K
1”—yos*‚GŠ?dŒX…wƒ\J‡}‰1†kt‚r9…US’1,8\
ƒ‚       8‚‚m       $ˆ'
‚m!>‡R->„V‡L–<3AŠb
ÂèŠ(ˆ:‡
¤oï=ƒ‰‚V…u—/t†q‰;„‚`¿w„v
‡0
>¢{J3q5†\„A‡‚n‡}œv‡-‘E
D4†-‘TÁU¦"u),”
†|<ƒ;/¥W«
!…nƒaEƒrL¨% ¢P‹^Š*
‹&ˆ;‡e«=k*š.Dˆ!„!‚=z3‚P=A½V²
x†>„
„^Žþ‚[‚o
|A‡‚ž~ÓMŠ(OTK…‡AWõ_
t4=VŸ3lÆ2œ[‚9~Ÿ xO‡}J¾;Íxs)§2<—5-/Ÿ,m‡‚H„$‡‚I§@¾`'¦W}ÎV‚%‚9Ÿ‚5
<
‚=z3‚P=2OV¶Qxser‚S›h(PGa”Õtn(PGLdata:Dâ…zy-5U
¡^½_j…zh
-   š…Ÿ3ƒHÆuÎ-›k„¿McC‘@NPg24Y”QŠ(O")Še‚${?½[?ã8@‘Pœ`Ž÷‚R‚‘E,ü‚'ÒfÚ‚`¾VcC”KÝ]o‡‚,
downwhereterm‚Á:•ò     ltƒ"ƒ+‘ˆ[
z…      ƒ]<bŠ2‡4Pïz¡4Ÿ>‚lˆ9§Lšq¤zK,:=7:o/a
#E
   
   ;Bƒ        =;lLC‚@+‡(/W
""ŸV˜€€€‚u¿0ª‚‚=…O'*‚,Š‰}…t
…$-£B
Ï!'W†m„
„s³[„‡aš2ˆ~Ÿ0ƒ=
Š[8Ã[…˜Ë1{…[ƒ›t†ƒF‡u„¨n†‚ŽöƒwåNÛ,¡4Ÿ….ÝZ[—;R‡„^˜cB¦q΂0üH®‚B¯ƒÅ|{í0fzÕ&‡e   ƒŸ+Ÿ#tÎ8"®QVƒ‡m—2wƒF‚fL‡ƒŸ 
0putintkei‚$Š=ˆK…$½{…*Œv£Kstrkei‚ìZf‹;szzl˜I#" f‚‚p•Eval‚T”@F
#
”ÝW‚TF
#
m‚w
‘     !tab‚hXŠp-‘=–(ynkT…e„V‚Sƒxc_/-!•ù^$‚mp-!H(T
„V
xfunc‚hŒCº:o•ù…*oython‚
‡^†LŒm
„.ƒ+ƒ+…LH–!á{….‘˜… Toz~á{‚:2B
„¾Z‚:2err‚h‹b„&„8†H‚'•ù^
„I
„8
‚'msg_
-
\¯‚lR
‘0†4]˜Šq
N]tab‚%™1T6iltzrq&Ö4^
ŽX"¨
'
A
        eG $d†o!'(ƒ1½IW¾…Þ 
$¤‚fÆ%
‚n!'(.1ƒŽ!3‚…<8‚c2‡z  ,
5‚Bƒ    v(\
,ŒF•ÒZ  ,5‚B
‚rr:(\
,‰'boxƒ“w—̆ i~µVD¾MyDnxƒ
šS8˜šS
8psgcˆ.&3
¹
M„p2 ù
Že
„ÙE
2 qq‚{
Œ+—Ž
‚:q‚Œ<—Ž‚Kty‚X‡B”üp(Buadrant‚'lif‚~—¥4i‚Z_
2
—
ˆHk  Š…7+Š+‰9?
„D3      o¸u
„OËnŽ8
0
®|¾7
‚1k…€MÛz̓Öƒmtiˆ
J„qn‰R      ¦p„^Œw„†@H’,•k4†h&<K/0†‚"e‡@aW†?c
‚!3‘ˆH$
5        h‚ÚZ&</Ý5G1†aWec
‚ntiti
…$/4      <v>BÜ[‡J·„KÍ9…¯@

ý
‚6um‚ŠK“؈irter‚„'õli‚Œ°si‚mŽø‚keensland‚&LriR.B6';iFF>84"„<„A$„F.„bŠMcˆnƒl‡‡P0&J
‚}
(8‡   .‚uCf
‚D'?a8B%.
e`+†;#nO@N(<L/LJ_P1'|i‚QPGS/…H†{‰~—b|
a       Y)!P"       9I(r
3v p!!ƒ
‚Rp
‚!g
>&W       0'.…Rc%ƒg …L…1H6XCˆ& ‚N<FUˆ*M     
„81ŽˆPˆ(PB&‚`)f23j :A       v…ZY:†
I~†kWƒJƒ‚ƒ0ƒt.‚ŠKˆ p`ƒ'‹ƒl
m#'‚8
&
!"D711?p„I„{?4
‰J(~1H+; „
        |qY/ ([A…)4=R ;…5…9‹‚#2N

U
2*!*"‚„gT$EAD „V ƒ*†o1n)…eB:*‚P{8J‚ƒKZƒu%wƒ(…U…?ˆ5x¦Qk²‚z
\ „h„nJ{N 34P‡4j<0&/-\
"        M&     [:^ks+!".8
(*f(!& p,93
N$N1'16(.    1 *L!,C !ZSn'W,…59<-.
z5tWY&"6Lo
r…9SwG^A„<ƒ1i:P5#&„^;P‚<K"L‡0FJ*S7          (H?‰E†=„$‹m]5$U1!
KR;6       er

7Ab.S‚r
$O,pHG))Šƒ@,BPC

@       *
‡¯{‰= $Jd„CJdjW‡  !M‹‚E=ˆ@…("ŠR„*ƒHƒY±ƒT:•hŒ‚nžDwKH='
 §K0„‡8š
„/‚\ƒ…#    ]‚[8z‚#
.k_†9 k‚_sˆ}2aK†>Œ\h?(D‚7…L„P‚=Yƒ 1ƒ or.bƒ[3ƒ&e‰j†70
I PE4,C"'‚<‚8!V>5&8(oSV2GDe2g]]9ƒ„‚LA*‹Biz„D„?SJ"x‚"Q$„hMƒ ;$  9>!OJc‚W._k35/3
4+C Byk.OXm!‚=a/ZP <ˆMh …1Eƒ%&S‚UT+ U 9K-8‚fc l4
FY
)E„!‚M‹NY!‚MVE
Ie!ƒN(„ah†E…0*‚        ‚iukE0)*"bt6‹Hl: 
)42+<ƒ) " ] ,5

M4"‚>_
""ŸV˜€€€‚v¿0Î
2aj9776‚^o/C$n LP:\,‚
(8K8Cˆ54
        0
&ONF       M;
"
<%ERBESƒ%Y.#0&0Fi‚976En]%13*EK@ ‹ˆ ‚u%6‚2.%
„m6„>$4‡BB*14‚k"M_u$stQ?'O99j‚t%‚&&FP<5 ((: .)              1dzV&<"
@o‚}:
7   *r     ]V)…“'TˆZ1
‚(*aƒ‚jLƒ2Z8")‘vƒs
"ƒ„F…O w‚!y„%ˆXŽHDCL4‚2‚cƒ)Q†D‚fTaXƒm-H‰<‡‚G‚~7‚0Y@m`ƒHIb‚v1U
‡5.‚*„E‡   #‚/6ƒ,j&fCZƒ\’~1MV/†=„Z{(
_4r2BN6
<',L.?(/c#
V

…+,šp†2O…,'6 ]…4‚Z!¨`#
0N-• ‹BŒ5*#S%-‹$\?‘~w+)“Vb@+’&     Œ)†4
x…J†90.…%S
‚
ƒ!t%~‰4v$6M–p!„Y%šI’$‚(ºA‚t‚)ƒt‚1g
ˆ\J<ƒ&#9>‚ŽöƒIz&"PB‡Z
‚^)
12uj :A       N
~v
Y—5IEB/
O‡X$h
m#'&&
D01‚V4
(~1+;(‚,
        4
7/([A)4=R ;‚>-
„G:2N

U
2*!*"‚      ,ƒeT$EAD vV ƒ*‚$1
ˆ)*:*D{8JLx6
%QI
‚8
1ˆ5Ž}¦Qk²‚zK5LI!N 3Pƒj<02/-\
"     M&     [:6.f+!".8
(*f(!& p,93
N$8     N1'16(,     1 L!,C ZSn',…59<-.
z5tWY&"6Lo
r„B9SfG^A‚N‚6i:P5#&b;PEK
L
‚CF*S7         (H?ƒ-ƒi„$lm]5$U1!
KR;6        er

7Ab&Q‚j
$$,pHG))—5).P02

@     *®¯L‡n $JŸ
ƒC,ˆdjW‡       !M(p‚E=ˆ@…("†'„*ƒH‚K‡;‡f7
ŠoŸ%uŸ
wK/='
§
k‡h;Æ&5
‡g
kN—6+he—:h2§       ‚i?(¦ 60
?P,4C"‚<
‚8!>5&8oS2G     D2g‡\u§
‚LA—<SJ"JX‡‡g®obM;$   9>I!1Jc‚:._E5/3
,+C 
yk.OX
!@‚B/…
—06tk80)*
bR6Ÿ( 
)42+<
aj9776Ÿ
5,((8K8—34(
        0
&K(NF   M
"
<%ERBSa"7.#0&0&-i‚976',]%163*EK@‡\5
†     O
%
8‡_
.%
c6ƒ$4‡< *14M"M"Iu$stQJ99j
<$iFPH45     ((: .)              dz$
&<"
o‚6:
      *r     E‡N'b
„ Z1
*aƒDLƒ2ZM)Uv‡Nt—6OO%‡‚]‡[E HDCL4
        
X        
           -Y@m  9b

*  ¶6     (
_46br2BN6
<',&L.?(/c$
V
§
†5‡fh
MJ
0.…%O
‚
!t%~v$6E‚4!]ž{$8ƒX‚N
$‚)^N¦^:
#Ÿ76>‚0query1~“*

¾= 

2~“.                          ¾=$                        _onli‚t†o»j–׆o0žu 
!!ŸW˜€€€‚w¿2¨0query_planner_limit‚žC/)%Tù^’P/)%T_incr‚žwB"ù^“Bolygon‚K„m=
ÉQ    ”—/=â`
‚b    abl‚ƒ ‘þmtoken‚ÿýƒ6styG—0Eion$‰7;‚=
„g‚c
‰!¡,
C‚^      Ÿ     ‡D„^…‡nˆ%P!   ŽI6       Á2ïa½‚p®=…z‡[U„h/õœ#)Úo>õ!Æ4Õl4ÆH-¯_ show‚!ue:…0$ 
+Y
?"‚‡‚c‚}(žO‚2+#tBq"ƒ#%e0T”ÕSl‚2+#tBfick‚Ud-ni…e’[¿ŸI
š4…w0‹bkb      


ƒ$  
’R@Šcœ6윃Ž'Ú„qŒL0kb      


ƒ$  Î„{@‚.Ÿ‚_check(‚œˆ()ƒ*†4
†p¦–"   …"“È‚‚À‚‚Άp‚"        å   book‚.‚Bƒ.Eer‚³iŠd‘‰9$li…#ˆ=ð`‡y„˜;ƒAƒpˆ#"ƒOÏv‚3B‰!™?©+¨ ‰
ƒh‘9†Cƃ
ƒp‡Q{ˆ}
39‰ƒˆb
‡ïb“|‚6‚>Žö^õ‚‚<Œ‚cŸS‚¨‚UˆHü1B   …lŸ&¾CƒŸ$B‚v—+ˆ¾*)¦;§
ƒe‡gfå‚]`ž.escent‚ƒSƒ
œ[…^–°rê1!rk“}
¦<}X5P‡N#‡h|4NÙDV‚¨eƒ†Q‚‘<
|Nt‰;‘ä,…((¥
›D      
†3‰5ˆ†8“t›u«fˆp‚D
Žþn¾h‚},…((¾„\ô§
‚¸Bm‡†0ú‚"„}kôƒ]§ot  V    (
,q
‡+ˆP

'[>Wi
*‰\0"„R*‰h U
4yˆC„»žZ®+…H,ƒ#‰@‚p‡&Œi;"2Pb’Ok‰]'‘
‹  JC‚T?„‘h5’C      …<"
…c
‚oÓn¨4
6ˆbPŒJ#        SI4ƒ:
“ƒ{%˜#‹De"{"<    
‰$D½!   U
4p
'c
„Y¾;‡]
H,0,WÕt$;"2 Ÿ}ˆ<§(—?i„`/5¾Av„h;‚‰P
?΂o%ìt‚~‡hE#    I4ƒ:
ƒ     %‚#‚ea‚]‰7 •£s5 ient"r”‘[.-(/&VŒ}7;?ƒjh•!f
’—JÖ5 „9…oŸ:
g„+Kx„<       ‚‚A ‚%1      '"5

      ==!aJ:7Ye6!M#Z  :F+0T/ ZFI,x
              ^‚;‚,<2pVLJ>-6Bl)…9ˆ2   (‰G†]54L|„AŽe‚
5Ì0           ŒD‡IiŠIŒ8‰6
™I˜ †M„Žþ‚,¶]..-(/&§‚7;?ƒjD›Qh•!f
’—JŸü¾‚ßHglESi
 ¾-%1       '*5

      ==!a   7Ye6   M"        #Z    :&F+0T/ZG",)
         ^‚;&‚,<2pVL>6l)¶‚‚Æ'c
|5LL|‡1Ÿ
5"Q      Ísri¶W‡iZÆ*
ƒL?ôƒ1$
’x2$
’|0‚ŠK3$
’~ace‚™`*
Œ+B‡3–*Š
¤30øm†¼„åb30dian%H$I\ 
$‚‹n”—<jc‚HÚ”Õku‚™=9ƒn*3”Õ‚0i‚ŠH“؈fl‚|•Œ‚2road‚!‚<œs‚‚C|ˆ'‹|‰—. ƒJ,C)X$¡(±a†&>–m„Bi‡XŽ&a5?ýoƒ8„Jˆ]
ž*‡Hˆl'°]„    ƒN—d)m‡
zˆ3Œ2;‹~rŸ¾^‚C
¥#
±F•q±iÜS(†&>–m„Bi‡XŽ&a5‚1)í’7nhüü}QlÆ$#®pk‡l2åDu@¶Wp‡ƒ|¶„&Ÿ3YÎX
<Ý}¶'lf‚T”ÕRm‚…H,.c_6mƒ0'R„;
‡v



K%ƒ"
!!ŸW˜€€€‚x¿2º‚‚e‡_¯‹
“È„=Ó»‚Œ10ramdisk‚Z–þ‚yn‚‚}Š&5…\ŽD     <Ü”‚?—‚mdom‚sGs    ,#‚}j„Sƒ:SBE ƒ]„
"ƒ8d&)Š:
¦
vT
Ö
“VŠ;ƒeO       ˆV‚(‰G   V7(Xƒ„!„0'+b"<!já‚Xƒn
„px
–ZƒFƒ]‘ˆ1
‚CB.C‚Ÿ
—RŒUNS‡jDÆÒt5§ „!‚V0'+1"<!j—^‚5‚X
G
:Ÿ—‚+blobtS/s*%3
–-li‚
‹V‘‰/
g       “#’‹Nƒ4Œ’ e"
‡~#-{> >‚1ˆcš7&Š†u‡6ƒÇHn˜7Ž–)¸ºuÊ)£M„e„
ˆ+
œŽ‚,?‘„6ƒ†(’? …
r
Ÿ
‹
‚`9
‚?Kˆ~‰<ƒqƒ<2.u+'q't9
‚(„n’RÆt„ZŒ.œ8JP1˜6j•`ƒl‰Z™hP‚ZÑE
?I$–$NŸ(7‡]Iq0X
vn
ƒZ7ˆfžtF)¸ºuŸ„L‚(yü#U®h
#?‚™.‡Z
‰+§‚`9ÕKK‡‚=‡ƒl2
u+
q'U9
EucLü~HP1‡ei„‚¶V]‡P¶o‚Jkv*‚   ƒNEƒI‚{xƒ}U•Bt=      V  

‚CRƒ*Q…J   
g¿Š    >…U‘ƒ$8
C5‚0B.z&ƒf“o
*„[?§‚-§lŽþ}‚       
LE-‚{¾=ƒyI4.=   V  

‚6H;QK
3 ƒ  ¾‚(6"ƒ$8
C5‚0B.„èƒ L
*„[?ò\ZXfunc‚
¢XýŒ#tabl‚œK‚R
ý†‚R
pid‚ˆR|li‚¸<§Dñ—^0†ãure‰ªaO?.Ž</œo‚      ^     .¦AT#šY…Mž/•4±
ƒ]ƒTŒ8ƒP/†'p      ‚V…X‹_„+‡"ŠU-eœ–6?ùt,—‚        „#K"‚¨¾DbÂ"
‚T‚.‚_M—„Æ$dK…OÕ‚W®„a¶„/TŸr{
œQ@„k0
‚m
        t     
        


      ƒ9
         ‚=1


r
'2¥
EU,xY&% B21t6!–       Ž/h
‚j
+'O‰!¥qƒ()  
ƒ(N=H@04<¥j
¶aˆ§&0
c
        f 
        

y
    ‚!
             ‚3&
w


k
 +õ
‚ ŒL
)% B1t6!»C
C/h—5

¶V$'O¶]
Re
Züq:)Æ'
H‡gÝc
-(spberri‚‹Y—†tey…0&

‚w4¸8A—0&ò8,‡herƒh
–
¦X*‚‹W‘1
uC3,$tƒa
`‚HƒO’v
†#‚˜'‚n†o`„a
‘ƒ|…N‚Lƒ3‚‚k'‡%„I‡S0µ?
u‚‡7u‹
5ˆ
‚       ‚^)`–{†H„t…”ˆ¹6*N†9Sƒd‘+Œm…Z;Ÿ,†)‚V&‹n
ƒ$ ‡c‚kš]º
´…K†e‚t„7›P†`„zˆO„-†Gƒ(†U         …/°£b±smn   \<£ˆU‚6™6‡["„^Š?3š9„wz†_+†3…˜V‰Ž÷=—(#‡PsFX§[ü9—ƒT\QŸ¶W
‚kjbŸg‰…yŸƒ\&®p)§‡e
'í}C¶XcŸƒi‡ipR‡{* 9ŒƒU—H6„
&Z‡, ®‚{=Ÿ'‡d%'Ÿ&‡iH   ¦ƒ(C݇‡‡‚‡
F<—„5‡-6‚!M1G„b3ƒQ-zy+k3^V        wio‚W<Œ:¦@S8”ôR:‚ïS‡w
qS8nal‚‰)…ìT…ˆ5Dw‰k‚u‡z–'

¯†Qš
„
‚ŸC
“/‚!   
ƒkS  ¬M¦Q      
‚;*„=µ…Î3FÍz§…VŸ#ƒ†N-âIlÆ*
MSÆ-¾H>‚"…‚|-‚G„1;‡r/ 
""ŸV˜€€€‚y¿0¼—æ3‡vJ‡UO΃0rawdata‚rƒjƒu/„¬LFX–ÇL‚/s„r
F.buŽk<z

e>;  
9
6%
54hZ $A-C&+%<,<#\>
I2*/Ja/,6!!&'A[>‚¹/Æ>

e>;  9
6%
54hZ $4-C&+%<,<#\ z
I2*/a/*,66!&'A[>®$„_—ozÆ!
ozcontrolJ„a‚r*Xl     #C1>'=0
kVBÆK*Xl       C1>'=0?
kVBdeltaŽG \,ˆRÆ„e    \,"rowid$ˆ>-l †
k9Æ‚     -l     
†>
k9stat
›:Æv:c~Ðt{        
žsGþ[
'
,ƒv6+…_;‚QXeP
Ž&O    9Su        ƒ<

4
ƒ^3
    †?2‹I        
     
                     


                         
        


                        

                          A      †9Q½‚i‚U 
‡E„LG¶oƒ
'
ƒ-E³Wƒ
 ‚3
Æ#qÚ_0h 
     
                     


                         
        


                        

                          A      ŒOSQ2‚T
•H    ”ÝW
ƒ\    e‚†+ŠE‘˜}
…Ldy…"$—6l$bm‚+…‡1
‚m
se‚$R.cÚ       8e](†Z  „b’á7ó‚AË:'¦r
†‹2
†0Åv½yŸÌiŸ6"‚A„éƒZ

¾;6‚‘…>‡2ach‡…†qh.&
=
…tƒ)†       
Ác!Ð&¾ƒDï"‘  

Ÿ z„ž
    ™)™W4„A“=±3˜f"…F ”%„#ˆ(ˆ-Œ
‰
Ÿ.ƒF’i\‚?Žö~\‚`„nÆW!Ÿ
»X¾Ÿ5~üe
“-z‚y>
U    ‚ÀƒoÆ‚&¶‚~³M_§L΃ÎvÎ\Dabl‚×nù“)quir‚œe“ÙdKƒT„ˆ)‹QŽ
†/—+,  Q   3,k1b…PŒC(‚u
„d
     j
"P4      @'+6<%
:S
&
hY‚)2„"‚    7$
^!‚
-…V}G„DOƒVe{‚g?       <RG k"‡"+R>ŠFm
7*
5PP/84‚s\NS‚,C‚lT†       ?‚$x„=‚Y‘@
ƒ"
9Žg     
‘p,‚7‡#$¥$l2„}ƒ$ˆIƒ4¹)ƒBsŠp‚{<ƒVC.%
4

              
J†Y2“!ŠS       %£5
‚C_„Z=SŸ@‚‡%4šH§„6††t-S†ˆv„k˜]\S  …d„^.NQ  :O:‚5ŠEs•9
„a‡‹uˆL‡yZfJ4`$2I‰,‰>…+‚=|4#Š
G"q6„&m
‰_g(…Mˆufc‡yƒ
sˆdIxb‰>
 4‚Y#ƒhy*„9'7cY‚</!/†Xƒ;9(^‚$*ˆ!‚@'       l)G^‚W`,|……”P      „
4‚9&ƒ1†Dƒ*wƒsL(Ž*Ku3QŠˆuA"‘D>š2A›&”†~„d‹`ˆZH‚Ov&%„!($"<([‚<ƒ[K…&&
~  O%-ƒ']4‰(ˆj„Uq
„;(^‡4OB„*x‡[K]*–16:yj…HB‡3ŒS„-˜]Š?‚Š:u
 H3†Zm\"YeG‚5[2$"D†ƒ/`…[\  „":Aˆd‚t
b
"-ƒ&gN Q#ƒ^,#>*„LOj-‚!†9-I‹UC,$4Q\*„FPƒZŸ6@Š}t„–=ƒ3p‚h(r‡cn•R„x9b„,?ƒqWˆD‚.‹Y=G_„r …+’c‡™X“N„?
e…$†C‰&%j…!+…?Œ&
‚t…ƒ[xx|*,<ƒ[‚„S:
RƒX†M„„3cc@ZNd‚&
2Vƒ{1;#D'+9+0$ƒ?
-L2Q
®C%Zƒ9%D‚?
‚$„X†‚F]»up(‚&‡wŠu4 
l=‚-ˆKƒ=.   [dƒU\ŽöwN/84>NS‚UC‚lT   ?
‚x=g‡‡d<‡h§ „{‡<lY
HU>H‡ƒ>
†?‚O‡ee

.
4$
              

]Y@†pŠS   %£5
‚C_„Z=SŸ@Ÿ8‰
8†
-S‚ZI     Õ§‚_
‡(ƒS4
3    5W#1…)fJ4`$2IŸ#8Æ'‡a.Æ(
'Ÿ#V‡cIx
A‚xd$9ƒC"‚d
""ŸV˜€€€‚z¿0   µ%“…‚)—6;®o
X‡gP9(‡hB*ˆ!w'      )(^Y=,sH   &¦d
2‚9—H6A®wJ‡f[‡e

AM(H‡Z
HvŸ#  ‡ch2q—0Y(OB—5D1—K
*‡‚=‡b
8yjFB ‚B
…‚Zu
‡E
3‡[
\M&
MB‡h|
;     
‚>E2‚t
b
"-
‚4g\N‡X#,#>K,$4YL
„F   h
5@   ,h+žX.
b‡hp‡o0‡‚~_W§
"O‰&%j…!‡b)OL‡z
W‡cƒ[
ƒ+
kx/,<$‚

RCƒ
ccjcN—}

Vƒ/1;#.$+9+$
-2Q‡u
…
%?p%
e
?
#\
V]+#(%ƒH4 
lžvyPd¦rdƒU\0read_uncommit‚…}'Y2-‹†q¼{Í
'‡Š†q2abl†…q72†%
†?Ži–    ·Š‰@2Žp¨I]ˆ6
‡E
’}
„+
G–7«j¢I‰l\„%
‰Z
—(¨nu@‚Ž÷]„…"G
Æ$,§‚}§—>΂ï %2)³H
X
¤‚Dcooki‚åYÝÑerC†X9[]:.&#)=PD
„+%(
(/2a†]†})$G…B’<Súkƒjª6
Š    ‚L‡)…
ˆ     ƒh‚)‚)E‚
‰…U}"Dn
‚e.)   ,. ƒs‘‚#†   cE—v‘I–N˜mn‚Þ9" &ƒQ‰r
‚‹+
$ëB'Q
jžrŽöB
~&%(
(/2aaD‚0)$G®c<—‚&‡ƒf—•hIY¶OÎ
ŒQ;Ú‡/   [œ{¾A6cEŸ'
Ÿ…2Z¾<M§Dr9" &®õB
Q'Q
+fil‚r
‚s .9;žK‘J–ÇU„p
#9;r     iH'‚>q‚Y8%†lÊ0‹9b(?‹{ƒ2†|\‚¶‰J†H7{»jñi…€R”1Bli%D‚†—†Mlin‚K†\’Ó|‚¡>ock‚
†@ÝñronlinccƒY

cƒ¡M‰6‡L
…Âzˆƒ  ƒo‹F‚$? šµ5–×N$Ý4`‰?‚$? —:e‚
y_cantinit;8‚…]—µ\lock;5‚E…`‹l
—µ_‹V
dbmov;7‚…c—µbirectori;9‚…f—µe
recoveri;4‚E…i‰A
—µh‰4
ollback;6‚E…l
—µk
l‰—%„       ‰[ˆƒN/ƒW8ƒx’X
R
!2%4L!meZ‡Z‚[I…™xk
utaDibZ&J
?+HR‚8"
$          ?P<„F# 'S3²f‚=¿
‹2E"œb‹<¨y‘;ƒa‡-$_

‚$(‚"‹BÒ]°Y   ‹G‚‹l„"‡K†e„a™}…'z‹‰w‘<
*2%‚J…c…>
©^  †g‹
‚<
6’k†|rLŒBÂ-”‡G…
ƒ(“u¤ fÎr#hŒŒ')‚X“\\–iÀ|¡gƒkŽ÷[‡‚—9!92OXK
6D$9bZ&u
   H:/"
$      
+    

P<# '3‡q

‚=T‡=
PE—="ˆ‹<¨y‘;ƒa‡-H 

(S`

    Š/‡I
,‚Y3l‚9Ÿ…-¶Y2eQŽ
…'zSN*R79
*2Ÿ  ³]—ƒyÎQ‡g4=ü}l7‚v¾A)„\¶†A—‚‡^d##.BýÆ‚U
N—2‡sJ.6Ÿz¦‚kaffin‚æ=ÝÑobas‚.ƒuƒ.ign‚mti¢7‚”gŠX Bm“Ð!Ò‚V®ˆgz‰d      “Q‘&"
Â9
±C=¥pOÆ3Dí"7„É…‚×—     Ÿ
)li†lŠ$‹>ƒj‚M
‚w/Ža†‚sƒV‹$‡M‡<…8þ1j…yƒbŠkˆ_…
p´>xˆ<‡%ƒbT–
`„‚Q„_‘2˜ŽJ‚C‰$$v†XƒhšD‚;‡%ŒZIT—T§„}›_…Wž"„"‘8Š‹t¨DŽx‹&…6‚(ŒˆgŠ!’l‡MM‚„65$!$('‡c:_
""ŸV˜€€€‚{¿0-†‚ *¨6ˆW‰)Œ”_æ     ª |•i‹SŠ*—7—Fˆ†|/Ÿ„\O+‚¦@‚X‚[‡‚OÕt~——Ty)ƒ‚zÃ#‡iS§ƒq§
‚C
‡^E
esü‚§hÕ†G;—„a‡‚)‚.‡Y<{®‚Õˆ‡:Æ4kYŸN‚,NŸ0realloc&$V5 [$D
*xa(`è‰DÏ¢TVeˆJ(ƒˆj‰)ÜÓIœ
‚D”
†¼‚V¶S
ƒ64&‚c*\;[¤ùarraiƒ‰Z&"5—ëU&"5real‚bí#tab‚hµf>•ùj>ppear‚’I
’û;rrangƒÁ`—ûson…3ƒ„]ŒS¥;ƒ;‹†Y‹x+„Y
U…S‡4ƒJ
ˆ4Z„n—‡TÄ„9ŒKÁ_ƒ„$‡y
ˆsJ”2̃ŒX„)|ˆ_ˆ        „^6ŒŽ7ƒ(´1ŽUŠ4
–O!ƒ_‡‚˜1I…_[
…-;„'†u*"ƒ40~I—Py”“N‰H„p8ƒ.Dƒ)’Œrƒ7¢˜P…'ƒ‚EŒS‚?†DŒi„‡n|„\‚-\‚.:…Ej…q‡.C„h7Ž ¾…5˜=‚,ˆOƒNˆ[l=¸$„‹k‘ƒX‰W‚‹X.
 qÈŠN )P!ä"ƒ
3‚ƒY†IjŸ#0—<N„‚‡ƒ{W§%!…RˆI‚ }ÝK—K‡‚C.SDK?¾>§
œE®q
„";‡‚<_‚"‡^R0~IYQ‚
rü\>!pŸ)-—M#—dN
\
%:„:Ÿ/‚qƒ„k
%7—2‡ƒx‚‡ZpFIGŸM‡lj§)vt
i®7dŸ>Ÿ ƒAŸu?P!…V‚‚>semblƒ°—ÌJ$ttach‹«Zempt‚balanc‚‡s‚%h];Yw%_!•>&3       ¡…Tˆf :oot!Š}ª*—h‚1Ž÷
6„áG=und‚Šuild  C†agÍM"àK†z˜5™j"‡s‹½d‡AI¶lˆLH…Ÿ_
”<
ƒ"¦{mt?3ŠEüo^st‚7’û"tt‚ˆOí&     call4‹kUŠ\¡kš8‚3‰
’~

ì-;Uƒ½#i®}/4³77Î…Jstƒ     -—û’Leiv„;ˆvƒ-«H;‡ƒ
‚eŠ0‡

“(‚L‡?B       <4ˆÇW|
i&†i…@ˆd…*
…-LÐY„u;†F)‚‘_‚°hxL)ü&”,&5qŸÃN+nt‚‚
+ƒ>_‘j%l:‚†~*d    z  A#>?)H‡0
(‚R
‡L‚M‰ …4…;ƒNŒ~¢˜uƒ-……HŠ„8 …Dƒ—k’tŒW
‹0<„†Ž`ƒj^Ÿ+…*‚gƒ8ˆ"<±
„V‡XÀ#mŒx—[‘}Šˆx„*šZ…~¸OŠ#
”)‚ »DƒUŸ.›/       S       •tƒ+;#
‰yk‰`T‡Fš0‚Bƒ†G
O‚x¶\6˜uƒ-……HŸ†g
 ü‚GK
G09‚‘‚g®oVˆ"
@‚ž      ‡m9õ([—.n¶V‚…~ŸhO?å‚A/¦‚‡d
;:
Y®¶Y  `Ÿbip‚Z-•Œ8(i‚‹X•êflaimM†9‹]‚‚t
¬!©e‹1‹Í}‚¸‚߆MâD4Mtno‚¸‡^(iœb‡\‚od‚‹%>…
Y4“š>:‚        J4gnƒ1¡ƒ5
$„CŒpˆ+ƒC"‰Îwa<¦-ž‰F…%„L(
Ï^›x‹G‚Xƒ.
ƒ7„      …U
`£u
Q…t7‘j
ÂXN
Ði(†"‚Oƒ
   £Oµ;™v„=)–Ÿ‡ƒO¾‚/a<
…]
@‡HZÕ‚;1Ÿ%
‹[aB‡dX‚ïQÆåFh4Ÿ„6—M
N‡s
!(0""œ#Æ‚-‚|Ÿ(¾'mmendlƒ W1kˆS’2
k
6p-[8ƒ1!Z<‚<†q   
P„ƒƒQ˜
ƒ&%"!‡|
:6fw…;^1ƒN
""ŸV˜€€€‚|¿0µ9z[‡I0
…J
)#åw™f…æ&ƒ„[ƒ-CK‚BƒŽ¾O. …9‚$‡|‚\ƒ.m„mƒx„RŽyƒ6„‰,PÊd.ŽS
‡     r‹d‚*w&ƒeh•B
=‚rG‚%t‡
0]‚
‚…†v+„b…ƒA)+‚^e>9†U‚G& ‰o›!¤,¢“r‡<µ\„‹Š¬e‰t      ÄC&K4;Y9a“…ˆa
›>„BŽöƒO‡H
9§m§
Ñ)™fŸ‚9WNübI‚BƒˆbŽ]§. ‡Õy¾;k®s{í<üYy¶VU& IU‚!¶>Ÿ*‡ƒn݇<+@V
V®ÆD#K4;Y
^—J‡dlo¯l      0recompil…JT
ƒJ{f„š¢r¥`‹J     
“;  ˆ`‚ÞK•G“%°vøŽ"’\(      *„É_XŸ‡ress‚nfigur‚
1,structŠ\ø ‘H„‚iñ™_‡Þ,
¯ ªRÅp…7½M_ƒ¼zB-ƒµƒ
‚_œH®>rd„
†;“r@’7

O,     8`):‚g
’I)
$V*j4„ar >˜M–Ly”¸A
‚!&+~‰kCˆD‰{C 
…v^#‹V‰[OŽz‚/ V9
$Y…>c†@%7dBT
‡hC!/-x
BŽj‡"ýM‚'ƒ     ‡a)ˆf4„M‚~ƒb
¸J@„†"Kv‚A‚/‚SXO
”/"VZ‚g‚6.79‡(ztB$‚`
‹ekZ‡9ƒ(D    ’+J†.‡&†

‡O‚ 
aƒ^,#‚)ƒE‚:,*0‚^%<
‡n(†x†?6”…OA(>!ŠjŒ”oG“j‚;•Sƒ
;‡-§p‚x@“O…q‚_—’6 ƒ/D wG  lZ„
GŒK
87/A“h*‚)†ƒ:„{'‚x#B„@J\‚ 7\d!7ƒU–
Œ;`+Q‹&8
0‹.Ù$hy,(•y:
Ž~Š=†Z †GS‚$5‚t$OJ‚tE:Ž„<†] Q39~o…0ƒJƒr„k#‚ŽövgÆ  M

!y  V
&C      
‚‡-C—=‹6
…v^#‹V‰[OŽz‚/ V9
$Y…>c†@%7dBT
‡hC!/-x
BSC F‚'ƒ  ücŽ!@„!¾>/ŸK§
S„f
$ƒ(ÕzI7¾3t¾._‚‡f  Kr9,*0R%—K(å@„A(>!…C
„—8
{G
8¾6     
—/v
;-G‚)    ‚¦‡UMD wG        9¾D
‚U(‚b:ŸgQtC
–t"ES‚$5S$OB:0:‚e[Wƒ]   Q39o_ursv
)

@>D
¢#ƒb…M       fv…U k“,„C%g@6oXP<
‚
pC†}Äy
O±4ˆN‰i‹eƒFžq6V*ˆz¦a\
Q/
‡L„Q5‰{Ž÷!#‚‘0$Ÿ*     ÒuXP<      
p;Ÿ!'O¾b#ǃcŒMbA„^‰ 6V—4
ƒg&\
QŸ
&Q.Ÿ@er‚ƒ_Œ•£„_config‚‡’û&6    errcod‚‡Z’ûmsg‚‡\’û      finish‚‡`’û        init‚7
†n’û
_sql‚7
†p’û     run‚‡:’û&b        step‚7
‡0’û@i„        „0¡T
™o?k.RmD##,E;,O>‚$ ˜kŠ0)—lŠa†0O4†1ƒˆ.‡
‘jL#E]†a%0h ?ˆIS•    ™@   J    ‡2„mˆ?–/ 1:Ž÷
K
„ƒBIcD##=,=Ýh)  34O4Â|
„1ví0P§)‚"L#E]
‚f%0h ?„‰VÆ$IŸ1`z1:reat

Q&‹®
ÔKM‹q‰]‚Cn„    ˜UË(½ƒ»2
„¢|‚‰‚F§ƒq¯ƒ'uit‚‡Z#‚S‚tangl‚C
Œi
Š #“Ø+*¾"¾4ular‚K
z‘”—&x$¾6zur‚”ts  „?„u N"
*@)       
#%.6

XD+/5^8+(
c
2
‚:'5tr>ƒ„?
_(#‚iP‚%.ŠÏRŠ-–ˆ"‚5ƒ
ˆ  •3…‹~–$
‹H$

a¥>‚L
6
Œf»M:.t—|ªl#´
Ä;;
‹
»,C‡5Ü@Å    Š-§?õ‰@ŸŠsŸ„v
‹,ƒ(‚w|:&
!!ŸW˜€€€‚}¿2ª/$’ˆ^ò
Úi!‡f{#—„wåj;ô~)80recursive_trigg‚
ŽoJ
É^«†r½@(•Ú‚ü†r3(
ct‚…‹|ƒ&ycl–wŽø)d†R
!–g…€idit‚ˆb7—lìkƒ-Oefinx…t…qsign‚‚#)
ˆG
•ÒQ
hat‚.ƒ4ƒ.4f )irect†V¦X     
‡“.‹‰|‘\D‚7¬Ü’
Æ"
„bõ‡}„Ñaâ„i:o‚‚
‘]™=#Ph1qs&8 ,‚
P)
‚Z
nƒ
…F(stackƒ†Q*fHC‚xrawƒ‰Onƒ‰iuc

…[
Q:‚E‹x‚’:ˆx‚JƒD‡;"‰hçO<ˆ+*„L0È6•H„dˆB‚4b•^†‡'…+‡…z(‚       ‚T1’N†>ƒ+‹*ŠmŽ`§A…‚D™
„_4‚$‚}Š/‚3‡ †
A
‚&!†]@¡
{U7£‘E-"‚‚tŠ9
‘N‚)U0“…˜<
‚…K“%6
&^Œ5¸AlŒe| „ˆ7Ž ‡  u„P+„K”YŽþƒ!—5H#§&  ‚#‚/5‚*7®r
0
f*-
‚QB
‚     b†|0Mí.$‚T†hiƒ+‹*
      Ž`bk        {®
Î
m4ýzÆ"uC7‡K‡m
i"F2üeH‚)0…ü—?0‡l
‚ANk6¶@
$¯F/J4”24lE…aƒ_t‚‚g‚Pˆ+TçD†dÁE
’9w•Ò|Ÿ5òundpèlŒ"‘
°q>!‚z‚@ŽníJ2ƒÔg‡‰¾uâE
„5>‚y‚9ziert‚ˆemphas‚žE‘‰‚nabl‹Mter ranc‚V’†S      tƒ‚
Œ   .ˆe9ƒTJƒ ÜZ9Ë=Ý`Gvalu˜kxaminƒ…/fy„|!>ƒ%—
F!>actor‚¢        @‡‘"© 
ù–er
‚g+Q.!!‚)„@
LU‚"   ‚
…O”‚:‡"Š>7’6‚:2‚9Š1vƒD
‚h <<..>‚V–@‚ˆc L$†uCy      
D+i+‰/JP’=<7‡N#„9c%TP ·_’t%•0–&‚x’‡OV6‚&E`ƒ>ž¤£†oFJF.|8Ž5ƒX,‚Q
y<Žm†-ž>œH“L•9•(w‚r

‰X$„d»   h    #"8/B"%B'jj.zc7;d‚>Yb7lOSm# Qe`55<]«,ŠŠQŠwŸ7+ƒ?!ž\ƒS–M…ˆsF–
’m1AY/‚–‰.‡1ƒI¦A
IŒ}„‰[†[•†ofƒ ‚b>A(<„9‚+=       ‚bKƒ'„_u‚^CB8‚%œo“ƒO‡z¢N—ƒ
v'
’yŸc;”1       

W‡F
"±Ž'5`·FŒ_‘|Ž®vŠ      ƒdcŽöy!®L]2ON‡„

.%        w‡C‚k—/E**4¤£†oFJF—/‡„Nƒ+,‚Q
3Š9A‚F0ƒ…‡‡I
‚‚‡]ÎhTr   f0\Š¾;
+®o Ë„l‡‚Q,‡ƒDg‡i*—=.„/‡_"e ‚b>A(<$s‚+=      ‚b6‚Z‚Uu‚^BB8‚%—9
‚   
pƒO‡\a     
…N‚\¾AC'Ÿ1=;V 
®ŸE§G—x‡mU*

ƒPL_¶1Henc†C‚7„‚A‚.
†(ˆJˆh;‰:ÄN-x„I¿‹UÎg…€N
‡.;…%—N{‡^a«bŸ¶ti‚Gvž>“÷utâƒVr‚‹~–×dinƒ;“       A´_“e‚!Žÿ„Ñ5Æ4<¾?Ÿ#lect‡'‚Gˆ       ‚z‰QÌ=„B¥u††Z–<§¾†`³JG„ªS³‚x‚sormat‚˜V—ƒf\‡È‚6reshƒˆ.%!5us‚ˆ@‹R‚P“È‚&„ƒ_žy®<g‚6¡S‹EŒW‹…
sª
ÝX6‹EŒW‹…
sª
ard …Z :„z²Z’z•C
B‘i
™3  ˜H‚‚N‚<›i      ’`²Uƒ&…; Œ[Ïq
“`½$
„z
‚®Ez‚~Ý8
‚N       ®~RƒÔ5«lPí7ZÆ‚HÍFL!%(nA
†=Jq
T!ŠUM}#;@
!!ŸW˜€€€‚~¿2±0regardless     
ƒ     0ƒ[‚R‹}0”v/k„q@|'`
p†Œ[†~]1ˆ?‡X‹2’hŠR‚W"Ø=‹%¾BÀp
]‚M„^†^†XG…=…gŠQaˆƒ²m™X‘‡l
b™r3M
„
&d
¡ X’†zĈN•‰
‡,¬‘p‡G†&és‡>c µ;3R"ˆF/EO©tÀpG‚Eƒ„‡lõƒe‚×&ˆ„;ü‚Kƒ.Z¦~{3MŸ=d—X‡„g‚.üz4P‚å`‡kW‡qEy—ƒ'‡u|I¶*aener‘Db
ƒ2Ôxô‚R‡ØZ-xp      „A‚‰p‚F
‚D©J
;/žwË-•ù;„`
;/‚pÒI5)ion
Œ-'‚‡X —O$0_‚‚F¿
¼¢b''!‚S;‚K.›ƒ”Õ7B$0‚‚‚‚
[£wˆ(''!‚S;‚K.Ÿ.st`/
7


       
Y(<        5bUJj!qK‚4„
^       $!7
D]Y
Q       ‘0–uˆTEN,|G‚98‚5„h
Ž`ž&…!É‚N)‹DƒŽ@‰G„„|ƒI‚5$@‹    

 
(
>K@g~-4d:?3            _i$?„@      {E‚0Sl  kd
j
KfD?:
FC6&    ‚       C")-M
A+b   6{
2jw!              :=+C        #
R   qZ„m ‚1*ƒXO*X5

!
B    N9
%T3 XA=
YFJFeF…#x[%5M

   ƒ<)x&OWrm48>
Ò©S
8{s¡E
ˆ5#Š$;L•‰l¥Ta„i-d&†,l7'K‚s–Xƒo‚Sˆ9!*FV„~‚=‚ƒ(“K
„A˜a‚Un‚¥ 
×?‚?ƒEˆa‹"‚qk‚ƒMƒl‚'

“k¨hƒ^„¤x†l‚,*Žu"ˆ#‚2 );?/Ž÷d®q'‡W
…)9=)UD(‡„^
y—2,‚ 
5$@„J 

 
(
>K@g~-4d:?3            _i$?„@      {E‚0Sl  kd
j
KfD?:
FC6&    ‚       C")-M
A+b   6{
2jw!              :=+C        #
R   qZ„m ‚1*ƒXO*X5

!
B    N9
%T3 XA=
YFJFeF…#x[%5M

   ƒ<)x&OWrm48>
Ÿ(!
8{s
‰Wü‚f®l®Ò,B6ÕCÖ
va‚;>‚
„¾8"4
Y—ƒ<¾;
,Fƒ$|Î     BWh"
݉Ղ=X );2/   er_sumint‚§-”å„    token‚þRý‚|rl5‘i‚Ég“Ù!?ress‚*ux
mz™W3„_"¢)ŸT”#‹
†UŽ|ncGƒIÜí«h+1„É‚m
||nW«Eular–[]
7…<…V‹m      §,ƒƒ
€5…Œ„ƒ=ăy†y„'Ÿ‡†8ƒ2ŸŽkj“Y
Ë_Žö&Æ8G‡ƒ‡j&¯Q„šv
¾cŸ —7‚@ü@¾B
aƒ2¶XeÎ.li‚?<‘;u„KFa!%Lƒ   5},p‚
ir^{oh8_        „t‚*w…‚*„oƒ‚
ƒ'„.'‚u„d‡
)`‚illi‚4†&„W
ƒ ç0mplement‚Úr^‚   •ñ`\ŒQ5ndex
;{„B       )!%# éX
ÒC‘…']…b‚nv“>üüm
~ò[¤wƒ¥e¾:<itiYoçmÏÜÓ† sertƒ½q—ÌRvtat‚Þ
troduc‚›…‘‰?0vest‚‹zuschnuppern‚ˆ-ter‚›Jž_•›‚SjecthBmˆ>
‹0$†p‡šj‚Q‡ìƒ=ƒÜ‚$‡J0‚™-.I+l‚x„     …WTˆ!ŒH
„op£p†zãLY‰r‚
´f…rZ….'‡>Ž      ‹’ ‹m0
“

…#G
4¨i¢Q

„Q*—7ˆs¬k¬mŒ530P‚<   8¼:‰V“{CŽö„Z‡‚Dý‰`1n‡õ      Š=+KõX
'‚ׂK/0ÕTG—ƒŸBåL#,
Q—$‚L0P‚   U—O3'-ai'c‰m„;…$c‚35I„7ˆ# ‚K$´Aœ$ƒ‘=;š_—{ Ž—)…L›†~ƒ
‚iy‚>   …†‚ ‰?‚3
‡<
1…„f.N      
‹6|V*-$
pƒ,
""ŸV˜€€€‚¿0¼‚‘}˜T"p¾"
‹j_ƒI       
‚_Ì|®q…r‚K$‚‚
¦lbÕx…J;*„6Òv5„p+"‡hƶWo—„„.í!
0relationshipÊ_1
…3‚S–G›}E4½q<†”„"‡_4x•O…K†,§Ð/ƒ²2Ž/„     Ž÷##„á‚™ƒ‡]?      ‡%¾55eas†!„C†S‚/
†6…
Se6)    6-;Y       
žd}
IƒI‚a „
6   Z<‚@    :

K‚!nn‚=c-<kc      ‚
2&e‰iq
‚K
„!
‚$ 3…bEƒ9
›B–
…a.S‚‚<}Ñg#! ‰"Ç+Ÿ@…#‡…E„JwŠ|9I Œ3*M\ƒ&S†‚G}(Œ(¦,29.‚ƒs‹U‘'…8ƒ†„]!'…F>B‚0jKc‰B‰=‚o„B‹fˆj‰/ˆQ<z‚N
…Xr
ƒhƒUdE=(
6  a2u!/,)'
+
>    *(S)$Vy
#64           (l$322
"#
*5
;-9=    X%$M
G.@l3       ,*„h‚…WH"–<#…)ŠyŽc,LƒCU2RK©t…O-!I 3 



:,

1
M:'#
E
&}B52Y`;;)WD
3#S+:NNG5{
&
 2#Eo!ck7%rh!._N$
G%Z
-/@{x7d„4TW=;"KP|Q>*%F5f#   Jy13(YI%L%850+GlqaS <!^HL-7(?f(>WHV2-;‚9K(s )h‚^-A'MhvJ&
'

S
9Q#zi%F‚4
      
‚y" 
„pˆ‚k‰Q
“     Q…;uG…Fx…iŽŒ}4R4¤†
n‚'”Azˆ2?—
ˆy/.XŒ
Š6‰H•h/,†$‚‹L†v
…KUŠ’9a#‚„y
Š
$”m¬Fƒ       ‚bŒ9ˆ$-Œ„/„Mˆ&º”A‹     ”„-„[ƒaŽ÷‡‚ÎLP`t">Ñg#! ‰"ŸN‡‚gÕl@—M\S
x‡`5ˆ)29.‚ƒs‚hJE d*Z5>B[‡C
j
3K‡f`.ˆ-‚oN¤hŸNíz#)
u
,L¶2CÆ1H"
      I;"     
        —+sO—:
-uG„CŸƒ
‡ƒx4—3P‡†
… 
~/TD§=j¦X$
    o
E/,c‚*/v¦‡X$#‡d
.

}‡^
$§z¶‚`
2-sG^:‚u      DŸBe_memori 'Y
µs‚-£%†NùK
‹Jlog‚”Creg‚æpÝÒ"v‚4)RƒH“N¬%‚%–kÑ,04:ay"k!‚   '‚…kQœ:
…OT½<
ƒDƒ#¾
I‚%Œi@&04:ay"k!‚    '‚‚×85‚¡!Ý„1i…
"„KCœ-Š/–‰,Iabl‚>ƒ     +pX0?ƒE‡K
XŽ2   -‹#‹>G|kA‚ƒƒJŠq
*ÓB–Ã7‚jf3‚~ƒj’…v‘ˆ4#/
‚g#»rŸÝú‚2Ÿ2‚&"®b4
chnkv+‡:•Ò‚RquishD98Š´oƒùŠFoadv•
†X…>?˜pÈ ‰vŽþc{\ƒì4ƒì#0;6_alƒ…,„#6uct‚›9main‡{¢[…P‰k
ƒS†Mc
~>CS„a5       „u>9„`<†{}ƒ„t~      †‚"žZŒ|·ƒeˆiœm¨DŠ?ü†!e9‹\‚r‡<°V‰$Obµ:„Z†i‡
?h³}ŽŠŒ/ŽS¹X
8‡M£‚N”P‚%#
’2F-l      Ž8Š]§'…b‡4ŽJœ\ž‚H°e"„`ŠC/ž.jF"#ƒdŽ÷
ƃ)‡ƒa‚j—=ˆ¨DŸXƒ.Õ¯‚È@¾PŒ(=¶Uo¶a!‡‚%#\F0ÝTC!%¶„ §ˆV—;~ƒ,®l
–+"N}3
H/egd‰?ƒP—KU„)Yö/•=ƒi
èM‚„~ISey5<(‚    -C…
""ŸV˜€€€ƒ¿0°‚d+…kå½E‰sxW
Ó”1„áƒ-‡b*¤
‚/ý†N0remark‚”J!„6
‚ŠøˆW‚eƒŽ:edi‚“R‚3<‡}}“؆ƒ¥p)mb     /¨       ƒ!‰_n
ƒg%†I‚~
‚K’*‡/«$
…Q'Œ‡~ŽzŽT†}
”s
¶9\¤       Š    ƒ{f±`ð”„LƒdŽöx
‚~åGT%®_ý®X
IÃ&MÕ‚D5„§(ÕW—[‡p
|\‡†       Ý:'lot‚7'A†0.q-_†(mˆn,‚Q(E'F
A7
ƒ{>ˆ‰RÛd$
‡c

‘˜
zm…N‚°j¶\7ƒ†*í,

unt‚[
œhQv-
?
‚~m…E„?„nƒƒ”5IA1
3…[A
Z…:
/B8.
‚6†0‡q0œbO()‚t l^_6/»‡”s„mˆzo011‹| •wÈ6™
$1(‡dzK
 ‚T   …ÌwžzˆH
ƒ@‚„°d„ …T†n
ƒ …9
ŠX™Š3¶Z„1‚G¤l„+¦0‰A”t„S›y…1‹¦
¨-7……=,RŠ^š:‚C’Z„CµeÂSWno¦o—†MR‡„ËbŽ÷ AŸƒ;§iO(),+^_6
„+ƒm‡„‚^‡iQ‰!011‹|Ÿ†6†$1(‡+
 õ„
1^jõ\0¾= ®q/íˆQ&P„ET‡mT„+¶ƒ#Yƒ—ƒ
§l—g-—-8¾?5
,JRT®
ŸƒŸ‡
ŸE
*weƒa    e_diacrit~‚4÷q#¾:‚4D9¾N†#removƒ¸—ÌNMnam     „DD
&".,;sƒWL//(/D? 
ŒKŒ†1  –LÌ-’…yuB‚<Ž]•t!
Ìkš
A       
¥Í0´S#wƒ+…‡IµTÆ*pý‡hŸ†jNÕ        «¯g‚A
Ÿ:#0‡ImÖ
#w¦gƒ    œ Wder
„U6ˆ
ŽnšXA?‚0
:Œ;       
‚tr‚ŠVƒX†}
<ƒ‘Ÿ?‚ö8;‚ïI‡fl¶>>k‡jÎ'wew‚“open\
’Né&ƒTÅ[†‰P
gŸ½1„@ƒJƒy
+$F‰uŽ÷åÔXƒŽVí‚°‚΂;‚Xå,N
jƒ4Î$F        $idx‚Þi‰3 ÝXÉ7i‰3 rder‹7‚‹d v‡ª0¡@ ›),?†&   
’•l‘ˆ‚Ï…<ƒùl9ŸQ,?,&     ‚¨v0ganÊrXÁXd©L½LO‡™‚|¤pack
‚Œ:‹K–×1ir‚ƒD¡Á7’û‚jÝjrs‡Vá!™r
…K
“#†ÜÌSœ®n„Éz
‡‡<eat†    ,      ‚A9.™#ƒS“
        ƒGŠ:j„OŒYˆ…D¥U‚4‰B‘
‹R“7‹•aY‰a      Ž+(ˆ„&Å;EŽ÷‚UŸÚ‚R       —X‚{‚‚Çrzˆ@¾|å‚'ÕeŸƒ)¾CÎ
ƒGÆ9‡QŸƒ_‚[o$Eedli„8˜,é$1
‡0+ û~j‚þA0„ƒ‚Jœ8lac   „EvL‚:
$&ƒ0#      u
Q&<
‚[  ‚QSc./     eJ
‚H‡dŽ2;
Š…frœ 8ž:ˆh‚ §y'Œ-ŠŒIXŠ,%†
ƒS’,„@ /‚$‚C2F‚„^TØ‡b„B&‚lPP~,K>ƒT+¶Rp„"d&d&
Š  ¢y®U¦«zˆ.•‚h
6Ž‰•;…’m…À„‚„?‹ƒ

LŽa‚ÈZ<‚ˆl´,
*—É9‚S…Žþi¾‚A
;T‚  
W'p-ˆ! ‡.
J%®o,‡R~2 Õj Ÿ“d¾>"   Æ!^Ó+‡v#üsG¦x
6Ÿ$;‡®rL‚e‡…9iŸ6
B„‡Nj—YÝj3ŸƒY—!
 *‡p8e{i,–†;
†4=žX„Š
‘ýf<ƒûq
N„cƒvf‚|–a‡™mfo‚…g£ƒIpul©qrt3yOY7,‚'
†l@‚N(2"7 &R‚=J†-:#
""ŸV˜€€€ƒ¿0Â
‚'*‚j#ˆ~‚fVL¢qƒ†K#
`ÅJ²ŠI?×/ŒL‚%
0>„a5U±yŽ>„X¬p–*†9Š4‚       …E‰
 ‚MA)&…Wƒ,¡¶~‚n‡„ 6neifHifƒ
‚8Ž/…i¼‹Dg‘R‚‹P(?„`†A‚>b„ž`—+B:—eB‚xS„˜9, AK„Oe‚4
B
6†’‚aˆm†3ƒ/†‰~Œ[-…J…!r„“6‰>!yŒcŒ"‡ˆ_‰P¤/
j —*”b„X„Aƒ?‚k,8„a‡T>ƒ/Ž÷x—ƒ‡n‚#§=-ž°I#Q„
?Š_‚%ÕN/±y—\T‚G–N02        =
,
7
‚M)&
W‚hå;‡lbÓM*ÍW¶‚—GA:ÝU^,‡a‚TAKa‚(&„5V‚‚a‚\G4‚®q3ŸF¦~ƒ$!Ms§†oŒ"‡gx‚n
ƒz|‚C—, ‡t%VJuŸW,
90reposit‚óB]a]ÝXÞt]aori‚
ƒZ0
…a‰O6†4‚%4‚v&]‘‚:
6,$[‚
k
¼ŒªP,0‰U!?<5L‚4+‰}—pˆ
q
/s7Ž6Š„[‡C
_      ¡F”x
u"z%Cìt0¶X
ƒCÎ4‚%4a"1—8Z—wåH        ‚™!ICkÖ_

&!"*8?0+‡[RÕz
q
/M7„^\§
‚1‡h!
Æ;®x`Ÿa"rep‚1‚5‚y’Ì:
O‚yar6Y[…j¯3Ú
™W…!ƒ‚9ƒX
 &ÜQšeÚœ
d®p
p!¤
Sƒ…¯-&s%†‚P.w
#*
X
‚^j‹h‡Vˆ’<PŒmˆ%ö"øjŽˆv‰‡…WƒDU7(#ƒd•BMŠ"
Œ`„k!ƒa…m‘T‹w
„''ƒ2Œ|j?@„ƒ|'‰MT†^:hwž~‡<.„c$…#ƒ¥P‚ME“W  Xƒ>Žþd—6(JŸƒ$;‡W‡ƒ—á3‚r‡‡U^ÕoÝ3D
7(#2‚¡
"¾P¾4‡J'Æ„zY?—k—;i§
R :Ÿcå"(¶ZJ®na‡lQq
“N
E  ‚UÆXƒ>ent„}‚Gƒ4‘*%‚?P‚…[
–!Š8!‰+«A11‚ƒb†xŒ4P‹h‚u=
Œ%Š‘~:…7…;        a2   Q†yƒLQ’„!‹Q)‚_˜%ˆY-ˆ
oW1¥ur‚eµ†P¸*†4s(joŽþ‚¶„N§
–s11Mq‚CiXP‡OME=
œ—<
Xy‚ßH

‚
¾7iü}g1§Ë‚
‡}—‚0ˆw#9oduc‚à'urpos‚
‡`Sí%Ktƒ‚fquestƒ&b
3Rtj[„
a$B‚‚

Y]Šg…2*
[^'† †Ÿ°     {_‰p ²S˜%5…N‚"‚}/Lk5†s'[—iŒ0‰ˆU†%   •t‘=™I‚IHC‚T?ƒ5‚M-•U‚ƒ.
‰P„B§n˜EqN‚b§h…Dˆ¯"‚U’†7
Š•6“P¨<‚A†Žl1ƒˆ"E‡}A%†$˜m.@…f†…
‰#8‡p„%2ƒc’Ok^{$b$Žþ…Z‡e#¶…},„{'&®t@  ‰)‚ü‹v)‚mˆU®zÕ„‚;Î(-N‡^…&‚b
ƒœ‡aŸ!b‡`ÕƒLG®YZ(®r@®s6®m0—„   ^Ÿ7
ƒ]


k8A
ƒ2ƒA®kkirJŠl…qƒSw‚9„„R'F_‘`•z‚y‰l~
{DK‚7K:*
1W
$f9
„X
H‚68GS3P
ƒ[?‚O‡dc
-;5„>‚Š-‹C4‚Zƒ~‰p5ƒ†‹Œ=
{aƒ`‚&I8…]˜ƒ"
VˆCq;Žr‡^…K
ˆJ2žjYŒ‚@‚
m&‚6(Žp,A+ƒ)„C…'ª
ž6‹iG Sb>F…i°
"-Ž?‘|qp    Šl‡'„jŠI„3„[¡O„‡,y/„!‡^$ƒPl…ƒg

…}
""ŸV˜€€€ƒ¿0
¹d'‚`‚"d„d‚j;yg…9‡6r„gb†¯q‰6ƒ=„*„J„?x$¬@‹,lbˆF„›a‚Q…N!Xƒ%…ƒ‚D”8…l.‚Q¢V‰.F„<4
-…*ƒ„*„
>‚Mg‡''„i!k‚N]‰’*…5o3‚C6>6c†'‡$‚*ƒ
‚1?
     6‚[d=S‚[ƒ9ˆe…“‰w„uƒ3d2\‰<‚ƒ†0d‚ƒL„bŽM„7žCŠ‚Š)—-/20‡u…1’F„0ƒU…?…I›4‚@Š.\…w‚w‚W&       …O…oƒ&RˆgŒ`‹S
    ‚IŠŽC‚i‚ oŽi‡0.ƒl&)O‡/‚(O‚ƒ2Œj†O.‰…=-19ŸXŒBf†h„V„H†b
1
_]k>S;Vp   @‡u`fšR7%†z%…H¡Y†k‚=
4‰Y„•mˆH Œ        d‰#„„‚/u#ˆ~¥F„s'¼pˆV†wC„ š0˜D…V‚
—YBƒL„q6\(‹O…d-†<
ƒY†fƒZ† /‚—p…‹r§>„œ„k
:˜Qs†c‚G‚Žös|%5ƒ‡E‡`w_Ÿ!+I8
p‚Z$‡.$WSi
‚H„ 2„OˆO
%‡+‚2(,A+)‚:‡_>qg'T•<ž6‹iG SŸ‚#ƒ~"-Œ?wp         B…8ƒ|/„3„[‡Tx‡T—7W®®&‡mmFvP‚)‹,lb
g„[Jp8!XQhO=Ÿl§
fF‚Uõ4c‡kM‡j
‚*—?V
‚H6Ÿ‡gLAM‡]MREŸZ‡!i—A¾‚…‡_S‡‚~>-/2F
3Q &     ‡Z`
‚‚)
      R‚*fŸ—‚S‚vF.w‡[‚2&)O‚#O‚D2‡y=.Mk-1‡ƒ"‡‚e
†B„L@
1
_KHH0Ke~5:,§>`/‡ZbŸƒ{;žoE‡k
(d‡aeq#‡d7§‚b†w‡bA‡jU‡ƒw‚
9;—a„‡[(
=-
‚R‚Hs„ /lR-‚7‹r1ƒ
Gžn9   ‡W‚0rereadƒmp‰{‡=
‰ƒ]3˜iJŽb¢Žþ„$LÝô9ƒŽ_íTBJƒójSunƒ:/!›[
‰:•VŒ`1ƒ…¦W–RFŽþqTÝôl«u;     
S1„ÉY/Ÿ‚ŒL[ýSsearch‚
—7   
i‹J  ”l„U‡#–aˆH'
§IüŒ3K‚‘M‚Ï‚°u
\Int‚„Krv˜S5QCu`
r7d‚4
®   |„œr~v‰Y$H Žw„^ƒEzÚN<„5#ƒG*‚
$„‹‹+˜jƒDt&m8…C*‚^6(3Šf-'!ƒ4
†LŒ     ƒRbά>¾P"Òz        Ae¾2i‚™‚o„’v‡e0t&X6¾?
q*2(3
ˆL'!ƒ4
†L‚He_bytƒ„L—¼8t"…L

N58†R\%+
‚
fK‚
‡2#n2   ‡Hz%B

;*!‚EVŠ"KQp^H„
Œd>ƒx†$B‰p‡8-Š+
Wƒ\‡#-M³~–(É])%,$
ƒa    ƒ#†*"ÊJ‡WmI

‚8
ŽM…E
‹lB ŒAi&Š~„i%ƒ²v-f £‚?ˆ£
ì!A“"‚H‹Ž÷Xd>t‚B‡„
<-§  %
WŸƒX—'z¡=³~–(œ…)%,—1x»A
{    Œ"Íf
u
¶‚JÆ'
ƒjBŒF&x„i%
ƒ§ ôT?‚?HŸho AžT>
_auto_extens9databas4count‚élÝÕflag@"¦[¢R1*—ëc01g1z;S‚msort‚êÝÕBidƒ„1b‰¨cˆ“ÿpÖ2uƒ…kli      :‚•KDXst-‚Žf      
—"/  ›@ Y¤sšLC‘ˆ~/‚ÀS„ÑCz]Colut‚     C;"E&@V<
;)&†?L?ƒ=
—j_w,#
/1p\ ,‚h>,?'N–f°<–g†<I         †
ŠQÉ<x‰e”–u8     Æ‚0+¾-v‚h‚ƒ        <†/
„i94?„0ŒAÐ<ƒ
…‚Œ2‰”_hji‚U„d%D
Na
""ŸV˜€€€ƒ¿0¿‡ ‚’Q¥=–kˆy“UVð‚
‡‹w‚×wkê,o—ASŸ‚w¶VwŒaå0resort‚w‚Ó—Ì)urc#„‚P       ƒ{2 00
„6}*p†`Ó9…$0…nOoŒ‚[D
›‡>
%
m‚‰0!¤"‚0ƒ      Š#-’º[     „$Š
˜Jˆ(ƒa£-½‚2Êy‚‡f#så‚ßP
‚0ƒ    ¾‚!—1(®rC]"Œ?oÆHõ+pect‚M_#‚{ƒRŸ
n„45…HQ/D"Y
yƒ    J
?8‚‚™ˆVš=ƒaƒ'‰;´m†Ž«a„v£x»²f’{‚’O‚‚~
…]1„Èqˆ
Š2<¨‡^‚5‚f
 3¯>ˆ\’:ƒ-‰M¥
–>Š‚i Žx;ƒBŠv†Y ,¬\žhzÏH\‚™fŽþ‚s§6‚)
‚‡‚ŸˆL«aKC‰h‡,Ž:‡A$Õ1V„,ˆ¾G<ÃÚ^=‚‰,S"¦ŸeŸ"hŸ"3‚>®d-‡sO—PH;¶®r9‡>‡k!+Ÿ    „4(tŸondˆV!
‘hU†‚3>*„c‹c-4š‡!ƒ„c‘ˆ=1
>*     ùw„º®m2s7
+‡L‚}B"x„b‡;‚X
ˆ8¦DØN
„-RtPƒ#_=3"ƒG 
…       ŠL‡Œ œK=]…‚†‚FŠU
–i
%
Î*Qp!‹9       
’&ƒSŒS‰dh‚‚:‚RŸeZˆ
e…0¥u
—\e¾?O¦w
‚R‚°X!Æ%¾ˆs„ƒ"ÆJ!„DÆ@& e„]Xí1\‚bt†6‰‡jƒkŠ$%M   ‘-…~3='‚JŽN®]·Y”‡8m¥hò‚<„‹7   Õ†4òƒ*artOe†‘c4  ÉmŽWZ[
ªAÎ`‰     Ý$>0       )Ž÷$4rÆ‚mŸˆ9ƒûzT‚ÿ>0        )t|;or-
a,V“&ƒpb…™fŠC„lµ@…“%‹BbL$‰z!‡~‹s.<s4›}‚‚ó#ƒKˆˆ$ƒpˆYMÍS¢¶™86‚„~
‰jƒ>Ú)ƒ2Žö`ƒ†0üzLÝ`
ˆ!9<D]
"Âb‚ZGÝ{X¶G"§Z¶‚®jO
ƒq®p
‚](
žxrictDƒ#„F
‚+

ƒr!…3?'£
n„3„DŽx>ƒZƒ!Š‡<˜0Œ(e‚2› ym
‡a&{…4Œ#&OŸ´6…#J…o†m
ƒ[
‚Q¨Km‚=ƒW
&J¥ƒš*-
9“²1Ž-
!
Â\
‹/‹Vºq1_
j
¶,Žþe¶\C‡k

e1
2yh
1Ÿ#&Ho‚|
`Î>ÕpH§
¤c‡kYÎ,¾3‡H„$U-
9S‡ƒa‡W=Î
!„k_‚"-_¦B
ˆƒmuctur‚I”Õnult
$o„*„EM†/
_@ˆ)‚h,5‚5>ƒ!ƒ8…‹fƒ8(„…UX…b[‚    I       !)ƒ ‚94E2'%5\E$D6UmX‚3*Tn&
‚-*"5L…{%ƒE+‚<‚Fƒ]‚l]…‚!ADI^  …-1ƒVt(ŠH3N‚‚;J†4ƒ|‚zr‚q,ƒƒ7Y$,
3       ‚2      $‚FvfA8XU.#!*"2D.?g
1T*)
:%ƒ"12
|MA
;,

@‚   g        !_
;NA<932A?]‚ƒL.G 
g;Z
O‚ 
‚:KPFƒƒ:JL;2ƒ        ^‚&w-
2…M        9

        ƒc-‡mk7
[oDq2=,3TO8
)       #U

‹ns&/   )      
#„#†m^2Ždu‚?       „šAƒ'ƒFŠ/ƒW„-<8†\ V%6qbQ
…)‚i5(g„;=‚Q…0NŒ%>‚3]
…2X!
Z…4#bƒ?    (¢t†ou‚Q‚'fƒoƒy^Nƒ^
™B$qŠ
:„U…„jSTˆbƒU‚Lƒ]8…N…,ŠEY{T‚%6„ 
$„CƒZ8&Oyƒ…,rƒ     ‚`„8
""ŸV˜€€€ƒ¿06Å‚T‚‚
‘4„K7@‘„+„+K%•L ƒGQ„\unR‚{…|
SƒH…W‹h’?5‚A„7„*B…†;‡|†z‚xƒŠJ#„‚Xƒd„”r‰R‰`%C.'$L dQƒ&…H'…#qW„k‚IJS…g†o‚`=‡6j>…„\
±5‰B„YƒQ2ƒC?xB"„~‘O…      [†a…a‚R†)…Vˆ>ƒsaC‡Š5O`$ˆK…p:Šk…Q‡TP
ƒ:ƒ
'UBJt4‚<…h(^'/,†›.>‚^„D:„'w‚JR…ˆŠ_ŠO†„R(7‡Ž-…Dƒ*–
‚%ƒ+„T‚L‚‚1v‚†8=ƒ-„yƒ
Aƒ\‚%‚:Žb‰gh ˆH‹b     9…\ZƒFŠ9>©)ƒ:$ƒBXƒ4\6ƒ‚T#
ƒ ‰X†T‰Œ*n"f‚?ƒ5‹Z'‚sŠ{†/VˆR*>w-[Q4/g]&‹…3S3ˆCƒj)Z‚Un„ˆ@%…,$S…MXs†PVˆc‚^„4=ƒkƒ>—r‹hŒzk`>†‚5„I—F‚gl„&†T†r‚Z-„z    6
„+<kwƒ"…c!z-\o‰”eŠ:‡Œs`†
5„_†uA‚!‚F†/4B„U98#Ff†[:@>M70‡‚"&‚7‡i‘tŠ‡$ƒ2…7„QƒS¢q
‚+-†ff‚S*\ƒŽm„b‚w‚^"&„lŠ6‚f2ˆMG…ŠY†-‚gƒJ~‚-$fGs5    F‡fU\ƒ
        Eo
#oKBKƒ_#1=
†f9‚5ƒ3!%R:ƒ„^s†r‚^ˆvƒ
$~ƒ’1…‡U‡k…U+U<<
ŠH(Ÿ°

A
3’N0?”UVŽQ        E#Ž‚5Ž2>T‚/#






o
F
.4 \15.|oZf
…s‚3†;Ba4…*„6ƒ@!p%=:„X…*‚"Œ
0•„wƒ!‡=†0#‡*“$Š~wƒo„A±TŒ¬P…„(:†j_x„,'a*ƒ}^a(ET†‚kC„      
‡%Kƒwƒ&‚
Žöƒs‡]
ƒ     '36‡d+‡ƒU‡-1e‚x;=G%JO]?$
]
‚e<!Z#‡Uƒ;        (v‚Z. ;D'f
@^N7

B$‚[‚1†7Mƒ‡)OT(ƒU‡7N
‚1,,Y{T‚%6„ 
$„CƒZ8&O‚T‚‚
‘4„K7@‘„+„+K%•L ƒGQ„\unR—/Pƒ9‡‚‚]‰.5‚AFZ
…„|‡|†Y
‚dN…#&pP=‚3ˆ"
%`&C.'$L     dQƒ‡C!H'#qW=j‡ZHBÆ)
¯I5‡n      J
U2‡gF?x‡g ƒ<~Œ…    [‚X|‚R†)‚5ˆ>ƒsaCM
9(jBP‡P
!‡u…UBJŸD4X
[(Æ&=‡ƒ¶VP1+Ÿb‚W‡i+{—:bJy‚
&Ÿ]‡kn       9‚,FFF‡ˆW‚3ƒaIžv!‡h
ƒ—&¾‚P‚8
oƒN‡Zun*‡bw-[
P
/g]
Y,ƒv3S3Yƒj)X‡W`>C„Fr-‚        6‡b
3—s4!—44‚"ˆ…7—.?_‡a
f5
‚^„G„VA‚‚7IBs(98#,f
c:@
M‡Sh‚M@‚j…Rt       .†f40
CkN`?‡v}‡ZO
Ÿ‚S*\

B/" |H !2G
>žV8‡=Ss†r‚Xa^$§#0

 

JF
.4 \15.|oZf‡Z‡[‚c;‡j
4…*ƒ!p%=:a
;0^—
Wƒ!if‡`"ƒ
9w„A—fžx-Rk
'aa
l}^4M(+u8H‡N7N
‚^K‚w0result_blob?:9„j'5ˆ!       ‘]_¾=“©fa‚Àh864?;ˆ"“ªdoubl?<{8
¥ ÏJˆ#  ‘f¾>üŽkü‹‚°Uc‚Ðerror?=?8¤.ˆ$  ‘j¥QüFQ.ƒ-3d»‚9
16?>?ˆ%      ‘p“e
_cod??
        ‚%à}ˆ&¾‚eƒëqfnomem?@
‚`ˆ'“ªgtoobig?A
‚Lˆ(“ªint?B

‚oày?ˆ)…b       ‘v¾?½‚aƒëqiH‚:64?C
oˆ*‚.    ‘z
¦$¾@“©fjc»D
ƒg$”Gnul?Dƒ!„cˆ+     ’¾A“©fk‚ÐpointE‡rdˆ,š'$š8OON*.!"GH4
!!ŸW˜€€€ƒ¿2¶‰IS?8….2MO“¬Nl‚À#
3IS
8
      M"0result_subtypaF&ˆ-†e“©hm‚À&text?G
ƒ0^ l&6ˆ.       ’"
¾B)“©fn‚Ð=)16?Hƒ1‚byˆ/     ’¾C“©fo‚Ð>b?Iƒ4‚bwˆ0¾E“©fp‚Ð@l?Jƒ2‚bO-ˆ1¾D“©fq‚Ð?64?KƒZB‚vˆ2“ªvalu…zL‡#o
‡oF  ’/xxxxxGm‚!
ÅZ•ùt
†zeroblob˜hƒwM]ˆ4¾F“©ft‚ÐA64?Naˆ5“ªumysql‚Ž„‚frow‚…40ä=ÝR‚0Õam‰u‰P
 `‚u*“V|w‚LA…mµ<Ž÷ƒÎ
\‚u*
O|‚LA—‚P†•pt™Æ‚rrect‚E’û#kt‚T
x”ÝGaind”<‚&K%V{/Ž‡3ƒ”@…´G°;“…8
…\C¥fŽP´<Mr
c‡/Œ*#’e‚7°l
—q
T‚ˆt\
—=Ž÷  y®ƒ¶_Ÿy°;§]Õƒ'®xcùƒÖ&M›}a        mÝ+ŸM”,õTent‚ƒ"‘¨st‚‚&hink‚‘2•ê„[oken‚é{ý>ri†TƒU„""
)'…„C%#ƒX„QŽ!
!ŸWŽ  ‹P=—µ…\¶S4ev
‘hN˜+L$>mˆ ‚…N     ‚„¢©X”;„9e‡&ŸJ|@Žm3¦’
pW`C>z¢„c“6)‡OŠ[G‰LˆSƒ8Ö:)žS
ƒGo
Cƒ-½
„Cvƒ„9e6Š|Ÿ
3„$Œ   
/p `C>z‚^
ƒ^
„ )‚þBw‡ƒFý1ÒM„zW¶G§     al_tim‚Âs•ò
.ofit‚ˆ?spect‚„iÚ‚Xurn…m„G
 $‰/h
+%
+
$1<
1@zQ,;E+ ?nwo1.
ZZ{:&"!+,/
7>#!*,?,+*&S‚nWŠ{=TJ‚Š7T‚V„H,JE5!n       ‚Qn4
ƒf BPL9#k
$[!,      %!=…47U‚1ˆ*"b+o‚VL:„=}Z‚x”
‰N>M%b

%
"!Z

        
-%0<
-@+BQ ‚AS"v"
w27N
+E) 2H ='"w &  
-     

      
2;9,
‚}%q)\
lN(%.$
 &G4/7H
G       3
D%
<*".3.1)q
IH`_F%A/Y dk'<0#
C ?$>f
K
7(,,&
'$$/4
*+3&D(Z+Ljj?(i3!b     ha0;1R„M‚)
0E/"@K  7\:/L56‚‚    q/74       $       0-o?+H*wJ
H#ƒj\dF]S$       <)Q

-&:N +I/@@)''F&(/*UG#[Eƒ&i-.„LUT!/$
DP,
".‚>)L,!
3\  $.="\?G
‚*$‰g 
ƒ"'?(R„=aU$>:!*L0.)$,DC‚:f"3‚J(‚2Gg
<|> +YszE6#]‰q        "{,!`6‚ -OG
&Jy)!‚"
j<‚9
l!"!
"L  1
,'‚&ƒ+7&(IƒJb;7/1l%1bj"40U
        (7'%5‚s      ) #*n&‰j†.(ƒ      :
ƒ.…)7ˆ C.+…g‡.2"„4g[7#;+,C;!S"pe(d/"j%>'…C "ƒPM-U‰’6fƒ>/wœ.†@„u&ƒ8I<3
aL[rE$P%&‚}‰‚ƒ?.ƒB%Su:
}…u`AGn;$VN
*BT)2&)ˆw*žd„2Žk…qƒ
8ƒYC,; 86…Sn…Bƒ $‚$    tu…ZŒv„‹82“w“O     !b‚‚J‚s„jt‚/—„M†c‚ƒh&
F^!83r‚`w91;‚CCƒwM#†L„V‚k-\c(†Z:F…       f˜++m’~‚#o@5ƒ!y{+J+#,=\‡X"'q[
9+
ƒ5VE>*
69+\‚R>ƒ`
o3‚z
 DD'$O6;E3(o,E9;4-."5< ^‚Bl‚w

""ŸV˜€€€ƒ¿0ÉŠG‚7‹Wˆo*ƒnJ’Œ-¦Y    "
 -e‰/…<+#ƒb‡-‡9Ž3‹pŽ99‘,ƒ>ƒMN‡Q}p&‚)J$†X†HLˆ‚\ƒT‚,ˆƒ7?     ‚s%';)     W
p%,).ZM%,*ZZ-
7i    #c!y"…e%E>‚<O`L#"k;$"/rƒJ
4
)
?,
3{z
7/3$[*3ŠMRR‰8†B‚&‚"
-&@‚Rx(Oa#BQ]†,H4'ANCƒOƒO    
†ƒ6…%(*„^, ‡`y
i{Q$3Ž*‰}JF
!5,5OWCzR9#0/tƒƒ"Q¢ƒ1¬jƒ()#Dƒ_r-‚"ƒ  h&  .
   

            
       %(R
\=S„`<}<-eV<ƒB„r8GA6f!#&%‚8Žƒ_‡s‚f‚+'3o‚$!oTKd#
')n‚VEI&v2‚I‡
‚‚,$‚I=L"2.2.'+,8?YƒT<l3-Q‰V‹‚Nƒ)‚H1ŽŠPSƒ!‘Bžn/L?ƒ‰|Œ\N…l`ˆEˆ\ˆ!‚X‡&–y/ŒE(4Ž#„^%‚†K%‚Tfƒ%ƒ…‚+2„J4*!+H‚* )2$UHC8‚?‚{@9G<‚MS‚    ‚8ƒdŽZ‚8~„o
ƒ'Š,ƒ%Wqm‚m„z‡f-‚kR"‚Y1R*H9c     ,0)faw`…r†B‚6‚‚F‡Wr        
n„      
'‹<iGD…2ƒ<n‚B%w‚
Z<50%/,.K3
# ƒ}   (|-3"$&(!i
>‚q3CI1?1:')C‚„G#‚fDL6ˆ)-‰“gLžb¢u@
S(…b‚M1L3!J8,0-~‚Bƒ.‚!

)Jj‡%™>4=d"*$ˆq‚zx“S,…L
ïo†Di‚ƒW(“zŒ{ƒQ‚E0‚:†G,@/U%„lk
ƒcŽöx
&ƒ:)‡ƒ

2
‚,7ZC.+{G‡n‚f.LUM-U„&
7‡Yƒ:/we
L&‚;

<
a
[r
$
:%&D,. ‚%Su:
oA`AG@;$VN
*BT)2&)
…K*Idƒ‡…       ƒv
8 ‚C,; 86‡c}‚%
 $*\…M$   tu…ZŒv„‹82“w“O     !b‚‚JK7
V
B„M"‚3&
^!3r‚`w9&;‚CCƒwM#„z
‚c--\c(ƒ:F      ~   t+
$#:=o@5ƒ!y{+J+#,=‡F'      [
9B+
>*
\‚Rí‡d
ƒ     JŠZ

…+        "
 -e‰/Q"L    ‚9…{'‚^=‡e5‡m&OÆ&;R¾E'T—7
NCŸ‡‚uD       
‡ƒ‚0(*§ y
w{Q#Ÿ‚Q‡U‡Y‚&ƒ1*¦hP
\=S>`<q<+e8<K‡4




6

#&    %‚<®f‚
‚+'3t‡]ƒ!o
JKS#
')‡^
‚QEJ&
O2‚„!+X$4‚=L"2.2.'+,8?Yw<l3-Q—VŸ‡zE?‚‡1Ÿ
rN…l`rMN
9!wXA‡g
ƒ0&

f/`(‡V3‚-^%<
‚%{fƒ%‚.…‚"2„J4!+H93   $
9
,C%‚)‚{@9Gk<[4‡(‡s ‚8—/
b' Hƒ%Wqm}ƒ

;R"/1"* 
(     
      0      a
RKyy9      
       
'    ‚)<ž4p‡‚M
-a§w(8p‚M1L3!J8,0-~‚B‡e4

),j‡c‡‚       1>
_=dŸ!$b&5x

q,ƒ8m!
^i3,‡fŸE0‚
0returntyp™vus8˜|
[\.6˜$Šƒý0#‘‰>-
‚mLœ<"mšK“BŠk§\%‹‚1—kÎlŒB¢6ƒ#k¥n‚~—eUƒ¼wSÝm
]"m‚8‚ ƒ>Ý[Q!hƒ$¶Ý(f(Y)&h—~ƒ
qkv‚…;—†pealƒuc
˜e@  †k1
‰"…2”Õilrs„…£4™U„     ZÉH-iW( 7
“$8˜`       Œ‚;Éb„ª›R,‡0³x«$ª„6Ž¦qêM0ÜF´z-iWŒ”D‚×gCÆUâ‚sŸ‚¾,,¶„¶Yn‡ƒ
¯#e_unordered_select‚
 ^†s¾T-%ù
”…Þ†s4š2‚
-{
  ŸX˜€€€ƒ¿4›-%0revert„[Tf‚‡n„2¸y–N\ªa›$œƒŽ÷8‚‘‚>„Ñ_Hý‚0
'ôaA}iew‚†P      ¶'     j5º~¶9Z6œ°ˆ{¡7é‚‘ˆ…ý1Ý\Fs•oŠ‚„›ÏbÇ~‰}‚‚
‚^†RY¸V
•I   ]Ú
æŽþq]¾WƒiÒaƒä0)ý(”&õDitƒˆAok‚$
*#lut‚‡Jv‚ƒb”ÝQward‚
vƒ‘˜wsbindƒ|Š)ŠN"BÃ;‘K‰U•!ƒ¡Kvž‡‚vNƒbƒ#!††„%Šž‡\¥‚Š%“n“|†8‰
…1‹?„5ƒw„bŽ÷ƒn®rH¶‚Q¼-‘K‰U•!ƒ†•‚5¾ƒ1ork‚ƒGÆ@’û‚mrit†-ƒN   ƒ6„&…‚$-iˆˆnÓ!’
4´w‘5ÆQ§
bÚ>Ã~¶P2Ÿ1iå\>ten™{ŠV
‡$我l
)›5ˆ)JWˆ>
…PˆO&µ‚z…Æq<Ÿ]¶P'
„Ÿ3J>f‚&Žj‘ <$‚‰)c‡)&ƒ9ƒv/  
p‚3#¦P'cƒM`ƒJt0     
‚ï      £z‚‘C
‚i'(.õ        `7159‚Vlh‡)ƒ6#-
ƒrV”ül"ich‚^9nÚƒ½ard‚‚„ig†5ˆi

ƒoç!Ÿs’…Oer‚ˆxtig‚ˆWk‚‰cd‚d‡2#!2#k3 ")5%)%)MŠ$™"!

@J£d…#!2#k3 ")5%)%)„ÙMTÕz$G!

@Jicul‚n£o#esigen‚ˆ_g‚‡"4pƒ‘‰y4
{ger‚”2!<‘‰6Q!<ht     „H
r_Zd‚9/ƒ~^…A@Sz>
Z6 *‚
Œ'H
<fQ‚=T†5Z‡8˜d
‹t8ƒXˆG„5io8'!6?R‰        }5j,:u$Y
        ,'"9_‚f
„6$‰>c%20!A5(‚]ƒ4²)‚‚T¼”I„a‚WÍ°       ƒ4ŠI<_#8mˆB/’v„~†uŽ#©^rAŽ>„(Š.(‚†…uŒ%&=7V‚>\-j))o‚+((*‚w„d<9*š•H†Tƒw08¡T„zMH†dKO1J…*‚0ŒUˆ7Ÿm"ŒT†QˆU‚A†c•GŒ˜_‚‡Y‰uŽ{ƒZ¶by’yd‚†‘w%7?-0:¨o‚DŽOR‚a
}-ƒKƒmWƒ$%)G,,†?p:‡‡s‡)‚8«D
„sQ„x%ƒ
¢R‚S‚;
‡    *~ƒ-`‚ÞÅ$.ƒ‹Y‚0h‘'³D     ‹ m2'‡V–
†tˆˆbeŽ<§"‚ @%20!A5‡Z‚Yƒ4HCqW}q"žj¸>°       ƒ4Ÿ#8mQ/‚&)‚5rAq‡I>(
=ά))o‚+((*Ÿz‡ƒ‰+9*^.9*®)8Î%‡J $ƒ~j¾v
F¾;ka‚L¦|WŸ h%7‚H?-0‡`®„^—x‡bI
}ke /Wƒ$%)G,,0:Ea‚9&)=8‡]†Z

„cQ
‚%Ýh<®Z
‚D    ‡.®!‡-$'‡ƒP%        ‚e®aƒ32'‡V'6)most
7d7‹!ü:id}ƒI0Tˆ4O<+$M  H
„5aX|‡l\µ_
¶UH<+G      í$
‚$a…¯>z
\li}„‚J„µv|&¤9ƒûtorŽ0œ{²@‚wì4      œ);…õ#ng‚‚ÎVsk‚„ˆ     ‡
«K˜?Ž-§A‡{
°G`œB–H„m
”Zo…NÐoŠ/ãfø"‚‚¡lŸam
‚`ùa

   xÒr&§-Až{V…te”€‚/m‚Ži“ª(oa‰"ƒqP‚     /c’Ì
#‚ï^admap‚†>‚hb‚˜Kert‚ot‚sonƒ0’4†[ˆK„
&Jy,X[‡%:9%—ë@4
&Jy,X:9%ust„4›?
…„)’V“@Äax^½xo8¡¾x\5dhŽ÷‚‘,ƒ 
^‚Ðü\ýŸ+S¶ZÃ(4®Lli‚… cha‚kksdb‚nz–¨Cxgerƒ†Qu‚1ZËI–rŒ3c’úL(/Þ„Ád] ) z*%?
‚+#Š 
49H,
M>
""ŸV˜€€€¿0»0role$†q‰†vu¸U0”:
m%
1
‚Tƒ040'Â]ÅÙ¯IƒìLür.F
m%
1
§'ÝB‡2lo†n„(*‡bƒ=>
JS        TqPI…U‡0ˆz/y!‚}†a#Œ6”…1”%îh
‡,ƒŒ-
¸V+~Z‚‹a…$
BX"šn<†f‚f‰%‘G
¶qm–‹f‹PƒU(‡:b{dN       ‚/„o‚…e‚U‚e‚9†
Ì‚y}®aŸr„•0      
’K_  „'’“6…1Ü‚…îh
œ‚"UH-‚ÏOn<
l‚f
1GÂ|
W‚9:ÝyX{¶9§T‚
Ý+
ŒW_Æ‚SŸ&! —jback       „I‰H
&…J"X     WpU- +82I       %1‚O‚S(
'P(#!      
e.k+
O#`
ƒ{-
ƒ|…'‚H\.0J„ ‚2’‹62%=pZ#"
      …
ƒ_„>Œtƒ{J„~76ƒLRO™g‘b©+#‡h‚

i
F       +œh’E„°+…g     m
‚s
ƒdd%> :^$\9
:2J+ƒ&5a'%

,V,.TWFI?x
<63
FtH7   /'E`7%e*„u/JƒUV%YS=F ‰,-5‹y¥ ƒ$
Zƒk<\…Q(('ƒ#ƒ;<S‰&„Ahc-  (=
@     3A„/
#c‰
.‚0     
‹O.~—,Ì^–;N ‡$H0›y‘}-(M=:
L-7!B™N
…k/ƒ#Š'
ˆ*)Z=Z
>A!D‚\„CÕR!%G   %Xc
5ƒ
„u „%‰†‹…MŽö|%=pZ#"      -
ƒ_9Î     h—@…‘b©+#œ
„+‚wk
+Ÿ<‚°#        :^9
6:2J+4F'#

,VFIx
%3
t(H7   /'E`7%
W*
i/Jm$V%
‚     =Â{>     (=
@     3
G
       #Fc.‚0        ‡d
ƒM.¶&Ÿ;¶Eu7 
-H§<g-(M=:
!-7!BE£N$
D‚H,$(!%G %Xc
5/žw
[-‚%
    _hook‚D",
…œ.m‚‚yod‚‰"•»:ot%
^„›i‚7P(QG
‹[B5…*‹†}„D=   Všiˆ‚ŒH:§&óo”4…)2-@<ž!V0
±+]y…D )?2„*<¢2‡„j‘zƒA°Z@†"ŒEŒ -
%…Œ'‚D      '‘%‚XŽ÷9—‚5(QG¯‰džs‚D…*:‰†}„D= Všiˆ‚ŒH:§Ÿ‚„F42-@<‡XHV0ͯ`«n[í5ê;‚F?2oü+„`—ƒœ**Ÿ~§
|®P„I-
%…a‚D  '     

‚X_pagƒ      ¶H—û„        pag‚‚ÈD
:‚~ÈC‚’ë-
ƒì(Í[8sÖB‚gnoƒ
°Xd—Ìzdpe‚ƒT•³Ft13ƒ
‰˜Šat‚‚O
˜
*‚H‡‚‚
”—
ve

ugh~
‹.¾‰7liÇ‚I(@Š]“-\Š8VsƒF!–I¨½Q‡E
‚E(†K„‹%Ò0s‚¨e%ndz@‚O
C
2)
}I(%C¶t….
–p'Œ
27†e
’g¢ZÕŒKƒÜI$
27ƒ–"
goff‚‹`”Õmtin“>…‡W
‚N
&7.s& 
Vnz1  o    71        
g
Xp
(
$}2z#;)7|    
>N
#o
$o&HWR'Q0
r#Z2&Z]ƒ
P
=/@‚(ƒ5N%U !
      
‚c6F<A&C1';/.c#iƒ82pe'l$24  )

-‚„zJW
OMƒ6„u
VvD
‡;
%‚T
6.;
j     .‚Ypa”HU"/ Y7,|G‡c8‚\B
M$B*"u_,„+š/‚špƒ5„=B)ƒ'‡2ƒ<†dŠ‚?ˆ,Lƒ ,‚Hƒe‚"2˜K°_ˆQ  1…9ˆHM
—!4Šao4•&0ŒkMaOb
Ni
‚5 …Zb]J
‚'! ˆY(Zd8‡hŽN8ƒ)5rwi     584l‚jn!†_jI?„x—G_£›…l‚dƒq=
Š1O‘`*´>R " 
 _|"ˆN‹ˆ8§‚Z'ƒbŠ$
ƒNZ9x

""ŸV˜€€€ƒ      ¿0Ђn
m‚x¢gÃ`ˆ!ƒƒV] `‚tƒqƒ
„"1„2f7‚AL
6];J2#‡‹`"R
ƒDmƒ
‚ŠO‚Q
‘,
¡2„&ˆt•#Œj&:7%„{…).‚p‡^ :KŽþc6U"/§&aB
M$B*^$¶Q(        †
‚šp§p
)B)a~.õ
cƒeI"2•[fM        1ŸŸ%"Æ(
Ooœƒ
UJ
?!í011c/8:ÝQ—7;—R
‚=O¶]
‡rQ " 
        |"m‡ƒyƒD
*$ƒc®Tk'‡ws§(>¦Po"s§‡_‚QJ 
‡'Ÿƒ#…,Ÿ
78').V—0row‡O0
„J8*>*‚(E   ‚2=   /8       … &-‚
*3D
1Y‚„ciDƒG~
V%‚3>.|#ƒp‚!,
Uf
O;_

.

(                       
^B(%6

,
$
K"$p%&C# 
.[/$"

       WC!>(29‚8Lƒ       *
?F_EW       ‚'+,N-d…:  ,       

V

     )

Š8NTƒ+"&vt&1=1J„ES        (ƒ0$ˆa‹ ‚E2U*4]-‚3Nm %    MU!L
$i+
.ed08  0Uƒ‚2i$\‚$
l„"
2%
 h$        *D9[f5i        1 ƒ^~
k
;U‚nG!‚)+-4†'NWˆYc…8„n7!†
2ƒ:7rh„8/ƒ/Vƒ_.2O8`!   s‚-Y„xƒdj@>‚&<+[h‚W†b(}›E*‚*T D[in"‚[6_n rV "-'r*^‚O‚&ˆ=x#7‡`<„U2„@ZƒKF*7)+j‚Eq <…C…O“e…Ia/nˆcBQQz„<+Šz&ƒi6ƒh
'
Ž!‚(D07
u
‰ƒ[‚<5 &„lŠ*‚&H%x†h9eƒ"LTƒ?†3…ŒJ)$‚q…$Z+& 0I:+ƒ]0C J‚‚+ˆ.)‚85N0
&R1_2L
+   ›a<mƒm
11L
…8)ƒˆ#!$n‚"ƒ!œp)9;0  Xk)?>„v
‡pL„$Œ-*|        ‰u
K"&   
Œc)       A+?  G–c)‘.*ƒ)‡(0uƒE ‹8‹f%jR†-u
 GP+

…[c‚P]Qh]†Vg
t;%Dt"!       /.†r‚EL‚>‚V$  ,     P8‹\:_      
B62'„W‚„;S&‚ %„"…$+jXŠ   j‡ˆ
‘0M‰Uvf7&g/i    <^#^    .!6‡T‚Z:‚}3#H[†>*ƒE        '
.
Yeƒi
5        0*%f'ˆ|Š
Ž(‚sNƒCE

j 
G 7<S      <+-.†ji‚r‚b~j>?l$/Fp     }*.        (

     #4
5
*$
O+
  

&Wx/E)!G!###        #+h‚I   ;7(7!(‡)Œ[a„%'"®LŸA^ 
 
*    8W"9 ie+C‚ 2X"‹}      , (Œj&„ƒD"M     7‚N„,ˆzˆv‡1‡x$a
(&<
dM0V‚V…dL"‚2ƒU/‚a‚[2s1ƒ8k3#+z‡2(‚j‡5d‡,‹
C„0U

6
"†_
!"SN‚
\+‡k‚"vˆ*OP,†V‚3‰Y%,,"ƒ   „i$0&G<Z^O)‚M
‚F'b‚&'‹Sƒ‚"
…*‚/`‡Y)#D
,*ƒ+‚Y‚olƒI‚3&ƒ ‡hŒQƒ7C8‹JJ„H„V*„P)b‚Y Fu„M0e
3U'?8$g‚Lm'ƒ%v J|
Cƒ    ~“[[Šˆ~
‘u—e=!x”.Pu0TŠA
A
3’N•@$ŸQdT )L# )Rƒ"Šˆ=†1…vh†>‚w„Yt•!
;
ˆ-2)
ƒOi‡&'-G!z*–[”gƒ"„\"
        (S_‚ „C\&6u#" 
h
2  („&d     
       +;
J‚G‚4
ŠAŽþ\$
k
;UN‚lG!"+-—fƒ//"—4‚|_.2O  ‚Z     &!  J3‚
}d4[‚&<
[h~(}‚*$aT D[in"‚[6_$U rV "-'r*^zC8B#7
<K‡-*U"F*7)+j‚Eq h—6
‚&.2‰Ze…Ia/nˆcBQQz„<+Šz&ƒi6ƒh
'
Ž!‚(D07
u
‰ƒ[‚<5 &KmE&%6{9Aƒ"LTpƒm…$J)$[q6‚(Z+& 0I:+‚0C J‚K)0‚5N0
&R1_"L
+        ƒ\
&m‚
11L
)ƒƒ!$n‚"ƒ!‡S)9;0  ‡S

)k)?%
ƒSÎ+
K"&   H
        +?”TŒ)…6*ƒ)‡„`G¾C'l‚qŸ 
‡f
8‡hy‡6%ƒy[…
""ŸV˜€€€ƒ
¿0   À+j“…V§j§f7&?b/i   <^#A  .!
m6dp:d0#H
6¦x
,
‡hWe—;165    Mm*®GƒƒJ‚s‡b-

      
G 7<  <+-.
Ti‡^‚b~I>l$/Fp "*.    (J

 #4
5
*$
O(
      

&
G|*/E)!G!###         #+"N‚I    ;7(7!—.
    
*     82 ME+‚2XŸ&
9h"M        ¶QF4‚:†}{‡\:>$a
(&<
dM0Vy…L"x
‚vU ‚a‚[2s1nk
B#+—3
P(
‚_
†d`
C
      U
Y
6
"&
!"
Nk\+;~‡SO$,zV‚!%,," j$
&Z^O)‚M‡N
'¶WK'sz

I
)#+
,*
1
"
3
 }ƒSF8‚,ž6—am'g J—5A‚Ocˆˆ=‡fn‡g‡f+‚w8tJ

;
(Y2)
Ei
ƒZŸ
ƒOG!JX
ŒI„5"+"
        
a(S
K‚ ?\&6N#"        
he
2       (
*¦d      
       ;
JOG‚      0row_numb‚U&‚<       r”c&-„2;”å4‚7    =&-„2;cel‚ìgÝØdata‚íAÝØsidw
ˆV
†`^ƒ;…L5„!'H!P5
A”–
&-t

        @*C,&
26‚
& 
…c‰E&–gŒ‚&6‚Q‹;†'4Žx-A9W‚:z“£NŠ}„‚*ƒ$
‚„N>‚z/‚v$
`‚G‚dB „Bƒw-‡Dƒ ‚XŽ|3•!„3jDn3=†-†!†Tƒ˜(|Š&•u &ƒ)\Š 4&y
‚)*†–‹=¡B(L%`D@
1
²
ˆU_]Œ 

M/¸B‚ ?!? Pƒt
…7    H  
!."
       
M'

    ' ?1T&       9
-c,! }
H
%

J=%m9    ‚]<‚XFƒY
X‚M-CQ
S‚
„V

#O'"2ƒ\‚>
,         4#
-   žh…‚q     ?‚_
-ch…^
‹k*_^-08‰U‰2‰}             +       ¡%      J™ .1
‡c˜P;;e&(!

„…„\Šh"Ÿj‡$y J¨
›+MƒD‚95“b–;°vB4x GMŠ
‚
‘Gen

?7
As_@‚q5‹„>U|‚ƒlp- 
%3


MC     e"‰r5ŽþQv&®m2
G#4-09W
‚z   S
…ON„'
a>ƒ$‚(E>‚z/‚v$
S

IB‡,
‚-
†-
ƒ —:
„3R~„3jDn3=†-†!†Tƒ˜(|Š&•u &JCQ5 4&y
$*
L&‚$(L%`D@‡j
11Í°K‡_
+
MTŽ‚ò
a!
7 P‚        N
[    ‡f   
.V
       
M'

*' ?1T& 90
-c,
!Î

H


J  =%mQ      
@<VFb
X,Q
S


®_#O'"2—;$¾K…
9q    ‡U
-üˆ
…/2—9‚           +       
     ‡e.1
ij*;e&(!

‚h%®…D
v} J¶0—9
v5G—FB|®h…HGMŠ
‚
#e
?7
 A
T_@‚Z5
ƒy‚@K|‚¦b
L+ 
<
%3


*MC        maximum‚‚=“ÿ‚;numbƒ Öl—û0set‚†-é4!GÝS1Û!Gadd‚†1é%ÝS5Ûread‚†2é>ÝS6Û test‚†4é^ÝS8ÛByalti‚!‘"par$8entscor‚Sžm…"”Õu
…"m‚.ƒ7ƒ.score‚Sž}{_.$`”Õu{_.$`qb$&

,
       
.‹";‘)
(
""ŸV˜€€€ƒ¿0¿0rtc1‚²w‘‰yime‚g
Âu•ò

0reeõh‚TƒL&œ6‚&ƒ~\#N<A6`£."‡)ƒ4Œ#ÏRiƒi„½N~¶!õR
‚"&Ÿ2ƒÌU
#N;A¤
„„ƒiÃ_dbl‚Sž(1”ÕuE1geometri‚S"˜(g"!.P‚4”Õ"!.P?
y_callback‚S˜ &‚V”Õs&‚6i32‚S‚y]     ”Õ_        nt_onli‚¼ù‘gquery_callback‚S˜#.”Õs#.
info‚S ˜†"‚m”Õ4"‚mcheck‚S§0   '#”Õy'#imd —$^1X„=S
EX
½Zµ,XFS
EXˆÅj
Su_vocabulari„tŽÿ:bi‚Œk…M–"á}z•Œ‚0le‰G‚„\‚.‡T‰16†o‡:‰bi
„…jš!ƒ@’‡`M“y˜[e76Š*r (Jy‚4                                ~j‰œX
†S„S:$–h·E”VŽj;2ƒ  ^ŠUƒ†:‚mŽf†$„E‡9¡
„M4]‚sŒ 
mƒK˜O‚!|²%ŽZ‰6ƒ4jƒŠ6œdˆ?‚Jˆs
‚,eJmt‚k
‚.–T‚b‡¢>ž„'ÄqŠGP»†}‰F
.Žö|2‡gOe7¶Ur     J -                             
,‡e_Ÿ8
cS
     ;2ƒ    ^‚@‡JP‡hj‚mÎ
"‚V+«k
[4ýb΃2ƒÆ#xÝs—L&„
ŸfŸˆ|‚v—5
I‚Jc
‚,—c
mtQ
—D‡]0d(ƒfÍ‚d§
ƒT2ƒEmor‚ˆ}…M•êƒdn*z‚A
J[_
‚M/‚M
‚<{…D‚D     ‚‚ulƒrŠ6d&ˆj‚L"'.Wƒ
uT
9…&2‚n*F6‡|…Z…†…!Z„5‚,a]&ˆ†y[+‚ _X c0?ge3kW„2r"o&t@ƒ!‚

2‡Q
}
~
‚7=>{$
„ƒC…WK       Š‚ƒQP†.Xc-W‚
;:%>#‚O ƒZ;)Ag†Suˆt‚-ƒc.g- a…4‚j*‚*$d_29Œ@‚     †`Qgˆ:iƒ4F
„n„ldƒ‚&.†Z•kodpŽkƒyŠZ¡[„ˆZ‚W[“$Bi(…GŒsœ
ƒ`„1‚Fƒ#ƒg'ž.‚q’ŽF
ˆpy‡RŒ3ƒMv‚!*˜b¶p™       6?ƒ-2)b©0–@ƒ(^†CŠr…`†hh8<R‚'H
%&<PD1„dN5ƒY&1
„*±(ˆ,†.…"…nƒ<su?Ypjl‚H@Q:o…#4ƒ?cK†&‚CF…E‚w„@&'ˆ'P†FD…’'„(-j"        -89(M^2‚9W
QU4wk‚Y[5ƒ*2…I„W„0$AcƒqK2*(

1ƒl4u{
4#&??ƒ.8$„/y†@…n ;†FJ0ˆkƒB…)(ƒ9‚2P(À?‹8ƒj>…0ƒN‚†+…Z‚‘x–}"ƒ.)‚     :\J 7%
‚‚
‹Z\‚F‚&\„=‹z‚0‚)ƒ\"
(‚>ƒ9ˆV2‚yŠpX„†( z $ƒ"`Œbi‰c‚~†\ˆ      ƒpÃ8:ˆ."„M‚a‚z‚i„7
‚-I]-„y2(ŽO^%‚X7ŠB„M…A#
”„s¥$@‚m†G8M;ƒ)”z“|„=ƒwˆ6‡u…,‚C("„2‚8EƒIS$!‚ ˆ=-šˆ?‰ŒrRu†ƒ]B‚%†Mq‚z0‚?"S‰‚l2Z-‚~‚
„"I"-    ~ƒ(]ˆb‚‚7
 $0K;W%ƒb“@"‚lED )ˆJ‚?P“-ƒ
p‚„tn
 N„A†!‚p …%?9„ @+ƒX5‰„5‚W‘‰7beQ‰Z‚*D{mm,y4…73„}#+#E]`c‚96L4+ŽH*~(‡)„,„g„B•@‰†^ *R
S/"Bs{?X*C…D‡"‚„a"C3‚v‰–$Ž0‡ VVx4
BK'.JBmL        9=R „ `fK‹P‚0ˆN!‚~?5}d‚“`²6.%‹ ˆ9t"‚[@‚x„Eq$!6…qƒT+cf‚ƒC6MJ‚H
,#"‚…U„|tVgC…k0‚XB
‚8FHw9‚"]‚5

21
@              V@„OS}^9‚$‚*ƒPg.†[‹M‚#
1P%®$-u:M%‚‚9†=…‚
C0ƒ:…g‚u‰<1z‚=x„Z„S:P†sŽöIc-W#
;:%>#= `#;)Ag
pu‡ƒƒc.
Cg-‡+‡g_/,*‡f"[*_L
‚qd*l—4'J?ƒ]rƒyˆ?       ‡)‚S[p—2
(eˆa4›
ƒ`„1‚Fƒ#ƒg'ž.‚q’ŽFNv‡‚m"@‡kp    
    6/K2):‚W‡M‡Z
‚O^P—6®¯]‡lUl‚
‡i#L:)(%0!I+†
""ŸV˜€€€ƒ¿0»iô‚F
uvjTj‡`H@Q:o
„D4ƒ,cK†&‚CF…E#I„@&'†SP†FD…O'„(-(H5}-89(M^2
`7
   U4=Y@5
#2CS"0$uc^2*(

'
b
4u
g
, &?D:.8$H‚)y†@NX‡l‡iŸP§&¾::(M8
)J    2%
‚‡hL—6Zj:
F\‡
‡ja‡l<‚0—5V"
Ÿo $n‡f_
ƒiScd!‡Y†'ƒpƒ
¦M:vO
k7‡e®xJO^%
‚87ƒ9„#
‡‚2‡_]
,W/—.
}-JN^3R‡LR5ƒ]B?
H‚zŸ+nLI"       ~]]‡,P
 $0;W%b‡†OED )Q‚?‡f
‡‚SpC„in
 NGj+?9P@+]5‡ƒ+8„0‡‡<UQ‡‚Ÿ‚pD9m,y‡j1K…<‚!#+#E]`cV6
4+¦x(
)
‚b,Px8‚S
qC *R
S1/
q?,*]
‚/z#"'"C¦V
4
%K'.JBm$     9=R „ !f3‡‡b‚      0<!m§
…,ˆ9‡"Y@‚(q$!:2q
`+
Nf6C
+
,#"q;VgC908
2—99&.]‚5

21
@              V@
\S}9
‡‚$‚Jg.
‚#‡        P‡t2@I:!9$
CLM?
1ugY:j—‚0runnabl‚¤h”Õv+er‚˜"tim…s…Z‰'10Pu*Žvƒ$ãp×Q ŽNƒoh
aƒ.†+°`‹_žp†Oƒ†K™}Ìv3Ï"Ÿ‚$õ‡k‚[ƒo¶VOê2S¾„I‚iu\‚À6/sh‚V…t¤W7t‚;"…eA2 …w“š A2 ƒŽ58acean‚ˆi“šƒwa
‰#4ŒC‡Gj–Çd,Gjca
‰$Jmode‚‰$•»<mode‚‰#•»;sB
ƒ>&
¥k‚3

Y„†"ŒF
-
eƒ‚*„~‚~<


        
A:
 
†59&qS‚L$
#.!%        L
Šx$01
(*9‡D‹N‰D
™èi"W–; ‚^5ƒND‡D‚ƒ
†L-Œ3‡;‚lׂ"…f„J†5„>‚|=>y‚|‚uc@‚

5ƒl0„%„Jˆ†*…œr¦       ŠmVDƒ3N’Lˆ\¸•:Œ‡…l3…Td
†N‚Z)“?
‡5Q…Z>1 Œ5R‚r6…]D¥yw2,’s1-†“Ö‚XŠL†Šg„j‚…o,Š+ƒ„l&ˆ@*8ƒ#‚9J‚8„nƒE<q„W
‰b    ¤lƒ*GY„@
Œ\4ƒˆB‹o*/†4”!«?”n’4‚‘+…Sm…1…]ŠT—,ª;ƒo¦P‡ZŒGŒ.Z&Žö{
     h—3u
¯‡H‡S& 55ƒN§$:>‡;‚l„B‡@PŸ„¶W‚8‚‡f        ‡˜P‰D@3N"Ÿ7Õt‡foåGTd®EN®ƒyÎ
16¾B
w‡VQ,    ‚m1-‡z‚Pi‡<¶‚7Ÿ!J\*8
uJ
Q‡aƒ4ƒE‚O<qŸ`õW!
?‡i®n‹7…SJ1,‡b        3
—‡y
DP®gt
s0‚%
‚1dê%
*—ûN{
*1x‰X
-
‚=#dÙW„E‹gŽ;‚   
ˆí
‚%
„6|2x‰[
Ùf„GŽ;‚
ˆí
‚4
„@3ƒ.‹8|„_†3ˆQ|‚'_r_g_c‚›~”Õ‚acrif~
„a¾d$¾icŠuŽø.fari‚‡!64C+4‚z
„=S‘˜-s64C„¢pK®p
‚TSeŒ((0…F       L{       ‚E     Y] yO‰`) ƒ3ˆ?•„ˆE…'•F›„°;ƒ&—7GŽ
‰,‚n/)‹!‚ZÍ‚cX8&Šd"H1*#>
""ŸV˜€€€ƒ
¿0‹‚;…V
,.07'œFˆk.—J†@Š”    P(‚_CŒlÑŒ
Œ2'‚‚†d…p±³=      œiÈ…@O
e‚¡(Žz"ƒ#…B‡O ˆ"Æt)qF{1x‰P†%cˆ~„…D‡#|3ˆyƒ+Žö>åHx›„°;ƒ&œ‹D
„ŠjŸGs/—'ê6
,.0®m
Xn
HP(aâ4®„‡u‡‡]Þf|O
eìyk‡ƒ%k)F,x—…0
c¶VNt^
3
D
0safeguard‚…Hr‚îm…
ÃC‚$ÜÚƒŽ3íƒëLst   7‡ŽvtiŒ9hns
ro%
¨     $      ƒP¯ ª1O¥xVÒs

o‚°d‚‰B¤‚”)
{OiŠs§VB
‚‰C‚3
šØoô?ƒY’
ŸIS
‚"‰~–6†!pƒX„<†ƒ„a/Œiˆ5‚‡)‚\„]‚t˜J®Y‚0‚@•fZ…I¾ˆQˆb¢‚
šfž:…+¢Gˆ-ƒk†  ¥‚v‚xŠ/¢@’n«^Äo“u‘\$ˆ714‡‡R“Žþl
ƒ47¾cxž~ßqƒYTp‰¦_¶—‚—Bp(&s®§   ]2„j)ƃR‚zk¦‚.T^í3z¶TnŸ(|‡^S—?p"‡„=GdÎ(:P‚
®\Ɔ—‚t‡dLSU~d…0‚"—y›W¦D‡H
‚Oˆœ
“šr¾e`ke¡/ƒñlari‚
ŠrÚG
(e
„z   i<‚ 
Š„Bmv
’`€
     t‚oˆu"çAp
,
ƒ>      –°9"Ë5Ep
,

/     vag‚7
H‚d’û"?‚Pm‚Œe
S‚‚z‚97Q}!DT)„F;ƒz†Z‚-ƒ2‰2‚D9/Šƒ*„JQŠOb!^,(6Ewc„h„9ƒ[N%h/ƒ‚ae‚S…+‚!.ƒ_   79 R!_m%B†{‰1
!
<0Jƒ=ƒ
V‹*N1‚UE       Švb‚f‰j‚Hƒ~
‚[„EƒEE;U
‚W   g1
')‚5
‚;yq!,y-C‚g
ˆL/
s";7, ln:6_(
K4&pUƒ/
0    ‚o‚0;‚/%ƒO
@#‚)„1
‚"
@…)
'*E*y1„jI/}L
-‚    …†Uƒe‚"8‰Jƒ_Ian
'a,†p‚d:j(\
ƒ%‡}ˆ=1ƒ
‚+
‚|…("(‡2„,†*‡]&†_OOU‚H„
‚S@‡yq6
%)"ˆ
T}…†u…Vƒ„Z‚7v&)k‚R2k‡~„U*il‰=ss‚fƒ4„Dƒvƒ,‚$‡hˆM‰>‹Sˆƒm#‚S>'h‚e,"*#‚       HJ…A ƒ:‚H†‰y_2ƒjˆ\†#ˆ…9p4ƒ-‚WF‚R
U„8Cˆbd.+†nx‚      j_…’+ˆb  ‰L‚2ˆ,…`—&ƒM7/(7ƒ+cG‚$‚bƒY|!‡(ƒtˆW+B
…p…D*ƒ'6ƒ6‚h4\ˆCƒ…„ 5‚‡"…y‹t…(ƒ(……|„i*ƒiƒPC‚!„Sqy„%'ZŠZ….„.„Y!‚4Œ}ƒ/l‚=„|=‚"ˆ^L…S‚Dˆck1‚
5d*‡ƒ]‹$„‰ˆawwƒyq‚h
G…   †E‚‚{‚jP^‚3‚^….’Dˆq„&‚_„,.ƒ87‚=l,…+‰
9]‚;ƒ\„*s„[C  .3†A4     
eD…Cs%‚W?\7‚NƒxkA‚[~…S‘^ƒ.Z-…/1!       W†1‹0„"‚‚\‰.‚/*g „\†/nG)‚     w-*qh‚{–uŠ%        ƒcVY
[ƒ$†:‚Š[h
‚Kƒn?`2‚8
%~;,„[=ƒˆ
Œl‚SdŠ>;<†N‚ƒ!Sp‰k7 \,.hDŠ{ƒ-'ˆŠhs„†yŠt…^†6ƒ%aCƒ[‚$+T†ƒ[ƒ-C‚0C

†W$† ]‡p„,"‚r-I‚…,‡.‚O^k6"K7D8Q/ƒ\‚„UE‚    …Q‚H(+†Z>„‡j<†Hƒ;4
ƒn‚
<‚ƒw:%„x+,‡G…
8‰6ƒ—„n=   ‡CŒ)…u‚y‚„ƒ>†v„<EG*v…V‚|H0!M       a|>‚cƒ‚w%!2„"(‚‚‚C
6~‚ƒ‚4:‚cTX69WeƒCJ‡l‡8‚B"8&‚Y…J‚p‡<ƒ‹'$„x#a6
‹ „\„Š%6•Uc‚hŠˆC:„"„)‰g†„n„]+†‚@P‡V‰‡"4…a6Š‚=‚p…D[m‰9Œ|ƒukk~ ƒ ƒ=%ƒ/
%‚8’i.K8@')ˆ„&l†`ƒ…S…‡3(b*P<†Œu4 D…#„Q~†H…+‚‚,„+ˆ‚A%‡gLD†z†1BƒM‡RƒT…O‚l*
C‡p‚
ƒ;„C„k‚(‚bŠ…I‡6p‚YJu•ŒRƒUˆˆ#“3‚(X;™,Œ]t‹e‚LÄB¡!8“†f.ƒr:p„fO<

!!ŸW˜€€€ƒ¿2¿‚2ƒM662„s‘Z‡dŠ=ˆAr
Šzˆ`a‰.‚Uƒrƒx‚o…"„"‡eŒCƒiƒA‡;9‚zh‰{ƒO}Œ7‚)„:‰l‚B#"   ‚&‚!‹$‚„.„`Uƒv~k‰5
/†z…(&d
ƒ:„l~W8*"m72tA>n‰PŒ8_1ƒDDƒƒsƒ^Žö&
}2‚K„G
z‡^OOUG„

M@ƒe‡`
m.)Cv&)k[Ig„
8*iVf‚k's‚2‚#‡„@#IWN‚<k5
h#
M>'.R,"*#
E    2'5 ƒ:ql‡Z_2iƒ…9R‡ƒ)?
Q
U„
C
bd‡)+.@e      v)^…Wˆb       ‰L‚2ˆ,…`—&ƒM7/(7ƒ+cG‚$‚bƒY|!‡(ƒtu‡%‡‚x4\…be‚5„ 5‚UuU…t…(‚-
C
‚*ƒi:zqq'Z^‚)„.!‚4‡jƒ/‡Jp     ‚
T‡r=‚—7¶]
w‚VYD
‚‡mP;‚:_i‡b‡Dˆq„&C„ŠJypƒJ)‚=
',ifXƒ2GCÍn
r?§5Õte—7
<
,‚6O`‡fC‚=—6
.?L 
%
;,w‚sŸ0‡
‚;!Fp
E
E,
9‡‰e' kz‚?‚ƒl?aCE‚¦ZA

<KI‡iq.
‡WL'¶]       O/ƒ5&‚J0EE  OO
8(‡)/>‚'
j‡`4
~‚
<i":%„x+,6M
X$‡**[eV
+HJl8,‚c269W.
J[E‡^
%8O<‡hA‚B—6#a6
‚=ƒn
6‡P=‚hM‡ƒ
S…Hg<ƒ\+X*P_‡Q
6-‚=‚p[m‚G>^[     ƒ‡MI‡h t R=%N
s
%Q‡qƒHi.{‡XD
J')J&I(H*P<E>D DY*<‚PNg!]%    LDžY:‡‚‡g~‡„"§
r.‚2JK)6ƒW‡‚g
qd>Mr
 
5a‚[U—‚dx2‚1‡ƒ‚,MyC
V9)%?[
‚p7‚)‚‚2n~B
"      
4‚‚‚„)*ƒv~
9

/
&dN/+H%*"m0S
>8_‡L6M,D‚0sammi‚d†-šP>•Ú>
„s…nP>pl‚&
‰2q‡P/š\
-™®}>Ö6 %$*2
z]'f,6>(
…Q’ÓI|ý<„g
/‚÷„‚J}®wY6 %z*2
r]'f,6>(
…Kelib_3 noƒ 
Ö0—ûX0n‚L
R!ˆZ:+R-”ž@!Ö dbox‚‡8…²
„H‘˜‚
‚°ƒw‚¡        
‚_erson‚

wich‚‚~•ñfe‚’†‚3‘(ŸbŒGŒ>‘ˆe2 ‚ÏyIË„E„Jit‚t†"‘˜…C„Ñ„9i‚$”–×6ta‚kVisfi„ka-1
]/ƒl†95Ö¤wF‘|‡f‹      ¤    ”‹-%!ƒ7b…MˆAšk‚Œ4š_‰w@,,…y_ª|%‹c‚E
°G‘L6ˆdBŒy½… ž)Ÿƒ6‚o„Ý?¯‚ÇL‚b6Ò^„@Ÿƒ‡ˆ=ƒ/,,…—3G %2‚(‡b
„ò
X6
.BƒJve%Šp

V5%„e›e¥N…j‚Pº[Ž0ŠW2C‚A…a  Z1œp¢H‡oŒwÕ(‚T9%<‡—@Ÿnƒ6Q
‚     ƒ    š. “Q‰}–„‡
zŠD†$]·¬!Î^ 4…-im‡$ƒ!‚GF…<+¯»n…y†O¿(„*,„*‘9       ¶i–]‹8–(/§f
E‚P‡<‡„N
‚2
O‚A—8 Œ1œp¢H‡oŒwŸ)Tü‹M®!„‡e     mT
‚`F@‚™^‡|DÝ‚     ôvJ,ƒ|)    
Ÿ>q_a‚‚ipoint       „LN
()
#

qT



!macñ”$&(9N!
‚kƒd
""ŸV˜€€€ƒ¿0
³’Wƒu‚#
¸H”Y
ˆT4´™z3Îc)
¡¥GÜMÝ…ýLƒt3Ÿ=I)
ÝU+Ã2   0savepoint_begin‚ñlÝÝreleas‚ñvÝÝ(ollback‚ñÝÝ1w‚Û1calabl‚ƒ!2‰”—9r

(3 {‚        ”
$'‚/-[„U‚gŽs„H¬e¬{«gI¥p=©%6=†lV§4M g‡8„$Š0
ç3¦:—„D
=¾I
=‡H#ƒ¥p:>lV«~=H—8>»=PÕw?e‚.eƒ.]n†0$2&ThŠB/&W‚A      
3(P‡o¡v˜D‹M”jŒ7zVœB‹=“
«˜X´O‚a
Q‚e#<ƒh"[ƒ,‚c„bb,QDAƒ)†R’7…?‚4‰z!Ž Š„(–+“b<ƒt‚ 5…:‡yƒ>
5] ‰0‡ƒO¡|”‘‚s!Lƒ
1 "H+ZO6@‚Ju:
k »1
iƒ     r
ÔR™|Ž÷4Æ1lŸ‚JVOüx
cl
CÃ
8e®Õw}" [
‚fD
b
;,Q$A®ƒ'—G¾DŸ+dÝO‚v‡†.—‚\
k5„ƒ<
5]
N B‚>"<‡ƒr
9¶S‚T‚s*ÝQ2
1       "H+Zp68‚Ju4
k        íƒ&

Hner‚bâìƒ2statƒ‰—Ì„      _estrxplain9
_
nam9
<loop<visitV
selectid9    u5Nr‚•`•êHcŠVƒb¬_ƒ–3‡ïfWi‚—yttern‚ˆ‰,Œo!“©T»rYr‡enario  a…f
>™‰`
‡u‚K‚Z A†Oª^‚od†yW”}ƒ],›2ƒsƒ*F
œ(gž~z‡rBDu       Šv)Žö|<ƒŸK‚‚W‚À-rT"
i¦ƒq=@ò„&zBDËÆ$JŸ'rKe‚h(‚•ùS&®‚hedul‚ƒ<>‘;u„KFa!%Lƒ     5},p|irˆad|oh8_   „t‚*w…‚*„oƒ‚
ƒ'ƒNb'‚u„d‡
)`‚µ„U 
¬Z‚1”ôMma‚wV       
E6ƒ $‚ZQ
A‡/ƒ;†K"L=Šg‚Dƒ]{k)‡4r„tT
7%A
1A
8v@069!
2&"&Q     eG&
ƒg
„i:‚Q
vO

$('
‚d
$ƒb‚ƒ
(9_‚7ƒ;Y
"f„Ze˜x‘V¨cŽ>Ü1…~:ƒ‰$gQ 7ƒI‚~0%:«D11ƒ!?±
„P™f=
ˆ   „Š“-‚ï{N/DŠ0
…P6’AK

 ‚§ƒ)T…g[{0>&,:..‹
„$‹g¨l‚s…‚%        :,‹       4Q*v"#
ˆc‹<•M„‹—*      …>‚`„1,L,p-4a‚6#{‰ŽW]>…‚Sƒ5r‚1
f
†0/7'‡_&‡S„…#‚a‚/?3„gE'‚\¥y5$‚.‡!™,ˆ^†=‹P‚X‚/O‘L„v‹<M(:‹(F{‚~ƒ,…as‚h‚Zk83“‰) #ˆ=„>4xˆŠT2C‡x    …w@"‹"„ƒ<5ƒb‚‚9‚#„[‚ƒ2  

5cƒBa„ƒ6…J‚„`‚QƒNTWf‚NA„Oƒk4ƒ4‚)ƒ=‚?wM‚?

$Jƒoƒp-2h…eƒ^ƒD‰„;
oz
CF
     
      1
   &I$F% Ž-–>—xƒu†u        .†<p‡BC‹GE;
   ŒQ †‚w‚1‚<R‹^„!@TW(†ˆg*&•T‚gs!‚f‰



%I#E$ `@
&‚*„!‚‚B7FŽ-W
"fe¯ƒB$‡,;ƒ‚Q‡b2

%S:–v11ƒ!?±
„P™f=
ˆ   1 
I„M‚Np‡Sk‡W;—7
ƒ26®o 4§ƒ)T…g‡Eyo&QG..‹
„$‡Ž‚s®kd‚%    Õu(‡j|ƃX‡i;—61Lp-4X‡c
‚4G
P0ƒ{§]>ŸHƒ5k‡gF‡%§/7'j—6E'¯%‡V3õO‚-„5‚(‡\(:‚F{‚‚Bƒ?s‚hNk8—11‡3‚)ƒC‡P
4xC‡_ 
!‚…l


   0
F‚
""ŸV˜€€€ƒ¿0²C–Œ/    ®q
#@OL"ƒ2      

5c
6PN
.3

$Jƒp2h,
žXz
C®n     
1&         &I$F% Qf„t .†<—4‚/C0E;
       s
o‚1
Q      oO@T¦V‡k4       
…*&
„
‚2s!        2    



%I#E$   `
(
&<KjbŸr0schema_vers#[^‹\€Òw^ †tÀ+>
‘]ÜM
ë4œŽ2…Þ†t5>
=Â~Ne‚‹0Œ
ƒ5F‚:Tƒüˆ        ›w„¢qT_neider‚U”ÕSll‚4
ˆon‚ˆ9ol‚†Aƒ&’…7roepfer‚‚ienc‚˜ƒ•ÒYm‚ƒ0.Y9h2”žj‚ç-W
h2ope*“<Wˆ)

…q   
Ž5‚@”-Œ0Žþv‚R

„Z       „É5Ò„—„i‚£k f¢oŠ:'ÝX f¢oŠ:'rev†c†(´!`Å2Û2‚%6c
MžnažŽÿƒ(D¾WD`J¾ŒjŠ-‚%6c
„Ù-aü†7tt‚üishv’\€
:\p‚‚|ƒrape‚Œ"tch
›f‘L^ƒ+ñ‰_›WÅ?…Ö~ÝhVeen‚‚I“?  †CƒRˆQƒ‡i…
˜a9‚@‰eÌne…¯TÚ!¦‚X‡fipt‚x•o ƒ"J5@…;0…

vŠ‰‚a
T†?!
†]•vN~•'‡O‰q:…Rx–o%µ ©A$0
%„`‡•U–I£        ‚d‚…bo#8Œhˆ!O„)  ‡/
<@M!!Y+„M,.
‚_Œg8§z;†„,&|…X5
ƒXš„[¤<k4ƒR>nƒ

UT†K>q’/
‚‹n.žmP8S‚l˜…)
)L
•04†A6v?‚4I
"Žþf]  —Q"J5§
*mN~‡_,§    C‡\Z‡dVs%  ^†$0í#‚P'sˆ?JGL@‚84o#8Ú^
<Õy5ÎV9‡X¾B7‚]g8‡„bN,—,
&|
I9ò4‚ >n
UT>q‡n_Æ&
5P8

d‚l

/
)5L—4‡b‚6voll‚X„nU”ünUutini‚@í‚db‚
ƒbêfkƒ
•*—ã    eamlessli‚„@rchj      Aƒ-YZd
’<
ŸI
“N13N=0k6„1rb  &…0 ?<F…G6
¢B        ‚
:‚A‹K<&IØN‚*…¾T”žMƒƒYdQ‚ ŒDV."0ˆ2„32D#,‰[Šs.       £ŠR£P…!`’B†‰"•#!‰‘8‰‰Ud‰!‚R‚5dgƒ‚078g"5%‚5‚):Sn‚ }ƒ
‚!3Fj       „I(,‰w†‚Y‰H…  ‚:
Aƒr™m„
.‡$5œ,‡(‡Tz'…ˆ(‘8ŒQV0„‹Ck>
,"’W
g["Œ/‹bŽ}‚‚,(‚† ‡K“‚‡II
‘0™Pˆut.„
w(L#!|2&     w‚Ce‚-²\©5°_‚LÄ!31˜Zƒiš_Ô—o
‚d
‡6Žþ[
 ?<}=„
6
¾="
           ‚
:‚A        
"&Z
ˆN@žmª”žMƒƒYŸ
QmqV."0E„32D#,
[„$
Œ{    )UP…!`‡GŸ†yÕx‰%#!‰…~8‰Ú\.®s‚!‚§
0§Cm78A"5%o‚5n)FS
‚ )h+F
Æ2¾*‚‚Yƒ`„u  oŸ%o‡Z!'K
‚)
V0¶M9Ck>

†x"‡…#N%W‡k„
‚CP,‡‚
0„n!
I‚V¶H
‚vÕlr‡iyw(L#!|2&    A‚Ce¾ƒ
1Ÿ
a‚
Y%tŸ>¦v
d
_auxvzVŽÿ{xVabl‚”õzcondœ#ƒ8ƒ?
ƒ0&(hsUƒ\%‚„I1^9T\…
ƒvu<3‚;aE‚=:.=
37#
‚
Y"l1‚^g      U,SAM1      ƒ*„}vC(p$
Gf†Š7
""ŸV˜€€€ƒ¿0Ä0k%3(…„‚
†e'FN
GuŠ,‚i)9}‚0x(<jx|-`‚0‚k„*a
ƒ 4ŒRˆ.‡…/‚B(„?ƒB„g…W’|L…3†1„9X‰yHƒ{˜9        …4D•{!4<‰(ˆ@‘ƒgUƒZz
  zØu‚$…WV‚4
Q DV‡]&mƒGX‚t‚6‚‰n¤7‰†TƒƒŒB’$‚tŠe‡9†[‹iŠ]
°_)Šˆ<‘*‚ŽV
‚Z…*u:—f'ƒBPŽ1":ˆƒO‚M@F1D\„!z‚"/‚.,@$\#<.‡-Š]$`‚‚1-, …V…HƒŠl…|†*u„=Œ‡l‡=d¨i‡}‚\Š6‚‡„q„^ƒ„‰„jŠnv:
:s‡UÈ}¥e…-‡.‚c†]„W‚‰v’/†R‚2ˆr‚•˜5 ‘(<‹SŠu/žUn
"\‰P„†‚w‚v‚:0š„    R^…`1†O@
m“3(bƒny6‰3'”[Pb„A‰(Œ,‹LŽd˜t„$ƒE0&—]-›5šL›w•@Ãy:ŠC†
&—J&Š‚a†b‡o—?
ˆ7*=˜$D‹O!„T‹K•r‚!‚”'†<…Tˆ9'f.Ž÷4‡‚Nlw5 —ƒ8\NS‡i&
F‚?
ƒ    q4D
‚m!4<‚
‡B/
~U>*z
    
3žÄ'L\L
A
sVJ&mƒGX‚t‚64„5ƒTbƒ3‚N~‰,‡Kv%ƒ Õg(—‚v‡i
†6)_
=
N\‡Y—9C"*:Ÿ]§}õFHƒW§,ue§‚0rd‡{Q‚2G5¦c`ONN‡p ‡J¶dU ‡b
7s‡,—;>z§@®s]$‚2Ÿ
|‚†!
~‡]$<?„u/‚‡M9®h\—-_7]`@5
C1 )
&
‚p3¦ƒvM§„O‡fqS
‚f&"}xBž}
ƒZ7O 
yAv*
ir$3‚0‡N?
0secondari‚‹       †@È%”7Å¥:2&J“‚„Έü`ƒŸ  
2&Ji‚^li‚„8£‚ret‚Œ(ƒOtion
‚"
‘ˆ‰G~vw‹\.›6—ž=“m!‚&Œr„"†/“}ƒl‚|"Ž8ƒXˆh‰IÞ)!•"‚(
‡/    !‹=
„‹D†\[T…=…¥šv—2xm       B-Œ‰‚s‡‚&D†T:…Mw‚=„a†?†
…R¥=†…e‰o„™{Ì;A(‡K
–A
„ˆLŒ-#Ž ‚q,"‡S7‰0bŠ…~„Q±   £s‹D       ˜o…«7yƒl™~‘f
9ŒK
×7‚*È+‚.¡l•5GƒW´c
0Žþƒp‡gQ\Ÿ$‡=
&‚y‚j!‚&‚Jr„"‡5l‡{®„Qƒ.
d‰Il‚(‡D2Ÿ
sÎ    i=‡„:dË7Æ&¾@+6;
&LƒW3}¦RÖ‡‚5‡^‡I
Æ0—9V#1$‡["
‡ 7…      bƒA—j‡…i‚yÎUn
<y¦‡‡d®k—ƒg®‡2
1ƒWor)
ƒ;%„Mœ1ŽrA7
       6#) 4/#j#„Q-  Ÿ;1(‚Bƒ_…;‚ 4
D'‚'ƒx‹/Fá"
‚x2E#    VC
B'@–Cø>‚ß?8$
       6#) 4/#j#„Q. 1(‚4"       2
D'MtO$„¢l‚I"
‚xŸ&urŒRbWƒH
rLQ_…K,NOKþ¢6ƒlƒi…v
ª‡ƒ=‰%“K
A
ƒŽ>p‚„-ˆ[‡Gƒ2”9$"„ZZ<c„6]…G“oÈb:"Ž     6ƒ§`ƒAû‚;

‰a6ü‡†kŸ'/‚‘<Ÿ,‚‚q
c
‚?]ƒkÞ:"“v5Ÿ‚(‚"¦‚Ae_deletg¦


š$Ä(†vÁa
$ùƒ
…Þ†v6
$d‚!•Œ9/e‚;ƒ
‚YŠIƒc‡f‡_‰2†F  „?Š+c‚@
‚Tl„2ƒ;+[
„v
„V‚
‚q36

     'D‚%]'1kTƒ
„$    
‚
‚**t<=
( 
P7Sfyle
%0j!
GE
:F_q
‡2‚;‚]`
!!ŸW˜€€€ƒ¿2Ä\Ux?
‚     k‚q7Qˆ|qn
,ƒF>r4K a
‚R[ƒ4f‚x$‚"=)ƒ"‚=‚‚v
ˆ‚P$ƒ.,
7^3C#6‚E„H.!Ib‚
K‡R>‚i‚v
…[‚S‚l:‚6J‚
„<
F‚n
'…ƒ,‚
†H<6M9N
JEb
…d‚?…a
Z
%Qv|
‚@
‚1%’
‚M
!‰b4ƒ:‚uƒzP-
ˆnR
‚$w‚"”
ƒ!ˆO<
ƒƒRj+‚      B‡„y‚cŒ\ƒ%k‚rV‰uM2ƒ<V‚
„^P/*‚8…0‡‹‰Hƒu…L‚„X&sŒY‘#2–&›D‹@Š"=“‚I
‡0‚Œ9&‚1ƒ/J†/˜!ƒ{‡‚-ƒƒ%      &†L‚4‚%‡g…P‚")Kˆ+)B…[ƒ1g‚(….ƒ+}Ps}–[†5‡6.ˆh‚gŒWµ=‚FšŠe—?#’k¡|‰U‹…‚H*3†eI‚‡L‚=|`.††&Šk‚8Œ‚”;ƒG0ˆN%,(;[b&&%,+#f[!cH4Z[cP6a[ [l 0`wZ" .^{9%]†6†g
ž+ŠIƒz†"‡A„AE‚QZ„v††2šy„<‰k¥/„`„_       ,3‚+@’wŠ`O‚0T‚YŽ?l‹j+Tb'‚/‚}„D6‚)o!V!x54,‚D+#f„2>…ƒD’C6OŠ.X†3GŠ{ŠV„Z‡%t„‚‚Y8YˆG‹8xN
E†W†Š_Œ~U‚1‚'~C      ‚Q‚‚,„s‡"_P
‰I…Jƒr 8*J{‚!0RƒPƒD3['|‹
,I*!ƒ2T-C‚cR=‚*:…N‰~XK†>ƒr„(‚)ˆ7†r„0U„…P‹(‰/—#„3 M‚…L—Ob ‚>±&‘Xmƒ…^‚‚    R‚Rœ[Q„d[‚O‡g„ˆABŠ‹4ŽD+‡J{gd„^„'‚}„x‰9HlL‚T‚k±CV]5
Œm‚&Z2CEƒZ‡1†SŸ“_ÌcŽ]¡k¤&‡|sb<“K7aƒ|‚*Pjfƒm……a‚'ƒ0_A…`
ƒCŽ\…{'Œ[{ÒGƒ) ‚ZH_†&%‡$‚,(ŽöSj?‡];ƒh‚
:§0‡
E‚']†‰‚I6‚H‚‡‚W‡!d3Š!ƒ{‡‚-ƒƒ%       &†L‚4‚%‡g…P‚")Kˆ+)B…[ƒ1g‚(….ƒ+}Ps}–[—5‡‚Qf0   ‚F%„@
#‹0‡%Õ;'B
Ir‡j
L‚.‡…"8Šk‚8ƒl‚’iƒG0…L
‚S7TƒYÕx<¾?*—8—73j—ƒ—3`§Y‚?‡MŠ:+{aZ65&Åz6N¾‚2;‡@N$‡b‚Oq?
IU‡'OB‡l—-
u„—ƒ\‡

B‚E†0Y ‡‚<‡&
…n
CƒH‡FY‡fPR%—†—e(K]
-g~
‚d>0.„7/)M-®)T
~‡‚ —8XVsb—8…t
.aN *#ƒ'5<—!Aƒ\&‡)lH 

 2Q
FH@q0seedj„‘‰ƒ
ger‚W”ÕUku
Œ&(
0¥pD Š?‰4ƒ-„g›|œ
ˆ;MHƒ6@‘[Ò˜„h       ‹     tŽöw
_(åM0‘"D Š?‰4ƒ-„g›|œ
«M„Éx  §‚:»’åend‚òRÝÞg‚L³M.Œ5fƒ4‡#‰.‚V‚A}(

]

q(I#RÝXLž.Œ5fƒ4‡#‰.‚V‚A}(

]

q(I#Rt‚Ðx‘K’)ƒ9}ÝX¼*‘K’)ƒ9}hit‚½47
¶vÝX¨f7
¶vl‚$Ñ  Œ(fƒ!‡6‹}g‚WÝX$¼;Œ(fƒ!‡6‹}g‚Wt‚‘+’8}‚CÝX¼:‘+’8}‚Cop‚úq„ÝXæ#„rowid‚Ô      W¤CÝX¿;W¤Cscan‚ú;Ýåmmƒ<„N„fQ;‡ƒdƒ*” …a“dƒ ?
k‰.ƒb‡@„§o‚'ƒ.
g
†4”+ƒ3‚,y
#:ˆx3†<¢4ŠwƒRŒ‚|QyŠ\†¿8ˆ?f†'˜f
”
†3’yc‚WŽö„tõD‡‚J‡…@Ý^˜c2V"$." 
""ŸV˜€€€ƒ¿0Ç ‘‹NUK+h"åG‡¶x
Ýe^¾;Q‚,œ2 ‡\9¶PnŸS—g„‡—&v§D»Hj®+c#
0seemingli‚Ý*ü…+n‡‚pˆ!7X2Ÿ„rÀ5»a›C”Z(‚Nƒ.Š1ˆ“'[Š¨šcxŠB‚/ žK¡6#ƒW‹~4…B‰OƒM†S“5—$ -‹GŠ      ‘Ow2Š]”m´hˆ;ÜU°W»aŸ3+‚þaÕF:‡ˆ-ƒ_o¾;lõƒ4<—?‚*ÆÝYQ§
†n‡e |Ÿ n¾†=—HUR1Ngfault‚‚
'Ñ&†>…q¢x‚^„!¬x•:     ˆR˜9ܼXœ…Y…€…6‚¡9id~öC’4t¾b
Y‡tment&
4(pÍ_¬b

bT7P*P
„/‚

I0,*R8rhì
;Yy –l  x)V`
V  "
%
8
/^0       —[   àn½P      z

b+7P    P
*„+‚

I0,*R8r-¾(>;Y   …      x).
V    "
%
8
/^

        ‡¸‘gÆ‚"iz‚–}“Ù;ldom‚g…h„2ªP™-¬‹bŽ÷‚eâK'ŸƒM‚×j
„›‚     ect
‚8>„M…:X<Y‡2
NƒQ‹#jC!

["#<)†8‚c: *
[\v]jW:F'+!"‚%0
YI2
@@…Q) Œ%"7 +ff
%     !   .
   2=w
)F9kU       ;;

j
‚Z}W"1$6
#4s)+'‚(‚‚t
Š:$”]‚) 5‡=      
';‚$„N)‚DKC
C   ‚
D
t    
‚{8(Q(L:VZ$‰‚†q
ZU    †RSWLbI:/KEf-(/&ƒp)(8%)(#‚-e„PM#~‚$e Ul|H       „Cr‰  |+FƒBZ$+'&=;‘›3‘Cm…!k7‡|Š0
0
n„[‚,‚=
=-‹!(-

‚z                    +
<„;6(z5EG'#C#+.B*1ƒ)!%Jz
!:pT‚'?ƒ‚)‹c_…q‹O,


(ƒ/DF,t„_       ,       k      4       ‡i<?[‚A”4‚
‚J     ƒB*„Š?‰&M$†lZ(1J‚ToJjƒLM„



      

                        

        



        
0'6
        
           


                                                                                                                                                                                                                                                                                                          


          „p… #Šp„GŒH  , ”x—Y…{ƒ7l{
WQU)]*6U‚8ƒ
ƒ(  )‚%r‚N
³@bP@
\$8
‡s&Jlx!„ƒo…L2KCŒ„?9ht 
s_
     V1ƒ{‰
Ždˆzƒo‡t‡ Bƒ/3‚=Wj…N+<ƒ=qƒ)‚O91        ,…OUkEI
I„g„8ƒt9)4G*r0KuK‚
             ,‰)OSo‚Y„:  ‚<&‚Ž@d"]MN
$)O*
*bA?†M:Ikd1C‡;b!:7e9„p•*1œ…‘}Š'›O4‚7H

3G&m;SrU2†aH‚

       
<    |ž0X2&‘        ]811{‚$.4
8‰


(



ƒ\=8F‚%„ˆ†9"!‚'4J‚‚F#w†$X0(4„Wp2‹=dz
>      43‚\S„'>ƒ  <‰E                ^‡‚=        R@‚V
;k…T;nW<M=I‚„+;&  ‚+"P.„KJzu„d      r      ‚1c(…R‘
mŠ:’Q@’     ƒU$
+
…`ˆ…HŠ+„&ƒs‚g ‚†k‚B   ."2ƒWSD¡RO*-„D‚m‚u!=™C‚%ƒA+R‚zZRL X&X%d6      
       q*W5NS<6„-,C&0›Žrj‰Z2…I‚_ŸO`nA  (       •‹QgŽ@BŽUŽ“r“f"/
Ž,?cRB_
!ŽMo03     F‘…5^]Œs<sA(LNJ@z#…lj|‚r‚H„zƒ,˜)-„~Œf‚SŒ|•u†     UQH
‹i"
ƒvƒ{_P!‚M‡@w„m:Lƒƒ ƒ)Žþ[O(L:@Z$„?(
ZU    §G/ER-(/&z')(8%)(#d
‚,P#‡U‚ e U      ‚B IH   >rM+
4ƒB
tZ$'&;,‰Gƒdˆ&)‡/
\|‚50—û K(M
=-„f6-

‚z               +
0*56(z5EG'#C#+.B*1 :)!%Jz
!
(p‚'?ƒ‚)‹c_…(%,


(ƒDF,tO   ,       ƒW  4       i<[I‚<4‚
‚J       ƒB‡?
H.$(Z(1J‡S
,‚T:<j—ƒHƒ.



      

        #ƒk#‚=V
!!ŸW˜€€€ƒ¿2ع            

        



        
0'6
        
           


                                                                                                                                                                                                                                                                                                          


          Ü&‚IŸ
”9 ‹ˆR…{ƒ7‚B—N@      \   ‡3&9U9!Ÿ

C§‚‡M¶U

_V‡h—‡fyu§#§D(_(oj?A34
¦#
   ‡N6/
rZI
I—5).
W9)¾7OSoS‚=      H
&‚N=]MN
l)M*
*CA?
„:)
d1)‡;b!:7-9
„e—0<7>

(
*&mW%S4SŸ"t        ]811¶PjA‚=ƒ
!E'4J‚‚F#5ƒP$X
(‡[‚KW… 2"ƒtdz
>       43L
sS*>?‡b:‚                       ^†c=  R@Q
Ik[;HW<M=@
‚;&   ‚+"P.
OK'
qud         
1Q‡Q
m…@
‚\    ‡NV$
+‡h
<Ÿ"ŸI ]#       .H2ƒWSD

*-žj
A—7
‚tZRL X&X
d6&
      
       q*W5N$<6§
‹‡fZ w<sA(LNJ@
P#
aj|‚;,
Jy)-—O‡hMƒ'®"‡$‚`P!M      0selectid2f

†
xŠ®$¡UG

c
‰7"ƒ>   u"‹L&             µš#Q
e"ÜG£u¡UõAÎ
 ‚×_sƒŽCÆ4‚w2014‚quŠCtestƒ(‰(    ¬U    !       3—Ì8
„      !       3l‚9
^ƒ+˜*{mantŸ=JBrPÁjnŽD+(ƒO¾>_(ƒ/µxÍ ®~‰"nŒK3‡_
õ%
‚Ó^(‚ phor‚ƒT•£o\icolon'+S
A.r"¢_yÊA<—Ì6y      <ndz}&4f†„ƒ…ƒ‚hi“|Œ(‚+„'
w
H'‡„ƒ. ¥
æDˆK…pŠX‚V‚.‹?
Ž$„†F"ÒyA®z+GRx‚r‚¡cÎ$¾‡g'ŒRO[¾;
E.(ƒ8b„+
‚.ÎDyer~u•j K‡1†]½KqA
ƒI†¬)s….„gŽ6D`“8_
ƒ]†#„t‰h©?#ƒ3“\ˆ%ƒ"ƒ0œp†RŒ`†!„<Œ
¸#k  †2× Ó¤hŽþG—5Ÿ[ˆf®A‡c<ˆƒ-ÝJ¯‚i >ê"ŒMqê?c`Þj¶^¾Ÿ   f®.¾ibl‚ez„w…{–˜‚®r$t‚Œt)7#C"UŠ        „<”û>ƒj
£/ƒj‘†Ž~“,™
½26
w¾‰`üf
Aƒ®‚ƒ?‚‰2¾C‚gåK)õ„&or‚tC‚d…ª|  „@
•Ž?
?‚v‚=½‚
‚Šœg…yÙSÎpÕ
ƒô‚xÚ     encf  žY‚w7@Ÿ;  €eU’Tj5À@µÆ7U»e„›§R‚ƒinelƒ…4JˆJ—ëT
J-pƒ
ÏBŒ1—ÌL
WBary
-‰H  ‚[
``
‚
y„K… „A‚\!<eŽ2fn ,‚[eQ ‚5{!
ƒc‘Nƒ
‡‡<
G.ƒ„
M`2…i5†jTd
vdxe"—D@L„l!ƒ2’hŠKX‹Y‚y~ƒvw4H‚\+gTD‡m‚;‰‰ŽFF„8¹d'jƒC‘#‚n‰^åf“r
ˆ)M‚lC„ƒ  y†Zo|†‚^,.-‚i‰Q‡]—
Žu†s‡u„vƒuW=
#„@
1Š^„5ˆh…‹
T„R‚V‚D„
L
‰Bƒ®1!„
gˆN„dˆ3(„¢V%wƒ„7[‘pM…)fƒG‡;”.#(…,a‚v…m‚Q†eˆ^M.£ƒx„2_‚ƒ.‹k
$&1†zˆ%2u"†a
‚p†ƒ6”‚tƒ‚‘qƒ3‹pq‚8Ž‚.
„wK„‚7Y„t‹<W†nPž]–§?‡jˆB{N>O
w…w*3Y'ORƒ=…KŒbl‚0„‚+Šu&8!C‚&6‚U%5~ 
!!ŸW˜€€€ƒ¿2¿ŒU:‡‚‚J.…„†h;„‚)vŽ?‹z)†`6d´A&o„Wƒ;‘ŠŒ.’O!ˆO+1*ƒ
L!Aq‘‡7(.‚/‹P5‚}„5‚[
5‚Eƒ&†aŒo!‚.˜6
3:ƒ:4]Œ=ƒz=‹?‡8Aƒ‚)„,J9IŒƒ\„~„)
gƒ65+ŠL<†‚l/ƒaD™q‰b=ƒ(‡…z‚4l˜3‘q„žG{Î.‚V&ˆ)„x‡Pk‚~™oƒƒ
[].ŽöM+ƒ5$
T
G
vŸ )P!OX‚&‡[@$.6
!wQH+gT'DJ‚G7„8ƒQ‡)
#j
v—Út“rHQC,‡`‚.f‡i
CoO„A‚^,.-J„p&†w"‚4pƒuW=
#@
1‡‚‚
…¦aR®oG®1‡.—9
L(
‡e7Nw%[tM=_mŸ"OÆh=‡‚{MåD
‡g$&1‡l"‡i2u§-Ÿ‚+‡oX<‡bL‚‚:¦dy?Ÿ G¶Y.(‡_U‡jE5S%N
‡W   (L+:ƒ‡a-P-‡i
7;—‚O‡—!6dg‡R@
Kƒ;&@†…YŸL!‡f„Eƒd¦z‚Eƒ&‚.u!C‚W¦f
0]‡!‡O‡f=§_J9IQ
C‡a
.~
„
N K65+‚
Y<
‚l/        B`[=—=†       9‚
l‡o:q„T„
{h‚>$'R
g1¦i
[]—70septemb‚…W°¥]qƒ’ Ï&3
'<‡Cwƒ/xN—´Œ(ÆH:3
'<ux)Oƒ§b‹Èjj’

        0ÎT
',
…E*Ñ[8§b‹§„%†¼Œ


ÆGw0
',
¶4~*el…‚jZ†1•›L3݆Q‚ƒ nc„
Œ      „QbƒN„,    ,„Uƒ)‰>†p},ƒr!‰<‚‰c…Wˆ _L Q.
K$


~X{(…E 6  
ŽVH”(‡{g,‚C   +"
7!#"…N†ˆ.Ž A·b¹a†f‹M‰Jƒ
*„›I‚Q»D| .      …lžRÓVŽvGx7±(Zˆ}5/%u
‹—+‚{« }‚=…K‰)
?+9
hïLŠ:ˆ{„‚t’AŠCƒ/@Y‘D„pcM/¢
‹[q
)9…
“A†M•!’}‚…/+‚
Ù‚JŠZ‚Aœ|‰4—fˆ-ŸA‰*‡°14Š8ƒ_Œ=9“=ƒ
Š~‡+‚u„Y+.
:…C'2)ŽK—>UX#‚@ +",7!#‡…J
!AƒyZ‡1soƒ
—2d&Š8I‚Q»D| .  …lŸ„BHT
ƒÕ¯7—6sÎ%‚™ˆ-¦lf»dCSŸ‰       <@Y‡_ƒ‡kLM/‡„`ŸV^
!)M7T9Ÿ'
:'®Q
d+®n;‡Q
^ žƒ|‚@!4
_
‚ 9B
0"§‚du—7+.
etest‚ÿ ÝêRtiu^ŠP‰
•
¢’4†94’iqXUqq‹Uqqqqqq†=°]À/‡;Žöy\
P—7@¯žj
D§9Ÿn®q4‘qXUqq‹Uqqqqqq†=‡à‚trgeant‚b
‚w%iSc
'a4^8_„j$‡(“¤=:®‡Y…yƒovh…X7-Y"Yã;¯"Ÿ"ƒr Á
‡8¢-(#Eƒi‚E',1ˆR‰F–$4§.p…yƒo‡rh—‚;Ÿ6
‚2"ü„y‰}ƒä,œ#u4‚‘ala      
ƒ#&}
!M*=_)5ƒ*~…¥#ƒC"‚G
’‚WD§X<Wf>%Q‹Z
†S8•H
‚@4ŠO'–†q„j"‘§Z   |f
3-  ÌR
¯
ü„j¶S
:Wf/Q‚¨m6â‚g‚°g‚TNF=      |f
3D       _typ‚Í*ݸ\iz|]‚8‹
Ã~
–×
    e_nocopi
You‚Ya°
0
=†Z…~ƒu
a“\>¸R’M˜0“Œo-…Rƒk„D
‚‹H,ž
ûp'
0
¦}rõ,%ÒvŒ'69ˆx=}‚="
""ŸV˜€€€ƒ¿0À“Ëi8s7œ‚À‡8å\0serious‚¢´yù–‚ß‚v†hŠ_Rˆ6†‚Hƒ‚aŸ4¿uƒ
…&ŒB¢h‹uE(›Iƒ4C«(Ãcë!‰`˜      v½MŸ'P‚Hõd—MXünˤ!„_lüF‡A΂^®01`erh„^‚
„N‘“*„        ‚;$&D #.       ˆK[%"†92m&D
a8‰lt
%(
‚*ƒP‚v     Š'•hQR)R


0K‚?Z'…w)
Kof#,.SQ‚_Q†>ƒ+@!+‰‚K,,T-‚„  ‰{…Z¿C‚.‚P„     †iˆG‚)=
Í‚~ 
ƒ†J&D .Æ'§®l

E¶W%(
®‚Bõ
)‚¡ 
.!+ÖL-%,O'ÝQZŸ—Ÿ SÝ!=
ÆH(—
lessw,T:0T       
V
8
(ƒA‚mS†US(:0T    Ò*(…Î`1icvy‚UM8æt
ƒ    ˆJ:‰MWN‡[¤d‚Q4H( …+ˆ‚(MF=--#[c ƒVƒT1>„:fMCJƒ.   ƒT‚a\3Pz‰pñ‚ƒ•
…&‚5ƒ:ƒ&    ‹.†OZM8ÖÒ&œvCNE( ‚#&„<‚(MF=--#å0 ‚ü‚zÎQ3PzŒUf”4ƒ.&”7a‡-¾‚NÆ3ss‚%B_†S—RƒIƒ„E‚/pCƒMw"D‡Y/ŒƒQ”ÝU
ƒQion‚‚
Uƒ
¹CL‡—G‚v'ƒ-@(j&+|";i2
#           
5DE!"j 2!A4"C6
.D+s‡!7O‘q
    …bB

Q^'
).…00H,,kY--      +,„„J‡w™LX> Mƒ†»mô&õSsT
ŽZCƒ–
    s¾=B

F^
).‚1H,,k*Y-- +,¾‚¾ƒUý‚,^‚#ôn9
„_changesetapply_‚Å.start_‚Ï.
onfig_strms‚%llªxxx‚«D objconfig_s‚ªint‚¯
t
|‚W…5;‚?|„N| WƒGh6%`^†8`{‚fŠm‡H‚a,+ƒe†‚5‚6‚%‚0*C8ƒ<„"5eƒP/‚)f„.“
ƒ‚WƒjƒQ‚1†H…‚A„.„ˆ:_81FO
lDje
 
G„1bx5
%
gq;RB‚@'E
9Od‚u<*‚U
„‚OK‚
f)H!a>Jb".‚g{
%z*jcL 1
m‚+I‚/%HM%!ƒ#6*ƒU


f      94ƒ@„u‚M#"ƒ< 
s)hX)
(
ƒ
    ";,v(ƒKU8
R!4SSW_‡1‚EA‚./BE@
‚8
"<‚W1,‚9‚7         
-I$ƒ>‚c,,[,i,:((iy(\S3&
?‚N>‚E\d90?


‚:(J‰B
‚O„h;ƒH†iJ‰4Ž;‚ˆ>JƒDƒ)>…,x9
ƒe"}‚k!-„yƒo‚Wƒ=$‚h„3ƒo‰U>„@‚…`Še†Rw„Cb-„Gz9]qfƒQ‚SJy]ƒHƒ     =‚&†3^US1,„M2p eN
‚@>z?_„PH+‚IR‚E‚z,…0N‚WFq‚.…/k'
$Š
C\‚'G=]
‚Z@Z„9…2Mn„y(r&c86ƒTP<j
…H…^„q„CZsf‡ƒRˆ
r#…\ƒ)ƒ
‚,(
‚Wc‚ƒ    >Ž
e‡ƒ8n     Kn
…ƒgƒ3r;‹fŒ,…R„m
>m$(tL-_‚_J("……?&~‚!„ˆQY=‚'ƒ4ƒ"ƒ(ƒ
GEH  {‰Hp%†PCˆS,‚k&A(…/‰Y0‚P‰a’.„WF„6]‚
„ ?ƒ"ƒek…]M(‚-„C>„'ƒ)!ƒ#5†/ƒB7‹8ƒ‚y‚
rNR/L7)6†3&'+C1Xb(lGL
~8&.

 DƒW)Z!"#U#%U?(/K-‚
(
-A.Š )ˆ,ˆƒ(0    D       4cG"*‚$…p
$0‚8ˆ~‹“"
K‡vYo
LV‹'’„ƒZ‰‚q%       1(‚6&  62‚&   M3y/„h‡
2R‚~EF*G%:‚ZŠ‚‡#‚\#
‰    &(
p)ƒM‡I…\‚Mk†\s%‚ƒˆ)‡„*ƒUƒ3
Ij
c‚5‚dƒ?ƒSƒe8Ÿ_    ‡
,‚KpRŒS‡IƒVƒEZ,™,ŽL‰C#‡‡]H‡>K ƒ+…s4\6„Y\‹L]?07ƒ…x„b2 
-$0q|/,Œ%‚#$"„w/g]ƒm‚Aƒ …+8ŒtˆX›!…V>`(u„~)&‚„)z‚j9ƒW
""ŸV˜€€€ƒ¿0Á‡'ŽH<‰Š7‚W‡yƒ393ƒ`…
##     ‰@)E‹r
ˆ‚‰,…`ƒ‚W„Š3<JW.*;ˆ
‰GJO‡UŒ|

]

R’ST…s% K>s5‘c,             
‚GG13      *†E%‡ŒX"…QˆUY¡„U9@‚l–YŒ6,„H„'6dM3Rv):&+
qx(‡dC‚z‚TE‚„3ƒY
k‡e*„G0…
‚T„6#‚(Ž4ƒ!–#.†?%,?rA‚2ƒ"„2?c[G‚G;,2
<JI+‚&WH
‚yt-C"w)‚2^8‡Y‚%v~F o{~;4?c?"Y
5D‚dh‚*H1[;:
5       ‚2    u}      j'G‚[T W,
$     J5#ƒ'‚k„d6†t8„
(
&       ˆg
#m‚o‹?:‹gz†b‚
†[‚I.<¢WŽQ–w––Pª`w‘&    ÇZ‡/hˆ@eŠq#‹vq)       3a      ˜}G"B†:ƒc
‚(3r2cA…6 3ƒ}‚v_„q
ˆ< ƒx6†R‚lˆ    De&:F”Œu’P†phX‚U!„‡B},•SD†])>ƒFPy„U >*,
XS6);[95
ŽöHC
‚O;8 J‡ƒ]
a‚‡`|W)K\ƒ=$&OM      @‡…\      %ww Cb-oGt9    
fNQOJy];
 
o&|
k,ƒM,.2p eN
‚@>z?_„H+
EI7‚E
‚(‚xN‚WFq/#'
‡-
C\‚'G=‡h
jO
"P„wn„y(r&c86ƒTP<j
…H…^„q„CZsf‡ƒRˆ
r#…\ƒ)ƒ
‚,(
‚Wc‚ƒ    >Ž
e‡ƒ8n     Kn;‚Kj„+„m
> 
m$(t-_
m.("ƒt‚\&~‚!„
…aY=hƒ(ƒ
Gq        SHp†PC‚4E‚f&A(
P/0‚P‰a‡Ÿ
‚¶]
nx‡h
‡hiR/L7)6„&'~
C1Xb(lGL
~8&.

 DƒW)Z!"#U#%U?(/      ‚
(
-AN.)ˆ,ˆ(0  D       4cG"p
0‚‚
8ž~o‡e@&
ŒN632Ÿ#O8®8‚T‚2‚GŸ
‚Kp.‡k
cSp6‚-G‡ijc‚FC#p
+H
@¦]ZÕ }J9‚,2 
-$c0q|/‡YD%‚#‡`
"/g]N
uƒ QV
‡YK
?
#        L
b)EM
ƒR(q~3<:
 .*‡PL
SJ‡f(Ow—‡a„9% K>s58V,          
‚GG13      *b%K[`‡*
‚
Yt
)9
-‚‡^N…,
„*6dM3Rv):&+
@C(g‚‚T
'‚JT
‡Ei‡l

c
‚PƒX#‚(<—-0?%,?Aƒ"
?c‚G
2
<JIu
&
(
9
gC")*G‚%v~/ o   {~4?"Y
VD‚h1T:
5        u}      jG
T %,
$     5#'¦D
zKK‚
F——;c‡kZ‡bƒ    @e
H#vq[)     
a    G"B&I
—@3r‡cbƒ% 3„]      
ƒ ?
‚‚8=pjmsƒD       
+)¦p>0set_author…])>‚cœKÈ:+
‚;†%…2øƒu‚Ïq
0‚¡„<»?Bxdatar/";
4C´B°;ˆ6      ’ÝŸt°;ƒÌtvlast_insert_rowid
Jresult_‚w
®mtdoubl‚-Uerror‚-Yint‚-Qstr‚-Kcooki‚ÿ>îDÜêptingdefault‚‚“ÉupweŸ!0ý-H‚
†q
›_‚EƒMˆ*
‚p‹…OŒpkªw
ƒh†NaŸ&¶èpÆ"
„S
åXHŸ.ƒÌ~1Ý^k‚™AŸ
‚zven?øŒu‚ˆCŠ'ª>Žþj¾nK¾4‡ÿth
„9Y
‚+i‚b…8g‹Yr¥:ƒ—g‰3–/
8D[” ŒYØK§W5h    
–zB…¸6ƒ9    Ÿ)~
|ƒ    ¨-   ‚z
„*– ‡"<ÇQT‚=†
RƒYƒSŒ‰Wƒ1‚
‡RƒTŠ,Œ%’‚1W‚„,‚<ƒ‡oxŠ@ƒ‹sŒ_„.”I
‡Z
˜iL…p”jŸR–‚K˜vB'7S
""ŸV˜€€€ƒ¿0ªŠ+†G™J‚+ƒ”%Žþj¾eTž“     ŸƒN„‚Ž
L‚+       v‡QR‡gymÒy|íXF¾å§ƒq®oo‡‚tY1Z¶a
‚L¦…í1‡nžB
ƒK‚+®W0shyƒ  #1†UY
ÓH•:–&O#1Ý^5‡Š‚xÎ6—!a14
žI
ƒm8   .Ž„
G”ž\M8   ‚ç6uG
íG3•6
žD
ƒi.}„" ‰D«+0     gH”žI‚ç6n
I"Æ„10       _queriƒµs—Ìsumƒ‰A«)16—Ì„.16de‚Iow‹hŠ
‹9`õI$Y/–„æc˜)
„gU’$1Žt‚:…
# "&<.Íf*~/1
'
        !
ÒM
 Žþ 
I`¾i_$Y/W¾M^í
kU®†s‚þt¾0>
# &<¤
k*$F/1
'
  !Ýf£c
…keƒ£7˜š[!llc&0l‚P+0K!!=%
'!#B'A,I682i5'6`VIO…˜6ƒ?R¿’–ׂI”(ow‚
ò”)ÝB
Ý5«tHpe‚K—Q–k˜D”—Z¾?Dü|Ÿ„Prd‚†ce!‹[Q
P'&
)* +A                        5#p(J           
*
…]>…?ƒ]
 ‚p †ƒPi…!‡g‡*ƒs#+@.    !$K
&8’h)¸z°4n'0
'M#‚^w7;      
!™wì2ƒO
&3ƒH‰‚^@`_…Íp
ˆmyC
K
+ƒ+ Z’F+B$‡rg,
B‚\d'†/HŽ     NT…,
#              …N‚Fƒ{’CŒ‚0„&'      ¢{T…&@U?$,‹‡E  „w<„!3)…f.‚U…@ˆ#0l…v"

5ƒE%bˆ@‡jp-4ƒ”bBW>.6@„En
e‚™8ž       ‹?

        †ˆ)‰D…p
"Y³^–<Ä|ª0 u-!‚~z}8Z„GO1`…&^Žö|i
T!>m+@.!$K
&®ip—ˆ#'
'1      
&7;      
!O…)ì2Ÿ í.]„2
Ž@Òp@ŒTN     N
9,
#              

‚O¦b(§%åL
)E    K*"

‡M%e—9X—ƒ§+¶V
"BW>.6@
‚b

—)'^x
S    )

        eÝ0‚5‰D…p‡cKc%®2
0-!z
s8ZUo,`^abl‚ƒdcach‚ˆ2•»&Jp‚‰•Z’ë)‚þBe‚
IwìY
"„ðll˜=“&ƒ
>’“n¡O¶\E¯v4W†N…`
ˆ6ƒ~…jE„B
ˆi"       šR†C<„Ü&ƒ[R//|ˆB4  0B±4kb‚q†Z–$„Dˆmo…&‚/‹Z‚0)2„:†w%  
–9iN
ƒCŽ÷mŸPƈ} m¶\õ§…M4WŸ {å6Îh‡j—;‡g"„h”;%R//|—<@Ý2Æ)rRÆ%eO¾@„6koN‚0)j2
            —x§
‚Uiftˆgf€/(±G·gÆcº%ÜQ
ëa(¬ 
I„é 9壂rleft‚
€.Ýë`right‚
€TÝìm
A‡]„"‡bk+]/,™1‚E'…a•£=3k+]/,‚‘“=‡b ]'„„ap‚…S—µ‡'ment‚‰>m“2‚      6“…@
„ˆ7jI        
$
KF7!
'5    ,(E-„eSsYtx‚%…
ï/Ž÷‚6
U%†¤PV”5,( 
$
EF
#
'5    ,(E-SsYtx‚%ƒEË4-_exclus1
!lock1
nlockshar1
unlock1
"ock‚
"‰í 
     eisha‚ŠXot‚¥N”Õwrt
Šd“5’Q
„c
.¡’B³&†eÓ‚FƒŠ‡H†n£Kƒ†…q    ‚x\‹ÊV•NŒ
“–xR3;š=Ž÷bSIm!‚v"@‰f"…dV
Z
""ŸV˜€€€ƒ¿0ÆÀJO1žlOQ¶…*å]Z‚ r5‚¨‚+…¦ Î…@   X    ‚3;Ÿ    0short_column_nam‚Î9^†w›3S§9ù‰t…Þ†w
Scom‚    W„xutƒ•—Ì=*en~
„Tƒ\N¾‚]rø      ’‹Hª;„w½KHˆ†v¶st‚c\+"Q
•Ò]
6+B"Q
hand‚U
¡,”LÚV’[”åõ‡ýB¦‡zliŠg‹.@‰puldxl?‚j„'4
  ‹!
©SQ…zZŒT‚7ˆw ‘J‚%9G
ƒ
‚^?
„|
O#
87
,4'G
J>f…jG
&j3‚?2:]#`„u‚~ZK/ A‚
G„)r/Aƒg&%
†
s
W4u‚,K"ƒ
)‚Q„Nm'‚bB)^
y
ƒˆIG(ƒiFˆ6(…%ƒT51ƒ\IO‚?(uZo?†‚U>    5X$0”Y†…3‡E‰y†r  d"”S‚‚(‚@l^ƒ‚"¡`@/“ˆ4ƒ8ŒD1ƒqƒA‚N:      ‚|ƒYR5…o…H    ‰t8†A
Z*N‚,/ƒL‰|H]‚
‡k‹aƒh–L„ZEP„OŠu…)ƒGŽ"Mž0AŠ
-&
’F„(‰-‰G¹=‚Ql,…y<'† :
‡4j…z‚^.G„*ƒ!„
z#„Bˆ4”=‰W‚s‚$…hš•+o@] AŒ]†=‚x†„Pƒ{&‡)‚9‰l‡ƒ.‡…7„Œ7Šc‰E!U
‚|Nˆ>)~ƒ@U>‚c‚*kHXƒY†^‚,A„Cƒ=‚$MPRƒJ
Œ1Cˆwƒ…0‚^Zƒ=
ƒk‰yo@d     r…3 „>ŽƒVRM‚
„=”:
m‚O0SvU/„t-ˆy¤TV‹……W‚c‚K‰„&…„‹'„lcŒ„-ˆN…C…"‡N‹OŒ—HƒlŒ|‚>ƒJ%/Š@‡[Ž0
]“ Œ`Qt„7Vf+
&‘J—i“ZTˆh‹>‡ƒYƒ
‚ƒƒ&‚l„"‚‡A„0‚@‰‚lƒŠ-…-Œ˜9ƒ2ƒ
|R‰dˆ… '      ‚x      t      „XK    ’0ˆ>
‰lZ      †0„Fd^  `…w‚4!‡)…!-…u‚B‚0KˆVŠ=‚A`t\JŒM!:n‚‘C…>J‰§KµžH©X¡-“$KŠO_R…„"H‡{‚O‰I„-ŠP
µD
VŠO
†//$•kˆd‡vƒy
†F
…3uGŽö
„'-‡nR        d§G‚{‚"‚`‡e@/ kN‚`
‚y"‚Xƒ‚N:   ‚[R5„x…H   n
 ‡/
Z"*N‚,/ƒ1‡luGZq5>bƒh–L„ZEP„OŠu…)ƒGŽ"Mž0A_C`„j$
=‚!-KO
‡b)      Š)
dÎ
F‡k.‡fˆJ‰W‚s:…huXo@]<‚u#‚7MMvœ#b—5;a8nR‚p‡s—ƒ!L\

6Z\Ÿ

3 ‡‚Gƒ   ‡f?
h2¦c
?Õ7p/‚&‡a
-U‡<§HP1—3<%/‡‚X—‚s‡_\†ET
      Qtf+
&‡…
Mƒ‡O„ /}ƒ
‚ƒ.ƒ&l""‚_ƒH‚@C‚‡G‡kGŸ‡o^—0
>Q,-
"    

    Y     m          
'    9X
O0    P>d^    ®7L‡a§„[_R…‡e
     "j§ƒ[‚O.‡„[„oV
ƒ6T(K#Q
(%—‚n‚6”Õ~w    ‚3
’    ‚<¢$L$3j‚<„y*}†<6[†9$‚~
‹F‚“`* W‘{Õ&.rƒT•p      ¯9‚~„T‰5¦] a!•G‚Z„QˆD5aW&yXO…2zD
‚VI   ‚o•"†Dˆ. ƒ    ƒm†jˆQ‘…v’8     (n”ztm‡u‹}»W‹0‚~‚7‡%‹6Š!Ž¦;ƒ9
&†^–U‹q4u‚/Ï!D
‚2TŠ5‡.,‚X&ƒM3*^/‚d
       &‚&‚/‚f‚,!…i„mD….<N43„‡%^KpžU‹c‹h&Šl3T=‚r¦k"‰«¹,b‹3ƒqnŽþ‚:\O}JX![‡e
$—3cˆoŸ3xŠP'.—:6•p®-n—66‡‚W—K
  _aô'*¾<3%WO§‚TÝ‚r‡h_`Lg"               ühbF&hgG7"<”w
""ŸV˜€€€ƒ¿0²”è(3*Xp‡Z§
Ĩn
=lŸt—‚Ÿ‡s¦‚/<n)žDT‡i
ƒq5
‡     ,‡mM03*^/c
       &%‡‚)‚,¶[4‡c~|.<N43
^Kpp     K
&—3T=‚M‡v"WJ…b8Z:¦z
ƒq
0show_datatyp‚w†VŽ7n‚–K‹sqDƒy‚B*‰*K„Yœ3
…[„_[–W†…#ƒ&Š.‹#8’u»?œž%•„{‚J‚s‹4„
ƒ,3 ;‚u0
,‚‚ˆ]:‚KˆHŠƒw8"ŒM…YŒ‡†h†BG–„ ›<Ñ‹r7ƒPŠ…`ƒ‰ƒ>Œ9ž"ƒ–   £VÂ"ƒƒN•N‡?ƒq¢¬:B
‡7* A„Z”Î’|…g2?„sˆf}$„j
>†bWƒ~Žöƒ‡
U—e+S‡4
!]ŠJ‡ƒ~—8F§    Ÿ
,‚¶j‚Z—/
/3—_G®YE$„h—8a—;O—8aÎ`V^|/‡`B   !#G¾ q¾B¶P(—3ƒ‡—:9i5‡ƒ:2‡‚‚/‡‚X‡O¶ŸƒqE?¦N
*P§—8‚2?—5S‚pj‡‚pEL<8¶UUrink‡ƒ‘>Š|–×0b_memori‚- †yÄ$–׆y8agƒŸ˜šW
tml‚‘ ^ut”-§D
…LŽ÷#f†Û‚ZÝ'Ldown…'(8,
‚K2`"
9
r
[f"ˆ%
ŒnZ‡G
†=Š‚‚)¥…õhi”CŒL&*i‚˜‚ablx
„V…+Ž\‚™"V†Š7sankar‚4ƒ‡zcherung‚‡jdeV*„F
‡i
‚F”<‹}‚~-
!$l5
ld'aƒ„p
ˆ‹cA!Ž^ˆg"A½ Õœ9°a…`• 9*šG
„|
…GX     ƒ'      †    Ž‚h
EϠk

ŒK˜pƒQÇ[
ƒ[y%7‹R”},ˆ\ƒn:
‚'%)[,,–j¦E…‹"%      š„\Œ!]
…
Ñ(.–,
ƒOŸ\B"A‡ss¾‚Püs‰-9*^Xüs
‚
¤
Q‚hŸQÎ1¾>
c‚N¦Ÿ%j%7¶‚nˆrŸf"1:
‚'%)[c‡i[…
‚%ÝO„\>>õz.e‚4
ˆ     Mft‚ŠYght‚†L ƒAƒ.mod‚S
07”Õf
.7n

‘†ssŽŠh’+]2C‚+
s‚^‚M 
u
‚ŽM„S“'÷JƒB)‚+â ª       5…m+‹QŠ˜¥y       „Rƒe±85   †*‰78‚PmL’mˆ6Œ5&
‚-"‡l†     ‰& ‹4H‘h‰
†&—†^9o-&3<µ"‚>@ˆ         žs
%)Ÿ1]45)Rí‚m
:5ƒÌX
'mL
0f<ΌC
‚-"Ý`R%G‡‚OLŸ[H\ 
9†&{,¶:7§+al@‚b,ƒ@?Š"<ž {0,<ƒ15ˆ[ƒL=+>‘(ŽˆRŒEËNƒ   gŸtÅ+ƒy{§‚        ,<»‚°\`âGj®Sh;turJƒ=‹™$¹9‚N!R¤&/?‘§l@‚h'ƒ-rifi24‚
¥Ó`“Ø\
‚ÿc
†‡/4ƒX„?‹‡.¥O–!¼J”hÇhºQƒ¾z–·&
-19}`+…9
F‚K£A“ƒ,h‘‘i…
¡k¦P©     ™
“G‚o
r8ƒ~#Œ^kŠ{„|¥n¹J
‚\–N~‚Q‡wg
Xu6žs³ºQŸ%
†2RO&
ü§R—       }
΂G”ƒ¾k¾5¾…^üt"
‚     Ÿ‚    ‡„+ÝZDÝZ
8P
6#‚*Ÿ-‡TE*.…d   antliƒ/Jo:Yíwƒ%;ƒfK‚sƒh†.&R“VuˆŽ÷8Ÿ"?§ŒV‡ƒ!‡h6®r
 K‡h=ŒO„‚»8oÕƒylentƒ(‚i‰d@uh A
ƒB?z„q’+   Š+ê:ˆ[Vž9-¢0‚S$CƒcQ‚¶p—\‰,•-©Eˆ?½Ó\Žþm0+Æ'‚W‡/&)./„'„ ([(ƒg/
""ŸV˜€€€ƒ¿0¾Iÿ
$‡5õ’F‡ƒÜB
:Q"‚j!!~„ôy®{‚00similarHŒ†R%¤:[ˆD
pR‚A„uŽu‰„1c‚"HFf`
„
‹E*„VH:ƒ}‹=JˆR‚t„*Œ@‚A‰_„66Œ9Œ@‡‚A_TŽz=“Yœ&¢a·
„Zyˆd>…H‰‡ƒfz”eŽ6‹/‘QŠ‡'g:        ‚9ˆƒ
P–N”A‰‹’?Yh
k.Žsx†‚yˆ[ž…@„     Š†™{^µV
!=G„4
@ƒ(¤A‚ƒn„MˆH•e9šUŒt5c“<‡h‚„k—Œa‡T“D
9C†- ‹O‚‰H„*$µ8‚W•*?Š•‚\B,ƒH“_P‚bg`…-k‰oŽþgA*W§       \8‡g(T ‚u
6‹0ƒC†O8_‡)P
…j=—ˆh›/¢a·P‚„mY…^>ƒ
7
‡C:ü].Ž2O=
VQ;.Æ'   ‡j¶Y+¾?'ÕyI‡_\¦`Si‡e>Z¾06‡-‚‡e7UP§*Qb—1}c§
:‚„k—ƒW‡c;ÎC‚N ®qA¶NC[F?F(      
‚c,Ÿ  6‚>KDx4
li
‰
†]ƒ{‚cœ"‚R„u|†$;%‘:ƒ|‚
–
ºc©]œ?ƒL¤W’‰H‚1…,»3‹Q
„<JcƒW
D²4…c
£t†]Å_§NU.
„#ˆh‡]Õ;‚ï„!¾F¤z¶‚?åkWõ
pl
ZJw

n"#&cˆM{ˆX&:6‚]‚%‚S
…ŠX‰;¡zs+4‘84OÈ9[b‰…&ƒ@ˆ3d°†
 f7oZ ]„˜[AF‚Yƒb†„3‚„‡„Q‚>¤w‹_…„(‡M[†*aŽ
p‚X
‡_A^•\‡¥
9‡h
$‘‡Q8„
ƒV>’
©%ªM‰yŠ‹IŠO‚G„‚PŽKƒ+TŠ>Ža"ï`
„eŠc
‰6#Ž÷      ®kVM§
³kŸ
ƒ„Tƒ=>d…a„~.-f7oZ      ]     
      A‚i—‚å^?õM‡‚ý‚M”2\5¾D‡c>‡u§L'‡f3]8‚‚Ÿ
‚|‡h
4—i„—$5¾;
¶Y|‡q$ÆŸ
Ÿ!
#er#
&†ƒIk…‚yw—Y
“H:¯D±Lŧc%¶‚{‚ö<»ƒB‡h        ƒŽ†—select‚B‚a[„Uz[_`Ya+     r@‚=^‚t‚‘@…z‚h¯-™1û‚`‚ö‚f‚þyÚWi‚e†A‡f‚B5%XK‘O›Z•+¶
š?5$‰!…4›LåbŠCŒA=…k  e‹3MÄ‚W²L‚N      …    ƒS¥g†_‚>ˆF‘I‚‡D
UXs‡‡s‘Šn”r© ‚’ƒO„‚ƒG‘.d¦/‰$‹F…)„‚ˆ”*•:Ž~„"‰„AG—|•W
„z9   oˆp‚t´*‡(*
Ž`zšY£Dƒz„ˆTƒ”v•Jƒ1ƒ_‚>×,„G„%ˆ+Ÿ^SŽ÷‡jS¶\k‡‚5Ÿ
…q5Q‡‡<f3Nå      K?M‡dk‚!
"ž7Õz`"ÕuY§
l‡e‚m΂f)‡e@‚#oÆy¶V
‡n}‡_§e—jRŸ&KH‡‚h‚B„7‚p‡    ‡*9Ý]
p‚t¦Y‡2zÆyo=—‡l/
‚"‡[9ˆpƒ72eMBc”'-J     ƒF„
½†•$f    „Îq
‹|g£‚a…¯C„i‰¢1r
ƒw)
-
„
‚7Š¥6
"‰bD‚f†,Åa     ;ƒ©8˜}øo
ƒ)‚‰R9§+¯³CRN¶+,Ÿ51ÆxŒ‚4‡v.son‚¼     ul‰'ƒm2†}
2"w-Q 9   ˆŒl&£1Ä{,Œ9ƒ7‡&h„‘ˆ8
Tf2"Z-Q‚Ð%,žy«„7‚È‚u
"®~!tan‚d
`…’;‚0]‰3‚'†,@†g*3AJ
""ŸV˜€€€ƒ¿0
ɉR ‚ð2‚tŒO~®:„t…Z„‡†uŠ#‚55#¢z¤Dƒaƒ
ƒ?‚„º        ÉYî2Ž÷
Õxw¯‚ü„ƒf§4ÎKÚ]
3#¦ƒ_útÓVŸ†R.0sin%Jƒ‚&
‹x”—tatra‚d„d‚/—n•Ú>ƒ*‚/
ƒ~nc
„x‚Ro…)F|9bi[p‡„4+ˆw$%ž`$g4:         
i$"a'}MC‚R‡Nv4     ’ƒC‹*
ˆkeZ‘G‰z’A‡+‚'„"‹ˆ
/’y¢Ë"’l…^‰I|ƒ^ˆP"…   ›«&•D‡?’*¡Mƒ*C„x‡{ˆ~ƒ7†ƒ`„hl…„R†\
{P&‚Mƒ4‡n˜R¥      ˆT„
^ƒ1†dŒŸ
†ˆO‹
1,Ì4f,…P\Š…
…{ƒ-4‚|4„Y„‚„:ƒ5
‡Bpb8†Œ…V‰=‚ƒi~‚|b…&@ƒ5]SŽ]…4ƒy„3‚!kx‡       ‚`;…S†`Z†&y‡‰@…^‚56‚Šu—w‚*ŒH‚  ‚TŽgƒS‹Šx‚J‚=Œ‚;„^‚/”2ƒs‰ƒƒp
5„$
LP‚?„%2x‹ZŽ…vŠ
…[A{‘fŠD9†w…ƒ,„
„QŽj“tˆŠxœ>ˆ’.D(<ƒ'‚4‚…Y…K†8„L„|+t_ƒ#‹ƒV ®5ƒZB‹3‚8‡$jˆop
œV7“s
‡
$”S…DQžZ§i“WŒæ`ˆŠ†G¦‰K‰vL™9†‹a`‹vºz%¤S„,Ž(ƒr…o‚,‹Ž*†^q†[zŽö‚0;®f,<^g/‡‚[0s
ž=]MC†
…\&‰ ">‚D‡]v‡S‚QC~  Î)—4y‡^hƒ4xƒM†}ˆT„
"zI&v0iƒ3åC~O‡fYåIg—9‚ƒ@—3‚¶~/'S&‡Z
S/'V
:ƒqKSx‚;
K;‚kÅ‚>‡r®k   …‡[‚=Ÿ<O0!M—I(%2‡—‚‚$†#‡_„!A{‚q
ˆQ9M4
‚9,.‡a*‡"‚d(‡=†9‚¶G<}A"ƒ((
H+—8(0B(‚8
:jƒy¦R'0,J
ƒv¶‚*w‡4—…+n(‡@
‚_‡T^‡h
Gh!
q‚‚        Z
‡R‚er‚ƒFd‚ˆe%
„\glnZej'hŽZp„pR‚_o†f&?|Gi3‰5_‚C)‘Si!D‚^ƒ
‚{X0Z0ƒ{' ƒ)„Oƒ‡3ƒ"‚h&u†O
&ƒNs/Š-ŠyU0
.
{‚     †n‚Sƒ.
F
P
‚rƒ0„4‚#~ 
aJ’‚X
4X‚=:J„[%Mtƒ44ScKŽ5ˆ5m…‚7…x“^‚G(…H
ƒ>L,Š~(
ƒ?
ƒ2.ƒ%…>Q‚G+-,1†0‚X‚)f|‚&#„hƒ‚UU!1.G‹C„`‚„Xm+‚n…,•uƒfp^    %„j‚]„<‰jhO
U
[ƒ3‰F2{„%‚3„8ƒ~DŠ3"  …ƒe-CŒX‚XN43‚'5] …Q<"¹J!šQ/Ž)h(ƒf.‚+ƒo2%P…e;ƒh†G‚O„jƒ'
ˆ$‡   Ž0ƒQ‚‡ .2ƒ„=gr‚f~x]YˆxH†ix‰ƒv‡%ƒt(8†‹3‚ƒv…YuˆLQ‚M:
…4sg;„,†cY‚Zg X‚W
‚jK/
-5„Š4‚E}ƒO‰ZUAI‚`T…ƒ:„q4B|-‚YAŒLz„{GŠƒ&…‡˜5iY„e…- V
X=85'‡I"Ag†4‚9ˆ
†+„tT3…,b‚2ƒ&‚H9ƒ)ƒRƒf†MƒG‡_/‚AS7„d‡

ƒƒQ-‚‡3ƒE(~„?‹:Š|9‡I…
d8W9
Œ-…3ƒ‰t?&!‚u2†ƒ#†%‡b6%6„!„91„\ KU„:E†‚A‚%D)‚H‰„[’M*H„
],V>ƒ#‚‚OZ5‡^‚X"
#†.4%9a&dBSlCj…zƒO„\8‡0ŽY$#‚hRW„U?+C
„†gˆV4T‚‚R‹o"ƒp‰\‚-1“nƒe‘
ˆvc>†'‚Gƒ+‚H‡+xX;‚3‚.‚;‰A‚P‚_
=r…3iD2,*(B:Š^x|‚U†.†"uŒb‚k‹F<4‡Geƒ(ƒ,’<…=‹ƒB5ƒ'†#šHˆ:ŸJˆ]„0jƒx$†s‹xY‚@ŠN0ƒf‚*\K_‚u~IQ(‚[‚0.Ž‡fŽ)‡,"‡g.$†$œˆg„h‚‡/6ƒ
‚|ˆ‚5b-qKŠA‰Y
6}„|ƒB=h…w‚?]…2‚Bƒ[„3sY…

      „e:„N-]§M›   #™R*‚=¨&rŽNŽ)‚DƒD$…C'‚h‚ j=|T(Š‚~†Ie…'‚m‚ˆD‚h‚;†i‚-‰9‚z)Ž<


""ŸV˜€€€ƒ¿0Ä&‚0…Oˆyƒ
%&…yƒq:…a‚™‚+J†+4‡x‚0\+v`’v†1+‚aŽ‚,‰
ƒH„Sƒ!„/-„?„`u‚U„"‡R„ed
„F‰}Œ'b‚‚_Uƒ    ƒ
V„wŠ@Žö„%‡‚yL,p(
V‡;‡h
ƒ0.‡kk"K‚U
!1—9*
‚(m+eQD P^)[eahO
U‡p
[(;42{, „8ƒ~D

d‡{       T-C<
kN‡/30B‚4"¬)!šQ/Ž)J
4fK    =2%Pn‡;ƒ
'‡i
0‚O„‚-'

a‡    6‚‚„I.2ƒjgr8~x]'
ƒH‚(‡‚`ƒt(8
ƒ‰D‡I‚X        ƒtEŸ($H;®o«j„‡nj}gG+‡fR7
!4‡b-‚YA†z„{GYƒ&‚^‡‰YƒW[Ÿ‡gX)8
'‡k      /Æ!QU‡iVåG)‡eT‚_?
3!§5 §‚61ƒ&JKUw:E))
i%‡)$
.
*4ZQV*,‚Hžz ‡h!aP<‡K?u®
d‡YB
,RWI?+
%
‡a>eV<‡[
>I
f;%L
‡dB—9
di:2,—:fx Gj†"c‡x‚'—2/e~ƒ,2Ptƒ':‡'„v‚~>5e<‡m

2„kx,j—+R*X"{.$$ ‚+žWG,‡@‚"=|…w‡]=‡c
G„3Y—5ƒ)ˆ5‡dSm‡g
>‚hn
=b‡%uD
q
/e=N|nj,‚&Q6—
$}ƒq:I‚‡
zJ
}4
‚‡V+‡gV`f+‚a‚,*‚#„
>‚+-‚
„#D‚U
"žs ‡Q
/Ÿ‚_U
0singleton.>iƒœN—ë‚h%Lƒt‚‚X†w”—/e‚w
‚+&T]…*‚tŒ7£,†ã6uat‹Z
ŠfP’7…-††f·>ƒWˆZƒ2 /‹…<>Yˆ"‡–7†-™Z·
8‚O•XŒ(ª}™Rˆ6
†m‚|œf‚+„(‚o…ìx¶ƒÕ†“yƒ‚‰—|"®†,³B3‚§   „4Ÿ+*ŸF-åR<®_ 
z(¶W~x)‡62
<f„z $‘s‰g
¿p0ž7|Q¬8ŠG…HU‡B"ƒaZ"™_Î4Ží†"‡d{
„á/‡0|Q¾‚E΃‚‰‚‚teen‡.h‚ƒ 
„8Y
V*
w(³hw½Q<†7|üu‡]%i‚b…=h‡B„       ze
~
SD‚8Œ@‚%b
xXƒ<7%ƒK 
/%T1‚o„\K
u 
/V
#5†
e
6(„--,
ƒc        4!/†        y6…B‚NH…*<K)'\<R„ƒk5:

‚VW      %J,v„…0
.ƒ+†$„}2‚8‚„ 
e†Bq\—&#† •!‡„p…:„hŽ’‹{^B‚>  J7{j7';ˆX‚L™jåz™f‚ x2-B‚,w$….‚A‰&¤Ÿ$Š/#“‡o$H…
H
„BS#%8
>G<PDM6)  :‚…DuIªrY@GQ‚xƒ?  f(e†o[!ƒ‚v2-‡        ƒƒ2ve)'•‰&/‘7{¥J$l.%&ZŽ,‚=…
N‡g…j-„y‰1ƒ/‡ 4A‰R‹5z[F‰5gCFƒ‚qƒfŠ`‡Z†Y"ƒ1!4ŠVL^†>HƒyJ>.0ƒ8!y„LG‚….XŒ'f‚G
L‹SƒB‰R‘z5†~›)N‚U>>) „** ‚†n5Š'"YŽyp-Q‚Vq‡|‚B‰R…I[( 
-
œ:ŽI)P<T‰i%'“
ƒŽ‚. “s†=Šl‡88M*D‚?„+‚>…1Ž5‚$ˆg‰<,V†¿[C!!  s2J"‡R ]
[‡o5 †u`ƒ^x2„Qˆ0ƒ]jŠ`„   *0[`†9—a =" '†W„    5šqŠ>–Zyˆ.•L‚/w¬I!
¡f)!    ^2v‚^ƒ7‚#‚
P‚<    64~‰}
,Y!9#;„3@…N(BlreMsC…P&9‚‚6
s2‚L*L
!!ŸW˜€€€ƒ¿2¯.ƒ   ZV,


l
 E
(3!8(
    Q

(.      $ƒF#ƒ{‚
Šƒ!
„0
@‰
‚™/Œf
wbR‚"#Q"
ƒRCŸ4„-EŽöt_^
.
„D—,0‚8‡o„G_l‡b
‚
‚2Q/

m„hƒ9t`^B‚>        J7{j#;‚0‡)‚H   ‚2—8Ñ,™f—0@x‡f
|w$„<
&‰&
W‚
‚W#ÕP*IªrY@GQ‚x§&&‚[!0‚v2-‡    ƒƒ2")'z/‘7Jmmô~
AFy-~„gi`§‚  ‡^s>>) „** ‚L
:"".
‚(-Q¾¾J
‚:‡[!
ƒISPŸ6+*zP
jQ<R‡d:,V5®/Ÿ3s;
J[®vqc]
9
…5—?PFO  *0y8 ="   '4T    54¦@w¶XK
We‡p!
.)—t!i^ƒ7g‚
P‚         [4‡e$
,Y!9#(;3@A(lresC&9 *‚6
.?
,


l
 ?E
(
3!4(
    &

(.      $#&W,‡vƒ!
„0
@ 
‚
‚b‚=
wbR#Q"Ÿ#I   0sizeblob‚‚,meanƒ  —ûUof‚þ{F£OfŠ=
¥[^ü<
ƒ%F

ŒWfƒ-4J»D
‚C^keleton‚‚Yptic‚‰Š%í'3ill‚‡‚S’gp‡K‰8¢Xƒ;   ‡Qƒ<@
†xƒŠS³¶BƒY…’6…?
ˆu•"ƒsƒ>
Ã=ŒG³6‰~Ñ0¦ ÔQÜO7©¶BƒYƒü‚â
—<3Ÿ‚[ƒ;
ås%¦fÎ‚ ¯
ƒ%next†|—‚Fype‚.ƒFƒ.:lashƒ„
Çm—Ì7*%vic“p€‚eepW.ˆ"       -Š5j:R
ŠC–K
1ˆo„k•KSø|
ƒW„ª]mMw‚–<Üice‚„de‚V
ìAjf@[‚LB)„p( e`
.Wcƒ*_pgnum‚Ncont‚q
D0id‚q’s.2tght‚>–;±+JŽÿ‚<„Ñ‚uliˆs¥1¢>‚StƒšU¤D«Â%Z“U‚…yÛ< c~
¤1…z‚H…ªS‘K‘
       
     ‹m
ˆ\
ŠŒ
†ƒ#•\˜
³6
E‚G%8‚s¨h†…
7;†|    ª;6Í‡&†"ƒg
„UŽö‚Q‡ƒp§]U‡‚N+‡/
‚zj‡g TÆn cƒNM
‰v1í)k„*…7‘K
lòK¾E*«q
3
‡‚#õ…j‚G%8—
‡s—*i§}³ƒ‚_‚CÎ
p‚-H‰@Ÿ‘ˆRh5[‡‚9otN@,
Š


éq“0 ¿UÏ&L“…8
‚b&;<v
XZW          
½‡s†òG„vœ}Ÿ‚B
&;<v
X&W          
intend‚
Àw†7—s       "˜>¦jN¥Y…((ª{
‚p#i‚_4Ò†_ƒ\›Ž_UŠ‹u"”iƒ2œ\“#‚Cƒ5’!Î.
†V
xh•‚r
È’&îbŽ÷%Æ*+XN„(…((„+¾‚     ‚_4Y/ü‚w’vƒ‚ßK7)|
     
-¦ƒ3Ö‚‚¨/‡dGƃX—ƒ5$ˆ^down‚»±,›7ùY„Ùƒ\er„*ˆX‚TŠb   ¤E‹ƒ&‚9ïa¯a¢\„‚<©b‚RKO†
ı               †Q†Pƒ>Ewƒ(ž,ŸuÍa‚c‡P„=$l#…       †vŽöy
‚R
‚bÆ‚
M‡ƒ"¶=ü…8v„,ƒb‚‘ d¾a
ƒcÚCŸ†QŸ…åŒ%†$l#‡e`Æ‚/st‚‘!li~¬3áw†
‰pšQ½BBÊ;„éEt‚ƒ) ‘‰+‚ mall¥L‘žk,cŽY„ƒ3%~‰0‚4b¡|Æ9…œM‡XÕ7‡‰^„Gé&!‰tždƒ…V±
Ž- ‹k™()†ŽFˆz’„B6‚f‹M….A…Š2‡lmR-h…%9e‚26
‚g5ƒY†Tzr†%„Ž‰;‰?K??e ƒJ„Y‚nˆz‹&.†
…K‰e    †?”k!„yQ
ƒq!†r†Y
œq‡YO‘
ŠV‡-ƒg,Ä_
”u„Rhƒ&…S
”;¤
…H„ƒ~†2ÞTÇ|(š;lSƒ0`
H‹‰5<} bA.ƒW+5‚L)‚K=
""ŸV˜€€€ƒ¿0¼,:ƒ        ‰S =…KNžOŽ÷„Ÿ!L
[~„S!‡i„…‡‚&—4È?N‚T‚f‡)‚2—7®¯BŸA‡„‚#)ƒŽF
,’ƒ4‡
‚‡kŸ&Æ<œ I ¶ƒTtHK?‡]{@ƒu¾"!¾EƒyŸ
!—7  r—‚KŸr/w§…¶I
…Wu§0K6I¦OB‡gƃ8—‡wlS`
H‚l,:D
TŸ0smallerƒv[›s
•n‚2Nƒ"‰dˆE„>³z‹1(¦U`“:‚Qö
Ž:‚
Lƒ1ˆs
8„a„d„c%†.´†Z‘
„     …!qzªaM…Q…1ˆc„*ƒ.‡D
„¡D‚
A©x”ƒ‹SK“t<ƒ
¤4±œŠb
ÀXi$‹fx3>z_0Š $~…7•KÈ ƒi¯BÔ1…B„V—MŽöƒ ‚=‡‚nOD¯    [(…Q„"‡‚_‡áKŸ<v‡E>‡fJƒ"—75‚yÕu#…l)†Zm„    ¾Æ&‡‚?Ã%
ƒ‡‡Y
0
A'ü‚I‚+<ƒ‚`Î
å‚R§{¶W—ƒ\—~‡†ƒ‚?„KŸ   st~À&É
‚T5†{ïqƒ\]„3Ÿ
‚
Š$‘Z ¦HC6¦½X‡7‚T5‡6F—>Û#ƒ\]ŸD„ƒ(
‚
—$Ú…CúyC6‹dintŒ(–&µLgˆ–Brt‚e$¹•ò`phon‚
Ê1®&[n8‚%$a
Šdù0
…l:oothli‚‚napshot„pƒ6
#`!   ,""e'/]0`
D‚A¹OŒG A4R
,+7ÞE’l      î\ø&P Aƒ–1ÝŒxÆ    _cmp¹Zù1
fre8
v¹Wù.
get
!9q=¹Uù,
open,-DaZ32¹Y’gø0†¼Œs
recov
¹[ù2eak‚„%”JZippet†W²"†S ØR—-”/
tB„F2Ff‚)
’'Ox·5@4’JL$q4<T8‚qƒV‰–‚!§^J !¾Q
tB$2Ff‚)
‹x

CO{†6@4›‡„Ñ\/:<T8
+gBprintfš^`(*2>ƒ.Wc Œ»:,' zxz
—Ä% ek
z
uck‚¥d‚Ïpoƒ5V‚/e)‚-‡<r„c„†d„Zˆ‹
]ƒ(‹qˆ2ID†gƒ\„MƒLu
†Rƒ_ƒ‚I‚[Wƒn^f`‰gQwŒwƒW1ˆ"†D‡Rmg‚6Xy
(x>
q/O‚^0kW‚l$E„C‚k
H
…`l.ƒ…
‚0    >‚{Uƒqd‚
L$ƒP?†D~ƒ;4‚^
r†[k#>7ˆy@…       †fƒT‚B9‡]
‚„      ‚:‚(‡19Ž.15D…~;r5‹l‚G!‚ef‚S‚'@…Š`bNe†6vˆ‚sƒ‚M‚]…
ŒVV›r„F“ƒ.‰J„…3Žp40Jpˆ“iƒaMƒD‚DŠR†43\*l…„ƒ'‚GqƒWƒ„|
TN‚A~‚]…YO˜6‚sˆ.„K„w†Eƒj)ˆ^.…4…a…]…jƒ~fŠNI@]S]=}Pˆ;‚,`… ‚.„BC[ƒ|R„ƒGuHœŸCƒ8S‚”M†{) ‰V…(…:—uaFa$…mˆƒwŠjˆk‡‰N„V‚F
„d#„.E‚z„W8r‚a„Xƒ…ƒ7O±„p„‚*‚q„!$ƒP5!ƒ_
"iBƒ!‚I‡S‚x‚V;… ‚D„s…;rf!z†`F4‡!†"7#>!–Nƒ ŽIƒpEB‚dƒ\„Q‡X‰C‚+„f]ƒ‚P!]ƒY‚ˆ0ƒ^„ƒcaw#‚!\"u‚{$†<†}‡8‚‚„;T‚A‚b`$ƒ…
ošP ‹w‰!Z…\ƒ‚Z…=„N
}ƒ…UHQT$o„S#‡G!5m4M„1Pq…F_†2„…!…e>Zƒ.UK‚BK‚w'}ƒw„]`~ †4<IH‚/
!Q‚[R,T
…tt‹~/&>SL‰w„T„/‚d‰$Kƒ\ ‚„*‡‚i‚ƒLƒL‚„1vs:L?‚[(=‚‚Cƒ29H‚%‚W„j\6u,‚-8+‚R„ pˆ2nƒ;K+?‚LhH_ƒ%3‚G„T8UMƒ…'Wx>#ˆI„+&!?‰‚Fm4‚v…yƒdv b

{ƒ`?
6|Q8„,   ‚y„$
g‚3…„ †‚a‚lŠ>‚"Jt)…qƒAS>‚"…o‚=…„bˆ ƒ‚:K„%    b9`V2„!
…E… …&Ztƒ:ƒ=‚‡=G>"   0
…tj'‹bt…E…$2‚,+‚4]‚;‚Xeƒ7…N‚e
‡
ˆr&‡:P‚†,ƒr‰nX*c#†t„ -io6ƒu…*"<K!')9q]
""ŸV˜€€€ƒ ¿0 Ä9pƒn‚‚~'‚3ƒuZ‚d.‚tˆx‚xƒY‚2‹L‚-vƒ#ƒmˆq‚k<‚I‘        ƒ„:ƒ8&X;…J!b“…T‚?6…^•^‰Aƒ‚HTm<ŽA‹DYYs*‡x'h„R‚‡d‚]…0‚u‚4‡V<Y4V0nvUrN„[j<‰nƒU~ƒv‚‚xžmA‡/ƒ#Œ`ƒGz‚ƒP$+c=ˆg†hu‰zJ‡ƒ!Tƒ„ƒUGy]‚Hxƒ.ƒS„t‚M)ˆ*„>JˆB‰Q3‡Y…ƒ!„‘:fG„#_        a‘fŒ,‚›$ ”ÆG6ƒK'=%^‚[†Hƒ
‚T‡eb„;ƒIgrƒŠƒ4JiRXƒYn…„y‚4xƒ6†~tBƒQ:…ko‰‚/ƒ>‚ƒp†bB1}(Q…F^ƒƒG„!X‰!ƒ[</ƒbB…'‚…T„|2‹‰_–‹Zz"C1mm‚DI„
mƒC9/&‚
† r‰kƒ|Sƒc…0„ldgL‚6D‚.nŽöv9hu5D
+;r
‡\h‚GI‡`j‡d=‡
+ƒDMgvs"
K&      ‡y4      wƒt|40Jp„t7
M]‚373\‡hO'ƒ'q<@ƒ‡_OgQfn:rg‚sˆ.„K„w†Eƒj)ˆ^.…4…a…]…jƒ~fŠNI@]S]=}Pˆ;o`#:‚RD0‡‚?Eu‡‚
ƒƒ8S‚„d{) 8w‚uja‡4a$…m‡F<](‡ƒ—8
‚F#®¯@‡f ‚h=d1DEl‡I‚bP‡c
V… ‚/$‚…;rf!z†`F4„Cƒ(7#>!‚       ƒ ŽItEG
d$
T

.
6]‚}Q`]t*‡W‡ƒ
[„ocwMrs
";3Ÿe‚,‡\¶Uf—8—6mNS‡d
%}=‡g‡k_`~@‚I—4
[',T‚&Ÿ^‚‚‡g
L!
0yvs:?(=#=Cd
9‡YF  ‚W„jy*,Q!+ ‚>FW2
+c&hH_
032G4
68U
ƒo
'¦^-t‡;lK5Y
‡Y+v¶~     6
9
g,Q‚y‚aQ‡[‡j‚pJt)F<"%‡X
jM
k?PB„
‡p&‚,‚Ÿ(
P#:‚L-<o69
VHH‚‚~'Lg‚^Z‡Tt‚gƒY†VLJ4
‚#?„G‡1‡9‚pDƒ8&X;‚5b‚It>‡R>EeAƒ‚Hm<
!
‚yY1‡L>‡g(W'El‚‡†6
{…0R—),Q6UIE9A    !
iA  g
ža‡ƒ`
a‡‚        @‡ct‚U&G."QŸ‚\—P=MW‡‚ƒ‡e-LK„;‚>g_3ƒB&0IRxeƒ6G:—!v?‚Z
7t‡d
Qg(ok<
I‚F‚B}(Q‡SD‡L‚tOa
<Gp"R</ƒbB…'‚…T^2‚| U1m
0I
jOLyYr65OPq
¦hgL0soak‚ƒ‚/‡E„v8
ŒIG‘ˆJ‚‚/‚‚°ƒkƒµC
hGftNz)¥K¾x›,‚?¡u>ŽJ—ë60>®j
_heap_limitN
wh˜‚£,'…u*
ÛD+†zž=¦ùŒ$…Þ†zj64    „gv3p‡o¾t
Ë@ ‚¡k–× ”nul‚
€zÝì,war53N
ƒe3‹s‡P‘g…†QŒ:F‚N‚}-#Šƒ .‚k
\ †{‰nvt‚<t…       5u
>)+
9<X‚ŠQ
²¶‡34o"VƒR7vƒX0…
[   ] 
5!
        <$@;Pƒ:…‡Cl‚'m2T’
r
H¨]žû‚„a
     õN—S+

.‡=ù1Úm"     Oh-$¾-õ
]2Ý
l
m2>Ý^
ƒ%+‡aGƒT®wJlac‚·S‘‰Nhri‚.…o”õ
Qd‚…DeI3†u,‰n‚„Rˆ•œ   1id‚rut›x
]_
]‚)‹”ð#«/…ˆ1"‰,†‚RSqm        ƒW„\ˆf‚J?"Ž*‚g‡A´V’q‹:r—DV\Kƒs
,

""ŸV˜€€€ƒ!¿0ăhÀjpŸ…/        …€OhÆ‚;o‚?"[‡-R~]i¶„7ê6X¦‚h0solv˜Fj4”ƒ
šuŒ2•C
T
.Š2Y‚?Ń9Ý^w¶‚÷
U‚]R—8,ier›"me=‚0…ƒ†5„>‚a‹,B,V¢sR)"‚b„&i$1ƒ
“‚G‚7R‚J‰Jƒg‚;“2Œp}(!‚ƒ{BN
8p‚        
!,$H…4xn[‚……Oƒ
ƒl‚I"
R„$C‡yˆHz|  —z-‡Œ8W†
‡ˆ”9Š…O†~
Œb^…k•'>‡ƒi+Œ:‰6…ˆE–8?ƒ|‚k¤B‚c„7Œ5ŽnM_n,…E¬‚… §@‚x‰9c]!NA$‚.@|‚S!.‚=1ƒ"1‚2,ƒeˆpf½B‹f‡*„|‚Yˆ‚(y‚  $‚K‚p;<gI<(1‚,LWKd„‡,ŠxH0†6™ƒ‡ZVƒ=Š&B|„s„^‚X‹qƒ6„}‚aƒx‚^ƒp†V…j†…Š--_‰!ƒZ&6-Ž i|‚ƒ^a$†9Šv„k‚y‡tˆ4š&‡G
„.]‚‡ˆ`†V „‡
~‚‡…~
h<}N‚bN
Gmx‚F
‚(EƒU„9‚j}ƒBiƒ={`ƒ3!4„W‚3fIO…X…&„>‚3G„7„v‡‚
|       ^b–{<‡TYx„8#sŽB†‚ƒ       ‹Fƒa†7‚P„$‡„/e‹x0‹Wƒ.i‚&‡LRƒ^‚+LuŽr‚1‚D‡F$JŠr‡1†vkb3†`‚^„‚*f…U‚
ŠI…J‚1n‚,‹„8_ƒjˆS‡WƒSƒ‚p‚…
Š>b‚fƒ‚{„}       &‚‚2‰UŠ
‚Ey|+CnE†2„I’     ˆ „1g…/l‡j‚r@G‚zƒ„b†V„ˆ_Y‚^s‘ ‹]ˆ4ˆA‹Z…k‚P‡58,:‚Y—…)G„z„^„@“_‹u[ƒƒV&_ „w…|Œ6‚n
/‡T*pfˆ†’)™21‚    –w…e‚s„j‡hƒ;%
ˆQ‚d„X…1S‚.b‚
…w(„‘=•9Lž„0+²e†%
„G
ƒVG0ƒ‚\‡u‡g;“ˆ'ƒk…Z‡V‚0‚„"Œv8‡q‰r”‡iëA
„@Yjƒm5
&1‚,ƒ+„‹8ƒ†_   ‚‚Žö~,-‡]
‚4WAƒ ‡`Wj‚\!‡ZO
+‚.0‚
ƒ,6‡!‚k'{ƒ‡‚S&‡S ¡N‚… §@‚x‰9#H
.*1‡]Q
2‡9e
ƒif†‚+‡  ‚,‚Y‡QG‡^&F!Æ&F‡hU
d7‚L—ƒ‡c.…“z$4Vƒ=Š&B|„s7^‚X‹qEƒo3
Y)
>ƒ4       pUR.<HåG.‡gZmõ ‚F
W‡hW
w‚j—i‚‚`Ÿ|   ‡g]S
‡^…rYx4Pw5h&5
B¦]<M‡uS#@@®tieu‚k‚1‡W
u$‡‚GL!S‡b8"t‚E
‚%    C‚U‡b‚#
ƒOl‡j—3E‚a
‚E.+‡‡%P
‡ƒgvo>b‡U*:,     dƒG‚_„^„'„
u-YS8NI‡gV#‡—*-‚*KpfVJ 1‚        
Q¦‡j
+6zŸOM
„GG‡lDƒ u;y,—E‚Fl‡ƒ@m
"„"kPžs%   Fdai‚¿3taƒ¦9—Ì‚Rfilƒ
ˆvhow‚
–VBü!«Gson‚œT‚]Ï4šz‘ˆ{‚Z‚ÀWplac‚„"”Ÿth†.ƒ6Vƒ:
‚+E…‚`‚x+ƒ‚P‚
ˆD„Œ
)„[„|„      ˆ,…m‰C
w†2  ’1‚%ŽU›gj‚ƒl
‡0
„ž ‡W…X‚y…„@]
ƒk3‹e¦  8ˆ)‡i©†\3„Eª        ‡Þ#D‚k©(Ð[„I[ˆL‡jŽöƒ‡‚N‡i·†M®8     ‚†t(QýNŸ(‚|Õvrõj‡E0΃_2ü["¶V
]§
]3Æ,ÝSg§
B‡1+®n
‚‡o,<UzimƒC*Œ‘]‡_,' Š‡m…?
–;„&žc’(„h…J„~^„B‡„"….„P~
–i
!2„3
!!ŸW˜€€€ƒ"¿2°‚B‰|„Qƒyˆ/@„cÐeŠ/K;qGŽ9§Zƒyw…f…W„]š…5†UŒuCZ
3ƒƒUˆy‹cˆ ?“ š|ŽhƒSƒ1‚=6©T¹ag
‹U˜`
,>C…i=‚3T"ƒtƒIƒ…ZFŒ%˜J˜]„[*§Œ"
;L
ÆO}ƒ-ˆ#ƒf^‘Hže‚O•C†Lž’Tb…™
Ž÷
®eI
—‚Fž        Ž9’(„h^‚v‡^‡h‡Ÿw¶‚@;gŒ 8/K;qGN(cD
%…WN2Õq‡j(õ:
Z‡g17—*4¶c‡!‚¶,q
åYU‡S       Ÿ,—0
7tu=‚3Ÿ‚sC—3‡l&
ƒ*
[‡‚-†{¾1Ÿ<OÝ2‚/ƒf^S‡i-——K@S‚#QŸ

        0somewhatŠf\ª—ëfNer‚6G2³[‹XühŒ…ýU%ng‚d
•.•Ú)album‚d•3       :•ÚA
.     :rtist‚d•1
9•ÚA
,
9id‚•/•ÚA*nam‚•5•ÚA0on/U2„,‚‚2Å© ˆE‰ƒ@
n’O8
‡
›B©5É6…vŠw—5„p“DEÏŠ!•;J’fµ§°Q© »;
)‚wŸ
[
ƒÃ"3¾/;Ÿƒ@…}Þ‚>x¦_í3®xer…        ¥ §a¶bù‚2„ø‚%phis†+<„C‹O[…Þ‚ert‚b
’6œW<
“ƒ%Yl.7@Fƒu(‘(
)$
…@ 54  ŽX “Pˆ-/…‚iƒE±M†_Æ5U3y,¢Çw—
!|
  '
     ˆj ¬ Š?ÒeˆC8‡8‡<
‹

šI†™k´L¥MŠ[‚$‚‡K„4ŠZ&$>0-     
Ju"/'.4H,
J
           +'
¡…XŒ 18‚U‡‰<

“74 wF
ˆ3y
²W&ª‰!
ˆF†@•'ŸcªXÀCMˆ.ƒ1Üz
¬{š]¡,-—g„3x
Ž,
F—>U/ƒ‚O‡ƒA3Z
,U‡7
†Q`—<,PÇw—
!|
  '
     PRD„j†7„8‡<üYŽV†LkÃ
>‚„‚B%$*       
Ju   '.4,
I
         +'
„ƒB„í1—#‡9F

x‡d
†&Ý*®T
3!
‡e{¾:®w#-
‚Nbi‚‡J‚£q…,‚callback‚
ªerT‘.<.*ÜŽ•
‚];LG!'¹i)!F  —,%)®P‰ 7&#Šy‚¸VÜ[*ÇIŽ•
‚];LG!'œ@)!F     ‚×cX‚¡`?_pmasz‘ Uù”bcompar‚
{Ýí-data‚
‚aÝîinsert‚
ƒ9Ýîknext‚
ƒUÝïopen‚ê.™UÝXÕ`™Usort‚ƒgXÝX
ïXmakekei‚
§   rec‚
¥Qnext‚ÅOäput‚
§Hreset‚
« ught¥g‘“.Ú
ƒûƒ(ndŠWs‰=‚"†M?$
ƒ/—x¶(ŠxŽþƒf
B"
Z?‚™‚ÀIP„Áwtex‘B&‹v 
ÁŽÿrú
–^slikv‰*ˆNQ*ŽÿƒSQ*rc
”f#H
?,(
ƒe$8
6< &I:t(N!$
;“\‚6H'¨>
F

†f?ÙeC‚?&w

8‘{ÒZ›I„&…B†z(‚0V$D'.IH#5Œ&‹ZÛDˆG2BE„C‚,‚uV!/#&
R0
‰}%-*ƒD&Zg‚c‚„d!+³X…ŠB,b_A‚l69*Aj…
\%
ƒ1y'‚!         .†xµ"‚8‚pT` $'’4,ƒh‹j„D„n„WƒR…‚Œs"ƒbc„-&Ncƒ~
†@1\—;…dƒMU‡B+…EV      
 S&N&ƒn;^%ˆ5&ƒ<ƒu™E[†!ƒO3H_ :Š:v<…Y
)
GgGj    c
)P}D…R†8‚Q*„V„m"‰‚nC&  E #B+4-K‚
q‚<0 +§`†mˆMƒ]„‡ql‡3‚3<n„kP }b1
~1Z‚4‹Bi#*/H%&        !%‚y    )-/Ÿ‚"Zƒk.„]I…#ƒn—l
7…=Á60ˆ+„SD*0=>$3SD/‚……˜V#8
†o‹”`(A‚m,7JŒ*0„1
&*‚I‚1‚V*‚‚‰4%
w
‘AB:¡?‚B‹     „\Œ<‚R%L‚[%„/(„:‡7‚3„FZ=—[|†(*9‚4)‡

(b.(
""ŸV˜€€€ƒ#¿0¼
‚,”w…|‚EƒdV‚&5. KSB
oR
Jƒf
1Žþ\9—
H'a
—23ƒ‡ƒa‡Q

8ÒZ›ILG‚
(gV‡\&D'IH#‡‚?b/Õ²
—*bA‚‡f7*A+M
\%
+?'
     ‡_’"‚8‚ps2 $'G*
*ƒh  KO7r‚+L  N
ƒ~N
‚1‡eZÎC‡eƒ%>     
Æ#F‡j)XŸ:‡k
)‡k
‚     §
)Ÿ)®m‡V8—2A‡h     #B#4‡e+3®p‡i—6
9P 
)>/‡dI!*/H%&  !%   0)-
$‡]E

„]KŸ(—ƒT‡h‡X
V09®h
%D
0=>3Ÿ…[Q#¦o?
X7‡a
&*¶M
 ‡B‡j
4~
Zƒ5$L—
‡g      c=Z      ƒL|‡,‡y_@—3Ÿm?—7
/
0source_id“L
==‰A%ˆF–þ3
ƒ'%‡seed_id‚Õò
Bid•z^‰E–þƒ+th‚&=east‚qpace6„V…J¥V$_„Ko
›Uh‚U ‡|%'
w
…X2m\—pŽF‚.‚Ii*ƒVZ‰K”F2™)g‚=†t…h‚LHœ‘cfBŸ‚:'‹9àT†ƒKB„&J–zl9¦"ŽeŒo…pZ‚9†      ‹uSƒˆd‡ƒ‡m1nE‡p…‚G‚-‰m"k:-4dgr(((/ƒ+…0#†+ …8}ƒ5x9      ‘P…‚`
Œ`Œ)…-"…Z‚
)4ƒ‡K(‚$8B^)5@)ƒƒcRˆ,…‚<ƒ=!†SJ=Nˆ=‚3Šp‚Q!<)<i‚F‘_‚w”ƒ]™_?d®
…fˆf„mŒr‚     …ŒV  ƒ<…„2§‚‰‹JˆPƒ1‰JC!‚4‚’1‹3Šs §‰2„v‡
k…(‰x„^
‰I„o‰uƒb‹P
Ž~ªm2…"-Œ;8Žƒ     .‡%…)@D‡R„D4l…D„:13Šd‚\    ƒN[†.4ƒ!G
2E:,ƒk…r‰"}
‡Eƒ-‚0„`‡˜
jTŽ÷"‡„B‡f3‡g‚Ii*]J§     „n
‡-‚=i
F‚L7
"„/fB     ‡6‚6'„O—=̆JeO
`J‚VlS‚S…Z‚9M*S‚‚        ‡D‡‚F—9®n
"k-4dgr(((Ÿ.r#T‡a
„S‰Pƒ5ÝY{O‡g2;
ƒm(tÆ‚X†J|0         ‚+=N      K&!<)<DV¾,3¾„cŸH
®„TÆS.‡l
‚DQ‡l
„I
‚7®eu‡oC!‡_&T6Y B2¦ƒ^§ƒ
TƒU„o‰uL[
‡'‚— 02-‡R.
eDƒ
ƒh4@r313
e       *A[†.4ƒ!G
2E:,ƒk&
["ƒ|

‚#
-}„†KŸ      

j—$
_us‚T³uÒZT²**?v†q„Œ£{©" Š@‚Cê`‚h½W„z„®Vˆ~‚…õh>Õkí„L—‚@¯6ish“|€‚%re‚ƒi““Ø)ingliƒÓ—Ì$sƒ      ä—û…Jtial‚S+„I‚„ ”Õ),¤‚‚ȃ   wn‚
‹Lf‘‰/
feak‚y‰p‚‚@
ž6z‚r›6‹Dƒ}
Ws„}
‚xŠB¥¥n$âv¦sx‚¡‚„‚:‚Î       1sõíf”cŸjƒ3}+†k‚Q…X‹'4Ž
<
$u4‡J ‹7+z+ˆX„
cƒFn‡$+„‹G
<Îp4 +p+ˆial
ˆ}}‡ƒE†y‹y‚'†q_‚WjGŽTA*†b
(&,x„V   ‡
=ƒW?ŠT
…I5†      †, ƒY=„`˜4‰Z‡Lˆ"y‚†(}0……R‚GS(ƒ,„_‚I·     
š4AŒ6
‡>Ö^6.Œ0‡‚…;&I“'›•—e‡v;‚-ƒxÆ9ŠX‚7…_ ‚F‚„}‚"†‰iŠ
†$‡Œ~P†7…ƒ,] n˜XŒ-1`'+‚*ƒS9Ÿi@…G"‚O,ƒŽ@¼ƒ<ƒ2
ˆz@+

ŒK`9"
""ŸV˜€€€ƒ$¿0΄‚J
‚;†cx‚   ‚ŽŠk‚_‚gC¨]›d‚*™fŠV“Q‚D”'\—!J„$…!×$ÃZh“G…©š0ƒ3ƒ{‚(†ƒpuM
Fj†tŽötfb‡„:
‚8—1P—…
I*

ƒ7A‡‚T‡dŸƒu†
‚1     Ii     
     ü_tŠX‚7KI8‚2E/9v‚å‚í-=—
"d
,+Ö¶4
‡k:H¾9‚^W—uUp¶ƒs‡a|LA‡msp‡ƒM
…='¶L:Îh¶S—4e„ž
I‚(0ƒ—:

M+0specifƒS‚ƒ(‚sƒD‡h†N”b
d4’Bsƒ8†2(‹@HžL„9’xY ,O
F+Rƒc=
j‚‰O   ˆ!‚1P6
„(5“%†h
‚1…\IŽ :„!;ˆ‚R„[FŠ"”4‚P“sšoŽ,¨MÛE„       ƒn‡(ˆQƒ†!‰Iµƒ1v¢a‚Ÿ(‡        „L;8ƒ8J2:s‚m‚U±F’k‰A„‡w.u‚DžN“,”ƒJ…gƒ
ƒy>
…q3ŠsŠbŠH‚pƒ6
ˆb~›ŠM—m“O„‚ga†ƒhjG‚$‡‹!Šˆl„ƒu?r<Ÿ šyˆ+†ƒY‚¡Q† …D6šžs„„E.„¬M‡/
‰L7   ˆ&–”Yfƒ1ƒ¨ƒg‚fˆq‰=‚*†‚@$Ž%Š8yŠx“I‹>+X%‘d„x"‰†…MT#‰a\²a…D     
ŽþN‚
—ƒUK21—
;

'Rj{(‚e‚7†%žn“ÛE„       J
k‚:|ƒ"„‚
'9‡‚OípE‡‡       ‰)„AŸ}‡d2‡i-Ýb
ýƒ3—7<Q
"~‡Tm,!Æ
|¶‚-‡ef‡eJƒ%r<Q      y§‡Z®zJƒ—`‡O‡IB.j.¶HN§7   @n2®KS‚K‡^k§"h‡mNƒw‚kj
K      V%Ÿp       D@DE#…t‚ežsiGz&‡‚j4-(WeJT
        $     &}C„l-'ƒ
†w 
12
*76;ƒ02ogƒM$„B„ ‚dlƒs‚m†‚W‚„'ƒ}J‚*‚I‚Y\K…b}kwƒj)/ #q
Yƒ{bƒ}†n‚-`‚%…Gƒav‚GEEƒJ
‚P‚v%w‚
L
KX
‚`Q„.l+
‚d‚V b$ƒw‚<t‚ƒq‚a.cuQ% 
[
ˆF).^{‚ˆRƒ
†$„;
J#ˆBƒˆ
{‚z$…dŠ
m     ‚ƒli„:ŽŠrW•&‚U`z"kƒ‚‚_s3]‚d"‚}
…/)„
†9‚^„3„h…oˆqB_xŠ_‚c‚DRkƒ&B‚‰2ƒV
1A
Š"…@*—-+3–˜]„I´i(„ˆ
*6N^ƒr‚* G<      v„9I7#ƒQƒ8'[)xoa‚C"      l>…‡Lƒ‡<    ˆ‚H|S
)‚3Ž‚2ZmŒ)‡BU+b…tƒeuB‹YŠ   ‡(Š"
ˆc{Š=0Žd…*†vŽr‹=–cƒ‹
:LYƒG’GL†8¬N„@‚$„~–
ƒ4"$Ur‚n&‚
>Ž#˜:"‡†4‚-<s&-…63~e2Œ…'‚(/7‚Ai„{’8Š¨q¼…z
š}!…Kj#+Š,#1„(Š7‚2ƒ†Mƒj_"X&Š7ƒ8ƒ **Q†~„ZNE$‡Zƒo"…m#
/*Nj ‚B’}„9‰0‚{ŽU[„E‚
‚„?ˆb9‰‚:
‰‘h‚P‡iŠF„Bƒ‡H³T¦påaŠ*/W‚<$C>i‚%‘†[‰:b‚„/ˆ;ƒj.&>|1%
R—k‡h„`ˆ‚*¬T†„‚ˆS9‚;(    Žö{l‡g
JU„h6
yy—=hObƒ
‡V‚Q`z"!
G3]4
"
(

‚W/"ƒ
‚^m>

‚R&'_x‚~_L‚DRˆ+ƒ&
2‚H-‡0
ƒOA‡m
"P*‚_+3–˜]„I´i(„ˆŸ]_ G<   
'|I7#v‚*[)xoa‚C" 
A(ƒ„5s‡<        „-|S
)     
‡BU+boquÝ;p—‚V‡f‚q…*†v‡‹‡Gƒ:LY¶PqÃ&"$¶W…M‹#
""ŸV˜€€€ƒ%¿0ªR“¬H‚&§
®h
6'      2Õx6‡Jp/7Tp‡aeq8§‚DX
‚!‡be#+‚8‡1Ÿˆ}Y?ƒ\b6"XŸƒ2y…i*/&6(E$.®oQ#
/*Nj TB {U[b4Z >Uf¦J
,„4¶\

/y$y‡`f,†GZHb‚W).&>
%
Ÿf(-DQcGZ
‚/—9"jN (             0spectrum‚‘ _EedhY—uƒ#1¢t—¦iœL‚!„-Ž×}Š^K-2    ?˜£‚5       ˆcŸD“ƒnÄ(¢z•j›6¶#&‚0W9…P„0|‚d;ž9ÈQ
“{~µ©62²m
>‚5
’z_‚2Ž÷'Ÿ
M#
1§p
e„2¾„%B
‚?Küƒ       Ú]ƃ
¶*#ˆƒmü…¶‚Æ)7Ÿƒa‡b¶H
…A~³)_‡‚eili‚       test‚ƒt
1y‚C1'(ƒK;„I
‚}#£;–V     1';òƒ;up‚˜icifiƒ‘
—̃3ll…CR&d‡U„6ƒ?†IƒYY (ÉT„Žþb
ƒ`„6>‚¶R.‰ŒƒfixvŠŽÿ
   1vR 
‚CL<„
!†
Aƒ@‚4wa¦w„Žþ_ 
L<„
%A   &‚    a‰Âƒ
        _editdistvŒ)ˆpŽÿ‚%   phonehashvŒ‚K†fŽÿ~‚‚K&   scriptcod•a€OtranslitvŠgƒY‡?Žÿ~cƒY‚  extƒƒ˜Š‚_initƒƒ˜Š‚&nd‚M…NµŒ‹gì&‚™‚\Ó
ƒ-ty†Dƒ  ƒsŒ:h–‚6ŒUike‚í9mi‚í‚7
"ll„W,
‘X3†u]²u6$V%‹¸
 ‘[Œz‘R    («>[MvE|‚X“ØP2$V%[û;    (¤‘[MvE|n‚‚Ix
™pŠ+‚>…wøh
}‚ßF\rit‚‚$teO‚ñh†>„o—Ä'lit~†?‚„;\4JC™}Æ:’„
Š^ˆŽRƒ0§ ŸXœA½]„H‚¶%9\4C‡‚ˆ6
f„
…§‚\„e¤ƒ9Ÿ#/‚onsor‚†ship‚“rt‚„Gt$‰@nZ
¥ˆ ífŒ‚1®oPread‚
Ã%$rŽo©„”6Šl
„wUûm
Š]$‚[?ƒŽ9åS0¶^®x+õõ
ƒwUsheet‚…g\‡–hŠk>-pì#‡à‚
‚&R-ping‚„`•ê‚wtf‚w§D!‚F`uriouÇ7ݲiql
G"q+/1‚M!O3R|h1ƒp]‚
T}†<<4lT„…()ƒ
2#‚\+Hƒ;}……(74Š!‹Œ)kX‚3]D8  _ƒ‚MƒQ     )&
"[›L‚k„p…„‚‚S4…V)Ti@}„"‚L‰l<W\‚.0.{v7‚
r#Tl\e :&    

}
ƒk\   [
$! 
/+       'Z„hƒ7„
e
+‚
,Y
p+K6*       
„I
9OE
Q@H2
II/.E
V[A‚,)'*
!\^Ik*C3d…c „9M‘B‚$A

ƒ       &h†g%=D3t"J…`‚‚1^‚]‚7P#‘?‚d‡
B
P        …6(4Ye‚`"ƒ@xhR>'I
‚gr

A*‚0%ƒ:
H1I„X(6@ 9‚
$       ƒ=IB^'6
‚%0X‚

UY„-p…d‚‹ƒ\:ƒ1x„O&'ŒzE‰…‡‘>>=´T pO‰ƒxdƒ6Q‚ˆ     T    i‚†h¤F
‰l‡o{‚#*FJFjŠ4‡.*ƒ|mI‚‚<0mƒF3(KXw‹k:……’:IŠc–…ƒ7§/@•)„{,"ƒI<\…ƒ&‚(‚#63…&LƒEj@‚%86}Oj-qVH}Se
Y.-G
K
D
0
d*‚u*y
ƒ}'2‚ƒ4
_       <_²pJ    KY*0P(&<Oƒ=\^mV‚        R       ;t†._*  #vB$#ƒ?J…’E…5„b‡ˆTK„Tˆ b|ŠJ%v‚<m7T#‚#"%-'&„,…: c‚       ‚!5XDƒ%
"<F9‚<…+
"ƒ
‡_Wˆ>7fv%&*‚9"
  #CK  6ƒ[U‚
vo("„4ƒ
Lj("(&B45+ 
3wM
""ŸV˜€€€ƒ&¿0ÊC#34>‚
„{‡E6‚&<‚B†cMƒ5S$„3(!ˆ
!
„K
 

¡=’™?„6…([[X_
2ƒ&1‚#|B E+3W6,ƒe‘tnƒ.$~m4
‚D&VAb%L4Uƒ„
         ‚>vƒK@‡o`K"d
,5"%1B0u-A89
-ƒD|J;6‚`"ƒ3‡y‚#„.Ž2ƒ~4‰T:7# *Y):b6•53W,<#O#9(ƒ1|NI%Od& waN5X7Iˆkƒ*KŠ2U„REƒ‚zcRg &
F..%‚*"$—Mi3w:‚Rˆ!Œ?g8 ¢K4}‹Zˆ$«#6‚`‹oƒ‚„;‹!
‹j^
<H%k*”>F0,ƒ>
†&*s‚k‰k•)‚[+dh:    .a1]‡r‰RƒY„Qƒ*eXNE_{1"_&%        K
F>D)               cƒ:#‚_|!gŽu«?‡QR9      a”EŒˆz‰†ƒ0X<JHKLƒy‡g%80&‚U‚Sx‚DT.    '4

S     '
DV

/X
@?d<J‚•„c]t‚(
hh<  CE)!’\ŽGŒq‹        Z……'R‚]ƒ+uo%ƒW‚ƒ=Z>hR

8+ƒYIW‡
%„:QG'  =‚
‚*I
)}ƒ|[\†[$:.%Hj*3
<ƒ     .„&–zÁ`¦;¾
”Ÿ”G‹Z[…
ƒ4…1"3„V=!R,l?@om
‚49B<?/  .4ƒs„F‚P‡b,0\>a
k1'‚‚o)‚Z…6."T!]      1ƒ!ƒ&z)HƒFxQg‚}„Aƒt^‡šG„[ez/L‘0–„,ƒ=}‚x.W‚4;‚8   >E‚YB…S%];h
-‚'SP}@.f>
ˆ"       
      
       ƒ‚~ŽþU
%B‡_
PQ&O
> 9‚
$       eI
^'6
7I
XQ

Y„-
‡Uƒ-x!

'g<‚K‚^

==‡lOlƒxd+#‡gTJ
qBšz
‰l‡o{‚#*FJFjŠ4Hk)I
Q‚0m3‡Zk‡hUƒy
8…<
I…G#
/@)ƒY,"ƒI‡>Zy&
‚#
V63L,            
z8Ÿ


0
%&‚u®Y
²‡f    Y*P(&<O\V   R       C
"#‚„&‹[…5„b‡ˆ1K„Tˆ b|‡LJ%v‚<m7J‚
"<3
"‡F:‡g"&*,3"
      #C
     6<WU‚
vo("C#34>PSŸs§        r#‡a[T_
¶T"Qm4‡f8—‡f‡j1    )‡e)‚K@‚G§  

,$"%1B0-A89
D|J;Ÿ
7*# *YI):b‡f‚c®gw!57JURE‡fK
®}Miw:/ ‡]?g8‡   MV‡^J
R<V‡ 0®oMO2‚[+d‡.a1]‚@ƒ>‚3„Q|J(_{1"_&%     B


>s)          <‚#‚|
g‡^‚r?‡P9    a      m„w
†-z=#Vg<JHKL
‚H^%80-
\MWTM, '4

S
    '
D

/K
@?<7M;P60M CE)t)

„
r=
*
ž^'L‡i@[V„7—7:‚    T…f[…
ƒ4‡f‡d
pR=!R,l)‡com
xw9B<?
  .4k„Fr
,0\

>d'        
0)m.
T!      1ƒ!7'
.F$—

„9}^n‡p
„[ƒMz/J/
†u/„&=.78‚8  +
xB
J%—39%Ÿ-H‚'SP}0sql89‚™=•ñy192$„D‘6Ÿ=©     ™7•ÚB—7+_exec_changeset‚N”݃Kanywher‚„)r‚'.-!„?ƒI

J
HO'CJŒA  
a  À‘ý+!EW


O'C…ˆ;
3Æ)     _compress‚'Š7ATÀ%‘ý]%AT…Î0
uncompress‚'Šk?jC, l3
!!ŸW˜€€€ƒ'¿2ÏÀ'’€`Y?jC…Î20sqlarf‚Š‘þ8>diffŽ%†Y)>!)$K!*sCƒcÅ„C

)>!)¤*sCexec‚
„mÝðiteU^c4c@h"_G&n@E59
`6$
:- c‚Q$‚Qr,"A#ƒX\\/!(‡*ƒ‡ 6!4!‚0n…‚r ‚ƒ\Pe‚1<eƒS…bj‹@…0‚`…i65)0#0"
- ƒTƒ`)ƒƒa<U‰t…."……I#‡&†&…P/v]~‚v!<]… s2<4‚4‚&367†P 2& )0
…^Vrƒ*5†‚*‡s‚iR     s

ƒAƒ ,H8
 A
(d0-x)n)QP
+'<8$/;F\=
 

$4T
*    
@+%>‚N†'M>!2.0*1<   *2„J#"#
a
#l‚`G=,
Cl!2$$I#‚k$,‚KBƒDoL!rhDv:0‚m%M
O‚‚‚"7YW{#  58]ƒGJF/g(@
‚!eƒBƒ?n+‚ `4.
=l33y|;PH56
&u&& G

TH,
:$"'5‚9 ~\ E\O        'KbK# `5&A]        k$qOLT7‚%ˆ8
1M"*eY‚_V&6‚Zd}~E]
ƒ#O* ^‚J‚E4-„e5;Q)(>2 I|,
H  E;r 
N
,)‚]ƒ
2yIH  ‚v‚p‰o]‚XM+6#gJK1‚X/‚@pƒWA
:/  ;L 
 …!ƒ+>
"!=R-8AIn‚AKz     „‡Q3„$8&}O3d‚3…   7,‚<%"l„y[!, <T(d,
V‚1‚],'8-UU
3/Z
"4K($Q`ƒs„PZ‚ˆH!?V  „@ir‰„GN@¸}ƒAŒ2ƒnnYƒf—W2D>Mt8‹^ƒT…ƒeT,%T_„5j$
M#0QHq:N
      1     ‡VDˆ2
x‹p¶3ˆ(
T„sF~g+n`:
)<
5R&+

O[fJ($Iƒ !'&
$k,0BHV9=<‚2‚oVƒp^‚9J#3#‚3D!`„‚CZ†]
;: A'!‚l4i  +P"‹MŽL6†_„b‚Ž%†/\ƒ.ˆ„}^‰ƒ1C](Q%‚‚@0|<

d%+4„% „‚yz( $
‚"*Aƒ(h      2M   ;KhC0OC *9aD,Z+. 0"&%0
     $A‚
B#R*#?
"78~Hk,
!(mlT)A\SZG@k~F)"D*6T(6*9&
,3'.<K]/X?  


6
     



      
        0%
b       M5
„"!Q 
%$
% ,
&
%:    3&%/
:C#DM:)";&58W,60XW
n 6f$e$7
z&f^heEP?_*„3d6     *jP(
3So#)„/X!DV0#‚h0.+-2x~V).""Q .iR2-†‚C-R
1ƒ\!VQƒP@H&x+U=&[%e..(A"1‚%
i ‚7.Cn4L‚x3]/4Y\d3
K.G
"#(
FC0
4'v)X:h}S/A!!$R/%Nr***#I)=‚6   
{ a#C&%$
PB(
_X;-0%\]."E       d&Y3'
N3DX!$$-%M&- >j#‚1<ƒR,S
X'.7 @/?L"  =<T_.v*/
&HO&
.      0/h,A:

SP{,x0;&+*F;!
!U
!
ƒ‚n
4{5ƒM$~'†?&Gi?
6&o(
\+

+,+‚&t)$>[BK-&    "_‚
,xMA79&'0N-E1Ht+4`4)Fr),‚?[k(B5bŒB‚‚[‚U‚]~‚42s‚‰5D„qd†C‚_{k`U#, .J     77
2 % 3-"

Lo   ". 96
K:v  T$„Qb(9!

&B

&V=20+R;2". 

8 ~a3%)F\3%w)3]'75S*>cD&(9    F
4‚*'%VHr8%ƒS%?/^cvcHB-       ‚l‚}‚k\;&0a6\.3e*
‚Ihr   6-
        
       3GLW 01
$ p#F= "5(,>)#5}d))
!
*
7 f‚wE1 dBLvj
""ŸV˜€€€ƒ(¿0Ò‚7       v‚Z„,  F)&,‚@S"X…/@R$0
./+         V‚)L"     v'"O&4/
5K%+
w&9=2O"|-B$5VO&^„18}^…G)ƒD

D
"8TuA,19dfY(O;+8Va*3"
,`;u-^P(3Fm1‚5Q'+Tn#? 3\3&=7$K-Xd‚0
‚]4,%8-c
/;I
8!rt>#tZ:‚DRgƒ</!11‚/&I^6%me
G>jƒj
7‚8W"
(      +]cK<O"1!!Z*U%63)‚tƒw‚\`_fƒ"‚ELO‚MƒES0A8(
T3%w7'$J8~^n6d>u‚
w+/$*TcB#.@
I9?)*uc%xL)     ><<7>&%E#\{ˆn
„z‡7#JH,! !18'/(()2]\V]GQ03:V‚-f.P=3:(!;d<S!]13
L
*-&5e2‚u/B>(@>‚eT>99hI„19„g
‚2G
e3ƒ%Aˆ1"O'3-NŒ^>"u„‘.nM
(„   O<5468?/|i<f?L@#nw‚_5/-9:C=$!X‚ &*/%?y "
^
rEO
‚)2!&"       w0!rF'MH^#JLw+K‚;"3*KIi
        
] (Q{)Q]"/6'#
K {C67J# ~)=)8o/G?3%2"
(+P$Y5/(?!  sTh„wh‚.ƒ+*8.9RJ4@vzD(G@.9
?6b&D455             =,          !    7      $(
:P\X              j„]‡2‚4!
tCO   v‚GX/&
vI+(V)U
?AB1=` o}V
%7„)‚n‹ GBE     v     '‚-bl
+"       HG

4%{‚~„NH&0eD(†"&‚$/F"Zƒe"@,['&‚AJ9&M=U
%#.:
jB$Q*
jf\ƒ&8.FRu"$"#`#$>h5!V&M_"c.$_KR_hD7&c5CtjOc+:9
      "8ƒ(04‚V5:„$  ‚(
@ˆl1„|b‚hf365‚ 

+
‚6` ?2†‚?*…+$‚
z
        /          

         #…]%0
+J?   k
 ‚5{}
d%VH$K‰I<ƒ…:
?/`O"q35N2ƒX.;%‚-}I‚3‚;F'w'F„YA‚4[*N=lWd`F†'=b[+ƒ1^.+‚J@@aMoQAF„S\‚^@$M .-;ƒU„%C+1/,s‡
&4)r%p*ƒR‚/mV„&‚q'^`a4:
o!‚c6&./<@M(+@
G2        +

!
P.+$    B.‚
%)d
c‚";‰) ‚Q8W)
-hX‚DO†
="I0W($U
P;ƒfƒF:!/>+^
'mi.    R‚J
A    
+
;:    
f
4„ 
] /6ƒRe&~…UYAo‚{„S,„‚zƒGN1‚$5l‡Y;ƒr        G.F-t:L!1j8J‚{„‚)#G((96 gp‚‚$.J
*+15%/%=7;&   *L`&
*     s!A8ƒx`G!!(m:P(2%&ˆ
‚+ƒn=^9@K4(-Fp
‚A6'Ng
*(YV0 H   A>iH
‚-kƒa6ƒhoW‚@'d'3'‚>„"
‚>!|
       A
O32J&FP1)]G9h5
+#|-%
5T.
89PVSau4
%
L"‚`II&/Af"ƒ#NI:‚o
        )&C!„U†‘g‡b‹7‘yƒ75/7@G<•<›Z<S*·BŸ]Kj‚%g
6        ƒƒqsJG‚J*"„9De:
Z‚[,|‚SH:F[$Grh‚2)"Cƒƒ%
‚~,X

f!#"cGb„A‚~|   o4
<
<


)#      RzE!@t-;b`xynN
8"|q+&‚ '        -4l%l3(4b‚<
&2ƒ     ƒ"4Cd'6Da"!ƒ5j#CPB
\`[1-‚
:G
<?%>
*(r% Q9 I„

V GYy0"",6 C ? -D$Tv1 #C&R*
        TqR'+J,u7#7-X,#"‚Z3-"lO=4
!()%\‚+d{aEW"0ƒmDF…
8^P'94Pft"‚#z&"$
D"ƒ   V ‚2$.B‚d &3‚'(
t‹Rƒ
‡{…Nƒ‚m|cNˆq„"#h…=Je
 3‚
„3v„aŠ
;"@o„:…K-!A2‚_
%'=5la
.o+ \E/#gO8(6>Vr:07b!y
7'‚> J#g‚\ 0M0{k&'x.2Eo%=*[6zH+
tMuY9F‚
22
 *(4(:$
) $vƒ,[7
/                        %"(8IIH
+H!<J"4…n
 .     j"0CO ‚
+B   tŽös
‚vSP
+#g=K1‚X/pA‡Y
8‡h,       ;L
‡g
 B‡e
!=-8       nS
!!ŸW˜€€€ƒ)¿2ÓK¨y(,
O‚1       ],'-U

H "4EQ`(Y!?‡U„@i  f-N@C‚%nYƒf%‡)
D>MR‚XeT‡_%A5F
   1      bDˆ2
1‹p¶3ˆ:       
)<


(+0
9|fJ($I!'

$\‡Y BHV9=<‡boODpr^9J#3#D!`„
CZ(…l
;: A'!64i   P"…+61\jb…=@^W$C](Q%‚‚@‡>
<



c%+"‡]Vyz —4
       $A‚
B#®     ‡f &,%:  3&%/
CM9";&5W,"0
B*‚‡f6       *P(
3S:)
!
#‡]0!+-2x~V) ""Q .iR:-†‚C-R
1ƒ\!VQƒ H&x+U=&X%e..(A"1‚%
i ‚7.Cn4L‚x3]/4Y\d3
b(G
"#(
FC0
4'v)X:h}S/A!!$R/
%N***#I)=E&

{ a#C&%$

(
_
;-       %\  EY3'
N3!$$
%M&->d‚)qS
X'7 @/?L"      7<T.v*/&!O‡B
.       0/?‡e$A:

O,{,x0;&X*F;!
!U
!
ƒ‚n
‡c‡45‚h‡e‡e~
/&5Q-Ÿ
.?[
§U#, &.J        77$2 % $3%""Lo "‡aX 9v  T$¶SFGOJ‡j!—7]1 d‡bJv‡h      >‡c)&,‚0
"X‚
—2        "'4/*/K%+
w^‚P8X
‚>)ƒŸ,%-c
/;!‡e
t>#
tZ:xR;‚/!11b/IS6%meG>
F''j
E7‡X   W"
(F+]cK<O"1!!Z*U%63
j LX_f"G8O_U
8(
T3%f'z$J^6duw+$*T#.
I9?)*užq‡O
f
P
‡d‡U(!;<S!]‡e/
!!ŸW˜€€€ƒ*¿2Ó”Ø9<hI])19F‚2G
!x3_A‡U
'Nƒ;i
j‡py
.…     
(E        D(#@
.6b&D5          =,                  
7    (:X          ‡qF&
vI(V)U?A1=` }J+""G

4%x+H&0D(&Y/‡["
$"@,['&tH9&M
=U
%$#.:
jB$Q‡e
.\  &8.FRu—3_"+:9
      8ƒ
#45:O        
@6
ƒ
bh‡Z365Zo 

+
 
` ?2…t`^N$‚
z
      /          

         H 
,    k
kxz}
%V5‡^KsI<‚i":
?/`O"!"5N2ƒX%}IqK''KA[*=lWdAF=‡N[+q2p^.+‚J@UMZoQAFS\‚C.$M .-;ƒU&8%C+1/,sC&)%Z   *‚<‚/mVƒ&"(V`‡F,‡g:
V!X6&
/<      +@
GM.+*      B.i%       d
‡eA;!‡`3)
-KQH$
4„ 
Q &6&&~<:osZ,,kN1g5(p;&  .=-U:Lj8JkJ#|.)#G(žV
‡g0 H           A>H
g-k‚F6ƒho'‡a'#(M
!
|"  A
.32      &‡[P1)$    G9h5
+#|-%
T.
!9PVSu—fFM|0sJG‚J*"„9De:
Z‚[‡b
,@‡eT:F[$7h‚2"CE)
‡_",X

f#"cb„AXq      o4
<
<


)#      ;zE!@=-;S`x^nC
8"rq+‚ ' -'%l(4pJ‚2
&2^"a"ƒ&h#C
X1'‚
—
% Q1 ,„

V G6y0""6 C ? 
-$T‡a1       (#C&R*(
        TqR'+J, o77-X,#"+Z3-
=4
!()\‚+aE"0ƒ4F…
^P‡R4‡f
XR"7&$
"7V H2$.^
O3T(
1‹Rƒ
‡{
‚e
|
N*(#h
‚qJ
 3


77ŸA˜€€€ƒ+¿
„v„a—þU7k
!AIE#gO(>0b!y     
7'7l #! 0M0P&'+2$%=* 6zH+
t
uY9‡H
      2M$vrN#"($II—70sqlite2‚ƒ%ƒ.3‚_b
 "        Ž8C
+ƒ7‚K"Uƒ† ›t+G†}È0
Ÿ‹5¸3ÂP>YDP
               ++


9\
þS<ƒn‡#   ‹p/'+ ‰Qˆ)½‰w0Œ-¬PcK†'FˆMˆ:ƒ{…‚oƒ'ƒ. ƒw;šNL‚*AXP=4ƒBƒC‡m‚h„KŠ

˜Œ=ƒx§./@Rt               ^)* '„.

9)G
$˜f        

ŠOm„%‚Y‡$e
‰(‡2†7                          _‚#mu‚)x%4:-E‚    ˆ#‡†}‚]Œz#ƒ.!Š+   „SŒV)…p$=„F‘•/“S†0Eƒ
‚V–}
MJ
+G—7J ‡H
„j—7D¯ÂP—/DP
               >+


8ˆ
‚}<ô}
j3‡’Y‚2ŸƒåHMü}
E„fMÖ
‡c
:ƒ‡„§`t 
                ^)* '‚*

)GÎ$‚`    

Ÿ ƒ6m‚Y¶NC—7LQG§   ƒ                  7   ¶    
‡e8N%4:-     ##.!
‚.    .)=—&^‡kV2K@0E—_[gz    aggregate_context+%4#.Bˆp`,       ‘U¥Y^#$$¦+I„ƒN^pH`,»D‚A^#$$untMÎ#ù‰^
nalyzx+-r##AŽ/)¯ƒ”"#‚°‚…¿
        pi_routinE:†6]˜Šq
P]
uthor.o_extensV5
‹&TU,7˜Šs
+T/,7
vacuum_pagcE(Q     backupL

/‚c&ƒ75‚B2„‚$…6U§_finishL*R‚%-&42…Vx@'…DinitL s4  :"$†y2…JU:…$GT pagecountW‡8A_2Œ+„(3remainW‡6X[2Œ)„03stepWJ{t!2.#4$',
(
*S2(…Rj<cBƒTJh‚
in_pointÏ=¾2d$‰*‚'
„0'X
T‰Z‚ 
KˆvR¥yR&‚      
ˆ    ‡^
_o#Z?„Y{%#Á!—ÌVblob
Arý(Q‰8^ü+RQ…í64doublÏK‰Bù‹int
‰G†E64‰Lnul
T‰Sparameter_countˆX?index‹U‡X[namˆXAY
‹ÝöMoint†4S4
.Ïh ˆzeS@†c3LP
`
2½Lx†¬
eS


L!ŒG

«q6text=>.ýa<–5‰WüK<a<       016   ?1_O.OÕ‰aùM64
‚Vruvalu…{‰kxxxx‚†z†zeroblobƒu

…r64
lob"
…{n(
†<“ƒ
ƒ>
_byt?
ƒRY\$2&clos?+‚zE‚   $open?
‚9=
](   |%"[0R¥„Tread?‚?ep‚!&TˆJ>„P(*—ãn
„*>‚m(*open?‚VSQF"
·Sù*writ?‚Ea*'#&

…0cking_prepare_v2‚@ƒse„8step‚@ƒ‚Eƒ†N
        usy_handl      ,?S^SˆAŠu‡—µ#timeout   
3‚7S:ˆCŠw–MH
z‡–×Ý!    cancel_auto_extensV
;      rray_bindƒh       *631˜¢$+       *631
hang†… 
LC  bNLUêr
–:,ÜÕ2†úg,egroup‚%,[…}„$  :,h‚*'¯–”ÝX-_new‚s64‚%5Vet_it‚%D\Ž=‚l(W‚¡JvKP…FF‰i””Ý‚set_it‚u”ÝVDƒ[‰sh&
894+"DQ'<
%+)0}:/"
 ')@F(.8H!+G.
:
%%ŸS˜€€€ƒ,¿*‹0sqlite3_cksumvfs_initƒ‚I—¼jX
        lear_bind,C)osSBw<L.8*%$•`i„$…l†oˆ<‚P#
‚elˆ
¦g.…D™u‚1x
TŽ÷W®`
i„ƒ¥n.³`œ"[”,D
&ŒC@®oo®K
e_v2SK?2,$t¦-ŸB–°(

ollation_need
,@„       Wd
’Vu16‚“yed16
?/„       X’`umnH&3l!Y<‚4A
‚O\¥j!g<‚4A
Jˆ‡h_‚Fƒ    ˆzblobf„Y+&!;,†Vÿ<@Šn‚-O¦„[Öƒfytf$        ‚e^‚^"Y†WKŠsy?h¦„\es16f"
‚gq|{e†XKŠx‚~¦„]countHvW?†YKŠ}@
¦„^database_nam6¯ù„Ze166 ¯ù„[ecltyp!1Î0‹Hù‰Ke16"1΋ù‰Moublf#†ZÏN0‹‚3¦„_Ò‹       intf$†[…`D‹‚¦„`¶‚C64f%†\K‹‚ —I¦„anam‚Z"
Y&¡t%‹Fe16I
"N'‹$
origin_nam6(¯ù„^e166)ù„_point‚“@•ê,   table_nam6*¯ù„\e166+¯ù„]ext‚$? g‚f:1Y >,,†]…bD‹+tL1]
ƒ~¦„b¶‚E†¼16f„M"v*\-†^Õ0‹1uHt
ƒ9¦„cÒK…ŸkSypfw!.†_ÿ6@‹6p,¦„dÖƒ`valuf„ /m†`§„e    mmit_hook‚CGYpileoption_get“&! 
ÌtÄ<•J‰Tùˆ/…Þ4"¦ƒ:us“4&7Ìr@ƒÁ/ùˆ-
letz
MŽgÍBøˆBe16z*     Í  ùˆDnfig„EE=$*ƒ
ZszE…=]4$    ‡ƒB…c
lƒS.{)‡1KE'ŽC„Rvœ‡
l4
kOˆPž
„F

»E?ƒ…s2‘2‚DZ/lx„„:ˆ[Ž#¥t
%Òu)‡1KE…$‹vC„Rv
“iLcŸ‡gR‚™ƒ;ò4œH
?”>K1./_a
ƒ<MŸ‚text^a
ˆx0ÞU‚˜-›!° 
¢Y7‡f‚N‚k=       0Bt¥AgK$Œ*±Hˆt½u
=‚ž}ƒ_›!° ŸŒ$ƒ-3&?21»A‚)gK$”3
…*
        _db_handl0
~
ˆdÖ,“©_d
reate_aggreg‚ccolG‚w    Z
ŽIž—-%’49L¾¥ˆÅ‚lation16,     [d
’Eo_v2 G!‚r \ˆ˜Š‚7filenam*%N%!Runct.ƒ|…¢&7#„ %8'
ŽJ$Ò Íw—8(4!/' !# ƒ1gO+  6‘sR“Z¦$Ö#‰`ƒ-1!' !#      
g
+«mœ;åKWion16:&7%^[Hc      N#“ªKf_v2…i-9_˜&f„¾hˆÅ&ƒä*iåKƒû‚6modulgV
!@w`
1
ŽKm ƒ‡ICƒE
2¦†ÓB3ƒ0C0
'
w2e_v2iVq/
       a
3|ŠK"(ƒV‚ˆ•ù;ƒ2"()y‚‘‚8window_functD„ZQKb‚&‚
¡„“©)»

„   
data_countH*0qRV
‹O  directoriHM
—#@–×@
base_file_object
b_cacheflushg>{c
onfig6
\'!GŠ*d-Š
Ž|Ž7þ6Ža‘ "‡r.’Q‡W…8Ò&¶,M¡w†qž.+ƒ4¥Ö‚`ÝJuŸ…#‡
‡r‚°mŸ
zW‚‰QP§‚^ÝsCô^Ÿƒz‚!Ÿ‚Ffilenam
[10IK?e-!handl1k
ƒmutex
‚B%8fnam;
E'greadonli.hÖ×]=lease_memori L%i-Ë4–×estatu
'd<
:jqj^Q" »œ
£"+„V”¦7
.Q"‚°iV”7
‚+ÕƒV
eclare_vtabqmAƒq2&’G      Nƒ7‚;y‹PšD’ó
Yƒ†W‚C   Nq+‚r%e.)CB895&'"31)'$#`Q9)N)'ƒA,Q#*R?TdLD("‚
&$2q
++ŸM˜€€€ƒ-¿‹0sqlite3_deseriaZJ'"“PBš^”HŸ"mš*³xøŽk„{‰†Ó
w
        rop_modulIwk  enable_load_extensŒc6/
E(l…c•pÐQ”8ƒbøŒ‡’‚tshared_cachA 
ƒ_1‰&6Ó       ‚¨x!ÄÍ6«ŽD…ÞZ6
rrcod‚/ˆfm
E,%…T…Kn‚S‚mÏ'…Y†o=
ƒZu¾msg‚1o
G  
`…Vp‚Tƒhn‚*ƒeƒS  *‹v—µ†16
a‚W
jodƒW*‹x—µ†    or_offsetbm]pstr
]q
xec'2!*+$
.x:&
‚QrŠz,†n ¶
ˆc“-!‚D.‚c„ (²~
œ@.„!T¿C¥1 ¶¡<…€„ú
.å
R$!:
panded_sql2WD#o       0"irMÎ$ù‰_
tended_errcod;jJ"#]sr—µ
result_cod;[„"tu—µ        sion_init_c‚,\fQ‚;)…˜ŠnZRQE;)o     fil)1! s‚)†<†A3H‚d#
\R)‰2$3p=y†0
V
 -ˆ'1L
A%•£t
L
A%  e_control‚9EUdX?‚%KLwu4™9”Jžu"†9™^ƒu‡=‰øFƒXƒ-2‚‰U?     {ŒDa‚*objectP<
namd e_databas1
0Vjourn]
1Ww 

2Yn…u
RT†R|
‚p(S.1„‚`,NX„‚ÏE¶

ÿC@
‡T\r¥r
*N
h„V—:Ÿ¡?Ÿ7
ƒ+C†Û”9i
re&x*Oq/;K>ˆ&ynuq2ƒP‹{o$T1zŸ
‡W…ŠP‡!Œœ¢RVs„4‰.‹@ˆm‚m‡„/„f…˜ƒ1œ‚„h‚VVË;§ƒ&   e_filenamte&$tZ9ivÏtù‹/
ts5_initˆ;¾&_initˆ:¾%   get_autocommitˆMwxdatae3"1
ˆ    ’“`
t4&O-x‚.‡ Ïr2¥~3
( Ò‹-
lobal_recovMÎ&ù‰a      hard_heap_limitT64„dqƒT3¤V).“È‚IƒŽS
).   index_constraint,žl•ùfb_usag,     Ÿ3•ù)info9
@
w‚a3…`

:"=8‡-‚ja’9‚ vS‹"ŒaŒL•ù^‚j"‚ vS‚Trorderbi,Ÿ•ùiti*
u<
P,"
 +&
kX
 (Œl/…ZIÂM$`‰o Ž.øg„uI„=$‡’‚t64>
'‹Fƒ}*á5   7a„ƒdµd˜.‹Džf¥GR
;Ÿ‹½\  7a„ƒd…—K‚/R
;”uderruptEW8y¬ƒ:½tˆk“È‚/ƒŽÝ‚w
o_methodD(
)
†wž.¬j+–"<LˆB  !@!p
U"m‡sv
—14Ž÷a‚‚A„ªZp
U"ŒS„a‘)14       
keyword_check ƒ+3
‚‡8–‰9ount ƒ(0nam   ƒ)3<,     last_insert_rowid†wH2‚$z ÂqÍ<„…~ÁvÜr®#Í<ƒ¥kƒ‚÷‚,
ibvers•-
L\ion_numbq
†!]] k‘1„é‚amit~…v‚YŒZ
'†Uhƒ~4{Ž50‚TeS#%8
<PD
š.‚^…B~ÖÅA’ H¦ÒuŽ;‚^+‚ÏusƒŽH

oad_extensŒM)./|…ZaÐS…Ž"‚
 
D%e†øŒù‚™M‚¨ˆ.‡d
     Î0D%egn'_‹&5H
„
      ÇÄ?*Ž‚‘§c
s†$ˆ‚ malloc&+V+
\3+‚Nt4‚2Q#>‡j„O#
A††@-(‚/n
8d‡‚Gƒ_‹NÀ6¢QV<‰‹Gˆm‚¤bˆH„,\ŒRøkbƒ_†…€‚„Z‚HP„p»‚T¶„"64&_‚+]?9("mL¤l
&}ø+†Ë[$Iq[Plh2V"01=
!<y ")L4$w|J;+f:2D‚
77ŸA˜€€€ƒ.¿x0sqlite3_mathfunc_initƒƒ˜Š‚
        em_methodjjƒ%R
Š%‰5•Y—ë]>   ory_alarmMÎ)¤>,iù‰dhighwatK,1             „f‘C
¦$ƒx‰bø…P‚Ï‚musK+„e‡‘A†g
¦‰`ø~…N†g
odul3‚1j|6‡5‚;ƒ‰A…Z¨j„#hZ/
¶•ùR‚;O‚s‡Ýe
N
printf‚u4de‰LBŸœZ¬=R‰‹Kˆmj—:$LÅ„Y³g„P…€~„\‚Jw„nÊ$1
s&ƒ
&
utex

 §C_alloc*YNRL+§D.&ent*ƒ'T‚A'§J!fre*
ƒSn§G
held„XWO
8¯=‘‰Ileav*„!*V‚K'§P:method>ˆR ="ƒ†notheld„ZXOP¯?‘‰Itri*ƒ)I
2Un§M,           next_stmt?JV!}Š(

ormalized_sql30
0;-·ùŒo        open!C sV‚NƒE
‚
ŒM
i:xŒ!)}•‚4&1l‚b
&
ˆAs   „+‡>
…C†1ÂcˆƒJEXe<wP„?7v†aP  ¦<‚<‚be+6Š/†`
‹!
‚+r™8Ÿ‹2Ž÷O®d&1l‚b

&§+Õr
ƒ%Õ…L„Mˆ¶St‚©)ÃB‡—3‚d:UŸ„e
16AvWƒGŒO
%s(")ƒ‰3Ñ!ƒLFR„?7‡UƒJ/Š0†a
„)¦§,«Œ\¶SvƒìC‡—3‚
_v2!E 
tj)Y        ‚PƒBŒN(4v4‚i%$ 5‚
7] „$(~ƒ‰5@‹¨#›qv4+HK„S=‡>ŠjŠ2†$00ˆ‰Mƒ‚‰e¥§
.@«…5‹Œ^¶Q]R+‚ÏOœE‡h$0—3_o‚f  Ý_
s_endJ?80'
¥d‚;ù‚vinitJ:1('
|Œ¥b
‚9ù‚t
switch‚,
‚y

verload_functb~ pcachF
ˆ_
e_methods2F+ŠDg<‡9+pagf„y
reparY//d
„hJ
0„+sU.(NY1K& Sp‚gÏ5#“
 "‚}…   ‡B#²u
‘G‘#¢;’’:!,ŸC£)‹R¥v
&Ne1K& S8cg—*ƒŽƒ†‚!Ÿ…‡„1aÝD!,J-Ý…—7"e16$
0„%jÕ#
‡K4‘%‹øJ„ø…Ã…_v2%F9
3„&ZD‘‚•ñw„w‚3
'./;!
0„(Z_v
?+S2     M    "["ƒ-E>‚I7"3„)va‚
„y
…`¨U
þf<†
„~2“9¢ez‚8op<)„{‚rˆ^à6]
‘‚G‹,„|šJ’T¥t
‚~¶W!lšmŸ7
ƒ<«S2ƒûf7Î„u‚Ã)…8„|¶aƒf3#.0

1„3n`‚#update_blobwrit…<count‚W<depth‚Y‚hook*‚F-Znew‚V* old‚UQ
ofil~h4Óbùgress_handl48Ðbƒù1SS‚Ï‚     randomÖ
ealloc&$V5 [$‚ a(`9¢TVˆJ„-—µ‚V¶ƒ$64&‚c*\;[¤ù,bas‚%&]>„P?•B:<+¡ZŽ?:cov‚7†i}’û&
}  er_config‚‡’û&6errcod‚‡Z’ûmsg‚‡\’ûfinish‚‡`’ûinit‚7
†n’û_sql‚7
†p’ûrun‚‡:’û&bstep‚7
‡0’û@0i‚‡’û&=lease_memori 'Y
µs‚-£%†NùK
‹Jset…s
:†R    ..
‚kK‚
‡2#n:'VQr^H„
Š+ W¶É]+%ƒaƒ#†>‡WmM
¦8% W¶¡=œ…+%Ò{_auto_extens9ult?-Bˆ9ƒi¦CJ„ƒNy‚-_blob?:9„j'5ˆ!      ‘]_¾=“©fa‚Àh8&<&H9|
 .$)$+!"3‚|1‚<09)‚!dO;‚/3 ",=R&94-
44ŸD˜€€€ƒ/¿t0sqlite3_result_blob64?;ˆ"“ªbdoubl?<{8
¥ ÏJˆ#  ‘f¾>üŽkü‹‚°Uc‚Ð9error?=?8¤.ˆ$‘j¥QüFQ.ƒ-3d»‚916?>?ˆ%      ‘p“e_cod??
        ‚%à}ˆ&¾‚eƒëqfnomem?@
‚`ˆ'“ªgtoobig?A
‚Lˆ(“ªhint?B

‚oày?ˆ)…b       ‘v¾?½‚aƒëqiH‚:64?C
oˆ*‚.    ‘z
¦$¾@“©fjc»D
ƒg$”G;nul?Dƒ!„cˆ+   ’¾A“©fk‚Ð<pointE‡rdˆ,š'$‰IS?8….2MO“©hl‚À#
3IS
8
      M"subtypaF&ˆ-†e“©hm‚À&"text?G
ƒ0^ l&6ˆ.    ’¾B“©fn‚Ð=16?Hƒ1‚byˆ/  ’¾C“©fo‚Ð>b?Iƒ4‚bwˆ0¾E“©fp‚Ð@l?Jƒ2‚bO-ˆ1¾D“©fq‚Ð?64?KƒZB‚vˆ2“ªrvalu…zL‡#o
‡oF  ’/FxxxxxGm‚!
ÅZ•ùt
†zeroblob˜hƒwM]ˆ4¾F“©ft‚ÐA64?Naˆ5“ªu
ollback_hook‚D",
tree_dbl‚Sž(1”ÕuE1geometri‚S"˜(g"!.P‚4”Õ"!.P?
y_callback‚S˜ &‚V”Õs&‚6query_callback‚S˜#.”Õs#.info‚S ˜†"‚m”Õ4"‚m        serix
'a4^8_[¯"Ÿ"ù„y‰}ss‚%B_†S—RƒIƒ„E‚/pCƒMw"D‡Y/ŒƒQ”ÝU
ƒQt_author…])>‚cœKÈ:+
‚;†%…2øƒu‚Ïq
0‚¡„<»?Bxdatar/";
4C´B°;ˆ6      ’ÝŸt°;ƒÌtv
last_insert_rowid
J
hutdown>(8,
‚K2` 
M
r]
f/(
ŒnZŠ
leepW
_2Œ4J&ŠG
–K
ùƒ[
napshot
d
A¹Où&_cmp¹Zù1fre8
v¹Wù.get
!9q=¹Uù,open,-DaZ32¹Y’gø0†¼Œsrecov
¹[ù2printfš^`>*2>ƒ.Wc Œ»:,' ‘h—Ä%     z
oft_heap_limitw˜‚£,'…uÛmùŒ$64 „gv3p‡o¾t
Ë@ ‚¡k–× ”urceid•z^‰E–þƒ+
pellfixext_initƒƒ˜Š‚&
ql5`JÁ@ݬr
tatu$
y+t`#‚;À<`
‰Q
¢LøV˜L†òs
*s64{„hB‘F†d7^Q     „„Tøb…S†dƒ-U
,QƒTepƒ
\?Š=dŒX

OI…_Ga5}†
D
‚aW‡+J„Kh       „H

*

‚

/1\.?;P

7[‚2
X,_-Y‚
%.‚sHC,ÏC„,=©6»žr×V§*7ˆa
ÉX'“ ƒU.|TMgG)2<0;X/t‚|‡.í_Š4"'Q,!N
“)
 8
g…bŠ{F‚YšV”
¥]-f‚
%.
?4C,—8žx,
‚"=š`»žrŸ‚)
ƒ(7üh…'®k]¤o‚×(·åC ¶2§…F‚Y¶a"…+mt=h)&P4Rƒ#¦C_G 5#Ï0êO
þ\<:ƒw.B‡?   c        ?H     7V‚¥k5"—%ŸÖŸ7
ƒ<ˆ¦#
_busi7B
)-"     isexplaini
8readonli9 S$ 9    scanstatu:"]
»j‰øt
‘A†Ós_reset;"Ltatu
ƒ='*;v
‚c<¢&r$"5
";  !E
?/?
_append,EDal$
[EEchartEFf+œ\1øi†Ë/
errcodD
I-
H
finish8!*:      
length.N-EhI
new$
A"
reset$
EJ
valu[f!KppendfELF—ÄODglobM
icmpMMlikMR &—X”ù‹e…Þ5nicmpMO
4DÊd¶?

yscall_ptrE tem_errno`-ON*.!"GH4j294-."5<#:)%049tB'E-,!')9H9K* !NM„+=(2, !00
""ŸV˜€€€ƒ0¿0…0sqlite3_table_column_metadataV)ŠU

emp_directori‚!{
žVÕE•›'V»s

st_controlÖz O’{…H   B<kvŠø’5s
â)>       B<k'„á„sxt5A

hread_cleanupMÎ'‚Jù‰bsafhI§yR‹Mù…¶T9
okenizer_modul‚ã™J&<ýpcJ&<        tal_chang†!…"‚tiI*?-
‘V+È!î
n
–<,½`!/¾‚A†Ûi,es64–b
race'.SJ
@kÁ&©Sª@»?‹Ý¬Xœ†e
e_v2e
E6
     QA`
nsfer_bindMÎ%ù‰`
xn_strD
5˜ —̃<    uint64"‚/ $‹•ù‚f

nionvtab_init‚„J“ÿzLlock_notifi"'1@Iv1-5ÀQ*8   CƒJ-$&Rf‚D'lFù–(

pdate_hook…](VP‚PV
†^“ƒ
ƒ`

ri_boolean4S!@&;-#
int645T!
‚?-$
keid6U!
‚j
paramet3R!
-‚
ser_data„6/#B†:7      ‘Z¦:K„ƒw7    valu7
0/…
4ƒ1A*
+



1Qƒ‡4
s
ƒ\Þd‡3Œb 
¢]:_ƒ9‚‡jtNƒB  .‰o…F.SŸ”?
¥Eg
Œ!¯„‡.¦L—]
Lž7W‚2 Œ(ƒ-3*tC5«,‡‚S‡h
‚-g„e
ƒ>N„x!
e_blob‚ „RJL
£e‘(`ü0…íyt…,‚
ƒQCL
£k‘+ü6es16‚ƒOC‘.doubl‚L
¥ÏL‘1üŽ\ü‹up7#kU*encod‚‚[(&fre7
D‚ombind‚„!#int…)‚‘464‚‘9
¥`\”å>
‚H\nochangGr‚ƒ0J.Ä{R"•ùt…1R"
umeric_typ‚
‚point‚ˆ#‰/]X?†h‚•ê
M]
?$subtyp‚
‚W:†n•ê+text…*‚lN=}  ‘>
•
-“©~<³Y
ƒ!-16‚(‚Z‚1N<‘Bb‚!‚
k‚"‚l‚‚   m‚"‚yp"

=A{ŠC    ‘E
¥MdÀO“©gP»D
‚5d”
ersBW(”U(
f„{
03I‚#u#ˆKq:8ƒ@
…EKP(„),‚      %MB


                       -‚#‰u‰^        )Õ'0&v-D
Ž^Š„'‹l•£D0&v-‚‘ˆjÕw"Ss_find5`†/9‡V_ƒm†)ù…J„ª\[
registdS6
ŽL‹¥R £%6…>       [ƒ–¦Z‚9ƒS ˆF‹&ƒˆ!¥Òv
‚d „N„ªR< a—ƒ>‚Ï‚;unregistp
4Ug7†G   stat_initƒ‹G˜ŠL
mprintf6‚Z
:S—ÄO83
snprintf(
|‚»+,@—ÄO>
tabR0‹$ƒ"#%f~‡)B\ƒ$‚X'†S‚™ak†7‡'ƒjc_/-!ÜröVƒ"#%†œl6B\
‚X'‚ 
ƒj

_col†E
V
¢•ùf
ƒznfig%
Z#B
4&“_   ‡A•ùaƒ[    6ursorsu@‡1‚?‚¬}!8O;;Vp        ‡•ù^ ‚?‚
!8;†Fdistincty"+F9}K†F<
³T•ùh
‡in+M9"#?n_first+
'gƒhxÝX
ù*next+
+gƒjzÝX
ù,nochangGN2ƒhH
ŒÅDÜ÷8†…zon_conflict.1
Xrhs_value
†G,%T-#«K)Bœj•ùg†a)B‚+      wal_autocheckpoint‚‘      ÝŽ÷Z‡àZF
checkpoint
p7/:a
…5U
Ýa@ŽA7:‡àM@_v2[
      H&*…I‘'/VÝo‚Ž÷x
V‡àZ
[‚
hookB

SN
‘,¤Žøb,
in32_set_directori'
<Dy16~8|       x_init_m‚,‚NF˜Šo`F
xx`ƒˆH        
yourcode_initƒ‡,˜ŠF       zipfile_init‚       –Ç`async‚u‡%9K=6Ah   ':2iN#+1Y8/%#F‚N:/3%2O*C$GX;"$$T(4m0'%6 G@GH3"
 
88Ÿ@˜€€€ƒ1¿80sqlite3async_control‚†Riniti‚uƒh„run‚ˆ
shutdown‚ƒbld‚y
U–þ4
‚t   treeclosecursor‚Š}•³ƒ      
next†g     ý}#—‚1Æ+é/#
rowcountest‚_

•³=
„

step‚üCÝçchangegroup_add‚%n…h…+9‚T
_strm‚%oŒS±~delet‚%pŠUQnew‚%q}Štoutput‚%r‹")‚P_strm‚%sŒQ²              set_appli‚%>t_!‚zg-j‡~T‚l‘p‚}Z‰GƒCi
/‰4‡”Ý‚W
y_strm‚%
u¼=_v2sqlite3changeset_apply_v2‚Àsqlite3changeset_appli‚Àv2‚%$v…j •›Œ2‰&Q_strm‚%w·?…Gconcat‚%xŽ&Á•~”ÝX+_strm‚%
y½Qsqlite3changeset_concat‚Àflict‚%zŽ%‘G™}7fin‚%{9q½N/“Sx”ÝWgx
k_conflict‚%|7ª6invert‚%}H‘CŽU”|‚B—–      ”ÝX6_strm‚%
~½msqlite3changeset_invert‚Ànew‚%‚60-~/“"‚”ÝW6‚xt‚%(|%‚K9uhjgµ/’&0>”ÝW:0>old‚%•DŠ!-~/“<G”ÝWPGp‚%—¶F/’fi”ÝW
zipk‚%™start‚%.
IO‚DR""j‹$©w/’‚”ÝW
‚_strm‚%½}ƒsqlite3changeset_start‚Àv2‚%_Í
Y_strm‚%-½^xxx‚%’¤Iextƒ…t"0˜Šq"getfunccollseq‚ŸÝŠrbu—{/V„6Æ!{/
„6_‚clos˜ZWƒk4+HÆ!
ZW‚q4+Hdb˜„‚kÆ‚‚kopen—#P-~Æ!#P-~step$˜)ƒL+ 1=Æ!)‚+ 1=vacuumšZ/*1ƒ.Æ#3/*1ƒ.   ebaser_configur‚%…w•[r‚%
…f–0adelet‚%†!–-rebas‚%†–^e_strm‚%¾I
cov‚7†’û%'sess‚%Xion_‚‚
attach‚%†9—:2/Œy‚z”ÝUv‚z       changeset‚%2†9†D‘-ƒˆ†v
‚O4U˜z/ŠƒNB1M”ÝSabB1M_s‚%†9¢Vtrm‚%¾sqlite3session_changeset‚onfig‚%A©1r‚%†1¥‚./Œ$ƒS”ÝU
!ƒSdelet‚%†2¥d&/z‚/”ÝUw‚/iff‚%†5§Ben‚%†5¡T‰     indirect‚%†5“2˜*sempti‚%³W memory_us‚%´K
object_config‚ª;patchset‚%†3†A§z/ŠƒU;1”ÝSck;1_strm‚%¾sqlite3session_patchset‚À       
table_filt‚%†2¯z   howexprƒ

^6listƒ
‚idlistƒ
‚selectƒ
‚"
rclistƒ
‚triggƒ
‚.erlistƒ
‚2stepƒ
‚6listƒ
‚:upsertƒ
‚*windowƒ
‚>funcƒ
‚Bthƒ
‚&    s‚y
Ža–þ4
ƒ.udl‚yŽRh*<–þ4ƒ Rh*<               ppertolow‚¨l‘‰‚vdbememabouttochang‚çQÝÓ      xprintfƒ
‘:—Ä       _
33V•>ƒ/…•AÍZh–×$õ]¯73_create_col‚“4_byte_aligned_mallocƒx¢pù`abort‡u-ƒ0$mE$º[…@‰W!‡\D‚$        ƒ!…P—µ‚{
     _rollback‡:‚‰Y„—µ        ccess_exist!†.’jreadR
^
s
†C
“writR
,†8’s   ff_‚Ì^ݸinteg‚-81ÝX˜j1mask‚-.##ÝX˜`##text‚-71ÝX˜i1 ggregate_context‚w-bIunt‚w-g`        llow_covering_index_scan?ªjùaA
uri_author‚
ª+ƒEù„Â
ter_t2       nalyz2
iC‚rƒ  pi‚ÚXùf+cal‚ÚoOYqùfBOYq    ttach2       uthn†a1‰?†    ƒ$Š
—µ
‡;_us;J‚„—µoindex_moz_anno_attributes_1‚„ƒ{¯rÒZ‚<ƒ{¯rbookmarks_roots_1‚„Œq¥^ÒZ‚@Œq¥^
favicons_1‚ƒGd¤ÒZ|d¤hosts_1‚„–B›GÒZ‚D–B›Ginputhistory_1‚„˜G™ÒZ‚H˜G™
keywords_1‚„z”uÒZ‚Lz”utable_n‚½E‚5É55„•ñƒ'³E
P5Ö45blob5‚VÇsÿ9ŒAݳ%Ÿƒc      treeinfoƒ„˜Áƒ      usi"‚Zf+G
@
ƒ?S)X
B
1  <        >ZA\ƒ3"ƒ[[‚q4‚
gƒ .`:‡eK„
É|AŠjC‹@Ž+…H…ŠQlƒ!àˆ&‚(<Š !    &ƒ'ƒF2   
†~IŽ÷*`:åˆIœ
…7A…Þ‚nÝ =F2    
†~Iy_handl‚wš5Š?Z8recoveri;(‚E„ƒf†#—µ‚
†#snapshot;)‚
‡ee'„ƒeˆD7P—µ‚ˆD7P &!F% $& '0&!2'
'!5 
(D!"&0 



$K+e(.*


.5*# '#A6‚!+
11ŸG˜€€€ƒ2¿V0sqlite_busy_timeout;*‚<š>‹x    „ —µ      yteord‚Šy+ù]„
callback‚Û@‚G0
†{
ù6‚G
ntopenn‡J*†1ˆu„+ƒ*—µ     _convpath;.‚E„#”?—µ"’ldirtyw;/‚„&—µ%fullpath;-‚„)—µ(isdir;,‚„,—µ+   notempdir;+‚„/—µ.symlink;0‚„2—µ1
se_sensitive_lik‚£ Fù2„øƒ/ decl‚Û==IYrùf=IYr    hang‚wš‚/5FI
eset_abort‚%d¸KXconflict‚%es©6IŒ?‚_straint‚%f‚5Qdata‚%&go¦&‚v [4 ‚c#foreign_kei‚%h‘w¨2notfound‚%i¹^ŽK‚_omit‚%j¸?Žcreplac‚%k¸A4ŽE‚)Uapply_invert‚%aT¶u^nosavepoint‚%b·Cstart_invert‚cC
eckpoint_ful3iF,\pass3[*.)ƒ<݈7restart3
%M=
™zŽø
ƒ,trunc3h=
™|Žø
ƒ.   los‚w      ‚^‹.    ompil‚w b^&X7„4„7"eoption_get‘z&hÌ{Ä6•Pùˆ6…Þ4(us
’!&fÌyÄ4ùˆ4let‚wš0‡k*

nfig_covering_index_scanTªzùaQ  getmallocj2jƒ>–N—ë^/utex>c‰UpcachT
Že2TŠYheapT     ‡B¶C¡WQ„GF‘3‚Dƒvwøp
‹sC“m‚σ<„¢x?Ldƒlogu_ŠtBH
m4Ä=‘¨okasidT
‰u+s‘Ÿ\Hs‚‹…)ø…†òƒ?WNmalloc0jƒ„{Š‰-χ
‰1•M0nø‚A“jLd†ã2\b       emdb_maxsT“9šnùŽ{statuj
ƒj
„?ƒ#
†[‘/‡(q–Œ"Qøm…<‡(†òl   Qmap_sT?B|‰1&ˆ28
»F?ù„    ‰1…ÞV
?
ultithreadB#2p:
†¨‚D‰Aù…-¶U$texIˆAS"ƒ†pagecachT… /|‰8ƒ:c‘j™[ø…w†òbcachT
«ve2T…2…ƒ«|_hdrszT…zŠPmaszTzB
 ù^
•scratchT…eriDl‚w¨‚L‰Cù….¶U,inglethreadA!2
IP¨‚;‰@ù…,¶Umall_mallocTƒw
orterref_sT’,»1ùqllogT
Ž¼!ù‘xtmtjrnl_spilT‘K¡#ù•0uri„F=Œ$†|
•»5win32_heapsT#straint‰l8@X7J/@J… ±93'Ê‚_†C"´
,(#:#L‰!… .ƒ-ˆ'0ƒk‚::660#Üœk†œw

,#:#L»3*…^0ƒk‚::660#_check;;‚E„5‹C—µ4
Š  ommithook;<‚E„8x—µ7
Œ:datatyp;F‚‚@„;’(–‰«t:
meq‚¶Y•ùy
foreignkei;=‚E„>*—µ=
runct;>‚E„Az—µ@
ŽEnotnul;?‚E„DX—µC
&pin;E‚E„G‘{—µF
L  rimarykei;@‚E„J‘—µI
Zrowid;D‚E„M‘a—µL
8trigg;A‚E„P‘—µO
nuniqu;B‚E„S‘-—µR

vtab;C‚E„V‘=—µU

pi2"
rƒŒV˜Št:rupt
ZŒ‚8«Ám’¥cêH™L†Yp™‹J†B…=Ÿ‡…{‰ˆYƒD   ƒ0…C†oƒmÜZ-’¥cŸ32ŒŸ‚.‚Ï7ù!‚}†oƒm_index;3¸~„YŽ[Ü£9‡Ø,X
>sequ;2‚E„\5—µ[Œ5vtab;1Æ{„_Šx½:‡÷3^‰a  reate_aggreg‚w
-7>funct‚u1
-&Findex2t2  emp_index2t2rigg2view2rigg2view2     t2dbconfig_defensc‹#'Ñ
h±!¯C“Èv‚°zQ
‡Ef„'q!s_ddlc
/
Ž\C”$’Ú
pCŸˆ1mlcŒw/
Ž^G”&’
Ú
rGŸˆ3enable_fkeic
‚  ts3_tokenc
„nþ8±8ü‚bü‡load_extens^/
I
…Pƒ6˜Š‚Hqpsgc       ˆ"¹"…:ùŽy„ÙERtriggc
‚h‡k“ÉQviewc
ƒk‡p“ÉVlegacy_alter_t2@Œ=¶(–×ofile_formatcŽ3¶s–×SookasidŠ'I-M‘ŸcHž0%-‹]ø…%†òƒ|*-‚#       maindbnamc
†fƒn–Boxc0$1$.$$#=(0&
`-W`"R;G#B 3F#%).#&2'!# &"""!=1#2
                             X
20.1*.&K!
--ŸK˜€€€ƒ3¿S 0sqlite_dbconfig_no_ckpt_on_closc
‡,
reset_databascŠ`
trigger_eqpc

‰1usted_schema|:E©g0‡Ønù†y‚°oŸ|ƒŽxEwritable_schemac
‹j
data‚†#’û%I
pag‹b¯S>

#@-"*0$
-…:„7ø„e…ˆ2"

#@-"*0$
-»B!„ƒ7tr‚†%’û%K
statu'
s_cache_hit(      ƒ'miss(
ƒ=spil(
„,us(C%d”¦}!ed_shar(
b]writ(ƒSNdeferred_fk(
„oœ–×?X
lookaside_hitRmiss_ful(
 snusE£S—ë‚1max(      schema_us(‚ACtmt_us(ƒ     ebug36D”°¨E¬K\Â1—C<6Z:gQ܉œ…l
d{…Î1<6Z:
fault_automatic_index‚‹u½`¼qù
…„ø‚Svacuum‚Œ.Š>ù;…Þ0$cache_s‚Œj"ùw…Þ3vfile_format‚2‘Xø?‡‚‚permiss‚ŽTù‚a
oreign_kei‚Žw¡lùƒ…Þjournal_size_limit‚^¯   „lù„…Þ|‚locking_mod‚O·#ù„\…ÞT(okasid‚mŸUù„zmemstatu„uƒ+‚5Žf‡CùP…&‡Cmap_s‚C‰gˆ»OùƒP‰g…Þpage_s‚’Ásù†…Þcache_initsz‚‘Yù…fsynchron‚’AB?Jù^†NB?Jtemp_cache_s‚\
.<•œ
/<wal_autocheckpointBu…|“NÝŽ÷d‚‡[…ÞuYsynchron‚‚Z(#ùu†j(#orker_thread‚“g†hØù‡t†h…Þn;
let…g
‚q‚Fe[(`c˜ z”u”݃   
ni@X
_#
serialize_freeonclosa
Mdwreadonli|8DsizJ8z
tach2erminist
‚`=L„a…<
…‘×Ò‚yå  irect_overflow_read‚£=“øpO†ë1onli
ƒ)#\*…=‹R‡J“ª
‚zƒLŸ0

sable_dirsync‚Ã5ùbfts3_unicod‚ÃXùb24_def‚ÃoùbIintrins‚Ä'ùlf‚Ã(ùb      on„<9J&"N:Aƒ=hy)hU:×s9˜Q„ed—4
‡$,†nƒO)’L# ‰L†#…;oJV?     
T‚a½†l‡  ‡Q‚BedƒµL,âN`‚×W$  q‚[’Bù\vˆ(
sdoubl‚”FùˆS              rop_index2
t2     emp_index2
t2rigg2view2rigg2
view2t2emptin†'‰  ƒ6—µ'      
nable_8_3_nam”‚$2:«RŽ÷|:‚)  api_armor‚¬8ù‚
tomic_writ‚¬\™ø‚3†¼“batch_atomic_writ‚-Xùƒ/ytecode_vtab‚®Xù„/column_metadata‚®bù„9 used_mask‚¡ÝŒ@dbpage_vtab‚¯   |*ù„`…ˆz*       stat_vtabxN¯@
6…GŽYLê„h…€Mweseri‚¯ù„pexplain_com‚
¯BLùa
…Lfts3‚˜°üb
ü…o_parenthesi‚˜°/üb(ü†token‚°Rù†)4‚˜B±LübPü‡#5‡
±e¾W»‡<geopoli‚±}ù‡Ticu‚™jܲüx„%ü‡eotrac‚²"ù‡yjson1‚³ùˆYlocking_mod‚ºstyl‚³=ù‰
math_funct‚²Sùˆ*emory_manag IµY¤\ø‹0†òtZsys3‡?B
¶;“Xøp
‹];†òl/5‡AB
¶K|øp
Œ†òknorm‚·ùŒjull_trim‚Ìz    ·ÝD¸,   œŒqoffset_sql_func‚·lùCpreupdate_hook
¸2ùŽ      qpsg‚¹….ùŽ\„ÙEFrbu„¹(ƳŽedef_io‚tre‚¹1‚ùƒÜC!sess‚¹?ùnapshot8!"‚J‚¹Fùorter_refer“5B¹\eW-ùa3eW-qllogŽ%B
¼6ùa
‘p6tat2‚‚
½&@®f™fÕLøn
’v&‡‚Z3‚‚½7&}@”ši
©b×>øn“&}„ø~‚‰l4d…"½d%a@”†9
©d"×@%‚)øn“;%a„øo
‚‰%mt_scanstatu!:»eù‘<vtab‚¼)ù‘\Òr'tree_explain‚¿ù”gtracƒ
&‚*)S 
 #
       ~;#$*)9)1.%#B'.:#      E0:;                                $4)"&*:%()3*-+ $""!4(3DP'!
--ŸK˜€€€ƒ4¿K 0sqlite_enable_unknown_sql_funct‚¿gBùa•>Block_notifiRÀL…xù–#pdate_delete_limit
ˆ)…1†u‚¿‰sù”p„“  wheretracƒ
(‚*
cod‚wšH‰\<  rror<s72

&qLI4       …?
‚=_sz„KW]5(\j$gƒ¤ˆ…)"”2ˆm˜(ˆ‚‹pJV  ƒ9‚N•ù„.‚M(»3*
_missing_collseq;‚„b—µaretri;‚E„e‹;—µd
Š*snapshot;L
"y„hh+—µgŒZ+ xec‚wb
ƒN‚‚-s
ƒS
?‚QK„Sƒ!ƒ(„„•3ŒT_printf‚wšKŒ2‚-PY
vprintf‚wšXŒ&

tension_init1ƒ†    E…˜Šq
#E>2ƒ†;]„H˜Šq
U]@rn‚ÜBù‚ra_dur‚
”où^
ˆ|fail.#       cntl_begin_atomic_writboŽy.2D&®ùƒZusyhandlC
ŠZchunk_sC
Xkpt_donC
%’fstartC
'’Ksm_filC)ommit_atomic_writdo  I®øƒ\†¼“phasetwoC
ƒ^  data_vers
0--
#‘F
external_readC
(“
file_pointC‚9get_lockproxyfilChas_movC
"
journal_pointC‚3#
last_errnoCock_timeoutC
"Kstmmap_sC
Œp™:ùGoverwritC
‡pdbCersist_wC
…E%”5z†:™^Ž÷#n‡¹
@   |owersafe_overwritC
†U‰ragmaCˆq1-2%1‚ƒ?–×-‚ƒ?rbuC
Ž`
eserve_bytC&ƒx—¼kdt_cachC*ollback_atomic_writC!-n+set_lockproxyfilCize_hintCF¹wlimitC
$“`šyùyncC
‚\_omitC tempfilenamC
‹HracC
ŒfÁCù—        vfs_pointCˆ28namC

‡G  wal_blockC
Ž
in32_av_retriC

„   get_handlC
I  set_handlC
ozipvfC
ŽO   in‚w(
)mƒy‚"Oƒ      loat5‚
TÇkŒ;ݳ  ormatn‚ƒ<—µ-   ree_t‚wš*†vmem‚w“‡~H        ts3_max_expr_depth‚•ù‰  ul‡n;?Ð*
7… šJ†Šˆl      ƒ?…R       Ðƒc?Ü»\…Æ‚‚‘50
ƒÆ'¶‚HY
nc‚w-#t2get_t‚wš„4iXi7…M
able_printf‚wšfŒvprintf‚wšsŒ
have_isnan‚£iù`{
zlib‚Á\ù—ignor…d%
"NN) L      ndex_constraint_,U¦f•ù|eq@$4¡•ùƒfunct_(¡r…) `%1R•ùƒh‚/%1Rg@¡•ùƒlob@   ¡*•ùƒ t@¡•ùƒ    i@¡Z•ùƒPsnot@¡B•ùƒ8nul@

6e¡JŠc•ùƒ@‡Aul@
4c¡RŠY•ùƒH‡?l@¡•ùƒik@¡"•ùƒmitB(¡b‰(+•ùƒX
†+t@¡•ùƒmatch@¡•ùƒn@¡:•ùƒ0offsetD(¡j‰"+†'•ùƒ`
† +…'regexp@
¡2•ùƒ(scan_„] •ù‚uniqu9s„fG<¡z•ùƒp‚J
nocu)$:FŽZ…>‹s“ª‚{ƒn
sert2h‚PQ(_c•„2W/”;&C”ÝW‚O&C
t64#UŒ!        ²lD•ù^
      
eg5‚T
SÇdŒ8
¥Pdݳ…ˆ9
‚8drnn…11ˆ\"     ƒB—µ3
ruptED
‚6W
…i1ˆGƒŽ>‡",    ƒE…—µ6
‚jrospection_pragma‚Àdù–;             ocap_atom)
ƒc'¬u
 ‰Aø‚Lic16kƒi+ kƒe+ 2kƒf+32kƒj+         4kƒg+     512ƒd+ 64kƒk+
 
8kƒh+ 
nnnƒ+3 ,
batch_atomƒq+
Nimmutƒp+
8Œ‰•»powersafe_overwritƒo+
†iI
‡zsafe_append)
ƒl2PX
 .‰
“؇+equenti)
ƒmOnX
 Xundeletable_when_openƒn+

,
err‡s;@J„>     …p1ˆNƒ,     ƒH?Z^Z/4.]—µ9ŽZ^Z/4.]
_access;‚:
„k’9—µj‘.uth; ‚E„n“v—µm
’n
begin_atom;!‚„q—µplock;‚„t—µscheckreservedlock;‚‚
„w’—µv
‘4(IR#".A(8? $     9"(
#

)#-'9*)%4).2*8$G"4)/0$\( 
""ŸV˜€€€ƒ5¿0f0sqlite_ioerr_clos;‚E„z’(—µy‘,
ommit_atom;"‚E„}“}—µ|
“nvpath;‚E…“G—µ
’Qrruptf;%‚…—µdata;$‚E…”ƒ0ƒ5—µ
“,‡eCelet;‚…   —µe_no;‚…—µir_clos;‚…—µfsync;        ‚E…B—µ
Ž^fstat;›e…—µync;›HT…Žd—µ
Žgettemppath;‚…—µlock;‚…—µmmap;‚E…!’z—µ 
’%nomem;‚…$—µ#rdlock;
M…'—µ&ead;™\…*—µ)ollback_atom;#‚…-—µ,seek;‚E…0’9—µ/
‘shmlock;‚E…3’,—µ2
‘imap;‚…6—µ5open;‚E…9’—µ8
‘Fs;‚…<—µ;ort_read„N™H…?—µ>trunc;
š{T…Bn—µA
:unlock;[…E—µDvnod;‚…H—µGwrit;šM…K—µJxxxWƒ_
       so8859‚¤     jumpifnul‚
Ê:ÝX
µllast_insert_rowid‚wš“jƒs   ike_doesnt_match_blob‚ƒB“ù‚]ŠO
mitƒ‡~—Ì‚k
_attach‚[s
        *jcolumn=†
mpound_select¤!l‹ 
expr_depthax
ˆa8function_arg
!iŠlength‡{%2„L
ù^‘ike_pattern_length

1ŒZnam~O
sql_length3‡>
trigger_depth
KªuÅC•Ú‚ý
variable_numbŒ)
?Ž(dbe_opw
worker_thread

S“q†>^
×aHù‡~†>…ÞH  ockn
!w„t,[Hƒ\~‚O…Q
‹Q
Œ3
É~=*F6=lD?gCzR9&&?‚z >…P
vP$ˆ.‚S   ƒK„>Í{÷œ
…9=ƒÜ>P‚ßD<
‚_exclus2%u0iœC–i‡)3O.–°RD
)3O.
non)
-+%u+i
œG°7B
pend0%u.i
œy––°7K
reserv/%u-i
œ]––°7F
shar.%u,iœM
C–
#4‡m–°D#
\
ed_sharedcach;&‡ c…N—µMvtab;'‚…Q—µmast‚ÜD&#S’
Ìt—¥)%Ö,
x_allocation_s‚¤„ù‚σ
ttach‚G
¢`ù_Acolumn…Yx„TSR
¢aù_B
mpound_select‚Šq
¢bù_C
expr_depth‚ˆ53 
„    ž\ùƒ$Dfunction_arg‚
‰%g
¢d'Qƒ@ù8E‚°TN
Llength…g‡}-;Œ

–cƒ$
¢e¶9Iˆ‚n»F
ike_pattern_length‚‹k
¢fù_Gmemori‚‘K†ù^…X†
map_s
Brˆs&
ˆY»qùƒˆs…Þ@nam~`
page_count‚
/
¢gù_Hschema_retriƒW™L‹:øY†¼…F
     ql_length‚†5
¢hù_I
trigger_depth‚  ªsÅ6•Ú‚ý
variable_numb$‰L%fŽ
¢iù_J
worker_thread‚”†ù^ˆ'†   emdb_default_maxs“ršOùŽ\ebug‚
Ù6®S£[…      ‰Mø`f†â{XMst‚Md”¦}!
at‚MC;      „N”¦7;     ƒN    inimum_file_descriptor‚›‚[ø‡¡G
smatchn-‹
Ï.†K1‰)…    ƒN½‚)‡+—º`‡Ø+?us?u‚66‚]‡8=j…H kljg-'Éq)Q†~        ,`‚9[Y‚N;ŽGƒEŠ†Q1‰/…E†9‚6       ƒQˆd((      øy…,)Q®‚S‚„‹:B†?((        odul‚h
ŒY&•ù^
…@&   printf‚w›
      utex_appdef*k‰ƒfast*?/8g¨noop@pthread>recurs*@=8Y*g¨static_app1Gg2Hg
3IglruEg   ¨42
mainA‚d'¨0emBƒ'¨12¨2openCgpmemFgrngDg¨3vfs1Jg2Kg3Lgw32?nolfn†W1‰5…l  ƒT—µE
mem‡;A
ˆ RLG)ƒZ*dIå?†  ‹Z~…;…@…ƒ#Œ$„r…Z´ˆ8ƒ    ƒW„WN§<½W„‡„aâl‚¡ƒg‚°g»4H
‚8¶SEƒ9
tadbn‚ƒZ,'#5#'"  "$"() (.!"A"
3(;(E((*?-1-$#*9O(5
!11-"(B:5OM %_
,,ŸL˜€€€ƒ6¿i—¸K0sqlite_notfoundƒ,EH‰hE„207†¬6ˆb ƒ]•ù‡L»6Nicn…Kdƒ`Š‘§ †!Q‡o
e_recover_rollback;H…c…T‘§8†Sw;G…jd…WŠ4‘§?†V
Š   ul5‚XÇvŠB ŒDÀTܳ(ƒÌuO‚Ð
leq‚„1ª$<§%Ýš<§offset’U$
×·s4ÝÂEœJ4        kƒDl
‚~~    
rIY~

‚"]g^)‡_
1ƒI/sG
…‰t7„Ud
†p!D$‚ },;ƒ,&ƒ*%="^}0‚t‡Sœ{‡4Ï4ƒV'ƒ!‡IBƒmUTœpj|_¶
þn<ƒ^T…]KEZ‹qB‚@

wBk‚z‚Kl‚‚/‰?;„zop‹}™Ew?Oa‹(
‡    W,{     ƒ{…$
›     i
z‚`(>4-       (”&ˆm–e…]ƒ1p8„[‰ßx{†m\•;QƒŠe†:]‚–ƒ§)‚'ƒ! BƒBUT‡D‚Ij|_—¡GŸ7
ƒ<‚þHÚj
     ‡bƒi
d‚(>4-      œ„"‚:;Uw&„A‚dÝTˆRÕu
T]7
_load_perman;K‚E…ZˆH%+Š/—´Yˆ,%+Õw4symlink;L       mit_‚ÅH7!
 S‚š}
0
ùX7!
 S
altert‚Çv‰tùƒ1„“nalyz‚ȉuùƒJ„“ttach‚ȉvùƒX„“uthor‚È-ùƒhoincr‚ÈC‰wùƒ~„“itJ
‚AL…N"Ã
3       ù\
„i"„13    matic_index‚Œ-½½ù
:…„ø‚eresetƒh'ÉT5ùc…5vacuum‚Ë(ù†c

between_optim‚Ëpù‡+ lob_liter‚Ìù‡<   treecount‚Ìù‡Suiltin_test‚Ì&Šsùc‡aŠs
case_sensitive_like_pragma‚Ì0ù‡kt‚Ì:‰xù‡u„“heck‚ÌFùˆompileoption_diag7]Ìaùˆlet‚Íùˆ=ound_select‚͉yùˆI„“t‚ÍQù‰

datetime_func‚‡CÆùW‰ecltyp‚„.ÉZùƒI‰Aprec‚„KÉK^ —.‚{†(§@Œ9øƒf‰O…Þ@+wEN  ‚seri‚t}¯<Ÿù…‰xiskio‚ÎLùŠ
explain‚Îo‰zùŠ*„“
flag_pragma‚ùŠCoating_point‚ÏÄMùŠT
oreign_kei‚ÏQ‰{
Š|‚ù‹„“Î
‚
generated_column‚Ï_ù‹t_t‚Ïlù‹'
     hex_integ‚Ïxù‹3incrblob‚Ðù‹<
tegrity_check‚Ðù‹Irospection_pragma‚Áù–]‹R
json‚Ð$ù‹_
like_optim‚Ð/ù‹j
oad_extens‚ÐE”4…øŒ„“`‚þlecaltim‚ÐUùŒokasid‚Ð|ùŒ7
memory_alloc‚,£W‚(Ùodb‚ÑùŒ?or_optim‚Ñ.ùŒi
pager_pragma‚ÑFùragma‚ÑT‰|ù„“ogress_callback‚,ƒ>Íù\
Gƒ>?quickbal‚Ò!ù\
reindex‚Ò<‰}ùw„“

schema_pragma‚ÒSùŽversion_pragma‚ÒaùŽ
hared_cach‚…Ínù„,Ž8ubqueri‚Ó/‰~ùŽj„“ tcl_vari‚Ó<ùŽwempdb‚ÓQ‰ù„“!rac@Ó[ùigg‚ÓjŠ
Š~‚ù%„“"Î
‚uncate_optim…NÔ)ùd
utf16‚Ôdù
vacuum‚ÕŠùN„“#iew‚Õ*Šùe„“$rtualt‚™ÕbŠü)ý‘„“%
w‚Õnù‘)        indowfunc‚Õ{ù‘6sd‚Öù‘?xfer_opt‚Ö[ù’  pen‚w M83E5k“BŠm_„e
        autoproxiQ
crQtƒPD‚‡J
deleteonclosQtƒ39g
5
exclusQ
\t„k …K
6rescodQ„
  fullmutexQƒ"¨ ƒ9ù…2¶Vc
main_dbQƒyS
¢G‘‰,
journPVƒzHemoriQ
‚XnofollowQ„FmutexQ‚}¨ƒ*‰Gù…0¶VT
privatecachQƒ~†V
‰_&Î
X&readonliƒ^e‡`,writQƒOy'‡H†D•£qv
sharedcachA
`'ƒO†q0
‰]&Î
V&ubjournQƒ~L[/4-B"7…K@6%$$$(1  + '*'Y)&#;!*<$+&#&$4#%"2
"&/(1)',/
55ŸC˜€€€ƒ7¿
Z0sqlite_open_super_journQƒM
temp_dbQƒ{S
¢[IG‘‰,
jjournQƒ|Jransient_dbQ
ƒ}gKI/
uri„]: 
Œa
‚J„!;•»"R
wPX„ s_os2‚ƒEthƒV¥-ƒFù‚?unix‚ƒCwin‚ƒparametƒÁqL!—ÌVlL!  ermn…:1ˆ‚      ƒf‚8—µW(     owersafe_overwrit‚›l!ù^y!   ragma2
epare_… no_vtab/&rm/
ypersist/

intf_precision_limit‚œ?!"ƒørL!"†Ë‚Gv†e—‚/
ogress_handl‚w›O2 tocolnG† 1ˆ~„2     ƒi†S—µZƒuS    trs‚‰C•³query_planner_limit‚žC/)%Tù^’P/)%T_incr‚žwB"ù^“Brangn‡~x
ãn'‘„6ƒ[ƒl‰Z½^
vn‡÷']
‡P   ead2f
‚     SonlinccƒY‰6…`Âzˆ>ƒ      ƒo‹F‚$?–×Q$Ý4`‰?‚$?
y_cantinit;8‚…]—µ\lock;5‚E…`‹l
—µ_‹V
dbmov;7‚…c—µbirectori;9‚…f—µerecoveri;4‚E…i‰A
—µh‰4
ollback;6‚E…l
—µk
curs2#
index2
plac.&
verse_unordered_select‚ ù”*      ollback.!
wHY
!L8ZiB…Cåÿ2
É{*’.‚P‚,hj‰U†fƒJ.’@i#‰D†
…XOw     Rƒ"ŠÜ‚&ÕyŸƒ\üh
…6*ƒä2
Ti‚×Wc
ˆ   
tree_int_onli‚¼ù‘        savepoint2!    canstat_estrxplain9
_nam9
<loop<visitVselectid9
hemaƒt$„x‚HLƒ|n5K‚7ƒ@†z
1%)¯AÙj     …P‚§ƒ)]…g„,ž…$‚,*,‹     4Q*ƒs"+‹<¤Z—
[@
……bi†0²{§¥p…$œ‹˜ƒj˜ ‰„?&3L&I$F% ƒu†u\•7žcDLC^•T‘4%I#E$ V[.Ì}


%)SšsÙjƃ2®o4§ƒ)]…g—0’®p
y‚,Ý_|åG1[Ý„WS(ú      ‚(‡Nü…$PV3.ÍF1
&I$F% Rf„t\—9ST®gY…S^
„
   $%I#E$ (.        ecure_delet‚¦

š$Èxùƒ…Þa$
lect2
qux)Oƒ§b‹Èjj’

        0ÎT
',
…E*Ñ[8§b‹§„%†¼Œ


ÆGw0
',
¶4~*
rialize_nocopi
Y
ssion_config_strms‚%llªxxx‚«Dobjconfig_s‚ª>
        t_result_‚w
®mtdoubl‚-Uerror‚-Yint‚-Qstr‚-K               hm_exclus1
!lock1
nlockshar1
unlock1
"   orter_pmasz‘ Uù”b
undex’v‚Áù–^rce_id“L
==‰A%ˆF–þ3
ƒ'%‡G       tatƒ„X…K!þv     5a¡Y„i‡GÒƒüƒ    5…õQ
yÚ‚4¯q¦,1]†g!zʃ¨4‹_ oZ>š
—
ˆ„tL‚
8;¡z…À˜B&Ñ,/     ‚;5   
ܵ7õ<¨4‹_…€‚‡A
 Lv8;Ÿ!‚6åƒ0ôƒ^¯(/    ‚;5   
2
y‚½/s$Õ<&   
        Vø“‡‚Z&& 
        V3
|‚½\Q¡{‡~
˜C<0×2)
!       3ƒjø“3„øk"ÚZ
ƒ_<¯,)
!       3
ƒX4o‡‚¾8Q¡~‡}
˜E<6Ùz (              'B*,5)ø”„øk%ÚZ
ƒa<¯8 (            'B*,5)n‚¦oÎ3•ñ‚(‚‰us_U+malloc_count{sS‚d”¦‚!emory_us#‘G†dW°*øm…T†dƒ-ƒÅ†tpagecache_overflows
%ss
        cuss

rser_stacks
‚Âvù˜Mscratch_overflows
‚ss

‚uss

dcal‚ÜVù‚)
ep‚F
†h
1@‰F
†
 <‚SM, ".{.T’
mt‚¼".*0k„Xø‘cÒr.*0kÚ^„›   ƒX    jrnl_spil’(B
¡ù^
•#statues_autoindex^„’̃
filter_hit{    ‚"miss{‚#ullscan_stepƒD„’Ì‚3memus{
‚R'…y’Ì„(++
)-&
?<,@T$('    
'-

„Y0 "=lVDx| 
?".c"
")
""ŸV˜€€€ƒ8¿0^0sqlite_stmtstatus_reprepar{
T…K’̃eun{
r…a’̃{sortƒF@„N’Ì‚hvm_step{
…*’̃D        ubtyp)‚K…?“ª‚|      ync_dataonli
ful)yDI#(?
›
norm)wD;!#(›
sapi‚Û?"9rùf"9tclapi‚Ýù‚lemp_mast‚Ìv—¥)'Ö.
schema‚ŽO3Ìu#—¥&Ö-tor‚¨j…3"˜sNN  *>Ô&]      ƒHù…|„¢v"HN       *1»s ] emean‚©
ù†
stŽ
ctrl_alwaiq P‘‰tssertq
benign_malloc_hookq
itvec_testqyteordqexplain_stmtqtra_schema_checkqfault_instalqirstqimpostqD†%’ëX       %
nternal_functqsinitqkeywordqlastq"ocaltime_faultqgestq!
never_corruptqonce_reset_thresholdqptimq
³I‘‰Lparser_coveragq
ending_bytq          rng_resetqtorqsavqeqreservqult_intrq
scratchmallocq      eek_countq
orter_mmapq traceflagqunq vdbe_coveragq
xt% ‚TU-}ÇpŒ>ݳ"      hreadsafh]        2wyN/†]B"R¥"+
9
2‹$©Où1Rƒv"+
9¶T

2   mpdir‚ž•œ+      oobign‡jU2†71‰„u     ƒxø‘(†¼i        rac:Qe_clos‚7profilZ5row‚
size_limitee4©7ù†Itmt
qnsact2
i…
…~/ƒ=˜¢R
usted_schema‚©Yù†k        xn_nonr%C*D.readr
0D/writrTDuint64%        ntest‚Ì/Š@ùc‡jŠ@       pd2h‚B^(bc•ƒz/”b-”ÝW‚v-                se_alloca‚….»c"ù„I
–f"
fcntl_tracÁ;ù—uri‡ªJ
ù‡'„Âr_data‚w-_      tf16C…?‚&ƒzIi
_alignC
K
bC…@{‚‚bƒ{H„V       lƒ#“b“©‚„ÑoA
lC…B}‚‚dƒ}G„W    oƒ“^“©‚„Ño=8CC‚ƒ%z‚,‚aƒyF„U        fƒ'§5¤@“[“©‚»„ƒ–'vers‚”   

AbO„)…P-šDˆt‘Ö\O‚¸Beion_numbo
5[p†xŽ‘/†ë‚&
      m‚w_!
printf‚w›.      s_pgsync‚ƒ    tab_constraint_support%
    
directonli%‚               ‡S“z“É9‚°ƒv
innocu%‚*    Žwarnn …qƒ{
Ž%‘§F†!låEz
ing_autoindex;I‚½…o•ñ‚uÃn    in32_data_directory_typ>heap_cr‚Ù{Oøt†òf-malloc2¡7,ø•D†òm
_valid‚Úkøt†òfItemp_directory_typ>xxxxxxƒ‚E—µ6yyyyyyiƒ‚W—µzero_malloc‚×yq
—
Tø“4†òTint‚Ìb‚¸      logictest‚‹K”õ)server       tie_abort‚‘;”Ý
rt%Nƒuar       {˜l
]„eak‚ž•Ò†?ez4§rc’‡q‚>

‘e/—…
N
Y
ˆl
@;o3 ž7‰y       
ˆ    qEjBs˜U
±3 „u„A…(F^Š.Ôt‚l               ½"\åI Î/‡‹&„AÎ
L‡#§¤@;‡e1Î
2     
¾6qEjBsŸ'z³Q*X,F0ÆH)hcntˆ|Žÿƒ%listƒ
‚ ibatsa‚„s
ˆ9!zoZŠa„Žÿw]
ƒT¶S1d‚®>Gi(…~ˆS‹?ø„†ê~Xs‚.yo„¶O2t
‡_modeƒÀ—Ìabilˆ,¹…N%
X‚%› ¥e’o
„²øpŽc…N‚¡T‚¸?‚™3lv]
„
„AGŒ‰L-™z
Bµq”?Š]Rb(?`‚Fˆ*ƒH„iM6$#iƒ=_‡U>²
7kÜï^ý#—†úfck"7;‚$&!WmN‡V
„‚ˆN‡ˆ2‚/
…7
Œ j ^Ÿ_
“‚…‚‘^
×M†z™>L.‚XSŒ#}B22+*(*
ƒX/  xŒ`+‰bA%     jŠnt)-Zt# fm“,BU$™)Œ
8ã|‘,
‚e,Š9Ž|ƒ'2!$5`


          ,l>%
%1$!/'KKaK; 29/$*#+‚*
?3
` 
""ŸV˜€€€ƒ9¿0¾ƒ†i&ÜCõ„R‰OŒ˜C Q[7
‡cMhÝ‚#ƒž‚™t,…&Ÿ%e0stackoverflow‚…*—†_ff‚ˆ4‚ŠGŒH"
@ge‚–t+
‡Y½–×"
®t i…G'*W‹¯Z‚+¢L   †Y(–ׂM”"sÆ‚leƒ‚ž]/Œ84.Œ×w @—û&L…5Ÿ=ndE‹{     l”5‚Z‹(…-‚hƒ%‰pX…)„
 ‹6’l†}– „˜L‚¡K’`
ŠjW™LšhŽþwÆ%Z¾‚QõˆB‚Zƒ¥ps³`D«‡‡WÆKalon‚‹bN-
‡'\µ]‹•Œ>\å ”,>rdI#(„L;‚?
‹FŒ™$‚<3        ‚*
ƒR%‚Œrœ4ƒqVƒ  F‚0Y3
^‰u
ˆ›@”8£e-…(*%l‚Sƒ]k†I#‚F
      Œi
ŒSD‚_ˆ#W–iµ(›T'‚C‹8†"„dN_›86‰"[‚<t‚<+(…K‚8
‚?4„‡.š
-qhH‚E—Šdº“V1‡žQ‚ Ym„%
†Šy8
„/‡.Ó~hJ‚^‚$ ‚<«z‚+P…‹ŠCŒ!$$mT$yK‰x‚$Oˆn†LŒ1Ge¯…iƒb‰;Š>Q½-‰c‚— a
ƒYƒ
$,#„XŽþ[\M—5§GŸ‰GŸ 
‰U-*%l‚ÝU
FB‡‡g]‚W•V’*7ƒv‡dYÝc#„h‚K—7¾>‚2‡.¾¾LŸ/—(1Yc‡]I   ‡ƒ¶ƒ!—§K§‡.F$ žZ"‡WP
w4¶‡0KT$yt@
O‡ƒ[a
      Geb—I‡‚YR‡\)ˆ&Ÿl9¾*
",#rk‚…?“št†Gƒ
D„L‡O„sy"V‚E
—R5$"
~7fi,)#   *-‰\h‚‚H‚0 2!+ M!U        das’YCƒ
Š1Œ^‚ˆ>‡8ŒG/Œi>J4¦yƒ0‚.‚›yŒL†C…6‹‹9›_‚&8Œ@‰Zšh†iŸ'n—&L‡)#‡%“Z4¯Vƒ-%2.”&·:()dŒq“H„
™s(‰+8‰o’i…c„.*w‡X‚†‡2’bœy‡7‰1c` J.Nq‰ˆŽHŸ]
Œ =„p‡$;„)
&…E‹w„q…B@…M7
˜yŒ /(“!ƒd!c%
Ž"†u8A.‰[mf+D"…dT„N¦V|‚&,†1Rr0.'‚!‚[NT%‰ˆf‚2\n…Z‡"†®w…n‰O²p‹P…D,t#u†R»R¡qŠP‚w‰N*„nˆ}R…{¨†g‚J½H†l&+$‚.†f\‘t4‚J1„&"‚x‰l&„,„„„„>"¤v,ºO‚wˆI8‚G„=j‡:„UMX¥Eƒ@ƒ8{†‡+Žöƒ
?‚I—T—‚c—40
D.
}‚

ƒzy„LXv‡c
‡28‚&‡_O4Jšh†iŸ'n—&L‡)#‡%VMMfa-%2.ƒE()rƒDŽ‡BHEs(Õp—+2‚B‡f„‡X‚†…f‘“f‡^—8‡g
^ }
.NúŸƒe‡hg
‡ƒcrs@B7&Ež{/§
D¶U
ay#‡]6‡ [
+D$JT„N¶RMNT%PL‡a—0W—9r
-Ÿ&‡]FHO
¶C‚X,tƒ5N§!¦b
„6‚i‡ir®qx&+$‚.†f\SC‡_31Ÿo(<"]ƒ8W
Š<,!‚w%Y T‚<k—‚%P‚8{_block‚‡T‡,‚3ý„-:‚3statƒŠIup‚“'‚
c"…_Š‚V‰»{
|e‚Q–×JôoyŸHvat˜JKŠl–H
Ž÷|„á/Ttƒ„X…K
+þv     5ƒ¡1
š9¡Y„iƒ6†{Äp‡G‚¶09…-Ñu*.ƒŽ3
)íPƒ     5…õQ
yÕ†{:ô`‚4‚
‚—
—\I*.¦,1]†g!zʃ¨4‹_ oZ>š
—
ˆ„tL‚
8;¡z…À˜B&Ñ,/     ‚;5   
ܵ7õ<¨4‹_…€‚‡A
 Lv8;Ÿ!‚6åƒ0ôƒ^¯(/    ‚;5   z"-P?@<ˆA&
M4m
""ŸV˜€€€ƒ:¿0Ê
0stat2
y‚½/s$Õ<&   
        Vø“‡‚Z&& 
        V3
|‚½\@šW)
“}¡{‡~!
˜C<0×2)
!       3ƒjøn“3„øk"!ÚZ
ƒ_<¯,)
!       3
ƒX4o‡‚
¾8E@šR$   ¡~‡}!Œ;c&

˜E<6Ùz (              'B*,5)øn
”E„øk%!ŒGZc&Î
ƒa<¯8 (            'B*,5)e‘   
]…$˜K„<!
_


…ƒx…

%†.
[„9ƒ
˜g@Å2—F!'
M=
)§G‹oŸGK¤^„˜=   b„~
¸L„
‡*‚G  *‚0‰§"<‡Z†‹0    ‚Tk‚Ek‹7…iJ‚%ˆ)/‚*@tpI<ˆg-1'\+"&…b†_…]‹qZ‚3¢Js‚eƒw
‡
ƒQƒM„2ƒu‰"|ˆ†v‚)X6!N†³x‚A’x•2Š°rŒdŒZg¡}!S'Ú<c%‘/g…L¡'0$„9ƒb5             Žöv
Æ‚;‡OF!Q
M=
)—8’y‹oŸGK¤^í‚m
ŸŽ#‚|jŸ0‚D§:%//@t+IG-1\+"‡„>
J!„0¾gJ‡jqK §…<‚)X6ƒL‚wOG¶7A2‚ §ƒe”P <
!'‚c(
c%‚ž:'0ment‚Knq1/    
‚ „?K‚3{@|8=>_#+:^  E#A3%/0
jD   \,9eL6
X
        ,b[v9W4

fIC*L2
#
        2F)#b
‚Š)ƒN†K,3F%2N       Q5‚ ‚Ryƒ'y„`'4r x!2
S/)†8ƒ1: †y6ON"3x/Iu@„Ei8    *Q‚Isv8>%ƒ0)vN'4%*&
;,J     B"63f
%   (A       „bX…2ˆ&‡/$A+5#$?8`2.!>Y
6&       Z
o       $/‚)„."‚ƒC9)h$ˆ7`6/6)
&5‡@       0.nz7
A.X<        6
4lMfJ&        
\O"
0   '!+

$!?
 =4#
f&! h>‚
„wJccƒ(

†+:>1$
@@‚t„Y A/~@r0WzF

(1
DN=!ƒjƒ+,IK1„
:ˆmE†mBiƒ<.E 6jŒ+‚Yu
        !
1 sˆ8ƒ!!U$#c"h!P

""pD@4B1q†1‹

gd…_ƒCJ‚c&0 ‚3‚?‚^‚#ƒ
}Y}‚0%H‚t8
1.„X(h$tu        J     4
!
"B#   '
!s$b‚

‰‚jx)‘cF        6V’z„$Av†        >”š@¡E$k7†;b‚Rˆ‡l‚Hj
i*J…&+v‚9ŠQ™!
WAF…=™P‘7—<…B„^‚ m‚7b†(Hal#&}‚8N##-‡%‚W’P“k‹T‚3l†:( \š“!lm‰HE/‚D
8~Bz
‚}!0‚y‚
2<d53ƒ?
9=
†{$J
n®ˆ2‡t`"ŒIt„CKŽj…U&")ƒM‚%O…Gˆˆ6ƒpƒ,{S‡ZviWJB$_Wƒ:fuA‚"Nƒ4Šm"%Š‚810ƒ>Y/†c}kƒ‚E78&T‹f‚~o$(4H#34"„|!,ƒtŠ
….ƒ/u
    †+kRU\HrŸV$“m™?_ƒAƒI‘u‚"6p&.
*(8#ƒ)ƒ-67ƒh);C(ƒ.ƒR…Cƒq„,ƒ4†/‡StŒb,t ƒ$ƒH (#<„$ A?‚R
C6u]O!0‚wV‚/#$'4d‚=(!ma145ƒ#”gtƒKZ`IR†ˆQ>#(]/v2‚I‡
‚‚Nˆ
Y‡DR‚…Ž1„g‰Bƒ†*„,ƒ_
        •‡>…„AˆF‚u+ƒ‡<'4†b‚W

      
<pƒ6š}H2Foˆ$‚;1
,! %3M‚CFG"„@
G%
"f00/m!Y‚+W%/Hbƒ<‚mPˆf„i–1ˆƒsƒIF5ƒ      ‡xia‚UƒZ   Qƒ     s…~8yL‡k5ZMD8  u†1@„~z‘~‚E’_?‚'f9   @HA9;ƒ{…r@S1!mƒ={M"†^ˆI‚(R‹        Œg
ƒ@g,„aƒs 6ƒO@‚n
IrG„„`Ess%I8!,/;!              ,gŽK"‚nŠ]<„uX‡L!ƒ1X"…gKKˆ
}*O‚{ƒ9…2‚n„d‚c\„    %‰-ZPhR"
+‚„PS…I„:QNM(
E
I
<F-"‚X%    X‚\‚5Ke.|O*ƒv!"I/x…†|š+
’(”!wWD”  1H
 ‡
$$ŸT˜€€€ƒ;¿,ð\”""J9
Žqo0<ƒ(Š            7ml‚u  W>ƒ4†)Š
DrwƒKƒZ|A      =4ˆ:ƒC†f3!X‹N…??ƒ
ˆZƒt(d‡B‘„Ovu!%F> 
¬‚R‚
`  †'!"I
X0g=‚!›ˆv+‚8‚Aƒ))‚^k1)'+ˆ+p‚ƒƒŽþ]ZV—5'U"t2          J     4
!
"-.#    '
!sK^R

Y)     ‚{‡U6V9&tMt>ƒ
?j„‡^
ƒ‡j
7IG*J
q&vN™!
WAF…=™P‘7—<…B„^‚ m—W‡jHal&}‚8N#-~=68ˆ5‚3lF:( \#ym—

8       ®mh-%‡l[L`"Ÿ
ƒ^K"‡&j…U&")ƒM‚%O„S…3ˆ6ƒpƒ,{S.ƒEZviWJB$_Wƒ:fuA"‚&
"10
Yƒk,   -
#T2‚+‚~o$(4H#34"NQ!®n
RUH®p
\‚D¶U#*M(.
*(8#Ÿ+J617‡dPO'
C(w0‚H§‚kŸA?‚R
‡B6‡l4§m"15FIr‡k
ZZ¾@m‡N‡`(]m
N2‚„ *y‡EY„f—/C'Ÿ$(1
,!%3M
‚;F ":‡^
!%
O
(m!)Y
/+W%/H‡fy—7ƒSA‚6‡4ƒ
HiD‚U'  Qƒ     H…~8HLM')Z
OD‡b
    u‚U@„nzU(    ?‚'‡S9  @   

ƒ&@S1!ma"‚"„       ‚(„-     
_g‡Ag‡gŸ4
X@
?

"/G
rE=s%II&!,/;!              ,g"#5#A3ƒR!‚PJ"aKK*+&( žV
B
5
<F-—6‚R%   X‚\K—7‚3!"IS(…               7ml‚u  W>ƒ4‡g      ‡„)‡d
rw:ƒZ|      =4†3
‚:C
!  %?—
„:
~‡dm…
„Oƒ_u!%FI 
„'‚#`-
ƒ!"Iž
p+‡J
8&!)O‚^k10static*‚94 ‚\†~&‚ƒˆL‡)=ˆ"Ø>‰Œ3AHpƒc†   ‚
Ö¨IŽ$#
%   ”
‹Q¡03†O
‡c‚Nƒ&L‚~‚nƒ¥>gK$Ú‡Rˆ‡]ŒW$8+/&ƒ-b
‰
      ¤ ™uNR/Èx‘Xª6†-…!Ksµ>=‡
‚Fž}
õ1‚o‡Hpƒcü^
‘Ms#
%‚ h#<.³X=‚‡h‚&gK$O/—Æ‚u—<$8+/&&ÃwJ‡f-ˆ       „4dF4
KTst$Q,„q/
n2      „V˜!„H
MS! ††’T
‚[‚\œG„y„b
‚:˜@¯=0ƒ@*
        E%$[:Î=ŒCøŒ.‚×b
ƒS‚f,M‡4
tgŸo„y
`
‡‚8Þƒ2ôƒ\‚=Ÿ‚7$*
        E%$KCn‚¦oÎ3•ñ‚(‚‰u‚$      rh    mP&
C              `6…šrWE24‚\‚X@@;
‹‚;À<‹.žV³:Š.‰Q„2
†5    †v¡#+”H‰¢h2Œh4‚\‚X@@;΃ ‡V˜LŸ‚ÀCCœ     â9®‚¶        cŸ/*®zs64{„hB‘F†d7^Q     „„Tøb…S†dƒ-U
,QƒT_Umalloc_count{sS‚d”¦‚!   emory_us#‘G†dW°*øm…T†dƒ-ƒÅ†t„B‚7 ‚a
!!ŸW˜€€€ƒ<¿2º0status_pagecache_overflows
%ss
        cuss


rser_stacks
‚Âvù˜refreshƒ…*)ƒY
scratch_overflows
‚ss

‚uss
bar‚‚    t‚’Fdcal‚ÜVù‚)l‚£.err‚
(Xn"ˆ‘§5†¤ƒinƒÎ—Ì]ko‚‚sout‚“}/
ˆ:…v”Ý‚‚ï
ƒ:õ„veadi‚a„m~›b…%p"óIƒ¾ip"
¾Nkƒmer~
¡!
ôK)¾1C¾N
‚m)p‡8‚`‰}ƒ
\?Š=dŒX
UM†
OI…†"K}s2‰@4Tp_ 
)_Ga‚5}†
D$m 
aH‡+J„Kh   „H
ƒ
*


‚

/1\ŠZ@‚I.?;P

7[‚2
X¡e     
0_-Y‚
%.‚f4%sC,Ë„2
ƒ=0„,=i262–%‘L©KnŽ„G×V§*7Cˆ …#Žd"‚Ss[„@RÉX'§ŒS–“ ¡=<‚#$„+‚a†^…
‹$ '6|T
(gG)2<0;Xau—c9|‰1‚_y†3u‚*ƒC‚AY‚lJ-‚dUq#ˆ.!'
$…94}‚p‚|ƒn
ƒ:0^ŒÑ8œ)
‡fŠ4 
Q,!*a(†„)@„cN…_*+‚ "<ˆxQ3“)„VŽ@%‰…@
‚
’e ‡sF‰F
†
 <‚9M
! ".{.T’‡6*8
g…b´QÛL°Š{F‚YšV”
ã@†qƒŠ„bƒz„w¥]-f‚
%.2%4C,—Wp8žx,
‚"=&‚262–%‘L©KnŽ—1(‡‚)
ƒ(7ô
Ss
‡f…')  
ŠZN]¤9#$®r®r1 'Ÿo‡q=U
     ‡‡O      DYeO/
dD
#L!'

p46žr0
åO—C—%(—(——;(+. "<ˆ!Q‡[2—‡„   ‡i
%L®i      ‚
®l §
*‡m‡2§…F‚Y¶a"…+„tž{ick¨
ƒD   ‰…‚S“Y!˜šK!lly8†Z‡3N„k|ƒ‡c UI2
V%?„\ƒ"„!ƒLƒˆ?Š"‹…a™l¤G<ƒ7‚y-R´$
†c°aŒH©7‚‡vÓ(ˆ7„‡7®h„)…!ƒ@†g‰d‚6UŒ†ƒŠgŒ$ƒ3ƒ
^…vŒ»‘92‘)ƒ_‚x‹s…P       „C˜V|µ$™L‚ƒ]‚ Šv7.ƒƒ&…zŽ5ƒ>ƒg†9‰ˆ<Jƒ/…%‡85‚T‰Z„bD‡Š-„|Šic“Q…C
‚>ˆs†+‘ T–}Š9ƒ%’|:‰\ƒ™ZˆB`†J…i5‹?…P†JƒJ„eQƒ%.ˆ†0–ˆfƒX‚B„‚Tgsƒq“sBƒ†Q…d…v”S†2‹’ŽŸ4š`¶N†q4<…mY‹Œ‚J‚„;+ƒiajL“U¯3‰r‚`‡–ƒo6ˆA”~•¾=Šm‰VƒCƒ…bŠ¯$™Z„zÅ6‡@&‰'     …g‡NeŽöƒ
E'¾‡‚c<‚9sTœŒH©7Ÿ+ƒ^„wt„‡C/‡‚g0Î1—5{‡tˆ2Sn%X    |
‚e    -âH
].Ÿ ?v¶ƒ<vƒQ‡3‚%]9‚A
-|JY     t/¦TÆ4=‡‡ƒ W§‚3„"
F—/
rƒXŸ%
‚!B‚Q^H‡„*n…A‚7O)‡…{…R‡?dr4§   Jƒ‡‚     F§R(0"  7®7
D6a®—P%—.„Y&‡…n‚„…:S&(PU
M    ~g    mtœZ+'h)&P4Rƒ#¦C_G 5#Ï0êO
þ\<o¼‚X
A(WQ "           %U4 ƒ

Z)   ‚     1,        .      5
$!*0kƒw.B‡?        c        ?H     ~ˆ3Œ2D



‚_‚(T'rV‚„X¥g5"—%ŸÖŸ7
ƒ<í‘cÒr!*0kÚ^¾@yD”2Ý‚(Ÿ|r«qŸƒX#"

-
12$‹[G‹
""ŸV˜€€€ƒ=¿0º
0stmt_busi7B
)-"     isexplaini
8readonli9 S$ 9    scanstatu:"]
»j‰øt
‘A†Ós_reset;"Ltatu
ƒ='*;v
‚c<¢&  jrnl_spil’(B
¡ù^
•#statue
s_autoindex^„’̃
filter_hit{    ‚"miss{‚#
ullscan_stepƒD„’Ì‚3memus{
‚R'…y’Ì„reprepar{
T…K’̃e
un{
r…a’̃{sortƒF@„N’Ì‚hvm_step{
…*’̃Dock‚Œ1†L‚‘ý{Mne‚†p
‡$Ÿe‡
†t‚~e*0ˆ”RN
‰…sËF#… ¿î9Ž’‡w"
]ˆx¤Z„
˜P£ˆ„P
ŠR
„!™‘      T:F„`
‡Žöx
‚]®ƒx—#‡‚|—‚°OŸ‚Kõ.—<‚‘‚!‚À)
8„ŸJP¶+¦yU§

„8Î|g
HO—R‡d=rag…"’3
™S0+o‹‚u‚;Œ‹‡@H)W6';‚
B'>‚T‰TW,ƒuA‚h!ß,ƒG      W>ƒXgDz„7ddhX[\X[\XZW[[[\X[\hqrhpgqqrX[\X[\X[\VXUYZhpgqqqqqqnXXƒ        Iƒ$Š6®?‰G‚;‚f. ƒ 
=…1ŒhŽ*Œ„V
2‚])ƒ)…m‡!„—wƒ?† ><2      „…Tƒƒ4$ƒ
N†?{ Ž\ƒ
L,9„‹PŽšk

‚GŽ<“G‚ZtVvÕ
]ÀH1‚4ƒF”!=„(b
](¥u‡*4&‹,0[ƒh M†{£(‡`!‘#4Bo„CŽöD‡\§W6'  B'>‚T


,
fA
!§Ê^J
9wåDz‚lddhX[\X[\XZW[[[\X[\hqrhpgqqrX[\X[\X[\VXUYZhpgqqqqqqnXXƒ   I§„‰G‚;—4
MN. ‡   N”„¶[Î
#
‚0
. ‡X:
        „("$6    qY¾¾wÆ1t

‡1®uÆ"-rV¯ÍQ[Ž-‡b;H—u(‡v&
ƒg4E% 0[ƒh4ž
BFeI
†=…dgŠV}RB$„&Q‚C…=ƒ!/UU'/e‚_ND>3
‚O
M]ki

‡o‚|’~‚<`‹Sƒ4o57›G‘„ƒ,:‚…c51
Vˆ</"gJ:D
Wutoˆ3*-*„5&‚•.W1…KQlF‚Ž/„nIˆ¤wAJ‚J^jY‚<
        ]{=890FQ?]%82.‚,+v#6†O<+„$…r
:MBE„3‚eQ>vB…-H‡**
Œ}rT)ƒr*Y‚O{yp‚w<W‚b†%Ž?
(‚AI„t‚Z„8ƒ,„Vƒ=I
‚qWR‚
„:VU(„u…LG dV‚Ju‚`„w$;5gm3g|Q…‡ D„77…C‚c…%HP‚7Š3.’ŒF"[%<‚jF;    …Eƒ‚5‚6'‰.†F?Pƒ$
A‚B+
wB F>G
D
=‡\|2U[†r—6‡‰ZƒO‚Z#     !8
‰}(‚       @«     T*G1„#Pƒ)‚X
,ƒHS$!=Nƒ‚k)„mžŠn•>%%4%z„ƒ/
…Š'6ˆM:“mdƒ‡fv‚X*-š2ˆm
+‚#,-mƒ
…W
…[‚}"…NŒL4fˆ{M
5‚ Tƒ.Œ5hO…' ‡z<023    :
‚kl‰Wˆn‚:‚&,,‡…T"„Kš_  $8‚‚BˆW Z
I

(„Z†>
k)ƒo
Š|D‚e,ƒ7Ay†`„
„‚&Žlƒ7‚>C$ENñN‰Sƒ:#†j
 (ŠA>†&ˆW(}4RƒBU96w9"I_„mŸž„7ƒ4–6†W‰,Ž9/+‰s.•l…+W† “<ŒR!
…8
 ‚I?S+
…Gp&. YuPƒX‚5xƒƒN!1‚S*u‚9:U.B6      T#9b‚R…n%!(‹oB‹‚pb”Š
šTK!
o$ƒŠnF
ƒ,‚O“!‹P
†Rz
ƒ%:‚~\†       b¦žP–D‹WÖ:ŽX#Ž’0‰[£"(j5k•4,‚>s‚05k     bŠ~8„B„y‚\x„O\&‚5‚^^…jƒ`I…&%C$B‰V„A‡q‚'$ƒ@“2ˆ‡‰$„A…kŽO„
„(0>ƒŽö‡$L6:—5T>L+"g
DqWuto=*-*‡‚1
Ql
‚kI     ‚|AJ^j
Y
        ]
8.0FQ?]%82.‚,+k#
|‡'
[
:MBEƒD>vo—.

<rT)ƒr*Y‚O{yp‚w<W‚b†%Ž?
(‚AI„t‚Z„8ƒ,„Vƒ=I
‚qWR‚
„:VU(„u…LG dV‚JG       5
m3~e=("
") !‚[ˆ#
""ŸV˜€€€ƒ>¿0-6ï‚-l‡Z@‡i
E77
O‚cƒZHP'
‡$.
‡n"#[%<F
      
    „ƒ$`'E
ƒO?ƒ$
AB+
"B F>


=…&|2‡@
[A

Í|&>@«       T*G1„#P‡h
4q’†   ”
®V%
cN%z
W
Æ+ea
‚#¾9®q
Pu‡ie<023 §‚§$:3Y‡….$Ai
}     $f¶?)‡i
E
D¾0AB
‚6
&‡YV‚C$
<N—@#‡\ (c„((

4R+U96&9"!_‡]^—:—‡=‡dƒ„7K—‚B‚3n//+e‡…hh+W†     „d!
-#Py—AS+
Y‡\-&.       9uN0‚„G%!N
UB(:‚‚1+!¶_—5e%Tƒg‡jj5kƒ—2,/s‚k  ‡aoC&&
      &"‚:=^…jƒ`I…&%C$Bƒ+?#‚'$ƒ?
x"u
XY¦gƒ:0stori‚í+6r$"5
";  !E
?/?
_append,EDal$
[EEchartEFf+œ\1øi†Ë/errcodD
I-
Hfinish8!*:      length.N-EhInew$
A"reset$
EJvalu[f!KppendfELF—ÄODai.‚<†Q
˜c†*‰”cghtƒ‡B—ëƒ       forwardŽŽÿ„ng
¦`teg‚Úùei
„e&  žn
‚m„
A%ƒFŒ_‚OlB
³]‡UÍ>žJŽ(ÈRŒ¬\‘5h‚rƒ]NŽ÷‚‚O„Pü{
‰4<Kù‚j—¾G‚˜„‡s ”)bDƒ]Nchrnul‚
ŠŠ`ù
ƒmpy‚B[
„_c“™f$eam‚…N4>ž,:r‚I
]'HŠw‚ƒq„
‘˜ í2ngth‚˜|(ÁDp3•ò
m3ss‚„[²`>žY±ŠHŠf¡{‘ˆ6
ƒM#`‡’tch‚Š‘˜
ftime*&3N
*Š'ÍwŒù‰2„sglobM
hash‚¨L‘‰vicmpMMtŠ+i‰‰z>ŠEƒe„/„aCq‚
Š+N
'<w*#>&K'J=

Òs    —ŒNµ§
õ,>í$
‚PC
?®1ò0ƒŽ7"    
'< #>K'J#ÎH
    Ý‘¶Ver‚„•Ú‚XliEL‡p‰o
‚Ì&ƒ¢
³I(
„,¥k#—[#„’1‚§‡
‚¸1ƒ'ordinari‚…R–‰.ng   iyƒJ~VjL
R4>,P9(     

/XƒA/VZdd
Z
;I
j..!<R*$
d„‚^;Ž2$„
iG7
-Skd˜C%~gS,‚p9‚mH#=   $ƒ6k?,?V A
/*'O
 
;74‚b
 
 
JW&Ja
(-)K          5
}& ‚9
‚Ks9+b%
P'>      6!2C
D%8„+&'%`#4
A%
ƒ2…c8<
‚s
‚A*
N,!n(:A
‚$?u/u7
c"i%$<-H$ †1    ,†~…n*)[Xp#&‡‚?†FC3„Cp‚ƒRbQ†1S9&„R>ƒ2‚QƒXI%B}Z„y‡Zƒ$‚…&Jx‚zƒ
)piˆ?„`@%‚
     M$iT†     ‚i&9H$m„E„X
2Oˆ%-†L–%–Mts=»b]‡8†Bjƒw‚2„A  ‹3Œ#ŠMˆŠD‡ƒ=¥YŽwƒ]:)   „x‚…`l…Tˆ‡A0‰fŠA„7ƒWŒ0   )‡^a‘t§E      n‚v!“1)C^!‚:‚ /#\0x'‚"p(MuE‚)C…gzI`ƒƒ9(<‚,@ƒ'   ‚\†#+2ƒd†[

"ƒ ~c’O‡zŒt‡S‚)FY*
„
,1Mˆ^‚z‡0ƒ{šCŠDMƒ&ŽY‚WL"PY(~
c‹[

‘i5„"‚…_„9 }ƒ‚[
ˆ§X¯2¬{

‡‡e ‚A2‚

Š,^fPŠ#‚7‰2, !.c$G =;‚)x
##ŸU˜€€€ƒ?¿.#³!     -3"Bb8ƒ‚gŒR
!ƒR'b2ƒ1…S|v2ˆm‚?'0 „\ƒDˆ4“T‡
 =
ˆ$‚y—Dƒw«!ˆ|\‚‚"F$ ‚Mˆnƒ)%M?‚A]     
7‚‚`‰‚„>ƒ
]‚Z†6†eY7…5x)‡@‰‚$„o:Ÿk>6>9‚)¡£]«>“9ŠY†Š~nZTME|
m8P    &‚W-ƒY0ˆ 0„8’&ž/Ž~
‚n
-   #8x(Œ§)‚1G+Šh‰ŒgS…K bƒ
(9ƒ`X$Y3_%eŽöx
#‡eG‚?
IC3T
[¦‚7‚hLM+,ƒ
)%Oit@%  M$P‡†&9HJ%
2O
‚s-y‚
‚,Mts==]‡„—7Z+J       \PŒ#ŠMˆŠD‡ƒ=¥YŽwƒ]:)       „x‚Le<'‚
{0]P*Z  )‡^a
8       n/!1)C‡?
      /#02'Hp(
,"EYCI`Õeo'     &+2  Ÿ~ˆ=‡z†YŸmŸ!
FYÆ&2¾9PR
(¶|‡i
     ‡m§åI‡p
¾H'¦u ¾<2®.@        !     -3"Bb
z
N‡c;
!ƒR'b‡db
i
|v2‚=L0?'. 
<\N`Q2Ÿ!
‚M‚yDzP4žbr—8I—Ÿ     BE

 $8P     &W*-‚      ‡aƒ
0
P
h

ŸƒS#@6'
ƒ)G+w
<ST¦^OŸ b—7
0string1v›8P€
1P2v›9Q€
2Q8‚ŠXú{ÝV<ñp‚3veˆ„V†2.)‚NŽ3'‹œZ‡'ËB3”x†T‚h¤c›j…G(‚)_¦<–#í9Õl%®v<Ÿ  ‚iƒÌ3§E—F‡h9¶a—-«p'¶Y _Œlen‚3‚C“šA%ikMR &—X”ù‹e…Þ5ncmp‚3‚D“šA&icmpMO
4DÊd¶?oke‚K
Q´t”—2
ng‚†d‚6‘!!‰Jž
TøŒ_„º#(Ÿƒ—„J‚…‚er‚žN‘‰‚li£J?‚.J¥#Ü6Ù}ŸHuck‚‡–ׇt)   

 ÐŒ|‚h'Z%…ŠJŒyV
Š((ƒAƒ‡v
›r‚&$‡(AP“3wiœF½c
‚+
ƒë5«x
x6£~AU3ur’"”F
‚O=#:9‚C  
?
w
…`
,Jƒb‚Tƒ%… =
‚
gJ$  ˆ„
N¾V‡b[7(E„‹J‰
…E‚:‚H&ŠZ&>“cƒJ+3‡g‚0‰
11—Y—0‚<|Œ Wƒ"#%4~=Àc RŒ…-…2 mF=‰4*   …¢0‘p†$ƒk…6‹_„cŠQ.…8…E„I†q…#ƒ<‡a‚2‚;       „`Q!*+c^.%ˆ!D(…8)˜g"        7P,ƒ
-„0l)£užG     †Vˆ¡nY…bK-!
)Bƒf}†hED               ‚%‚0A‹"Š:‚)ˆL
‘1E‹Bh‚U28i“H…Wˆ_…t-„]"‚V-t- c2Î7   ¨NŠQa™6Œpƒ_’ž=‰ V¦F‚8t˜(ŽöL—6¯
u7(Ez
Š9
i&ˆV‡"—ˆr:‚]+3‡g‚0‰
11—Y—0‚<|Œ Wƒ"#%Ÿƒ-~=‚uiH„i mF=üaX-q‡R‡hÒx=«ro¾'"    7P,5ƒ
-
_l)Ÿ!IÝn—9K‡†8‡W, K-!
)B‚>}"ED3            ‚%‚0A‚}\U®]J‡dƒ—2E¾‡gU¾?`
}tŸ‚V
Q]„‰)j‚"Ÿ(ub
|    Ø
q—ør“H†òm ck Žø‚3dent‚+
Œ<”G!
‚‹I‘a•ñ]S!Ò{0i‚‚a…›F‚Y
‡Œ2‰"—W¤~‚‰[‚l'¥bä$ÜJj‚¡&‡lƒÌ}Ÿ‚ò'‡y…Xo‚’/mbl‚U–;ÙnS„øLnnelƒ‚˜š>spid‚–A•ÒRv£ ¾EYŒ    t//[@yˆy05
 
""ŸV˜€€€ƒ@¿0¯0styLˆf   D‘g       ‰u’b
ˆg ³+
FPp.†
˜\‰"„ŒoŒ}
§T)‚{>ƒCÀO¬?!3Ž÷
(Æ%"®z]„‡i ‰+
FUõ
n‡j+‚‘>3¾‚]‚‚ƒ1ô~~
‚3ist©;‚”ub‡
‚zl
‚[!ŒÎ’-ƒ
$(-•‰CŽhMÞ?VqÑ{; Y‰)©S7ƒvˆq„\ç/
ƒx½-gW¹>’-ƒ
$Ÿ/-Š*‚
„M…?Vqü^6;ƒÜ‚vœ3
ƒ[7„—…bí‚/block‚y‘‰9class)D 2  2‹
[(ŠXŒ{‰R1LˆR=¯2ìD
][…·%LÕu9=(ompon$ƒ@ŒcŽ)8

_Qƒ8

…æ
 directori‚ÂDÏ*ƒl´DŸv
†I@
ˆE$ø˜‚߃'ƒ¥‡'Η
‚)@§ $vid¢R
omain‚†jel‚S
¡]”Õu
ƒzxpress}
Ÿl5Y
Ö¶
15fold‚‡)‰r—ÌM`¾Cunctƒƒr  ‹)—ÄH*Æ.head‚ˆject„W“Nˆpž_ˆ18~…\'Z(‡lˆL3‚Fœ²z´:        &‚.D;ƒ_š
ƒ.]„=       ‚"šR6<3°c‚…R§ž{Â#Ž\ƒf‹[Vƒ*‰*Œ|³5ƒ@Æ0¦lƒž‚LûUV3‚F  O~ü‘Œe—4
]—9Ã)HíDpœ¾ƒg
"ƒ*„ 
‚~—„å:NôƒŸ‚
nourn…Plicens‚‘%mit‚[‚e!‚|òˆ        ŸH…9Œ!‘˜‚°q‚ßKü†-odul‚doptim‰w2ÈW
o§*‚s¯FŒøƒ‚ׂhmƒ-5Ÿ#'”.poena‚Ž#&[rog‚x‚
E/{–öKE/rameSg†;‚*Ï+‚CÜ]?)Äi‡™iUqueri‚
…M…uŽ
 „!"‰
 1wƒ—)c!V2“WM‚v


3$  ‚D\pt‰9
 Xƒ ‡"ƒj‡i>$ƒQz9„r
‘M
ƒ   œ[Oˆ3Œ2~ÙxJE}‚,C0wŽ=!/?3]‚u+
-2Ha™vz‚-   =4
N"#AKZ#    +o‚*$B09 „,†x‰!
6„D…0A)O3%       }>µUZ   


t§r®GX—:h³œƒò^1—2TŸ =!/?3]‚I+
-2¶P&ƒzŸB=4
N"#AKZ#       oQ*$B09ÆXÎ
4!
‡00@)O3%     3>routin‚(ˆE ?=#DÏa*Gº|µƒSŠÜZ ?…8#DÏaœ
‘7G„øqX¶scribƒpt‚*]„*„ect¤¬‚^‘ˆ$‚Ï}‚×F+õ\qu$
ˆ,&ƒ
„ƒƒGbbœ~‚d„/
m
5‚=‚?p=N 3{A„y+;     „eŠ'42L'‚?†'Y‚|
1
*ƒ)Œ{£7ˆ>"•{„Hv¦Cˆ‚E¶‰C˜DƒJ@‰-:Š6”n£M‡7ŽX†)ˆF‚Š6ƒY‚Z
‚x’„0Á.‚mŒ\Œ3‹*†—N‹3k„BˆL’3†‡Œk‰d   ¶R
Ž3ˆQˆ$£wƒgƒ.ƒ‹c
ˆd*v¤L…z‰t
B‰„{†,•3/†-®7ˆ.X†r:VKƒ,!Šy†&‚.‡@”i’
ª3
ƒ8R†RˆUSƒF ˆ6‚(…¢A†A‚     ƒE#V‚\‚1“f‡o‚›o‰f‘;‚1ˆLŒ •+Â=‡C‚.„<›2gŠs+iƒE™ˆ*‡#7ƒ~Žö‚4Æ/_Hvj‚?
W‰C‡:D‚f@‡h&N6ŠT£M‡7ŽX†)ˆF‚Š6ƒY‚Z
‚x’Ÿ%ˆF.‚m„7…1Oƒ&6
dˆL‡e3I„G³4I¾‚<®p®o2Iƒožy@Ÿ+"‡[¶Y
c/Ÿ(Æ—ƒ‚       {2LL¶<XkSƒF¦Q6SU.A‚_¦!PP—:‚1{‡d,x$
 
Ÿ
A
]\}‚.x
u$
x+i      '—‚\t
™aW„ˆ-…‹c,‘cêA™~|ÌBm‚e"Ïƒ
‚      
‰Xœ…^A‚‚ h?n '!
ƒf
jE…s?‰4
""ŸV˜€€€ƒA¿0´‚Kƒ”ƒaˆr©!¡g¢R„l§:„.ŽMSƒ:f=·6µL"‡b( o„‚S®‚U†e‚.
‚3"íŠJJ|‚‚Èb‡_Q¾z¾ƒzR‚l¤„HÝ„l)¦hrSL&f—70subsidiari‚„Rtanti‚c‚8ˆƒ
†VƒÐ%:—~4itut‘
Ž&"K‚   *#     5‚^‰pL
‰;c›>ŽŠAÎZƒ$û,†sÿq‚2ƒI‹!ˆz’5£?   —‡ˆJˆL¨     ˆN†…7~ƒ,„
¨
×lbe( 3OD
F!$(_;R.
&I+&#>Žþƒ7?
§}—6n'"ƒ$žæ^—3Sˆ+ÝWŸ3zW
•^    “FL\âI@Ý„,³Y
+õ‚u       ¾<2”3

(3OD
F!$
_;+.
&+&#>r$” '7”j|4‚
_¢:8
”L    ‚-‡xƒ=™G   „=ki¤†}‡`½-

8‡[
ƒq    ¶t
‚g¦…Z‚™ 5ƒ–lÆWŸ(iuctur,[“‚h1…{Œ:„alDƒ¥‚Gum‚g²CX•ò‚bCXystem&‚@JŽ7„[     
‰]:4LV/ „4S‚H
<ÑPI
®Do &’„‚c‚9
   Ó&†wT‰y‡g'
0d–r‰^Žl!ørIg‚Çp8ÕLƒÅ/ 
    <
!task‚„6•ÒXPerm‚gˆA2      QS•ñvA2       QSl‚„+N-Š~ÆÞ}X‹¨+ˆo–A‚YšW‰>ÜY‚'-‡jƒÔ-Úƒs¾ItyåDní‚Ö     
i‚
ˆ*†=)ÇfJ˜NT††JåOD>—ƒÔ~[„ÁzNT—Tract…pfÀ9ÅDeb‡q¥lã0ÜQ«kÅDÚ5Iƒ-‚Tƒ–„de‚S ™†j>MP|”Õ‚‚ >MP|yp^ K‚K‘Xžk…?)†`#!Ž÷*劃̂|‚À)#!vert‚–?Ç\–˜v¾r@cce?fOô(ƒYê;ˆ{…$‡iÜZßZƒYŸ3%…ÞƒjÚued‚@†|„|ss‡^ƒF.}o R:
i
&\‡a3 J
        M
‚e$0'&
† TS5\F‚. 4":
T
zuŒcƒ¤ÓDŠU…uÃl‘;®6êdƒ]ƒc‚N
@Œ-„b‚WDƒƒ,9HJ„/ƒ†V-…‘a‹o…U™Gw?Oa‹(+Ž0…&‘†      :”*ˆ]‡9‡ˆ…;   ƒ0p!„`…EŸNß8…x}‡ ‹j„|…Zƒ$¥0˜j‚!f²v
Œe+Ž÷
‚#ÆM~Dƒ$už|¯‘;®HwkNŒ3ƒÔ]fŸý„&‚†R‡
    
    =Wy        !„H!§4§‚$݇—‚fulli 
ƒah
ƒ
\C6ž,Žr…†…‡¨q
¸SŠtžOŠ{•     ½X‹%à'–È&Ã_Å„§KœƒyC5‚Ïe5¦`Ò{§A¶‚i§ƒor‚—?+3›U°;”c‚z„GuÜ`‚q+3›U°;‡©:
oinct‚¥HŽv    ƒ7ül„øs6Æ`ÂV       li‚ˆe‡c|”ôq@h‰
5WŠ)†w“‡=‹C-R
/@…Šh˜^W‚‚ 8‚>AƒE5.0‚'r/ƒ‡=

\;
B8J„d‚4    “}7[ˆ
a
’      %:ƒv‚25
ŒMe)‚›O‡>†}ƒ„i„2‚s ‰(Iƒ!‚sˆ68…}…
–‡g‹“X8‚‚I*ƒ¨:ŒO‰9Œg‚…^¬Œd¨…|s6>‚{
)t‚}ˆƒc@‚gˆ,Ž-…9bJ‰t†/„R˜N ‰+†3Œ?‡Z…*'Z‚‚6>…N-j8„pR
"‚@K2‚F+qˆo„
ƒ$(‚U,œXˆ(‡8ƒ(JŠ†'ƒB„_0Ž4„D
e…‚.z‹
ƒv‰U
ZVPŠ‹L„I‚]Y*¡7‚/)ƒB##˜d-E„7‡‚Q
M•~ƒ.‚…F
j35…‚>H„bŽ1…?†k‚…K‚3‚A•†‰Fž;ŠA›^ ƒ„-ƒƒ&pƒbƒmn‚5ƒW‚!…7ƒ#„+‚‚1‹E\‚&"`†™9…|\„4U
q……-™Z
”Aˆ45ux`~Š
‚4„-?])'aS.m'V
„zj>;
&&ŸR˜€€€ƒB¿(«‚v‚c Xƒ6ˆpŠi‰f1:mX†ƒ_‚    ‹y†&‰TŠ]•aƒ‚‰TŠv74„lƒ(ŒZ†O‡w‚
…r{—‚ƒ‰b
~‚?nŒ|z‹8†N‘P‚h>‚„_‚'…       ‰q¢<‘#› Š9‚+‰$ˆKI‹'Pƒ{-„pQ„1†BU‚,š8šG²Rƒ&Pt›?‚”p‚,†k"†z‚“
ƒg–{7&‡L*”U‹8®0ƒc‹„`‚1c‚o„Rƒ~5†ƒ&ƒ4Ž÷‡ƒ‚3Io‡l2M&‚s
—…y2
*,#      ‚‚I*‚      †v
E‡ƒ#—‚AŒd¨J

)$4}‡ƒ‡h
E<\„u
‚bŒk‚]%
~R;  ‚‡BŸ;¶\&((‡gX‡j
e‚'‚"ƒ(JŠ†'
„KI#6#e    oj\VS—
V—8 Ÿ Î#‡i]§YŸ[TpŸ„@b‡g‡‡dl„‚¦ƒS‚¶‚7A!‡=a—5X—wƒs‡f25ux#~‚(‡G—7$‚

B

:‡_
‚9X
Tƒ_LM-
‚6}‡^;*W"e47‡Q
y…i9†%M…ru„l‚‚Z‚Ÿ
|‡kM
‚kz‡‡_zODN90 v-ž_x‡MX‡e%Q.¾‚E‡l k      JB|
‚
"|—9‡‚^,
‚F&†MiN=…QnO#?5—;O‚&0suckƒƒ9d™45den‚-li‚˜K…Wˆ%•ÒKooku˜H‚3f‚•Dffer‚±8îf•ñ‚‚‰bic‚L¾‡P”ÝP®kgi©y
—pF‡d†l.
„7¢g
‹P  ŠP‡G•LW†R…Kƒ~‚a%›G«‰ƒ^‚Š§@ÜïiŸ
ˆW
‚düx‰YW†R„=®0
a‚¡ƒüK¤„hKí23¯‚x
…‹!
‚H“u       
‚zV†(¦V‹/†nŒkŠ<^nm

†Jr       ª< 1‡rÅ@|§]1!ƒz„zŽ÷.Ƴ'‚çDCÃO”5<XQÎ0‡DÆ-
 H@®})|.
C!R=gar‚†~ünggest†
©wŽ&„(‹TÜ5‰
§7‰ZŠK\@1‚ƒÏ~šV†'3³       8š*Ž='R‰N‘
‚Œ,“O‡*‘`@„Žþ^¾„>»$ga9u»=õÓ:¾:Ÿ†YÝW'R®®[—‚®}Æ@itsL %z†ë0… *…Ms
PÜkHƒŠH……7o^‚ƒ6„w!324Ov…„,"3]h    ”(     ^]‚->„ahAË“2t‰Q"_Œ
…    
    q‚{‰-…[!…'Žþýôq‡hNƒ‚0‚&"6Ng!24OvEQ"3Eeƒì
]        ®„Æ-Qò
„|t!Õ„'abl-3ewƒ`fö$‚b/  ¸t
©E#”=–!Šü…ŒWh„“nÝ^_Ë„m
…;i<”- ‚       4[FˆX|
ØO z±}Šx^ˆG¥
‰c"À}
ê\Ž;     |ÎÄŸA
ŠEÕ°2§    ¾
”0s‚™‚¾=
a‚Ø2_i‚U
¨”å>
„iint‚U¥!6\G#O(”å>z!6\G#O(fin‚U
¦nL”å>
ƒVLinvers‚U¦%”å>ƒ
step‚U¥@y”å>‚(yvalu‚U
§+”å>
ƒx+mar#‚7‰';Æ(–¸ar’‡dµ/Õ
¦$¶±ZŸ;ŒpUÃ‚‘@—7A„pOÞifTA
ƒ<ˆ`‹ŠCV•]     #
P·?‡Q‰„¬F     ‰ˆ     Œª2…J„RIƒ*ªT”gœ‰Zƒ`„Z%‚E‚DÂÈ'
¥iB—9<žaQ‡g‡n§Æ!Ÿ!%*TÕí1¾:Ÿ#”=—6Æ$a—D—4”ƒ@‚W„Z%‡dÝ^Îndai‚W†3ni‚ƒ%p1‚
#lV†G  #

2‘·+

#l…Ÿp†G        #
ŒP2‚…i…Vh†m–×-†m‹&
#$p{‚\‚H*ƒG
""ŸV˜€€€ƒC¿0Á0sup3‚t†u      –×-†u       erƒ68 :…F  4,
/#B X‡. c!>‚&8

4„ @$‡[6&eˆ   %-AM-‚3    “Øn!       4,
/

#    B Ã
%-A
-‚3        ced 
½5/ùa
“/lasssQ_'2‹‚u
í(W‚u
flu‚®W‚
fù„.ior‚„%”3—ë
sed‚—g     +‘‰t‚Ù=ü>vis‚‡]plement‚Œ2/.Ñ=ì#‚/…Ÿd‚ï9ari‚ÁHù—i
‚Mr!)#L
ƒ0 „q
ƒ^
Œ
ƒ"       Z‚5‚O$Žu˜K Œ?‚k„ ‡²Xœ(®        K“MC6
‰-‰'œ99C       ‚8I¼u„>z!
‡|
ˆ?¡r¢#+
ˆhO•Y†g„œO¶`„8¬†4¡hÒa‚i‘<ƒ
‰W$Žþ‚3¾HI-‚/‚kƒ¾iO
\K}Cü‚;
‚p
‹zCƒ†=Ö„J}4§
O»@„^%F¦NÎ6mž`  RŸƒ
—7"ortƒ„/‚@I;‚Lw
/Oyˆw‚`
s;‚a
ƒ&A"s^‰‰9…Y\=™„C
U*    y"(@"OŽ   
’ˆ8.       ‚Iˆb‚Wx\
~…:8•y‡ƒ>qV5ƒIƒB¬6gƒ)3º0
„0j‚^‚‚M{<h-‰‡‚ˆJƒ~PˆŠ,     ‚+ˆ1„~“$‰‘E®*r     
‰‚ƒu‡ƒNƒ…C[†5TqY.x&KS%+uƒ@‚^®>‰‚IxP L7‚<WC‚<‡     N‚;…BI–g1?*‚ƒw!1‚s9„,ƒDR+ˆ'g
:8=O]1%~F9=pƒcK‚L_..^ƒƒ     e…b6†+2…C2!      Îb‚„z,‚?4
„&#:‚0>ON
2       6ƒuŠZƒ3‚(iWƒ#—Es…C„W„Oƒ}f8=‚u0‚ƒ„Z‚„…r1ˆ=}–P6'…|‡w
u…j…b‘.„E
…/ƒ‡ Ž
ƒ—#‘3FƒJŠ,††g…dƒ!?‹uA9ˆ‡k‚0'?†(ŠK„|l5‚e4f^‚do‚6c5kk,„h#‚&‡ƒz„„e…3„=Š
‚2"m‰i‚      œ3(F†ˆºƒ1G%
d(…X’g    ŠH$†ŽUŽ|ˆR˜#
6ˆ‰;†˜H$‚S„
Š2&ÕO†|’"^62ƒ- µ‚9†
)R‹!‚Gƒ!:Ÿ6Œ\†'d2†
kƒ1…
     _7„>¿yŽŠ7Œ„‰(      6ƒS0LkŽöv

V
‡_‡dz®t]‡o]H
      V5"ƒ†ƒ)3ƒ‡j‡%Ÿ s
SC
8Pƒ8Y    kˆ1'Tv$<‡>,‡jƬs‡mM‚`5L„]‰6E1?*‚ƒw!1‚s9„,ƒDRH†r'g
:8=O]1%~F9=p‚K>‡g
3
_.ŸÎ
6,
b$‡g
4#õ{®nc§ƒ
‡`
4'‚&P"¦[aÕxo,A‡!‡m
#
FLk—&Ie—9P—‚3Ÿm3(„&T]oG§
(‡bK …K†"\I¦>"!t‡e®p’"K62   ‡z4kR@.Ÿ

‚Z‡S<‡;C1
g     _0%f:žxG, 
s
„tŽy;
B>Œ|^Ž,
 Y78„5
ƒ‹L°dƒ`‚'‚……g
Ooƒ…H[
‘S;-¢^#"ƒ;c„q‚j†LŠ;›rŒa’‚& Xˆxˆ0Žnˆ~…ƒ4„‹„…%¨y4‰
„"(Ò"
ˆ.5?Žþ<
„4^„{78‡T+å
‡†;ò—‚§o§4

        ‡3üQG"
R‡`Ÿ$]Q¶Z2—2= X‡……:*:B5—-í29%7ƒy“s
""ŸV˜€€€ƒD¿0 '—Ïb
.Ío\0supposedli‚l‚œ
ress
:wgp?¢%¿rR°Y!!9"§Â‚z‚@ì$@p?—•I…€Y„!!9"Òƒ1¯‚7reŠ?#@.,1
1Š„    nƒ ÄŠS?…"n
,‡h‚U`‚:“3‚Œ)1@aƒB†V›&ˆYˆY!„{‚ˆPŸG†3„Š_Ž-iA†_¥/
ˆ]
Ž1!‚
Ž\]±!Žƒ,‚…x&U†‚®x¯JR#œ?‚Q@'  J1
.a@®Pc‚‘‚?†w;›{4—;Æ0
E
ù‚ŸE]–g}§1fac‚!
˜Am ~±
C6{%‚‚
„„8‚2ÍEn“Èuxƒ¾3
26‚ÀQnmis‚¡namv’\€
;\plu„s«)§@±~–×:.”qVris„(‘x
„}' “|¶       ,¤
 G
‚'ÒvingliŽPj
˜Y‹t½„*†”P3repti‚N“ª‚
    ti‚A
‡9“Ém9og‚‚t?
S‚R–˜uN=und
m„4;®(,ŽT       
Ÿ  ˜lÎK‰bƒ&½*
„0;<,ËBƒÜ5wƒ†Sviv‚
“fZ(”Tƒ<«rˆ;‡U
“6;ÐJ‚(ƒ!‘Ÿk‚¸H"ƒCœ
|õ";턦NTor‚y
”x–þ6
se‚Ë*pectˆj…O‰I‘U‚5
†\Ì|ƒFƒd˜_
‚     ’ú[ÎB|yƒóƒ{ÎundW
(ƒO*—       (J5–8òyUÅ<
ƒK*   W(J5…Þ/JiciƒÒ(—Ì_4tain‚‘ _
Azuki‚.?ƒ.v‚…L“ÿ{Kg‚žR*=ˆH+7ƒ`”—.;+7Y`wap|?‰‡5Œ%ˆ.ÜJWü…ŸpFƒžKrmvtab‚HT.S)"2,
q     JW*-[7-($!He.„j“ÿ/&.S)"2,qJ5[7-$!H.„Â
ƒjift‚‚“š@Gtch…Q˜oˆX<ŒI;zƒ7t²

¡w‚Mƒ6ª5›s½'‡L
ŒŽƒqŸ     ûk;í):‡=z‡‚R‡6l_
ƒ–_¾?%®‚HÎDý
60o¦2‡e~‡k
‚¾C)ƒG¾ƒkym‚ˆ™P£…c…¯ubian‚c4ˆb>
*0w‚ 
!
Ø`Í,o‚y_)–þ1
)ol$ŠFY%‚       5PU„P
‹L

„<ö-a%‰&„7‡+       …!T…wÍ^”Bˆzƒ2ƒƒ-Õ        V

ˆ
‚+ˆKŽ.Ž-²4
®'
WŽþg
H
¾>Z¾„(Œüd"åJ
Tí[ü\*ÒrxŸz2
ƒ-
zÝ+‚g‡jW{b®a
“LV
link‚
…t
£q
ƒV
ptomƒœ;˜šT[nc""g@Pƒ#2ŠLdX(Žbq…0SÝSŒ",
Ã>    °O’=       „Q§IˆFŽ‹1
G#…-‹Y(”eŽd©rpmG„„6/6.‘
9   7
k
k7Žöƒ_dHÕm8¯…Tpô*‡ jZâ*_í6[‚ 
‚?œ
5#®ƒW³[
!HrpwG®e
6”A8     
k
k7 _dataonliful)yDI#(?
›norm)wD;!#(›dir‚,‹‡h†~ron*
Caƒ2
‚P m$‚h#&.6™
Iƒ.„HŒ4$¨ˆC
M,‹ÞA      ‹]%ƒJ „ &
JŠ*¢B†}ÅJ   
/1=

0
†X'3"Q9•PA†`‚Žö|A
‚Pù|k‡i‚†\&.6òVío‚C
ƒ,Ãp%”A¦†};@       
/1=

0Œ?3"Q9¶c
A   -onym~,×e      YV5*H=<=¾†
,YV5*H=<=psitact†|†}‡6…tŽ
‚[NEüf„J…CŒTv„á0x0‚5…_‚2Dƒ.…C*.Dc›‡(ow,GNi"+†E„Ho‰Wt‚ A
8‚%K‚tˆ$†…‚i:A*’mV,…;‡gƒ†~%‚Hz|<‚97ƒ4‚8
‚‚V†˜-#Ôa
…:˜!‹G*ƒ(!%l)‚+ƒ<ŽŒS̃Fƒ_^Ž…*‚7œ:
>yf‘&N+‚"wƒ:]4I0fvlK,B$‚!:‚Zƒ
ƒ?U
""ŸV˜€€€ƒE¿0À/‚™Q`ˆ:¼ufV‡^ƒzŒrŽ\‚b¢^…gmŠ-Œ>„
™9    
ƒ\L‡6ˆU
D…?
‚&,¢1
ƒ%‹a„r½'‚57ƒ4-
'
‚‚P‚L
p
ƒf/‰V*
ƒ(

%l)‚‡`wÕŸ‡RƒFƒ_—1;õy
ü}*"”5¾‚DC[-$—0dUB(Q    Ÿ3—WƒYm‡`Zz(—-  ‡b

L7Ÿ!SM-Ÿ
‚&,0synthes‚fŽ#C•êLCsapi‚Û?"9rùf"9rcall01‚y
ˆq–þ3
‚W_ptrElog‚A‘¨Frrootƒ•B—ãs
)tem
‡~
–D£C…u*>‚B
ƒ|+2#x+(…6u"
#‚ Œ|ˆ~
!‚NV     ‡v„  ‚ƒ=ƒ‡o+šC‹~;
/ƒA
x)
08&
7†O8§VÎKƒ[‰m
FŠh
    T‚KFƒˆ$‚6…1&…,K†\‘8‡,…c†´=Š0…f”5
\‚/‰`6,juEU„3UU`ItFVHyAZiN    n…@ef1m>˜ctU>ƒ|Ym†=/0‡6„J|      ‚*„
‰†N‚gKw:†
‚DP!MŽx6F‚6sMs1z
)oƒ&
J6Œ… ƒ~GFƒ/
‰L
`ƒt)6'‚C‡I4ƒi,ƒYg‡3„E„.…p‡tƒ8
3%‚
C$
‚   e‚
*„SR‚
9z?v„h`<2~eW2cVƒCkQ’EŠ …/Udz-†7„-!8…$e‚Y.w‚‚^2QƒW        #[!]x†/‚kƒqLŠf+ƒ2‚0‚a^7PT5'8|    '*=28?
T‚*pK‚…+‰9
E8
‚;¦]4L—w‰2‡N‚.
         ‹tƒ8ˆr:o„?‚F&‡^
‰S    „3)
„Wƒ@,‚‚g‚F‡s†4Ln„YwV&+ ƒPƒ 6;zP(
‚z    ƒTy‚+&-‡g%“vM”~7†:„fƒx~ƒ-#IaJ‚    šdSc92”m‚>ŒOŠ6ƒ^K"…6•6†,t1ƒ‚(S‚#@ "…fŒr¤‚A…?%C‡X&5T‰#‰VŠY     ZƒQ)Ši‡<m‡f
“T! ‰ty6n*%ˆ"‘8O+G_,KH„'1‚~3‚K‚y‚L:‚P"/
AŠ)AƒW;„:‰{U„

†B
–-#ˆe¿.d-ƒŠ)
L†Lƒ(„_^„3ƒ{pi9*ƒ*/1ƒt[‚Aq7‚ƒO
†$AVŽös
m+-‡zM9‡[)J
3‡8IG‡ƒWƒd‡dA
LŸJ5~‡ZF‡dJi…u

 ˆG‚M¦h¶UD
'HH
 #—N
‡„[7f1m>ctU>ƒ|*1m†=/0‡6„J| „
‰†NKw/&PM6
E
s'z
‡G‡g‡h
6Ýa„i—77       ‚YS2cŸƒ"‡g ‡„!$e‚Y.?;
2?)!#[!]n>0A/^K

0a^7P5)    'B08?
r
¾
J‡_
¶8‡<.‡ƒELe^‡(      K})
\‚.Ju
V‡[  x6;z"(l   ‡%r—‚        %‡†B<LJ
„:1‚BŸ|Ÿ !IaJ      M‡$—!)9W        )K"@
6¦Im<‡e
?%C
G&-K®oƒbŠY ZƒQ)O
I`‡j„>
a! @y6
c*%   !       
—IH‚'1
3
‚yO‡b
P"/
AAK;G#U
Q

„5
RD#…Oi?-IC^B
p89-y;[
¦iƒO_errno`func‚q“ª0zT…H6 (R÷•y
n?E‰QK!™vƒ\„„&¬GLV zM&™]ƒC'($
Ó|0½‚»
„{„e
=E[K!„É>‚q„r
L-
4MŸdƒ*'(
_$g
‚P0bufƒ‘53g—ë[
A3gextraf‚m‚osfilE+„'gŠUI„j†{‰pagef‚S‚2t”G„F—m?
(†8 %
D)
~&
        ‡uW
 
”FR‘K‘F=-(/&Ú\¯/—$K‚kÂ+‘-–<Š:…h!„Œy‹E†/ƒ:‚˜_ƒ`˜B
7
µ3
“Ÿ4;=„0ƒ
•[f
""ŸV˜€€€ƒF¿0Œ‰

       Cˆ/‚ˆ2‘<6ŽU„^„B#E•0k„`(-„2«7Œl”s3Žþ4R¶\=-(/&ˆ  ‚e

ˆ‡:
$K4—-]T     —:
í‚S‡k.¾`âJ»Æ(
ƒ¶Z‡Y;=r—0

       C{ŸiýG¶]R70t0w‚F‚A&~”å4‚<&~1‚Ž–þƒ12‚Ž–þƒ83‚Ž#–þƒB4‚Ž+–þƒJ5‚ŽE–þƒd6‚Ža–þ„7‚Ž2–þƒQ8‚Ž;–þƒZ9‚ŽL–þƒk1

   
‚I(¨N"
†RJ…|2


SWYy)n„u
Š%w0ƒZ*(8%)(#ˆT$# šk†[ï'‡„h‚l…Sw^ÁR        
mv_‘/, Y      Š*Q‚Sw*
‡0    ƒiƒ"
        *
wk[A‚!‚
u
U‚A$
W2†`                                                        0„(
{2‚T‡
ƒB‡‚K&ƒ„W@
0…‡ 

‚vpQM$‚RD„';ƒ     >°
Š@
XƒY]ƒc
$Q
…Tn‡X„~ @
      9      2%0@     _      kFA DgÂ`
ˆµ
4"0*(8%)(#$5$#‡crn'‡Jƒ‚l
%w¶`‰
        
mv_$3, Y           
>QT<*Ý    âD[2®#[‡e
s
UŒP‚?$—_WÎ
2‚L„l‚u8‡‚:—1H@í+iD
/;C‡s{
a
X&]
$H
— ®nÕx8j     @
      9      2%0@     *   kFA 'gíL>0‚ŽV–þƒu1‚Žk–þ„
2‚Žv–þ„3‚–þ„4‚–þ„45‚–þ„>6‚ –þ„(7‚(–þ„G8‚1–þ„P9‚:–þ„Y_ft‚Ý}/Gü…~/Greal‚Ýq1;ü…r1;bc‚5‚.!K/)2’ëV0!K/"2
<2¨O*
†f•"!k$Ù9
z4‚o‚h

C"‚F:"-%(ƒr‚F
ž!zw"ƒ


R‡
y

j
V



B

R\MN@8° ŠFA/ƒ?/7ƒr
‡<†Z&/H 
     ;‚KU@aˆ

Å       
'!k¶f$9
z4‚oÚM

C”9H:"-(=”‚DåP‡zw—3

Tõ"} fA/-/7
ƒF&/j      
     4‚KU,a0‚C–þ„b1‚W–þ„v2‚L–þ„k3‚`–þ„4‚s–þ…5‚i–þ6‚–þ…#7‚|–þ…8‚–þ…59‚–þ…-_ai‚ß]ü‡^u‚ßGü‡Hbd‚ß7ü‡8u‚ß'ü‡(xy‚‚n‘× 3¨S8q,Ù&H!JD*‚nO§a:
ˆ     ‹Äk%ŒyŠûo,'H!JD*‚n„é„I:Œ_%œ
0‚–þ…=1‚2–þ…Q2‚&–þ…E3‚F–þ…e4‚=–þ…\5‚Q–þ…p6‚q–þ†9‚e–þ†4ƒŠ

0‚Z–þ…y1‚‘–þ†32‚y–þ†3‚‘–þ†!4‚‘–þ†*5‚‘–þ†>6‚‘(–þ†Gab‚W‘Iˆ\#†*&AŽT
¸Nv›o¤+Qðu#Vâ@$   A‚¡üSNÚS    .
‚*ôrQ1Šu”s
†~†u1ŽE‹w 8™_¦;2‹A
.ƒžÒx  8õSÚ‚T=_real‚Ž_“ª2ˆ=;_™b ‹]‚m;…æV     3‚X„O”üm
#4‚X
„Y”ü-l
G‚$
1(         ".`Q        J
-    !               :K ƒR!
E'„4B+koH   1z   '$        
3Bx')     
7pe[c‚
('
vƒ(/!\”*f
( N
                
".

W L
Ab7     "4:H]       X=b2"$+
C]q
8„%     
#…!mD'–(

v„=j…4‚EN)E"      UGT"C
3     "

Lt>

"%Q3(
c09     ‚^†NZ4?‚G?ƒC+
    P
        $$&0(u$

 !
_97"3
!$
#`  
       
2(sv"O‘x< Š^      "
(     B\
OIo
v
\+‚‡j    .ƒ,
z)
""ŸV˜€€€ƒG¿0ÒY+  
[
…D-
2

3"%!.?1+ R     xƒo93/‚ &C
W
%      k\%\#CU$9
j&$"g."bW;
(
JX$ƒ%Om *6*‹_+%  *       
*"&2(… :MG  )‹dcRVREK%#!
I 0%      $_MA:W
 
rJ,     /J„(B "B
+HfxK`7
wB'
-&R            

Jg&.yK{
7+CK-4…m‰b+ !<        …‹<m‚ƒ}‹~‚g:ƒ\…!4=nT;‚%…B†rOQ‚"†
^  
%ZN…ƒ~‚    ‚G<g'\7
`„oA9iG
6,
2
2

=j)


-s

(
_N‚S@4 zn     
uAB„-+)1{ƒH      …iv     !2$. %,s2ƒ7-=         




       

,>
! RT

       
0&‚wVl„c‚*}LI#)(

    z   o'=Teƒf‚Dk6‚Y
,
   
       #       

 0&($7       x=2

    
       +       
        "
?\

0w"[322ƒz6)&  C0_!Q‚V‡r1Œ64ˆG
‚H"‚E==dM<    pBK
*-„2=:OƒeU‚n‚UfC‚8†, u)-!a8‚CƒA„      ‚
<\;GƒG]a]†Kƒ ‚7n$>y#/"?%j"‚g$        Ž.ˆ      ( 'H=B     $     A      
!     Z

"Q2"2F0E0X?,"        tW

      $
N'[73FI‚*3i.7ƒ:†c  >}N\G3j$y"„"‚f!$''J7=(#
              7!>!V
!%
B  1:l8+V=cW&

        
Si'o
!      "O!



      
e;6"Z    1 aF&+.Pij62K
$MR#?W?‚%  ƒU9
A
V@lƒ:7 



f5IR  

     
"(0      P{G‚13 J‚TD})‚r‚Sg‚
"
A‚Q1hT"QŽ^hƒU.\:
 V(      ƒ<†Z‚]*„*$+„=iy'ˆbND  p(BfEX_XX_XX^W[[[XX_XhunhtgqqnX_XX_XX_XV\UYVhtgqqqqqqnXXq            3,ne6bg        !.…#         XP‚>ƒ4=<S       &‚}"‚JQ„b0      d
>       

*H4
C
/5VžC  ŠƒX
‰-‚3    $/^‰G
e„n†c
zz\` 3C*
,zA+„mx 
d#O  *       
f
!
BŽ8‹KŽFƒs‹h†           ‚/;‹5\4,.s=
l…     
        



                …q!†c2@% 

%

N        

zƒ!‡x‚i‚B„6ƒwu#‚C
,Lb>,O{$…xi#?  
/ƒ<y…DK†"Fc(
‚s‚Eƒ%       #†]
l†h‘ *
v‚) fB=       n      n19#2
'
#&%        "              !
       5
%

           #      0!'@ ]')   
!‚‚y       
nB1,6
       

M!-
       "+
4;
:
-O,%   wh^*` >†Tw‚+8    /]ƒ`Yƒ6ˆU„H0„B1H#=‚T!ƒ;j/#‚
ƒ[)9jo(
                       0\27W12d$RQ„u;(.<=d
‚‚(‚P„
j…S7&† \
d
"      =1\v2"W,e#ud$‡fP‰L
)„Oy
q~,ƒ<  5'|% lx‡‚:>:

b‚J.        / 7;hƒ ‚7 ‚5
xOG0
$'NInƒ6k/‚LP$,       2 ‚ŒQ


     .5#/*V‚_
o'+^ƒ_u*g

 [dƒ(*,i…
Œˆ&        ‰>x‚‡…(e„@‚xP‰z
F4ˆ3ˆDƒ}‚H‚ƒw7‰E„!†Zq‚
 ƒ5Fƒ'‚
6"$r&ŠI!&R…J (@Ž     g
 @M=‡2.1@   Q($        
,%8„nZ    
ˆE/\C‚17
lƒƒa‚7}ƒ-…w&‚s‚'‚-$L7F8;
‚T7 '
   : 
;&<d"4&1


ƒ53%0G'-     !
#$$I$,
1n_(W/‚3
%VT_"2#-x1#

$<9&h#+4}"@ˆF‰r†5ƒ@               *;ˆ ƒD),=(jP‚‚*I'@
>A<$=-pv%‚x‚ƒ1$A7
'6<‚!%D ?
)‚8

 q…T    
   %                  /

                               


!
     "     %#33%2N7.'

     %       
""ŸV˜€€€ƒH¿0íÒ71,6(!    
tI2   
5$8^   "FQ
nƒ&%lI;8[Ar &81
7)G8/^'
‚71     S8S;Ql`   #?L"!&
vGD%q

%]v- 6//2
+[
               


    
      !‚i./
YB-.
.[P*<O*&(!N>5cJ
|0ˆ&a ‡I/†(Fn~Oj=6‹!
Te[O      M‚q*#<D*
d8
                      …[L@K&‚!ƒk22…l`’;'0‚#ƒ759, H=|.ˆ      
""‚cƒ?‚"
‚}…ƒ)„uN3
        6


.:
$<‚bˆ*…^>ˆ17&‚)‚W
EN
‚z„g‚i(      8(    l;>,&@_
*$;
dƒ3}g7†
‚<N        G

5


>e‚L„'   +E‰;DLv‘IOƒqo…6Ne(„z‚00‚S#ƒ –G

!=%F    Žx*‚^0‹(`/$

Š$%
a3$O.5 
*“Y¤m 8 e16Ž75:$fl
"ŒƒS
‚
   „      YŠS‚)„.Aƒjƒ|‚'k    
0

+sqA‡"9‚"Tr8„;5
r      
14P!+1u%;*6ˆ4M,. 1Q3‚d„W(še’!l„ƒP‹C$Š7J|{ %     


  I
( ‚%„J.C"
†1A4ƒH
‚!
!
    
(^
$!'


N
) O-    

5

>e!#95
        

          
#@F ])t!1!n3#%)ˆ]#@,5Rƒe62oH,A    t_N2<b


%:0
8 C,/>‚X/O„}_$+9)ƒD|Žþ[,0%       $MA:" 
rJ,        /J„(*  "B
HxK`2"

wB'
-&G:             

Jg&.
K       7+CK-—x*
=
T3o
Q4‡U0^     
%ZN!
‚ <g'77
`ƒ-N|09i
6,
02

=j2)


-j

(
N@4 
,n*
AB+)\
    ‚v !:E$. %,s2ƒ7-=      




       

,>
! R8J

   

/&w"V„B‚*}I#)$

    
     m'/
@ƒf‡)@k6E"F
,
   
       #       

00&($7   x=2

P
     
       +       
        "
? Q

0i"[
l2‡       !& 
-0!M
,1‚L4ˆG
‚H"‚E==dM<    pBK
*-„2=:OƒeU‚n‚UfC‚8†, u)-!a8‚CƒA„      ‚
<\;GƒG]a]†Kƒ ‚7n$>y#/"?%jJ$      
B$
      'H5@      $     A      
!     Z

8"Q2"2F020X?,"    tW(     

      $
'.73FI‚*3i.7
s]    >}NJG3j$>"„"NF!$''J7=(#
          7!>!T
!%
B  1:l8+0V=cW&

        
Bi'
&
"Ov



      
e;6"Z    1 aF4
.
`P
9

2K
$"R#?W?2"        ƒU9
A
V@="7  



f5Ij    

     
"(0      P{GM   J‚T[}
H)0s‚Sg‚
"
A‚Q1hT‡Q‚a
hU‡R
0:
 V
((    
ƒ<—8?*„*®m^(BfEX_XX_XX^W[[[XX_XhunhtgqqnX_XX_XX_XV\UYVhtgqqqqqqnXXq             3,ne6bg        !‡ƒ
               X7J=<S     E        


!H(
C
/5Q’C ‡&bƒX
‰-‚3    $/^ ƒ9
e„n†c
Q     o‡Z‡k7†         ‚/;Ÿ%
\Ÿ

%
§
#     #)‡i¶WM
B
        n‡fa92
'—5%     ".    !    F             5
%

           #       !
""ŸV˜€€€ƒI¿0¿'’õq2 ]')         
‡g
17    
G‡e1
,F
       

M!-
2"+
4;
:$
-O,%§e *`        Ÿƒ[N)9‡g(o(
                       0;27W12]$R7‚0=(.<d
e

b‡[)Ÿ
‡fB
"        =1v)"1L#uU
JR‡j    5|%     @N
=
:

®q
xO
0
$
N*@k)‚LP,        2 y&


     .#/*‡U
3'+^
u*F

 [d(‡^|,G‡   „H—b)' 6"$r&‚T     g
 @M=^ 2.1¶M
7
1E
_7}ƒ‚z&‚s;
$L~7F8;
‡~7h
 '
     : 
;&<d"4&1


b3%0G'-  !
#$$I$
1g_(W,‚3
%VT_"2#-x1F        #

$<9&
F#+Ir
F"@_H‡`
j5‚             *; ƒD)$jP‚‚*&.
>A$=-v.%‚31$Al
3
'6<%%  ?
()?8

 G‡N>        
   %.          /

              
2
!
"      "    8 %#33%2N7(
'

V     71,6(!      
        s"I2 
5$8"J      "FQ

nƒ&%l&I;8[Ar &(1
7)G8/5'      
‚7     S8L4Ql`4?L"!&
vGD%q

 ]v / 
+T
               


    
      !‡E
/
B-..[‡f$*<O!&(N>cJL[DQ
$a‡kh/‡\
n_
K
^=N*d
                     
LKX&H !ƒk22n`'0R#;59H, H
|." 
""‚‚"
"/

N&       
        6



.'
$žV8( ;>,&—6Y.
*$;
d93}g—5   G:

5


>e     S"†ƒS
‚
      „      YO3‡c&$‚5.Aƒ|‚'&3       
0

+sqA9]r8

;5
a   
14P!+1U%*6
Mj. 1Q3<
‚$1ƒN‡UD‡j


\$
j27J|{     %     


  I
( ‚%„J.C"
„4ƒH
‚
 
      
($
$!'



0
  O>  

5

>e
 #9@
        

          
(#@F ](t 1!n3:"%)&@#@5R—3L0H,A     t-N2N

T
%:0
8 C0table1–E}©*,&G
‹!2ƒ
‹!_column_metadataV)ŠUinfo‚Žn…E†~Éea‚.‹t“‚4‚÷?¾qŸ†~<a".list‚t†Êk–׆=xinfo‚Žq…R‡ÊZb“‚Tƒµ~Ÿ‡<xcoldef‚
-•hi‚‘Ú-nt‚›,lock‚’2óh݇AñJnam
„/h‹-rƒ/«F–W–Žþr!/†ú8ÞFô4s_us‚®_b0h+…ø„6…ýJ0h~Ë„valu‚¶1•ùQ
edfunc‚hµg&•ùj&x‚‘Ú)z‚
‘6ÚJ
^nam‚^l‚ular‚š6")W(B_R!
""ŸV˜€€€ƒJ¿0´ƒ]‚‚
‘h‘ýY…‚¾F
„0tacit‚ƒ•³g‚P‚ :
„=:³nì      ‡|   2
"”……6
’F
$™K      


.A
2;ˆj†(d-½ 
„9:sŸ×AÆ"…^  ƒ†V
ƒG"åC-‚³_$p        


.A
2;³Sb}id‚|‡F@>#7''''*'''''''''GN''''''''C'''''''#NZ7>'''''2X"™SM?‰j£|…(@>#7''''*'''''''''GN''''''''C'''''''#NZ7>'''''2…¯GxM?>list‚‡D£…&nam‚
‡X
™£
……¯G
typ‚hˆ&>#7''''*'''''''''GN''''''''C'''''''#NZ7>'''''X™]$£h…p&>#7''''*'''''''''GN''''''''C'''''''#NZ7>'''''…¯G‚$xref‚z‡}
"> :''''''''''''''GN''''''''C''''''' QZ7>'''''2X&™L
 J-‰_£z…_
"> :''''''''''''''GN''''''''C''''''' QZ7>'''''2…¯G"q
 J-_i1‚cœ=ƒ>ƒv•Ò`„b1Bil‚uŒ_¶^—Ì
_‚ForR‹     „keƒ     t‡!‚Z•6’x…L2“ƒUƒL‚…n…‰2Š…_[<-ƒ6„T
O‚2
{4U\‚H.ƒ=;J„[]C%)&t‚)y4S‰

L†ˆ~Ž[š" …YD‡,„t‰EŒ;‰Hm‰. z¡!ˆdÍG4–c ^ ‚2@ b‚5ˆh‚TŽj†=©_‘w„Ï_Œz³LŽ?‚zM††{ƒŒZ†Yƒ"ƒ$H‡m„!ŠB
cƒ-`ƒ/•Šz˜._ ‘EpC
-…
‡GCx‰Zˆ
…"„7‚yŠL‘,
ƒ„rƒ\‚Qx/ƒq3w‰      †
*ˆex…(‡   †*B†…3ˆNƒU…0ˆW†g“,ƒ{ˆ
LŠ-ˆK‚Z‚kh‚s‘C™6š`ƒF‹eƒ`†‚l
ž{”Bƒ&•EŽmI
7šCo[/‚"A‘:”•V‰‚…T‚       …tŠ‚   jDF

§9&‚
‹Fˆ0$‚z‘a’[‹gN‹s†)˜]ŽŸ$‚4‚(‘Q‚7„d‹2Šdƒv
…Q[Š“„'Žö    ‡ƒ§|„k‡l

X„Kžj4‚ ^ ‚2@ b‚5ˆh‚TŽj†=©_TH‡ƒ+‡>‡| '‡J)   M‚!‡‚B΂—6ar‡mƒ7ƒ/TN2
5_ Yg„K,C”ƒ§vq§
.3]Ÿr        ‡‚mi
$‡]@„}*?FvF
/žqJ§
Y1ƃmN~‡Õk      
‚|I‡[6Q[/?‡‚w„u  f‡„†aƒIC¾&$Ÿ   jDF
Ÿ ‡7†|
‡hyB®ˆ—L$
    h—#y‚y‡y‚®h
^‡QnƒŽN
–9\W")#„I*„#„†X
ø,X—9+3•eƒQ|‰ˆt‚>„‚!
=…(‰K†d”8²<ŸŠC„W
¶/C¦c–¹G‚uc†T*§=†#Ž;Ñ5u…p›g‡)Âg†&˜"eLšÑ3¬
³3B‰L¥aª^«j
ƒQŽþdiP‡‚"§kžyX‚k+3•eƒQ|‰ˆt‚>„‚!
=…(‰K†d”8Ÿ$I‡‚3ÕkyŸ
ŒCd
ŠV»>PÆ+~i®*ül‡‚8‡`c9®b"¶Y
‡—ƒ‡ƒ®Xg‡sReL§6Sìƒh‡q
zƒ3®t
$¦`lent‚ˆRŠk‚ˆ
‚%Š.        ~£aì,I#‡u  ’cì&ƒì&    ƒ-O”6.l‚‹T• ‘˜/#„Ù,er‚•"•ñ.n%Pƒ,gent%
„~ibl‚ƒXh%Rƒ5r‡}‰QSŽ^I·l½"h‚À,…ˆ<0IÆ6bal‡rx(ƒ,]<2. %p
ˆQ=!)h„ƒ2> Ž9$F½9]ÒLí/
]<. %‚¡
hí1[X>ú$Fget
„g      1z
Š5YX!+%…buƒ$“.
©K
‡er„?F* !#-C#-)D_'CSfQ,coE8}‚EC;‚Sƒ&ûh/
*
 n… Ƥ}5„‡EJˆ“iÆE‚03‚04XŒ§[‡57‹‰Kƒ3‰l2ƒd

¥67‚
EŽþW¾=P‡g)F       !-C#-)D"     'CSfQ,cME8}
dC;Tƒ—8&ç/
*
 —]‡".üe„J’‚BRƒÔX*57®‚;§W”:„2¶U
,L3&70"Œ„BX
B 
!!ŸW˜€€€ƒK¿2”(
—ÏF
O7ŸD0tash‚&lk‚}
”(
‹ˆ4F
f¡-!
ˆp5’<ƒl‰>UX„J-P¥t—u‡)$¶‡x‡MmŸCÎd‚ßH,‚hŸ3‡‚8®0œ§      Vught‚„L“šx‚
‡/b‚"d‚Ž0–°5Yl~¨gdÅ
¡†'A"Ñsw
‚)‚/‹l
%½2d¾9ŒD„ƒE9ƒüGV
u)
m/1#
ˆ_‹B{{h‚3<+

Œs<|A(LN4@f†"¯nÜVQ{{h‚3‡ï`(

 y<|A(LN4@
>cneoˆZ2ƒ‚L’Y—Ì‚I?_adª¾‚Iiª¾‚3uª4¾‚aname~
Eƒ
I8‚<Üt–[ÈAW’넺&6/§w¯@Wname‚´Ò²7ch“m€‚aikovski“r€‚l$
‹/U„a\5r     i%‡@z?>‚d…ƒƒ‚"-@„0„HI
†
„[$7‡ 
      ‡\4ÓM‰X#0*!b‚^i‚$‚ŽW^_”R    Œj’
x
‡!„,vƒOƒ…Nq
–
¥¼a
†
ƒ
"#…H6]-‚ƒW†0  ±I>j"„5
nƒ‚"„p#
fIw†c‰0œ
‚E…ƒW–+\5Õx
$7‡b

      Ý\§‚v#G!b‚^g}t"3%üt‚ïo[—,16]-‚UœqÕv
"5
n‚"„p#
fÎ
 †cŸ„¯-¦„2004‚í&_errorž@obj‚‹Bíkž>api‚Ýù‚lbridg‚sh‚Q‡\†`

Ók•Œ
2\òFÎ9qlite‚±RN
3‚Z‡T<ƒ•Œ;
T<‚Mvarƒ…˜Á„pw#ª1‡OdƒÌ5  —Ì[             ea‚Z
‡@>•ŒW>ch‚Œ   Šer‚g”H•ñxTm¦>5„I

'8  A‚z
YŠw„~„l%
‰
ƒ|–[

²1‰p
&-„d˜jƒ
ƒV\„
�

'ý     vDVƒÜC
&õ‚{â„_id„eŒ;[lea…/Œ%bibyt‚‘qch‚&$nic~lö‚‹"ù‘"Œ%zt&
Z!/]„q&6‚,ª„Š#(7†K>$ƒ8½s0®<r‡(ü‹§7t&‡h
!Ã*—‚qqu<
r4=?‰m
Ï^ES
A„f´‹…9†}„;„$ŒHj:‹"©b8‘t  †]    •Ek‡‚ŠŠ%î%
I‚~+–=§1
^‡ƒX¶ƒ^§>ƒåh;®W‚‘0c‡h]j:‡)8H„JÆÆ-‡^i¶LÃ(L!olog‚ŠFŒ?‚Q
‚*‚Œa”õ;diou‚u/ˆƒ?ðus†•
#il‚ˆ<l‚>
„bemetriyz—1phon‚‚j†i
‚*lvis‚Jl†z…`ˆCI‚¨IÈ
Z†-‹X
Ävª      ˆy†xH
E
ƒk    ¿_…RC¤+ˆZ¤[‚t$’I•/‡N¤™9‰r³G”D½³;L‡1ƒ-³@<”6ˆ"ü†Hü9—8b‚Eƒƒ¶!êvm‚¸Dü†Qp(G(&„P‚u +A „9
…# ,
<!)f(SE
5
H‚Z‹^†‚C„'IƒI*   ˆ¨dîqa!-  ¤4æ#Ægk’‡,ÓW®*.JW
t.„"Wk}kŒ$qŒd              
k
„1
…#
M„)H(ƒ‹]Šs
žo—
h
ƒK‰&ƒ4J
mƒ $—L[›:MË]T$‰X"7Ž-
(    s¯aa!-  ž{fæ#Ÿ&
ks¦…Õùxr.ŒP
J2+n}VÝb2¾9"      
Ý[

VÎ>
M
M$HJ
ƒ{
!
‚ƒs
Tže
]—O&‚M4
<
m—‚{§‚h>iM®ƒ\_db‚¢D
‘V‘‰Sirectori‚!{
žVÕE•›'V»s
mast‚Ìv—¥)'Ö.schema‚ŽO3Ìu#—¥&Ö-tor‚¨j/
…
W
w!g„[

7K
L‚A.+‚2…Q< 5
""ŸV˜€€€ƒL¿0½‰‚\:˜sN
 
 $‡"
ƒ("¦-øi…|/„¢v8H
    
 »‡?""Ã
o0temp_store_directoriRQJB<Î<F
žV ‡ÍUd!
0ù‰w„¢#V»‡?O!
0mean‚©
ù†eratur‚·@   
!
üx…M  
!
fil‚©5ù†Glat nÆXi;Šp‰"§7+"´O9’6‘~µ,*WN
…U   =‚ƒJ‚$
8
Z„Rðl‡‚Œ<í/9‚™‚— ®‚M§oË  UÆ%;_
J
$¶TX„evtab‚…(•ù6c‚È
„(orari    „Q-ƒV
m"…6ŠM’XT
Œ5&D  "|'
‹P
ƒL
…kLˆFA‚8'Fž‹1³"‰%™f‡r
›]
N…6£/‘1™Ž9!kƒQ
ŠL‘-x.‚0
ˆk—vƒ?†
†H&4&ŒlW2
 @3}R=nW97:U    !%! "!9)&
1^‰Y„
„*Ô,
i#Q
ƒˆE M‚‚{„@6Žv¬ƒI1‚4ƒF®Ye‘/
‰8      ,o‚%“,…l=„!        „ƒR/#º‘M¦„D†iŽ?¶X‚4'—A‰O‹1³"‰%™f‡rŸ…(üW
„Q
†‚×a
"
‚/-„`
‚;Æ F&4  &,W$
 @3}R=/W97:               &!%! "!9$#
1^‡W—4!¾?
Þ&
#¶ MdR—‚}TƒD      —2l
2‚m
]=J        ‚:</#®‚aƒ^ŸP
liŽ!‚‚òo„~˜,¶Ÿ•Ú‚&ýKô}ft‚"•>•ñJn‚ŒL‹Dƒtƒ6†Q”*(‰JS…¦Ž`ü'LZƒtƒ6»^„›-‚‘ƒyacƒ§]˜š‚d16DZx„ƒM
–>[…@Œt
‚‡f}ˆp±6
ˆP‚Xž@Žö|X‡ƒtí^‡ƒ2”õ
(„6ò
ÝgW‡‡6—‚‚‰Ÿ7ysion‚–m‘‰8mrabyt‚S5    cŽ4ƒkFW#
‚9/—ûp/mƒ       [ ‚mM'’T’7‘Rxqe
r6,[O
2‚mF…4*9F‰|‚[ƒL–r„`6(
_O        ›1Œl|l\/‡{Œ+W‚”Z
 2+ƒ‚‚S6E
„"… ^ ‚,Š^O£-£c…5‚x‰
„'"CL0†]Z>!KR3')    %       ,.     #xwd        )%_
3!
     U
Vƒ$  e
Q–S :(„0‹$‰
(‹T:(
6*-49" ’B)
4L+T†$
v

ƒ-
u=$ˆS¢ &…;.
†„x…&4‡ƒ*
‚41)WƒN‚‚9oH‚3‡|•R* -R‡w…C*ƒZ‚ 8…[„Ks„
e‚M„„Q.Š<:ƒRƒSF
EŒ\Ž`

¤P#0x…$‚_R‚3‚f†‹E"B„ ƒD\Šw‚Xƒ7•E/h‰>*4*Š,Y$#hKX‚3  1-k~H…d Q†2Œf0%…t
„0<Š=^jŸ†5‚M¡n    Šw½„]+
GÅ_.>VykF
êe
)CƒkŽþb}[O*2
‚EF„*9F§        g0H
‚o‡V$2(
_O   #|l[
8/S   .6W‚.‚k
      2+
Z‚S6&
*"… ^ -   ƒzžf/-£c…Ÿ
4
D*ƒ‚.'"CL0‚bI>!KR3')    %       ,.     #5wd    )%_
38!
  U
0$   e
Q"‚S :(ƒJƒ5
(:(
6*-49" (ƒEB)
4L+T
 K


u=$ˆS‡I‡' ;.—8
ƒw¶W"Ÿ!‰_* `‡6…CÝYhöX    9G
F
E        '„#@
s#
>R
Y3f¶X/¶TZƒ4*‡ˆr—8#hK‚  -k~…d Qp0%
ƒk<ƒmj‡;5‚MƒCÝo,¶.If‚¶~
;in‰(Œ"     
[d„++Q+G

saƒ+)
aT
M%
ƒ1‰[
„d
`"gc;%  žÓ}…)”qÐ.“  ˆƒ<ƒ:34
Êjš?…lˆ‹‡Q
p%b#†v@eT5Ž
66ŸB˜€€€ƒM•%‚h‘qš%“„+„!‹”:ƒ,‚YÅ*æt‡TX7‡P1f¿W‡+³2„uµD~ˆ‚vž‚…JÐ.“  ˆœ†%Œƒ-ƒ&‡ ®B%Qqf¶…”0#T‡d

X7)1"®O.ƒ(0terminolog‚d
'ˆ•Ú=&‡
rif‚ª]•Òd
s‚‘¨Est
‚+„AˆYi       Ž99Y
Ž
†0
‚R‰Pˆv @”.†ygJƒ       $–—y±ƒ²$¶
ˆ[!/…M‘dë/•7   Xˆ"C
‹6
$g„„
{$OtÅ:-
„5„5
      
   

6H)  
<Q2>%M  !"1$:$7US
)BHr@)‚K$.H"$e4&N
%V%%7D0,(    <A=$^Z?                C
247Gw
8‚CX             wQ'5
e"E'
&1     +*00H55ycO"“|*
!†D@´g‘]
„,*]]‚#4„Y

/

‹1:–x‚-†ƒI„V
Ž&†_c‚!…c1’„L
‡|R"ƒ)„S¼\ #<B‚?Šn    $C
!r‚XFJš^‚Bªˆ‡'‚‹&kƒC„ˆƒl+‰uŒU3.      %ƒ(#mƒ9Y‚kƒ=‚z…;6‹H…S\=-

      s"&    (U‹HQ,4Vƒ
       1-&> (mAPd.
      d;/RfZ"Y"Y]&_G!;0J
q…I‚6„J,
O'‡,Š*<!’.ŸF>“Šg‚a!l„yZ‡7ÄF5
¡z~‚
/#
!K'      

        
39h(9
B=S?
'




"HU9         

;f
Š)–
-q›u°Z×3B‰+’š0(
5‚+     $Bx‚>K7g#+9&Yr)…|hF„2!: !H…J]†6†d…%MPPL2ig
…&ƒJŽö„y‡j—0-J‚§‚p‡ƒ—AV¶
ˆ[!/T5        X‡O
[Cí1
(‡_M\ƒ:-
/ƒE5 
h       
   

6H)  
<P2>"M       !"1*:$7
)BHP)$.0H"e%6 V%%3D0,<A=^.?              C$247Gw8nX           k&5
P"D'
&      +*0l5ü^
:ÎM—:z‚o'‡i
‚[&—8     c®jLQG„S' #<¦`‚=Ö
d‚BM(M5\=-

          \ f®dƒFQ,I
O‚u
1-&1 (mAPŸ a1„J,ŸJ…|<!i‡<¶„_—/
C!.I‡75žg&‡g
/#
!.'  
8
        
39h(9`
B=S?
'




"HU
     
"
;U
Æ"8‡„
‚$'
—":"K7g#+9&Y
a)‚#|a
‡b6!: !Hs]‚fŸ#jPPI
¦„&1ƒ<…U#

           

‚`    —ãd:xU#

           Î
E    
_addoptracƒ

‚X$
breakpointƒ

„.)controlÖz O’{…H       B<kvŠø’5s
â)>       B<k'„á„s
database_1‚…8emovf‚ˆX•£sVfile_1ƒ
œ;
—Ì]
journ‚‹>•£ƒ<  multiplex‚Š*•£‚(onefil‚Š{•£‚yquota‚‰/•£-realloc_stress‚ŽO–þƒnsqllog5B¼X""ùa’/""vf‚Œ-•£„strac‚‡a•£rCabl‚×8ù’scas‚,šA†?"      "( 0&G')„8…$†Hƒ‘ˆOR"
"     "( 0„ª@ )8„T‚™5ƒtrlƒŠ—Ì„o      _alwaiq P‘‰tssertq

benign_malloc_hookq
itvec_testqyteordq
explain_stmtqtra_schema_checkq
fault_instalqirstq
impostqD†%’ëX      %
nternal_functqsinitqkeywordq
lastq"ocaltime_faultqgestq!

never_corruptqo!•5Te!~



""ŸV˜€€€ƒN¿0¼0testctrl_once_reset_thresholdqptimq
³I‘‰L
parser_coveragq
ending_bytq          rng_resetqtorqsavqeq
reservqult_intrq

scratchmallocq     eek_countq
orter_mmapq
        traceflagqunq 
vdbe_coveragqdbz…w† er‚ƒg7‘‰‚Y;
ingcoverag‚…h•³<releas‚…i•³<[prog1‚y†fK–þ3
LKxt„"
‡+„|Šz‡0„ƒ_F,†n„‚nN%T;oˆLŒcr†.…L"„q‚LˆCUU&F„+ƒ3^‚k       
 (
D>#ƒ/
%
m.DK‚U‚nT&j<d+7‚q'\;„0
+   #GDgU u
((.61&(Br" 
7"+…c_n()…g„5‹ZJ9p‚+   E„l4†„:OŽv91ƒ-……tAƒUŠ*0r!f‚$‚rb>‚'‚&%
 &1:
-\,E‚P„V\‚".KRJ/‚8‚N‡Uˆ{w'‰/1KA3Xk„a'‚/B<,$)4ƒV,
>")‚0n&HP@d2)%%„O%0!K)„c
IO9?ol31ƒƒB‚x‚;‡kV …Y’N†-‚%…^]&ˆƒa$„m\
S"/7(œV†‹'–CƒƒV0+Mle!,(TE‡X7|.‚j*)G F       g|jD s
"   M(‚%‚h)‚[ˆklƒM„z`     Min"C
P
#-      #b?;-
c†wjƒFRKYƒ
‚6+„=m?ƒ/‚H;|>VAHˆ=‡v*Sh‚Š+"‚%‚$$S†…/!'k…b‚#ƒddY+     Pj‚
‚‚K
`‚BM‚'„5        ‚A$
Bo‡7†-42²p‚ƒ?ŒF>U„[3B
p   

+       Q       *7%Iƒ2,•+4‡(‘H[8‹ƒ;”B’‚z†‚`‚p
Z‚ˆ)R:Y4…†Vl:/F‡j”fL‚
pQ‰D
‚'#
ƒ„‚rl‡#)0|R‚„Ju   +
‚8¦G4{‚=d!!‡a6      ln'‚B
†1$o/k-‚*…fYˆ}ˆ_„`

(„‚G63     ž0Ž&…
@‡>5T”X&U„/„8‚t
‚‰K…4ˆ.‚(ˆJ„;‚
EŽ^¢r8\ 8‡(‰x  iƒ" …o      l      …$f./+‚"„
‰‡"ˆ*‹Z
ˆ"‚=…<S“¢…?Ži„3{0;…%*0=>$3\
c
2ƒE&†      ??„ ‚]">:…~‚3‚7ƒfU†Z+D[ƒZSš„/ž\†&G
j,R‡K5!‚   (O"„1×

°?5‚1~Hn#…ˆ‚]U‚"„sV|WA ;CJ†ƒ{O:†;‹-4†w
„0a@†4Œo?£ƒN‚7‹-;‚        (Oˆ;‹Y‡c"‚d
‚c
‚6‰"k*‚/‚
'2<0$7aŽþ['7=
‚0pH‚)  E‡n
6J?
‚ JG!# 6$
<
>8'&%
 
1:
- \,E5\‡U.KRJ/‚8
 '
R1A3XfTa'f<
(,$4
,
"‚0&HPd2)%
%!#      z
IO9?Qol31ƒ%‚x‚;kV 
5v%
ƒ3]‡,
P
‚$%\
S"/7—<(†‹'–CƒƒVG)7l!(T
P7|‡]N‡g*)       F       &[ƒjDN s
"     M(‚%$)ˆkl‚{z
        Min"F
P
#-      #b?;-
c†wjƒFR   KYƒ
+
_m?$J‚H;|>VAH
‚B*Sh‚5"‚$$S‚R!'
…b‚#ƒd‡@+        &z4*D
`W
#MP-  $
Bo>Ÿ
…®.2
²‡n
D6‡m/‡d‰84‡(…$[8‹ƒ;
)T=‡^a‡h
k‚‡‡Y

%‚T:Y-Ÿ:-¾J
Op‡g'—)#‡‡i6*‡ex)0|R§
‚S     +§M‡4¦ 1—?!
e®
‚BQ%d
8
n‡[ ~‚§V‡‚E—@‡]"     8‡(
‡    
‚P    ƒb  l      BJ$)/+‚‡‚rC‚
H‡‚p
`S[
k‚r.CDO/;Ow0=>3M
c
RDU
C\$+D[`;}žu$`
j®n3‚  (OŸ3‚(‡fEn#‚E‚‚]U
L‚'WI);#             
!!ŸW˜€€€ƒO¿2ÃC—ÏFs*  O*       w-4'

p—#—b
?
ƒW7=;‚ (Oƒ)`}T§IP
c
—k0text1‚
€)ýc2‚
€:ýttext‚eí&flag~Ñe…#„¾]
^…#ƒgz~¾5
h“‚> .7‰D
_,†>‚y      ‚Y4R $M"
ƒ6Š_–&‰L¬@¿
‘„6ƒ
‚iOµG‰¢p'
†'
§5
Ó‰Q*,‰`Žþ^[ÝfX‰L¬@¿§C‚¸>c‚¨y„h%„¶K6'EËX‚Y*,1‚
†p
n
‚%£
„R
†Û.%3‚2‚ 
#ƒt‚$‚mv^_^‚!R
 ƒX+„W&
Ë   Š~_
"| 
?z/*))u‚"I8‚0…`VM*,I        %
‰<‘ˆ< 
#iW$ 5‚      Qƒj
‚‰@
z/*))‚"I‚0        VM*,      %
í…make‚y*Šr*)0„
%-–þ4(*)0„
%-privat‚y
Ž5–þ4
ƒT_th‚öFý
„hai_text‚ö@ý
„bnƒw‚=‚!i†Vƒi,„v<†‚;ˆ…5…f„…j„*……M„„ˆ.T„ud„XzD…‚ƒ@ƒ„   ƒf‡t…tŠSƒP„‹9v$†8ƒ%T‘Gy!kUPƒ!Qƒ    
‚/D?vDƒ)dMƒ>

-t&~z^w‚oƒO%.‚dk„zt
U
ƒL\6pt'       ,D…x)!GW7}‚z]Š(‚^‡#e„eƒs&†
@Œ-…u‚M<Š$‚,Y…!a
&ƒ%-;P"‚ZX0ˆ~-…t„-ƒƒD        „8„=‹}:+„@:#‚ ‘,†~†‚sU†o7‚‰o‡i„Ub
Š#…‰+        c†[ƒ_G†SƒJŠ/ oŒD1QŠ|ƒ8Ši;‚&     x„Zv}…U}'@ƒ"J‚‰‚AO„
a‰„b„z™CP‚Œ       †ƒD‚Fl*8#„‚83      ‚i<…X‡t|Œd‡yPD rP‰Rƒ4rƒ}?3g„'@†'“=G2D&,†ƒˆ}rQ…
‚Y…KƒLa‹lM?/,$u‰.8‚u
‹Q$H•HCˆ2ƒjP‚lƒ>‚ƒ>L‚#”ƒ|„4
…1‡

ƒ46…H‚    ‚†abƒ`ƒ1…=ƒ:ƒt‚‚k'†…       „J…R0R$}„6†8†kd[ƒ]q‚/„0£„h*ƒ
‡†bY*…:kƒ5‚„}‚7†9hˆ…#„‚A„P&OCƒ5rI5„6Dn     „/      ƒ      ‰b‡&'8†W
y>
ƒ~X       „T‚„&‚xƒP‚ ^EƒVW‚((F6ˆ
‘@‚Du3
V.(ŒH‚‚H
‡0ƒ@ˆv
yEt?ƒU,
‡Ead9E‘Xƒb†Hƒq‡_"…GH„d$b„0ƒ16Œ[+ˆGB‚
A?Y‡U:Œ.*
N†)3{‰Zdzƒe…6g2„[„9ƒG$W‚Zd#ƒ{…W‡‚xƒˆ{ˆF†I‹F…7Nƒ|†@Ž5I‚2#„ePŒe‚H&;‰Z…#‚,‰-„*ƒ‚ƒ!‚…"5oœ*ŒL„†c†
Ž7‰H‘X„†*‚V&‹nƒaA‚0ƒ% ‡4ˆƒK2]‡‚                ‚=  f,H88]‚8„S‚k†A‚N‚>‡;)‚2ƒ&…3Œz‚c„[Œr(‘S…aFfˆŒ`ˆ:‚kg*˜{b…nˆF†56D–_‚t‚ƒH-.em„{ ‡*w„9;„"‚-‰20…V
vƒ5lIˆW‚A‚b*‚6ƒ)„a%Sšo(
…'‚tK‚RL?›6ƒ4!vT&‚XˆŠ
ˆtp‚14…0‹¥0…Yƒ"Š
2‡”UŽ‡%^nƒ"‚)x‡,      Vejn&
…9ˆ%<‰Cf—o’!,ROF$="X,^‚&8GOƒ[mZ$l#‚?%B‚7‚]†F†(†}
I„Sƒ
lf‚!XR„j‰#(…(„^*‚f‚ikH‚(Šƒ](*1'…dj
ƒ'B„7zC2xˆU‚'x6xƒ>7ˆ4@…"+‚oƒ3…Y”oƒj‰
Y‚A`t‚o/ˆ‚ƒFoŽös‚XX0
‚->Tƒ‡
        ‚*‚8+:+I
F)#‡OtGY7KnE

mb‡^P
C     c
DG]%
N
    f>1Qƒ/ƒ8$6;‚&     x„Z
^}Rvƒe@ƒ"J7 ‚A‡)‚=O‚`‡c\      p]‰mP‚Œ †ƒD‚Fl*8#„‚83      ‚i<…X‡t|Œd‡yPD rP‰—ƒ
3g‡ha@‚-…?G2D&,ƒG‚rQ‚{‚Y…K
‚saE7?/,
u‚


[$H†@CO%P‚lƒ>‡@A]R#‚‡ƒ#‚^—8
6¶W

‚kkVc        Ÿ?}h&‚†kd[ƒ]q‚/„0O„h*ƒ
‡
Y„,
`2,<    !}& ‚&#‚V6
""ŸV˜€€€ƒP¿0Î]‘‹cP‡<‡‚Rp—3‡k\zŸ*§
_
ÕrhŸ~~H‡G0‡hBv—?DXKdŸ d‡gaXƒQqSG‡Y1
A8?e(:*
!)3{RžtŸ
(¾3s5A&‡Z
ZNE
‡d_I‚2#hZ&F‡tŸ„
&[E
5‚0‡- ‚sL‡—6[X‚|if‚%†R;)6w?‡‚‚'‚r„t‡f
…<ƒRFf†*[ R‡]
.R‚U„9ƒ6D>:4`(N`k'‡Iw#-‚u‚-
†2—1yƒ)F%D<
D$K‚R7?AW¦L
&U4‡1‡e-q‚1§'‡
Y‡QW
    2
2j*‡„j
G<
xf       

!—$=PX#^n8GOHm$l#    %‡.a
}}
7‚",f
bX!„jS2H:**kH‚(Šƒ](*1'ƒ1%
ƒ'B.z{xDU‚x6xƒ77z!Rz+Gl3‚!W      xO—W
}`!‚oN-0thank‹s‚†>½/ªiŒ•êfulli‚Šlt :4‚&<+rw6*C  ƒ81
ƒ]5-‚)+‚=R"a]N58x'@‚&K2R8}@=8N)sF%6)0%<k!0{
1(S(7@xY-v_‚[d] w              6       

bB    9      C      ‚U/        +1#G       
LR*R0vYIY       W]Y-Mica‚%R73)=
bXH$E
\†l307,vZlH‚me 
G    mƒh(_XL#J8V(E5&/ C'*1&N
Yi{yt;?*Evjg@R6F!.4Dh;^(
.)E!Ed)
M"|*F,.ƒ0,‚E
`‚\s
!‚1Z-5V"[gP.:
‚
@KN$$p5k
LyK4=;c
‚'B"d*DwrL]t`-bJzT$‚USw0FroP
N&m‚=3;*!+Ll-lxJfV0$:

j‚6OƒN
J0!N               3(/("M       b‚z‚? +(/(&&,/ƒge!hJ#&*J‚b'"PF&K
- #6PE%(3!.S*b
      -  T#
L2K@#]
5_M$'*<,'!9 k4i19
#?  
Vw<
ey%4c $.>N
M: ‚L*!*a|WW
$
u)
 

*
@L
J!2?
\G7["}
P)>)#;3\+t"‚d:XJ
$#<4*@
‚`Z7iJM
mB':3$#  <
i`8]&QKJv
U]!?
2G +   %P_X1,
#@-1:       -s/ AA.G)4?4
.>x'
3iTF#'q     (./I9[&H:
Kb
@'‚*)?$M
x

/*1,Q"'7*'+Qd0$+W
d%B      
IagT4^P_ ! U5K0JC**?pxo4Bm9         KWL&{:4Hm.n @‚SK?MH5efLY"'*&m`‚3!xcBa
/
r-]D
*$#'a‚‚]xLx>G9':Yt‚m…C‚4YU4
>2/UL<~5q3G^*D8qXs@
r-*()M4?4
* …?(      LRF<Te:a   CG  
@$|‚#4ƒU-\s.
=SJ
eB     19!Dt[b7bP6>T)?%x*JƒY%0$=B'})rI5+S2)p>(C-^[8KD*SL;f…(l`1> ‚

INVM^"S%*2%t
77s*$@O6‚:‚n(pl$7D.|2‚W_4‚;<U„/"'|*E-\‚
.i.:
2!\NyI!)$'U+X(',A"02$9U+"rXIDEDW(),D?</)!%xH2u&       $„/ej`:ƒ@I)        <ooeDCUkm?x)\…,„&d ]W
ƒ<
",<4-o\‚i53- C`Kdƒ‚]D?rƒkC@ AEO|;6+G?t)gdh ‚;/
>ƒ#9/„C0‚+‚1O
>‚<!CY
C$f%p7m‚3‚BX3:   7]!YRZX‚(‡ƒ||ƒ$D$C
†#K-W‚z ƒe‚#‚0\.&P‚Ye\A
L‚5
‰l*
""ŸV˜€€€ƒQ¿0Ò''"[H.R7rH3e]‚-b#%`PƒVQ)(&ƒU&ƒ\ƒ*"U
Gƒw7T{@o"%e    5H>=E Z„:Ly<+       RC:+D02>)‰#u"/+3U"~  EB|bEVd&4     3?@3>$.11L‚+(f/5\iae&>*88""t8H  m6‚h)‚C6Y‚,z2J‚,9!;n

D^)U0 l#
C      9
       /%|V40Q&j

953‚%:22o„
^Q+    -2"  4C7"   Ld"    QC"   s<FQ(Z   6}0w      ?„jFv!k‚2‚`qA%g)-- Z
)*Bn%hH
xu#"LU
63
+|,NH*0%8HZ,fO"
=:W'#ec_„<HzVI%_„
6‚
.‚A ~MDƒdC'-N‚,'m2,#,aA$( 6<(-XB2#ILS82Vi8K}*63bƒ_)    <
R8UC} `1‚jC"aZZ
F

Q‚<6$‚=Er
UVga[VIWYEr:ƒL‚!9BVUO6%ƒTƒ,"O"Z?&dZcN%s
;g„‚o0ƒ4#6`‚~$IL
%:;37`T|~A$Bqt=
<
)>      -@H3]4:!
1M=ƒ.p       
ƒcv‚
L)‚r"?1&3     {Fr`c5‚],1ˆ„    ƒ-BJ'+E*$?
Pe
=7BwJUbT‚J-*T-J2
/.%]uW
‚U6RLO!mT!!8N'.+>^4j$~9Q+(H%p8Pƒ-0+ +UD47t        *C<>&‚‚a.b
h$$&;ID‚Qddd\[X\[X\V[[[[X\[\rqhrfqqqd\[X\[X\[XZTYYZrfqqqqqqqdXXJ
        *,3!6      3‚ b83 o@K6R`)zUh6^%#OU,<1UI9(c.-Rx@‚R/\U+hj3R(U.A_
‚
$CC
;‚x9&0%B        "q(
B]ƒ-!`dm11P6`gƒ"_'C+
A7HtQ
R Bb4fX+@D<T'‚;s<Y+D 
X73
QVPr8N#45.C:o*!$J(/9  _tM‚!cCmm@'#!zbq
‚/-7J"
/\„=‚J‚<@m4c2!%:%Z(jTFF2r+3/>b9+
n g
&8#S5=\T5
. .u1I.2
       
>S$D#6Q8r-f,%1     .9,g?^8A     4)-AY3r3NW4)O(;g:28+S!!
%-K„‚1*!O‚D<!:!/8@8‚#\9w("
,
?a
)n0,"%1f

!
xAd1-3w|.yX
'=   ^
~J
('%
"&Qb>
m
]Yp(A#3o{3]8iU
l*L‚3Jƒg'!ƒ'ƒ]‚[‚h%Uƒy`q<#6 D?B‚a@wi(ƒQ&WQ%9*`ƒ?
Ngƒf
…~fi\>
4,!!c<uW‚`‚Y &6Sa{3C*4&m$7;.k&
\&
oC8;A0HoY %=B]H:CP Df"‚>ZJ@/4R^*T6;]J5
J&M        ‚>728(L
c‚@x‚6n"-J'*&   $
!  U'K*??T9
7N5.
C$f
)=.
)=QP5% 
k(+‚3+#<3"g '‚+G
‚@$
1\&=CO,4|4L2L3T2e@Bv?(K_BmL0&)',9"q7(<9<R
)#
"JD)r
E?P)   6r_Q!T #

 ~4L+ V
KE
#Q
h
5&h$aj U,i*G=vHG,l7v_*.$
AEScE#0           Uy80"Nd

<TR,?H‚LwV#+5"
IO      ƒ!(=S>MzM#‚H/kDt$kHdg"4SJ1    0>">!vl8V(!&b
'$0 L N\*\‚QR~'P*(cAJ+(
G)G<\U%EH!K        R=*hh&M1‚HCW    y8o
ƒfk/VxY89]
,       %"7U9
N6I
?
-D[)D?Y)[:7>iN4;6A
{kFnW10Rq%OKGT&q
9[A‚
E."/‚G;'S;AV*?‚+%
Z0
R
;M*|6$8A]fIYQ[aj9c?{     6@/*)|
ƒI^BqD^D0r<;vA,T [        x6V*/Al‚Af#Y,E';.!m
-Ce
4?,r&@.)‚4‚&L1-
=HR]"‚   9a[x<!$-,90)Zol(
}m'        ,.qi
CEm
e+!.7p;(Ah‚[=2.B>‚tWi‚3#'$pJ+^X     Z-,PY‚%(hJ)ZX‚z7Gp k#     :#[c1Y*
.6vF‚]G
&„>b‚"niAIWQM!>2\d([„Fƒ†Lƒumƒt5g`+O+wM+.i!h 9S5‚4#@?$L?-[aHJp[F!B"*)@n"L %:/*1]]+K‚=;+?pXh9-GA!*Hn(=L-5/,+MM:7|[c[<1&EVk+,K9,3,$EDA7
XWaaBW)-HG7pD3s.>‚GE`>63/r5K‚;cC28
9j‚(H„VU#W:G0
^"‚s!_\‚uJDoQTU8q7P$9$)7
%)L
'8-1]F1# *
       ‚z
P(?2''H* v&e     2&Sd,`)!T#!&0.> 77IF)`@'0)9a""
fN7„]D-z&
x-# ;5‚P6
>‚M!CK       P&9o~@#R06#<
'<
;--&vM
bT=
3\1&>#      d,)@y%F9( &      *^

!!ŸW˜€€€ƒR¿2  Ó5$+-‚`09G‚-4viz8      /0$30‚N
Ct‚Kˆ-46+?/c#*
QU.Q)eIAI‚y'J
AK*j
#TMcG
774RWd:"0!9(m"N8oA}S;'>"2
-5w*
c      g"#‚^-=R(0‚)X<)b1wA      oq!n
1%"w"k~w9F
h7"3
*!(N   H./'V%D})-8    =f$Y!‚<$‚'"-@{{7- ":6"&1A)/sA/%+XB
+!&/[B19,kl
‚0BR9!'1t#_x
sFL<'X
a
E<„SO dNUF9XN';'W‚b 1PC
P9<      ‚|
C&JYbX
6W‚$i
‚@C.8
=K
j/<@OJa"&   MP.7 
A‚
<#
-+Q‚#o0D
R,OZ.-!&tIF2+1'
NEu94q‚.)‚<Y%Q‚6@‚!
<7;‚jWr[W)
3;@2=7%k:H`x/'#p+c
8"eErF4      :     !i`} N&#Q G;ExP#…-3QhNƒ-8      9!X/![D(IeLf       @>2?N"7
_##4`f‚1-L
.
~‚76#)m\2
/C6
g{.)H3d/7#U!h!c"X@>Y%*‚‚‚.jSAhP"I
Bg0‚>k‚jpƒh[r$‚<#r?[Hsi   ‚s{%"">‚%q
>y
I,>XFƒ"/ƒs„c>y3A))‚H
][E*BH‚D)0IiJC‚:aXW#%Q8…,`+ EH2WOvSk&{bT
rM)RJ‚Qz&t-ƒb2

9N
#7A.K      % J)eDm|
|j9~%'=-
#*2
/+Il`A)YJQ‚‚|+!‚2?
gUMV!&R
F>D9&!\p+F9„:8$81XR K=
`
!U30 6=#gR6  )ƒ`2G*ke7)05„t^@"Zw@DG"{c"+20‚,rp
'&K„kn†xƒ/7n3G^†Tx-[…-+\.†3&92O!V*:&^u7Dn0<A2‚mŒ0uR&ŠVC<R*ŽIU‹T(        
H,’j”8'EdŽ1d‚0AUTƒ)8+4 E.`EC, @E267y&
W%
60l(,Y;_3"0B&'l96@{^n6-3d?"s?LU‚Cv~6{Ti     +6†‚5„!&
&^!KR‚@b$<&‚!(a‚ V{F<Hk
JP(]\FeF‚m""5ƒ*$‚=>/I2X".@(.ƒ^…y?.ZVNƒy
Nd?&m‚$Mn1‚O=2RU@%MS/x!#gmQs
        R&?%LY J?GRD=1G%&k0V
        ?Qf`
‚0i@ &‚$ƒ:Xv#"28(,uV&(!W!pH%‚Vƒa,*„W1ƒ4w„2qck;)‚‚"@‚       ‚ƒE<‚94[Mx;ƒ‚.;o3‚^%H*W3*UG0`zGM‚(0b"+20 tC> s#-j{Q}   Y%_R        7‚B1
Y>>k…
";c,3I‚@!ODT@\WbHT-K$7'd
B/

5N<2"%+3
F4 G
}2hW(+-B
$‚o[?=![n)N
y
n@   )X#  ;R@
)6C.%G&$)Nfz@%;
 ,DCZi59(b        8/h)%
%&               2J}.&vl98     %]2C$&9
s58Xg)9TR/
t>%:
202'h1„'Jo40+^^2‚
K%$}kŽös}7bP6>)M%x*J‚M%0$='I+

5+_S2)p(C-^88KD
      *S
&L;‡n;`1> ?
INvT^"S%*2G%t
77`‡_*$@n‡g
O6‚:P(yl‡f!D\WCCDEk(),D?</)!%
H2       &     t
H\:I)   <ooeD
C'kD
)\d8&<p]
      
‡U& ",<4-o\9.3-9^N`k
?rskC@ Eo
L;6+*yt)gd ‚;

>99/

C0~uO

>r!Y
$f    ( gm‚BX3l    7]!YRZX}(†0ƒ||ƒD$C
"K-WMde‚#‚0\.&P‚YY\
7"       
''"[H.‡)3rH3eF
z-#%`PQ)(&U&ƒ‡_P
.
GmH81o
L
<+    
/CI+DL3
‰#„^u"/+3U"~ EB|bEVd&4     3?@3>$.11L‚+(f/5\iae&>*88""t8H  m6‚h)‚C6Y‚,z2J‚,9!;n

D^)U0 l#
C      9
       /%|V40Q&j

953‚%:22o„
^Q+    -2"  4C7"   Ld"    QC"   s<FQ(Z   6}0w      ?„jFv!k‚G#LH
u#        U
';      (,NH*0%8HZ,O"
1.‡YT#eH$‡
H'VI%‚hL6‚
.uA      ~MD
""ŸV˜€€€ƒS¿0Òxþx
DC<-N‚,'m2,#,a'$( 6<Z-X
2#ILS82ViK}*63b,ƒ_)      <
R8UCX} `1‚AC"a$Z
F

Q
      ‚"6$‚=Er
UVgaVIW>0:I9BV+O6%$gƒ,"O"Z?&dZON%[
;gƒB‚o0=#6`
\V$I>
%:;37`T|~A$Bqt=‡>.

)  -H]!
1/
‚..M     

cd-)\r"?1o‡SZ {FrKc‚]1—5      KJ-*®m
&;
=‚Qddd\[X\[X\V[[[[X\[\rqhrfqqqd\[X\[X\[XZTYYZrfqqqqqqqdXXJ
        *,3!6      3‚ ‡f
6
 42BJ`)4UUh6@%#OD
R@‚‡-)U+h&/(UA_
 bCC
H;!‡7"0%B        "q(
B]‚[!`db011P6`gƒ"_'C+
A7HtQ
R Bb4fX
D<T'‚;s<r2+D 
X73
QVPr8N#45.C:o*!$J(/9  _tMaR[!cCmm@'#!zbq
‚/-7J"
/N
ƒ2G<@mF2        %:%Z(j6+M5+3/.4+
ng
&+  #5=PT
. 
T1I.,
       
>S$#6
      8:- ,%1   .9,V?^A‡   ")-^Y3‡f0NW4(vY228+S!!
%-K„‡n‡g <!:!
‡-8‡gs/9/("d


T?Ÿo3]    i§
c<
,W*‡a$-(a3C*4&c¶SO
05mM(+‚3+#‡f—1&=C 4|L‡c2L3T=‡h@Bv=(
/+B8‡c
0h',9"q7       <9<R

)#
—47Q&qT #

J
K9
#<
h
5V&$aj U,=vHG,ŸP$!&b
'$0 L N\$‡\QRjP*WcJ+(
G)G[\U%E!" R=*Th
$M1
eHC5      y
$

‡W
fkT/VxY89]
,       %"7U9
36+
?

D )D$
5[:
      /N;6,g{#DK10$q%3G
y&"
9[
."@
;S;A*?L+%
0
R
;  *+6$A     fIYQ
4a¦YR [}
V
/%J
L1
=‡R"
t
<J
,9)
o6(

@m'‡W9!.
Pi‡eEm®o        .B>;
(iF#'$VJ+X      Z-,Y(hJ]ZX‚7Gp~A#       ‡U!
c17*
.65F{}&       ‡^
‚n
      i
IvQ M!-2\d(T
\ƒm1E
9{P,.
#G&
;‡S
6!\{J1o>,#l 
 
P(2''H   vJ
N7
ƒ|D&
x-C /5AP6

‚!f
@    ‡[
>o8&#,306#<
'<
;--
vMH*&
>#     d,)$y%&89( &      *^
5$+-‡e4z
v
i8    /0$3—3)?/N#*
CXU(rQ)veI=AI
‚2'
AK&_*j
#TMcG
7
H74
"d:"0!9(mm‡M,;8oA}S;'>"2
-5w

6   g"#‚^-=/(0‚)X<&b1wA       oq!n
1%"w"I59&.
h7"3
*!(( t
2'&F%D})-8    =1$!‡"L"-
-{d"- ":6"&*A)/sA/%+XB
"!&/[B19
%kl
‚0B
9!c1t#R+
sF
$L
3'
a
oE<
ZS      dN9XN';'W
n1PC
59
""ŸV˜€€€ƒT¿0Ð<        •üAC&J
*YpX

6D‚$i
‚
1.8]
=K
j/<
OJ"&      M=.7 
$9‚
<#
-+Q.‚#o0D
R,J,OZ.-!&tIF
+
'
NEa,4d?.) qY%Q‚6@!
<7;

W
8=[W)‡E
      ;@‡f
=71:QH
+x?K
pcH
8"eM:    !S`: @&#G‡f%EiP]
‚+343$)ƒ-8   9!X/!(.D(IeLf    @>2 N"7
_#4`f‡ZULK
‚j+ AjHk‚jp$.r$'#r?
0%!Q
    ".%O"i

I,*
#Fxƒ"/
>A3A))

(&E*4B#@0Ii9J
;
4aX##Q$X,`+žW
U2‡&
A
F3>D,&!\+F9„:8
81Q‡a
 K>%
4
!V3 6=#HR
    P2‡[ee705_t^P—4

[c"+20
/Y8+4 E.`EC, @E267y&
W%
60l(‡b


/_#"0B&l

96‡d#^n6
-"%?"s        ‚Cf‡_6{4i +6H„!&
&        !K.+b$<&/
(aSUV
[F<k
11(
;BFeF9$m"5-

4>
I2X".1(.
?.@V—b>?
m‚Mn1‚$=RU"
5M/‡a#gmQ0!
        R&?%LY J?G
D1G%&k
V
        ?@ 

r0L@ &‚$8:v V#"28(_,uV&(!;!‡p
%‡j‚,*m%k;
‚8O@‚  ‚ƒE<‚94[Mx;ƒ .;o3^%H*W3*G0
z?MU0b"+20

$CH s#-jo\}    $%_R    ‚B1
Y>"1?

;%vR@\WRH9-K
7'

B/

NJV
      +B
$?=!
n)'

8
n      )X      ;R@)6C.%
&$
f
)@%(

,D-
 
,59G4    ^/h‡-%i%&MtE98    %]258Xg—7o40theb               6!
     "

&3               
    

0



K NN
   
            

B   >

                

M#X
!                  
2
$   "
( #. 1-
‚

      
       
                
    
      

             "        
            *
#     
            

L
                    
       2                  !t        

   
&         1

              

 


(S.

)

 
              6%            
2
G
(


(

  „8'
%

   

 
        
              
"4
   
      
   
             


     


                
!


""%      )


0
:+      




           


          
   .
 
        
              ƒ0
       
'
.            
,

       # 
(





 #
, C

$*
$*
;

##H        
       
) R,‡t          3+"

    
       




       
    
           
              *      
&
                         
 


       

/
    
   &"     “V
""ŸV˜€€€ƒU¿0       Ò
       


(  
#
       

        
        D


!6  

     
     

      %      
  

 

     
"$#
(0
"
!
#-#



        @(        
      







       $        


h           &
       
                   

)6
    

           "

*
&        8                   
H
&>

       

     

>        ‚l      
        
w  ;    

     &     
        
     
        

+
    #  
      

&%

       
#
       "

       

*

 




%             

                  
„x%H,       
!       


                      



    
       


'
  


&              1              

)>  l#                 

A
      F


H
1       
 

7

        

" 
"             *                
      

                                
       
  X        
        ,


d  
 %$   *     (*    
ƒ+ 
##  
            
 
       
2%
                        # 

      " 
#


(        $     #    )

    "

†M 1      

  2(



,*            .'

( 
        (         


!  



      " 
       




  


               L         





8      -!
                                           

  
       



                  
(      

      (+(
5
v
,
U



%
!

      



@

/M#*
   X!
                 
<   

#     
v
   

*6
Z
.!
    8





T   

'#
      

! 
       &                

$F      


%!


                    

Z((
        (
"9( 
->


#<f    
        % 

 

             
0
X"       
      
$$!
!(    

     
0
        

               











$ 

 

 
2
     
&

    
 ,
       6       4   
   
              
=        
(
++
*    
"
"
5
J                   .
 ^
          

       
(  








#
 $
        
58
;0$
    
>;<                                
               
&
    

"

      ((    
"



                       . 

'       %
h


"~     








.
      

;$B( 0     




0


      
=6             ;

#


X 



     

*# %.'!<
""ŸV˜€€€ƒV¿0Ò          
      
       

\   
           



b

        




       
 <
0*      
       X)  
       
      -
*

         #
, 

    



$      "
!   


     %

&!0
 *    
        

.
         
    
D        
    
              "      0     
%
6

!        

                               
*'
       &      |

                0
%  
0
  

(-
        
0 
       
  .

V
              
        
           &'$               "&     
                     B

       >_
d         
0
   
     +   
$
 !@                                           .        &          

 t



         
%
      *8 %" 
)             >  
*
      *




              
       
       

  


           


 
'            
&



      $    
     %
      (
'       
$"  
$

      
%     
       
          
      



$&Z                           
     r':1

   

/   
          ".


       0

4

 !Z
               
     
             
        „

  
    
     !   

    

              

"     "


                   

            

        

   





                   

!J    
      


                  "     ~

6    
       0%


&      

               B%1!        
"@7'$D4  ,
,
%
$

      
       >

              
‚         



      
                

     
 

  
      

             )

R
  

           $      4


            
-   ƒD $*


J'
 
+=#
   

            

             




                          
      
           




!



T

        

     6‚ 

  /           (


                
       
    
%      



      
$, j$


     


                @       
C 
              0  
       

   


!
6


$
                       
‚<




!

 

     
        
 *


 
!!
   
       /
 *#!(
*‚P 




     
        
    
%

                   

'

  .?b     






      

`
      


  ,         
-                


        c

             
  
"
             
j        

    

      
                        !/;           
h          
!!ŸW˜€€€ƒW¿2Ó
#*9                     p.
     "
D
        
               
        



*           #

…>o
,
0N)                   



&("


     
        

     
      
    
        
 
!#)   


     +       

  
            ^
6




+                
              -        


&2     

      
                @      

 
(%…&/     


@


$           9


          !                      
"/      

  


            !J 




                
        
&    

    
                  H       ,.

E        ‚

     

    
V         

      

     

 

              

$$*!
+          
       


       

      



$!

:‰

        (

      

2
           *  "'
      

&"      
%    
#


     *!  *
        !  
"      
       


       (

       .

      7




      
             

     
        
%
(               



   -
             


      

                   !
     

        '

%           ‚
3"
     


    +!#&C
L#=     
'
"
              /C

      
&     „6
        
     

*
@/(
!
             

S%             E(

I
,
                  
`/     

$         

‚
      N

$  ]  /(0<        +2+

%     
&
%

$               
W#— 
[2
 


/,        #       %      4%  H
    .N    

_+
        -|
"
        JA(



        
        
   ( 1fV       W *'N*-? !

*+'?$      +-

*03t
!,

/          

        4
             
      

       
1

               

      " 

   

   #        !                    

c;            
$

                     (    5
"
                                  
    

      

$

'  
                    

  
        

                    

'                           6        M

 
e            
5
      
.

      

     
               +"                      

      =&

(0E
           *,
)   
"
,       

!
        
  
                          *

        %
C       ;&"*

 9



     
/ %          


                     
)
(

+          
*
-
!L





          


&

.           :


  ,#                  
,G
   .
?


        3#

$%          (<$K0$.…,A&
#*


     !&
 

       
   

          #   




2                           !        
&%
      

   R
5U.
           
  
        
       

 #             )        

:"-
9
#


               2
J
Q&


$(
"F1
9
      b
""ŸV˜€€€ƒX¿05Ò7

     
        4;      )

-:""                     ‚—h
 
           

     

7*
#<7
&
F
ˆ      

          (

    
       
               
             
     
               ,    L
    #
                  
          
     !                                 

               

% 

%#*


         
        !
-     

       
       
       *        

   

        8"#1"
"
             



       
(*             #%
       

              


  

       
        
8
 
     
#C
)

                

        
!
       




S
     





       

     
    
       
       
      &


       -
  8(8(

(
        
 
      (    )       #
B                3''5    
    


        -
      


"    


d
%
"
'     
$     -        



      

/6
        !
4
        
      
    " 

        $     <%    
    
"




     
       

      *
   
#6

             
T      


       
     7    
# 

              )



    
=R 
         $

      8tJ=-                        >* ^
"
?<       o

              9:"/

d0<
0K+R#
        V      4Ur  8         


 


"
$5

            *›     %       
                         

(*
       J
]!
,,

            D   /     /
 

2


                P)       


q                  =" 
     
      
)

"

        "$
"
 

L^+
             #0             
          

       -
(
 
       





8 
        
            )     

     




      
       
      
       
       !& 

5*5'
                         

              ,   

               






               

17        




,""#/     
   '";(
               
01

4B(


  
      
!-f
            
C
       

  

            S 
               

              #
"                  
    



#
F
>
+C.             
         

$

    !
 #        ,
<
9
          
   .9
5)B
'L#?K(*/(       
ED

,       

'%        $

                     

G(+


! 
-%
                       
       3
                 



      
%$   
!


)$#



            

            

!

    

     =
K                      
8
O   S„.c
d(_       "   ;

<7  
C&
 5Qf"-
&    &!       
$            $
7    )p"       
        t
   
<       

             "   



        $
J

!<)R

      

-

        9"
    $ (
‚x
! 
              
(

D$             
""ŸV˜€€€ƒY¿0} 

      

     %/L


E<     



     1



       ‚
LR+     ,-      +
.  C       

_$
9
(   -dE
R        $

    

1-‚(2
2      7L.&-    
                                   
#O      
  
      A0

'$!
$=



<
)<#
7     
b
1(     
,
E


&%7
]
H   

   

3      
&4     
$             (
‚Z    %

                >+     6!
*%!
 


($%5
)B t
E:)"K!        &
0.# 
&"%%1     6'0
'+‚'


0      ªs              

             *

                   ^l(:MH
=4p
q+ %39
"     
     %%#=C        DJ#!    )%    !      &n$+"%

      8 

"   %
!=     

"^

('  

"c

+,l             
!
      
$ 2           ƒ07
)!          #   '
    



       
$+"'   
'
 
         + 
       


-      
*0
                         


              
     Œ^ $!



      
!      -
/

 



%






.B

        R      /(         


    



        
!  ?




/          
0      
         


&  %

           
!        5#'  (.'%;

%
"
 ""<

        
 $+
 
0&
        !!        
$      '


-.
 +"                    
  

        -      
!
         
!

2
&

1
.
      
)                   



        
        Z(

$!$                      
/4
!       ,M&

      
% #1

'      '
-
*%     ,.'6( .+'=†n$],"

%6     V2



87'

        
8          

      
 d*
      +/
        1$*.G)!  
"J   


"

*            '
-,*
        #            ;
!9
    6#
U30


        
  

       3!:                      $
A          
(
0
+
"0     

C


3# 
       
 &
 #. %
H%

    
# G
‚"$+
T"%        ,0   BU"#0!"0
      
$     ?B)
        #

*
53K."
1

7"$        4#98&
       




      
5
9              '    BK.            

CP#=,/      
0)&D%%                       &



$

             Y       :;
2    
       $%ƒz*
%u 
7
)#         



`
E+     
%  
 'I J
        
2


'      *
K      
2

"E,   

R"        4
(         '
LI
!    >
$
"   
`/@
' # 


        EL"       

XŒ^( Q@#


       
      
         
!%       "
>

             
        
       
                

       
     

:
    *        

       
            M*U<3*4                   #
     2   !#
      "-&
 
)
#90K
3


"    
/#


-7=(
3        
 


8

    
;85        #         
(!
(
) 

""ŸV˜€€€ƒZ¿0Ò
5


)
!





     
        


‚L8&
+
             F


,
           
                     


                          

    
" O 

‚&.
X#

7)
4       3>)Y-(5$


      

    
9$ '       " *
       


4
      
        
.    #
1V 

3

*
 
t%I?&   +&    )>V
<
       4&"! -Up_8
      +' 
c2

   8',

%6(
6#    "+-
8z

       

%
‡R=
)
        8       


N5/     *%
5      
-          

 $
         
      
6
                -
 !
        D
              
       




6
                    f           
      
          

  
.'




       
& 
!



     
 &    ! 3   
"    


#)             9
 v.p &
,0        
&
,0    
D
       



        
 (     0
-~    
$8   "E


'           
        !
        
                  
P     
                    



 !
)!M8  %2
h
A"R*+8/E&8;L
L
+)&



     8
    !.                    
+4:


  

"          $!H          !






   
"      ‚
       

`
         
9;&'     4&          


                     


 &,=)*'
 
Z    



   <        *      /#.       +J/* 06.,-<A%      ?EE5
V
-)  $ 

     $





       



ƒ
!
!
       


$    
       
   
"
#              
     D
                          .:            #
T!          %
  -*%B=ƒt
       
#:'.O

            
"#       #!/

  "9JY!  '

*1!
@! 



 ,-4 
r18#'>% 
5
3 !0   !( #        .&7
$             K)2‚6g
!    
$    
"'K
    

8!
 


C                       






     '-!

|H3
0&1     

 ;      &!2
*      (!…|
"+#      

?   





       
        
       !


            
 ",!    3
             
       


       
/    



            F(     4@
*",        

#



            


%     "6 "
f/.

    2             !

   
      
. &     
  
(     !        

       2,"
       
       
              6
      


                   %   "
 
$


      
#


      


                     #     
        
          
      

G
      
!    
                       $
  
:




'
           
    
          



'      R!+
(
      

   


$

!

          
       





(%,
""ŸV˜€€€ƒ[¿0dÒ

,  
-$2   A"4$       R  +E

)!
I       ‚DP
    


(y

.)
   ‚:"&N
9
*!Y"      S
&        "

"%;H
   '2aC
                  
,      . z

'

       !


%              

% 
-
<     "
       Q    ‚S
<\Y1\7!'

',

Z74&   G
*
5
        ,#'  $$ 4&-5
G$$Df

,+     .

):h                  
!$   W+    $
ƒ

          
   &


,%P



2           *m

       
E 


        


r
    "  
        
        %5\   



       
       
     8!
-#+)
               D*T.        

                
$ ^
        
    ##‚(#‚
‡#<        5B-
 #C; ,')/](


7      
              
""6
      
           3%:$"    ' 
,        


2     
        

:




!


                     ,   

    
         (        
-    
ƒL+/   
              )!#



%
                :

        

        
       &
!

    
+
%   ;
&
!@

        
     




 )-'   
†x.V'

  "
     '2
>     @

) 
I   
K?
        


        

         

 

      


Y

WM      
l    
  

   

                                
b  
       >


$(!         

1:,4 +



    
# ‹FA26!,1    
         & "     &
5#
-. 
        %

.F   4"!%+ 
$!
             #2=8#J
8
+018!P        #
             .' 
 #
4
G.,/%$!'%

       .o#@4%&+      
   G0(%I

    '!FO

 
     
/

O


&
XC%
*@#",
<                  -
      )        &



'%      ?

.3!1#!O




),       ;6   /!
; >EG"
A$3
-c0!%9  7!
%!  !
     W,R0$E%
       >        V>,=XR
[BY
D/
,

J
B"9       ( !   ##6$
%‚&#




8
 
  -
$
        %
  
#
*E '   
            


        )$#   #F#     N* L*P-J     L

      !+I 
$        '

?    

       

!‚>



            
!
             
      

    5+
P:
      



.     


%7


#
  5              

            

4           &      (    *

  



 &B
…:
.

       
              2"        

       R 


     
'(
           





      
2   
  
)
)@
        38A#           
#
 

        
      
†6   E"
        
 


   





                    ,           

      

        
          

  
""ŸV˜€€€ƒ\¿0îÒ;9               -
,

    $  


      
      .    ."       
       
-  



       
       

      
  
'


‚]‚" 
 %

           9      &T

     #      



1V"6
\
 




                     ;\     


  #=      

        -@2

(
             

(6
7Q



2
x
!=

'
 
@       

      
          

1     %                
*3*')5           '


n‚NY8?
?

Or8‡       
             
"$
       #&!              
            Q
O!               

       




       

)0

/     

 
(
        
!8

& =4        
        "
'
 
       

$


      A
8

g
                       ",  
†>
 
      


  +&
) 



 
                        


7%K-%            r




         
         ;

"
",

   
"

1-  

#      %;
 
&

           
J       @N  !?


&    )!  &)         <&
  6     )          ƒ!
!
7

 
) '(        (


        2(
2    

# 
#
2  


%J

          )!

‹H                
&         
 
    

*            8      
E

=
                   %#
   

1   
          
       

        





!       

+, #


      +                      
@
        *
Bm


&%*    -  '     
B



        $
T


        5     





 
      L,


                        
          


      =


     
          


   !

"/ 
      

    P4
2      
!


     
B&
     
>                    Ž*"A"

$
&$CK!        )                  
)
         2        (*                      
              
        
  
         

31                  



 &1

         @'^&


                      

           
       
       

      


                                
       
     '      

"  
        




(

)                  0   
)


?          
        
      
                  

   


        
      %
      
     

              

&     <)
       


        

-      


    
&


&   



       +" '
       6#l  

                  
    
6
$   
(

#             7


2&69
 '-
*8  
      2

!,D
$b.)/-$
%'<UD!*4            
<    '+


        $
;
            

8
†F

   

        

       
    

       
           

      

)G              

      /
        
""ŸV˜€€€ƒ]¿0ä
       



              

6                
   #
       !'-   ;      
   
       

2)
    
                  




        


‚p3

3
 &
        

       1
@ƒf     78
?']
/
   #    5%#
%.3$#

,


&3
     +%E
A

 
    
"

+%CCN 4
 )
1‚2
                

     2


#         &
($      


    Z     
-%
      )

               1b               


                        +@
C              
     :




 
O2'

&
 

                    1
((





          $
0
%#   $
        
!.


   "  
       
      
*"
!
     
     $            

       
  %
#
       

(


)                 
*-"

-
                         
   
        

       !),  &


                     
        %   
"
         


      

                          
 I?     *
 
   

 ")               
1*



'  




)

" 


4

$
&

7


-& 
6
0

        

(
&>    
!
        -    1            


"    J!              '                          "                     %
     


           H
#
D 
     

)

       $ "
-
     
                  


ˆ,
       .%

      
     
        

     

      
          


   
,
*!D#



2<
)       
       '
%%
/                   

-!
 
   #
           2



#       !

    
''
    
                %

'    
 



        
6&
       
      
                     
    

     
       
        

        

                   
*?O "
        

        
           &v%       

        
       ‚(KH
!
        +/@          #                           (

       = „3
)+       


G      
 I‚""!U13$#:L








        
        %&;
8
WT
%2         
!
:2#     *‚
             K 

       
,

*
(
f


       

%
S337 

 
6 
                e-      !   z
&

               "

*  


(
-
           

                              
       
(.



     
         
   


   

      

    


        #‘L

      
O$:U
  
†n 
]      (

         *
)"       "
   
        
(            )‚u

    
†6Y
       

        
                          
\    
,$

„S        




 
                     
      „b


u     
$   S

0
        

      6-
/    f

          
       #:&
b
#
%



      



    #    3     
                  
$


 +
Žp<h‚\




        
Šx



                   

""ŸV˜€€€ƒ^¿0^Ò‰p




                "      

        
                  5    
‹

 

!

       
 

            “?



B)
Ž
             


U

              

+
    Ž

             
       



b    



ƒƒ`3


%tu&

        !
        
     


*!   
               #
              !+    





             !   

        



.,   (      2(+


ƒP
        $6
        0!

"

        

    



  

   
$        ?
      

              
       


        

   6



ŒJ           
R.
67"(!8068
      "U//
       
      %Y        4%
(E#  0+8"
    
9
    

            
                 
!
3             .


       
              3   
           7



     
    
             

=       

'
     

             
0
     
        "
:A),

C
!     
6
           




     #
        
.
            $
 '


2  "
1                 ;
&J 

,
$
        

?
   
%

!?

    7

E!0x&-
       #     

                +        
         4?35D4
       6ƒ% 
%            B
&1     
0 
        
!`
          
 
0
 1S'

!+&$     0
F
‡,   
*-U!
14     
         

"  "&


(@
        

        
6%   +
*,<  
      O
%      $   
"8+   



+%' 
        
        
  
     : :
          
7                 

        P
     1







$3

    
A/        3     B

(#
        •b $         

6
;"
          
('

       7
&

)
        




  

        

        
                 $8
        






        
*

     !     *

      F       '$(
'

#&+
       )

             !








        

           <


       "
)


               



R        
15
' #

(6

              ^4%




-


        
         
       


       C
                     .    !
             0     









   

      
       


        


     
     







          
        

        
                        
                           


       
        

              



       


   


:  
!      


                           
%

*



B


              
       #



 

               
       

    


h
$   
%     Q  /+
‚
,
0
             
S
+)6$`4


6       
'%      &

:       '
,    



""ŸV˜€€€ƒ_¿0B  )     E       6
"+#


0

ƒ
„R#
:     


        Z                               

<  $

'         "

 9,

1     "

'C       '7&/
,
GA
&
b+ 1H$
!


Z>        
&1I)<
+0+


"/

l
      
       
 



    !B        \;'     9"&  $*              

         "
"
    9   !"(*Q  5
 
5\        ""-"%&&
7C@N"     

"
 A
C
4%%
             
           2        

 
 'b
      .
)$E6(     
    
4"  $
@B      C
.=
       
=



       
*

Z
.Žös(o
,
0N*                 




&(v


     
        
j
 
      
    
        
 
!#)   


     +   

>    
            O
j





+                
              .-    


&4 

      
                $@  
 
(%‡YL- 


@


4            9~


          !                      
"/      

  @


            .!JF 




                
t     
&    

    
      4           ‡_"      ,.*

E        ‡gn

     

    
V         

      
L
     

F
<
           

$$‡e!
+
              
       "


       B

      



!

:I"
"d 


    +!#&C
B#=      
6'
"
              /

      
H
        
" 

*
@(
!N
             

S%             E(

I
2
                  
`*     

$&         

   N
2    
$   ,?      /(0<        2+

% 
&
P%

$               $W#‡Ul
[2
     


/,        #         4%    U
 .        



+    -|
"
        A(
6.


        
        

        ( 1,V   &W     *'N*-?  

(*+'?$*    

+-2

*03F
!,

/ b    

        4
             
      

       
&

               "        

x        " 

   

   #        (                      

c.      
J


                     (    5B
 "
.                     P         
    

      

$4      
'  
f                      

F
    
        

                    
'                 4        6        M

$
e            
5
      
.

      

     
               n"                  

      =&

(JE
       *l!
)   
"
,       

!
        
  
                          *

        %
C       ;&*

 9



     
/<        %                


           h       
)
(

+           ,
*
-
!L
,


"
""ŸV˜€€€ƒ`¿0Ò
Àf‚
          


&

.           :


  $"#                        


       .
?


        
#

4
$%               (<$K0$.‡)RA&
#*


       !&
$  

       
    X
       #B     




2                           !        
^%
      

   R
5U.^
             
  x
        
       

 #             )        

:‡_(
9
  


               2

w
 Q&


$(
 
1

      F
*
            0
     

B*
#47
"2
F      
:
ˆ     

•T         (

    
       
               
             
     
               ,    L
    #
                  
          
     !                                 

               

% 

%#*


         
        !
-     

       
       
       *        

   

        8"#1"
"
             



       
(*             #%
       

              


  

       
        
8
 
     
#C
)

                

        
!
       




S
     





       

     
    
       
       
      &


       -
  8(8(

(
        
 
      (    )       #
B                3''5    
    


        -
      


"    


d
%
"
'     
$     -        



      

/6
        !
4
        
      
    " 

        $     <%    
    
"




     
       

      *
   
#6

             
T      


       
     7    
# 

              )



    
G
"$
"<      Y

              %"/

X04
<
0K+2R#
           D       4-b ‡YZ          


 


"($5
$              ‡b      %       8
     4                    

(*
       0
]!
,f


            D   /     /
 

&


                P)       


q                  ." 
     
      ,    
) 

"
X
        "$
"
 

L^+
             #0             
          

V         -
<
   
       



H

8 
        V
            )     

     




      
       
      
       
       !& 

5*5‚\
                         

              ,   

               






               

17        




, ""#/      
   '";(
  `        
01

4BN


  
      
-f
      Ch  
C
       

  

            S 
               

B        #
"                  
    


#
(F

C.         
.         
8
""ŸV˜€€€ƒa¿0 Ò
$

ÿF!
 #        ,

9
          
   .9
5)B
'L#?K(0/(   
E\

,   

  %N              $

                     

G(+


! 
-8
                       
       
                 



      
6 
!

$
)$‚R#



            

            

!

    

     =
K                      
8
O   S‡>a
F(
V    0"       & 

<
     C&
5."-
&   >   4&!        
"               $
      )" 
        
      


             "   



        "$
J

!‡RHR

      

-V

        9"
    $ (
T—4B
RL          $

    

1-®m6'

d0      ªs              

             *

                   ^‡f(:M$<
=4p
a !9
2" 
     %"#=C        D(J#!        
)%!  
B&      
 
      
$.     2           ‡f5
)!Z#     '
    


        
)$"'  T   
'
 
 :  + 
       2


-      
*$
          6              


              

     ‡] n$!



      
!      -
/
f
 



%






ƒ4B

        R      /(         


    



        
!  ?




/          
0      
         


&  %

           
!
    p5#'      (.'%;

%
"
ƒN
 ""<

        
 $+
 
0&
        !!        
$      '


-.
 +"                    
  

        -      
!
         
!

2
&

1
 
      ‚>
)                   



        
        Z(

$!$                      
/4
!       ,M&

      
% #1

'      '
-
*%     ,.6
0( .+'=E
$^,"


      6       &V2



 /7'

        
H8      

      
       , *
        +
    0$*G)  
"$&       




                
'"
,*
 #            "*
!9
&        6#
K60


        
  

       J(!:                  $

      
(
0
+
  "0

     

C


3"# 
         &
 . 

‡C.

    
& G
‡f$$+
T"    ,0   *2U"#0!"0
           
$     ?B)
        #

*
53K."
1

7‡$      4#9‡g%.

       H



B
      
5
9                   ‡dI.       

6‡e#=,/      0)D                       

$

$

         Y       Ÿ/@
8     # 


        E §2!

""ŸV˜€€€ƒb¿0
Ò
’€Z,)
 ! 3>Y-("5$


      :

    
9$‡a         $
 

       
V

4
      
        
.    #
1¶S         



        
      0
-M" 
$^   "E


'           
        !
        
                  
‡f,     
                    
 

 !—5


(
)&



     V
        !.                    
 +4‡bd


  
L
"            ‡f2!H              !4





        
"  ‡c
       


&
                F
9;&l      4&          


                     


 6,=)*'
 
—1
+ 
6
,
--A%   ? (E5
J!
&
       
^

$    
       
   0   H"
#              R    D
                   
B$:                  #
ŸB3T

0&1  

 ;      &*2
*      (!‡e(
0+#  

       



b

       
        
       <


            
 R
",!      3
             
       J


       
/,



            8F(   @
*,2        


L

            
2

& "6 
‡W-.

    2      D    !

   
      
. &     
  
(     !        

       2,0B

       
       
          8
      


      &% 
 
$


X  
#


      <

                            (#         *
        
  
      


$
      
!H      
                            !
**
*:




'
           
    
          2



'       >!+
(
      4

   &



>        

!

     > 
       

Z



(%,&

,  
$     A"4$   R  .H

)!
 
           žq        .‡f\

'

       !


          

  
-8
<     ".
                 I&                !$   +        $
‡d(

        >  
  8



,
%&L



,2*(

     
B) 





‡U

4        "   .
        
        %5‡eP   



       
       
®o#<       ,5B-
#";   ,')4/].

R
7       
              
n
""6
      
            ,%$D"  ' 
,       ~        

""ŸV˜€€€ƒc¿01

2     
        ӯHT

:




!


                     ,   

$     
          6(        
D-   
‡U +/    
                     )!P#



%
                T)

        

        
       4
!

    X+
%   ;

!`

        
     




 )-'    
‡]@
.V'

  "
     '2(
>     @

8   
I   
0?
        

H
        

    

 

      


8

J 
h!       
  

   

                                
b  
       >0


(!            

1:,4 +



    
 E#






8
 
  
$

  
#
*,           
            


        #     #"    $
 ‡S
*     )* 
P
              . 

      + 
$          '0

?    

"   

!H%&


#
 X       

            

4           *&        (P      *

  

$

     &B
J6     2
        
 


   





                    *               
:

      

        H
          

  ;6!             -
,

    ($      

^    
      
      .    ."      ^
   
-  



       
h

(  
  
.


‡[  B%

           
9     T.

     #      P


1V"6
\H
  

H.


  #:       

        -@2

0        
               

(6
7b!



2
‡e
!6

'
6   
@*
   

      
    N    

1     %                
—30      
             
."$
        #& B     
            Q

!n
         

       N




       

)0F
/ N

 
(
        
!D

&J =4      
        "
'
 
       

$
.
      A(
8

vg
                 ",   
‡Z(
d
  


  +&
) 



 
                        


7%K-.           r




         
         ;

"
"
,

T      
"

1-  

  %;
 
&

           
J       @N  !?


&    )!  \)             <(
  6    H
,!
N!
7

 
)  '((


        $#
2      4

R 
#
2  


%J
,
      )$!

‡^,          H    
&         
6 
     

*"8       
T;

=
                   %N#
   

1   
          
       

        


""ŸV˜€€€ƒd¿0Ò



•ô_
!     

+, .#

x
      +                      
@
        *
Bm


&%8      -  '     BB



        4
6G


        5$
   
,



,

 .~
      L,


                        
          


      R


     
          


   P!
R       
"/ 
      

     P:   2   
!

0  
B&4
     
>        &           ‡N0*"A"

2
,&$x
K!  )                  
)
            (F                    
              
        
  
         

3"2                    


(
  P1

         
@'^&


                      

           R
       
       

      


                                
       
     '      

"D  
        




(

)                  0   
)
@

?          
&       
      
$                
6
   


6       
       %0
      
     
0
           

&     <)
       


        

t-  


    
&


&        4


       +"J'
       6#‡E2 

             0    
     
‡f$   
N

#             7


2&9&
 '-

*K
?
$0.-$
M$*4          
<$        '+8


        $
2
;
             


‡c

   

" :

       
$        
8
       
N
           

      

)*        $


        /8       
       



              

6       
          ~     #
       !'-   ;      
   
       

2T )
        
                  
N


        


‡X.



  &
        :

       *
@K
$  

F


#         b
($        


    Z     
-"

      
4
               1H
C              
     :




 
O2,'

&       N
   

                    1

(\


.


     $
0


%#    $
        
!.$


   "      
       

        
*,
!
<
     
     $            

6
        
  %





         0

(


D                 
*."

-
v                     
   
        

       !)@       &

<
                     
        %   


H         


B  

                          
D I?     *
$   
   

 "
)
""ŸV˜€€€ƒe¿0Ò               
1–ÚU"



*               



.

)


"




V

$
&

&


&
6
4

        

(

&>         
!
        X        1            


"    žV#"
T   

        
       ‡fKH
!
        (+/@V            #                           L

       = „3
+6       


G      
I‡a""!U$#:88








        "       %&;
8

MT
%$          
!
:2#   *‡\D
         f     

       
,

*
(
f


       

%
3^7 

 
6 
                -  !   —4 




         
     


   

      

    


        #M*


ƒ&

        !
        
     


*!   
               #
              !+    





             !   

        


‡b
."    (      $2(+ 


 ‡c        $26
        0!
*
"

        

 p



  

   
$  ?J
      

              
     B    


        

B     6

$

‡_,           
R(.
647"(!8068
        "U//
       
T        %Y        4%
(E#  0+v"
      
9
    

            <
                     
!
4         .


.   
               3       
>    7\



     
    
             

=       
4
'
     

             
*
   
        
A),

C
b     
6
           

$


     *
        
,.
        H        $
 '


      

,                 ;F
&J 

,
d
        

?
   
%

?


!

!"
0x&-8
       #     "

                " 
             —
&% 
             B.
&1        
0 
        
!V`
          
 
0
 1F+'

!+&$0|
F
‡`0,       
*-Up!
14     
         

"  (&


(@       

      >    
       *6%   
*,  
  6
%      $   
"d.+       



+%' 
        
        
  
$ :4:
      
7&             
B
        P
     







$3

    
A,    3     ‡S*

(#
        ‡f        $ <

6
;"8
            
('
  
7
&

*
        




      6

        

        
                 $8
    






    
0*

     !F       *

      F„'$(
'

#&+
       )

             !
!!ŸW˜€€€ƒf¿2ÁÏ








        

           <


       "
)


               



R        
15—þB
^' #

(6

j          ^4%



B-


        @
         
2            "


       C(
                     .    T
             0     



        



   

      
       


        "


     
      
B






          
        

        
                        
        <            

P
       
       $  

              



       


   
6

:  
!      


                           
%

&N



B


        .
       #$


2
 

        T   
       

    



V
0
             
S*
+)6$`0


6       
('%  &  

I
($   


        Z                             

<
       .$

'        *"

       9"      

1        "

'   '*&/
,

 
&


     1$
!
    

Z"        
1I8
0

4
"/

‡G
       &
       
6  



   !L*         H   

         "
"
B9        !"(N          F"-"%&&
7C@—7(      
    
   0thecreatŒ¶RWfil‚6
y‚*’ó;w        i„yƒ`j‚0ƒ=‚2V‚
„YY‹^X‚+ƒƒ:~‡q_MO‹gƒ3…?ƒ2NC

#
W`
Q
ƒ 
u#0„MdƒX"    ‡wT+
‚Žƒa
‰sƒ+5Ž'
ˆ
ˆ
I†
„+’0‚q …„@„kˆ2Œr&~‚@A“yu‚(iYR‹‡ˆ6„0#,ƒO:†Q‚GCŽ6G…o~ž-„[‡r…A‰ƒ2„K„&„ƒ,‚5,[¿l£‚O…2”‡B‚:‡hpˆ>‡VƒNƒOgƒ…j„%ŠS†}A”ƒ]–/ˆ<…$rAˆ(‚…–
„ŒEFŠu‚…bO‚&9‚„MX(jx…ˆk‚(
\{(†šŒFƒ&›U…ƒƒm*2‚‚
`Tƒ„Gƒ.’^,N4'@ODQƒ‚|%
3.ƒ‚a:‡:R”
ƒ.W…eˆb—‡^HˆC‚
‡0‹o„xK pƒH†!P‚ƒˆ…„t‹h|&†ql5_¥Gˆq‚':‰LM"¥w
ƒ<‰#…0•
(‚5… "ƒ‰     ƒ1‚„eX1wm^%‚1G…W;
*ˆp„!…B…‡„a‚v‰–
‚CƒRTˆr‰~‚‚i…‚    •]e‹‡ƒNHtq7*ƒ"+‚sq†T‹‡A†{…8† ƒkH„m*„^ŽHREƒa \‚ …6,‚“„VS„0¡f‰Tu‚…‚/†—1ƒ!…Kƒ^l‡‡6‰B'G‚a8…#„L‚~ˆS‚>y‚x›Ž_…$6‚q‹>‹'
‰|ŒUD‚y„R‚ŠQ
)
…K
š ¢[‹b˜6§,Šw‰j‚G%Œ(“Dƒex8„ƒ:‘]ƒGŒ/…–D.ƒ-&ˆ-ƒpƒ3V—:„`ŽY‚moƒ/„w       ˆ‰‚ƒI„"†;‚H‡8„_…ƒ;-$
Žöu

‡iY‡
z ‡
‡m
N
‚l&uK
A‚6hiO‡0sL
‚c0)e
::‚8^G†%mk
)…A‡‚i‚l„;?‡r&-
£‚O…2”‡BH1     
‚B‡]
>‡i
q…j0m
„eA…>‚.k‚!rA‚.={„y‡?
4]Õ‚}(F
‡g‡…”!‚/ƒ&ˆ…ƒI$‚‚

dj
""ŸV˜€€€ƒg¿0É‘‹N
w 0j.K4'@DQ
‚@|%

3_
0‚a"®IQ”‡l*|—Jiƒ;Ÿ‡<:n       ‡qD
4„4‚<
(J¦YPu
"%ÆJ…vU‡"‡Xi}JK‡[S-[M
c‚‚v‚H‡N
k7N+‚.‡%—‚A}I‡b„m*‚1‚[ƒa‡g
D‚    !5x„‡Q?‚       „     /
+ŸT‡saƒ!‚‡]

lŸ…#     +*  ,Ky9,!#žYC‡ƒbX‡aBR8‡f`—#
'‚@%`]
8UN—‚u‡‚>]O
‚‡T~‡4‚u—(‚Zt
\V
‚„,{%‚!‚
e    J)8)‡V]‚q§0their˜5‡Q‰–Fc.5-pƒ^’`9ƒ3&2R„K
#Cu‚…„c‚BP‘c‰'bƒ‘^
™~Eƒv„)S±-Ðg`
dWŠ:ŠMÐ/‚+1š.ƒC„ˆ'J‡h~‚Vît‚-"‹y;}8‹/H‹Z„;„H‚Qt‚†ƒ     „N„¢
‰BŸ#ˆ~œWƒ•eŠV
7„ˆTe‰jlƒs‰ˆ,—K`ƒLƒ{0¢)‚w„‡&}7”)}P„D]7AP]7A…|-‚4:8
c<¤V‚+„.v©0ŽJ}‚)‰dK‚Rc=…[Rƒ:.   Šl‚…kF…4
ª ¦K‡(Nr˜…L†‡
]ˆ!ƒyPƒk‰[<
“{†U„aŽ5ž˜"ˆc
TZ‚|†fšT’„A‚R§–A„ƒoŽr‚x‚{–f¢‰&Žj½HI…†M‚MŒˆ\cA˜ŸQs3r…‡‚žAP„^NS4bŽö}]‡‚r—0C{y^N‡W
0f+WV7Ð/‚+1š.OA J9C}k‡K[ .;}H͇y–!†&ˆ~]30aL6T.LÆD«o     W§@‡‚LZ
c  #}¦ZIRz  L¶^
l9‚|‚c$‡*‡r‚j—.XSA‡cs9¶g‡‚.‡iƒ„b‚w¾$ Ÿ‚|(
1fE¦YJ‡lK‡hv¶\‡|Mƒ*—U‡gL"cQ†‡ˆ…;4EV
9‚%¦N„9m‰V0‚
¦
“‡‰WD7PK :WŽn‡w˜{ŒS˜D±NÕ]6…"2‚…]æi(¥'…'Šu' E™.ƒFšK‡S†Y\T…)ƒ:‡‡.ƒu®NKƒ4¥@Ž"‚:ˆg•GƒŒ‚ˆ‹ÂZ„¦Nƒ/`      PœU”W£r£s…/ƒ-7h,…)ˆ~š}b„¬…p‡„&m“uJ‚,„Œ'œi…"G?d„W”t†B‚N…O‡¸9Šu
„kx‚O†Fƒq„@(’Q•0Š(ˆf„    :ÁL‰q…!•/ƒœnT‚zŠ
¢MìS„>‰‰fœ4Ž÷8‡ƒw§
‚MC‡r+…26‡†P‡eJÒŸ KƒL'z‚/‚9c‡;‚ÎRN"O…Kƒ4$)R!3PEUP„e'킧‡`7u*
üTc§
JpMs‡i$PŸ!(‡=„2J
ƒ‡ƒ¶R)‡†:—
‡ƒuž6‡/‡fv-ifÆ1‚

&F—…d‡^MoQ"  8‚Ze‚†   selvlƒ`%¥@åN‚UÕ»^„b–6r‰HÉ" œA‡O–U˜7½7X‰‡†2§`@ƒ,›L„ÙJmŒT^œ-7n
>@
h=R‚AF
Se.‚CƒƒuN%5"i&H‚m‚?‚96ƒNF-Pg:5j3/o:‚p‚
Zb(LD;""7j.u/‚lM !iƒ2ƒu-xƒwx
(,'+/,K„N $7V%>5‚4O:YX‚9C/+G! 3/F5/<†%‚      ?‚c‚8?]9'o'„ˆS$_0|+BƒNM"9‚SY<…w4Hx4=$   ‚5
„c…Q‚1fSC‡‹lˆ6
-
!!ŸW˜€€€ƒh¿2ÓI #e!C[8QxX"2‚*"a#‚z/&a‚0qJ‚‚? ‚PƒM5%†sQT0;oIƒk‚GNr~f2‚]9IX.'3'#N)>WFB$‚Jr‚YQ
G‚#}
:h9
d‚nh+N*
$N`C\$:+e70.10E/7mZV>B(5<vƒ(

?,ƒ)7VZYS<‚F!
IlL
‚+!mf&
h$F[>&AAI[U#=@Iu..1N&%9*.
Doh#‚%XyK!f7!I
ƒj\(
;k$].-1R(
,!$‚x%fS‚1?c#P%Y,?H+|^U3+iN(G$/ƒv)K‚X?ƒM…4
U$Q‚86ƒ<>;u=(‚!
6"Z‚+ .&'5/F=^
M#m2|y{ƒs2a]‚V
‚"$‚crH+2$‚0zW&#:D%gN<      f ]„wL*YC|2")†ƒv2H‚'QP„",
<{ 4‚hgM!RqJ„ƒH‚O‚#/N‚Y*G8*‚1S…X (r&J!?z†TƒSHLˆp‚Arƒ<*d‚ /7
‚/c>27D]‡Pˆ8
g"&‚Gl‡„kƒWX‚o8‡C‚v(‚V‚…a‚S{„A‚5ˆ„;kƒ{‹uC…%‰9‚Sy„”
‚d‚†„
X4‚‰2ƒ<vx!…&+@†A‚/ƒv9‚(„Aˆ*&K*„Z†34ƒ8vxˆI"u7J=&ƒviƒK„5yŽG:XD]=V `
 $h=X‚69%L V?HlW1,6P
S‚
-'Z!94/A.JC[Kl"&0[=$TJ%‚O]
/6w‚
b]0)l(P‚~‚‚"\"&lB=qe‚3C‚-r"B‚#;ƒ-_8;5jF;-y5N‚&>`$++$Gz,6v‚P+1o‚8&2"N=‚/†\
‘f…;&‚
„g‚h‰!†<“M*…v1‚Hƒ       …G‡( C<‚H‚L"„p„C,‚‚-…q‚E‚h,Œ>‚@CŽ ‚NX…<‰c|‡FB„=iJVL ‚D7)‚@‚//‚(C‚kPe‚$^Z,4ƒ0tR)
/3R
ƒ<T7ƒ!„b6‚bh…d/MSf
rƒn†7‚“D
. „{„$>?ƒ:ƒ^‚f†‚u‚„q2&‚>}„pƒa/Hz‚+6†i*#""B ."„  x‚5#‡|…/‚FK„?+l…)ŠZ4ri7‚{'ˆQƒ_@‡6'…3ˆ7ƒ„Nƒ{ƒ‚#‡|`7‚4†„0ƒ=„|.T/;n‚|ƒ+ƒ.ƒ: „g[†"ˆ: t…
‚t|‚Eb,3)=`[&kJQ†uˆWJ‚c2‚I†U[T‚$„‚*.„G‹@1‡M*‚)a‡Sv‡-‚vY†7 „‚$…<#‚S0vH„ƒM1%ERhPƒ5ƒ„FƒE%6…-ƒ„ANGH0bR‚‚}e‚qQ]„*'+…=j*‰lƒ‚`†„Z@u# ƒf‚9zQƒk‚#‚M‡@Š&0R%‚Y‚)
6&&4gdƒG3
ƒoI‚?>‡f"&o\‚TX‚/ƒ[)qdIa||‚4ƒ‚c‚…:…%GVkH%‚TB‚

†;ƒ6ƒ+8…‚X„c3P….gU_„†J-ƒ‚]‚;/s…‚Zƒb„P‚"K‚-$†7ju!$%Fƒhƒƒ

~\
‚$ƒyv‚>2Ž&:7j…_‚‚
ƒ{„ba‰[…`„l8:ƒƒƒ"†…e‚t=f&E&0.‚A’”ƒ'ƒT…5T‚ ''
†.,B*„{= _4)<
~0‚!……k>‡V%~u‚‚zD‚'ƒWAi9‚#?.ƒB…6$‚‚K‚Fƒ„<I‚H!|qƒe'†r‚:Š Yo#t0ƒZ#‘}*‚}‚Xs…Nƒa‘^ƒ7T‚Jƒc‚+9ƒ231hz‚+‚P;‚6ƒ‰U~fl"QWHƒ7' ‰>|
ƒ/‚‚U‚uZAƒ)1;)‚Pƒ#[‚‚(PlKB
„ ‚aaj‚9Q
†4<ˆK„8l‹k$‚KAAC‚^iq-f^„Q‚ht#u!~qqyvƒJ‚qIƒ$ƒH0rw_OƒST2…TbˆNB‡
ƒKJV:3=‚/„Kz‡‡{u„Eu‚%"‚97ƒ7c4~Nƒ5%…pz
'ƒxm‚*F„Y&ˆQ*gƒj"ƒ1‚zDƒ,-†hPL
‚%„;Ž‚u‚iƒqNHl‚I‚!‚A‚e‚-4\‚]ƒg$Š@7X‚O„!R9‚27:#Cu)ƒ}HY„C„_ƒƒ‚/‡-"!‚a…)‚P‚o$        >f„xŠw†d‚z‹j†5"„†•wƒZV”8uŒ{[T‹0¯<(•n®V‡jƒEƒ„,‚‚(‚;†P'‚ %!8=NIdƒ%QT,‚iB‚;]Ecx‚I„d:‚C;x‚UE…"ƒ*1……W„3„~†Ei„Kˆ'‡mT?H,…†‚ƒ+‚7`%‡=&„3‚v8‚H‚*^ƒF…/x…d:…m‰A„H*‡%\$Y"‚B"-†7ƒ4M7V‚~}ˆRI)‚F4&Hr„Vƒ‚8cƒ5m4‚|(1?+‚d‚ƒnE‚„a‚C^$lLI~‚*$T‚
:F/x9…'„?pO;‚`+ L
*3B(-ƒU~B‚%Žöt‚O/NAt
G
s8*f1S
qX Or‡ZH!?z~ƒSH‚WH‚AL‡.‚p
‚o‚f'([
$HBA‚5‡;3Crh
yY      
5
‚$„
4‚„Pƒ<vx!„\+@M‚/y9„AT‡,‚
""ŸV˜€€€ƒi¿0ÌK*È
SZ…/‚<4v‡bG!*Lƒf„_:XD]=V `
 $h=X‚69%L V?HlW1,6P
S‚
-'Z!94/A.JC[Kl"&0[=$TJ%‚O]
/6w‚
b]0)l(P‚~‚‚"\"&lB=qe‚3C‚-r"B‚#;ƒ-_8;5jF;-y5N‚&>`$++$Gz,6v‚P+1o‚8&2"N7‡]b‡eh‚D
X‚h
„!
6<Q*‚     v1ƒ      …G‚| C<
‚L"‚K
,‚‚-
Dwh„*‚@Cƒy‚NX‚fƒV|‡F‡BxMi'V  D7)
~
%/5CVI ‡V
K^ ,—8D®‡i
}`o$>?‚ Eu2‡A}
@'/7+
8+6‡…),  *#""B ."ƒpx‚5#‡|…/8K„?&+l…)ŠZ4ri7~'ˆQƒ_L
'‚I&`.
4‚4!‚&g‡T
n‡g.+FŸ
§'U
Gv‡¶TA
RŸe
EQk‡d*'‡aM‡d(‚$l‚z—5Bƒ&#z$‚Z-‚Ÿ
‚dIY‡i
‚*"
M&oE‚TX‚ 
h)qR
b‡[Rƒ‚c‚(]
%Vk(%
B
uJ
38‚
h3ƒQhU_žr‡ƒ  u;
_Jv+-‡j      D4‡x‡g
;\®wa&:$jz(‚
ƒC\‡
‚uL‡]5ƒ4‚'Ex=f&E&0—5
/.Z‚4
$)
ƒ
ƒ<
‚!‡VNUX‚‡fp#0.#—B
ks 5u‚.T‚‡\‚)‚+9ƒ31z‚+p(‚6‚‚$~f7"
=H^o‡a&|
‚2//‚VU‚uZA‚Q1
h)g‚(P5KB
 4ja:cQ‡RU3„8l
„h$sAAC}^iq-f8p'#M!#qqyvƒ>!IU‡GI‡0

_MON]<}‡-TD
PBƒKJVS3=d‡Yl$zN7cc4~N=%…p&
'
‚mF&

*g4"P)h‚)hP|
ƒg
7_3¦#Q
‚/w"‡b
!i‡g‚‚Ps$       §vƒEƒ„,‡dz‡c
ƒ%' %!=:I‡IKQT,DB
|]E
!x^ƒ$O;@NE0
1

U3i—+‚ z?‡a#
ƒ?0sM

„&b3Z8o‚>
‚YU $
:<ˆ„H*‡%\$Y"w"-„
U4M
}I)‚4&)
Er„Arƒ‚8gp4)‚Y>8nFL
l"I^Np$2k     xvn5;=:+—JA
*3B
-0theorem†!
ƒ2Œ<Q
ƒ2t‚kB®‡     ¡b–¨‚Ý‚>”Rui‚ƒ\‡V
/‰,
¤+‰Yª>–\›k†M
›d
¥  •ÒmŸ'st‚„4•³‚&re^NX†_pR†LF_bXNdU.'„L„      ‚‚5B)‹‚x:|A†%!58!ƒv_Œ*„4ƒ<‚h\„ƒG‚M‚{Tu‚S…`9        [
ˆ
?$ƒ"[q‚    ‡:U‚$‚sP`g
s|t       LZ2PCF
QSs>^TD‚.
9J% )ƒ4.D`,c‚0ˆP……1=%&!†zyJSsƒ)‚‚?
Sdg?FƒI0‚ZoS‡Qi2NO`V‚@)Qs ‚LQƒW|ƒ-„‚6]#…S$ƒN„8OC‚‚lY‡`W[ƒ/.„j"WZƒ6Cˆ‘@‡„uƒƒ        ,…?L†&Œ‚Žq‡Š‰@`{….|…m„…x‚"
ƒ
Š9…-„*ƒj„t„Uƒ^‚n‚&Zƒb‡,„y
kƒ6‚gc$‚5‚O‚gŒk{    -|i†Š.‚…
…PƒY‚Sb"-„1„
‰9k…Q#ˆZ„`…WkE‚'Z]   Z„$†W^ƒT…>—p:c
!!ŸW˜€€€ƒj¿2    χ(M‚
‚
7„MbuŠƒI…g„„(ƒ@‚?f†…H˜W‚/65ŠXx‡i…G‹0…A…?L8‹$„a„ŒUy *4„wu.‚o‚cB%4V„‚#
‡‚Aƒ]C‚zˆLJ„~hƒ
‚‰<3‚[‰‚$‹2…†[‚Vƒv„R„£M.n‚)†#ˆ<„Ijƒ{K‚>‚;
J"ogƒ"‚- vˆ"Y‚tQƒ\X‚[‡:(mWƒ6y„(„d<‹}V,‚(ƒK—lˆfd“27‰l7‰ƒs…U
†^UA‚{Š.nŠThb$‚q‚|ˆ0‘)ˆ!‚sƒ>ƒ.‚a-„T†‚91ƒ$M‚3ƒ#?fs9…YB‚u‡k;r%F….‚uvƒO†\‚%/ƒ1        ‚^X)BO†ˆ'r(D‹
RƒB    m„E…Gƒ‚e?dƒ+Pk(C…dT_…&
†‚:^……      &…B‚†q„]xD)!
cd#^)†L†qƒ6…)|ƒ2T…Z…„Y‚.ƒ„
‚;‚H‡N4Y-¦;z
X-‡/Va>†Wƒ85‚\I„H…<=YBDB:B
‚P„B(Lg|‚Qv‰m‚&‚u‚bƒU%/Hm@…ƒ<rƒƒjƒn‚L)>‰$ƒc†Gƒ(Gx@„YX7`„T‚#‚EC‚{‚E‚/†q…sƒƒVƒ5‚CMƒ3‚R‚‚ƒ{†V>„a‚/=~EG
s‚E‚0‚       U\y6+‚Š'„Xz‡‚Nc
Q*ˆ[„jƒBcf„„=I&hp„;‚&†v‚„~‚
8„fF}!2
ZƒB‚"‹lƒ@,„
‚_o‚=K„$rf‰?‚KAJ‚_/‚<…Pn…Gƒk;1_„+5*,†AŠ1SHM)4„-‹(‰>ƒ„_ƒIF…{…_ƒWˆ       ‰Eu‚ˆ„kq@f‚h4ƒ}‰1B„B
‚-‚0eLjƒƒAŽj>‡[X[“E…fƒ/C4ƒD
7
‚r
…OMƒDT„Šw…:…    ƒTF0†‚8$vlJ‡_ƒhIN> ƒ$…
†`‚B‚1ƒ=Œp1aƒS…<f\ˆ q„QlƒTƒWˆ[ˆNRy
1“r4’lT… •b!‹‘‹0      Þ Ha‡KP‚„oQX-Rƒ6F…N…}‰‚C'’3†N…hŠu…T:‚"…vC‚-ŠT…(†<Œx‡6$#C‚ƒ[„wb‹'”E11ƒƒEl…S•„…L</ƒ‚d`ƒ ib‹?E‡<0|ƒ†(/‡93‚i‚‚*‚}m
;…,Žöu'Qs 9s‚|-^p]#‡[
„*JC‚"‚5‡`

7[‡g
ƒ-.t—7ƒ      ,-‚P—3
;L>jr
ƒ ‚ {
Q|FLR‚"
dˆN„*‚!ƒ8‚5‚n‚&ZK^‡0w‚A‡df|P>e!{        -|i†Š.‚…
…PƒY‚Sb"-„1„
‰9k…Q#ˆZ„`…WkE‚'Z]   Z„$†W^ƒTLC
‚4M‡\4c‡ftƒI…FK‚Sƒ@‚?f%‚
‚/6I‚:#‚ „+^0„j
‡c‡>
8U$‡]kƒP—8EB%4®mD‡i+Y);$—1‚
 _‡„F„=†[‚VƒvƒG…;Jn‚)W=
Kk‡Q7‡l>F: <‡ Y‚tL
I\X
6(ŸV§ /‡1U¶U[¶‚7P/UM‚3‚[?f—35‚L2k;iŸl‡hC
RB     mcN,1?‡Y8+Pk(C
T;\&
" ^s@&_‚x
2;/)!¦Z
ƒ4RL‡hR¾@g
‡Vw"xV`‡b."
\Itr=YBDB:B
xƒFn
‡.f] ‚U)!     ‡`„^I
\
/*ƒJŸa‚‚B}&hpX_„g‚ht8%‡[C!2
ZƒB‚"q‚s@„
‚_5‚=KJ
‚;r5ƒ^()‡_]/
#<ƒ\
'…ƒk;1"‚5*,T
+S
M‡R
B,ƒƒI
+…{„/S†@‡N@
‡gh'‚M~fI‡J2„B
(LeLjƒJ/¦[ -ke)%,1



W

ƒM‚>&‚6EU"¦@n5‚>‡/9
\S1\‡„u—5OxNƒNKP‚‡[%X‡k
-;‡;

‚C4y     fƒ=P+.—†4}‡‚M@$#C‚9‚F3&„yE11ƒƒEl…S    w
Z
;<
J/q{d
sƒ?tK[3
M3A7N   0thereaft@>“
›Sƒ—ëbi‰M™—?’r‰3„i    ‚+3ù‹L‚ׇ‡Q³3Æ&pÕ1for(n‚,#
†!I~ž1a
""ŸV˜€€€ƒk¿0Ç‹#‚ÂaÍG‰Xˆ)‚:<ƒu‹¦y§z‚TžJšD‚   ‚d‚M†      ‹"™ ¡§_ž;‹Ó¡i‡~—m     ŠMŽöwƒ7‡ý‰<aƒdü“*¾Î      QÓ‚Œsí‚>;‡†'Ÿ‚u¶Y!¦e¶W¾ G/®o0therein‚‘kof‚¿9‚,|A‡6ü†qupon‚“Vwith‚amal‚ŠI“؈gostat‚       se‚%‚ƒEƒ˜J
…'H"¤s&<t^7&ˆQ<.O*
4]
#"!96z
po&„Q0&Z‚{
‚
0ƒhw 
‚b(ƒh
'+'/K    #„2
„j‰I<‚T  ˆM
Ž`„{‚n9
ˆ2
z††@‘f‚c
ƒ6M…‚3B…d#_ƒB„M>Z„6†Š%”g³0ˆ\s…f’UƒLƒ%•<ˆS
4ƒD}Æb†Yb…jQ2.z†fˆ
‰¨n©‡*5•$„rƒ4‹t„†U‚f‹     ƒX„hFJD…UR‚/_ƒ9aS‚t"Vƒ„y…"…a8
‚ƒ5˜‰<‡=Œcˆf)-ƒoV4‡+VŠ"Nƒq‚'„50ƒ    ‹|Nˆ(
…<~Š0
‚@Z‹gjˆpq‡
™x†3T—("‡m‚~d3@XƒO‚dˆ,Š4@{{1*ŠE†  ‡l†JY%‚#2wTML
@‚‚„N0‡1
ˆL4‡F†`ŽF…cƒ
…
[‡9V:¡)<ƒaƒžy‚zŒ
…`v‰3ar|‚%ƒ|6‹'„p…E‚‡!‚6
&‚„‚3„q c.V—n.TŽ=‚1”ow‹žs‚‡ˆDˆP‚mYŒ/Wiap†Z*Š{‹q%gV‡/‚Œlv
X‹1ƒ^†jƒ^‚†]Kl >†w…5‹„L„b“U“„
H!
#” j^R†1Š&Œ-"†‡U^)S,ˆr¤Dƒ0
‚RŠ1ƒ@„w‹x˜X…T3‡%ŽIƒ?Y„
7‰U=‘:‚$
‹MQƒm„†Qƒl„=?V‚V ƒv®rŒ.ˆGø'·s’g
_Šq‰AI4…:†\p†Z$
Œ,‘5kŠ|V‹eP„ƒ=„‚+‚8$#5DA…8…L†Xˆw…k<ˆA8m),¦†$%ŠO‡h…1Œ
‚*
ŽD)~—U_„#-…?‚J‚„*L‚g‚L„(ƒŽöu}‚‡i5‡c
;MŸ8B1aMZLg‡eV„A       <‚(   O‹J
[s?)‚~‡
P‡i0bJ'‰NÆQLo-‡`6‡gyG      z‰!n‚.‚,„r‡Ao       }‡^‚f—‚J¶Vn
!‚t}‡h'ƒ‡d%‚ƒ5’k…*…*ŒcS)-
J\
0V0F$b(S
~VEÆK[X‡g
]‚õ4Ÿ[O
ŸUx‡U:x‡Yƒ:M
y:v
*ar.D
E6¦[Oo
0‡f]‡eu¶vH
.‡S‡hgS‡_PHRLgpK,S‡a2„\‚R‚‡i,—‚:
‚K„7„b‡†!‚M‚H!
‡ƒjƒ^R}
Iƒ‡@†J
)‚-,„®‡u„@V—)1P
‡%
&Ÿ6‡lQ‡B@b®e(…Zƒ]h‡e'
+†Z
&  ƒ
R
#—ƒ9‚+
.‚8‡i
?DAd#
l…‡Ti‡',—4%jTe;)\$27%E—
NJi‚
oí(
ƒ?iXgƒ
U6‚Z†43ƒƒp#ƒ<^yH‚~hB‚:‚BsW …>„3$‚k&‚TB"jw)>B8
9: ^‰S†M3‚)6^†.…R‡~†&…~„ d:n‚W) m(„k
ƒz\p~d&
_ˆ„3$An‚<ƒ[‚Fˆ<p!+1ƒ^Z
#-ƒo?7eQ‚g‚{m„<L{‚k„gf‚74*CYƒrƒh~ƒl4nHgTB.„>=y‚y>K‚
$„M‚M
C
\6j
|ƒ"
‚5E
L-G@ 0‚(-13#*9       =arg`&&$ (3%9        $0
‚4"
—L
!!ŸW˜€€€ƒl¿2Ó~#M:(7T?,".+#`:
0! ‚p
YW2v!6
P9)y#M
=eP@<        N
l(H

I)0-/‚3„i

‚6://‚<228,Q4
\;
„Tj?‚\m+ s
fEƒ_        
<~@$F/*!6G#[3‚a&„l:#
%
Z
/
#x5.aj*$Gr &
‚"    'O)kNF\!)‚*
2
`GKMS&‚=@!F2g 4‚       K/
WH7
2‚(^G
%$7$
)$‚P‡o
Vr:MDOQq
0_h„ƒVj6!<    )uI<= „;%„X
$ƒk\
6.+*‚1%7&3E;J‚-‚7u/dJDIA
A
O.A<               3   <c30.(\3@'ar.‚ oL>$>>#
.3T/*@ƒ-Xƒ6‚f‚V‚;Ci‚GiKl6q.ƒ-
`‚#htXzƒ.(P
#.U

Y'J'WvG(ƒz}*"/~ƒx49‚9[1
…?
=.‚ ‚+ƒ946;!m4‚54CUfYE
)Q")‚H‚J!#K5cƒhEN7,?$G:'\;55K3Cz+A-,#69.+92
UM$E'ƒ$ ƒx?*‚*‚J‚^‚‹‰8ƒsƒ‡<ƒ?‡}ƒE.D‚l%)/WD%#y‚‚(Hƒ?)‚{%b„V+UƒttzN‚7TM*#IA5]qUC+n„e1e!w;Ql+‚%"-‚„[0fJ‚#H'?0$X)…
u!B/‚!„i3H[rƒ6,4 ‚Cr
)[MV7RG4‚&ƒuWn_E<D|-y‚!cƒ
„~FbShj]‚th~!‚xl$92 B20Z‚X‚q~0*H%W„X
9f,d†$z‰B3&5u4.VCq5(zXqw‚P\,]c]11!#.‚H

U=64 D;OC$FIT
^_MyE1(,CFG <`#m-O^j
f@
#B8]Df6X'ORo#8~,TA87A<L41z*0n}yp*e
        *
2'?3,3P `4Ux4L6E<&p

ELl`%]x6:"PƒsW‚11~4D'H{‚eAz#2&%V‚i,1Z,
~MEQhƒ$_ƒ~‚!ƒv
#B‚io5}
       ƒBNHs(2D(,#`ƒ5!!%.A‚9„L|‚!'…,2ƒ5&"‚
Ak3U‚X) 0kNa‚8<ƒ/‚3…Jxj=2Ot        ‚lIƒ4…
~„I‚4'Fh$†..   )%!n‚y0ƒm5%ƒ .ƒc ƒ4vC1%>~V")[,!‚<ƒƒqn
'<M‚Mƒx…FE„)ez„1d„#<„kVEA=3#35=x>4$/W4    m0(>9}u <p:O‚bK_b!A84–D
‚
ƒ.bP9
{A:r^gq=>B2,"y„'13PXGfƒh‚8„KO!%h*]TZxN‚P"H.*/84
&0$&2!
fY)0®6~%0      D‡:#awW1‚myl      ;^‚wNF(.2ƒ‚EAFYƒ‚$4:rg=UDs-+pUh       vƒA-"d,/1b\K?L2Z…]@k(-!<YD )G#:\76) "Z>(3Y6i;|&U2
NiayQƒ+L7>&

#>L_)9'9Rk+%P    ""



+B%V)%%1 ?P7B             HB.  x{"
/=GF%@'"%63QC$]
S, G>
#1*&
#


!#&!. &       agJ?.,
'›.\ˆ‡52ƒ !‚'YZn %-t„E]tƒ|ƒƒ ƒ~‚aN‚~fƒ  "(.i-i<AV1;']-,$EG#J]%+c9n~‚jM
‚0,Wz‚(% ooB,ƒ'
ps^
4C_o
A:!!jQ0aƒrJ+c‚N;‚e‚x9‚@p‚Sm
!`‚8"t0#Q(<|k     E{O
:!YqjJY8=
08_2;0H,Cz;0/V%*@]26<6v‚inU:&`y)q,f‚1QX>"K$}'‚w
#(Kp5,
K‚8#o0 FWƒuV/kRE"k(‚jƒ ‚Go.&0uq3w‚>Wwsa„>ƒ6‚t#GY[ƒ.‚8
6"‚-n@ƒVpRsv‚5k!+
S‚K:…12%‚X.ƒd|[o20ƒ#Aƒ
1†sI5s:‚@
B

‚Q?/8
Am:v(5 ss6jG5Di"4$J'3EYSo‚dnx5+ X,T<L‚$‚:‚S./^ƒ‚/ƒlƒA:E‚B<‚eO*‚V5<x= B‚ ]‚1[ O:.L,33>/ƒ1
G4` 0‚MZCƒ)cd8-Wx?fC3B/3v‚oPv#Hqt2jcQ"1j,2~[\-1Q?
0
\+!I.&=PtF@{ >;1#
><Qu91ƒ]l4T&c*‚x0Y.Ia$
‚L,E‚%RD‚PI0u5*ƒl‚l
3
4eSBo8rBZId2)vL‚o&F‚I 7yqF‚]‚;alf@TG‚Y'v, CQXR[?.MO,FM:„_\†,KQ‚tZ".m3 ?
Dƒ`‚b(N‚Qƒ2„3‚gƒi‚.NƒSXbokgzLJB5*$+‚7Wsƒr!*
f‚‚}$ZHz„ S
!!ŸW˜€€€ƒm¿2Ó‚K†^393ƒ/sl„d"„#{
iKE`R^u
{‚S       '>wƒ#
‚"VDU.T'"v2zE4drcy†_„(ƒƒ?.Ff…pxLƒ
ƒ/-m‚hM-tg‚# %kK‚‚Q„iIH >…6=44-PJ+,R„(-.;UN‚E'ƒ2‚O'D;K/C
 
kXfD)<'Q2pS‚#j‚1?[LW#C„9$9!?*3C6"ƒW:!<$rd<Gu;‚,|7(NrNL#kW‚*,6HA$);oM@y# A(bD6(~a+        $Cq96;")ƒ^-7(?5-F>?7"2-;1(9u     )%^,-A'yQ|@a7^@9
:dF"*O68‚L„AlS‚8‚TD…6‚U>‚A_‚[…%ƒu6+ƒa]!L'/"0'P/`‚^†cW;ƒZ‚[‚ kƒ&dT!3xK L>F5ƒ\ƒ'$
T9nƒ‚U{X‚6M…;$?n+%"\‚^
„!K")M==H`]ƒ‰‚2<v‚T‚@Ip"lZxh&_ZBey=U>Gi?EyQD(2ƒjPz‚ 7y#‚f~&|kR".`E_C@gD9K7e>
"$InIeRP
*‚+}…QOU0Q4„z'w0‚A8‚unriL
N'6/9_ls*1i>]†$$‚,u4n=;<?<$`$@+‚8H?%7g‚3/ ?„P&}!"@c„4_2(o7=r†\<ƒKW‚#CS‚(‚DlˆC7,L6†U"4*,ƒC.
"L+‚Fb‚#@o‚'‚lLh‚eaV'!      ;l%S,+B0+ 5‚
zƒ-
eMD+‚+‚IVngƒ6Gƒ0>5
:ƒGg‚3‚,sƒ!)/ƒLG†„‚[c‚2ƒ o^ET‚|xBk$‚X„
‚}`/>F‚+IeKRCf+C[(‚?@ƒ
ƒƒpmR$A:\%2w‚J\SfF(2
%I}ƒD6)uƒr$„J(5 y<r‚_+9‚R
2iqP?
j
KW+
Xb
0?
5u+)
)DH$v-)f
a4-=V   w?#R#
++{>‚n$poƒx
"‚Ng4
Cg
 2!ƒ e*N?‚
'7I#n9]>:=
46##$3&"/!2[gy3;p,T‚S<laUƒw$:‚"k[<@
E„$5.
.-.K3
5/! ƒ7@,c^†-Z*A
x;U‚)G‚Um!Y„r;eƒ?K"~„5‚ƒ5P„pwƒ6<0
/bm‚i??‚,j‚l);=>‚*&m„  
<ƒ&‚ )‚;Z‚_ƒY0‚(t‚zPY=7‚'‰f3?]55+-]%6Q+ƒUq-†ƒ@B‚ucO-]„VZB(Rq„s?y9+;<-OG1a.5~+,7 0@?‘!„-‹h&‚‰f*7Q6 ?Ž1Œ;KA*7!“=4PeQnm#ŽSS2Q8K-*&ˆ~8/H†Lc$I‚n P24
‚a+=8  ~†?‚‚-    &&     l#X$X)
„jR†‚ˆj0"" sJ?M‚PD|Dsuc0}D%AT7)daU„{‚^m:A ](A^8(A_:8")@@‚kH‚"‚WBuƒ+D>o6g"=d
l1{D-…O9‚Uwr9" ‚:O8*BY†t‚        …&v&.4‚Q? =ƒ1-ƒ
ƒ;
PsN%$‚L0…n6D‚}C„‚„B~„…9‚*„ Œ=u„2ƒˆAa‡2Žj
‡.ƒQV3Gy28yvE‚*z‚=&A‚g!#%G‚f‚‚I<ExQ9fX:‚2qS1@XQ‚ ƒv;uw
+QN[VGW#x4K(Y,‚U(G'0‚]`…‚$+‚9F‚„R*"„""^ :2ƒ~
]$!       E^‚T‚j+!aŽöMf‚H‚;Cq Gl6q.6
D
`
#‡YtXz$'(P
#.U
7Y'J'WvG(yQ*"/
~‡_
09‚‡g7[1
[
=‡e,+
4"."92
UM$E'
 ?I‚^‚,l‚hƒ‡W'&
Z}
ZE%o/WD%# l>(H‚
 )2{%b7+U$
`zlJ7M*
A
]#‚
1e!wXQl+‚%"-)8‚y0fJ‚#H'?0$X)„i!B/rC3H4r&e6,4 ‚Cr
)[M
7R4       :Wn_E<‡)x-y'iD„~F|Sh{]‚C~!‚xl‡_42 rz01F
9b
de3„<3&5u4.VCq5(zXqw‚P\,]c]11!#.‚H

U=64 D;OC$FIT
^_MyE1(,CFG <`#m-O^j
f@
#B8]Df6X'ORo#8~,TA87A<L41z*0n}yp*e
        *
2'?3,3P `4Ux4L6E<&p

ELl`%]x6o
8A> #2&%*1,‡Z(~0EA‡b^
c‚#
#B'io5}
       
3N$cHs(2D(,#`0!!%.A‚
"‚!'"ƒr2ƒ5&"‚
Ak3U"‚A) 0kNa‚
<VWƒcxj=2Ot _%<`m‚4'Fh$.   )!E‚y0ƒm5%I.kc <4vC1%>~V")[,!‚‡AO(
'<D`[DEJ!
!
\
""ŸV˜€€€ƒn¿0ÒdŽ<ƒvW—5
!AX4–®o0¬k~%0    D‡‡!
hW1/=!    ;^2:^g=U‡fq-+JU "‚-",
1b
K-2Z‡^x@k(-!CYD )h#:\76) "Z>(3Y6i;|&U2
NiayQƒ+L72!&

#>L_)9'9H=k+%P       ""



+B%V)%%1 ?P7B             HB.  x{"
/=GF%@'%6RQC$]
S, G>
#1*&
#


!#&!. &       A,,?.,
'lh=5!6YB&b !%t6Jtƒ)2^(
N‡~‡e
s"0.i-UA>3<AV1;']-,$EG#J]%‡c)
t‡g*
n~‚U{‡‡eWQ5!% Pbt,Ÿp\$§
8(P"No.&0‡bHC#w¶T
,I
AO8Z
B
‡,?—2$@ '3E/ho8‡b
lx?‡fO
(T2
)@‡f<‚
.</^>6/—
:‚0Ju= B‚o
K]‚"- O:.L,33>Ÿ<Qu91,‡e
3-&c*=x0Y.
91$
‚L,
$‚
2R
z‚?G
ru&+C0‡W3&
4eSBo8rBZIMz)L
+F yq3SINK.TeeC

",
C
QX
R2.M,FM_\J-G".m3 žsO‡f
Lƒ:
<)g LU#‡03
03.sUC‡U #{‡f<
®oB)
i$
$"c=z 4d[cGI
P„("‚‡UDI;xL‚p/-‚0M-Z‡]b‚# %
KO\XI > =44-PJ+,R;-.;UN‚EeEO6I5:
 D‡XGK3
G+-a]!
Q/"`'J>F5#~=#
T9n‚}
X
‡[)<$$?n+%"\‚
H
"M!="]ƒ‡     —2
<G
D?*Q/(2
‚aPqc7y#  ~&|kR".$E_C@-D9K7e>

$I‡Z$5eRP
*‚+
I„\O;074‚'w0‚A‚uniLH-~_ls1)>`>„{
u‡n
;<?<$
%,@+‚8H?%7gz/ ?&}!"@kX
t(o]I4<
pWL#S
7D‡S*7,L6‚"4*V
,.
"L+‚Fbp@o‚'yLh‚e:'!        %
+#0‚
z-
e



       +
9‚I‡F!
Cg‡
GA05KBA‚qdz/G‡GV
‚[u‚2ƒ ^ET‚|qBk$
‚8‡\61L9
!\"fF(2
%IOfHr$„J(5y<d+
'‚R
s2T
Z
+
H;
 ?
5



H-
a

-=V*  w#R#
+
{>u
`o#
R     A4
!
!e?~X
7;#'!E&: 
46##$
      3žXQK‡g*
‚P„p3d‡a.
/3
z??j#Y+=>‡~m‚b
z‚t)—4./M%(ƒ.8/H†Lc$I‚n‡y24]
<+=‡d
1~‚L?W<    &&     #X$‡_&
‚R+‚R0" B7?cPD|DYu&0
CAE7)m Uƒ+5:A K(A^(A_:8")@@%H^X
w—

!!ŸW˜€€€ƒo¿2ÇH6—æs
Q"d
l1{D
O-ƒFw‡`
8" .O8*BF
‚    Cv
&.5
e =
ƒ -‚oƒ;
P
fN%‡TG‡f_DNRZ.
~ƒ5…9‚*„ ƒl„‚FCa
‚P
‚T
o3G^28*z&H
d!#{oIP#
XX:m$1@9Q9 "&u LQA
C-G?#^i4/(Y‡G*(2L^&‚O9F‚—7[0thin‚]5†Ø!‹.}ƒ•£!´P“Ug*
£pƒd
‹J‹n…Q   %$‚O61ƒƒ‡Ry0›t
E‡v`‚"ý#ˆlˆRšü
„e£XŒ$„U›]¨R…Cb8ƒGŽe†D”_ÆH
˜ddLZ`Ü]Œ–LŽ)«2ˆD†™I¤g¤nŠ„kƒ…J‚P,J°h’G
˜Bq’Z\Žž2±Uzš_”oƒ_¥gƒFu0‡WA$ŸwvìfP
Krü„gg Ÿ*Ú^D—=nK!¯Œƒ
—<,§®v_—y‡h=    ‡`G4®Ÿƒ®sÆ‚T‚\OŸ+†k…`
ƒbac…@‹o‹:‚m„K†   ˆp?b‰
•}„1Šw«        ƒz‡/]ƒ#„ÃW‰nŒŠ
Œn¢o‹
Šth‰fhs‡D„<AŒ   ˆ    „jˆiŽö~(~5ErŸ‚PDÆ,"
b-O‡Cl„wŸcÕw*ý‚IŸ¾ƒ@ùW
3t—ƒ‡ephss‡e+®m‡‚ÕpIÆ$Îrd‚j‚D
(
@o6.‚6g  uK
A-:)PAT‰%…`   
ZzQ
‹v‚w~=†o‚]]
_4
F@ƒ,ƒm M†z …7$ Ò ? ‚V‘E–-ƒ%
‰b)  ŠE

vK„V
“`
,‚N‹?f-
‚Ps·RŒ+W„pƒ{‰,
‚QƒQ”)7žX›„`™
C‡_¥CÈh†V‚†nƒfL‚3ˆ2µ‘mƒ0…$‡.W‚>š.‚DƒÀ"‚
ƒhžv†‚]ƒk‚O†DB«I†T—|ŽCƒc–|‘ªaŒs
ˆD
GŽö
W‡`vy =‡g"§2
 ?    ‚V†l]P[)Œ‚_—‚Y—D
‡‡‚K‚Zf-P‡gZOÂO݇r>S¦fbÖ‚T684
H‡DÕ&+
ƒ82Ÿ(F‡i‡b
Æ'a_7FZ4
ƒ"¦       ‚"‡fi

D+ƃ—ƒ\‡‚ZUB/Wr‡Kteen‚…,i‚bƒ\orough‚    
œ…h†l‘‰

se„D   ?ƒm‚ƒ`„nƒZ8uLŒ/†U1w‚\‹@%‚Iƒ"…_…5ƒG'…aŠƒzŒk(„
t
 +w\W
‡m^
‚c
N@

84Nw…t)‡.ˆ
‹>
|‚EŠnŒ:]
9ƒSŒ
‹A”:‹[‘'’U©r¤~Š_
bt…h¢T¬~¦m…c‚kˆx„>cLT‚3ŒP‰0ƒ‘Yƒ_Œ?›6ˆR
ˆ 
‚'†1…s‚Œ      Œ=‚%sƒ1R‚j‰ƒpNUV†aY"ƒz(.‚Q…)VŽbƒ{„>„w ™A•q„„(‰)ƒ’0—Y'f
”4&(‚z‡:‘)‹(•AƒU‰D‚c_‰c;™hYŽV6R=<6‚†P‘      †dˆs$‚1‡w‡      "‰bW’ƒ ‰‡4‡gˆl…œ}iŽoqŽc‚6J]N
‚h†R› „&‚=Œh‰Auf$Žy…Š^xƒm;•uejƒC‰.‚_=…*„8$ƒ„iƒ@<‚
Œ‚wƒq†:nŠ2‡c"U)‚JD‚!‘~†zˆWƒ3[ ’4Ffx„R†škb’=3Œ[&‹2’L‘"‚‚Y&…+=ƒP=’NŠU‚Lƒ>ŽKƒ0…/ˆ' @iž…Sd3„\†7ŠŠ)ŠP
>@ª,åJ
.”S…Œ†¤v—Xˆ*ƒk
Š       ‚Wˆ9ˆB ;[†Už;
‹n9fƒg‰›KYƒ1‹@Žö‚C‚jƒYP74Ÿ (r‡00ŒZ&‡0}
b‡do‚K“T¬~¦mJ1
vcDScs‚‚‚Y
…?@„0G„kƒ‡G

$
((ŸP˜€€€ƒp¿$¾ÿc
…e
‚'†1‡C
sm‡SL‚a1R—R¶V&ƒh;.5V—~P@‡N…„„(‰)n‘iN@    ‚|
A‚5‡d
>
⃗8zƒHŸo‡!
GW  y3‡‡.~ w-qÅ{K‡®sBƒy‡YX‚;‡*_fFc:~—‚—„mc‚5n‡‚J—S)‚     =
F†zƒL‡ZZ‚.‡J26‚x‡c+‚m
9h‡S
…B&b†  VŸ
o‚
O}'2‡=„]
‡‚I—‚P<‚
8J¦1‚Qa\‡M‡f§-‡‚‡kcs‡0ƒk
xžN5%^†[†U
‚3
0B—>0though
…dI…&„„''7S‚I„"[LP
/   -     e-'l‚KDS
ƒi‚5vƒ*–. ‚&$…<7Åh˜‡„w›!•4E…HIŒƒ]‚‚kˆe‹hÏ&K;qG‚r¡’)‰<yƒy‚`wš„*¡ˆQ„!s‡˜#ˆ%!
RŒ2ZZ‹&‚‰Ž‚]Šc‰Qp’&‘…
‡1C&QŽIƒ
]3„q

$T….‘3&˜Eh¯Zƒx+ˆ:ƒgŽvlˆF„`V‰T…+ŠˆP†vŠm’W—|œL…fl“N†[ktr      a„]†H<–Cƒ´5k…R–ŠI–¦m‰A±<˜G‡!_‡Y’@‘†<‚e“i¨°AŽ}†OqF–Z…i‚GƒX[Žöƒ
       /}Î3®F‡iv7…=„‚+‡H      „x‡LCÎC‡q"—0nB‡„|   _K;qGdF.Wƒy‚`¾=P§ÎŸ P6¾‚?Ÿ‡g\G‡aLq?ƒ)¶Æh      3Ÿ)Z—]ƒlƒZ—‚yŸ‡c
T‚w—t!‡‚k„|QN‡Ur‡i
L    §       ?‡        Ÿ)pJ¦T‡7®ƒM—^~—ƒ_m‡‚2X‡‡c‚E        %MIEU@‡R\tƒ|¤k$•7–
3ž4ˆ‘k¥‚†¬GH{‚¨hjŸ(bsand‘qŽ(l‚>˜A„#ˆƒíN-Pƒ/†       Ø_*8…      ”,
‡
‚tI4~‡5s
ˆq
œf0…-9†,ƒMf˜`„‡<žod„]¾…E…6       ’:…!Žþ„$—7R?®A‚;§*‡‚=ˆ‚„gô‡q       G(„"+*‚‘V¶UH‡mpý<ü|+        ‚i„.Ÿ
„4d¶¯@¦‚     åƒRr~Œ]‚¾9KBash‚b
oread"k„    O‚^$E‚‚\ ‚(d7d      -O
Vƒ~'%]\Z6
„ki
\†Fƒ
 ˆl*U
-     "G‰'…
ˆH G        ƒƒ†7†^=8.
‚+gƒ‡p† (@‚…'
í"[‹      ‚("$Y       M
cvXw;:&M9        ‘O…m    2†!    †N!%(„q–V”
&H
>
             Š~ h«‘L<4
“WBV!J
A‹0†%‚Yrd
P     PZ
   •2
,!  ÀV•#m„\ƒuµƒ7¢
!+XJ$‡E¬=’+)(‡H3onƒ^&ŠU„5†‚ ‰~Ž;
ƒ"ŽZžq“•{†~:dQ…(_%1.$d
h…Žö‚L=‚0gŸLz§
#@¯
V[ÝDHŸ AM9     ˆ   …m      2†!    „H!%(ƒc.#&¦h
>     ‚™‚,Ã&åW`¶GP7‡w!+X¦‡3$u‚K“z`‚C®bA "1.$h
HcleanupMÎ'‚Jù‰bsaf‚)‚  …1 ]     $‚s.8
9
wyN/†]‚Lˆ9%9‚       (
….R…ld"ž"+

9      
JŠ5
!&     %«L¦k‚f.
„U—?¾f°IŽY‚jø1R
dd" ƒv"+

9      ¶T
ÕyIƒ†Q
Ë+2m¦ƒxtest3‚„h‘‰ƒZ†O‰QLƒ&
ˆ*"‚
!!ŸW˜€€€ƒq¿2Ä0threat‚fir•ê
penƒƒ>e
‰
\”2šh†6
   v–"Œ3„P`<9„@"„ M=…5‚‡Pb>Mƒ6…b‹w™C…ƒ )‚ˆH‚v‚2                )‚

R
ƒSS/‡…=*„Fˆ!‰T!Ž;‚Œƒ‚`ƒ'JF„k†8H‡@“Z‡2ƒd„2Ib;ˆKH„=&~†"<x„5-\†`
‚CN•ZRÙž ‚‹t8m2Š#š
Ÿ1+ˆj£¥'‚‘}%Ž!†”&‚_‚uŒ=J„;—_‰D…p†wB„;9^‚B&†W        }‚%‡S/Š–u„¨/ˆAƒ*ƒk„$ ƒ@HZ
Œ1„v@…1(…<Q‚
“S†H–=n¡ƒlƒdu™8Šq¸#¢7„lbt‰'‹{†U
V7‚*¨O…9S–ÊdW›
m;O}s       f;“7.ŽU
k`…@Y‹4¯J‚¢w(‚jƒ‚tg‚
‚‚ŽözJ‡‚7—_$‡W‚=;y               )

R
ySj
(*‚l`h
3
P‚C‡‚\‡j
6JŸ"8‡h‡)‡2
vdIb;ƒdKH‚#=&~†"<„\*
üf*\
P 
T`‡L
2Ÿ‡q8‚™‡fa*!Hž~ŸL:o‡X+¶VH=‚f

D‡‚b‡a%9c^
‚
„A    
N
‡*/S‡W'
‚
 K

H—4
     H@Ÿ&:S—.‡‚!‡o2?P¶=‡a2Q
(‚.¦?¶Y)‡k'‡kg¶Z@ƒI
@(|
      ‚—  OtsholdBq‘[7<!…v0ŠT!¡,šG
‰v
ˆ'
’5ƒ_¢9ŽY8Ž÷^0G‚•9‘„ªY
tŒP
FzŒKt—N‡ŽY8ive‚3ough‚K“M
bŒ7„Ck‚%5…:
dM2Y‚  ; 
U)VE4)`
‘AF
d[ˆ>ƒ        …a…ë/5^œBˆ+ˆ’55’    ƒF
2>†VA‚C‚5+D8†
‚$†p7,ƒ1Dˆ}ˆ\:!y`%„N‹in„Hü\”R’no…&…Œ‚ šC•
ŸF †/q…K_ksN‚2%„Z”Z9˜W‹$ƒ)˜ƒx‚S‚h^…Vƒ…d†^‘m…?m…~{ƒ~–„ZŒ+ ‘x~‚’šC—B«;ƒ#Š‡'?Š7=•e…ƒO0=‚I‹I‚i‚0IWi‚4ƒU
¬a3+„%†> ŠOŽH=†`t;…tƒ&‡—’n
†*‰l…aŽ~™<”!Œ'
ƒ,qŒ9™)T‰Pt‡Q_‚H†<<=“#}•#.ƒOZ&ŒlY
Œ!4’D1*@/+”]J4A\
QM‡u„<„*ƒ¦F²/Nˆ@j«tZ„D‡wl…ƒK
ƒQ‚~o½H‰a/5ˆ"NH…s5’       ƒF
2>†VA‚C‚5+D8†
‚$†p7,ƒ1Dˆ}ˆ\:!y`%„N‹iG‡^)ˆƒh
c‡SASí‡i
‚ …“O`
j ;q
i_‡K?C‡KR
%]”5+‚Î#ƒ§
V‡n 
k‚l¶‡'Æ$~—
,‡;¶Sq‡h
 0i—‚e‚@8
—„g\‡‚=‡%3‡Y)—?P‡m
‚@ƒi=ƒS
k;¦‡aƒv¦kE‡i&‡q§‚¶ƒ!ƒ„QUD
<Nj‚QZ‚/
$:out‚      
‰dƒ!“©v®iwj
„768,Ÿ%|ƒª.£w•,‚¢<Ç&‚'jK„‹>…3J
ƒ?%ª/•SŸV…nƒ¥"Ý•`£w•,‚¢<ŸI‡[UJ*dQÕi
.%Ÿ$
•S`zù‚pŒNAÖ‚
nbNªU‰JŠT]–FŠX5Ü–$N9…Ö?@
†45ta‚ŒP“ª‚]u;…$5    ‡/<›?Tˆ#†T˜u‡<‡+•P}l.‚H‚t4qƒ
‚)xQT

fi„‚‚^‹xŠ|‡"‰.Š^„-nûI
ƒiF ›…WºXŠQ†8ƒ}Iòi%‘&‰j†J
slƒŠG˜@…’›,„…#JŸM‚lj‚OŠr‚G‚‰V…=›T™–D‚„

l‚l‰$¤3¿*ŒLˆq…!ˆ"‡Y†ƒf„0¤¨h‹oW‚X&ƒ/„(†b‰M)‡MŠ~Œ8-V‰?†J%…,/‹
CA†e‚_w¿XoW‰3‘)Œ!‚&ª3…ce™,”Z‹O‹!1WH
""ŸV˜€€€ƒr¿0¾ƒ‚Lƒb†oŽöygp
K‚b‡\xE_§
N
:ˆƒžx †6…WºXŠQ†8ƒ}‚"‡      ƒp‡„Ο!ŒM……0†>‚vý‚1¶Vf®E—ƒ]y—4T‚Ÿ„2‡‚4‡jW
D¶<?‡ej¾0C.§
mŸƒve¶QJƒJ‡„F}W‚C‡‚Q(‚"„†/z‡‚3BKŸ#‡mM§s§A‡?k4®pŠ{WƒO‡ƒRj4‚UŸ3„N®_,—‚(0thumb‰‚_Œ"
‘8‚m“‚\d΃»Nnail‚‚}mƒ
ì‡÷M
nderbird‚.ƒ
ƒ.kQsli‚ƒ9”a‰$   ŒE‘ÖT„Ù†'ÕqHÆ'@wart‚i      „Sœ‚-Œ/ƒ“P/A“Ñtx”8/Abibyt‚Ž8cket‚$„WŠ-7‚_‚[CC>4’1…ƒ*j‚~L†Dˆ‚;ƒX‹.[(†4N‹m*y‚Œ3[ˆ:18(‰e†£$‚9Š-7‚_‚[CC>„Ñr8(‡[:í„4l‚‚0‘˜‚-dal‚z”—ie‚B†F‰%“Ñ

Irþ=‹p¾bght‚‚v
Äe»'¥     øl ‡¡er‚bùost“¨¾5¾ƒ0[li~
‹r
‡:B©i½‰{Ú-
‚B†Ë—/me…L‚:‚U7,ˆ+E90‚N Š*d‡a 5%‚x…[X†„Ma
:   
.    E}\c  V
A=@!'oc
/_&
„rO‰?ˆ‚ƒM…
[‹bˆƒi‚ƒt†‰!ƒz4ƒ
C+‚#‚H‚23Uc        "H
,=/6
y< pN 3=YPte
{n‚‚Lwn‚+
S‚6„$
     x     
3i<   -ƒN,!‚‚>ˆQ6ˆ+
=T<
2zoq†]ƒg
‚?#l?…*ƒR
6Eƒ*ƒK
(z0„"ƒ'
ƒ‚-"J)}`‚/…*…~Q‚;Œw17…x
.gvP28hF…'†vŒ”
lƒO(…q^
>N3.H@ƒf      0‹h&.¦)˜@r‚Gˆd.‡|3žj…2•E‚a;v”#<G‚‚H‚;‚"‚V6†T6ƒ8‰F 5‹'‹i‹|L—'‰ „3„m‚(‚…q‰c„ ‚=(*‹S”J
—;‰-‚Y‘,
Vƒ‚&@‚

Zl#%        <PD‚H4oGo/,N+p‚b}+1/.‚?$NDƒu;‚p‡~Q°"†='i6?…\mˆ…„*…h‚<‚:P$ /‚,`VQ_"‚?,
=D‚B=- AFj#&8;T&U

R>
wƒ,&T{
E)R‚?.&$/B‚6FiM$<‚w‚},y!=
4/_<[GV‚G|‚D9
‚n‚&ƒm F9IVBE
v‚d‚&ƒ2p‚1,,…ˆuˆN]A‚5S„"A‚U–
d„2S
4%/+Kƒ\‚       
ƒH‚4GM…N
UH‡H„H‚S‚w
O‡Ÿ2š`x„~>>„>{ƒ~c3 >]@#*(#*()>iƒS‰]O‚(Dzd&Œ‚M      …C‚U…)‚,‚o‚
ƒ.+‚43#‚Gs†ƒ1ˆ‚w‚@Cl
Ge‚qƒn
@G3ƒP‚<#„QT„&‚L…D‰u„=‰              ƒƒ†8…+„<:   ƒ.H{„
1‡}‡KRy!‚(#| \XZ ZG‚Y…Kƒ‚1'‚TƒDƒV„^T=‚‰t…>‚)‚
:ƒ9‹E\/†~,T‰PŒ7†lOW‚W&f\    6%

%PW…> 
‚‚=WŒ$Q4‰S‚DVƒ
6Š)=„{†9†>‚r‚3,ˆ‰B‡8‰…P‡mƒJAS†\#‚Mƒp†…
EB„ (‚Lƒ,)…ƒe +‚4(‚‚J+‡ƒ5ƒYŠ24!‚.„‘NN       *>$"‚3D3„&‚ns„F†P‚"*[ƒ
U,/„X‚D‚    Q*…+…‚+„"#z‰^Š@’@Žr‚AŽ
‚#:BŒWƒ./# >‰QŠv<ƒw>f*›p‡ˆa‚&Ÿ|
~
?F‚ …(†’.‚%* eu…xˆiQ‚L\†_ˆY„J‡0ƒ‚%‚C‚„‚"‚%‡u‘ƒ!&GZZ
"‚2‚@1     d;‚7ƒm†
]<YY<6Z:…fƒ'ƒE<Q.Šg†O„C1>†„!k*rsF-‚{S4]ƒ!„/_A7?…Y
‡‚;¥µ„N†gƒ"Y
!
q"ƒ‹…ª„-’y‚IŒƒr<H†eƒ>


B=w$90b‚y}j/ƒTu
‚%F„‚b;8‚O‚‚>~;a}…ƒ#*‚tŽj—o®‡E$„‚}‡N
ƒy"9†=„W=+dC
…T0+†@[|‹AT.1ƒg)„…d
!<a$Žöxf_QlZ17‡Dg‡r‡hN‡>;4K
ƒv
8
N3.H@YM 0M&‡Ar[.‚)
ƒ33~„B)        :
=-'?
""ŸV˜€€€ƒs¿0»9ÀA‡)‚];v/<G‡;+P
X60‰&ŸV5‹'‹i‹|L—'‰ „3Lv+c‡]‡ƒCRSP
‚,
;ƒd‚Y
@‡ ή8‡j
'   66m—‚T‚P‡a*$ /‚,`-Q_"‚?,
^+D‚B=- AFj#&8;T&U

R>
wƒ,&T{
$#)R‚?.&$/T‚6FiM$<‚w‚},y!=
4/_<[GV@UG|‚D9
‚n‚&ƒm F9+E@6vH`
‚}\
(,,
U‚A`a(
A
‡C‡Š_LH‡eQ
4%+K‡gNn
cÆ<>‡lL{Æ)Y43#‡i"—‚{‡Sy‚7—4C
#TƒŸ1:  ‡fzK1‚r0Ri!#8    F

2 ‡XE<…Kƒf'V.D1&
7‚3wks/‚I¶*d6%

P‡dU‡‚‡e®pU
P4‡f
‚—3; ‡\
EB(K
b0 +
k?"JN  *3$‡^
#3n‚nUB
y"‡f#—:
C]zd#
j…P‚‡…†H‚AQG
‚#‡ƒ+?ƒ./# >k<T>f*‡_o…†Q‡G
|
‚ ‚
‡kn‚%—ƒC‡0
&‚%
x‚?~
&&GZ
"V‚17    
     2
&7V]=<6Z:žZ‡gpk-1S4]‚j„/‡es?

®psƒ"Y
!‡c
"‡‚C;‡cN‚   [—
„ 


B=w$0‡cpUj/‚&


%=#
%;Y‚OD#;n}ƒƒ#+‚


3\$„:[9%e+CI*,Mj‚-01;),9f     0timelessƒƒDinƒm’l>‚7
/,
*8v!x
#4I
Šla*gˆ_
‚Šn˜@:‚;‚=„A£<
/,
*8v!x
#4IÎ
‚2lVƒ-TpÝCÕz
e:³P+Yout‚h3r$
ˆ;"žEr¦k–×#õ„ur…7‚;
ƒ33
½.D¬s
Š4“Èd
‚(ƒŽXDôo
„~—Lstampubƒ`…mL52‘l‡8(u#‡™-ƒS„~¬C‚;¢f…(u#„ÙKÕ|Rõ5‚x„zon…I‡]^nijs‚>Ž#…ƒUñ7ŒQyintŒ'¶Rfp‚ÅLÐl^„ˆL…Þ‚Rltljv•j KR‡H„8Pú%%%8)"j(‚9ƒ#       ’f†N
ÀZŠpJ„Tƒ7ƒa—u‚-ˆ6® (†B)H 1LRUq8#½rB
ƒJ ¾1u8_P"(w%%%8)"j(‚9ƒ#ü–1P(„“t»kz
9žxƒPƒ.(휘šT._column‚¥    Ý;regist‚¤|Ý.t_uuid‚23‚[‚W??:£q2Œp3‚[‚W??:listƒ
mp›Ygž!*
–
Ž÷)†¤Y
3‚Ètdir‚\
ž•œ+noƒ
¶"+—Ì#+um‚5
†'’ëX

'o"L'\)/?4'\-FNsH#_#KO.%I1%!R&',$ U&,@2
,
& (
*":54!
H    O
4E

6 Y   '>p<  :G!:
3&Ffb-FX
:i'
\:]*G@82%<O
s9UrZ
K      
(71C+$%LZ"03M
UC0%]BL+KPm%r+>
5 
Z%lV=!F/]ƒQ8-&Ucg8/-H7x#       
b     #
%f‚3/%-2K>&Kg
a‚#"QV[       *$'nig'Oi9V'('*>+*
     )
1+S      C.,5(ET#F_N
O,IN(d
2U$w-;%ƒi(2z4$r ,     .       #]VNyƒyN46
8&'.;
+(&%
&G$2   Hk‚/

4M"
!dU(+H-q *8r161 
+-; &b

B H`k
l#    "VJ‚/H'‚;$<-S"I3"#2<0V
3}BNKz2/‚3A2
""ŸV˜€€€ƒt¿0
Òo3">
%l?O0!#Q
@04-?1 H'

(/
.GOJU1'\4? *#. Zi(
 *L$=*F&!Jw26\_
+4E9‚
~Ck$N YV H G!?F*%=K        7
        *              (?c2!5g B:
AtK":n@ g$0MA 
 $
*
1-#!&
&V>F#&;
   )l
       
"
        !hB[
&_'+
|&
, '

Y&. !$6Z
s 
7BF<$%)0a<FM       U'4O
 $<
7
\1


        !3
?+IE% 
-u        $

p"A8$
P(<P10'' 

F
1W5-6Q
l1BEq1
I0>h:+'G# 6"<
$
.
@ $ &%
A1&E +&$     

#

/D<3XH=.*D #(>*-`G!!/

q&V
!=; G
#{
9O

BV:#!+  &51GI
1(
&BM-p
T@
S     


uC
#
:0
 .#]S(*%
1;      
; *,8
84K-P
$
\7.:(7 
--:

t:      :"`S1J+
+
7K-D4M
        

&     
>6A2#/0      3HG+HHC;8O#&A5?"       
>+$R$U"q"0'2B#5<40D%.


 W/;i+l
$#-t5M
'
&E$"(4c      D(%$88*^;#!


4%D
Y1,3Y
B
 /,, g[
 ,>/$


E


,kZ
      ;" ,J:
"
/C

eM'
z!

      $*K;:*6$
                           #$1#
  7(

A%j+$        "

$      
,
#     \N8bS"
)#
05
       '
Y&$<"        
        *&#)0?
P"
$,
&-
dF&   
$3V
               (/"[&1KK)P7
       B     7      "B


    Q N,!, ,$ -+N       S>       1
%3
U]*>?8?"/%.IB)3
bXK

:/=(d
  #4./Tw!      W).#3 ]%6^X
'lW
2#"  $%(5
j=!J"jS'%-lK9%.
#
   29‚!


&:4?/
&
S
S#
$)%R
        
p
'    

 >9&      
%y:)*
"$.

EC
#u3

%^J5 0     X!
++    87    (
3>"

/)7"60--        *I.1   
"#90    /C('8R>.&X)1
b
9++‚0$/e%!3
  #F
O@Ub*)2<
!  
   
)
3%     "$?<   bb  "f#2;i#'?AD9@#
'
9A(W"!7     <{"p;OAr'Ca/v
'‚76
HlB
4!
'.(#F/48P8Z9ov,3$        [7A&HI&'3[,85
180:+A*,2"#+S/,#5‚>'%L+_>s){=,_/8+><63Q/C!B?v


.
4GB8`FC4


        #PP
X$!'9(@])R
1D'H%#0H5@<_       +[      T('
9%`(2O;(0%#
.n
    ((01>
              U'U:8
''.wN0%&V/M$
J3>&}Ji>‚&L‚*.!&N    #/'
S/1‚$3Cj+&        f
-1mGF)ˆ 
        ?7&
 " 3u1h‚2E"2s:{7O0;`27
 %F 74;
?#%0
6(.6!-    
;"(jG66S)
# ,M&.1
*
L,-+oC$JJ1_/&8$-9          
ln(      
7
%&        &
Kt<D

1/ V8!l
EAY:-[ 5/
#+,
Q
C=@'
84F*5B
$(  6,3~.1j%G      @-1"D1E;      

V%4>@O|\!       ,G>/%      fDn               &&                   [H+s


+@hFZ~%Z)5 

!"%]< ‚'Pc,.c;!P5!/=# X              

V<LM]

 _!
""ŸV˜€€€ƒu¿0Ò8
&6tUJ76.D%?d#(l9
+
M,,%#*9&9 
d7&

6:
8-A;!'V(1*"X        ,X^d,>%14
<+.-6<
(]<      I2*1<G40L@ˆ8 0.N/S8)`
       :a.^#+$             <0‰O
]PY.+3C"W5.
 '!
e*
:_
/
ab^Z    &7        LmL,!\$^11*$&#*zJ54U       m7
#: %
_vP$ZS1&I;
 'D8-;;#'
.2(    7" )<*~NPI
+;
#"
u

!58'"7Z#8A-@
R
3*r]y# -_
%^
 
#UN%&=!   +;u=-"5;8&U/GP
I
-.,A
 #1 
7% 
&1 
5!KP 1."$
4E
($..;2#>       (      ;
7G9>&
,!"V#,
!R,       E1)AD
m [9f:9$-n^
R'3"I
447#@>%R>B
+1K%VfBIL
>+3""L
26

 \,6("H:7%ˆoU`^‚t     
*l*:GR6+!#!F+
Fx=
6
        Q
            %5">(
2pl`‚
,8
G#ƒ03A;P
$ r
ƒ#+8%,CN
#jX:5D        *o 9'Sd ? '@\UXS 
'!E!
#8!VPQ8(KtL$-t"d$%#
        '58$ }p
>4#@D#!0$'Ml#@"".2;&%%4SAG,     &=/-?!.'#.7&<)9V0$L)&%3# 

A1K5w



_y&,  m
915@       @=+‚f#6
,7Eh  
9*    ;EPBAF71@`0>4)DQ)>w
Ba
MBd~/
1
&A7+;./.„rY+3‚-Z\<6>…&9-C|:l>d[=+N<(P        S
‚(>\%!T(      0#.   88MH
   ;   S             -

S

#4r#3\T&-&1
v+V   A)+(7<7`/D:&B&$&^>2JtG        Q&T
TWI@

[0\,c[
F       *3!F/
,.0z1
/b        ^"    -)      3Lg"'"'m> n<LT$Z        F8VJ,e%?
":[
-6
+#(C>        *Q4
+
       !39G8pR"8-&/"
b
?E\¬x#)X$‚}
7"M
NJB-
 7-L.U"$4<XG$"   8!&9T        53v
        +

Fb
0""    S0
Nb=X
;
R%A@"
*C
ow5"!$     H
.0
|
'
2C7!
$       !+##2
#)$NLL*jA,     
"K!


=  BR…L"J8A04?
)#x,H!y7A#VKv"
*j   fu       #D)A6      :AG59*`-C        #f)5DG]Ql73
I%M"
       3!@5]/i."C$
h#E,    3I+??S"&3%9(0(*"
_{-
94#$!Y*P06"A00)+$   Y%'
33/  "Y.1.;8$$%\WQ
c"%)740 $-/(;ƒ jOVZ5D3  U!
;"0 >.
/2'2
i/)m

,=;!
+
&+'Z8')3NrD2
       4*+
1
+

!_1;%-M+=K*T!65vDaz     $4376'&P$(       C0L?>,D;!&?A2\
!/7-"'#+0)B&4cr>>‚M
g(        "$      N'? "
$V08`.IR<C
$@OO2y+!%i

/V!  P

lj#;0sh4    !0$&&CDb *( C3G &R
0 ( 
E-    )}O+>_
FYr     *D-N
,t.<%
$S#…|B"O+%{H;,=3$-
/G32&8      
B+
. 81,2
6
3      K
, '1|/!

*1T-
I!


J     6fq+72$7
2#%
"?E
       :&
,8Xz)8

3#+>4vF 
 ;9H
+/(/    "    

BNf!    H
        "$F
)5WNQI<,%CACF$pA    Bp>J
        #&L D!^V%'5  
$      +[+ 
#&#  , BNH1#C"`+BX]$&)$&)8>Q        B,   &K*H(

h'6&#:!VZ z/
JjV
 &"RF#),$[) TI+ƒ  &S&            7
       (!D-3%+"/@Mf1I
%1#/CZ379,!2X     -7A,n5
-'!
 (5<#x,"#3W' 6B[+C&3
V,#9-c"F/5M:% vA:% v
E"$         8-/#     
‚ '

-  8T-E5
""ŸV˜€€€ƒv¿0Ò‚3
D=(\)*           ;$p$0l)
 :RQH#J
HC

"8
$$?<2$dg
TIF!&zhA.1M
-
ET`"
U ~.-GR.       !E" j;/4
?",!(P*I`43Q&.39M   3\)
0+CS

&%/6
.    1     
3Z-3x."+2#;l>.+MC\4%4~O/&',W
!"@7-W4")+CvAk5?C#DN;}

wGF/, wg*
71A1=>%<;1:d *q      ;*x* .J&vn/
J(.('p2D=eO L^dB;
/

9:D60!#
!T$ 7N5B
v)t":G   M{$1)9>(;)‚%9!
U6)8
E$0;g.36*7+.'#!A#vH7~k      'Rg)$'A
K/S<7
*
GH%\1#!  9@„r+/{
T
+      *4N
/#[g))'>#/IC*
$3'M- $# 'V
        ^&:"-)g
   ="
  7)4     Q4="   C80`A"/$6!gA

%.M1!+9 
7]1>(|)d    3z?)U>        S5 .K  
G-=>>+0,.
$oP6RZ89'E(**       P
$+u!%8 39#=*%6k9/bkP)d3r&        -!!'%r9,0_J]HzNaF(za
J%D#
        (!sM*      =2pd}G!J@
#{
\9/m6    
5RA>*

a+%
)*8
%!
0m    Pd&1>        R‚,m&%9 bqn^4$UKXs-AG(‚" V
/7:&1+)6607.lv6CUz,>o>
&!, //BIz%!
R‚2+ QJ- H)?49lRK
&b%
Oc' 
97#!5
=*F
H^IMB9,SY-
 

$3     :^..Px-?1y:01\
N
(*T
      G  $
       1
),B%x5m    FoH:=S)

'
B            (+G
       
        

-%w&‚w6

FtdN200‚;      
„A{,m „Pi6-$        
#%:cK
J
        !       )
†0d!,%+h
7W[        126.RJA  
(
&.$7"*w5HBMC ((+!,d&g\/

+4$2S3$
L,E43    :$2:&+1      9`2t 
Db      $O8@,7<

@ &e_
-%Y  ,)k6&)`z
'P!wL  :-
!|&Ec`1m! !]    ~Z<'              ,@R4?o3$:< 7382

M
1/    )4'/LUW
(CND).3 T<r   4Gn
h
,$b  &B
D
p2^)#wFI%ME*e9&;GA&\K    3#@ZH1ƒ!'2|H^A/
>
 S)_      )
8\
+&8!,

"m( R[Ic,pb("       6n@=+$~ 0N2( 208Fp13‚<
#
ArBJ!
3W1aS5%P
!!
'9#/%/'@



        .$%         "]


)       a0$U.s%B
(O&(G(s'i5! XE`/9cq        #!2{Bwp%(0K?;!UD5M"j%=#
Lj#/   ‚H4AL"5&j! K-(1[5c

          "(5J
@lz_X}X
:VL*e


%l68%g:]! ;,2,@
'-\Ni|e2)+`
'<R1&EqQ
UP#m‚ak|!XfD‚":.:7.$???5!]      
-e/yF$#5!@VFS"-%
U(0x+#w9NJ $,67&qP@F #+KS(
‚0: (
>     =-
       9?"(    1
#2iA#5s[6q"{C
17Y*Ef   6C
G1,?H
4{
Ld0]I3])

1$     
MF,
_6
#
G
n
*

"R9A!=%!%
'9*R        GQ[9K

F#+`FC
)

        :ƒ$";
GI-‚CP4R#`6o# _k%

gf%*J`q,+-c?F1
/-8QE"5G<g
-16^$&}5?C"
_,
&‚%[W
E&F R2
.&M<‚)e,!"I>#*P
Y!4"BC,'!,"QB„0H
‚/FNA4%C6:3%M';5‚5P/
N)
9h!=*
h8+?&M
:+I-6"5A
)}D (+)
uM,1K'yW^2#8/-1<


*;
')2
W
uhN2`+)OD%!y%
0" 
5"&4=}l6+| -U


<8"*X#            (

U(*$Cy
)
.&        #&M$V2
8@L
I‚
}geZ)         <2_%7M9$       H74   (U3$PI("@h
+O62
4=7T<
?dA,\$&& :4_E63%‚k%P"dwN   ;.HH%sV     QH
d#jK6(/;041        -
'&S(
""ŸV˜€€€ƒw¿0Ò,:?s%B‚qPNƒ*
6"&=0
cMM^

*‚N)+ 2    &'   22XBI\
#B
        $
+?     )F 37$ (%5:%|v77L'J


C
<\     2% H
6j= 5) 3>( 

S
           -&„* ‚`W*‚   A%
N&!M& Xh.LZ&M\} x1"Z
@E3%
;   $vfCkm+6)
        rR~IN!RE1
        2s    
]MGC@Q**n3;L
)93C6^A&#4        9Y'U`
n

(\U&]*
D':g'83*Os      'pP,+JeM&
AR)#         %
NH3P
B       /
n  0,
$W0       "*PQ" 
^          *@
 #ƒR#I(               
.7&

#!
  z;Q9/='
,!TE+;(F!
)

"N#3$
R'
2&        6
!    F&+‚g0*F]G%       @",5,D
K
1}}'
                     .
^
1$*'  '15!.T(5n@TzAr&.3
@{
J*(2‚.X
                4 j„R;
i<40x9D

GE97|,608# VUJ!
.Y
C@3@;!]<`v
O‚>H‚p %
k
3:l.'5   $(k!BH
)y  jU,&60(,es„>d"*7)*R#‡h
7‚
)
#*J#‚jy
]†J*
"ARC
yS%!…ep4,10:„f7P(8oX(C$    L
HKI#)D
KG
<0.%"6}
/,2HW>,}ƒ06;‹7M68/
!Š!.&X7)7      w$*‹#hC3,GE&;*M4“E0ŽDJŽ)[NT?<'K~)S„s%^       *)`IXD?9:90@W''':<-APmZ24{c1"~: >&
(
rd(3
.      Fj6
!G.+WV9'‚&
TI#:„tZb+'O4
S‚
3!X '#;  #d8
PO9H
/7@ <
X%6'
2
?      
\+M+'8I=j<*    -$

+/-W!
-
      9@1&\(+f9FW
#"#$
Z]        $'*].(H#2I 0/%gI-DZ   r!!G'7)#2H
1&(
 /
*]:2(8+     "6
.c=C 
9"d#(i9 b|K+.Nv"       l!=
#30P29      JY;ƒ2! PE#8
!     Z&@C0 /NI(@9<
!J7
 4%k#
_
U?&
$T#?G%/G7F8%:e+H"*:m%+(u>K
4B 

G K!6w "4y33„l

S_
‚Xe"B*F!'J5
Q|C  ?>!+F505#*K
b6
‚Lc
5,        $I17U  ‚K5:1t     p[Mf<*;
=lAZz2P6c:1m IZ
J ‚W-'+cq4fp 99L‚/ƒ2‚B ƒnN &=9]  H'
xlZc‚#Z4Q'NIF'+#_n*,mL)2?)%+-zA8'/B4d7)m
6H  ‚2   RG

61N
4E
\<:%%V/A
K)9,
:‚4     C=      +")J(M5z3?5R7
%#K!?)qC?& 6
)Q9
        %       2gV   0S=#
s
3D`Cu#z5      7H    '/
m7,`,5&:S-R!,!O;/1
       ,}F075cW@&!L4@?()P$!d!k$E`8

#),"G
$(,(
R [i7"
FEP;
3r!.,-   P    Z1g7Žös"/e%!73
      #F
/@Ub*)2N 
!      
   
)
3%     $<   >N  "U#2i&  #'?AD9@J!#
'
9AW"!      <‡Y      {"p;+Ah'Ca/j
'‚76
H#B
4!'.(#F8P8Z9o[‡_3$        [7A&‡gI&'3[,85
180‡)
m*,
#S/,5I0 8;(0%#
.n
&       ((1:
              U'U    :3Hs0G$V/M$
J3>aJO>>L
.!&&N       #/'
H/1$3CW&   
-1mGF
‡U> 
        ?7&
 " 3[(h!"uL:7O0;` ,27
 
4 7
;
.,#%0
6(
6!      
;"jG66G)
# 
M.1
9
L,-+o.$JJ1_&8$y"*           
ln  

%&   &
K<D

1/V8l

Y:-[      ,/
#+


""ŸV˜€€€ƒx¿0Ò
ÀZ=@'
8HF*5B
$(  6,32.1j%G  @-1"        1E;    

VV 4>@O|\!   ,G>/%      f*       n                     &&                   [H+


+@hFZ(V%Z)5   

!"]<o,‚'Pc,.c;!P5/=#               
9L,

 _!8
&6‡) QJ76.D%
?dG(lJ
+
M,,%#*9&"d 
d7"

6:
        8-A;!'(1*"X ,X^‡'>R4
.6<
<       225 ./+8)`
  :\.#
$             <!ˆeO
‡HAPY.+3C"W5.
 '!
e*
:_
/
ab^Z    &7        LmL,!\$^11*$&#*zJ54U       m7
#: %
_vP$ZS1&I;
 'D8-;;#'
.2(    7" )<*~NPI
+;
#"
u

!58'"7Z#8A-@
R
3*r]y# -_
%^
 
#UN%&=!   +;u=-"5;8&U/GP
I
-.,A
 #1 
7% 
&1 
5!KP 1."$
4E
($..;2#>       (      ;
7G9>&
,!"V#,
!G

:'3".
4
7@'%A
1B
+1K%VfIL
>+
3"",

2‡Y

u \,6(:

‡b

o
U
Q^zt     
*l&v:GR6+!#!.=+
Fx=
6
        (
                %5>(
20Zl`‚
,8
Gƒ03AP
 r
,+8%,CN
#jX:5BOD     *o 9'Sd ?.'@\UXS 
'.E!
#8!
PQ8KtL$-L t"d$%#
        '58$ }p
>4#    D!$'M
#"".2;&%%4S"G,   &=/-P%!.'#.7&<)9V0$L)$%3# 

    1K5


0
_y&,  m
915@       @+?#6
,-
h     
9^        ;EPBAF71@`0>4)DQ)>w
Ba
MBd‡>#/
N}
A7+
r.Y+3b0\6<9-C|l‡S[=+N(P %
!—R&$&^>2J®?\¬g#)X$‚}‡f
"M
NJB-
 7!Z
."$L )G$"        8!&9  $BA

w1"!$        H
‡f0
|
"
2C7!
$       
!$#2
#$NLL*KA,
"K


=    
-R‡]6J8A04?
)#(,H!y7A#
QKv"
*j   fu       #D)A6      :AG59*`-C        #f)5DG]Fl73
I%M"
X-!@5]/i."C$
h#E,   3I+??S"&3%9(0(*"
_{-
94#!$*P06"A00)+$        Y%'
33/  "Y.1.;8$$%\WQ
c")74

* $-/(;G\OVZ5D3     J!
";"$0 >.
/2

->/)m

,=; 
+
&
'Z/'
SNrD
  4*+

+

!
H_(;%-M+=K*H!'>/ z    $4376'&
P$(  C0‡C2?>,4;!‡f   &?A2\
!/$-   
s'4
#+0)B&4cr>>‚M‡c/(  "$      ‡'      "
   V08`.B‡RC
$‡O2
!%Q?


V     Ÿt.<

§

QI),%C

CF$p9 B>        
        #L ‡aPV'*       
$      +[+ 
#&
s#    ¶S

_;"
     +/  
&‚'

-      ‡/T
-5—HC

8
$$
&<&‡b"dg
TI‡g&zhA.1M

ET‡ 

8 b.-G!.     !E"" j;/4
"—1)

08
""ŸV˜€€€ƒy¿0Ò3S

&%“œ*6
.      1     
3J
>       +M\4%4~/&', 
!"8@7-W4ŸA  $9{$1)9>e;
‡e$9!
86)8
$0;g.6*7$+.'#!A#vH7~_  'R[)$'A

K/
S7
*
G
0\1#!       9)‡W)/D)
T
+      *4N
/#[g))'/H*$3'--    $#'V"^&:
-)
        =
"
 
)
24    Z4"
       
C
06"/$6$gA

%.M 1!+ 
)]1>(N)
        3z.)U>S5,.K      
G-=>"+
0,.
$
P6%A)9'E*žq
F8‡f     aF(za
B
D
        !s*  =.W
9 ‡d    qL$UCQ(A;(=" I
//‡U$a+)66‡07.®o
0+
 Q
@- )?
9aRK
&N%
'c& 
97#!5
=*FmH
&5IMB9,SY-
 

$$ :^..Px-?12:17
N
(*‡U      /      $
       
),%x5          FoH:=      <

'
B            (+G8

       
        

-%R‡]‚t6
8
Fg
N000‚;  
f-{,m „P6<$  
#%:cK
J
        !       )
E  &
"
=
.'^)#E9%*

& +'&!'   3#‡SH!'2T
HPA
/
>F4(" 6 #@=+$& 0N( 208Fp13Jq
i5! XE
$/c     !2{

Bp%(0       ?;!UD5"j%(#
CL‡\/       
X,J"5&Y. K-(1[c

            "(HvX
VL*e"

%l68%&g:]! ;,2,‡e

'\Ni|e+2)
`
'<—3        :.<:7.$6q?5!7        
e/JF$#5@VFD"-%
<(0x+#w9NJ$,6*0qP@F #+K-(
‡Z9 h(
> =-
       9?"(    1
#2iA#5s[&#q"{C
17EnEf      6C
B1,?H
4{
Ld0]I32C)

1$     
MF
_*    

"8*9A!=%!%

'9R               G6[9K

F+`2
)

        :‡^ ;
,Ii
0CB4R#`6o. _k%

gf%*J`q,$ -c?F1
/-QE0
5G<g
-16^        &}5C"
_,

[W
E&FR2
.&M<‚) ,!"I>#*P Y!4"!C,
7,"D'‡N
F

BF
$4%C*:.&%M';5‚5/
N2
9h!=*
h8+
p?M

+ -6"5A
2)}D  (+,
uM,1K'yW^2#J8/-1<


*;
')2
W
6NN2`
+)O1%!Z%

"        
"&&}l6+| -"


<8"*
$#        






N($Cy
)
‡E&       #
M$;2
‡f@
I}e)           <22K
H
7(U3Mf
+O
2
47T<
‡A,#$
& !45E3
%‚_
j%E""wN  ;.HH%sI   8H
d#jK6(/;041    
'&S‡X
*y
:i?%BK   A LJ>

C
<\     2% H


!!ŸW˜€€€ƒz¿2Ë=      –ÊY) 3H* ‚`W*NA%
&$M!M&   J.LZ&
M*]        
1("Z


E&%
S;        $e
9+
9!E rR
o|IN!9E1
        2W        
]?C@Q*#Z3; 
)93C6^+&#4        
.<`
2


D(
&N*
D':T'(
#3*s  ')!,'
5&&
AžW,
((5
W@T‡f
Ar&.
@
J*(2‚."%
                4 j„R
2
L<4"‡a9D

E9/|,68#     =UJ

Y;@3@;!]‡\Zv
O
‚H      %


X—5F!(,eM(vw%^      *)`IXD?9:90@W''':<-APmZ24{c1"~‡ &

rI(3

F‡c4d
!G.WNqV9',~
&I#:‡`Zb+'O4
S‚
3
MX
 :#;       #d8
PO9H
/-@     <
'%6'
"
?      
\+(+'8;=<*  -(

+/-W!
-     9@1&\(f9W#"$
Z]   '*
.(H2I 0/%!I]       r!!G'7  #2H

&() 
**  2(8  ")
.c
C—
i9L6K+.Nv"    l!
#30P:K29       
      J;j‡`" PE#8
2 Z&@C0 /NI

29+
!J
 4%7#


2&
T#?G(/G7F8%:,+H""*:B%+(uBK
4B 

G K!6  "4‡Sw
33‡

S_
#P"*!'J

;VC    9!+F#D
#"K
*6
jzLc
5, $I17U  ‚K5:1t     p[Mf<*;K
=l+Pz2P&c:1 9
J 
‚!n'+c
4f
p 9L‚/bZ 4N &=9]        H'
x!c‚#P4
'=F'+#Pn
A8'/B4d)Y
6H  W        R %


$1IC $!")J(5>?R7
%K!,)q??
 6 
)Q $
        %       2gV   ;=
#
!
3:3u &
  7     '

",`,‡3!-R{:075PW@&!L'P$$!d!k$E`—7
1r!0todai‚.!†r
6LØ\…a=‚=—Ì,No‚Ão”*‡Wܯ!ˆ®qgethƒA
l…2…!m ƒ\ƒ$T
„)ŒX.¿Tn`D…&
„E-E‡•E5ˆsB¶ˆi©ƒ-s#G†‚M˜#„X¨©(
²‚YœN—’™‡’L…Y…^Š!†T ‡s¿t‰TŒg„'‚‹7ƒ<‰'“#‚2‹Z†M’Ž}F¦f‰~Õ
—e›/ƒ]„3F½BnD
$  ‚b<

„5®hA„h†z

#sü…&Œuj
ùcjÕzj3„]?‡J[
‡J
q‚Jƒ@»=X¦s
y†M‡pC‡¾g?Ÿ`[
uƒ]Ÿ}:gl‚ªB¶"•ÚQýik1‚ÿe{_ý{_en    
g.‚T
‰
V
BGi„ˆR‚\ 2##6Kaƒ
‚P
     8Q,

]
6

       1>1
;


5


)*!\†QG#ƒ   „Z„)‚‰9<‰2

R
Q

$,!
1      $(2#!.    -G
!
>+!G9
W     O‚GtV(/G`‚G@‡O‚~‡&B$ƒ‚Z
t&`aƒP?…


        
ˆD‡h(6 /Ž,…-3L/5"      %Š1ŠW O–k;&„; 
!!ŸW˜€€€ƒ{¿2Š´‚*=
             Š{*‚v‚%=„s‡nW7       
4*,.  4:#
2   
       3
D),
$*e>B*             6&   
ƒT‚U‹!4‚
‘F°u’o6‚.
ˆU
†)>
¯.<      ˆ& ‚
        
Ô,½=     2!#
KZ
r
D
 8%

],
6

2         1>1
;
(
5

 )*!\G#cn

[<   

X
Q

$,!
1      $(2#!.    -BG
!
>+!G9
W     O
‚,'V(/G‚
j@D‚d
%B$
Q
t&`¶‡h
.?*~

        

ƒ#‚"6  /,,-3L/5"        %
‡i1
…X*O‚*=
             „p*‚v‚J6nW7    
4*,.  4:#
2   
       3
D).
$*e>4
*         6&   
‚MT‚U
4ÝB
EFŸ†L<Œ3
R.‚Ïx)>Î
Æ(P     ¾:&Óƒ
0tokenchar~žJ ùH>
8)"… ¾:‚Q¾P‡j>
8)"y
izer_modul‚ã™J&<ýpcJ&<s1‚
€2ýl2‚
€Eýldª
‚.‡JÂ7™h‚M…ƒO†K”‚C“Ø…h*W‚‘ƒ*œ$”E
5er#k  -<Žjâ”Õ2oc‚‡\£…>wz
 Gmbstonú_¾‚ne‚‚ÎWi‚"”Õ o:ƒB¥TŽ]
‚[K‡›!›sˆP“EÙk„;Eˆ0‡Y’'’C•@ˆ
…/Œ4ƒX¡Hƒ.ˆ†9’A
’*‹*„£b—k
Ä[½{<„\‰ƒs…
È›_Ž}§=Š;Ž4†+
ŠŽöƒx¾‚6‡(ƒ5V®‚)„ebƒ-—783¶c/—7|‡`‰Mˆ=¾@
     Ë^§
/Ÿ‚#†‚$Æ¶N!‚}Ÿƒw‡}
…Ý%q¦S΃WŸ+$Jbign‡jU2†71‰„u       ƒxø‘(†¼ikˆI‚ƒ4ƒY©e™û‚§
;‡÷c1l-s%

¿:†¬k‰tR4wd”P…<     O†>ƒk‚l%BY†C
‰
<ƒdˆ7ƒ%"‚ƒƒ.<…8ƒs‚•[
‰B;‚q‚-‡ƒ„ƒ&ƒk›)2V‹T…½ƒ»•
fRB„‡4dÝc?‡d
‚l%9å
®‚aÚb—6OÎ_CÝYS¶VY‡‚G
O%'Æ‚k2V   Sbar‚‚;oxƒ‘q—ÄX@chainƒ•K—ãs2p
ƒ)
…,…=M†
ƒg"„
†‰…P†e9…G4
„wi
ˆ93ƒb#ƒ[4„cØ~Žœ
!‚-+ˆ/‰        t™f        „kW.ONI‘,—"
ŠaY
ƒSˆ
RŒ;„8VV+…[˜Mz‹…”U™H‚‘A…y      
‰,PŽþ(#‚4ƒzÝÄ0ƒ_—B&
!‚-+ƒ¥‚R§
F     

k?.OÆ,¾L  ¶M
‚—3
EÚ„y¾…¾Aic‚#H
ƒC(œ8A
…x“Ð[ƒûelevel‚…P…/•ºrnƒ†dJ!vald‚˜wss‚‡-tal‡'N6r.3LbV9[
‚+K‡S6†wJP4µiªM‚ V\…1†MTŽ&BaŒ 
‚Y'×}ž!º|ˆ†-¼\Šn…[‡D‚„->(>(>,6$:#:$6$:#:$6$:"6#:#:#:#:$6$:#:$>,H+H,>,H*>+H+H+H,6$:#:$6$:#:$6$:#:$4$8"4#8#8$>,H*>+H+H+H+H+H+H+H(: : :d+B1&lJaR—bŒqw
’k£„<—t†h…NŠ
W!‚I”\™n-E“9 N…y
‡pœpÀPƒ

’‹W™„v}$ƒe&…ˆlš
ieM"ŠZŽþ…2O
JP¯
‚‚)>V\…1
ƒT
]B5‡2
‚U'—AÃ/ž!Ÿ%‚4ˆ
ƒ`
ƒ
ÕW‚‚b>(>(>,6$:#:$6$:#:$6$:"6#:#:#:#:$6$:#:$>,H+H,>,H*>+H+H+H,6$:#:$6$:#:$6$:#:$4$8"4#8#8$>,H*>+H+H+H+H+H+H+H(: : :d+B1&lJaR§    ‹ocM
iõxÒB
?!„gD‚gígŸ…v¾<
§-C¦[
‡5åHp‡
ƒSc$3ŽF
ieM"_chang†!•'…"‚tiI*?-
‘V+…  —È!‡{F.e%„<Cƒƒ32
‡
""ŸV˜€€€ƒ|¿0°‚‚î
n
–<,½`!/¾‚A†Ûi,0total_changes64–buch:ƒ@=-F”uš/“Ø?y‚ward‡G‚[C‚F|       œQÉM£
‡~}gWµ¶P     “qT       ‰u„‡~
™

…Nˆ:“‚D……z‚    ‘
XI
¦BÀ5ŽþƒxÆ‚*—8´£
‡~}gWŸƒ!Õ[NÆ,‚‚(¶m
‡ƒlEœ8‡í-Æ‚aËypc‚c2‡x  ,
5‚Bƒ    v(\
,ŒF•ÒZ  ,5‚B
‚pp8(\
,‰%rƒÌ2
—Ì[
_tr‚ö,ý
„Nace'.SJB+Á&©Sª@»?‹Ý¬Xœ†eeP‚ˆ
B6 O7…
 |]   A&Á!‹Ù'rƒgŽC‚#Æ$‹z¶&‡k•j$‚_ŠÄYv;‚NW‹*ÜM¬SÅœ Qƒžz‚À`+Hkô…HÍ&_clos‚7profilZ5row‚
size_limitee4©7ø†I†…„tmt
qv2e
E6
     QA`… S‚+i‚=    í)       k~5ƒr…Y„I†5Š    >‚M‡‚>†wª'›PƒA†p,
‡M•
¸   ƒ;ƒ.(È[†_†y
‰l…{
!‰o„†‹f…sˆ2^_0:   #!A/,5C!7"&;h‰M
U„F…2 4?f!š¨$„HˆZ‚U
†3ˆn’NLÎ ‹‡U=+’
…;P‚<–Õx'‚‡\;„Y…c†w˜G]9>+:(K®lõ=‚¨p+  
‡[A§mn®*$
ˆ2‡_8%0:        #!A/,5C!7"&;h…)
U
‚SFƒe 4?f!ý&®U`å‚

ILd}Ÿ
=+—tPartist‚dHd8d
M*"% Œ4>„…vqh0•Ú>"*8d
M*"% …3>‚Xƒjqh0id‚d(`8UR„#…v qf!•Ú>&8U‡‚Tƒf qf!ndex‚”C•Ú‡nam‚d4b8TC_Œ„#…vqg •Ú>(8TC_‡‚Vƒhqg de‚‹!ƒO‚Z%‚r(ˆd“
˜šK?mark‚}ˆ]
‡`! offŽDa±%‚0Ž÷   ƒ}itˆwƒ@‚\ZK‡k
ŠQƒ/r‡    …ŒqK   ‰4Ã$<{±BŠ$Ž÷
‚ZZ—:§{
í+C‚ß3Õs[¾JEÒnzŸyÃ,ŸKion’W‚„H“Ø‚fffic‚I<yƒcT4°4
‡‚W:‘‰7?Ÿ
‚nil„Gž·„Gd¢/  ƒ"
Éqw(k‹!xµ      ‡ƒ7CdPÅ]†´&eŒ‡cQn‚‹o‚t‚…í"nsact  „U< s  >;„d{bZ.*  .       -

 0$
‚$     


,+ 
      ,w'+‰^e‚‚ƒL

77
<
   
A


:S
&kW‚L$
%Y„>    

z&`‚W9xIŠ_?'!!u$$-u„=
=%8N/%\3r!S ‚]C+ZL‚nƒXƒ,Q9~&

 2…‡*„u  T
#¾j:‹>¯,"‚4E     X>…'Œ]‡ZœU%¯N™\‡     
#!
‡
&Á[
nd‡?#œeƒt]w     7V)
C
ƒ D‰+"3¢Pr…^•9‚J&      @S ¸p”\ƒk‘@
‚F„3…qƒD‰0FQpdg)‚8Q‚k       !2‚FR
‹Œ!%       %>7`ar #*E"‚D?‚$ˆV'3?v0=3/T…<S%CDC%…@1Œ/‚c8A      @‹$«,
O
R(ŠD‹<‡      „c‹‚ksƒ/JL#<06Ig"<$H020ƒl ^>†Y‰qLŠ,R>‚X#>%TDƒ6Th1%WŠM+
ƒk3,`‹Oˆ*‰Z+c.-'|ŠÊo%/]2Bˆ3*‚‡V‚,‹ƒCƒo‚W&‚}T‹4†-/‰11„hŒ{
6a#x$„F•d5
       …+7
ƒxh^†)v…2v     O…o‚"“‹z…4]‹,'=—t=¢q=.†b "‚/†B#M9‚I‰QL+…D
aN6(ƒ;ˆ‰
É46
H4YY{$3w…
5‚*
"@ƒ!B2Š4ƒ+F‡‚&…'Žöy1r!J     ‚]C+ZLl*MQ9~&

 Æ;:H‚P‡7|‡i{              K‚
‡6…œU%¯N™\‡    
#!
Ÿ%‰
nd†#T4]í
A
‚0i‚W"‚krŸ3Õx'Ú]R
5!:‚ NOk3
-„2b>K'"U&;x
""ŸV˜€€€ƒ}¿0»“ÛEI       %>XH[r
F##"

"
?$/*V'>v=3/(S%CDCm%<Â~J#>%TDTh1
W‡^w®s‡‚0l+c.-'W‚0Ÿ
%V‡F0
@
‡fM2ƒC'‚W&‚E¦
$/
1p
6a#x8Q5
       ¦Mf¶^,n "‚/†B#M®m…1L+D
a—4‚Lr
7 6
H4YY{$*V

\#ž      BB0h*&—`   0transferŠ-k%… ƒgNF‚)
Ä@ÆDn`, ‹u„"ƒ"‚B„OC‚G( Œ= „[i
’u  …
‡qæC„KJŽ÷‚JNFuåM¯2@ÆD‚¡oÚ`e)        gÆ;Ö
Wõ:uÆ%6ÎWý*GJ  _bindMÎ%ù‰`ormšX‡y5"Œ9":ˆ%#]xB(
‹0…^
ò^NŽZ(”v„#6‰#)
NX“U
D’E–£¥ƒ#5‰‚TµŽþq‚5":"#]B(
¾=Ÿ$
ñ`n
N‚<í&Ÿü‚‘44h
Nõ
(XƒFÎ    s‡‚
d‡Ÿ-#5O”K+i…
…~/ƒ=˜¢Rent{g…=Ùv;©_
U…      ;J‚$Cãkƒ8x’; #OW"

 ƒy
“'.¯6…
1$M…-‚!O
:$ços(`ŽQ75:$ƒBº¶(+DÜQÅ(;©_œ
‘bò8J
C‚° .#OW"

 Î
‡p21$M‚%!
h
œƒI¾>
b¯‚_6+D
_db‚,
‘Xt<N
¬H2؆        N}:•ña#¾6     N‚‘*:latƒT‹[6(
h$
Hƒ‘a
)¢†%:†#‚+       Š:´7‡d¦&
)„s)1 >Y-T    
¨),…xÀ,ÜB$—7Eƒ„6ƒû—9ÆVŸ…{‡<®)t
1 >Y-@œ ‡">itervŠI‹PŽÿ~E‚mit‚Š—ópar‚Kˆ"„@£F‘ ‚¸T1ort‚…C‚zƒshƒ‰˜š>vers~
–Tˆ
‘9¥©zG¾‚_¾ƒu…Ö*!ea§#
{C‹Q„u– š"7.„V…U®\„ù.}•j   †H†%ƒ.‚L„W†Zpf?
’=ƒ'¨X‹]›^‡,šAìs
‡-œ_®‰+
ˆG+ZµU‡i
)7
gE„}‚¾4‡P}‡Wy9^ÕfdN¾Õõ?Õy@‡s¾7Œ‚.Ÿx—ƒn—1k‡—-»A
.-‡"®T[ment‚C…^‚c‡P¥,—Äl‡Ee’!F‹0C†`uh=>"<
‚KHH†gR·0

 #,$
…
7.U%902‚w¬N


>&T7/#
*P2
„/‚^R
0(L-‹(4#O&–,F‚>ƒxœd<5•£1[S‰RŠ]U]ƒ   3ÚN      ƒ

;Yš(x8$#`V   C
%
8
J20     ˆŠFƒY~‡A[2[2/[[[2[BqXUqqH[2[2[0+Y@UqqqqqqnXXv‚‚‚‚Nx.„
r#6!¡x;7‚r…ico9ƒh6
‚tŠ!  ‡C
B…X¢v       $^   1

[[‚ˆ"ˆ'2E^$#‚3
5Ÿ„‚& g„+Kx‡‚A ‚]
K,9‚%1     '"5

      ==!aJ:7Ye6!MZ :F+0T/ ZFI,x
              ^‚;x6
2pVLJ>-6ll)‡
Ž(‘
}ƒ?…)‚t‚'z+…o^ƒo¾:3‚
Mˆ+†9T”“Y‚xŸ
A†oŠJ›'–ƒ-‰‡*
‘*1 †o &
‚{4J

bƒwƒ&

 A{ƒCßZ’°]v‚V‹       ”dJ„0‚+@3(-„;.r=…A
‚V‚y„|„mŠ3        
'+.

_#


     
#
%
3$M
wI@A
#)F<I
!&"
$%-4
q
2‚#&p*„!‚a     07gi
_ƒ‚JŽ}„[sˆ@‚fpƒEŽþ\:—H§4""

 #,
7.U%90
2        "e


>&-7/#
P2&„-‚^R
0(L-

4‡)O&>—3G3:Z<5•£1[S‰RŠ]U]ƒ  ŸƒL
     
;Y6„(„Mu‚k%‚=
V‚
3Eƒ0
""ŸV˜€€€ƒ~¿0¸x8$ÿ
0V     C
%
8
J2 ÕS~…v[2[2/[[[2[BqXUqqH[2[2[0+Y@UqqqqqqnXXv‚‚‚§ƒ+
‰&#6!Z;7‚r…i
doJ
+ƒh‡[‡jŸÆD‡eƒ&åD    1

I.‚Q,‡h2E^$#G
5õ‡iPk‡g      g                   m     F T                                                  ‡W

‚V¶U%1    '    *5

      ==!a

7Ye6
M$
Z   :&F+0T/
ZH",*
         ^‚;2x6
2pVL     >
62l)¶‚a)‚ —3TÎ
3‡‚       WM:®i9TŸXL‚       ,¦YX‡/‡\+  &
‚O4>

b—‚—74‡pQ‡sv
[(d9—‚+@3(-‡g

>r5
DR*7
`      
'+.

_#


     
#
%
3$M
wI@A
#)F<I
!&"
$%-
+
2‚#&*
   07g
_‚J‚,„=*¶Tn
—7C       0treetracƒ
>}:mend‚
Šwndƒƒ-i‚ai
TŸ.
›3ƒkD 
a
¡$Aˆ\’n!C‰ƒ<,¢a
-     ‰M}‡#ˆp£’ŠY‚CkƒAx†\‡A¯Ÿ!Š\s‡HŸ<“@ˆM–s‰x¥^Î
¥     (       Š-‚3ƒ|L—
‰nvŽ÷
AŸG§1
-     œŸ‚f,†h‚¸;j‚?ZZ|‡wj‚8Ã1¶TW‡im‡‡/«v„9‚3ƒ|L—‚4΂§tangl‚K‚W”—/.ck‡w…|ƒGŸˆ     ª®%ÜÅ»9N‚¸»/Æ…úmi#O|rzñtxgger8
2s„V‚1        C"
-5D6)>/
:
l

+R
 +                '‚XƒN    ‚ƒ
„o    bP„U
ƒyŸ@D       C
‚~.^6E%„#"t    7‚-!       p.
 x2
R     MR"]
ƒ7(
"„y     
+

‚'%
s‚2i$‚q
…i#%ƒh3qˆUBY©W&—c„i&‰D¢
-J‡‚J[†–-È\!&´*Ž.}ƒ}ž™0œ&"' „Agv<„ˆ[‚Z)‚]
ŽH^
–‚yšK‚
–&ˆC8…lvËk‘a ‚5ÆS          
‚?9/ ›$†[8ƒ*„`
p“  ™!(–6ž, ;Eu‚n‚G        <t
„/9"*D)9
•u]*ÈS4B(9d6
‚0
<
W+?$)L|†a<"7FŽö‚lÆ9‚&
‡JS—=}—7
-J‡‚J[†ŸQ!&,ÝB%’,$,"'‚Ï„aF{6Ãt#¾?<†[8}
‚Ÿ„Ýe
L6S
;j-&ž`Y        <t® *D)9T
]ÆER4B(9
_eqpss‚[“ª‚ tepƒ

‚8ram~¢0!'"
!¾E!'"
!llion‚41(m•GÍݸEp‚&C…/†f£[l~
•¾val‚†ial‚‹z˜“kŠq    Ä_•Ú†7«s$ÆCoubl‚|„$¥M”c–/È0ˆEo†–˜x
œ=ó~„á?Ÿ$õ„3â„Î!]eshootE\j
rÙ-‚7#[‡      fò!W     om‚›&
Míœ3B
„ue
I‚Z…L…eˆ„F†}F„o„;e#M‚Ds/8„%%‡bƒ`Jƒ&A
        Š-p"!
‚|>NcBUM5S$ N        d?+
ƒ4I
s   „'&
ƒ2\‚sE‚_ƒKJd‚t‚^%X'‰p‡b
ƒAÇP‡:™<“‚[‰ J%™œo‹„„† 
ŽK‘s¿c§A›*‹[Ž,9

     ƒe‚
ƒ ‚"   ´
…R0 Š‡&?-""!8 žC-;j>l†/‚„P†)†B‰
Œ|ˆ-wh™I%O…}¥$‡0Šw‹U‚     
„LP‡\„!L’/ŠM‚ƒ{ C–*ƒs!`7.„   f
‘
‘%(Œ%ƒiy…‹^”Yzm+‡
'‰`

ƒ!hˆ

%%9u9-
""ŸV˜€€€ƒ¿0´a*‚˜t‘a67&@-:    <J‚TWB)|
JEŠ‰ ‚‰v–
„~(‚:ƒ„ŒpR³@q‚18ž|+?…X„t„0„D;w‚k„\QŠ_?‰d
Ž
‰V‚d;;¬(…k
¢³.Œ%‡
†N‚ (T†XŒ/±o£x?‡Š~bŽ÷‚—*
ƒ
K#"§ˆ   P T:„n“‚[‰ J%™œo‹„„$I‚7s{ˆY
 ‡J@09

  ‚6‡4!u‚"Ʋ?‡i
TŸ0&?-""!8‚;
>l‚*:Ÿ O”6%        §4SG—5¾?‚ C
8ouüj       ‡t(‡cg
‚6yMg—1
'm+k'ŸR—00&@-  <JoW=)|
JE‡‚—4W"
ƒ"(‡‚E‚#‡k
YR9l‡[r+?ƒ„t‚:p„x?¶(—ƒ;ƒ&å".®
T‚c(‚lžz'—*`0truliz•Y„IM‘:       œYÓØEKý4Æ+Z»d+nc%Tƒ;"at2„Z/(!„Q|       v‚~ w{F
Xc{!’c„
Ž{)      «*      
‰Bƒfž:¶*RšX‚38Š/3'‡dži

% …6Q…ƒ-‡„c
†=„:Ž3ƒZ0‹,š4‡*JƒN^#©n|$•F   à#Œ$ƒ\*/‡`
„w)Ýfˆ;«*Æ"
‡$¶UŸ’G‚߈M
‚'L.&-i

% Â,‡(ŒLv§
  J
b^#%|$ÝRÆM
O#\Jk’ƒB‡t
˜~
(‚‰95+
‚a’8      Ÿ…‚$"˜[)j

V
2>]ˆm…j
      2$ƒ‚p’:
Q!A–§_åI–`Î95z
(
1—9uƒ–qÕxWÝf")j

V
2>³N[l
b   2õE*8:
Q!Ast‚‚n‹©r…k‚9
›!
/u†ù‡Ÿ=‡v‚‰X
‚nu‚À„+_schemac      ed_schemaŽ18]…F    ‚;
©Y)‡&3‡Ñ'ù
†k‚°‚hŸƒŽ‡Bth‚
Ÿb(ƒ3
‚:‘ˆx
(„ª,y
¦EY:T*
m
ƒ‚8ƒNƒO’$“[2„hÅ…NÍ<UƒP*‡PŠlƒ5ƒq…k‡B‚G
Ž†WKÐht¤d…)‡CA
ƒo†0‚
Šk‚3¬‚pF‡%†S
ƒd&†]Š|„Rˆ‚!O”A†;š`ˆyJ“\¨uc†vv‰7ŠQ‰]5“g…G‚ƒ+£6@†_†7 ‚‚†qŠ‚•#‰Y„}‚q7‡cU¡E"‰'tH„Uƒ`Z^‚14‚*Š
ŠQ}£KfªgE‚;‚CƒAƒ^|†d&„   ƒ.Žöz@®gNˆ‚(Ÿ¸n.*Ÿ‚—¶U@
v

&—I‡Œ#O"X‚O
X«qK§=ŸO¾„{e'G=üZ+Ý‚]‡ju5—‚‡a„
‚B…,

†_„DMLŸÎ5<U®q"ƒ3tH„Uƒ`Z^‚14R‡„w‡mƒY—(‡1ŸMGQ Da60s‚‰'ets”
€‚6vƒªq      (—ÌF(uesdaiŽ?nablƒ‹—û)e
rMQ«‰<Šz»"‚"U  ¤L2•Ò(‚™K2pl‚X6”üi4rbotax‚.‚Eƒ.Ckei‚ö2ý
„Tish‚ö.ý
„Pnƒr
'
ƒrA‡
Œn7?†(‚S`…«ÏV+’¢>ˆ.ŒY‚>…„&„L…?“B•N     ³m ˆ+œk†ŠQ
‘4œ      ƒ&•S
N¹_ŠGŒ‹$ƒP>‰Xžz#ŒŒ
‚B„E£D„U‚hhŽs—sŽD(ŒˆG¡/8‹f‚{“eƒi
°_‚j
–"†(_IE
H6ž ¦”ŠX— ‚K+ƒˆ<—vŽöOX¶m-‚-„&®>kˆ.Ý^HŸf‚>…„&„…=        j
( Ÿ[݃*ùƒ$õn§  ‚‡z:Ÿ*V—‚lx‡ƒQ„‚@¾#¦j>=8     fY;¶‚d¾B_IE
H6—&‡d
TŸ‚-bEkei‚Zl•Œ8gtori=Š42O
Q’ë6ƒ†OMv‚Šw‚è(eak.…S„+>˜@»N… o‡
B
ƒ=‚7\o*‡0
T…,8


""ŸV˜€€€„¿0É‚cˆ"œ‚q¦     ‚ß‚aÒ‚I„h.õ40twenti‘h5‚C…TŠ
ice
‡
’P…hŠW   
„q
‚J8
¢9®6ˆmª
       ‘pˆq‚°[ÍrwŸYa‹x“QÆ;k
Ž6ˆ/Ž÷Æ‚z‡3
‚F8·Œü„
oNFùb\‚Ö‚)‚™  
…akò
ƒ46‡ƒ~st‚Ù9oB1‚&ƒ|wƒDƒZS‹*ƒ‡8‹,4sx‚‚„@*_‚Zswˆ2‚:‚{o
aa‹]„ $ƒ"„9‡L‚6…NŠk
ƒ@)ECO!     ‚      Y  ‚q      T„%r„k#…†s[„„
„?c
0KI‰j‚e‚Zo‚i   ƒ…S”`t‚h
‡eb‡}—X@‚vƒ'd…K‚…rq"‚Z‘Hi†u‚y48†Lur4]Q

   

      y4             )‚S     „<„Oƒ@ƒp‰Š
‡G‡xj(‚"Ž'”C‰cŠbƒpŒa„(5&‹   "†C=‚~H†P2„Z„,‚D‚q‹ˆ‹P1”0¢:?…ˆ7…?N‚J=63^-.oƒkm„0„†x#n,Y
-6
/3ƒe8‚W†,‚(aH7 ŠVƒ†6„…{]†}‡‡Jˆ;-…`‚#l‚k[‡6GŠ3‚‚  ’†8ƒ‚ „1ƒ…,ˆQ…
Š0„z‚"†_4…4ˆ-
‰o(2sR†`„'‡ƒ<
v‚‡\§5‰$)*…@“ ŽSM9ŒH‚B`'8Y^Z‡>i .†T‚‰@…E‡6ƒ! e†dƒDƒ<—Š]Š3)‚'…0I1§
    ‡G
†ˆ$%…%[„ƒW†f‚ /†$‡y…ƒ       /ƒ‹w„-‰V0†H\…VzS$P3(‡Z‚:ƒJ"Ž†fc‹L‚=‹X˜
Vm
”dT
W0…j‹}ƒ$ƒ   Œw
q•XN‚b9@O‚<…}‚s ‡9 
ƒD){†‰Y…H/†ƒ‚V„‹EŠ†.ƒ+“xuƒ…F
*'M
J‡bqQ )/wEƒ3†c†Dp‹JŒ
„6‹x†„*„J9ƒ&„0G‚&v0ƒ/‰Z„-=Q‡B4„"„O„~Ÿ…u1T‚zƒr†hyƒ„M"ƒY
^9"„SmJ…Y‚L“ƒ[d&†…‹h“
‹x…UŒPƒ",ƒrŠr~„K"Š(ˆr‹Pˆ‚ yŒ!T"‚O–0R'’M5ƒx‚t‚6&Š\„Bƒ}„AfD5‚Z… …[Œ3ƒh ‡Aˆ‚4„ˆ„fZ‚lH        —†Q„Lƒ6#  5„K]:C…pƒ"       ‰D      —"    (       “2HC
(—1P              }\Œ'Ÿm'“zCdˆV†W†eˆ3C63‚CŠ…\Œ5DIŽ#LNJ<g‰oK‚&–‘c„‚9‘.Šf„6@‚DR…F†k'ˆ6…*‚ {b^ƒ=‚+"1ƒ…6ˆ@Š
„pRŽ@




1F†t‚O„g†}ƒUh††#
rg6†N]{ns%)BAŽo†0d‚^Y%3_5ƒ)‚LŽöu;‡lN‡b
!h‡b—5^q/PW
_4‡W*r#/
H
  
  F4          ) jS  
<‚/vl\k/j(:‚3c
ƒp      
„5‡)
"ƒQ"=‡d
^==
U‚q"„pˆ‹P1”0¢:OQ‡ ‡lJK63;-./m„0: …#n,Y
-6
3ƒƒCe8\†,‚(a
d7 … ƒ„
k]‚SƒJ‚-V#l
[|†)‡>     G
‚

q‡U
hƒ—‚o¶U0(2s"D‡h‡„G†.)*…@]
M%‡FQ  Ÿ6‡h
6^Lk$Ÿ<§
!)‡då‚=E‡j%—eM
 f§\
‚kV=S$P
(PI3‡\XK    
6V¾E¾$_oF‡Y
!‡]I‚"9l@O
‚k
„N
t ‡( 
JK:
&
*‡]%



qƒ]
ƒ#‡b
6„‡E‚8—tO‚f=Q„84„"
W„~‡„.g—2
bhyL"‚w
^9"
'mJ5Rd‡A„…22"D
,‡Ls‡kKmP|"‡l„^L‡Z=QGpT‚O
=R'B      L¦Y
‚‡-@‡bf/7A‡…Ua—ƒ#„ MWt‡F ‚o#LNJ<A‚K
O‚P<—‚+‡

@&RF'‚A„‚  ‡Ty‡kG+"1@)Š
„pRa




17

r„T)fyOO>
b{
0m
)BA@
,d‡xn_nonr%C*D.readr
0D/str?gœJ
""ŸV˜€€€„¿0µ6
5˜ —̃<    0txn_writrTD0t‚'
ˆxK †A„ƒJŠŠ’=
Ž”r‘ý„ÉxAAFJVõ„n^
$®tZ1‚øý
†'2‚ø
ý
†/3‚ø'Zý
†IZ4‚úý
ˆ:5‚û*ý
‰Lype‚/*MU‚Hx„ˆQ2    6ƒ¤)<Š„"ƒJ„
411ˆ3
ƒ
(!r6
ƒ$c†U


,P!/
‚\!(Z

‚mz†R‚8‡"„
:ˆƒJ‡h‚
ƒv1
{X$ŒT†7`
ƒA
!<

/

+Rk;‚jƒ)…m}0~Ð)ŒMƒa
‚@[Q*ˆV“V‡(>„„q6œK‰[ˆ!˜6
c„—6„8…‚_š9        u]
|9L",   
A'B{<$.)b|    AA:$   <†‹)„b/ƒ}#‡‹3¤,#
¨‡W0y‡Œ-4ƒmƒn0M($†
        #)5
Cƒ^„Jƒ+*‚
uO"!
)"I„GQ+)OVƒ[†fTƒ KƒG„9‚W¬G“#†/ƒI”r   8U„)E(*'…        [(    2V(ˆxŒƒ‚Œ`…Š{ƒX…DW
‚+ƒ‚‡E„M¤R‚„<†d‹X„Z#"„!‚/
‰V„Wbˆ L"ƒ†VW>‡lL,I        GB^‚Y‚&<‚7‚’&™Všk6     ‹
_*…™BfZ‰DS#$#0 
OBb8ƒ!¨“(L,9'
<       Kwƒ5\
›\ƒB…3„IÇG‡u9…1e7
‹{94Üf–~"cƒ\    T^DE<;SaŒQ…P%†Eƒ8ŽS„<.†V‹3N‘ƒG‹„4G†.‚M„}‚Tƒ:f
3  ‹H<7$R‚\%,U!}"‚J‚¥„<N
!<

/

+
4k;
$O}‡Yz*‰YI
‚@[Q*   ‡0
s>‚‡hU6‡}‰[ˆ!˜6
c„—6„8…‚_šG7F
R>9"       &A'B{<))b|MA:$        D‚dH/j#‡‚mZ,#
Xv‡G')O4
0
;‡SO—:‚,ƒ+¶W*
uO"!
)—\T‚o
,‡ƒT"
‰*‚.õ‚ÕwZ—
-‡l0RüzbŸ#
lZ#¶Wx1/
S
‡bCL"W‡
L,   GB
A‚YG<9R—\Ÿ*—9  Ÿg…<—0 D#6$#0 
OBby
M!‡jh‡ƒHL9'
<      K
w\
¾$…3B]ž

7‡j
‡oDŸ2
‘
8T^D‡c8Sa…
U%AJX1‚g   1¦^‡u
DF…7„4G†.‚M‚T>f
3E       
<<¦g;N"Ycheck‚
‰?Ýôqontƒ      ¹—ûTdef>KÐŒ.ŠIŒ|\Š''ƒ@ƒ;F‡v›q‡'viœF½‚,ƒër4«w£lessƒ
‚]   meanƒ…q—ÄS
namŒ
‡5‡¤o¶U¶Y2Ljof$•plB’% '„ l„\f
…a‡†u        µ=6S% '(§ŒK)†œn
=icA&‚|‚AŒIŽ$"
2,gƒy‡‡SÖ
‚d0Šo
[„_¡k„H„SP™EŒ#I‚ƒ‰q
‹4^‹ ƒl‚ZV‹!$—"‘.`ŒÁj‡C†#‰
Hƒx   †m‘sŽJ«t†1‡yŽ¥‡(†Ue…„( …>£@’Mˆhu²^¦BSƒc_Žö‚‡„ ‡eQ*
, 8PLA¶Á?®‚—8Õ•xƒK
ƒEPsF5Ë\‡h‡ƒ~Æ‚aPxƒWü‚]‡Z—Bb—.CÆ‚‚<Ÿ!1¶MrÕx
;e‚Z‡}Æ(+NŸY†vVl
uƒYÝ/]o‚Á/¡x–×-xu
‚.?H
†*xz
ÇÈ.a
è@†¸( -eXS!=


ƒ61µFu‡S¾‚Q…õq
A¦p{¾`Bí,‡|Y®p“+XS!=


.0000‚“Ú0    â:  16‚oŽ|$–°6
B$32‚oŽ~–°6
D8‚o
Ž{–°Aarr#
Œ[b‚!u’$  5…0) 
""ŸV˜€€€„¿0–”J‘‹Ni0ubuntuy
V‡q&
7‚LLˆA…j…={–#T0ˆÍJ
>{ebungen‚ˆ1i‚†hƒ0        ‘ñ^
‚4    †•d‚
†/\
Âq£
„…Îu
,ntƒÊZ.a—ÌGŒ-.64‚/ $‹•ù‚fltim‰!sº‰Eƒ[¸5Ïl˜*ŽþƒJúZ„ø‡x$‚ y*mbrella‚„Gn6v‚
Q@       †Z    abhaengig‚‡uigu‚"“ƒ@lUCU/ƒEQ
M
.    <
–Ü0‚"‚’3
˜B¿`„%’G‚1
†„8ð|Ž@ŠO‚~ˆwƒ‰+       ˆ5‰+
ŠX„%½‚s¾„1‚"‡V5õŒO“[Ÿ„ƒQp‚™$‚A‰+åKT>cceptŽømdorn‚‹
‚Íb-ulter‚
„Sý,ffect^,“‰<†Ù
µe—75ƒµƒƒÕallocƒ˜c¢ƒpo^-—ë^jZˆEƒpo^-t„Š…n9Ž9Ž÷„áˆ%nalyz‚¨UÀ$•Òƒk…ƒNriƒ
‚34YŽ‘2  £h†)I‚e]©O$)§8     ;µ     ƉXXI‚…ÖJ„e$)Ÿ             ;uthent‚“or‚"s‘¨$vailˆ}f      ¥sÃl‘
ƒ5…%Ž÷DÆ»4F:ÚYVwarƒŠL˜šEH        beknownst‚‚s‘˜‚plock„<ound  „W‡UŽD:
‰0T2ƒsƒ?2Gƒ@ƒP‚F‹l<$ÁW”åƒn2:
ƒP‚6Š4$‚çGRc‚ªQƒWù(„Â(ertain‚†%Ãg“É(ƒ,
ti‚ƒ’û‚+hangŠx†(†2ƒ‚>‰ ‚,‚\*<iJ?
.
ƒ?2‚n=$‚3X‚[`‚0‚y‰‘f
ºK… lªs„H›nŠ@„Žm§…%²….…       ,–,™Ál††B!®?–i‡m‘1W®$  ‚z·;i
Ž‚ŽövDG
åB¥}… lªs„H›nŸY‚g@ÚƒC^u„NYŒLJ‚
…\ÝF+\ÝTk—<¦g
‡Ulear‚‡…M“š.osSaomfort‚’mit‚ƒW‚4
Y‚‡~
ÃuÍf4
‡Šonø`† ½M¾‡†¬$aÒwNpetitƒŠ3—ã†il‚#ˆ$tlet‚£“Ùress~
‘
.„oÈn‚L
Ib
:     ("!*ƒ>9…p2mˆqH
ƒg"¬R!“@…ˆ}½aW¾)‚L
 b
:        ("‚W
*
&9}2m„Ét
I"„v
!:—c§        Nut‚Gy“øwncern‚‚!dit‰.µ
¨”GÜ <¬:…õTk     ion}strain‚‚r\
˜CH•ùvHtamin‚‚rrel˜supt‚•a°—ÌJAv‚“[›j‘ˆ‚d‚4ˆamagƒ   á[—ûƒealloc‚ƒ`clarGfinˆ2—L•
†*
‰tƒ2‚"‡x‡JƒYƒ$X9N       ‚$  ‚#a$=Pw p3

‚S%Li     ƒ8Ht[Xƒ      NKz‚ mMD     
aƒ„"V W„H‚K
…ƒh†*‚uƒ!„k‰^0
ez¤ÔG5Š†C W…RµGâdˆEˆ‚!"       “A‘UŠd#HUO
.„i‡ˆS‘1…;‚DW7Šg¨gG‚YIœ/Šud#ŒDlt¡™    ”x—X˜W¥n%‡i‘,ŒG     ÐrŽ^½ƒ@ƒY
KG’x…RµGŸ8‡[~õ.‚!O:gc  #HUOƒ‚¶ƒFÕ„PŸj§‚}ÝZDƒ c%¦†K¶†SÆ‚Ÿ1f^r#$‰ R$     I
ƒ-
˜|‚|„Xƒë*ƒ+è
„L†/Œƒ6…2&ˆ‚"        ƒd‚kƒ&T.-¯dMŽ`¯B„Q=‡u‚W#Œ46ƒ}ˆTƒ&‚
„t†u)ƒ-‘I
ƒHÎs-“j
 Ž0…~’0†¢‚—l
‚˜‡‚¼!‡°wƒXn@ƒIp
‡Dl…GÓ*¤…\‚’Ùg…‰s‰ ‡^9‰fOŽ÷‚.U"ŸhˆŠ        ‡ƒ'—Ó?M!‚Õy®M§   ‚m“wL
ƒC=‚7t#
A‚ƒ}‚g3¯‚p›uýƒp‚¾0{§p¦an@ƒ/V‡lŸ§6ž+‚K  G+$7/\ oF-2$tU
#ƒ!     E:@9

…`
""ŸV˜€€€„¿0–u˜DNs*     I0under_alic”NMgo‚¸j…‘‰,^‚‘Zli
ƒA"(dSS
oŒdU.50ƒ
„
Ÿ ¥?_G$‚2¡]‘v'."‚Iˆ#„cÞHŒq‹ƒ,’!ƒ‡o…9›}Ž]ƒ7…;•
„;E…k‡f2ˆl„7
ƒu„FƒfDc‡s‚V†2"ƒv‚+„£ƒfŠB‚…)‰J‚OI,9tEóG•Š=+6ƒ&ƒR4„U1š ž>
3†B†Y™]Ž‚xƒa†bŒ$™Ê„#ƒ%58‚E”#†{‰rŽ÷       SÆ,m‡\'.";§
=‚T!í‚=
/ƒ7…;:Îa«qX—6:R4®n‚‚+„:ƒ¾k
„^]‡f‚;+6—3
#4o¶S/‡s‡U‡jCŸ G‡g7§J‚®V#®“—žƒƒ5
G|}Ÿbscor$ŒEZŠ;”|
u½8hƒ<tandƒ
.’*ˆ#„<~EŒ+–„‚
TmÄ°l1‚|  …’_‚„v
ƒ\!Tƒv„‚;-#>…˜

Hƒ}
½(….„Mƒ6ŠS™ƒt‘KŸ5•3°BŠ@„4‡›l«29„%

ƒ4 s™Æ-D´ÈrVi‚%?ƒOƒJŽþn‡‚REN=D—BQHŸÝDŸi¾?
!³V<®Aü‡j]Õ|?¾‚_Ÿ'<ƒtŸ…4_‡…/†i®O.Î7‡¶‚Ÿood        
i.Š‡L
8‚-5‚U‘  ‚o‚Aiƒ
†U1½1nÆ"*
Aiƒ–‚¡s¾‚d¾Ã1C
ƒ
tak‚’ƒ+†’ú‚Q…·:  enšdwai…5
m‡B†
„NŽìsir‚%&dS‚ƒ   
dƒN#>‰i¨=®8ÖŽŽ÷‚w…ŸwzÄŸ|Þf¶ƒ*Œ4itect‚p”uÆ84ŒB‹J‘˜…?‚°birectŽ}scovƒž/˜šVhvidƒPo‚^ˆ‚w
‡yŠt‚
‘\
C•
?
·ge   
™<#&h1Pt
"7 $ "G     9
     #5
'6?9‘ýLb‚ßAA<¾<?Ýl'ablƒ
‡kcu‚
<*      ‚yuÌ$Üìn†û<logƒ,m+=$…2w‚x'"7e Hn
‚Ej‚K
…E'stackƒ†N*aD&ƒ
encrypt‚ˆsumb‚„\:>forc‚—quƒ‰!scapƒŒY—Ì:Txpand)_
¦]ect‚
–0“#ˆ!‰o’*”Væ     ˜Œ'„u
„Pü‚ÝEDX¾BQ”5œ($Ë„%õj   edli‚„M‡ˆ•Ò‚0õ‚.fin
†IDish†KeaN
2ý‚noreseen‚¡Jgiv‚„7Ú‚&tun‹&ƒv–,…*‰8l¨"   œ="‡\Á_ƒ<       ‡i     ˆ …~‚)‡bŠp”  Å1ÃL‚Ï…zf&³Æ+h
Q…~‡_U‚À/reezƒ„5‚g2
icod& ”g
Œx0b‚O
‡j!†‰l†2Š |A;rJA„h )ó"ò5%„X         +–{„cG‹p 
†1²ƒM”q!5
Š
½WŽþjE‚.¾=
M
D;rJAF )ƒP¾ W%„X                +‚
GÝ@ 
Ÿ‡m—4}«nƒÜâPe61~.›8C‚:'

<7
ï
(÷=-
>UA8„\Ãa¾?‚:'

   U7
¾$ …7=-
>UAxüf;fi‚<H1‡$”ÝNCorm‚ªN›(
‚>Q,×øn%„Â
'‚Àlimv‚‹O—ãohlater‚…Pmped$l‚—Uort‚Š+»»x“‚ƒÖc‚ {5ndex~"–%.7é+6j‚"
å(¾       7.6
-HQ¾b(iti‚-9?“r-IJK‘ˆXY:6ˆA-IJ…€L*ÒWstal‚…pñw%tend‚ªG‘‰Dtion‚‘ví*GuitC‘!¶.vert‚“*on       „X˜DW   ŠI
R‚cY<‚‚C‚vD‚‚+{d!‚r—gŠkY
œd   £X…LàM¡_
Š8
+
Í
‹P%Ž}!”1+J\;% …~-„@'(
->
F
*
(%4‚7
^
-PJ

,,ŸL˜€€€„¿°g‚RM1r3SuA
’X|‚8        'A+$
*}%  Š   W‹       ‡~†   #÷gµfƉH
„L†J‡ÕSŸ
ˆY¾7%‚™k+J\§%¤
‚I#‚Õs‚  W‚ƒgÕZÆ„j  #
0unionvtab‚H„
DX…=“ÿ0D„„=
_init‚„J“ÿzLqu
 pg:„?…        ƒ/[‚&…m.vH @+1R„Z/
›wMƒd‚t†–'{„4‚.'…b„ó+‰{)–A‡[.‚_¶ušU‘7c‡Œw ‚UN‚=  L’d
‚9”®ˆdŒi(‚Gs‚S(†I‘    )„~¦5–UŽ–/‚‡ =a‚P„_y"ƒQˆ\
9
5;cXqv{ƒL‚P‡Y$"Ž4

Ï5‡%ƒq       ‚Hœ$…q2Y{7ƒm‚(F
½Q+™K*-¨`
ƒN‚o“6"‰lœddQ‚…R’6›9#“Y‚^‚Bì8‡\„
–
3   *šEƒ‚C£:Z„i^‚?S…&+‚Zƒƒj„AŽþ(¾k
„t+K)
‡,
&.—=¢'šU‘7cNƒ‡ƒ*‡Su        LÆ-4‡mü$ü+‡g=a‚PÎ
"
,

„#9‡b
|$Æ%+®x
„I ‡` %{7ƒ^‚(F—F
ƒ3+‡^
**-ƒ26
pN®r&Ÿ4%251ƒoÍa>^‚BT
3Æ:ƒ‚C 
Z"^‚?j‚0^§
‚Z‚Neconst‚Š=Œht# 
Iƒ˜C‡Ÿ‚Sƒ.…‚,‚Eƒ‚,"Jyf‚%
  Šƒ{ôFƒ^YùÒuA‡hcŒT2ƒ§:¤ UJyf‚%
  »7+‚2vers…‡_‚
)#†Dˆ2—V‡FŠ ’…D…¿b3x&tbƒ`„OL52Žb“4bƒJ%
GŒj„
†=r14ƒ/„ƒE7†aˆO>‡"ƒ  &„Œ(|‰A,S‡‚w‡/œ   Œ      o'†5VSŒD$„$^Q‚fr•|‹z†aƒ(‹_‚±hˆ”%
…J‡„2)„;—&eƒQžD‚)Q    
 (%j 9
4‚‰YCƒ1)„)%ˆC‚(‚=7¡$!…9ŠL‰V
”0B©!ƒ‡Hƒm›N„M‘`‚–i>ƒv‰„   „       "‡\~‚‚E f‰FIŽö,3¾7N¾A.åG.—9h‡e6ƒ        &‚nŒ(|‚R ˆAS‡‚w‚I\õmÕz„g‚<$^Q‚f,L       b„0—?,‡fM
|)
4X‡]*    
 (%Z
9
4
w—6qõC—;
)
‚(%¾>®k
Ž<B—s}K    —-J‡;P
vQ

~
@u +   &epoch2!1*'t‚J1ƒh 
'‚Œ‘þ‚
       knowingli‚ciŠh•Ò,g‚Èdn›*   ˆwƒ$5¿s‹5‚{“Xi
¡W·‚'ƒ{iÐ`øt•J†~„ƒJÝd
†oŸ‚5Ýiõ@2law‚—  ess
‚iƒo    ‚‚V†U‚,55ƒ    …‚k
‚…E‡-„p
{—‡•X„’P-[Á
Š$í\„  Ž@r±&H‘“p„_Š‘0^¨zƒ6‚Lá†66„WŸ¥&ƒk m„Š<¬c k‡Q™=‚u‹šJ©4§Ž÷
3‡-¾‚jY¾‚ÝLŸ†}H…:ƒ@Ÿƒ(¾«ƒ§ƒoí'Q¾Siƒ$®_®‡(‡—‚jMl®‚S¦|"$"5®1J‡F¾-‚SŸNik(‰:kŒ#…<
m‘RŽ&-a’; j…+„=kÕuƒ8‚
Ö0Çt…JŽx‡Z„J“;§    ‹:“T‡†
„',£&(O‡%ŠW…P„IIŽZPœ¢M‚3‚v+¨s‚<JðrŽÆ)LwUŸ‰Ÿ*HÝ'Ÿ‘kR(âB@—;—‚¶Z‡yv„   =übj'
8íF‚v+„|Œb—pmit‡
‰|†]‘˜ynk‚…+ÍŒY8^-–°L§>MÂx8^-oadƒŽ6
3—´ˆBÕ
3ck,\\
0.Jc!b"
'ƒv¥2Š2À^œKB$LV<„DJC#Fx]i7&I«="ƒNŽG–        ·'†A‹XÜdœ–5‚ß^K"Ê<ŒUC§",£kq7‡lNC†b1%„(ƒ25"
!!ŸW˜€€€„¿20unlock_notifi"'1@Iv1…
¨!ÀQ*:  CƒJ-$&Rf‚D'lFù–(
y_cb‚@
Nfil‚—/notif‚@)2tmad‚‹;”Ý‚p‚¼˜9–×lÝ’EtchŠCeasur‚‹~odifi
GÂv*„eƒt‰v‡µ“u
Ü®(†úl[£‚?namƒÁ+*—ÌV
&*ecessarik
œUŠf¦”Eˆ-¸"‡bŠ%·A‡²z„ È;Ž÷%®i`¶\‘K”Eˆ-¸"§Ÿ+ƒµiœ„†>¶<li‚‚Xed‚
…!otƒ§I˜š‚officiƒYrd‚
®"

Ó`—ûG
‚4pack‚<³„niDaF•‚užE]a]‚}‰ Ý/<ž6„niDaF•‚užE]a]‚}tch‚R‘˜wOinf„S‚Wf9—ëS0lan„redict‚mGƒ,7¦a6Ó¾y
:„0par0otectf…
<3++5
‡3/ublish‚•"Ú{‘ˆA„ø   qualifi

‚UD„%ƒqfC5ÆMüzpot‚-c‰û‚‡Èƒ*reach‚~–d„8‡@‘ˆq@üFƒ-‚2d#
Žn„UŠ9ÝL…b@‹8D‡±(IÝu{son‚”K„&«u“ȃ„£‚?cogn{p–ÐcÀ…fAÓY½3}¾„ü•kƒ†Leƒü
‚-ver‚2>‡3’úN'ƒ†O<gist.<
Š…uƒa“©ƒ2l‚
F=Ê[„
›z“;—[ü‡ƒÜ3
‚\‚‘9‚°d*eas‚•‘‰iÅæ~‡Y¸$¾‚@Ÿ Ò0¬
present‚‘¸quest‚‚solv‚±?œ&Üœq†úYitrain‚ˆ‘˜‚ictˆTol‚W‚#•Œ‚
saf„&§‘0±Òyø„.¶S„º„Y‡wÚv‚q—Rchedul‚V
‡[Xeen‚•‘‰7Dtƒ|ˆS³Âh•ù†cÓ     chackl‚ˆign“8
l‚m‘&
<KŒ+ÿi„‡¸y„rƒDàz=¨J      ‰›2!‹)†
žF…dŒ{žt+ˆ}U571‚†„OÊ_ ›Fˆƒv»*8„u%
µ:jˆ/žp|TW1„rƒD
Œs=Œ@t  rƒÌe
c…d¤j+¶SAU5F”01
Bˆ#®eˆƒv
„"8
'uÝ2
olvœpecifi0X“`ˆj˜f‡s‘GQø‡m†Óƒptat‚ƒ+uccess‚<Ð”Lˆmì:}†„H‚6it‚îyÝÚ+pport
ƒXhPA,DD3
ÇU+¨qŒIøy
‚VU„á0Ú†Ur‚‹;ynchron‚‹h‘‰ taintQest‚‘~
¼Š@I„„="ø‘o‡jŠ@„º‚
_Ë„Ail…Cƒ,‚{z‡KwD‚b<.        
K!
LL
\
‡i 
„v5%
]
sM‚
‚)‚o‘b‚…*‚i‡&  8     Œj‰`‚K“…=ÇIXƒk˜K„'=„m       ¡
ŽA°;Ó0bŒ5
j‰U“       ˆs‚v‚3Š8Š@˜7šSµ1ŠaŽnƒAŒ‰h
‡0Ž1ƒ8‚8 C„x        ƒ-ƒhI&ƒ6B‚F‹J      zˆ@l„.„1‚y  ^#ŠTˆ"‚ŽSi‚Šk9„WˆŒ

–p’y— ’K{}ŠH„=’!‰3œH;¤fFb„luƒ&‘<‘rˆƒ‘\ƒ6?ƒG‡Žöy
‚#

‚K®ƒB—YIX‡ƒg       ‚
‡bOP    ‘;ŽA°;Ÿ3‚Œ\A‚"
BKâB0‡‚sÕsTB‚F zR       &'¶+9Æ5‚{#§\Ÿ‚I
^¶R„.‡`j#‡ƒ*

@¾9„{}k‚L¦f;"
!FìpA§ƒk®|S‡K‚,o‚¬<ru‘st~=I‚4`e‚~…BJ‚&A'j…
!‚Q(Dƒ0Ðb‘˜
JIA‚°Ud(‚¸=BÂXˆworthi‚…$•êƒ;usRm{H
‚6]‚Y„B>

Œ#‡a
„„G(

((

((

, 
0 
/ 
, 
0 
/ 
, 
0 
* 
/ 
/ 
/ 
/ 
, 
0 
/ 
,(

0.

/.

,(

0.

*(

/.

/.

/.

, 
0 
/ 
, 
0 
/ 
, 
0 
/ 
,
0
*
/
/
,(

0.

*(

/.

/.

/.

/.

/.

/.

/.

, 
, 
, 
ƒ,T



 ƒl¦OŽs™  ƒW=t‚‚V)‡f›P¤Å‰HD!ˆŠa0—ŠœR…Bˆx‰‹Q…Djœ7
Tƒ`Q%O<
(+6!6=(Z%0R2"N,‚SH2X
I‡


""ŸV˜€€€„¿0ÑA
‚W
9
Î÷UOåB„‚|(

((

((

, 
0 
/ 
, 
0 
/ 
, 
0 
* 
/ 
/ 
/ 
/ 
, 
0 
/ 
,(

0.

/.

,(

0.

*(

/.

/.

/.

, 
0 
/ 
, 
0 
/ 
, 
0 
/ 
,
0
*
/
/
,(

0.

*(

/.

/.

/.

/.

/.

/.

/.

, 
, 
, 
ƒ,T



 §ƒa‹=XT‚‘*X®L‚©8¾/D!
„¦G0  
2”‚Eˆw…DjŸ W— R‚70unusuX2‰Cˆ‚@j†®y“-
‚Ž Çi‹F‹KŽiŽþƒlƒÔ^õ__ò)úˆ—ƒ%ž
Ÿ9vet‚…?…<‘˜-„уSwant‚˜Aholesom‚™X‘‰ind‚°a–׃Ts‚u•ê„ritten‚¸Fãh—û…zip‚
Ó[}
¾û
^‡Ðp@@8ª
‚&}‹ImšD…Eƒ
W
~Z
‚.„KŒ
„W
ƒ    cc“X‚~„I~
„?0‡  ƒ6‚*Ž„Q„TYˆ„,’‹A…v……#‡I‰I†[6u‰,oŒoR:•a4‰‚-†
˜:ŠÁs ˆR"r‚„iuƒv*Ž
ц|ƒ‡L‹E…Vƒ„glƒt_‚KF‚ƒTP„(ƒ{ƒ'„
‰‚‚/ˆ_ƒT•NWƒlœlƒwŒ`ƒm8‚%ƒU
L‡v‚!ƒw‘n…›\šl‹Œ=„}"†Qƒ‹)XŒ[ˆ*‡8…5Gˆ4O‹k‚…T(–j„w ƒ$e=ƒ(^‚Š.‡`RL„xG‡Œ-†5Db^… 9&P[‹4…c‰•=‡G‚x:…‡ƒ‚c‚o8‡
+Š`–lŠFG‚†fŒDŒY‚i‹~n
‡9„&jU…‰†}™*ƒ^LD81Žp*"X„$!’
„xcŒW‹>”sˆm’
˜kTˆ;‚.…2”,ˆƒ:‚†S&T‡5Š‚
•N¥M„~
%‘-…^„„‚GW…W0„q!ŽQ•b—:¤3XœŠHrX‚„s‚t<¥R‡„d&R…}ŠFD%ˆ=… „ŠOœ)„[?Å oW‡„~‚r,\ŽQ‡N‚0ƒG
† xŽöƒX5
rYB}UCƒ(‚dP„l/‡q
v:   
4*x„‡-/—=-% ˆR"r‚6n„&‡C`‚@Qˆ
ƒ‚CÎjY—5
‚/)‡b‰[WƒlŒNƒw‚(—4‡h
W8‚iLpMq#Æ‚+‡-¶'—9.—<—8#
-G—‚^JL‚EŸƒl‡9O      ‚$‡…~@GŸE‡l"P5Æ$Y
-ƒ‚!‡ƒQ‡RMEB  ¦|x‡.+‚]'Ÿ‚ˆJL—,6ƒ~‡b

X8!8ƒbXBY‡„o‚]ƒ-c‡LR‡lrŸ‚,‚‡…r…]K‡[%Ÿh
¦R
a5‡kmW ®k„TrX‡dQ<P—‚z‡eIƒD%Q=5n†Ta)„[?coW,‚MH"Fcom‚ƒ”õ,d2h‚B^(bc•ƒz/”b-”ÝW‚v-at&‚B`#„Zt)d:%0


!/!
,  %+ H1#
U9]_
k
 M82$Z5
‚P,#!B‚”?‹‚B.5…fY|‚YA\1Z4$HPA/      .*a       ?„Rj‚F‚‚B‹5,)Ÿ{      )..X<1
‚xt =NL&M9j#\Q
7g…*
ƒB*R      “†%H
 Ž‚v
¢>
M„
&¥pƒ0•>†QÏ+@.*(
f ( 
        

6/1jZ$T-9!0##W&G"2=9
<[:9,
F| +|2¨2!74R‹G‹»J„WƒRH‰os2mˆ?À?…!3^Ugl"H$*—,‘Sƒ2‚8ˆH„„?>
‚$ Œ!VWN.$?-6‹*†I„1>@X‚?‚Lƒfƒp‚       „,r99ŠkªQ‰U„L     
6‚vd&#

       &n‚k0ˆi‚)‚_?ˆ'60
[ PIO)uMƒX"‚Ii…
ƒX~*‰k‚„86=ƒl
ƒj~†u  P‚F
ƒ1
…$‡W-ƒ1
…:‰    Š(ˆECšz„{’J‚O‚e‚5‡Zˆ>K 
„7b…=!{
‚…9‚†l&R!:„H!$I,[o`-`
‡/) -,Š.“G‚cŽ  MŒBŒ(ƒƒA„C,*ƒ„W#P
        
†j]l.‚ˆ4‡
Žtc)‹83$7@
,„Tˆ#

0*

H”q|R…q"#Pc>’3
ƒ:"!
%E0
""ŸV˜€€€„¿0µQ.]U**(&0‚39.‚¦H*+
†^·G$ƒ 
   |ˆ!ši…    ˆ<Ž`=„ƒ8%‚r •k@ ‚/ª†/—:—&3ƒ ƒ„1)*µŽ…?„¦V¼\‡>‰Y…<¢?q™O;.‰           K†
£mŠjƒKp¨X™W-&l„!
…d,"SP‚pƒE‚>NŽöƒKŸ<MKƒO      ‡#‚c q>l_
„@‡)&&(
f (   

6-1WZ$.-9!0##W&G"2=e
<[6,
F| +‡awY2“d!74R‹G‹»J„WJlQs2m"ƒ[3^Ugl"H$
1*…(‡R%‡‚YÝ`G‡m

$W5)‡cƒ
‹*†I.O#/ôw(

¾)
®q——87¾=
†cC&‚J
_‚¾Y‡gg=!¶Xsl&R!‡dk!$&,[;`-`
/)     -—2__‡`B      #P
   
Ÿ'‚@3$7@¶[‡]„7"#Pc>DQ.]U**(&0‚39.—‚‡])
"$ƒ 
    |®Y‡„—, 
ƒ-%
V
@ 4!
N®/$\‡ƒ§J‰Y…<—tq;.—„{              K.‡‚K…5„/-&(¶3
,0update_customer_address†hook…](VP‚P…>
†^“ƒ
ƒ`addƒ¸)—ÌNZfrom‚™kgrad"‚/j4MF{
„y…
_ƒ0@&„,>ƒDƒ‚…[m‚Z„L936f„wD*L#      ‚0khk…a‚*w*ƒ6.q‚*‚Eƒƒ„])g-‚^6‚e*‚vƒ%<2
0Qa$
‚ƒ/`ƒn|+$>‚)=#ƒ[Fe`‚)*",e> Qj!0‚pt
z‚ƒ‚E
w“y%5{¤†eŠcÜò]»p‚öÃ(u   "5Ÿ‚”4held‚‡sload‚”on†LŸƒEr\B‚dƒx…„+
“;†‚M‚s„:‡{    „(qµh“$Kª@¯!Ž%‘ ‚&‚„Kš0ß7
…/ŒA’niœ       ‡ƒ
½[;®5Œ‹?„E‚ß[SÚF
‚„kwŸ‚#ÍJ§        <uLi‚-per*ƒ*“N“ ;
Œ<†\†Z
T 

;‡RZwƒWuKŠ*†·=h–tyƒf…,‡v
‹{ 3‡aZBˆ<"—3
ª2ƒ
«\ˆ#%":‰N†Jz'
‡'ƒ!
Žj–‘´(’=
„:‚.„B¤
„=œ,¯/Žþi¶hF‡[Wi¾D
…Jh‚MÝŸ„@‡aZB


"ƒž_¾5(Î     ‚D΂S‡lÝ‚_Í‚wŸV
§‚yrƒXcas‚òR‚L      ½9üt‡¸t=Æ2r‚ƒqsert‚^K,3N|L!OZ„2zI…g‚xL
‰0‚VŒV!–-‚,–×$Zt™
ŠŽø‚<õgwardè4H½‡rgent‚°ü&i
„*

`7*1!„-1Œ3
8‚Rƒ{)(.!‚8Ca^‚D    &
Š*D‚v‚=ªLd(m…`‚¨L*ŠV!†I'D
:       !
(
        -
)
             A„xˆ`Ì~
*«‡,Lƒ†J
k0K¤
{'—3

   !
(-
)
      boolean4S!@&;-#int645T!
‚?-$keid6U!
‚jparamet3R!
-‚t‚‚;“ÿ‚9l„1‚‚,
Š]]ÂfŽF
,”žÝf
2]õ(!”*_id‚g
Âo•ò

*s2#;;mT)fd‚P!V-X)1Gv4,
E.
/>(',(a7‚IQ~,‚
I! >A'0E‚ax]‚wq$@F,‚g„GX‚A AK14bEyƒi

E=RXVgz'<(3!>‚aVR2-F‚[    uZ<6K>0#Kl‚m'„uƒHY‚mf4
      J‚.
\8T^V$aƒYq$-1;/qz0‚
‚/vP\-#(^(ƒ_!B„UL(@ow‚'^
yD\"#5L„18!Ug_
*`^RKj ˆJ8(9+e„ Uj~6g<Ct„‚R@Ge~‚t!4+       0}DJf-T…k{wBd
;
+DJODƒ)„ BO@… 
ƒsƒ]3:%‚("
8(_
WVN;d![
(S)QY1K*8Ek
‚= ~
(9E5
$/W"-0
G
‰:
‚F

‚ƒ>-
u‚<-%#L
""ŸV˜€€€¿0ÒH'w
_D       : 

U"V1
IDW/‚
 
H4A;$Z
$! 
v+
2"(a
)E@

"= Z,,S/‚ 6
‚       &J‚9=:„u"W
‚@0*


'<3(TNg']u)`CcD]‚0]    QƒRRQ+
C $ZXNG\EM
C6‚%^7
7^/.T1P>3-G+       J‚q‚"(![F%
|7!~ T…]
T
RN":&/VT3DR)"$F, \lfƒ(K!Q'@ h4G>s$5;]@"‚1M
./(2BX*$‚V=&"|*ƒt6r7:JlgsSB)K=rNp`
hN‚5(:$<
C[5

*(‚0
Y/    T7$D"S U7
-+]

'
A!Ln%M
-R$&vau
NI$[&        <&>:kc!_dta1WJcy,5‚d$*"
-f5vY<5Vb"t
)‚[&
uJ   054=O
vsU

081f/2A?
[‚*   ‚%a…E9C[
‚?.-?;~:mgƒ9f

R;'W4‚s; ?‚‚Aa w=Jx‚4s)aOS
<dG
!_k`].,%
>ƒ[V/
*&l(
!E

Nz8ƒ'P,>NFB6‚6Ar<+        a*qx1v‚"b^f,„Z‚      68ASN

p7
P`S‚Jg7=1 .?926/.HJ'  
{|Kff-%‚ƒA„;D‚wˆV+Y+
*
%U@X!#ƒh_G?     T‚
;J‚*UI‚#*7)@ERKR Pmq
7"AC/G'o9
$QESa+.>?=>{+*
+<5A

‚  ‚Nƒ <;‚O<1\„,Q  ^…CU
apP'@ƒ;(QDƒ>O>‚q[†3,/XM'/7m=5
Z  ‚`?R.6!PI„,qnE‰%‚Br
y'‚HyTdI@d,H‚('*B‚6"RBP(
8b   G)=6)_lp‚@LL
{&4‚B9#
       8
,N
f
k1/ƒR./t‚^-3        
2ˆt‚D|
8ƒPs7-E"4!$B‚GKoo11C5b%‚Wh‚h2$ƒ[Z‚k‚4oDUHi5!2h‚-VC‚!ƒ
)‚#0$NJ1f"
iz
!"GCpS-5QKS,
ƒ%/ 8?2 E} K?, EF,„p6$VU=D}$Xi"f9„hK$=(.Gv,‚I%WƒX„`<$ ;@</v
,…w(\*~-RW&!
,6

[Dv    !*&*
-RS_|1=
K)4L%
5ƒr‚#7Y1OZy2.
7)&2]z
z"„*        ƒ+w‚sWƒj%RD‚ "|OEK
8"
1}R>@‚;={?‚V     bI'(I-n4**/+7>hw‚YV,y vw
fW        &
,53@ 
L9F
BQV@N‚)>


I&,J\/RE@v6.
„      %4‚

!#FH>/v     
mVB&?C,„7‚7 †7ƒ`‚7‰@,E‚~#ZCF6)
ZLK57,{
!w$R+E<N`,v:))\_~Wy#^[;)4%Aa& ?==NM+„tX‚!z
 P5%G07:Kn=":O ,c]‚[:=
!W5/>b=b( (C‚6p   *ƒ2o‚e`‚#f_„89
$„#ƒ        Q    Q    Q    M     L     I     M     L     I     M     G     L     L     L     L     I     M     L     M     _    ^    U    _    S    ^    ^    ^    Q    M     L     I     M     L     I     M     L     IMGLLM _    S    ^    ^    ^    ^    ^    ^    ^    Q    I     I     $&u[          9[            R/\.S'f‚gB) ,42F/\>3Cg!C*Zƒjw,)L&$  
9W`>8s+K‚n&<rU8 q8C#‚Nƒ^
=4c
/Pg+mlVG"#"  ?$'‚XT4(KA

D+  xc)7=+
N

#&$\O&;(oN
&!p@?*b%- :6$H=Bq%0K2*8;V(9        /r[\:48%k
 "'O"‚Lc 
I/1T00%#I_GddG>8)#.'&B:
'2.-v""%,&d^;.v_`b{a*i^6:51s^:5%>;
m[cf
;7$Oaa!‚)G.$ƒxZTk…
"^ 1K(6*\:ACOP„a.       YY3I
']4Td($J*:C†`(‚vCQ84E0-3` t#'("eCJ^,SS"
&5}T‚o‚|‚T
.',T&
2j/$prHA'uM‚"1f[JTM      *Z
"#Z\<6y
ƒ
<#]eA$H#c3pB
)B"ƒ->b„KC(+?#W<ƒ"…/ƒ†p1‚|?%3E:m~Wc
;R‚4‡'_%0Y4J,>OD‚N7Jyo
 I-@   
*f_-]/gD   9>&O>0‚1r":T{XF&)7$d!F(!m]F!V+.lj<MF0=kg0**'%# (Cl/‚@Z]=G
[]U>9#(OA.„)n‚/{‚[(3*
HH=
/,[

""ŸV˜€€€„  ¿0Ò*5d‚-?'e'GV     :
!
('$A!
('$Mm'!u
r4‚MA]t
!?<HsbA,>U!v[
-       mJ„(
%8G
#@g
ƒW
J])@DBG<Hx0\$%4\EF\>9%*)g(Ih-10'
^p„%2K
D)At;FNE>"
'D4>-UCx‚@PeSM‚n*l+d2n3‚9lmPwYw/[A)#,‚eR'H",
T5„†n3P$+.&„>xW‚F!‚&‚t&u   ?YDpn7q@"~EW‚`=8uTE0MqeiY49 .Q9k,‚;.4("KoUOFup"‚ˆkŽn„x}J!‚Q†J‚8‚4ƒW‚xI/‚/Dƒ$‚z`z.&=}ƒ
O8dS[:%_b#‚
ƒ 1=ƒ1    l*fU}#*Z‚#lWkfFc
\:7(i9 "‚c>gL+){OL7-,‚AYj)g&‚A4BK\‚]'^oal@.r‚+K,ƒKp+3@`+      r&o)?32oMk„f87n8
S‚3`=
ƒT‚#„5hV&)I`J               &'R9fFƒ?ggeD'"n…WLƒ{/+      ‚vw(‚

B2H/
‚T‰i†P†@‚B „:‚
‚‚8yƒ|$5/e.;#‚cv‚
9 8‡kRJ(ZdD2=WƒF&~I?{H7!@…W).p_Ggvi‚Nd
Z'TBƒbƒ
B5)Ogb(?‚WkS2a  5;ƒ?*‚nƒN1ƒr6&^‚?QmIm@]‚:B;*t5‚k7Sh}+*/‚3&.(Esƒ4`Q‚G‚C8Ax.}`vU‚J0=
#D‚pqƒ+"…$ƒ)‚2‚49Le4     W
4"T'=DDe"z{M5i^J #3U?o‚!"$!]‚XCv4;,(Z)=Bw &/U7!"V 
I`m@Op<A3
$''

‚?rA)IKEc?&4%3…MO9G"e%T†1„Fƒ9x‚
`/1K!})ƒ|MpnsH„JI&„7)‚^WP\Q‚R:nV!G#)^(0L#!*„?pQ&%3BPC?[‚Wtƒb‚4Š%+C?‚lbY‚CU8C

/W#hKa C+F*<=r‚
‚@`I.*ƒ!'U B(&
C 

:/c~f:S2%T%+63uI\8
5S1-2#Rl:&,G*t‚1i

+Hs.hr0*05#E
I‚rW|n
O4q*.UVU4sNn.ƒBLpR‚RW,
Uk8#Xh‚[G9yM<4(d`^9‚&u%‚v1N…uƒM2"FF0{U‚_MYAoƒ*r|LK-[,1h?u!‚p&Rz
_‚[GM@&,FBcmGiB'‚@ X'Q|2G#
H‚1R
ƒxƒH‚@<m
„|K?/‚["=B0(
‚>p#=,P‚7!ƒ"w%PL[I‚jF*u2A‚)ugg
%V-%
.^V>‚7ƒ8 %`A2x‚tqƒ2"R
9l <hD‚9
IK
‚=&+*      Q!   '<  bc    *.3=‚:W    :‚D‚2H\y<~>qj@RR3M3]XKwB8nX+D4#  K.ƒ        {           c0u6ƒq‚T3B7h =bw    &'4ƒ-&"t~'8-&9af
""ƒƒ|6IC+>#(‚!3I‚„*l‚Llƒ`wB]
Jjƒk][-$\M‚3F-O
1$+2xSLF"wETƒvBY4o<7#        O''.…\L‚58F  M%f$Lƒdƒ   =T  %j2l_S])]@EE<
-
*c@       ,&,A
28OEU   $4'ƒ
9KkWjC6‚*‚:
    OŠ
pa+A/C‚5L
„rŠD‚2‚(†„(+…

kƒBƒ)“\)B-2w
n:]'&|‚eaO‹G;=@C"ŽP,‘ •' %\@Žqi
p[Pp'ƒuD‚%
9vsCi^^NBn<q=B2C(6SL7
:/.1‚2 ƒLX@ZvƒQ‚2F, 
?‚p…O;9MG‚O\‚bf?-)_&!‚G}L;*MC,#4HS0‚HƒB(!i:7ZNkaƒ9…?1    
;‚r)!1*-I$Y}
iM7l<M=b\.hldZ 14
%1(P.%Zr?u&UQ.H+7Yƒ‚jL|g,K'#S2 5^Ct   u[Hn4,D3Gt
1K8{B-O?    ,_f?E.1n7g$RM({q0h86‚ngHP        x‚ 
‚J+(…=       1     `QƒaK9.7
Y‚M‚
c‚yƒ\6‚5H‡guƒz^[2k$gvC†]‚&(],'B‚‚+2/zt2-sJ„„k<5  4‚{R7.&d%3($KkYX":8-"H
+bY%@3r&Dy>X"0,1        „"„28$
B@i32Q~r

 
)W.*q„Y=v(1OC ‚      q1saY.O%0-‚/:&_X
+*"=S+>$Q1~ 


K&5!7*$
1       *&u‚S)  
L‚5   e)\ ‚w0$+F<ƒŽös-2A?
[j  qa
9O
r[
w‚.?;~4mg‡Y
R;'W4V*; ?-‚Aa w
3Js)anS
<G
!‡__`]‡g,%
>G
1/    
*&l‡e!3

NY
(ƒ'PJI6‚Jg=1 ?!26/.
(J'  

Ofn-%‚`
=;Z+Y""
*
%U@X!#‡U[G?    T;
4 -
""ŸV˜€€€„
¿0ÒÀB7)EKR 9
cq
      7"?AC/G'P9
QESF+.>= {$*
+<-A

    
)ƒ p;N<1\,Q        d
(P'@‚(QDO>‚q[2ƒ,/XM'/7m=5
Z  ‚`?R&6!P
I
ƒm
q‰%"
o'
ByTd‡)
I@dHl'*Bm6"RBP&"
8b   4G)=
!)_mp‚@L‡_

{&4

       
+/d=N         
2
6ˆtƒ"dD|
8ƒPs7-E"4!$B‚GKoo11C5b%‚Wh‚h2$ƒ[Z‚k‚4oDUHi5!2h‚-VC‚!ƒ
)‚#0$NJ1f"
iz
!"GCpS-5QKS,
ƒ%/ 8?2 E} K?, EF,„p6$VU=D}$Xi
v,D0
‚pX<‡[ ;@
/1
‡c~R(>*~-*W&!
,6

[Dv        &*&*
-RS_|1=
)4Lc%
$5ƒr‚#7,OZy2.
7)2]
"„   ƒ+w‚sWƒjRD‚ ""nOEK
8"

"}R>4(={?‚V  b'(I-A
**/+aDb‚,y vD$
fW        &
,53@ 
L9F
BQV@!>


I&&J\/RE@6.

ƒ%
>B!#FH>/v  
mVB&?C‡>       fT_‚%_‡RC
‚h#0$CF6)
Z—5<-'NM+„t®m„
ƒ      Q    Q    Q    M     L     I     M     L     I     M     G     L     L     L     L     I     M     L     M     _    ^    U    _    S    ^    ^    ^    Q    M     L     I     M     L     I     M     L     IMGLLM _    S    ^    ^    ^    ^    ^    ^    ^    Q    I     I     $&u[          9[            ‡<\u.SVWW7B) ,42FC7u
4‡f8s+K<
rU' q(C!#'‡_
=$4c
/Pg+ml$;G"#"   ?$'pJT4(KA

D+      xc)7=+
N

#&$)*'&;(oN
&!p@?*_%- :6$H=Bq%0K2*8;V(9      /r[\:48%k
T'O"‚Lc 
I/1T00%#I_GddG>
)#I.'&B:
'F1;
m[cf


7$
"aM!A
$a1T
q
^ 1K       *\:COP
       
.    (+3I
'<4)j‡B

$*‡C*-CQ84E0-3` t#‡c
i'(‡h
)JR,S
‡d
&x‡exS:dŸ3pBi
§,,OD
KJ6o
 I‡a

!-@
*G_-]¶MH%!
N
c4‚M‡7   —5H~q%8]'
‡b!@g
‡j

]       ‡cB1G<H x0\$%4YEF>—2.(‚5-
Cx
‚@]~SM
Z+d2Ÿj  ?YDpn7]@"‡D/@w8V5E0Miei
490.Q9k.4("K'G
up‡X

"Z i4pH7'W‚49|
/I/0‚2z.&
=}
fžr{‡g
Z!4-pXF
J
g74‡K
]
^DR
C.[
‡U  4p‡e)@`®o
8
`=
@1hV&)`               &'R9JFOƒ?g‡%*
JL
r/+        8      w(
‡]-H/
=iQ†@F
„:$mIS78
&;‡S
5JhC+*/AZ.r`v
5U-  0=
#J4"   T'=DD
e"{5iJ 3?oO"$!N‡\4;,
$$ŸT˜€€€„¿,(=B•¦O($ &/U7!"V 
I`HAu
$'

rA)IKEc?‡e//MO9G—4R/61K!})‚|
Fp

ns/
&„7)‚^
+P\;$:nV!G#)‡[
'0L!*„?pQ&3BPC9?[‚Wt
‚$t+C?_@Y‚1U8!

/
#
a C+F*=
‡_HI.*%!'F B(&
C* 

:/c~
:S2%T%63uI        5S-2#R:#,
* i

+;s.h 0*05#E
@+
!W‡Nn
4q.U"4sNn.ƒ%
#p.‚RW,
U
]8
Xh|GyM<4(d`C9‚&u%‚1N^u-"MF20U‚_MYA3oA*|L‡EI-&1‡ffu&
RLZ
RGM*FBcr&iB' ‡c'
2G
     
]R
ƒ
‚@m
„|K?/‚Z‡Y;
.0
(

L <‚ƒ
 %
A       H$qƒ2"R
9l<
)D‚#t9
IK
V&
e*   Q!       #&
[     ^R    &.3=
7:)     a
D
;H
By<]>qj{RR3m']XK
sB80X+o4        $D
    
2     
0o6v
"3Bh    9A*  
$4‚PžW S>‡f
"w
T-BY4o<7E O''.
L
8‡a  M%L)l       ~T       %!2‡[YS])&>@EE<
-
*c@       ,&,;
28O6U       —4h        C
+‚*P
     FD‚%
9vsCi^^NBn<‡cA
=2C
‡cQL7
:
.1     ƒ-X5Z;na‡_
/F0, 

,‚p#;9MG‚O‚b#?-)_
!
0}:;@*MC#4HS0#W!i7Z
kF
        
;‚r)1*-I$*
il<M=E
r=.—14qg1 P.%Zr?u&Q.H+
Yv‡`Lhg,K'#G2 5^Ctr[H
4,D
Gt
1K8(
3-O?    ,_f?E1ng$RM
9q0
86‚ngHP   ‡v‡h
+( !\
?Q`-9/
@
‚*M‚
c‚yƒ\6‚5HJi*o^[ kv5]‚&,       B‚+2/

2-
J„k<%   OR
.&n%3.
+bY
6@r&D
R       X"0,1
K~B>u22Q~?
 
W
.*%‚^\/a('OU p;17TY.O%‡4`]'
+*"=+>$Q1~3!"       *$
1       *&u0usaŒh‚C/ƃ‚C/blbQ˜6¼2†]+@!…&ƒ1¤[d‚n7   1        ?žˆQ@%+Œ( Š"*S       •<„L4ûƒjEH]+@í.
*’\Ý`¤‚WÚoœL)7       1        ?R‡
‚f@%+»†4Æ*
Y*d        “.G%gm„AB{1ƒt…Yˆ/—q7‚9†K‡ ùe„ão“,’M)‚@„‚AŒa‰I‚6¤…,l7_      Ÿ:ƒuYn_…DH        -s”„'‚P¦^6¾rƒoƒ"‰„\”"Y‚ƒ @¡[“@„Q‚3.‚s+…K–^;!‚9…†X)ƒSŽ÷#Ÿ5JKL—‚,¾d6/Õ^#—8[…b„‚A„‡dÆ(‡iŸ]Õy‚j®q‡h§G˃9‡c„B‡[Ö‚žvP*¶Z=
]‚5‚    „.žzs+„fJ
!I
‡T®s—q ‚
""ŸV˜€€€„¿0Â0usb‚
ƒB…‚~S“Vƒ?˜šK
?e_alloca‚….»c"ù„I
–f"
fcntl_tracÁ;ù—uri‡ªJ
ù‡'„Âzlib‚ÂMÔEø˜$†Óless‚„@ž«4‰i‘˜*„º‡$Ÿ‚P”
rE†0‚
†F‹›R
Ÿ
ŽY

RJ‚5‚D       ]c
‚job
ŽK.™5ŽV‡s        
…@! „^Ÿ_.‚v•\W‰?:Q“:‡I¡AsŽBd‚8+„Rƒž~”Un¯On
‡}‚ƒ       f‚@…†

',Q…
ƒ>‹^–'Ž55E‹HGBr‚5&3…,‡<T
AD!)U*-J1`„=‚pd& ^

    b‹#‚;{N†ƒAƒ%†-
                w,’Œ@‚E¬T‚DRV„R„(v—3»?”ƒ 2ŒK

3S$‹K§
Œ@X[…^…o*‚'†wŠO‚e¨c&‚'ƒ.\‚M
7E †1…‡[ˆ J
ŽZ‰_ƒ\‚<ƒ8
…dq^n=N‡lr=‚!?)<i‘\NO,y‚8‹rƒ

‚M‚1,h6J{…‡17‚%–.…er† œwP…h†i‚ƒˆƒl†\Œ,3K‰ƒiŒH‚†.FF‚PG‚s:…$ƒx‚_‚ŸU=‚Aƒ,“L$PD”k‡5†0so)a†ˆw¦“HÇk
˜
:+…r5‚'#†b‚C‚OAz(„c/FZƒMƒØH
‚N‚3~‚UŸ*Bkˆ<8
–"Aƒ‚r95ƒRD
…8
¡{‘Nƒ1‚MÃ.&n††M)Bƒ+
Žþe‚5¾8 „^
3.h       G_?:Qu
ƒ)s‡-
„`d+X‡d(WŠ0”Un¯OnJ
#f3$0C
', 1)‚
‚E
G6M.&3…B,UT
A00!)U*-J1`„=‚pd‡T$

    Ÿ
„
                w,’®oz¬T‚D‡fP—#‡‹@Ž+U2r[0
‡p‡h$Õx% ‡‚l¶Um—:(„‡}{/0
q^*=N   y   %=!?)<       ,¦Z
‚M@
6{Õ}-‚‡[‡‚
        I>3h:‡e5N
B‚_Æ
Z‡^OXuƒF:so)O„,‚3‡‚#‡q|¶J
2
—/
C

¦‡a?'w
95Ÿ
Ÿ‚Y‡g K&nŸk{
ŸA§     ‚+_data„6/#B†:7    ‘Z1-_¦   K„ƒw7vers‚Òy^‡ƒ¾<f†U8øŽ4…Þ‡`6£‚merg~ Çu„3
*  -c“a¾V
u
*             ƒ/
sstmtjourn‚’+õO݇:ó*gƒŽÿ‚leep‚Š-…dùƒA„“‚.r‚Ož"‚y•›c4‚ï‚ual‡M‡$0‚jŒX‚-c‘6‚)‚;xŽG'ƒ~B‘¡Ik‚II^c#dKv 2’@'    +‡-K!
“j)‚œs…„gŽV6‚JŽ9KŽ_ƒŠµOˆŒ”0]ƒVƒÉq‘7`cˆD4(„.a„KP¤Œ[Œjº#ƒl
„wyNˆ…s‚Sƒf’%ˆe-;ˆK ŽY‡SžŠ`”H$Ž)Ž-Ž6]„S0„*ƒO…G„DŒŒ`«X„T„065‡p“*‰        ‚
n…
†lƒ\„
‚{‚c‡!ƒZ‰ud&ƒ[‹6 g„^‚f‘ˆ’Tv+‚{/{x|‰^$‡)‚R‚]‡8›2?Ž™Ub—†o|‚I‚TEˆ{…V I……c‹‡…6ƒƒX[kšI¥!†Yƒh‚'„ 
C‚KŽS$ƒ…i‰”l…#‘?‹
—
v…}ŽƒHm„#†M…r"r
œ

Šr† —m‹B‚C“h 3Š†-N>'‚x„Q‘IˆƒCŠ‰9H‹‚Ž
†4„FU<‚5„‚!Žö#)¾;
‡‚F      
cKZ
O/‚    
‡3—9b¼}‘7nE
hao2ƒtƒ8BR†j‡AI3‡m2—H®«p‡mI‡p
‡S‚y†F$Ž)Q!;Z
.MLÆ‚#wí-B‡‚‡i‡e—"U§x:ƒy‡y
N N<T‚
ƒ v¦a)R—P®t
…‡bŸŸ
FE‚-Ÿ)—5d=‚R†t
`‡_ƒƒX‡hSZ‡h
7†Y‡\i‡ŸM‡!
iK…P¦ƒ+62    c
%‚5žZ—5#!/#>Ž0KV8##%
%%ŸS˜€€€„
¿*¹g—¨‚LTY‡fYL
o
       ‚$RE:ƒ?  —‡

N<

qyQ'ˆƒCŠƒ5ƒ-s};g"
U§<n‚B0utc„S`A‚eŠƒ{„pŠ‚M/S‹0ˆM˜z6|ˆ*ŽTª9…H‡R„_‡_1‚g$rqƒ9E‚…          ƒ
„r† †
‚v‰;’v£D…T1£9œ+„%‰{‰l-S„A `
˜UŸH‹q†
‘=‹” ‡R
¥GŠW‘5CˆG‘|“@‚xqo»F“:R…X’yÞ›9¹„1–X‚FˆVƒlŒBƒ2z¢…7DkŒs‡U…*“—–2ƒ&‡-ƒT
†ƒ:Œ‰L…KˆAP…„V‰‰l‘Z¨#‰Ðp„-‚m”‚9‹vš‚iƒ2‘z…mƒtƒ#ƒWˆr©>–8ªYóŽp DŸ!#„uŒy‹<”Y«\«/~–ÆIÒS„FŠ=ƒF…‚7Š@¤P‡Ÿ=ƒR‹Iá"‰?ŠX±_„"R‰’~?ŠS…b
‚Œ;‡K’nÕM…–8²D‚WñQ…M*‰|¨„„V‡}†:Ž9nŠpŽ÷@‡$‡‚*‡‚,‡WQJK[ƒ#ˆ„`‡…!‡üo‡_ˆ‡‚I‡Vb—7†)‘|®¹{‡t.‚\‡2‡ƒgkz‡E‡‹'‡‚‡‡‡)Ÿ/§‚a‡(¶VL„ ‡it—;C‡dJ‡kK‡jn—ƒA„Ÿ7‡v;ˆBžsZ‡muK).‡wN‡‚M‡‚O¯‚
‡`e‡hpm‡](‚>3‡‚…‡k—     ‡‚>‚‡‡ƒ‡G‡kW‚RR‡‚\‡<4qOž‚4‡‚qo‡n ‡C—7:—+‡=ˆ
—‡v(‡TRˆ‚O%z‚C‡KLƒ6…:—8 fˆ‰*„wŸR(*BxZ =!$‚|‚(
H

S
q9<

   G    
N%^<‚
a2k+

kC-
        ~›jäRŠ`¶LÄ0Е`®/       2#      L
,P‡N[        ^š@ŽQƒ@UgKƒ{Nw\!K!‚m„|    g‚2‚,
2,ñB†
Ž“@2    )/"       6$&%, 5ŠK<B
¤
 Œ®i†;               [Œ             µA
Sfˆƒ1žzD¬\Ä0Ÿƒ82# L„øGlü‚‡‚|Ÿ2 )/ 
$&%,  5¾QBí"_‡u®ai           %
             16CC{7‚i‚&…7ƒz‚*c
I=
Ôm'^Fƒ^i„C„
vù
(‚°Qa_‚‘‚ÝåEt_alignC
KbC…@{‚„{‚bƒ{ƒH„V       lƒ#“b“©‚„ÑoAlC…B}‚…‚dƒ}G„W        oƒ&
ƒ2F“^“©‚‚ïLFâV=8„{OLegƒ%z‚,„y‚aƒy‚'F
†}Š@Œ.GG8!‚)      fƒ'§5
„:ƒS
*
¤Bt     ƒ“[Žþk</„ªJW!~»„Õp
‚Ýa
m
*åErÆ‚;¶h:il#H3
“)-ƒ*¡7•     <›
3L…p.k:X!w¸(•Z‚    XˆC„‡M‚ƒg†‰
ŒB]‰p¢d„†#ƒB„n}&a”T     ‚      Žöp—0+ƒ*¯G‡]¶ZtÕp
.k—6
wXü+õ(‡‚Ú2—?w
â58õ‚¦       ‡y<Æ      m‚
Šiù]
ƒ}mosth\uid~‡v
 
¢s‡6"Šm‚nVM
Ši
™%½Pa
/Æ2
‚Ÿ
…"Šm‚nV„ÙM
>Õz
Jv‚—†"w~
’f¾<
‚Hxyz¢m¾E=wp'zv7#    
       *U#M%!}##
(-
m‹öY˜> ‹
  %&w„L‰C`       ¸UŒgŽþ\¾o      
ùR
    %‚ç)nœc®tNœ^Æ—‚9Ž…
O\_ƒ$k

""ŸV˜€€€„¿0Ä0v1})ƒ-BÀ„C1-d
        µ==†¼
4
12oo[k„1
ƒ4*Äh-e
•ñ3‚gÄp1•ò1a_list‚wšd
cuum „\VC.EE   3]<
1:!
#‚L‚Z‡D Š`„Y_‰:pF,/(

–; !
        8À|
É?ŠHÞ6‚‚"¬
‚kŒX¾|‰>–[ƒ6
‘D"ˆ3„-
‚@~ ‚>À\›"0m‡c„0~–-/#@Š-4'       .¥>†V
u       
„3:„#&µ9†)3‹G¤  Žö]—k¶U"B,/(

  J !
       8—8¬.
É?ŸaBÕ`W¬
‚k§  e‡
‰>ò;‚°V&    /»9.4'  .!J

^å&c&¦r7‡lW3
ƒz Ÿ"lƒ†m—Ì8Zgrind‚(«\'U     •f57ƒ\¨GŠ_†n‹8ƒk…‘ˆ88 '
MƒìP‚‰LWí‚b 1‚j–þ…            2‚–þ…$id‚; ‚"‰0
šxf‡dƒJƒ
pKKbq„@!        J
„u5G\?+…<C‚lƒ       ~‚jJ7†O
<•±‰F`]…c2…T„iƒO…1V{‚O‡=Š–%ƒ„7‹Ž ˆ^<‚l×©2tv”*yƒ
“”4‚jƒ8x«@ˆŽk}„E‡      {‹†X‚7ƒ\—"’J;‚‚p^
‡j“D…

‚?‡3š¡       ‚)ˆB‚`Š       ?—^‡~Ì0‡¢?„k$ð^„†‰!<†t…\F
@'†U?
Ê5      G†EX‚)‚ #‰( <ŽövåN:L±‰F`]…c2…T„iƒO…1V{‚ON1†nŠ‡AZ

5HÎX‡rPNŸ’B‚\9sŠm‡d6‡isÒ#Ÿ®kÆ)O‡u,¾6H†$‡c^;—G¾9


      ¶XpXv.ƒf8yN3—M
C—‚'H¦‚K2¾‡ƒ=¶‚"F
@'   <
.  G
X #žVd„f        u{7
?‚     F†N#
A„]_‚.„9:„rƒ^*i
'=ƒ*
N?#PMAD6<3h-,‚bWJ]Tƒ\vVƒQ.i

 
‚.   BT    %37C5‚!"    &o†D\
C
†xv       &3
#5g             4">  
        @‚/ 5/64
(
„8
,GB[1_
‚?
1M+o,8`1q?)]&Yr-M!''c$*#$

WjF†IMOAh9/d‚xp‚8

+!+ƒm‰80‚~}Xb#
g‚.†z' !D'-g!/
%
NH
;()N

,?  U"i
O
 ƒ<%8'2,
2H
('&P#39
    
h
,`
&S
#.
!:6u
`?6H(q
O
$.
ƒ/
G >?

Z$7 d9E+Vq,
i
Uiq
4d}}U8(.o
        F
]mQ!      5
@/0
or*0‚y==]^‚*8
+


$r&%"(^&e*%_‚NBz(+V‚s6G_!        
]4
,
!I
„? |>
1Q/
,C<:#?

P,Bƒ,7…\
*ƒ‚B:†n,/    /
R*$,Bf1,{.(dl(!‚8
"
h
V3;5
*  ‡.„XHxyE4+†sB3‚%_M
    ya‰?*Rƒ9n†U„F(\/TU-5gEav?h?bha#
c)g,(3!
„)5H†\,%>
,…*3‚#‚T&<U(‚‚L!„$u 

F(7U8 )„":
c‚\j‚     -‚=…V2
‚;)G!Xql( o…-„/
‚PP!m0$Wa^01:)5%‚@…+.
*+L

=
6k?N/,

(„        ()ƒ ‚7-'x‰$†}o| ‚>&„'-
w/4)j-)CJ7J/)
+-a/‚pu‚)‚|
R;~*nb
=dJ 
B.
L# 1/].Rib{
-/<†3h‚‡„3t‚<ˆ='U‚'‚OƒcD&p/(T17.‚‚‚+
&A"/…R     N„7„*=+

B' 7}$0
ƒ^"
‡
!ƒvƒuN
N6e    o
‹ƒ kJ)?I1„u~‡L
!!ŸW˜€€€„¿2ãÓ#?O
ƒ/Kƒ1o
‚_"‚…RDY# 5# C        WK    Dd}qW(
              K0#‚"029Ov                g!.9xH
/vƒV
+909_ N#      K^‚~T$^1p/8JƒS!9@%48'5?.E8'5…*r(+ƒd‚lj.C‚d%].
)‚>q-WRL<„&'  u
„Š5303    &.=„WBv‚$Yˆ5…f‚6…Fk8(fj$
;91A3B
Z=&x‚15G
!+2
„
( ?Bi-.ƒL  Q4A1,!`
#*C/4‚L$o}
.+     3'6   
ƒE#@[)vn‚gA‚b„V‡AMAd(„H9$>c. 6U.
;8 
!‚@‚\)!Q"
.<n($6(
{
j
2:<   $‚&


MpF?"*‚‚j‚iB
.Li‚fwq‡/„d„^+†!
&@…\

     '

        


6S
        

.
''''.''''''''''"N''''''''C'''''''oZ7>'''''2               &ƒ'bH
@l‚:‚T¯a…0*ƒ!)‚B`‚  2  @…;„‡     .‡gƒc\3(CƒUo'<'„aJM@&I6&-E       V‚:ƒQx}+ƒ^Š*.%!Š †"f1v†M…k‚E„g u˜|$…7(gmŠ†!T
O    V
!-
/)%=
@"G
>       K
w$(2‚2#!
‚7ˆƒ‹j#l‚R[        'U-†‚,{       a   ‚3…5t$,#*%:80;‚P$„|<
*mq
ƒ
n)C_‡s‚$‚
"q\Œ)ƒO‡p0‹OZ‰<uz‚h‚^O+LƒtEƒ#y%!-#
‚$„oNƒP
n…_3‚!v‡&iƒ ƒXp`NƒB†i˜V[0M
‰&‚
|ƒK„@–H‚?ƒ-a³v ‡BJˆlE=
EU      X‚-!qSo$
-?  ,
((sG‚`
;
7 J‚J"ƒ|ƒgAv‚?&c""p‚:†eF ‚BP+m   '    
.W
s„h                                            X‚b]-ƒ8„‚/R†D9…J%%*[:/?.‚6
U
„-Jƒ4O3   
.    }4     0„Kƒj|3
%
`^i‚‚\aO
;4Q       
tƒ`‚TG%G1PN_+,Q…i<+
Ga_!

>&„Yƒ‹&`–  ‰:‡s‡N,–'†/x 
*  "%!("l e+C‚ 2G ‘0w7†]X%‚YkMA„w)LVƒIƒ

@
d,„     9Š(‚=‘%ƒ6ŽB6j„g, O:ƒ;ˆ†0U‚?\0%gI;(0ƒt'ZOhjbX:2M!(m‚*M;     QFƒ‰v†f8E1C:‚tŒUƒ3ŠV‚#„0<‚t!s+'ma„B†‚' Nw0`>:M@pNf2F(Rt
J0%„1?
‚>*2
jZ
%93%2gING       %
„:ƒ#ƒ0‚5 5[X
‚#
s‡@>‡_"
?eƒn   4`&8H]…lˆr(1
m
G„C$”…
fE?WkE<
*<P!HG
&8-),‚+vn2@4‚k‚x„)‚TC\"'
"
ƒ       …‚  ƒY…E‚)gJ…3‚P…„<02ˆL‚Relƒ0‚P‚;/ho‚B‚g_2      #%.-.‡‚
‚(ƒ%U‚‰
$,&GC„…F)
†I„Xˆc…s‚o‡]„!
ƒ‡>Šy›  f…<”($‹A‚1U§R‚H‘Z–xž#9@
Žj@‚rƒ
†z„…`ƒ‚6:„k„'+93;   
c/@B0P
†%:&…HJ‚m‰(‚rZ,‡† 6„‰MQG
#D)„)‚H„(ƒHŒw0…5‰ƒe‚V…t‚V…-…P†k[‚
…!          u)
g"g
2ƒw93d2              
D„%Š4*H-W$‚H‰„PQ<




ML+R     
‚4"+"„E‚"ˆXV‚ƒ:rw„`„"L/z‚kuY                k{V    1‚
gˆp#B|tV¥6              ,(DDK‚m
[$<i0
b*!+U_$^ˆ|"7,…‚
bŽþ],%>
,„_*3
V~r&<U(‚d!—7m
„     -&/
LI0$
'$^01:)5%S.
*+

=
6k?
/


 2()‡U‚3-'o
W&
:-
*/4)
1-"CJJ/)
+-
'/>‚)/
;!*n
4dB 
%
L 1/].RKbD
$#
4ƒ-h‚HƒS3t‚<…
'Ud   O;D&0!("F17.‚‚‚+`
&
"LR        ‡*
!‚F:"=+

B' 7}$0

ƒ"‡h
!N
XN
6e Y
$ƒZƒ kJ)?#?O
ƒ/Kƒ1o
‚_"‚…RDY# 5# C        WK    Dd}qW(
              K0#‚"029Ov                g!.9xH
/vƒV
+909_ N#      K^‚~T$^1p/8JƒS!9@%48'5?.E8'5…*r(+ƒd‚lj.C‚d%].
)H2-R-<V&'  u
I N303     &.=„BvY…k‚6
  ŸX˜€€€„¿4ºbþ}&(k8(fj$
;9DA3B
Z=&x‚15G
!+2
"‚K( ?B/-.3      T4A1,2`
#*C/4‚L$oG
.+     _'+       
+#@$)vY‚gA‚b
VCMAd(9$>L. 6U%
;8 C
!8H‚\)!Q"
.<n($‡>(



2:<   D
&


M
\pF
?"*,.     

         .Li3f‡Sq—:@ƒ>

     '

        


6S
        

.
''''.''''''''''"N''''''''C'''''''oZ7>'''''2               ®oT®…0‡h
)G3$2q @/Ÿ,'N[3(CƒUo'<'„aJM@&I6&-E        V1ƒQxK+ƒ^Š*.%!h†"f1I&$
(h#‡G(Ÿ6  ‡g!-
/)>%=

0"M
+     
-
m4$(Ÿl§p‡c&
‚¶T@P=y%!-#‡ffŸ$‡g
t
c
[‡h
‚a3v§fD*p`C5Ÿ
|‡`‚MpO‡Y
Ka!‚(    žz-!    
(‡fsG<


7
=J!J7"‡hGp       : 
0 
LP?hm    '    ®q9]-(eR6‚D%%*G:/?.‚6
U
‡S=3       
.    n4 0
8ƒ@?|3
%
‡^`^ 8aO
U4Q   
tlT `%G1PN_+,Q4z<+
Ga_!

—."  
*   "%!f NF+‚2GŸ!w7`X%
5‡]]FAs)V‡&

@
—
‚‚>
6‡\"‚`g, O:ƒ;…<
ƒU, ‚?\0%gI;(*'
h4b
:YA!!mt 
;    
I‡i
^†fE1C$/O
cU|‡‚!%L<‚t!}+'('‚^‚‚' Nw0->:M@pNf2F(
J0%?
>(*2
jZ
%93%2gING    %
T(‡G1‡g 5;X
Ÿq/‡k8:"
<e‚      4`&8H]„
g(‡X
  
G?
WO4<
*<P!H
&-)H‚+vn2@4
lk‚
‚/&2:"'
"+
I ?r      >|„-‚

J7:<02/(
:žX—7oJd)
c        †z„…`‡eZ6‡eQ
+9; 
U@B0‡`
M
‚h:&FJ‚m‚WZ
 6
M&G
#D)ƒ]+vq—‚‡.4S
:‚VK
‚[P
†+[@O           )
(O

2<
3          
 ‰C*H-W$‚He*NQ<




ML+C        
H"+"
9‚
V9

w„ƒfL/z)uY             <{1 41
g"
A#BPl‡G               ,D1LI=m
]O"<i0
b*!+0valuabl·I¾ƒle1‚,„?„*2‚
-„T„R+
_blob‚    „RJL
£e‘(`ü0…íyt…,‚
ƒQCL
£k‘+ü6
es16‚ƒOC‘.doubl‚L
¥ÏL‘1üŽ\ü‹up7#kU*encod‚‚[(&fre7
D‚       ombind‚„!#int…)‚‘4
64‚‘9
¥`\”å>
‚H\nochangGr‚ƒ0J.Ä{R"•ùt…1R
umeric_typ‚
‚point‚ˆ#‰/]X?†h‚•ê
M]
?$subtyp‚
‚W:†n•ê+text…*‚lN=}  ‘>
•
-“©~<³Y
ƒ!-16‚(‚Z‚1N<‘B
b‚!‚
k‚"‚
l‚‚   m‚"‚yp"

=A{ŠC    ‘E
¥MdÀO“©gP»D
‚5d”high‚‚“Élist‚_ÝX
ùn”‰eŽÿ˜;9/3%2O*C$G
!!ŸW˜€€€„¿2¥‚80vanish…yb
•“ØZ
]ú'r‚ž •œ21ƒÁM—ÌVHarg‚nÜ»4«>
øzT†ËU
char}„y…`#>
‘*‡"‡m
ˆƒ[fŽB
%™W…$n
—‚O“V
‚)…4µ7G7>ˆw®<VÝJ…ŸwÒ‚L?
i‚34?‰>‚FˆSŒ6„—|†
‡#ˆ„F
‚r†"©G£‚
Å:ŒRâ'‰N
s‚5  ¤@¬4z
I†Q„ˆ¬2ÆI
‚AŽö„QŸ >ŸuT‚4|¶‚(Îu‚×d³5pË&4¦mxåIƒx;]‡‚]J`=ablg       ‡Y>‚W1-*H
_:/?M%!

‡s*6%ƒ0@†Z&B2 HH1#‘",   ‡/¨© ‚rŽ?p¤      >,‰
†k˜`ò{„Y‡_        )-†   ƒ=d‰½–<‚L†0\”Žfƒuˆ75Q
8‚‚hœy.Ž~žN‰^$”}
–>]ˆ*—%@½bFˆT¤…:¢       £e©yŽ.Wœ{‚‚h‚P…†B,</6‚4‚z5½2=
'‚r
…Yžtìp,‰]Qnü’h‚L‚
nü`N‚Ð‚.‡ƒ—D>§)N—.j$¶_e‡d
‚J]¶V(®z
@2Fôd>Ÿ‚C?
rW7Æ„d‚„“ª[ncƒ…—ãn~t
Z0M
!„hT:&·iÍC&KK 'A‚U…{šdn½„ƒ3ƒëdN '%=Ë]ƒ†`*¦q1t‹!ˆB‡IƒšN‰F‘H‰x¾c†…{’RÅ'«r„›‚Y¤³Xeti‚†³(ƒ_„)•Rˆ0ƒP‚8„‰O
IÓKˆA
oŒAµ'ÜR¬‚*/IRƒ-l‡‚5‡J‚™ m‚MM¾UBnt~N÷A?5‡/1aT/4"}(vƒqs]"…]2…c…W:©}?:IMdŠtw

½X?!D (D1aT/4"}(vƒq]¾-‚62c‡ÿ(C?:IMdvw

ou


)+)‚R   

9'      †g•%ƒ8‚‡c¢B£&Òc˜—h„Äy‹‚(‘g‘T„nÃB?Œ‡?„L„vQ…‡;¡v†S•qŠ3/–$    „‡@„9&ˆ#…"ƒA‚_#‚‚!•e†?…<‰F%†R        >%…“l˜ ®Y…+†I™`‚p
U‰uƒ[.?‚Z…[„=…k”q‹BšHhžTˆ…NA‰
–NX3¤I¨-‰V¢#Œ(‰uƒ^
3…b@-.Ý
Žg‚`‡<‚.§^N
•iŒk«”o‚Uƒ eŽöw,    Z®f=‚y]‡U
> ‡6h—4t³_R`‡H‡ƒ‰)ƒIL„‡L
nŸ‚X®KŸ‡d9†Y6F>¾<$Òv§0‡„]Œ!7—$OS[‡c.aNMŸ WB‡:ŸƒLAh‡S
s…N®‡rT§= 0¦G‡‡dJ¶_‡a‚)‚.‚8NŸY;VKŸT§    ‚ —7cst—F‚*…kL„WNŽ÷x…Ÿ-Ý\J‚þhLbegin‚
‹ÝöNc?Jolumn‚‹R<ÝX÷<reat‚
Œ&Ý÷Xdbe‚4J
&/.‘4A¡W™F“b¤
7Ù2^ÚHlL‰…n&N%'

F$,<*YI.#Š{„zE‚u   <0†S$†D%f›a.-@“QƒK”m‹0‚zŠ
F‚Û,]=$‚Üa
/.
‰2#¡W™F“b¤
7œ \…Þ+O/¦ƒ
_addoptrac‚”Fr‡ÒpYƒÜ‰U†ú‡Ddebug‚”Hr‡       Ó:܉W†ú‡ Elist‚”Jr‡ÓU+܉Y†ú‡Etrac‚
”''r‡
ÓU•|%ÜZ
‰6'†ú‡
E api‚}…ux‚†fram‚Ù>ÝÄpint‚†mem‚†]estroi‚
Œ=Ý÷oe‚‰‚G˜\ƒ&ì1*‡™g{ctorƒ\+*&ŒU¡O§
 q‚pY•TƒŸe‰
4'
çL‰p½Yžs§
«~
n6ƒŽ+å=2hicl‚Šloc‚‚Xndor‚“^ˆ9‹ì#Qˆ®er‚‘YñrbƒG.@@$;u¨‚<
ª?,:)‚E„rm7]‡wCiB16B,
(
""ŸV˜€€€„¿0‚v
‰%’W¢M H0ø…+¶U

‚ö‚ׇví=+     H0    0verbatim‚
‘n‡wü%$†Ë‚ os‚¤i‹0
¼FŠ‘ˆW1…õSOÎ&b#
‚elistƒ¸V—Ìdant‚
œ„/fuegbar‚ˆi†_‚M
˜LŒmšŒDŠ\†`u"^      ’p!‚RZ‡$‚aŒqJ„'Ü1ŸL‚Š;e„·ŠŒ‚p6ƒsU™0™Z5´sƒ2‚cqAn[ †@‚KO‡/‘%W‚c-Z„^O‘| ’^x‡@…g†)
Œ#‡,…‰qŽ(²#„„<ˆ[…‚f4 –9‹l
‚fŒ}’mƒ7ÂMo…d‚'£,F–bƒt†Jˆb„(‡9/#Q„‚S
“nƒVŽk†]–9‰G4„uˆ^8>„†0‚       ‡zƒ`‚…I‘I‘n‹h‰"ŠBƒ)—n“;‡`>‡>…-‹ˆ|¦A_‹3wt@…`¡u0°P„_…E_Ž
ŠS
‚\‡%Šp
œ5cW|‰5„]o
–5…EUz†G‚5Žöz
‚PZ
‚a
ƒLJŸL—„:ƒ61†N
‚3žj¢QŠlc-Uƒd
…Y5$|#qAn[†@rÎR—+Z‡h\‘…6c

      !
k#O{Δ7H®n
[‡‚B
}‡U'
,¾&ΗnŸ"a„‡g\8>‚‚W‡(—‚#EŸƒr„p‡aZj‡Y‡>…-¦:"‚.Rl
3¦.¶^
„_®m
ƒƒD‡r
‚c‡YUˆƒY]zfŽy³?‡#…Xƒh&…0‚w„Bƒ7‘ˆ]:ƒë~      ‚È0®m
ƒ7iŽn<‹3„$<&#5ÅH•+†ê!‡M’ Œ+Å“H\ƒ?‚)=‚Mg}ŒPr&E†L2‚l-&;>ƒB„Nƒv"c]”M>Z†Åc‚
:
§qžqƒJŠ]9—4
‹J{„&ƒC^@-‚z…l°C£ƒ6¬H–ˆK£Y
Dƒ'‘N
a¥—x
&…¶ ƒ-…$ƒpRC‚d-‚~u‰A½FŸ
]†Ÿ3‡Tí‡jZ‚1=
M>}

r&
7{
eL2-
O;>
01U"
C‚‘p¾
`üi@Ÿhi®d
ƒH{‚‚YO@-‚z¶„'„¶§M    ¦NB-‡ra¶L$c —‡‚g=RC‚d-
‚/‡§".v
y_checksumƒ…72—¼l
2cooki‚T†d†&!ˆO†q†sˆv‰(…FŽ˜/•_O7|%“n“|Cns‚” 
:       VO„)(W(„U-šDˆt‘Ö\O‚¸U(ea‚       †8…É$“É„‚til‚‰ion‚/^qJƒr6‚?d‚Q‚;
S„w‰fŠ;&‰
‚&†U‚;‚U
‡;‰w…‹4ŽG
…(†bj*{J@)‚&…aT*‚.‡;…b0
ƒB)‚
‚D
,2Q9F
+C(<‚L/= ef‚y#…e7p

T
‘*
Iˆ/J|‚
„m~†(ƒEˆ{#"$,ƒ"    
ƒ26‚<‘L&…
,‚CR‚o?
”N9…2‚`

„‚xWh„ˆc‚_†7„_Ä=Ž~°u•        A?*†|5j5"‚k’¯2¡!™f=
ƒVˆR†3n8„v8…m“XŠ/"#„œ>‹¤q†? (
†…<
‰U#‚@
„X'‚-—0Œy9]„P)…„L…a|J3~tD!‚%-;ƒY?r,ƒ
.x‰f R&      j‰c‚*_œ,ƒWa:)!" „†/ˆC‚Dƒa„ƒ‡   ‰Šcœ$*
?i@=AKS„9„ˆ‚–†<‚

…?“7+” †Iƒ-Z„‡R^‡N
4v‚.X0…@|*‰G
„ƒ(;8."%…`„LN&ƒ<7;‚?")„ b2ƒAD‚a]M-96C6& )K3$W;+8n';1|;,5;u$t     (>R
F'!%# =#
H5G++Bn#P+3 3E38=)–JNƒZ waƒ]8ŠU†‰D9ƒV‚T„…g'4%9       \L,x‰n_]ƒI{Š0*kJd    =2            d&F
…
„‚‚‚=
©u5…~
 F,5;8h4;uGU<O@‚},uB#$V&5{y!![zu&*4 L [n+S}$"H"J‚+"M
3pe%
n#F‚4‚8Dex,LtUY)@^|/1'P!F030
 (
0`3=4#K/2/S^$;XnET@^8J0@.


:1#)#I';‰0n…*4R%
""ŸV˜€€€„¿0WÇ  Y1#
'
R"A'
#E+6
     .&

c= %


&

%/.[,-‚W‚v‚„d‚‰Qƒ/ƒq„ˆUƒIS.
%7“]G‚…y1ƒ<v
      ˆ2‚„,ƒ5i‚SG *…‚

>‡"†‚!%Š{‹\ƒ‚t¡(“X‚7XƒR>†W …bt@†w„‡!‡W…q1/˜†%"„|9./<
&0(
6ˆ
„ZF(Š!†y

D        $5>5S…]„X†(
‚f„&‚]‘†‚z‚ƒ…{‹0ƒT#,LŠB‡)
‰*
!ƒ'6!+0      O@de(1’m$‡eLƒS‚?orƒ>
bC‡XHT     +=Ž’`E‘9$3¸^J‹/‚„9
&›„…m„sˆ
…
'U$
ƒ<?        'f_+0$_‚-q0ƒf%
»\3*‚%‹‚†|‚o %      ƒ6
N‚G‹S ‰p2ƒ58m56D8
qC5
aE‚?     B
      
FZ+
‚$
‚x†Žös‚<

&
„,R?
‡_<J7x‡e
R}: 
ƒW‡^AD31‡5‡bA?*55H
tO¯2¡!™f=
Jv‡8 ‡gEmi
‰x"m!
>0
…>‚
‡=‡?(

z
‡„
—7
—0¶ƒ5—3
.x

 &‡‚w_06ƒWa:)!" „†/&u‚Dƒa„ƒHs
ABH‡C
?i=A‡ePt/Ÿ#EŸ§A„&‚.§,ƒ
)2,D§
ƒ‡a)Z waƒ]8
`M{‚
.
Dž]—;w‡q)‡]Jd    2    ¶^*‡:‡5p
‡[&l
^S/‚6
o—o‡h9—32‚

P%‡\
&\P*‚t‡†P
AX‚k‡+ …<@…$‚3!ƒn‚1/1)9   /<§‡d1     Ÿ
†(

R
‚-ld‚gC
>#
L
$

¦Fk‡K(.‡abCE
IW+‡7§Œl‡C‡h
       9‡0
PJ
‚0—
$‡w^T:[
'$
5?     '+0$_,g%
3
7)ž3    8
m 
2        \%(D8
q
~5‡$Ÿ
$0version_3_35_3‚“q      numbo
5[p†xŽ‘/†ë‚&id‚q“}gu“KZƒGŠV
“h‚5Jœ?†3n”(    p…[61‚w~ˆ!…*ƒRŽ÷‡i
‚ü|õ w—D‚‘!òýo®pü®~+‚R)tex‚K*Z%-ˆ6Uƒr”—/1%-
6Uxyquick‚…&¨g‘‰+„Jstigi‚
æqt‚„…[‘˜„уrf„{
0M{7'
Ih)$1-
   q*"""


       ‚u#$        =ƒLO#!S Hƒ          j 7DN2!:D"ƒ12N-
(…)&+3
-+ƒ@$…4‚\
      „@~
„
ŠbH4 ‡ ƒ=%šŒ‹bY c”   •(N(„   )
&
$
J

 



                       7+p„ƒ4v$†ƒK      )Šj{       .†   ‚M³CW…|‚
ˆc&¦N‹™ˆj$
…ˆj•
>",10A^ 4tH'           )&o    
ƒ2ƒv{zE‚Ë*ƒ„$DnŽ$
‰+Ž^…1ZRƒ]$9#?     Š+®R‡^Ž{        –/#„;‰"}%‚V'ƒ^„S!‹l…`Žöw8u
T‚]4ƒ=ŠxŒPY  
9‚ÏX„"     ‚M$
CT5!_Â           ‡[6"(10. $4tH'&              )&o    
—Ve"{zõ‚;u¦ƒC¶Zˆj…1ZRƒ]‡b9#\        M
…9“!7^;# 
""ŸV˜€€€„¿0°o—Ï`
‚4    ®_F#
;"s"%'S¦„`0vfile‚…S£ƒ5ter‚
ŒPÝøs_find5`†/9‡V_ƒm†)ù…J„ª\[registdS6
ŽL‹¥R £%6…>       [ƒ–¦Z‚9ƒS ˆF‹&ƒˆ!¥Òv
‚d „N„ªR< a—ƒ>‚Ï‚;unregistp
4Ug7†Gep72Sƒ: ! ƒ?k†\‚8ˆ@     Žj
‹œ…e‚2Jƒz‡y!‰K±f,‚&
N.KL‚?%
Šm
S*‰TŽwŠ0©ŠA-„„SŽö}
    
Q®j1҂߇iË
       N.
L$—6
ƒõS$„‰—…¾+Z-infoƒŠ$—Ì…listƒŠ,—Ì…og‚ÁNu
‹[ø—%‡’
`name„      Š1—Ì…statƒ
‹0e…T˜Šl
5e¶„_initƒ‹G˜ŠLtrace‚‡X•£r:iaš]‚.‚"D31ƒŒ…p›l8 ß‹t›–¯‹…'˜$ˆ;Œ„1+‹d«"Š:‚iS‚{”„D‰'‚!˜ŒrŒ:…wc-p•!—Ÿ?‹d
ÜT^ƒ
…
J‹u
yÈDAÃR(
„{U„wŽ÷
<8Æg‰u‡;p—A†N–¯”/%‡kŒ1ˆ;‚Hƒ#§P‚™ ƒ9‡k_„qy9‡`7õ=—ƒ‡v‡…b¶%—/g®;®†J„¦g?ˆ  ¦g&Ÿ!
ƒ{Ubl‚„jQ+Wbrant‚‚'ce‚†7‚…É#“É„‚el‚4
ˆen‚ˆMw.w„^,!")„L"N†   
‚A
ƒ<  
f6F$„#      ~‚.
~zdv
ƒ6*
‚)%
q‚
ƒt
‰ˆ
rˆUCXZ      N
¦ L’[4%k$‚xŠpÏ8Š•cÂENŠ‚‚PƒŠpž·(„dG‚Z)t`vEˆ-   ‰ƒL
Žay–$…$‰‰o…jz†'‰\uq^¯_ŒK‹AˆKœ³r‡n‚2u
1†u2±5‚z
‹N6ƒd$=’+‚Š
‚„k„M)Ž5G&…r^žDœ+3=‚(ƒ^ƒM1ƒ
†5|‚H$& 
( ';ÜL‘,•<ˆE,&ˆ,À'4
(&;c6 
o&V–ƒTŸ!X         ‡8‡X‚4%k$‡eVÅXQjL'N퇃        ‡’*l(®%‚p
 yŸ„_H‡ik‡‡z
q^Â}%‡a΂‚z

36a‡O
"„‡ah§M9Ÿ…r{gi=l%®0_a‡v.—"& 
( ';‹8—9X
‚!®myP4
(&;6'er‚µ3ÕeƒX£B‘ˆb(…Î|/®-Æwgil‚›g‘‰<Por‚„7kash‚ƒ)nitin‚
UÝùolat
‹‚S7Cd_8@0-2)
†M„XD-z@
‚5‚„w„O±C

"232!”i¾T™’P#©D%+(z‚…X†Id‡_$›ŒzŒƒ78†W#Œ=ƒ'(ƒ5„nsk/„h
3\Ä?„6
ŸB‰'„ ‹\‚c’-    ˆXÅa—@œu

œ”+“‚7‡‚ZÚa$¾A/‡„)
…#…7'(ƒ5„Usk/
3\Ÿ„uÝÝ…hå$ionsint‚’Drtu‚…§8•Úƒal&W
„E…?¤y#†;„(\+
+          […C        2         2"%!.?1+ Rq$
#CU$9
j $‚.W:F
#ƒ$Om
Z>1       "&‹c‚%EK%#!

LZ0%        -)9+*yW
J,       …t      "uGHf†qa2      

JZƒWfuŽb:
^Jhƒ!‚T42D
n„'AQ‚q^p`-c
‚|

ˆuš}š;F@  ‚!G?RT$
Z™+$o'‚r:‡*,-&†%
t7$1
8%
ˆeV"s…?‚m%‰+ÌŽšO#/"I%j„3‚t„#
7J&!a"$:EƒKƒ‚u8A{‚X„…[Š)‡-‰TW„P{„uhMl0|y‚LN2Hƒƒoƒ$wƒ(†_ƒAoG
Zlƒ:F


f5Ii&/(D‚‹O}„1‚S‡‰KJ
3‚u‡Y:Uƒ?ª„V1
ˆv„™^„x‘‰;l’‚6;       H;"‚0#$„,ˆ"9
ƒ7
!!ŸW˜€€€„¿2Áb‚,……>fG=z‚X8 ]')'
&.† 
†g)9†µy4      $‚Av2"W8e#f ƒBƒ-x>v08‚4
EK-z'Nˆ†8 ‚ C
2ƒD£ˆe‘ƒw+4‰…IP    `9f5†w8Š2 QŸ       “k„N   %-                      /#                

 !
     &      %#33%2NI.'     %       71
,?F! 
'a2      $@$8^%     "FQ
„%lI;8iAr &81
7)G8/^'ƒ   $S8S;Ql`  #    "!6
;D
"
%]v- 6//2),-+[
&0            M/,Y{e/      ,       (‚H*X8‚5
%'…[L@T& µ|†T–"„N‚fg
ƒ5<pƒ!7(I,‚% I$-O’21}       D-„s
s_.3
ŒƒS
†:-A;5
„z ,¨i\‰<,5R6'
LJlE1r/ Žþ_"0%   -)9+Py J,     )        "uH
aG*   

J       —<)—1^    ‚6

467
n
ƒD'`/Q5`-`
i

ƒD&(;F@  ‚!G?RI$
Zl'?‡,u,-&…}

t7P1
8‡iH0"Q?
%6
ÌŽšO#/"I%jKLX
7J&!a"$
-EKƒ‚
F8AV„
r…6
ˆ3WP{hMl0j1)N2Hƒ<R:f( !ƒAoG
Z<F


f5I&/(D‚Z}r‚S‡ÕO—SX?‡„71
ˆv„‘$]O†l‚6;³S G        z‡i3Ÿ, ]')'
.‡iFÎM)9„$¦c        $v("0)K#T—4
?MI      v®q
E
-z

NRv
 xO3‡'®‚—*Î8…f Q‚R *‡N4 %-$              /#      
. !
 
        &     6 %#33%2NI
$     ' L       71
,?F! 
'a2"@$8 I%    "FQ    
„%l$I;8iAr &(1
7)G8/4'

$S8K3Ql
`0    "!6
;D
"
 ]v
 /

),+$
&0          M‡E     /,—7ZŸ "/           (2&8
%'
LW&C
k=žY+       0®p0_T†ƒS
†:—D ;5

®s
…r\-5R¶S',LJlE1r/ 0viru„:²°0’-@       —ãpƒ$-#   sibl=ƒfÚ^‚$‡j…j“t—h‡  •¬Bb,
‰1Ž_
½iŃb³c1ò‚`í4,ý[
    Æ Ö
ƒKon‚„[”õ        t
‡}„„tça¤³|#—3¹U]…*
‹;
„p‚E
+Ïvƒ‹M†L" ¡}
‚9„3i*‡Ob¹gó(½†@ž|>³|„    
nE³‚i
E" §ƒsξ:‡gi*ƒta`ual‚†^’.¢ô
>‡Ø8<studio‚¥6tal‚Y    ¸TØsš’
‘ˆTH‡‘q1m‚" ™`<£E•j†ƒRL_!‹G†5Ü] …<£E•j†printf6‚O›.
:S—ÄO83nd‚ƒmext‚
ŽÝùE    ocabulari‚l
#]003‚:>ƒ7s‚eY5†iÉx‡|Žÿ9
03l
"ƒ7@s‚eY5‚ý „ƒ†Fgic‚
‰6‹,ü†œ7d       b;ƒ/E4‹ˆ‹
"‚~
*`Ï?qk
‚Šc‚ O
„D=<‚&
¢W…Q…Z”q

z    R‡Z…}Rƒ‰]n1„Nˆ]ŠH6
…d

      


            
!
a
 ‰j0Šn       Œy&‹iH;‡d‚Nƒ&Mƒ$‚,ƒ(
Il „  G 

„M"˜ƒJ
ch‚¥?gK$$ŠdQ^ƒEŠ~«v

‰   H•1\
&8J,r"
!!ŸW˜€€€„¿2(¦„(”m
,‘

‚¡] ‚‚½L4q8
‚
)‚ :
„D=<‚&K¾Œ"Ý@
‚Î+‚l$=/ÕOÖ
}8
‡ƒ`
@h‚‡h‚'gK$”3ƒKQ^ÍNÚb
$0volatil…!›L7›ƒ~Ê!˜R
¯Ž÷!„áOy‚þ‚1um‚J…(
}0
œTb…J¥~š[•º{{‚°h/U!nt‚R_arili‚”9m‚4
‡vfn‚‡open‚ŒWdÝXø     d
raussetzungen‚ˆ!welv‹PpPŽÿ~LpPp‚‹V—† renam‚
ŽZÝúsv
“szY4u’jŽþ|
‚‡d‡÷Os‡u_pgsync‚ƒnprintf(
|‚»+,@—ÄO> tatregistƒ
‹~
˜Šs
‚
tabR0‹$ƒ"#%LƒdJ,  $f+$
*}%
~‡)B\ƒ$‚X'†S‚™ak†7‡'ƒjc_/-!ÜröVƒ"#%ŒJ‚2…#6B\
‚X'‚ 
ƒj
_col†E
V
¢•ùf
ƒznfig%
Z#B
4&“_   ‡A•ùaƒ[    6  straint_support%
    ursorsu@‡1‚?‚¬}!8O;;Vp      ‡•ù^ ‚?‚
!8;†F
directonli%‚               ‡S“z“É9‚°ƒstincty"+F9}K†F<
³T•ùh
‡in+M9"#?_first+
'gƒhxÝX
ù*   next+
+gƒjzÝX
ù,nocu%‚*        ŽnochangGN2ƒhH
ŒÅDÜ÷8†…zon_conflict.1
Xrhs_value
†G,%T-#«K)Bœj•ùg†a)B‚+logƒ…m˜Á„mulneruk™5–B::W_9]lQƒ
‚xƒ      „zJ
’dÏ…ƒR„Dƒƒ2£Q™~
ˆe
Ž÷#i‚‘GA:W9hQ
‚Jƒ       „z‚‘<       ¯‚‘
!
pdat‚
Ž}Ýú/var‚…^M‚u£qƒ@M‚uv
xo:„ƒwork‚/ƒX•£o`w
‚P(Z?t”@)1…a&_d@‡>0‡'‚‚„j‚‚G„y‚‚‚ ƒ‚(„\ªp            f%ƒ˜Žþt.)1ŒM&_d@Æ'0…\‚‚„j‚‚G„y‚‚‚       ƒ@¾@ƒì0õ!‚              Ò
%1‡ƒ#1$
’v2$
’z32‚C½;‹“Na†‚7†z
„J‰~…Q   ]„A‰D—@7‚Ro
‡,e#ƒZ„~—   ‚.‚5†^x#^‡7–/O\„''
]%
^%
}x(
T‚.
A"‚b        QNg†,„a
A…>!M2‚J~‚MJE'
‚9>ƒl…h‚([2ˆs}ƒ,ƒ)5SVA
Gƒw•:
ŒT‡9œ>†^…eŠ‚„$±“gƒE‹(Ž`‡@–*R  ‡‚'\”f‚/|ˆ‰    …)fƒ”G‡~‘;‚5‚C
‚(ƒY†Lƒ‹O8    ‚2;$“^‡¦
†(-–f–nŒ71
s-+Ž‡~<O
…IŽ‚22Ž%ˆg„$“r‚}Š /Œ"1AŒ989‘^’l‚3W
5†t‚!Z#„*–„:…4ƒF   ,"*'„"/#i†|—n–,†
†06"‚‚I‚}V‘9„ƒaƒ.Šri‚+7‚E*„b              
„EƒFo
‚
3ƒ5@‡"Q‚O‚c…P‚kƒ
66sƒ7„%~†‹1†D:ƒ‚–e$gC    t…[‚ŽpC†
inƒ<2&
K<L4(hƒ8L˜M‡‡0
©nF\E^
9>R‚Qƒ„…}ƒQseEG‚Cƒ=c3ƒ3+†F‚4DG5‚S‚.kE)yƒ%@‚5av‚yq‚
…^‚D49CX     †f‚Ur‚E„=6†B5‹J‚x…o%‹tƒˆ\‚/ƒ‚(ˆSŒ'ƒ*W‚E…t4#ƒX&B  g(j†ƒu].±$Ž.‚I„[„s-C†^c^<h
…Y—-…YkŽ>ƒm‰B‚=@†$‚Z‡o‡

„“_[ƒC

‚I—
ƒe4ƒe†3      6†2„†9‡Z6ƒ…h '       )0‚T
‰-8„)Š‡M’JŠ.Ž-ƒ—P
™5ŒQŒ}žEˆ4#‚ ˆ"ƒ‘^ K
°h(‹7„%ƒ…K‡{Œ-&7$:„b /ª5|ƒ.‚'‚]h-1<ˆ"„7r‚`ƒ70„y 
ƒ!
b";'7C!".   $0[Ž÷

'‡b‡gŸ$Lf
I‡‚     ‚
7‚c'‡@wM
 >OZ‚/|ˆ‰   …)fƒ”G‡~‘;‚5‚C
‚(ƒY†Lƒ‹OS‚OA

>#‚(4m2.'%6 GPh


""ŸV˜€€€„¿0È    ï.
F;„~Xˆ+<‚G‚N‡D;·n'9'1—$m‡`‚2ˆg„$„s‚}Š /…<1AŒ‚q9+‡GW
5—‚I®p§    ‡i6õ‡-7‚%—4&J         
‚
Io
§
v
D‡b‚
'$@
4    Tt% Zp¶,|2&‡tR®J‡_8‚@‡FFS¦#L—5hŸ!]        JW‚E
(4
#‡‚
„ƒ        [   g(
ƒu‡a[
„ru‡V>
q„[
_¶:z    †4‡_ƒk†$vZ
~A      
;

a      ƒc:$

>
‚C
¦, '       )‡O&‡bg®q‚@#‚      ˆ"ƒS- K
‡s
j—‚
‡ƒ}SD
u$:.
(ƒ.|žw-1<"3Wp*0
8 
L
E


%'C~!.    $0‡0wagnervŒƒZƒZSŽÿ‚
?Si    [ƒ#†ƒ%ƒ?U‡7G”Hƒ3„|'`„ƒ^
ƒƒ.›Q3
…hd‰v‚5 ;
Uƒd‚ƒ)k  O    …#‚A†k†W!+E‚!G       ^‚3P    |…`‚‚-!=ƒ7…>J‚y„$‚X…Nˆ"5†T&2K‰|ƒlš>?…Ra-‚;…‡"‚e…mˆƒpƒ~‚– †C     zš2=Ž „8Œ‚‡D„,ƒX5`¿,Y
‰A46†sF‡
‚P4‡B‚}[Šm¡n†u‚…E„*ŒG•y‡˜¢4‡ZC
{M†>‡cŽW‚R†EŠj‡
ƒl6…[‡%‚L˜3ƒœ`$DŽsXŒ~‡e‚ƒHŒxY
…C<…MƒLB‹7ˆ„{…W·‰Pv‡}4>
ƒ$„Z†7JŒƒSšm‚@„]‚4W,ƒ,y‚i‚]ƒƒ6ˆI„]
        ?†n‰„l_‡‡ ‚TdŠ((šb38„“S…” F‚‡$„U‚‚B‚"‚7<†3fŠs
V
~’/Œf[‰Q…D+,‡G…
‘U%…,„N‰yŒyQs„B?J  …‚
‰'
 ‚U}ˆ!“B;”Vƒbˆb-‚q:[-‚p‚u…lS‚‡u‚3*†6*z‚+I‚^ˆ0‹(ƒUq„A„s =‚W‚k‚Kˆ-2$!‡j]@|„†B–N‹ž„J„t„~‡u†~ƒ„29Nƒ#Šy„P+P„O„'•…'B…c
2y‰Yƒ0‚p„E‹Ž0(ƒ–B”
D‚E‚1LŒWƒRs•6ŒfZ„,|‚.9‚S„!_°§f©n‹AÈdŒD„r;MV0•hˆ'sˆ2‚o‰‚W„‡v‚V‰        Ÿ488‡PÑNŽA(„CŒHVˆ3…L†„s…q-J*ƒ
@ƒ`Žöu&?/o(‡‚ƒj‡e1‡‡gNh
(?‚3‡V]-‚;d[=wm~
l
)‚
Uz
‚8|ƒ‡ƒR‚‡j<ƒg`¿,Q
?4C4w[Š<
D‚‰p
„@‡]Ÿ
0¶[U—4FqL‡Œ@„a3‚u$DX7o‚1
‡$YN
<E#BÆ%
4‡e;¶X:®nU!Ma‡i
 ƒ67—6
      ?Np‚E§

sb3‡‚3
3FHIZb%eHMWÅz:¶‚)‡gc‡e#…D+,‚7?‡TD
J    wH‚9   \‡bjNz
ƒt-‡gB—7
 -#p‚
JSr„l‚3*j‡[yiI‚^‚M?ƒUq(I{‚)8
K+‡^]@„(NW      ‚k‡\
„J‚jV‡‡kP2O‡rNƒ#w‡X)TbKy6R1\
ƒ!0(‚A
RDžX‡Z‡ie/‡\v9§†P‡^‡f
cMV‡‚/
&/‚3
‚W/—‡„X
‚l8q3b"
A(+,J5‚*‡M+ght‚„yt„\m„L!)6ƒ6B’ðBiŠL‰aŽWq(:‚.dƒ{^=++…†2…<‚
†y‰r©
–    Þa|¦T   ‡‚.

‘%8ü‚üƒ`„Ù„-ÝH      §DnÝ—‚+Î8_for_unlock_notifi‚@KS
‡D>Pver‚•s7l…P

‚….
$/!
!
?!+‚
ƒ,
ƒk‚+7V%J(‡<+”f\$
!!ŸW˜€€€„¿2Á…Z('    ‡]„ 

./$c‡2ƒ7.*{‚P&
        #
&,,
-
"!+L"B<L$3 *?     D"
        
"->01#
<c *+#

)/(
Xf)&B'( 
'![i£$… •
TP}ƒ3œ~&«‰P‚n Œp‚N:2 ƒ?y‚Y(¶)
 !
/Š$% ƒ{
A
h…U8j„v   
%D'Y‚&Œdƒ><‚H
!77(        "-S(Dc@]

+!
-36,-#6/  j('^„Q&9# %"&($!lG)6+32
+     

!
 
 %&V-‚)‚M-…~‡y‹;,N
       
-Ž~#

ˆq    Š#„u^<„:
_HG„#
ƒFƒÙ(

P)$
6B%S&

*'1F

0 >       
        

  
…4„/LW†r…y:…XG„+
w‚.Žö|,$
        #
&,,
-
"!+J"B0  L$3 *?      .:"
    
"->01
c           *
+#
4
)/(
Xf)  &B&'( 
'![      Îs&‡PXˆ0&«œ‚       „4‚N:2‘4—&„‹7
%D'Y}&‡`FŒM
!7
*       "-(DQ@]0

+!
-3,#4" j('^QL9# %"&($!lG)6+F32
+ 

0       
 
 %&§‚)Y-N~");,N
       
-‚#Ý„#„u^<‡&§

0_—4+<a
2
T"*(

P)$
6*S&

'1F

.0   >       
        

  žqy<^0‚
3G
0wal1‚y‰
–þ3‚p37‚y
‰
–þ3
‚s_autocheckpointB
QS
‚
‘‡Õ.CŽ‡à‡HC
checkpoint
…Y7/:a
…5U‡Ö<@Ž÷
7:‡à‡I<@_v2[
      H&*…I‘'/VÝo‚Ž÷x
V‡àZ
[‚kpt_lock‚oBVŠd(Še–°4`?‚((‚hookB

SN
‘,…bŽøb,  read_lock‚oDŒKkjŒr                              6@%Q!0ƒd‚*–°RE$ƒ]r                            6@%Q!0‚od‚"
cover_lock‚oŽ‹+ŠB–°5B‚r‚ 
write_lock‚o SBŠAˆCL‚#–°4q<EA
ƒ
L‚kahœd"ˆ•
G@54‡‰‚-žDŒzƒo
"ƒÌo*Ë
WG@54ŒFlƒ]· œDƒ}–Kò9+nt       K…
¦6
Žƒe~&4;‚At{=ƒK‚'†!8A#ˆs…ˆ9f—?*†!”XH‹~‚E7z¼© ”rˆ)‚v¢dƒH!*ŠOŠK…‚LŠJ †`Pƒ
fWF…~‡JƒcƒI„~P‰F†txŽ.       …(ƒ†$‡XŒa…^‚(hCƒ‚J„@›?($}‚6„n„…0…:ƒ"‚.»'‘M
‹2i‚‹)…|Éf—c†Œ[„t‚i‡…&Tƒ„7 ,ƒ^*„„)i†9†ƒa¡ ƒh‹t’lœp7ƒF‚OK‘:V¦"…9›¦'‡D#,R
ˆ8 cƒiÕ6‚”P—Aƒ@>/$ƒsŠ4‡?Œ+‰IV£s„ŒQgi‹z›=
„;%F‰
‚wˆI…6 
5Žöu
„2‡j3‡*kO¶R4¨|© ”r—‚‚
‡‚o΂p7—7
VP
‚mA6—F.Ÿ  ƒ>
Ã!Ÿ!e¶R
#63‡[Lf ƒÅ ¶‚M‚!Ÿ(5‡\L
pTb—7Iz‚sŸ(—‚2Dt„Rƒ8¶W…A¦ƒS3-¦*‡,R¶WgzO[‚M{0ž{iF:Œ{9XV*Rw§„6r‚‰1    ý
†
        mƒ‹{—ãn‚KhX„ G ˜lÏK„VÃn/
 Ž;ƒ@ÕL¶~8…q8’, z”)²r‚q†ƒ(½- /3È&˜f*
ƒ{±}Ž%½@Ÿ¯ ‰bÝO"QiH67j0Bd0‰w
""ŸV˜€€€„¿0´û‘m8ž{FÃ&sƒ†ƒ‡‚%‡[1Ö
7¶*§l¶;®Ez0warning_autoindex;I‚½…o•ñ‚uÃnrant‚’
i‚’:,H„Tƒ7sm‚‚t†m“Ñ‚8tch‚…hƒ$er(
d/*#
7+‚$ £”¦Ca ƒÅec¶=¾‚`e†c‚-+¦!   Žƒ@'w2‰H‰
.:@&„"
œ‰      `†9‚B½Io¨”r†‰‰r
ƒj
›A‡E‡r'S$
ƒ ‚0‚„FƒP'‚ "C>ƒ!ƒyƒFeÇ—{…IƒG…~„Š~…
2"‰l‰Y„r…P0    
ŠT…T†0‚“‹[uƒ.       ‚…
‡/    ƒ $‚U0Œbƒf4…k‚}<ƒ"‚,&N†‚e(gr>.uy‚Fb‚2       zL‚h$j"p„GdjC„ƒƒO‚*‚P…D‚>‚Rƒ.*‚YW!ƒSO-H
‡TŠR        rƒ‚Z‚jƒ}„xŒc‚U‚z‹„K‚"…>Œƒ@ƒf)ƒƒ<;T‡Nƒ/‡b‹x‚‚g
„m„]ŠK;m:Œƒ_ŒS‡Iƒ,†Fw)i†Y(„‡x†Z†‚[<„o‚[…ˆsS‘;mOƒOi†9‚ŒN„z
;‚.R5˜=#…&:„u›|ƒ:`‚0Y•Y†&ˆ2
d†‚FM†
‚‚5[!_“v,1Xƒ4Z u‚mkh Š'Mv,F¶2 Wm"at7x›C}ƒN>Y Z‚%‰‰”0s„d—(0…'vxt3…Š{|#„8‰)Žö_®„#N§¨{o¨”r†Q2‡[
ƒ

‡1ÝZ‚&a

'd—-A#$‚>‡‚YW-v   y„aŸ
2„f.Æ*—;
Y    ¶U/
&‚,K2

e‡["r>.uy‚F
v    
L[hj!d1%%[„!B
     >Eƒ(
J
'!xSO|üV‚  Ÿ`23‡V

'Q!‡f+|w)i‡i(—6%‚[<o/—ƒ(>sS‡f…$mO
‚Liƒ‚—,V»?_‚X‡‚&—0<W        ‚%‡„i'
zs‚f?Ÿt0W(ak‚ƒier‚‚J•³;<li‚‚&ÚAr‚®<EgŽM–Uø„‡¡dbF>1–S‰u‚D  †}ƒ,>µ?
‡‚b‚;P‚`P†@
M‚5‚tˆ   ‚ƒj)ˆ½:¾@0*Môs
‚J>k—V4.
„¢pEË<
0)kit‚„/•ê‚Fpag‚    ‚ƒK„2£…Æ‚Iserv‚†xƒ,ñn‚Eit‚L     
ZNv„h
ƒ|g1†I¿fo‚J3(‰<
‚Kƒ/f
È,¢{E„'‚Y‡Qƒƒ*rE`!8
0°)‘ƒy„CÜ?cÆ(Î:
I‡•=§,‚þhÕzG—‚‚R!ú&Ýql‚‡/L„,`‚/‘˜‚„Ñ`
‚C`tek
‚S    ‚j<ã5ˆ!A
i„|ƒ
@‘˜‚gƒÜL
;
@‚ïdai‡X …5ightv‰…x„Z†|¶4&.™\ƒhH&Lt)5-6‚
LŠ&êG      Žþ„(HM
¾Q‚W&¾P,ƒ'ƒhH&Lt)5-6‚
L…Ö8‚©      lch‚ˆGom‰ˆD
‚Œ/–„ƒƒ)lL‚ŒV‡NWJe‘n}ƒN‰
  ƒ(Œ‘^‰E©$yU‡2C$ƒ4š"…&†?…ƒ7¨I°k„49V‰<‡7*†j‚•§ ‰ul‚I•+H‚T
BG‚BRfFZƒkƒMCRƒ
@†HŠ6
R-"‚ID
[‚C
„‡ƒ0J‚d†-¢’SE …~‡2‰ 2e9…K™?
ƒg0Š-„!2†[†2‚-j‚‚,Š]…)ƒ\ƒ.‚ƒzˆ8‚=
ƒ…6‡pƒ)ˆGƒfˆX•f‹#ˆ˜¬m…qˆŠcV‚)      §yŽm—
‡(Œ
…j‡G‚Tˆt¥TˆdA„H‰S*„-Y‡Z—]‚zœ4“ƒ†/„P‚:„j‚RŠƒ
ª,‚„]q4‰"‡WªäI¸3„Y‚&j‚n‡{ˆIj‹2IˆLˆ+Ÿ1„`
D†6‚(N…Žöƒ&„w+‡g—0Ÿ‚#2  W‡[ƒ{4ƒX
A‚&„;žœHz‚o‚Kb„l+  P
dl[…;‡H:
*G#BTZV
‚     Rm
[
yŸ?Îg(‡–
Š:EM ‚f3
!6Œ\1N3‚
*G(
""ŸV˜€€€„¿0Ä(2‘‹9Q0¾AG§
 ÕwZ®p?—¶‚ '_‡†3
¶+}Æ:H‡‚j‡h
‡N
¾‚‡~—=4‚K‚—-‡\‡ƒ®C®ƒ*\q‡o4gÆ;d—!h‡gi‚Mvm<S‚d‹2IˆL‚U‚„&Bc§
0welt‚ˆ(ntƒP9œƒMCˆ—/r‚ˆ.e
„zƒ>5‚8)‚—z‚B‹A†Y ˆ”zNo‰.!‚mj5
ƒX
‚4
iƒN\r…;+
J|e6N”sƒO{†0
œ!‡tŽPƒP†Q”I§UË‘*l‡a…`¯ˆ=-}ˆW „„y›-¥f¿>!ƒrP-PXˆ„¸}‘gŒƒM‚KƒvO‹†$ˆI‚‡†Y—Z…Œd—
‡a‚§
        
'P…?…C"‡,_ƒ%‚uˆM‚$‡.„u‰u„l5„J‡4 ŽCŠ7„o0ŠN'!ƒ#1
B*x„r:>„5„K
…‚f
ˆ%ƒa†J‰8‡f¨YŒz‡|ƒB
"œ0ŠM@‡F/\†aˆ‹^”|…?˜m‘E"K ‰2ƒ‰$’„‰]E$T^‚T;—Lƒ6†=š6ƒb‡‚$ƒ~˜y™«mL‰f“eI‘DH …Q‰X…#¡}ˆKÙnƒ
ŒG…O¿DŠXƒ”a‹¶$Ž
lr‹ Ž[‰
…)    Ž÷,‡`Oy‡zŸƒ   ‚‚$‡?…@‡8O‡g2RšAˆ=-}P      P&\…?‡1‡F+ŸT¶*0ŸŽT†Fy_[? ŸyT#ÎhåC%‡g‚A—4¶7‚‡       6        +9¦`Rc#Æ$vQ\—AŸ`@‚@¶‚zˆ}+‡‚g?"‡< e==K‡O
R^2;      ‚‚/‚

^ƒb§ 
†%§   K$G:¦IF
‚‡j|‡‚¶‡d<M—

‡8O]f
+  —b   xtra‚·‘‰N-get‡k¾5VhatˆN„#3”O‘'OcŠ#
‚4k‚‚AŒp‚       W*‡       †
‚!‰:‰#8‚Kƒb†oƒ?‚`o"«G11Ð3
„V†h‚a$‰@+
„Ia.’/F«G›pŽ'ŽCƒ(?U_6VLFs‚,eƒ†ƒM‚w…‚c'„9^W—”'‚*ƒ.
‹!ƒ…#"‚s‚<N†Rˆhˆ;…‚Ž
a‹7‹&
CƒD‡Œ „u¤9—•‰+‚…VŠ 
/
hƒ]^‡‚t‰ƒ„Y
+ˆ
5‚wŒ8‰~G‚Ÿ'Ž~’x
ˆ4%•  †Åa•ƒ/N&‚2v;
x;_i‡l6ž<lˆHŽc¡4•YƒKÊV·Yzn‚+‚i’7”^¨sL‘TGˆ˜·^8
03’A”#…{jM4‚‚lŽþƒcT‡e6G‚+LD‚`W|T¦–y11Ð3MZ-F#§
‚+a¶/0Ÿ
“Q(‡OO—8/Æu(œ ¶T!(S‚‡av
‚@Æ  Ae¶\@
!H#‡kgŸf‚5‡8‚
ŸKt
ƒ‚
—0)o‡iƒ‚w‡e‚eG‚
>]k ¾sžA‡L‡j
v
x;,i
®c*‡jx‡‡‡T$       =žy>k5[+Ÿ8$—4§hev‡¦
      ƒ]‹Ž\‘*ˆˆvƒ"ˆqŒ$ ƒ[ŒE…U…G†‚$
–-Pƒ~‰“’y³O§,               uŸN
„ND„M”>Ž÷{ù
$v3—6<®Æ!Ë„yÎF‚™%Y§>®Æ‚Ÿ*%®psoev‚‹;ŒzŽSí«ƒ"en0‚B~iM‚lfT+V;HDI:(GW=s‚&‚8.x&‚i…dƒs„7Z„>†G‡T"‡Hƒ†|ƒL…Rˆ;†G[8@d@\'vg%ƒ$5[ƒi
l)bˆG„ƒY
=„†A„QT…7„d‚
‡
„\1ƒL;F<t‚ƒ:h„3
‚z#‡e"(
      Z
A„KE+)A<‚'
ƒ'„ 
`
1_‚/
X‚
d
Tc(e)06c-w…%
+‚=
V  E
K‚-H‚sH&m        
1L&
n†Ib!
#
-. <*I c5l=‚;
&
‹MŠ‚)
""ŸV˜€€€„¿0ÒYB‚B[c     *QLsƒx\9%w\D,
wzJ„„U$
ƒ/&„O=f…g‚W…>‚I`
„u4
‚A'‚Np…562‚)
#f ‚5‚$V†<iƒI„SBb[&„C…F(^ƒ|8ƒ‚&l‚†~d=,ƒc<„=#O`‚‡2ƒQƒyAJ‚`‚f
&$‚"‚'„g†g6‡:
‚:„HƒTz‚{/6‚?ˆR#‚
„…fƒd
ƒ‚#Š   ƒ‰p(†b†j‚-I‚K‡S4W‚T„›m;p'h•{ƒ‚b!‚#%†Y‡1        O…<l%N‚X*  Š„E‚e„R…6#!Š7…L…A„P,Y…K†dƒF‚~„,?‚Q
„XƒYeN0‚J^t‚#‚e‚‹O†\X„aSc†=’†Š%Šp„d…O‚gƒY…)‰‚/*o‚O‚Y]. k„4T,‚~…>)
ƒY‹BŠLb$‚r• &"…_…G‚0h(8‚      uA„@v‚HrRƒ*d‚l„
‚;K„+/        _…CŠ
‚D„R†i„]‰‰,DW5†/…!h„o}V‹     (ƒ
Yj32K2„V!]ƒ
/‚mT¯0ƒ/U‡E…(Rƒ99‚h
ƒC|Iƒjˆ  ƒt{Nƒ6,‚a…w‚k,9ƒMH‡v.‚U‚:
pY=ƒs\A86'‚'E)jCƒeV„$ .o%‚.H/I‚Yƒ(A :‚5&„rKR…l‚l…/J„7ƒn$ƒ. W…:…
ƒVh‚UIŒw&‡CJa2‚2-Y       7
T†649]„x‚;†4sJ‡'‚        ‚‚INœ@…+ƒ(0
o„ƒw
     jƒF‚FŒ…o‚_
ŠdohVEHŠl‡Tˆmti‚Y„&„H‡#&…‚)„d‚‚^ƒx/‚
…E‚   ƒSƒ…N+‚Vƒ„b†’o& „Cƒ„K.8'( /‚x&=„tŒc</‚qƒN%†| 
;tƒ@H +ƒ/†/ƒM…'‚
Rƒ~F…t ‚BgO‚Pƒ1:(f`iBŽŽcKoƒ{E
‚FJq‚If
!‚s~ƒwv‚>
‹qŒxƒLp†_BH„ˆ"‡V„B†\†U‡Dcƒm„n"=ƒt‚%…}ˆ}‚>‡4Šv<‡g‚…X‚8‚u)†$…"‚‚p†ˆ48
†%‡8_‚    jR‚Nƒ   :@_tƒ>?>-d0]&ƒ%'ƒ)ˆj†dT‚"ƒ‚/„„WƒORƒ„[6
„\ƒ*„c‡,ƒ-?…[‚6‚EI<ƒ=’‚i<ƒK†g‚P‚N$‚ˆW`+u…F‚;xL„|„ F’h!…nƒˆR|…tn%‚@…
GN‚JˆxhƒI‚,ƒ7‘+†„Pƒ+‚&‚E‡?)ƒ/„‚3‚3|9…x0h #
f‚EƒLƒY
‚wƒ\ƒC„'Jh
ƒZNG‚G‚'z‡1‚\,LTrKt#i‚‚qn
0†5>J9„"‚Yp(‚‚H…;E†:N\‚~ ‚x‚QnGV@ƒ‚Xw.TL.‚)-ƒ^‚I‰dy      \ƒ-#‚J'k†Y<W^
+‚e;Jh@.a‚C        T „<uuG‚"
@
d
D
„Y^T&,dRI%WGƒR„<‚?>ˆ?y†/<H„r…'J8Pƒ„5„h‚+‚-‹{ƒƒ$ˆH‚+…ƒ~Vƒ@Š(@‡„>Q‡3,–6-’     
‚|"x°X›¬!ŽN8†$g4G?"11A‚†;‚O0‰t†<tDv'~O†/ƒ%…k„Br…†Wˆ+‚@/‹"‡,H(AR,‚V‚]‡6#%>ƒLW0ƒ„p| -(!$‡23Ž@‡-^s‚q‚F…9&N[s…{kG„†FAŒH&)IŠZ…”{p‰:!
w\
%„z…/@_U‚qV*‰k%‚T†j;F%;<‚,‚n…wƒ:…‚„0„"ŽöC#X`‚QWyAJQ
‚
x,‡‚ 
ƒU
'6
q
:‡‚‡gF .
</—7
     
ƒ‚H
54
‡‚P&
;
'h
Y0R!C%&q        O<l%N‚X
    ˆ„E‚PF‚#!„b…L‚;‡Um„"
m‚~R_?‚Q
‡c~H,i"u‰`†X„aSc†=’†Š%Šp„d…O‚gƒY…)‰‚/*o‚OH,"a3e‚*.)‡\
‚y‡k[ 
ƒ$M‡Z&"
f…Gnh(8uAv‚HrR
d5EoKe/   _D…CA„R†i‡‚S`‡YBÆ-e‡hn/U%9EG|‡I‚D<gl‡^‚Q,‚a„_(M‚k,9ƒMH‡v.P‚:
pY=B‚\A86'‚'E)jCƒeV„$ .o%#6    .H/I‚Yƒ(A :‚5&vKH!/3B‚
i
! Rcs)h‡F‡lF&‡CJ‡d‡hcKbY 7‡e
R‡lCŸ9§Ro‡ceå‚=&s‡h+„
‚Y—6
H/jK
    ƒ.:
+Ÿ/‚0‡g
=G/*
*%0‡X
tƒ@H   +
v/&.NP:‚Bg/
:fi‚(¦Z
IoCU
(qF‡dyP0®vZ‚7<‡^BH`‡„h`M&s*L
U‡Z3GvK]H
""ŸV˜€€€„¿0΃>•žd
>d]&T'‚d‡
4‚"fv
eƒO‡i(h6
—r_I<‚m‚‚i‡\‚†g‚1‚3$‚`+u…F0;xLw%* ‡e
†Q!„1|
n
…


G*rZ‡Oz
#‚+_+‚ƒ+‚E‚H9w"y‚3‚3
0920 #‡Ed*‡])[O
vN
‡dhg
NG6 N/†J,LTrKt#i 5‡Z

S
cNK‚~ ‚x3GV@
‚4TL&r)-
$@
+y \#9'k
ƒY
 W1

h@.IeC    T 
"u?<
6
Z
:
žX=P‡`
ƒ$—‚;T6$g4G?"11A‚†;‡d^‡gX+t‡_
s'
7OA
]…kƒy0@I_H*2—?mj‚   ‚]‚V!‡‚Cp0ƒJ: -5$3
)="‚T&
[
$*-0†F‚,
y)Iƒ2,
A E/‚
Ef;;<—‚„w0whenev‹ 
4œw]&          ‚Q$ˆjˆO!ƒ!‹P‚
‰†:d”Šw‡)$§sÆ=
ˆoém“ƒ3u‚,‰~R•\„w'
…<ƒ‘C‹R      …:-‡q…?ƒ$e˜‹"¢)„†²Q…EÇ@• •g"‹v
„ …,†v‹Sƒ4¿}Ž…N‡rŽöƒDdÆ7 žô!Ÿ20ÝF—8/‡ƒ[[!‡W{—7$Ã)0íJj‚
!®?®y5B‡‡A—‚i‡5(Þ$$¶‚¶X‡UŸ‚EXo§re:
ˆqƒ&‚X.„xi‚„^7„4‚42-'2{’`„Z>e„0E3M
ˆX,ƒ‚;

c<ˆ2.~=ƒ,„,‚k-2ƒx
ƒ
‚?†|ƒ
„5
Ÿb;‚M‚           %‚#K%n'
//eXƒObO…ƒ$ƒ7 …Hl#pFM++…       V„
‚vg„%ƒg
D
;
„10pˆlŽ
6‡4{d
:?‚rF+„eƒ‡|^
h‰*…'†‡p‡G“Q‚ l    [ŽnŠH†       „Km„`„S`SYs‚CGP;‚2e…dPƒGœ‘{‚)?…ˆmŠƒF"†P†‚n;ˆ=‚;‚\ƒ&F8‹D‹M|š.ŸGKˆ|‚D„‹0‰X|‚tƒ„B"‚F‚>ƒfƒƒ2ƒ9„f ‚b‚A
…e„    ‚S

‚z2
ƒ(Xr=(z5EG'QTC#+.j1ƒ)!%J{
!9p„
'?w‚mN+‹d_‚\DV…m†s
!
„,Bi‚      „D     ,       F‚B‚Y}mƒ   4       ‚l„$ƒ8[x:W@‚_e‚4‚BEB‚!†`™bJU*L<bV M&ht
DC39:‡lƒ>ƒ  ‚J



      

                        

        



        
Y&
#
        


                                                                                                             
                                                                                                 

        
       
                                        


          …j…W„q&ƒƒx…D…O‡,,‡,0–|†*†–ƒB‡„L~‚xp„UŽkŠ#
‰#C-„{1‹Z&5‚‹9ŽP$T"7C‚`˜,’œVŒ"XŒ
       ‚D¨-QJbƒ$ƒ
‰ƒzTƒZK†]‹Tƒb7—T…@‡Fb‚&3‚=W *$ƒR50fy8#`CƒUIv#J&xŠd‰2jZyƒ5Ÿuˆ]B[
–HG>(q„X4bxƒ.…       ‚pˆW              6‰PYitg-„‚4&‚
‹#O…IŒ…‚i0PEƒ`   ƒbdw…vƒi‚aƒ7‰\R‚s…?†iuG*„ZI>#S‚27
‹n&xŠQ…A7(ˆ‚Šd2„D‰)

j
,



G

\

ZYM1H‚E?ˆ(:ƒQ…       ‚%
@‰o‚#/*$8„       `Cp-)/Š,3wŠ9_>H…M~eT|ƒ-=ƒ^$zK%w78;8 @C               
BC‡j%-R@‚N?‚fO                
e‚r?c        
A‚jƒ;‚s?Oƒ:UMwƒ;&4<$'a‚'RZ‡v78b…N„4m&^‰}M‚M(‰Vƒx„=      „EOƒZ$    6…‚,<‡J‰Y…j‡ˆkƒJ‹#&„t?’—C†FŽ%ƒ*.(&…•o}@+…S‚c‚
‰K*„J+R7=|?r ‚TQ&ƒ
0!‚“yŽ2ˆZD„_xl&ˆPŠ–|A     (       •‹ƒ
ŠbRG"8Žh”)
“<~$4‚F…z Ž;‚pƒ4’44@{‹b/a)‰T”_ƒ739ƒU‰h„:
!!ŸW˜€€€„¿2ȃŒj‡}ƒ2ŽX‡
0‰•¦HXm‚……MˆS*,…UZHEq‚OF†‘
ƒd$Š
7`IŽösnƒ6 ‡Zyd
:-
‚MF

„e
,N-^
h—ƒ,8ƒI‡U‚l   [       ‚EO
    Im‚t7SYsGP;‚0P   †{‚)?"ˆ!

&ƒF‡,ƒ‚n;=`‚\‡a5VS4‚A|š.ŸGKˆ|‚D„‹0‰X|I?xy‡G‡f

‚‚O,'

‚z2

     X(1=(z5EG'QTC#+.j1=)!%J{
!
+p      ‚'?m‚mN+d_‚DVƒGS
!
ƒU,Bi      R ,       Y}mLƒ       4       ‚l.[x*:W@‚_&'‚4‚BEB‚!‡nƒg1U*L‡S    V M&
7t       
DC39:—8ƒ<k‚J



      

                        

        



        
Y&
#
        


                                                                                                             
                                                                                                 

        
       
                                        


          ¶g<}<—"‡@0’a‚
d–‡„L~‚xR
|U>C^
‚1W
A&5Ÿ$B"7C§‚¾:>v<NwŸ&‡ƒyHa&b7§
;,c, !50fn 
8#`‚
#J‡]7    '2? 7[žv,<—>Pk:‡h
4N\‡i‡‚-®o"PYiJW-‚BL     &‚

#‡a‡_        ?„.
‚V0]5‡.
7Z+#S
P
V7ŸvZw7(`k—/‚p2‡i`—

8:‚        v‚`r%
@o‚#/*$+‡[‚O`Cp-)/…23    „]_>HƒMKeT|0=I‡c$zK%78;8@C         
B%-R@N?‚KO                  
ef?
L    A
‚‚s?G
*Mw4$'aR‡S]  „4m>&^….M (

EƒxQ   m0‡G[$   6^wn‡ki‚g9—0&J
„t?c{?;%®o‡dJ+R7=|?T+   ‚TQ—7Q7‚\      Ž;‡doR„]4@T
za)m
|39x—‚‡wƒRDEƒi    
(m5‚S‚V*,„@&aFQ6
E‡-0wherea¤"™D…>…YA‰Á|Ó‚{Á_Œ%   1F¾y“<ƒLM„`
n‚ „‡Qˆ5š{…‰s”§‚-nŒˆI›L‚p
p–c¬o‹[‚'ˆ°$Q<ˆIˆW"       Ýa
„wŽöA‡ƒ=¶„*ˆp‚¾YŒ„3ü”PybüsJýS΃3ÆRŒI1®†Ÿ‚JXn}\‡^K®e4Ÿ$8®q®‚$—FF—O<…2
ƒ?"}—ƒg?bi‚ƒ6Â>‘˜m cod‚ì„7Ü×Dexpr‚„:tracƒ
@}:v‹lŽ,¦fŸ„JtherˆA‰x‰_


p“b‡s‚w2ŸM‚~
'4SB~L!
‚    8‚<ƒ)†;
YŒ]‡_ ‰U‚B$‚KXI`‚0
[„‹4‚~‘Y—"°m’mŠ ,´$q’@„ŒM‹$šD‚A‰A
‚O
ˆ#%†(
…?’<z‚'•L‚’L¯B‚(‹[4·~Ž™5J+'ŸW*‘†pd‰(p$9 ™5‘,‚N…#
„‰u
¡"XŒ†’$Š‰:“h®'¨M§V
‡R‚C;ŒV•-‡8h“!Šm
„JÅ0çE˜
,˜D•[†(ÃOe…b†‚®S‡‚ƒP,ŸG$q’@„ŒM‹$šD‚A‰AŸƒ    ‡\%‡cAí0ƒ
‚'„‚‘jj3
*ê‚\BÕ~
sJ+sƒ.¾+<¾t‡'‡ƒ0m¶X‚N/—‚ŸX‡.„i4‡‡QH‡ƒcYÍr{OI
C;$"$¶
6¾ƒ&M{žwo¶7cichp„N4
kB‚- :„‚1‚„„S> ƒR‚‰ƒG4a’rƒ_
‡7
""ŸV˜€€€„¿0Ò‚[-<„‚gE„n„s(‚-FW1„`"cŠd=La%‚+9„‡‚XI„ "†`‰ƒr001(I"ƒ…B‚oGŒ?„R„$+ƒ‚W=‚*-$#
)<w3P<b‚Qƒ

ygƒO‚4„x
d‚!h     ^‚Ol&\0v6
&Z
70
>C
89
K3B‚ƒwa9‰‚Vƒƒ(…@
Q‚u20‚1\=AJ-ƒS[%‚@ƒ34SZf/‡gƒ:z."PF}$L2`‚LF;?
?
)1….‚tjƒ‡b{„tƒ-‚`†S#„k*[„!‚J‰Š)NT„p:!G„f|>‚|*I(!!OELL‹J$+Q%‚ˆCAƒ!VP‚Zbc…e"Q„T‚
Œ5Œ,ƒ‚<ˆ>{‹0††ƒ…!Œh‚c5 jŠZ@gD‚1#‚v„0x‡Zxmo4–.‚h;‰Œ!Š\
‚hŠXŠ)QX0…:…I†r&‚Wƒ‚J‚-ƒ  ‚`6…D…<2ƒ?M‚F}…!1^†F„)A8‚      ‡[(^‚@UvŽ   ˆcŠ\„‚=‚6ŽG„ ƒ#‚|†N‚%Œ-„
‰^ˆh…c/‚:e‡e’,v=Lƒ#     ?†3=b‚: ‚.
„„>ƒIL‚„2‚4v‚.
‚2b‚~V‡…„k‹w%

ƒ    h<NˆxZ„†)#ECƒ"‚ …y‡…Zƒ~.ƒ#‡]CƒB‹8„T‰jCZ„K‚[2‹PŒA…I9h…@„]2-‚/e,S/    a/Aƒ4‡jWJJ+6))$‚S‚f„yM6"ƒ1b„…TŠ5tƒx6PŽ…ˆ&„&„&ˆ%s‡_f‚fl„ŠB‚YewŒx&‚‚J3ŽV‰0ƒA‰
ƒ
ƒ        k‚K†1†,ƒ9‚M‡,‚g‚ƒfy
 ‚o‚d‚
.‚l‚C       n…~ŒJ8`j…j‡
†="‚Š^9|Y„{‚~‚O6‚„
Ž–Q‹DF„$†Gƒ)s‚ƒ|&ˆ~%‚f0†I>ƒ-…6,‹d‚+‚_…>xƒP d~ƒbx†23I(?ƒR…`o7Y„OQgz…[*ƒ…]|ƒƒ…aZ‚0‰_‚.„(‚(†o$f„‚DƒzŒ
‚<‚aKŽ{‚TˆA„–9ƒ0‡Dƒ.‚CE†&‚-ˆ    ‚}‚:ˆT:†U*ƒp*‡f;3r‰cofU
…L†_KG‚Oƒ7RŽ->ƒ6„8…?o@ƒ‚s‰‚3$ƒ#bˆj*Ÿp b„‡k*F‚T`ƒj>Jˆt…N^„B…8$‚‚NŠ„,…3‚o‡,:„`‚n…V„*‡<…U‡k%
…•*v‚ƒƒ`‡o$„†<ec†t„…>lƒQ„f(†0‡k+Eƒ[m=‚DKG‚1R‚]Š„X&ƒ"P†t‰‚xm+ˆCƒQŒ|mƒ2‡KP‚.†2
„:H‰A ‚&‰9ƒh‚qŠR"I4DuV%ƒ‚ao}„)ƒx~‚e"]‡,m)‚jUxƒ
Š\w‡„vŠ|‚y‚‡:cD‚pB!;’OBƒB‘„`Œ«’uµL&ƒƒ
Z2‚bŒ?„\h+Q l‡„r wƒ‡b‚{.†}>‚-‚C…6ƒ6ƒa†{j†gDƒX’g‚‘7Y†u…ƒc*‚U)A
E
…M…,‡‚v‚‚ZŠW8=…{
‚lƒD‚bTH‚47‰^ƒu&†-’}‚sƒ4‡o„    3x
…Jc„B„qŽös‚t|V+ƒ-
W‡^|#ƒs*Y‡htD'Q6
iAJ
/‚Z‡_
1"Q&Ti
O5
*‚<P…o>…ƒV1$
(…!
/‚c5‡,
Sj‚m@g2\#J‡b#R       m4lŒ8‚h;‰Œ!Š\
‚hŠXŠ)QX0…:…I†r&‚Wƒ‚J‚LIN2‚o‡]
m‚Fm‡h
[1ƒ‚KA8‚ ‚p(^‚@UvC‚O„‚=‚…'#
‚%
6d‡_Iƒ/‡@hXe
QX‡R;._Æ%}‡lS90
  ‡f%N‡ƒ8ƒX#5Cƒ"‚ …y‡„Y.ƒ#‡]CƒB„T‰jCZ
P‚[K
[
9‚
1_S‡9‡gS{ I/A3‡_WJ‡d+6))$‡i<PqÆ%j‡'Æ#‡gA—"‡e!RO‚b—5JyL!‚
.EŸ#‡g4‚@9|N6
$8‡^
 „
Cm
DF‚u'XNm¦ƒ+
B,LL[‡bH
8LZ‡V1‡i®o=fc‚MYPQgz‡~‡ƒ|-‚I9ƒ?JN
^q\‡T]ikL
‚a*0;F?o#‡`MQKG‚FŸ{ƒ9o.
‚rˆSxbv‡[‡0*I ƒ*F‚T$gj‡_2‚Fƒq^‚0$‚‚N
‚:5HDw‡U
3…VD5KT%
*ƒDv+‡N—9z‚0‡
‚e…8!…>
ƒL‡NN‚]
""ŸV˜€€€„¿0·–Ú'`_&P0M‚

\+‚
FYJCž` I4D‡g
!V%
‚B‡fEo
@U‡^x
M"]
‚¶‚3'
Z2+‡g:ƒBh+ lP w
‚OA.    S‚ƒy?!—v†:[
‚qg‡k"q       066
'*ƒV…ƒc*‚U)A
E
,[3‚(h8=

KC
%T/`&X/2
 —1O„Y—70whichH…-ø
@‹ª9½XFå=…¯‚‚©leƒ\…1‚$9:p‚!/75
m   .79fH †>ƒ`„I‚sŠ4‚
ƒj‚|B)‚[„he$HN        …gŒe†N†b#@”2“B˜,‡H 7©"¡F…+t˜†/†ÖE„-„n†˜ab&d‰5‚‚sŠfŽ
|[®9*s‰o20‚2RaŠ^iƒB‚|ƒt‘z879ƒY‹jŒ‰5&Jl‘F†<‚B=6l:ƒ
”z$Ž6ŽF.„@ƒP‡>—WŒ‡JOƒŽ6„q·|ƒ>
>bƒ‚?„-L‰=7ˆ    ‚d"Ž‰£  ‡k‡MŠK…t†jK¢}N„r(?‰*TE1…2‰±X„/†
…_” ˆOC‚›„6Ž
¶‹^ˆ3Z^‚14†k¦<¥„
ŸjáO"…w,ƒ3ˆML?…jˆiƒV^'Žö+ƒGl#@‡` §$—E5‚W
‰z‡h…‡d?ÁwRoõ‡„Q
<2K     ‚2R
,,Ÿ&Δ4>¶_
4‡du
ƒOIpq„E
mO¾65]3"‡ku‚Ÿ)‡†1‚ƒy…<‚jKŸ„s‡[L§
D‡]*TE1Y2§„KL_U   
DC®‚®t…jˆ3Z^‚14‡gK‚UŸ
„M@ƒžx

JL?wj
O^'mŽprl‚ˆ)te~™(ödŠn
‡q™ ½,‚e¾…Œ7&Îz„ƒƒpap‚I`spa

N‚qStZŽO~ƒzˆF®7–È`ƒ#      „;x…>g
ˆ6Šq3C!7<½6#-9 ¾‚/
M
E‡^       _ƒûZ=‚¨4¤!3C7<o"6z‰O
–f u„O‚‡M‚Ž@9‚a>ˆG…b‰\ˆq   „Lƒƒuˆ;Z‚Xƒ  ƒ-˜N‰ÍF‡u
!ˆ_r\
G

‚3
ƒm.J2§
ƒOo…5µ3EY5p1‡T‡TEÎ>
‚Ek‚þ‡0Úb
kr¶ƒ‚I2¯]¦„5le„x¾&—…Šp”4‚|   «AŒKŒ}…E¾
èE
£…cÑB‘2†{³!Ýn‹iˆˆ+Ü©X§TÎ1  «A‡oX—6âB…‚ùg0„§z¶‚xÕ‚0ƆŸƒzlin‚29-K’Ô jDnumbƒ†˜Á…li‚„Pm‚‡r”õOse‚$wgH†l#0(G:‹#—j{‚A› ‹?¬      ‡.
S‹¡x„„D„6‚-ÌP‚•8 „‰[
¹w    ‡ÌKŸ=Š4ËMµ^…rµe—Šlƒp*†5ƒw‚nŽþ…6¶R
j{—3J‰‹?¬    ‡.üw‚Ÿ–Ý_1§«sc¯Mžt&¤
    _‡YÎÆŸ‡>'ôpy®ƒ&?
*
‚d*y#†Z‰(
ˆ<o‡U       ˆt9„2„iãL}¦F  O„uŒˆJ‚p•,m^…YˆP–d
&“#}
‚ˆZ
      ŽPŽ÷‚MkŸ#1Æ.&ƒ+‚ Œ‚‚‘F.¾CzÃk¶\Z‡W—.$    (œ!¾
Æ. notgit‚—†(ide)
ƒkˆ=ˆbJ:"0–S"«ƒ^•      ]‹jƒOqV™~ ‚7›+
‡h—J!s”?Žþ‚f—=MO
-:"—29¾@/*LÝ@6¯6H„ºƒ‡U‚‘5^r‚‡mƒ
HÓK‘þn‚×^rspread‚„#OŠ      [D‚Sq'ƒ(ƒi&
""ŸV˜€€€„ ¿0ȃ|‚Ž†Až6˜šVo0widgetLth‚œFM
…3

D76ƒ‚7…y'zQ$Š†@       
øqSM
‚Ï„(ÎZDƒ-‚(0 '+Q‡b
…ƒ'       
ki‚„]…Nž~5à-ƒO‰c"bŠK…Tœ¢o‚?…N„ÙM8‚‰H`^”E+pedia·a£‰.¾„Ë$®`:ld‹G†*ƒkƒ.¥žNlŒP”t~7 T"ì
ˆ®>QcardŽ ¤Hˆn
M       ´xŒbƒ}H~½c†´Kƒ}H~li‚
ˆŽ‘‘ˆD†Û‚5ei‚4
ˆll#
‚C ‚=]c
B{ˆM'&‚,…[`
„w+„;‚j„j"‡1tG#\„@JR‚F
AƒwaS4†Y…:ƒ>‚VK$†b…7„ƒ3=‚„B‚(‚&^( 0_.1vKQ&… a‚
-‚{3ntŽjD`Lv„p‚:RA
zG‚lƒGr}'ONP'
.'
S‚1L†v(ƒ
Q)C[!-„
%b
*‚%ƒp>=Q

d:Z9
w:0ƒ\:4‚8"ƒ
l@‚#;#%_<y7
6|ƒƒ.,g@N-2N!14%%! ‚^%
,q(Yƒj‚z[>‚+‚{`4
8&S@8c53!
mw.8L'…Ai
T[&9Y?6@< ‚tq]‚
kƒi+
b'G?F)'‚:9F†B{1†p%$&‚'&        46y&‚5
Q(‚ ?XƒHZdƒ8…0MWF     j!‚!I„%*r-7M&D‚F$$]B ‚‚?l        vƒ?;‚„S‚+       U…N4ƒFƒ.Me]
‚}P‚ƒ‚"‚C9‹*ˆF†dL…(„f")E‚Q‚k2ƒWS E†'8ŒG?  Ž       ®@„†|)‚„.)( R²T*„e
ˆf‚wfƒ
!j‚(‚N‡MQ
_'|\…J„3
'Dƒh"A†#N†%„T‡ „(‚ƒ}
‡ƒ0Y%7p‚Pcf†>IE'D‚B‚J‚"9
ƒ%
‚-ƒ
‚l     C†hƒ8ƒ5a‚
‚i6‚wl4r
„TK&N…VFYX]?&!
+‡
p††‚E:?‡›,‚u<Œ<E‚ƒ'pO?
“f     ”OnY‚M<‚<SL„>‡(}ƒ<#ƒn$Aƒw6‚yˆƒLs    ‰jT'ƒyW[„/ƒ"Fˆ&‚Rw}w‚p     uJ
`[,@
X
&2ƒ'†7&‚+‚o*~7‚Vl &‚V>ƒ
'ƒ@F3‚6=O/*r.@v$A0.ƒ1c/,+‚} ƒ..ƒn9ƒh ‚<K‚o1
<GY,…3ƒ4‹/A‚~6}‡,‚fM^‚(‚^C‚C‚!8ŠSƒXˆ…)‚nt‰9 B„)‚f‚)6Ff       ‚I„p‚#ƒ„oRwƒ)]‚pHƒ&4=…rQ
‚  Z„&'„‚oC\&Ÿ0ˆ1#T1„‡:‚K˜9…K…*‚>
†h ‰ƒkW       ‚H'0V[ 8X?
Ij„b‚&N`4IV
QHvaT+†X
‚<
ƒ
1@XAN4„
!‚bHArB:)d["
jƒz…'QeI
„2‚Rl+9e ‚iZ.q
2E‚ƒF*
‚;…pŽ/ƒs„'rƒ†@e-lƒTAS4|''>X        >„
T†A Y{„[‚
"„d)‚(9.hƒ'
di-[„
‚+a‚lZ?Œ u`)WƒLN\‚ƒOad†[
oY‚$‚=        r"     ‚'E„p„:‚C‚k„}k‚d‚-3MG‰g…ƒR‚
ƒ]ƒ‚       „q`3„?‚6i‚jS3Z
‚]#‚@†,*…Eƒ;(^am?M7‰3ˆY…A‡$ŠU˜+~‚s‚Gw…*ŽƒI‰y‰‡<S†ƒT‚ƒ/X‡pnƒ~‚?sn‚9W ,%VƒŠpƒ
        Š,2=‚1‚d6
KXx]#F        v‡OƒMg.(LˆdU†sTN
iJƒ8Z{
[#04„f<L‚mN…'K8%ƒ?„;;‚QƒSƒq
ƒcˆ'\ƒ„k‹pLƒ%%
;jc!GRz%* 0a‚2ƒ‚V‚‚~ƒB$ƒ>ˆS‡qƒƒ(‡F…g
S…„n†V="bƒZG†NE!ƒ[g"‚IƒE„S
‚+‚Qq…%=z‚;p      ‚@‡f!?:L     ‚ƒkpF…‚@eQƒ@†8KV…2e…EAƒƒa*Cp#'m.,
g    p‚4(&4f‚+e*C/jp/D(ƒ‚\p@L%‚P‚!I‚1
M+$i@<iR†],ƒXŽV<+H‚~ƒpq
‚(`
…|‡xˆ‚JA‚‚auƒ
r†2N
‡k[ƒ) 3<…
‡0ƒa6Š=z CPBƒ7‚FS‚=VS#)ƒ`…p'ƒ‚t„.„Qx;j'nW†…Sf3"      IN&$  „R-rV‚0LMw‚kIYƒb_9ƒ@’KŠ<lƒ/‚sV&_aƒ0•f†7jƒY‚JJ4ˆLK'8‡Nˆ“v{mA„(=_…<Œ#xŠ?6+œ:‚`P– W)#‚X*†sw‚N~5†‚ OV,;GdV~`"^ˆ_^ˆH‚#D†IM‚f 5Ck+B)F"#‚"‡&AlˆP…ƒ;…p‚]…prŒ9|hH/+(,‡9cƒlG‚D@‚9‚„Shƒn
iB)O  ƒ"zw%x=M0‚<…@„v„]ƒWb„"‚k†PJ%/\/MG&
))ŸO˜€€€„!¿"?»‹‚&pG‚ fƒ
‚N‚ƒy‚.%_†‚;…0‚yB{‚/=‡+
‚ƒ
l!‚8@U‚zƒJ    kF

M"Q,;ƒ@‚1d…i‚#n
DDWF
3 SU!;<0'*  W†:…        
‚}4CD‚N‚UE iE4
.v$‚< vr…b$‚HA#‚
‚O[
*)Žöƒ6‚0,WF 
&!
I*r-7M
>D{UF$]‡Y ~‚l    eƒ?/Pl‚+    UTC—5DL‚mO      ")E‚Q
)S
 E‡`
5?   
‚]!ƒT)#„.)( R,‡O
(„mif
M!ON‡`
‚-a
N…pDƒh"A†#N†%„T‡ „(‚ƒ}
‡ƒ0Y%7p‚Pcf†>IE'D‚B‚J‚"9
ƒ%
‚-ƒ
‚l     C†hƒ8ƒ5H3
^)&?ƒIYX?!
+‡^‡‚F‚(
|:?2‰p,
x<b‰#y.E?
#sXY‚M<‡@jHL
#  ‚p‡T‚+<#‚$AÎ
t'
&@\E%i‡f1j=
%*x.@HQ0‡`‚+1c,+‚} 6‚.ƒn9ƒh ‚<K‚o1
>GY,"zƒ4‹/A‚~6},„k,‚fM^‚(‚^C‚CK`t‚6      B.}
‡F
T‡g3Ff  
1‡`‡ipQgLHpŸ
1oCD‚aÎ'1‡XA—8
!‚H‡?‡iB:)3,‡e@*‚oƒ}#eIR§&Z.q
2Y(
‚9*Ÿ;4|''‡g
W     >n<‚| %{‚f"
)C(‡Y&ƒ'
di-[
[n
\+
#?@57)8N"&^a|[
el       r"     .žqi‡h‚b
3L@‡h
3`69d‡X3Z‡f=®rI(^am8M:-
‡|
‚‡jXH&T‡U
7   Jf‚<5.(2
„
<
;‚,{KV%A‡C&AƒSJ

c„*‡s$t—4j%
&c!GR2\* 0C‚2ƒ7TT8‡[
‚
(†]ƒ(‡ƒAƒ0„> ‡_
‚BG‚uE!ƒg"‚I‚M:
‚+‚Qq;%=rL6    ,
D?:L     kp‡S@f7eQƒ@ƒ{KVHK…   ,ƒƒa$Cp#'m.,
cwp(&
3*C/jp/D(‚5p#L%*
KI
M+M<iR‡iƒr<+Hƒpq
X`‡(Ÿuƒ
;N
   FP 3<#bNa6p=~ CPB !
JF
~%S#)?`I_' ‚8žR‡‡j‡9‡f‚‚s—9
&_Tw‚N~5†‚‡bM2,;G
+V‡d&‡g]"^M
‚VH
o#'
L‚f    #Ck+/"#$V‚("‚j
 ]I—Prg‡bg%/+(,
\%#UG
'@$9t
„
    
ZB)O    ` ƒ"z
%x‡S%‡jsG81LZ`{"‚k†PJ!‚& 2‚ fk
N46
x%_#t;k‚B{‚/+t

0>
lU|
a;     kFu
JMaE
4o

,DW*
3 U
;<0*& f7T‡J
4MLG‚UUE     0win‚»       ?0Ÿ
       @
%ù`ƒì$ˆ    1
%1‚Uƒ]
        ”å4ƒX
        0ƒ‹—ão2‚Uƒ_”å4ƒZ32'oƒ
Ú†@V20„t>ˆ1 –kø„ªR‚È_data_directory_typ>heap_cr‚Ù{Oøt†òf-malloc2¡7,ø•D†òm

_valid‚Úkøt†òfI
set_directori'
<Dy16~8|temp_directory_typ>7‚½c0
ŠvM—ãM95‚ˆ——û&›3Nv$*#

""ŸV˜€€€„"¿0Â0winc‚ƒj3d‚
·Uüx
…bow      „b
‡[
a&ƒ(L¡}b\ 
dƒmT…Ou*‚v 
„.,+ƒK
/
ˆ„gQ-ŒlŽ$–Jƒz†B"5ƒ4‡[7ˆf8œ…>K‚;:‰w…K“Jƒ{ - qG$‡2{„o„]`†6]·"ˆZ  ‚
)†7\
-‚xW‚YW‹
‚/
B~†[ƒM•]YfŒƒN&„ $^Qlx‰´}‚†.'^y‚4=
       $956"K!9
&‚Ti08,‚t‚#‚|!
4T7ƒ
    8w


&;G)j

"
 ž$}ƒ9„pŠ-œ “o…1>„oh„6ƒ/ƒ+@
5—(G)MžW‚+‚:
E$ƒ‚$D#„O
%C-„/—'‚)‚=°c–0
<‰]”72 ‚O7¥OŠpŸE[„c‰H=…)

‚
‚@6ƒt‰&„„ 3„’Sf+Žöƒlå|—3"—5IåL‡f…>
‚;ˆP‰w…K‘:a - qGj7‚ c?AW®j‚>$^Qlx#RCiŒ!H=
       $954"K!9
&Ti0\,`‚#3!P
4T7ƒ
    8w2


L&;G)j

"
M>‡ehz‚.5Wi‡]
E—5VXD#ƒõC&‡a[Ÿ*§9‡<®ŽC‡c[O7
KC
[—C
ƒB=
 ‡i‡`—7Hs3TS/      f+s10‚E.A‹{—ão
-7ƒ‹—ãoner‚ƒrtQx4)¥;‚=$—s–1–×6_§:xp‚½a•Œ9rd‚‡de‚ƒ!‘þnse‚
›E@‚ŸÝ.
†w@h†4ØœAß[I,‹ª
‡É½h‡‚¶‡œƒô4ËBCsen‚ˆFt‚„*œFƒY•é‚AÚ`hQ4-
%
6uWt ƒv.‚"e_0!=ƒ(„
R‚2.
'‚#(ƒ,\>-gg‚‚z2]2ƒ=xƒS K‚Zb58P„b U8eO‚{„7Gm‚#‚9
gB}+ˆ„\8ZmtƒaƒM‚v…|"x
ƒ72j8@]‚u6y#m0 ‚Fl
‚"‚V‚}…(‚SxtU;&   ƒ%6/f`GF‚M3‚3'&
Ah‚)t
‚\fL</eƒm!2ƒ"1‚ƒM-&
‚DK2V0H<zE= y
y\B?>:bN`?…#8Z„*E<V…%RX‚9„?‚

y6‚Ru

)
a_K&G6w.2(oLh
 
42BGJ 
'
(2U*;…‚E
nZ^M'@97,?

Y;2Y%
ME
9‚ƒz0WU2
6!?W1
E[1F6%2‚0"c"@
YG‚4‚#T‚hzH
x&M)U
6-
[>_‚>_" 
*/
.E/)=]    FCszB7?I
mKr‚:61NM,FG<a‚UcOƒw;+
‚B…@
%+
6Du"Y5.Z
(‚%A"!‚k+‚y‚9)%Waƒc1^@5bU;‚861",ƒ9,
7(sƒkKˆcIƒX4
B&(‚wf&6-u_,e
5U>{R
0 m@‚‚,‚e5J~O,(k‚CC8‚D‚
„^w„
‚d$&''^z`‚GƒI*Xs2*W! ‚lu‚w.       PB…K‚l[7‚„L0j„pT†‡z)u„P2"        ‚B…2(>A&t:J$…t!‚‚N)…Z**/  
9„\……:‚a@‚*‚ph@ƒ        ?:‡~‚a‡„S+S@        nzP!*8y/M‚LY&ƒfl/ƒzUH‚d„‚7+Z2‚3t‚
8^ƒYƒvq<ƒgƒ2Z'\‚-v
G9"‚KH-‚|vXX])
I~   -=Cd„b-‚)w‚@‚e6ZB‚q7„JG,>C‚lHNwGoGM]q„G„q!N(s‚$OX9
ƒ,|$>(ˆ
‚Šv†N!(‚(11ƒ`h5‚0X„DF‰V†lƒ‚.sBƒ
„gH|…0X„=     wte‚„VƒY=‚}ˆ8„‚s"u‚>-Pƒ14
et‰\xjkƒ*Q9‚WmDS#.n†<‚'I!=Q
N$+>"?'oa2D&,.q‚R?„?<‚L‚C†*S5„1       ‚`‚05!!‚I*ƒq„M}1@XKAq
+!j‚o5‚<C†ƒOUƒ6&bƒ`^{==‚#‚bƒO1-@n%a‚6…'&[PGN1
i7+ƒTaV Fl6?k^    ~1
„Jƒ]}\†.‚/N$ƒ9o‚z/‚0IVl*'\\{Ai5z
/G5
^.‹:!r%
!!ŸW˜€€€„#¿2Ó%1…Jcƒ1/R‚
3.3(6H      7/G‚*$R+(A‚*@'MDNH3HY}0]zƒ(ƒ8?‚r‚D)#Jg2+m\m 
U‚5‚-@‚3g6sI
X.C0
3<>T‚ nAR%`‹q5FB]‚*‚M=…DV`…Ug„$8\_g…A^x0`\'‚ V~sƒk„    ƒ‡6%p *!!‚:-‚B9=‚>T%Qp ‚6‚;…Ž7‡Wf‚
/5ƒ5dw†5vhƒ‚ƒMN}‚=‚„b.
%
hƒr
-R,ƒz0}‚‚.Gw‚LF
W6\ƒFw7HrDƒL‚E„e$3F&pS@ƒpVE‚%O‚-†2c!0ƒr-‚\@ƒO…8O‚"'<=(>„I|S‚C
S1M'ƒc‡u…2`%830=DD„)N†‚=i+
D!\…64M3 Y3&/$@#/4'+Pd…c@‚ƒj‚4=6
ƒQ(‚,E]0…g0…DV„&1;‚'ƒƒ~Y‚ƒd|„7#a‚DƒF@*Iƒ4
‚b4

J*\T5-D)‚B‚fƒwT‚A‚„*‚‚!{"t2ic‚%‚sƒq-0O#)‚'`
‚s>:O&l(ƒ=-34g„$<\8Vƒ Vgn:Yz2HDƒt„dIL„‚%ALM†Q0ƒ‚(
CLJ…+‚MVƒ^=
p‚C0Xf
lH_gN‚‚Lw'p<h"‚
‚Y4p]‚‚
|!‚FG?‚2‚!M?M„tT…Y‚M8…u^ƒS†3j‚eƒ}q‚::4Nq;Z…lBT„

 ="ap)…ƒV†
'‚Ji$yƒUv4†zYZ
I"~„b|‚5PX
!ƒv8)R)@!V/ƒ&ƒ
'"j!@nOFz^(}bn d„N        DP!n       ,ˆ98"‚&P…E'A‚*_3I‚ƒ‚lSg22HS()4„47O+/=M„+4…pc‚‚P†g„Wq$(7PZk†8ƒgyƒM‚#ƒƒ{ƒW‚Ci‚
$;uƒƒ<5‚F8i-‚
0E 2ƒ7m#6QV‚/RZg‚z„ ‚Do‚'m‡4ƒ\btM‚?E%24p‚EB „PAl‚X…XMU ‚lr„l‚.…7G B„$O6„Q3‚Wi2:%h3+lz+‚b…„„Dƒ0<‚Md+OH„;P(‰„j.mt;CURU
aM‚fs
„;(|-X@:.w&e_A*.1?e?I‡um‚^‚Yh,?ƒM‚CTA
…KGzVG;fR„%oY
…Zo.W:ŠE7Y4…m‚g‚"V^!„
‚:‰MTH‡+*fQ‚
t‡?":8ƒ+)ˆ#‚xg‚
…3lƒ…ƒ"†X?r
]ƒ*20‚wX&‚)uTˆz…‚‚2"$
5‡m=‚Vƒr‚Z8‡'ƒ,M
MEŠ ‚\D‚E…Zo1@‚}‚Z 3tG:‚tƒ‚…D(rnŒRA`…[>ƒO'‚>S^‚<R„4ƒcGq‚)(‚W‚>‚}„%"M<Gƒ--„Zƒ8tV‚!„†‚.;8‚ o‚‚y-‚;+ckJ4,†z„dxLƒw‚T‚xknA-.F9)‡e‚NH#K\
y/@pEO;-+O„9(0ja%*:"‚]‚kT‚C
Jv†4^,=I‚7‰fhn‚8‚N„$ƒJg$…i+qEzr‚I„|„4ƒ
]?
‚Y>]‚^W=;'"„xn.0P‚/…&!#mX$p1.
RL%}Šk&ˆF/ˆ(„qƒ
<„l„7ŒN„‚v“%‚h‘h…‹/J>Œ,{Ž3‘|N•%1žp‘$(‡&j;†K7
(‚QRhuj‚&‚reYu$'†A.\LƒV*F4ƒN68‚‚y…2]x‚H3l„a‚*-ƒ= W…jV5‚N
†5q„[RF
Bi4>
!+…mOg[py/ZAK@>‚B‚&        =4Fp‚Kyl_‚!%nL)h‚ƒOa)UX>‚_ƒ6U
p1‚VƒWM"M.%^ƒ"‰'V‚Q‚cOF…U„sƒDEn‚
U"…„
‰…‰G!&/&HHW‚ /+
n‚T~tv$)H3#d‚dQnh„ƒgiT' S8K‚z%†SH‚^„/a~l1#Nzƒ<A<
A‚Twm h„KƒV9?ƒƒF

‚}
T#1ƒ9xq8=
„eygƒ,57„ ‚ƒ~ƒ?„&Žös~O,(B`C8
‚
5
*^%ƒ
/‡["&''Tz
‚Gƒ*Xs2       ! -Q‚w.L‡_‡Q‡eYv8
 Kƒy!$K)$M**/        
9K‚+
@[*‡Vd@ƒ     ?:J+1+S@
7     nbP!*8l.M/Y&ƒ2/ƒQ
HAd‚7+‚*y)
:>ƒvX<
V8)Z'\‚-v
G&"‚KH- =X]
I       -   /=Cd„b-P 
0
b6‡)B‚q7‚G,>C‚lHNGoG  Mn]iq‡_@)GPM‚QC
<$>ˆ
4KŠv†N!(‚(11ƒ`h5‚0X„DF‰V†lƒ‚.sBƒ
„gH|…0X„=     wte‚„VƒY=‚}ˆ8„‚sGP4=Ey‡\j'‡)Q?m.S#mnƒ;‚'+!Q
*,$+>"?'oa2D&,Gq‚;?S<‚LX†*S51   ‚`‚0<!!‚I*) ‚"}1@XKAqm
+!j|54
0CUVƒOU?6&b‚e`{==‚#‚b
!!ŸW˜€€€„$¿2    Î1-@ÿ+
uaz '…'&[PG‡>
H
k +a' F66?Mb       
#1
F
#}\‡U^‚/N—5
3
z^®J‡g8\m    3X<-
,‚3VF"
 ‡lA%
&5F‡][‚*‚M=„}(J`…Ug„$8\_gE^x0`\',V~sƒk„   ƒ‡6%| <#!!‚:-‚B9=‚>T%Qp ‚;G
q
5ƒ@5vhQ2N‚?>=‚4
%
h_‡BR‡d0
}eEGw‚LF‡d
6‡
uw7‡dF
‡g?.$3Ÿ§
Hc‡e=dÆ#‡i —T
PA‡‡‚%B=‡'2
c‚k1-—5U5Nz-34Fs<\8
Oƒ Ÿ‚k=
p
N0‡H#N‚Cw'phK2
=47‡XG?‚2‚!M?3k4
‚-882Kjy
_8:4Nq;S+"už
‡g
‚J
F$-vM+‡d
'R)5/!
K
'"

!@
6O‡VD‡i7^(}®o
        998"<PƒR
'A_3‚‚b‚lC‡V0!
)4i47O
|+/BM‡Z(g
q‚y$(7
K
*%
bM‡SjIJ
y6BQ3‚/*2
<‚M+HLP(f‡_m
t;U>ULGM
sI
s;‡g
K@:\&e_A—3       ?
}STA

GVG;QRƒ_%oY
\Zo.<‡‰Y4…:NmVH!„
N
XTH+*l‡_O
Atƒ:8ƒ+) Jg‚

l

}
ƒln
‚c?        a‡]AE2G‚OX&‚)AG
@'‚‚2"$
~=‚Ve‚J ƒM
MEq‚‡D‡\ETo1L
;N 3RG‡f
<tV‚Y(rnA`‡]E
Ro‚}0%"MHGƒ--I
‚'t$zKDq8N2

&-
e+Vk4,A+FA
13k
=-.F9)-


#
SS
y/,žW‡i
‚-+gEz‚I„|L‡t/


]>P5J
D=‡\5'"
u„B—63KXT(2j;†K7
(‚Q‡bP{G
j‡‚
<U$'
9A‡YL
‚F4 6.‚y|2]xB
G3*lD‚*-
 9p‚;V5

u
mRB
Bi

!N+O
[@— &  =4Fp
f‚K%l_
!‡`A)h)ƒOJ>.
U
[1#M"
O.
>^ƒ'>
EQ'3c.W#
: 
n‚
U"…„


5
        i&H/W6/

Q‚Tv$
 3#d‚dQdhW
+i6‚z%wdJ~6;'Amk #?U9b‡K!1‚F9Wq8O
ƒey   0withdraw‚ˆ"P‘×Pheld‚”Lold‚‡5i
‚/h†#ƒ`
I>‚…a…z&z$!’lEpEŽ      ‚6‚„l…†G}‚^ƒw6‚Œ\’cB
N‚=‚.†)DT    ‹\L‡
ŒQƒ5
>bFp‚3      E" 8    
…:       S.7
‚pG74u\O 'm
fƒ'K! „S%‚g
      1
ˆO &‚*†‚1 ‚"/6‚'ƒ‹.EeT…iƒn‚3„W…4rŠ3…U‚:T'E‚j^MA„4A‚|‚Y+„;Xx†E
„s5t"ƒMˆ%[ƒnƒgƒe†!7„†r[ƒ#ˆ       Enr‚m-&}„{|† =„t‚zv‚w‚f
cˆd ¦¦Y½63ƒh„Gš

!!ŸW˜€€€„%¿21Ñ„‰6‚c        ŠJc  ƒf…“VˆJ‚f„e<ƒ=’)‘?…/
„Eƒx‚‚Š2ƒB‘;`ŽwŠD†q=‚F“=g„i…;œ*±2†7Œx‘‘\
^‰)
‚jŒaŠw
„6ƒa„DS+*‡?W‘GŽWƒ'”p.‚v‚!2
7 ˆd42        ‰‡
ˆ6:JŽ-”ofˆ?J>r‚}&„l‚*:\…„‚@/„}……f„~…?"„[„
r\#…C‚0ƒL„S~‚YZ‚%‡umM‚(02†Œ3E›s£‚{‚Š.
‰%Lo„!ˆ<d„‚M“/³Â1ƒ5#‹4ƒƒpƒS„“/ƒN‹5~2‹]‹m‰<†     ‚-‹J
šh„u„f!ƒe‰r8œbBŠB‘(
®2ˆX&/4Œy£7
Š:B…„Ž1i‡aBfŽG%2@…Y‚-‚    ‚.‡Q‚h‚‡Bƒƒ}Ž÷‚E,‡ƒ§r‡…e
W‚$U     T'$9
~AZ
SAo+
3+p#xx
„s5)"ƒM„
[ƒn
_ƒe
,7gar[ƒ#*!r‚m-‡)y3;ƒ( =zRv‚6s‡_^     >H’e¦Y½6—‚6‡k
ƒ ‚…‚c 5J
Y     X
†L‚(„9<ƒ=vj…/
C3Z‡J(‚W

‚R`Í{a—m„V•pŽNr‚0:*0[Ÿ8Ÿ 
®q¶UÆ(Î9‡JI(m¦jH>r]—3$R¾8\&
/‚ƒ„(‡Y~‚    \#y
@‡^
‚~Lu/
3Z‚XmM‚(0V—,}‚
dE‡b0
¾ƒx‡r‚gƒo¶9,
1ƒS‡^HR8   C4      `^a
Iv¦„(‡Ÿ&V‚)X&/4—tGu—'
…x:‡eA„
ƒ>Y
ƒ2@…Y‚GX<ƒ9‚h      AÅ‚0without1…fƒ"„d‡=
$‰5‚WNa\f
‘!ˆ!‡(‡G‚$‚Irƒ!’}„|Dƒ…4†
3ƒO‚8PCd<-#ƒ@z2*ƒy
‚69 
5ƒc‚91
4
Z_‚"…4w<‚&\ƒ{
Žx‚."N,ƒi…V‡1 ƒB E„6ˆOwY“ƒ{l…d sX‰:³<Ž˜>S‚2¤WŒPŽs¹!‚…ƒ(…~ÍW‚c˜oTŽ§8•2e7M‚4br‘o„
ƒv„`_†Vr2ƒ)‰\‚
$…Dr‘yˆ"Ÿuƒh†‡c2ˆs‚x‰v‚jƒ‰
‚K‚8Š‚w‚H†ˆ…[‘‰
D‚%šR6<3‚L\„#F‡t‚O„] „Hr‡_H‚Oƒ„V8x‰ŽF…7]? P‚q‡*!       :!:
!_'    ‚<~9+
-;c/!‚1‚`ƒ&…<… †@ˆbf‰d‚ k“q;‚m‚†4˜˜6…5„{L
<ˆ. „E‚:S‚~‚;…^‹[ƒ“=
‚s
™Œ6ˆ‚u„^h…^‚`„YšZ‡p…#Žrh…n‚,+ƒƒ0•j‚w$‚…?…„‰_‚|ƒ}ƒ'„JŽ8$ˆ†VŠBb‡v„T‰‡*[‚Š6Žˆu™zˆ>,„f”;.98¦].‚K…VƒuZ‡gM„( ?nƒZ„7      LŸ|ƒ„C‚_…{‡}&_‚5‚P†
…]‚H ‚PŠp*‚pBO‹Œ‰Y„,)‹e
‚89•t„dš:ƒ$…*ƒuši‹†>‡'i‡5Žp“[†K¨ddž}K:‚6j!Š„77

?CAwv@‚9‹…|.0ƒnƒ‡†%
(‚4‚U)0†Žöu3Td E3—‡f§zX$‡
`        #yX       ŒPŽs¹!BV‚c
ka‡/Š‡LAÕe_--E2‡g‡i
„_rŒ8ˆ"–~…_‡ccH‚+    C-X8#w+
H…@0®D§_F‚G‡d.å
6 P
qPR‡d!   !:
:!_'‚<~9(+
-;c/ !—5,ƒ
®k{‡h‚1\{=‡c"‚!Qž}6‡g:I—AW¾ƒ7‡
‡‚ƒY,‡ZA+‚Ÿi$‚|—‚x#Ÿlƒ6$‡u‡…
ƒbbƒdƒTƒ'Lg ‡‚@„E†T
‡R.98}.‚KA/4v$B—‚%—‚bVu
#
bƒIV&!
/‚P 
""ŸV˜€€€„&¿0Ç–ÚU

Q‚; E*¦‚_‡‚AŸu9—9‡i‡e
"u  $W
‚@—/‡cRƒsD‡ˆ„CK:‚6j!„2<

?CAW
@‚
Y9
ƒxJ|.0ƒvh
         X—.
ƒ0withoutnulˆDoman‚:ín~Ø'b˜A¤_‘;    ͽY'b†”q³FÆC6der‚ˆA
"    •é{}œ
     ogi‚†f•Ú…,rd    
@‚6‚X„*„*…|„k‚m
ƒB„8iz…";,2<k‚a‡0bƒ2ƒ‚ ‚%
‚‚?‚S

\Sr„joŠ7@ƒxh      •?ˆ: &?6RS                           $m45Q+{

:@OI0H&m‚f1"
b^o‚’,–2–[¡Œ½9§Q@ƒ7H½ˆ‚‚5‰4K†-‹(‚ƒB‡~}gWŠx‚#JNTŠ\„,ˆ`œ%…S‰<„t…*ƒ'†i•j„/)‚Ju<5†Cˆl‚‹)ƒIL‹W
3¦QˆL‚:ƒ-‡” ¥-ƒ„6…fuƒO1‡=&k‡
#
     A, ˆW–q*‡›GŠZ…‹:
‚&…@ŽKD‚E‰”_ˆh‚ŒHŒ-–sž
.‰,
d‚4
ƒ&
…8…4‡B
:
‡b…J„ŽQ¯[¢2žY‚~¤e[ŽCÉf–‡¢U8j„5ˆC†…N‰ƒM „†zM‡4¦G’
d§‚P$Šb©Š›a„`…p‚Aƒ8ŠŽEŽ÷*‡["&?6 AS                       $545Q+&1

:@OI0H&m$$1"

W^o‡c®‚‡l)‚7‰>]‡†^—=H¨8ˆ‚‚5‰4K†-‹(‚ƒB‡~}gWŠxŸ,Tƒ‚D‚„2ƒ.‰<„EƒrW
‚
)‚JƒFu<‡F?/Õ_—1
L—/1,ƒ
‚~Ÿ Æ^‡#Æi‡f—‚3—5"i
#
    A,Æ‚=‡o‡(†[* (p¦o9—¾<GƒK‡ ‚D‡do—4,Q_‚$P
ƒ*‚8—0
3
§‚jQS‡‚k†;f‡„(lŸ8o—‚)—‚U¦?6¶^‚O†…Nƒ.1‡2:M
…0‚—|‡M4,i‚„3…O^f'$T—       QEcount‚8j‡,oX“ƒ
oXwrapƒ“—Ì…9k‚-K„f…Z
1‚rŠ–r‚Kr‚        _b…(Pƒx‚iƒ
G‚ˆ
_‚h+&‚Dl
‡3’"G#H†L„lSy„Fr„k†
ƒMm
b‚„h.h&
t:k     „2
(E'$
5CB
5ŠO
^„I*.s
I„F†{
‡‘\‚W‚:
3ƒ6‰ŠV‰c‡
IŒ]d„G›*8Œl0–$‡h“Wo†H‚W„O‰J¹„OzŽv‹d fjQ™o˜k…,‚+=†>1……Vƒ\K„    ‚Uƒ/…0ƒr+….†jƒ|‰).s.‰Z‡[„m‚n~

^…A_&-S˜4˜4Œ'‹Ež$…7-‰C
G‚HuNˆ&
B„ikˆV*$YƒC‚:J!‚+ …1=‚Qˆsl 9ƒ?      P‡3„ab ‰%<‚*
^‰.„|ƒ:<@‰0vŽ™c‚†p„Q„O#„`ƒL‡F.‡8ƒVŠ^!‚2ƒ#‚b.n‰
‚
„zS.QP…:ƒ‚q„  ƒj†ZB‚`·
7>…;ƒsa„W,ZD!3‡‚;"+U!‚K-„T 4ƒZƒ.{ƒ
p†;…f‚C&A}}#-…75J'(ƒƒ…)‚}8A‚4ƒkL BBŒ„8…W—
†1"8‡ƒ
4†6„[f
(…M‚@M›T‡kœEy5%„}…‚tƒT
…‚)K‘R„;J‰Xƒ`^
P_
‡>T‚A‡!p~)^£8f‡6ƒC.…A1†WŒ8UsI‰/ƒoƒb‚‹%ƒ]ƒM‚‡wƒk‹N-ƒ…Y„‡!„ˆ>ƒ>   "Oj„3*IŽdvkƒJ‚(„‘~…|†'9l8{
ƒ{_C…WƒjŠf @‰
0913‚X       ƒ…M‡ŠG…Q…YŸ/GyŠ2„„RE’‡7„8Œ!B…®„Ae‘$ ƒ„cVVƒ‘„K&„sƒJ‰c‚N‚3Y„2m‹J
ƒ2[$˜~–-„6ˆˆ
˜oD
‚w‚v„ ‰c‚GŒŒo‚yBo\
‡&$"cu_s3
‚a

ƒR
RjR
"w ‡ „!uƒ9›dƒQ‚•ƒ;ž:
Q‚oˆ Qb„‚‡ˆ‚J‚;‹U.mF9'‚OwjVŠ4‚TC†6    ƒn
Bi‡p!3Šp7
ŠA±^¸&„:‚
* A4T*Hƒ…JH„N… „F/
@+&ƒ4‚&„A†‚0R
LˆZvˆeŽös,s
I‚    
„v
*/‚7‡b‚HL#!
""ŸV˜€€€„'¿0¿x,‡a/lVqIG`Q‚‡Zy‚5d6hM)
ƒK‡v‚)—d†˜k…,‚+=†>1……Vƒ\K„   ‚Uƒ/…0ƒr+….†jƒ|‰).NO‚


^‡"‡w(
†F…F
„F‡ST‡ƒs—5?ƒ¶9t        P D‡l
'.H%‡>ƒvŽ‰6‚†p„Q;#„`ƒL‡FD>WD‚2-Cn1
%ŸrSŸBF§     w3¾—:f—9\—4t>9#-$5J—i
‚N8K
O B'K¦
8+4
f
‡_ƒk‚@MP

I05F{žr5ŸEe‡[@¶Z     
‚A‚h‡#p
)‡Y
|
        !A—U
0    L
„9‡Y9*8uI<
‚‡‚~—7
-3
    
%2j‚‡„dK‡b
zE[YV
‚       ‡XB†n)        ‚5‚ŸTV‡o‚_„—.MXmƒ#     2
OD¦B
‡ 
Xu
3
/‡b

—-—7O*‡i‚<QD‡`
5!‚JH‚Q6mD[Oj„
&8    —@‡hh„&!H
…[—$X6?T*~bLMc‚


@
5U—‚…—7t0workaround‚¨@¯0•Ú„‚‘…zerYãlflow„7—6loadP}/…b;
ðk)„Tƒ Ÿ1ƒUŒ/Á(~1Ž÷…      Ÿ+
      ;å_‚G)ŒƒF†ã‚}
s_for_alic%
tatœ!+"C‡.‹w‚Pƒx§I…2K'†(ƒ‚4‡xŠ`
’IŠZŽ÷„|ý/”B-ƒì‚‰H
%L
‚4<‡håU‚mld‰0[9‚\I…<‘n     Šˆj/¯G#åv    ˆC
Ÿ#z¬n
=
*›P       ]„| „{‹X„?ƒŒ`Ã2-¤!‚W0„ZƒOˆ<7Tƒc#ì)„Mx]      
ƒƒl–":3§8  
‚
        ®qiB.G#KüY
“0zk2
:
*êƒz‚*ËÝ‚lwid‚‘"…Eri—MÚJˆoŽ-‰ƒ
¥‰]ƒ[Ž÷‚hŸ
ê‚o‚Ï)§‚Ds¢Cò0‰j‹fŽ÷$JåÝb†úLt~ƒr°Ðd   
“a%ˆ2½ƒn
2„›6‚×=
…'%³„th¤[†+S–„2½‚+ùr8ivuwhil‚–7uldt‚3‚fH….gC+R>‡A“v+‰;K—_dƒb;
‚g
‚j
‚I;gL'
+\"‰C„VŠsˆ
ƒ`ƒx‚  }Žjƒi‚~ƒUŒ76   5ltPƒS    …    ‚"C@%„
d‚„0„s  „e(ƒ5
ƒz
ˆZ7B‚@‚)“\ŠqŒbŽ‡$µ†"œd‚)Q@8ŽPŽ/
s
ƒoE¬_‚ÞKƒ0D(Šs R‹W…xM¥C6P—D%ƒU…\ˆ2.Z‚Jƒ`†\†U—xƒH‚I”PƒNƒFŒ:ƒG–b
A:X…I¬Š2ƒv}Gƒ`Š$ G'ƒ+‚@j‚
„gc „ †‡y”<z,„9„„# ƒ+-†„h„;X…sŽc.“%’g™G
‰Aƒ\
ƒ 
ˆn†ƒP‰‰Z.…Mƒu…†‚Œ;&‰Z‚ˆ|ƒ0ˆˆ2‹Š2‚|‡b†&ƒi„|’;
¢9†jŒJ…AƒD‚ ƒ‚K†%‚.dj^B„NO5ˆƒ†        ‚…S‡[mˆ!„!ŠŽ"ˆmŽW¡W‚7w!„Œt‹Ql‚O(„ ‡M =†FiL21„5 V•$™by†…w”‡,Ž9ŠFˆ7o)….….‡tõ›Hm.
©+†&Šw‹‚'‚Áqƒi ;ƒ„bƒ…cŽ‹]             „Žö‚‡hƒ3B`w—5Ÿ! w
‡o
B89‚)Q‰CU†q‡„M‡:X˜‚ÞKJJ ‚…%„Fƒ*>‡7‡F/‡‚|
\—6=¶WO|!ŸŒƒH;
sgM5ÍA®s}¶W#®oB‡fhS—7
( R        M!UŸƒ‡@
-X‚‡"K‹_),‚Qn2O

""ŸV˜€€€„(¿0Ç“ÛN
?
.¶,Æ95
‚5
‚Za‡W9Ÿ]‚!I-n
‡hX‚‚nŸ*
2‡…0…~‚kK‚L0‚KZdj^I‡a'O5‚Dƒ„o„t‚^Y`‡X2x
H‚7®Tu!‡‚Q
†+l‚¦*-
‚y    $
‚a¦)(‚ƒ/—‚EŸ:
i
‡g
o   }—‚‚3‡FP
^‚ƒ&o"
‚Ds

:
@     0wr”…&
%
Òd
‚xoŽþ‚*—9p
%
‡Á/}že

oap‚D±A…]"…
sPl‡x‰”<’1
=éBŸBCô‚„²†œ„Z
=per‚"„TŒ+a7ƒk…]
‚O#‘9¢#'
†`&8 wK®P
‰2‰A
®X‡B†"
‚Id‡5i
‡@#ׄ]ž5ˆB…‹/}
@ !O*
®/
&8—K‚Ÿôdœ‚Uñ}j‡ƒ$§ý&ý"³#AQC“V
@ !Oeck‚ƒ8’û‚^itablˆ/9†AŽk‘I
Šƒ1ŽsÇ ’„D
I–9«j¢IÖ|BŽ÷
”탑L‚Ïr5ƒŽeFschema#ˆ,O„z_@‹R"¸K‚j5‡ga
‡ÙE*0Ü£}ƒŽ1lƒž
a·J*Âwken‚$ƒ*]2R        ]

(„!8‚Ys0
Qlq‚
#,
#`Sc
&‚+(
N\
ƒ)\5`             „†8"`N|
1$†
;1
„,&JXO,:=YZ‚
8‚‡8,0
‹_    
#b66Q`X‚ZEJU"i /„:f0 ƒ~‚
”B&ƒ/
%††‚=@1,W¿tºS‚<B‚*„
‰    („
6*sW*;<„Op’`‚oƒTSƒ—b„d‚7†
‚„#WƒjƒU_=…BW‡
=3‚      hƒ-,Eƒpx
Kƒ:%‹&‹‚,ʆ8‡-‚g
Uˆt]‡>„n9
.C$
P‚.dƒ-‰)†qF}Q:… ˆr+bD‰O„(%‚‹Wa @
"‹p}ƒ"‡"ƒn„c†}
¡#ƒD+,…n
)‰HP4j/t>
Í$5‚u‡&r:P:„2ƒ,‡ƒL‚}6>…Oˆu9$†iU#(F;<
‚‚R†
ƒ!„2
5]@f
%‚}„;‚J<‚n\)e„&>*ef
g3&j#%G‚‚"m‚VCvz(‚)Q‰07† ƒ‚dh‡"‚s4
%)
,|…

‚eˆ*h…d2ƒ2†C‚%‚

:!dkDwƒƒjRˆ}@f80…<‡[ˆ‰3xŠ~8‹ ‹†tKˆ[ƒ.‚B#>   #+9!+2E‚#‰]@dƒ5L=ˆ1,60%@‚C[0z‚,;g„’'…2‚…T„Wp'
„?‰4ƒ‚[(<b††(’      ˜^Ž:
Š.",`‡`\H6I]2$!
K,#mb    „C\    Ya…s~ƒt†#> „J2Iƒ„)ƒr…A       W:‚1,4—^—i‚v„{Yž;†
M B!>6[$&
1&g%S$ U(TPs†Q‚2SZ’ŒaF†s‰xˆ@t‚ƒS†Š˜™_?–„&’c,†aO]„lF†r<‰zRQƒ{M#‡ZI
‹ˆ<c‘(NR‚7
†T0=„C
)- "
,,) /       &X…CXKE‚eƒ+L„J‚      X„:M ‚(Æ‚3O0Xn…h‰e6C2%KL_$C7E P6us‚!‚mƒƒp! %‚\x$P?„ƒk~@\„^j‚JŽöv66Q`/‚E$U"i /0 ‚R~*‡‚-‡c>¶&‚‡7
‚8B‚z[‡f
!*
i
*‡ojƒTSƒ—b„d‚7†
‚„#WƒjƒU_=…BW‡
=3‚      hƒ-,Ev)E8‚,†8[K6SƒwÝ‚c‚%‚‹W‚S   @
"‹p†nƒ"‡"        ƒU

*.
~DV‡g*‡C®/§     BÕt-—8@—65—8%<<®k_ƒ~N(e4S
g3&j#%G‚
mPCv0(+
   ‚,hb"
3
%)
,N
P

=e%üS
AR@‡ZW—8‡LLH‡nHi
5p'—5L—P—9rN
:b‚Ds
‚N‡E
 ,‡k
\L(O
I‡h#<
J     
 a&~‚>‡]
D#>K,:*ZJ‚8\7ƒvCg‚I
""ŸV˜€€€„)¿0¾Y–Ú

 B!(®D]®j*mO]„lF†r—ƒ~ƒ/nLMD2I
c  eN—~
„v0=4
)- "
,,)    &X‡O.
E
sZL,X
^ XS‚3O0%
26N
"usu
cR! %
‚1$"g(!@¦hZ„8j
0writebackƒ‚#filƒ i+Œ  ’C‘J—ÌA
^+gt r8<.!8_
(=$Hˆ
$Y‡      Ž
’@ÌD
Š‡v†   …Yˆ
K
g7Š.@
–hÊl O"R‚"H2‚| ŽXt6
%0ƒ3H
BŒ=‘4C„&†~Ž÷     F‚
$7F

Æ?Aê.‚°Sh‚×
†n§Ct4CÝ
ten
‡
#˜:Žƒ)ƒ4E…YŒ<¢*&n>
B„@ƒ2t"
M E
&**† h…Dƒ`

:
\
„'…2‚5„…@‡‘o
I(‚EXI`‚0‚f

.
t‚I=)¨j]‰@¾yˆ#³t…‚]¥,Ÿ ‹º{„f‡P„0/…$Ëx
†:LŠl‘„"b„_hƒ2‘Nœs
VT‘
{Š*‘e…-A”j‰]
‚6©:ƒ>†2H5‚:
„*Y“-H{r….„-r‚ƒ.Š^\
‚CcF8
@
J`m…<</‰4….…&     †*ƒVc‚h<‚"#‚7‡Hƒ6!Œ*Hmm‚UrL  ‚•Y…"¸@.‰p„r2ƒ
ˆ@'ƒM!(u#60‡Dƒemb‚&„7“8‚9!R
‹>ˆ]„3¢t)†
&¹/:‹:ƒ=Ísƒ
†\‡…wZ•
(W‡ ƒa‚9‰x…4ŠOƒ*·Z•ind
ƒ
‚%‚Qk
ƒf‚^Xõ[†>Š.ƒ,
$ƒh‰Yl†Žt„xo…m9
f
¢r „5…Ì(p)‚%Œ
m%5‚K7"’Q;
‹R
„4‚]Ž÷
„:=¾„cˆ+‚Gn‡‚Y—A^Ÿ ‹º{ND
N/R
†

>‚d‡Jõ‡`
&‚|…kHT

pW      N/
0A¾?Q®t
H5”58
ƒ    ®gk…<</qT& Q@(h8‚"#
4!üAr‡—7‡eiŸ$ƒM     ‚9R‡c
ƒ>LiŸ)—„!‡r
‚:L‡Pnf‡G‡]§>v<‡X&!„xr_
}n‚{žY
 f‡<X‡f®vJŠ.ƒ,‡b"v‡ƒu#‡e>)r
'9—*‡t
PB
‚E5s!-%)'0žs!#;

>ongƒQ‚-‡i-3¥(„~q      …o[…OšOk  ‡
ž¨3u®Š§–P
ƒ5YƒKÄR·k   G…o
… ü
ŽsŒ)Ÿ‚}Âí<4Ú7
'YŸ‚§ÞUÝ&‡kVÎWZL_number_arg‚£D7ýŒjD7te‚]…"‹‚áìƒ-«‚‚À‰„£‚Osd‚Ö:ùc‘O:wƒ
“—Ì<
…>w’‡n‡(‚;ƒ-B…'„
‘b/—
>ƒ   ŠJ
ƒ1h\i
B!-;k
ž4Ÿ¯kƒBˆE=x?MTQ‚yƒ˜RH      `^2
‚h-½"Y¶[)®n
ƒ-Î/‡‹#§
‚þj0!-;Ö=/w&??;ÝUw³N\
22‚L
H!ˆI6…":
‚o-”ž6!Ö6~ 3‚L
N!ˆM9TƒO:
‚v-”ž<!Ö=FF'xyz‚ƒ3Ú"yrick‚!‰r„{xƒ*1        hj8 6(
       
    ,   ?*#\     #           #      #

bZc



U$
k

-<
        

#
$_        „/‡(…e*4@>
68
†Lˆ'     ‚h            „†M
1#‚%A%1‚}   *‰L!           #‚z;v4ˆf„yF<X

‚k

‰SH
       

         &/         
,X5

   "ip     
%            p>     8
Pv/"k  



„i1#83&?
26 ‚
#' ƒ!.‚‚%I‚'<J
,,ŸL˜€€€„*¿ŸB+!     +:8   2(
C $M":
D


>
ˆA$

V!  (Šh$
‚†d/†N‘
hq
.~ƒ)ƒ?   ‰_
7





8: ‹%†[–~&Ú\ "Œ09u uˆ
(
ñ0
†^¹LrCGL„     …ƒˆ(
Žq†Cƒ$6r1 $‹ex7™t‡TU
F9
ƒ$i†a
[%$

 
6%"…S,+[TPƒf
k³K3ƒz4“lŸI#   ,Ua0‡x%0T
                     ,‚i
!¡?L
®JŠ8    ›?‚Ao‚A‚'"‹‰*‡Z†     
‡’fµ_‡TtL,%*$ti‡q
A      L3%…`>‚BG- ˆL‚K
˜       ,(7 Á    „Š“u†4ƒV
2†R       
!Z$   
‡af—`,    
2
      )


W

% 

(‚o5,ƒ‚%‘D
        ‘B43ƒK„'j‰ˆ)6‡   
‹
&9w6        

!C&„d‰^…e
\.–<*ŽB‰?#"

t     {+
‡Oh”}ˆ=…1bŒ$
 †Z   1…D‚,[Ž9‚
2+‰j#Ž"Š
?’&Hž  `4%3$'²†
WpcE
ƒ~u
Žþcd$
‚'/¶Yo
.
>Fx   
,67





‡]        u

3&N ‡-‚N9u u
(—:
Üb—‡srCGL„       [ƒ
w
AV$6r1 $ˆx7
‡GT
9
}i
*
[$%$

 

"‡V,+[TPÎ/kŸ‰"3ƒz4‡P^m#       ,5‡R
a§8%W(
                     ,Ÿ
!§&  ¾;
!"í3  ®8g¶(‡Ki
L3¾1#=F‚=G- l
„J ,(7 —)l
xf§8      
8
      )


4]

% 

(‚g5,‡g\
_Ÿ „
        ˆ443b,‡…#6Y
9
&9E6    


!C&
).
\‡Zt/    *

…24#¶7


ƒT {+—1
xhU0*¶A‚3
 ¶Yv    1r
*‡‚‚ 9$
2+p        
@#—ƒ;‡g<
?‚lY0ƒH       `4%3$'„;W#cE—,0x0‚K
–c”—¾>#0123yƒ ˜Ø14‚n
ˆV    I†!kf–d#…       !
Å0
Œ46
‚!    „º(3,oW—@?¾>$‚÷l
23yƒ$˜Ø"
_idx_000123a7ƒÅJd—ÌWdabƒ
Å`(—ÌW
(25‚ƒŒ66007‚‡Z‘þ[1d2…|5ƒ%Œ<,5ƒ%265ƒ      
º/—û<
‚|714ƒ      -%        —û8 ’k        3ƒŒ764ƒŒ865ƒŒ96b‚ ¢l
N       ýŒ7
N  d‚ ¢m
M        

ýŒ8
M    

64lU
Z‡r£Œ(Š_Œ3–OX5…õgi86k¬v>—¦R]¦IŒ1“‘ˆf„ƒ8gò_64‚<½V“•S…–þ#!åK:§f_init_m‚,‚NF˜Šo`FaccessR

4s
†+Dg‹      ‡KJ
     #xi–*+Pbegin‚
‹*fŒ*¾= &6\/‚JÜö\†œ… &*''%stindexy
v2Q‚‚ 
7D
'    w
ŒrfŠ"RŒ-…o
<ƒG"\*/‚)yX#&+|#(„/2#Dbb„N
ŒhŒ
Üø$†œlƒ  RP.
<ƒG"\*/‚r)yX#+|#(
/#Dbb
,
}»*†
methodLfc‚UV      ”å9‚    aches„llbackC
¤@Checkreservedlock‚˜Q…‰s
—•»‚ú‘%loseEJ/‚2‚pgŽo‰9]%<Œ-[]2—3•ù„lI2»‘?ode‚‚=lumnG
D,9ƒRH
Œ
f&ΡM"(
†$%Ü÷?†œ…"(
…Xcount~á0‚¾`
‚s~(«5F6{¨HŠW=ªS¾I'5F6{…‚Z
^=   
%text~áu‚:¾`
T‚:   otals~á8¾`
mmit‚hŒ2¾\"8ƒ•ù…
'"0(parY
Z:(m
’=’ ",))9>6*
P‚CZ`@<
""ŸV˜€€€„+¿0k
0xconflict‚%"½[/†*‚V…'/
pu”Ý?unect+V^43d#B

-H…e„j`„Sƒ‚…%/'@*X‰n‰LŒJ•ù\
ƒP`1ƒ‚ /'@*X‚+      kreat)V\41h#A‚7z…
-Ñ)i.
Œ8öbV…\C5„S„0ƒJXU…E
 @-f‰‘Sˆk½s)i.ž÷jŸ„>…ý45ƒOSƒJXU
 @-f‚mefunct~ÐJŽ-#"¾‚?
]#token~Ð(PX n¾\
‚PE n urrenttim„w)‡jDOg‹B‹9eint64E‡lU$delet~"Ñ0oQ†Fp0?.‹†x3¾/0ov†Fp0?us‚S›j,Z:$s”Õtp,Z:$TstroiYƒ(
ˆBÐ3$‚3‹5
ŒKfu¬3&‚ N½L
‚($
\3y5ž÷}†œl
ƒou
<3‚¨`
5Nuctor‚˜”ÕvicecharacteristƒW+†m¬g˜^‡ †6‚&²iJ3‰ ,
‰H)ø‚>‚ßC„T‚&$JPâ!gƒ©-—Ì      isconnect‚h‹w«KG)2•ù„^
G
2lclose‚,‹2ˆgŽZŠ#„—´ˆfÕ#error‚,‹$ˆrLŽ;˜Šuopen‚,‹ˆw2Ž:˜Šu
sym‚,‹+ˆlkŽ<˜Šu
entrypoint#
ofs8uŒ®u)v•ù„~)~6fetchf„kg}zVS„"$
˜,—µ’8
ilecontrol)‚&;@ \M
[     p\˜T…*B?namƒ#s‚,˜Dƒters68
.&‚F
8
Wƒ#$·M(…5K†"F^UPCF“8…   „^ƒ/%‚r

ˆg8$o%‹aÜrø9†œ„4…  „H#%‚r

(8$o‚nal+WK:l„F%#7
oŠ‚'      Kn£}Vnƒ'"-FT+“©X‚'     »CeVnƒ'dfunctb^m(,Œ:šT#ƒ$œ+1YJ)(•ù…!   ‚"#ƒ$+1YJ)(tokenÐ:¾‚/ree#om‘
y
ullpathnamXdm‚D„og‹ƒP„nc„C"7‡M   As1-/.“©W
tionÐS¾‚Hgeom‚S"˜'lk   ‚ p”Õs
l       ‚ ^tauxdata~â†q¾`y†q  lasterror‚_ systemcal‰tempnam‚,‹ˆ
?html‚Ilƒ:i‚UD(”å9n(nitj‚1$
P|8&put‚%(½<=Z/:(< a‚¾Jb‚¾Tst~¯X-±f„…#‚O¾J
H-F„…#‚Ocount~"¯W-±Nƒ?„r‚Q¾JG-Aƒ?„r‚Qvers
…k
—YŒw¤Yƒ"+Ý
‚LYƒÌv»CAƒ"+kcd‚Œ—†l‚IV        anguageid‚
ãý
mock)'ei˜Iƒ$=‰|•X•»‚õ mallocj
 5l‚9‚
…Y(R(mc


Z‚ƒ~ ƒ>X5'‚"†c‚ ‘7 utexalloc>Eend>-5       tGfreFheldJinit>f9x
7leavInotheldLtriHn6‚estsystemcal‰xts7ƒd<Œ¯"=*^•ù„{*,^ojo‚.ƒqƒ.pen)0'
7    
%‚$!
@ƒ" ‚:#!y}g Švƒ-=0!vI.1i!„ƒ
!‹-JI
J•£[
^!—Qa
!¾„fJI

utput‚%¾^/ƒ8*    pagecount„Y
hrasecount~áZƒ$¾`
9ƒfirst~ ¯Y-²ˆPT2H¾J
I-~ˆPT2H
column~°V±9‰IRHJ*¾J‚F‰IRHJnext~¯[-²#ˆYL+L¾J
K-ˆYL+Lcolumn~°X±P‰DYGr¾J
‚H‰DYGs~á]ƒ.¾`
<ƒ.rocƒ‹s9!gress‚   ‹Df„       queryfunc‚S"˜y„V$=0X‚
”Õs
y$=0X‚
phras~â…¾`e…r‚r
‡Nh–Çd
whandomp)A
‡hg‹6‰x
ead„L‚˜)„   wƒ8—z—µ’llocj!kei‡bleas‚hŒiÁ1•ù…Pnam‚ŽlfŒJÀ32]
Üf
ú†œ…12]Ýd
Oollback‚hŒ6¾Z"8Z‚a•ù…
)"2*
to‚hŒnÁ.D2•ù…U
D2undupjE%=wcount~á3‰¾`
‰ids;ár„|jŒ°J‚'1½v
Q„|†»…$1       savepoint‚hŒdÁ20(•ù…K20(ectorsƒ7‚˜[†,`ƒZWtauxdata~â†FT¾`q†FT     systemcalˆhadownam‚hÂBS`N<•ù…oQ`N<mbarrierž)Žø!\lock)._"&";!z368+3:bN#19 

*3EAH     ;;11/+9 6&C=$>- ,
!!ŸW˜€€€„,¿2›
gž(zi)‡YŽ÷'[‡¹)!0xshmlockfil‚Ž–°5;mapž'—MŽ÷Zˆ½‘Yunmapž+Žø!^rinkˆoutdownj‚ER|a(izeF        OleepDn
‡i4Q
Š3‹=Šx$ùG
ƒGtep+Nl„D%$k
—C+;‰‚D' Fq$£R,.M0>‚
(0,"-@MÜc
‚u+ƒÌu‚D»C":,.M0>‚
(0,ync)rlV‚k?
‹E*˜?‚D#!<Œ.¿#7Í5ë
Üöw†œ…#)Ý|q£|
to‘&ken~PÑ#*
6"w</!>
ƒ#'                            …T…(¾],*
6"w</!>
ƒ'                                …(runcatf
ˆF˜:‚ unfetch‚<U˜.—µ’:lock))F^˜Mƒ"=‰}•Z•»‚õ pinfƒoƒRpdatC<+[G0?! …
(
ƒ).!Hpf6Œ$Ž3¤P‚=n'/t"#       
ÜrúAp†œ…3,‚=n'/t"#  
       ecallback‚Ãgݯserdata~á-…I¾`…Ivalu
…˜JŒu¤)‚D>&8"݃|ƒÌv»C‚D>&8"wb‚.
zƒ.rite„J+~@i˜13'
†9
ƒB—|—µx‚œZ‘‰>x`ƒw×
!
„&)ˆH;
‰ü V
!

ƒi)‡‘S_strm‚¿sxx‚Œ!‘¸xƒ‚E—µ
6yyyyyyiƒ‚W—µHyz_
v‡\$3-
’h&Ñ–_
   Œx
ƒ’d

D¦/
à     JÁNŽA
$3-
®v‚J       (¾>„K   7
   ‡Z]
‚Òl
åD‚™1[œ&
D— HÃHI_nod‚¦7”Õxcpar‚¦8”Õxdrowid‚¦:”Õxfzi‚8
‰             “ƒ
t    zf‡~¾5iyP9                      /    
$h(

      ‚'X
4s'bZn!
ƒ1"S
”M  
"
{†‚_–>
   Q
ƒ7}F?[
ƒ( !!y
      ]ue

„n+!:
Œ+,s
.},†h‰`

#“[klB@¹Mƒ
H/N/ˆcƒ—!†Cƒ.1B—d
A   @I
,1- ‚j

#Ð^Šl    
‚;3‰+‡"vˆW
A      L3'…e‚F$X£i.
Å&ƒV    „n†T
#‚‘E‘G3/P‚6†aˆD‡b
‹ Sjr&2&„cFd
¦!©I*Y[ƒM’t4˜Š~qv
Žþc
‚'¶\q
.?,{‚


#ˆOl¶b‡uƒ
H/N/\ƒBW.1B‡Z,
6       ŒAI
,1Æ'

#§Z        ‡3‚‘6ML3¾1%DF‚A$X

„K.—*nDÝ[„ˆ:3/—…@[
: SH&2&

0d‡_
7”-ƒj¾…
4`Ÿ%Ÿ0‚K
–e”—¾>%1‚–f”—4E¾>&acc‚( 
U
‚HE’…F 
hoo‚&ük%xi–=Qcol‚¼#üƒ[e$•9l‚L
Š’‹
™i"‚    
'      
,

ŠZŠ‚c,ì7kƒä+d‡p
'"‚þ[‚c,ar%¥a(‚6(„…O]]ˆƒ3%2ƒKˆ$—,•wwƒ
l
o]†›Mƒ*(„4B„9‚@†
‚G%,-ƒŠKŽB“U‚O‚ Š‡        &•K±"„:
Á
‰       …Y„> žcˆk
ƒH
[2–Ö83%2Œ‹9[<H%       L‡N
C]§Î'üB—;BÚ]=
.‡Z,    &Õ{Ÿ‚—)Î;5®H8Æ%F΂sno‚‘x„_Jy‚‘z„_Lt„#†T'
‘ƒb"Ž…jƒ\ƒd…'ŠmS6„‚KŽI‚AžfŠ8…‰wŒ5‚     Œw±z ƒGˆH‚ˆ&ìO”ŠƒR½]b³&O—8
õ‚&Î~ŒQxqFaœ.
7»/‚](
‚ ®ÝZZ†—eMžIbield„'ˆ„™{Rƒ.Œ›U‰£m
ƒU‘ÎX B„–zµm‚Q)µgŽþƒ,…<¶U¦U˜9
ƒU‘ÎX«fƒ†=Eâ0å‚Qõ$‚        ke‚¤=‚lz“©Mogaƒ‹
—ão#u!J‚„
j‚~
o
&”s‚02"
-{wb;
M?Fpˆ# 
*ƒ%‚>7!
""ŸV˜€€€„-¿0Ã[\!(!2Žz…h‡1†!‚[)j$ #cAhs’…qz…e'{…1%
‹ 
j&Œ-
‚_
ˆ)jIQ2†aS/…B]O     ]_;6
7‚:*0ƒ_…'¢c„6~ƒlƒ#„               _‚YH.MGN‚C%ƒ;@ŠE/†Jeu…[n…Z+&,1)!
C       ?             ]/$K7A&f(ž"¦|’2œR‚G2…`r,*uj
OS5{[tz‚lFƒDn8~'[,P     )
!3‚E@2=zv
„o*#P"D6bxn
~G‚&„….a„7Ž[     ƒ"*ƒ|
& {*+K…‚0([
&u‚<z@‚2")DE@,#…]Š&

`
ƒ.o„4‹†%+ˆ!    ƒ‚C…   
Š1cy„$‚‚*„n„‰}….&‚!…m»Oƒv‚„^
J    –‚G‚
3

]9"UEf†$      ]…
ƒ…f j‚CR‚L’GŒj†N&†}¤O‚SQ$q‚IW"ƒ[‚‚3ƒ‚ZŒ      ƒ*…;’P„G#.‡9#‰d“.#C
$#6†i†1ˆ9ˆ[:‘N‚Mšt
Ž~s†‚~
      
0i %,

†Q@„3†^•
‡wS²>‚>
B ˆg‚}x(‡n,ƒa2i†Xg„‡vO<          ‚iCƒƒƒ<P
‚$7RbxˆŽlJ°w‚\±ƒg-F‚y¤&¤)     4<A[ &]                6brˆ?L&U‚p1|Tƒ=
 ‚c        ƒ+‚9ƒ‚j<&,m`#ƒWˆKƒrA/;‚   2ƒr+‚1ncŽƒv>U)K       7S95…R&b'‹‰Y‚v 94‚    
XX‚%6‚%#l|"      eL=n:A:1
Žöh‡h #c
hs2§
w&‡eŸh
S5 ]O       _
7‡Z3:*0
‡a‚M‡‚‡T,ÎL
ZC%U2/—+&,$1)!
C      &         /$7
PA&
#(‡’/W’2];
‚D2
ƒ'R@Ÿp2

*5{D=7Ÿ
ns1¾=9&—7J§ 
‡ƒ—74
[
ƒ
ƒpŸ]b„‡5'(‡[?…m&ƒ*v
ā|
3

29"UE¶X

*G
} ¶VS     ‚9¶Y
‚Q#‚b #C
$#6‡…/‚+Lu„;‡ƒ#†.B‡BsLNL %,
P
‡q‚„3‡
Ÿ!
KS*.ž‡M‡h}              c+@
P‡\
‚7®qe

[gM&]            b[!?L&U‚p17T
          <+‚"uJ<&
mE#
ƒ
*/—0+‚1nc‡ktŸSK 7S
`5$R&NV
c    
—4‚  
2X0young‚…“šQestŽr 
6‚-
© ~„8$‚0H
†0 T)‚
‰
‰+b
‚Y…*Œ#
†k‡:…WL*5  ,&,>0V&4ƒjÄw`
‚
…8‡
ƒ"…ˆAEq     ?0=aƒ'
       ‚5^7[‘zƒq77‚*
‚‚Lk…e
HJ\F„A‰
ƒf„MF%†‘;Ãsƒ"6˜.
E
„$*.i†0„deXŠyÒŒ"n-–2,…D
       P&v31EL‘
ŽC4iƒ#„]œ

‚,++—1ƒ…†~-ŽNý\‰
K
l2¬#†ž7‚6…AGŒ#6efv`f$\H)0\„T#,„†O„k
m!Žþ[
"0Hí8<5#b‡Z
y‡dÝb[—7*53    ,&,>
x0.&!‡e2`Ÿ
Ÿl
E„e¾A

HŸƒ4®…  ‡ƒˆ  
ƒ8:Æ*.i¶X
e¶[
Xn-Æ%\
       P&
v31E—1„E
P4iŸwí-
fD'-®ƒ‡t
O
i2
—x
ƒUGfO§c[v`J$H)0\T#,§codƒ"ƒPb"#@'5˜Šo
‚bb#@'/e_initƒ‡,˜ŠFself‚
ŒQ‚ƒL7”[¯g
„ki”ž^,ƒ-‡ƒ;—+yi‚
Ûj)ü
ƒk)
stackdepth‚¡O¡;ù•\˜_trackmaxstackdepth‚-Âdù˜;yi
ˆ<
!‚c       ƒe„‚&¶,„é     ymmddhhmmƒyyiƒ‚d—µUz>G'      ‚‚ƒˆ„        
”N        
…T™L*
Žfƒ%*>
     ”‡X6T#)8
""ŸV˜€€€„.¿0´tH%
A$t
.}.†v
‰`6#”F&_™<
ˆ
¨OAcI      ‚k
„p.
Å(ƒ
…9
‘Y&‚7!¡.‚jzw…'™X1h        ……Uµ?r
.@.‚
‚6#ˆQ&_ÅB‡[
‚Mý
y‡O
cIƮs
~‚ö+¾jŸ 
„%—6!
;Aw
     Òh
    -¶70z0‚–g”Õr'1‚–h”Õr(adok‚Ÿ|lewski‚Ž{†4‘‰3Lcatƒ¯1—ÌIYmd‚=z“ª
9olumn?5 reatet‚’c•ù‚_db?
y„"s0W=¬VOname…@
S1ealou‚œŸa‘ˆG}‡’Prou‰|V’'
^ƒoŒF’<…10†x‰fƒ„     „"„Eƒ1‚RCzU40
%MR
„
&q
cCcƒ(
>QA
YƒIW+HmF_P?M+Z(t&ƒ*‚V4!J
`
';       B{&I$L    =+C:5/*ƒ3
^[.u1|x-L%=
„&!|  ‡  „PT†v {sv‚GOv=†!…W

      „-9‚     _"gb@=:…x)&
‡[!   :ƒPks¡&„t›tP«DŒw‚S‚Ž-pYy„>3‡1%†'7„;„†h0‡M”lp`…D_ƒei,ƒ‚:

„)}<3‚k‚"0aƒdNv#ƒˆ>„j‹WgW„   ‚1„wl‚‚VU†)J-?…D…lƒfO9‰wU†K‡nŽ        ‰™y†-@‚rk"ƒk&„f‚^…uƒ8ƒˆX
ƒ/
f®8‹Y„‹Q–T&Wˆ
Š^š%NŒr‡ˆL‚#‚J)0
J
)
C1Œ(w‚
‰1”-…e‚]
ƒ0‹‡J‡        ‡`L"@
Šg{ƒBxˆ&–8‹‚%…Xs<še
6„V‚@Œd7
ˆ=†|g‡„}r†@\ƒƒCxƒi
špŽO—4„S»sˆ|W‚
†A
„@X„ƒ,
%2‰?‰A{‹I‹@"w?‰`Š*‰M‚ E…l„ƒ‡g+D‚5…?”S‘J9,„I‡dŒ:k„;‚k„„^‚Gbƒs„       *„*ƒ*‚{Œd‚2„-‡&,‡O
ˆ*
d‚Xo’B†V2T…i*l‘Ktµ6 ‚AŽ3‚A,d†/†@,ƒj:‚I‚#R+NŠ)‚aA_ˆ|‚…^’„os5[
3rAˆ‚Hšu
‚5ƒwƒBŽþƒg‡eo®t‡oSKFS‚‚&7pYy„-Zf†7J‡/3—:,‡ip`…D_ƒei,ƒ‚:

„)}<3‚k‚"0aƒdNv#ƒˆ>„j‹WgW„        ‚1„wl‚‚VU†)Ÿc#ƒfO9‚tUƒ1‚8'Z…NN-@HkŠ6‡&&4ͬm§ƒ.ƒoƒF—4z‡TzŸ&s„aWP
JŸ‚@P1®t{Ÿ{‚‡f‡t‚#
60%7

=/g¾
¾v‡‚L¾:
‚2XŸ`z,®A%‚&‚z…m
‚TI
<
‚=¶8f„l‚ƒ
f+¦‚5009,m
{kL6HC6‚!¦B
‚
^§ŒNNr2T
*l‡fƒttƒŸ
,dJ]s":BR+N‰-)‚aA_9_‚ƒx     Q5[
rALŸ#‡QY‚\§   _malloc‚×yq
—
Tø“4†òTblob,—ƒ}G†ornul‚
‘ÝüCrmsgR
DZ‹)‰Hƒ8A$ ˆL:
 Š4¡(ŽV•ù^3:
 „      J(
„Zfile_namE‚7?D:ƒ$$#
9‚‚
j#‹"ƒ8ormat5‚›rom‚%°Sdb‚%
¯?
unctionnam‚ƒ 
:“ªBgeom‚S
˜%C”Õs
Cip‚†
ÓY!2ƒ0\=2.PˆN)…&0M)+j’4X%8Le'       ,(61‚
P#;$
ƒ†t,ƒC0~f
%@'
!9+
4
A
+!ƒ*[
(%%Ž:  V'*š&A '!%%    2     c
{
†óz‡v
\‚W\=.>‚¡
j¶_‚.ò@
!9+

4      A
+!ƒ*       
(%¾BÆ$
V     '!%
%  2      
X
‚ôr
…64‚r&–Ç_$cod‚Sˆg     )+
;†m”Õ2d)+
;dfil‚”P;‡UKT<
;C2E M*tT„":L3.", .-@ 65y‚q
%"’e'P5!„+
 
ݹŸ†mR=#
ø
Ýš€€€ƒs.ƒt"]4>½iƒÜ%ƒ-Z$š€€€ƒTNƒUnl
½Y¾)‚K‚×nœåv£mš€€€‚A,‚BX@LŽ_ú„ðyš€€€‚*"‚+‚qš€€€y.zGHH1ü
…€5‚€€e*f‚W½q„›„“
š€€€€6*7 lQ½o„›„“        š€€€€,,XE7ûu„é‚çXˆ?˜€€€„/‘      ƒ†‘˜‰;åV„Ét
;CE 
*!T„wL$
.",.„r 65
G    ô…
0zipfile_init‚ –Ç`Ksqlite3ƒ
¾Z    —Ì3   vfŽT7
‚(         „03#p”¦}
Kplib‚Áf= &†[,Ô
‰øl—== ƒû=‚Ø
X¾Qmsg‚
    ‘¨3   name‚!9Ð-
ŽwþV  &Šg
‚?”'
’8"ŠYMº:-+S½c‚"Ÿú)Ÿ7ƒ  …ý5ƒ@M
ew‚hŒOÀ6•ù…6ombiS|ne‚‰ù‚)512‚[utˆ
g‹
!Š%procJ‚„˜Šƒ       queryfunc‚S
˜P”Õs
     Psqlt)Jþ`
4
:ƒzŽXA#jüƒ

4
„á‚UAtatežu Æ#„N       ring‚w©MYymbol‚‹0tab‚%Ÿ3˜†K†"F/”,”ÝW‚@l?#
rgetžL
Æ#ƒiL
bl‚%¯ugehen‚ˆYlu
…] ‚;m‚ˆ^r‚4
‡ich‚”?‘‰6^valufsnamepV‰!zz‚r
‹h-–Çk-ßvŠ`Žÿ~\
ƒU¦Š\Žÿ~X¾Š^Žÿ~Z%3MzF*



)ùïãØ̶« •Š€sg\PF;0&ûðåØÎÀµ¡”‰~peZN@5'
ú
ï
ã
Ô
Ä
¸
«

‘
ƒ
w
k
_
P
E
:
.
"

ùìÝÏ¾³¦™Œ€rg[M@3%øçÒŶ¨˜‰xhXI:(
ø
ç
Ö
È
»
ª

’
ƒ
u
d
Y
K
:
+

       ý       î       á       Ï              µ       §       —       ˆ       x       l       Z       M       ?       (                     ûîàÑô©œƒui\N?1#ÿóáÖǼ°¤–ˆznbVK@3'ûïâÓƶ¦–‰zk[N@-!
üñå×Ƹ«p`RD6)öæÙ̾°¡‘„seXL>&üîâÔÈ»-¡•…xk]PE8)0offŽ0occurrƒ0obse€
0o1~0nume|
0null_z0nowhx0not_v0normalip0nomn0no_l
0next_j0new_h0netf
0needld0nbyb
0namecU
0n1R
0mustbP0multipliN,0moz_items_annosL
0mostlJ0mosH0moduF
0modelD0minimum_B0migr@0methodo>0memory<
0medic:
0meani80math60mapl40malloc62
0maked00mail.0mag,0ltc*0loop(
0logik&
0locat$
0listl"0linearl 0limit_0license
0lesse
0leftm0lazi
0last_0language
0knowl0ken
0jw
0json1

0je0ita0is_"0ioerr_shmsó
0involð0intrî0interfcê0interbè0integeæ0int2ä0installâ0insertaà0informiÞ0induÜ0index_Ú0incoÖ0in5Ô
0inË"0implementoÈ
0immerÆ0ifdÄ0idx1¾
0i1¼
0hrº0hou¸0hip¶0her´
0headq²
0have_°
0hard_®0hal¬0habª
0gu¨0graphi¦
0gl¤ 0geopoly_w¢0gco  0functionež 0function_œ
0full_š
0fts4a˜0fruits–
0fromc”0frea0fouŽ
0formaŒ0foraŠ0foo‚0folk€
0fk~0first_|
0findfz0file_ox
0file1v0feedr0fastertp
0failon0extractel0extensij
0exploh0exitf0excud0excb0exag`
0every^
0evenl\0error_Z
0erX
0entryV0enlT0end_R0enable_nP0embeddN
0elL
0econoJ0eagH
0e6F*0dsqlite_omit_sD
0downsB0does@ 0document_>0do_<0disting:0discov80directo6
0diffi40devi20dete0 0descripto.0depi,0delete*0defini(0default_&
0decep$0db_rel"0database 
0data0
0d10current_
0criti0create
0cr0coun0correcto0coor

0contr0content_0containe$0constraint_0consta0consþ 0configuraü0concesú0compliø0compileö0compariô0commentaò0commanð0column1î
0codecê0clearlæ0clanä&0checkpoint_tâ0characteà0changeÞ0certainlÜ0cautÚ
0case_Ø0canoÖ0cancÔ
0callaÐ0cabÎ
0c0Ì
0byteaÊ0bypÈ0buttÂ0busyÀ0bugg¾
0bp¼0booleaneº
0blob_¸0binary¶0betw´0behaviou²0beg°0bef®0bea¬0bag¤
0b0¢
0aw 0automož0audœ0attš0ata˜
0assor–0asc”
0arranŽ0argvŒ0arbŠ0applica‚0applia€0api_~
0anq|
0annz0andex
0anam
0amef
0altertd
0altb
0allow_`0alld^
0aliZ
0ageX
0afterwV
0adeT
0adaR0activP&0access_readwN
0absL
0abort_J        0a0H096086;
08698
07806
06874      0602
05200
04ki.      040,
0390*
0322(      030&02684"
0220 02021020000     020
01ki
0168
0141
012001000  01000x08

00500000    000
¹kóæÕɽ¯£“…wg[L?0#
ÿñåÕĸ©œ‚seVF9(
ù
è
Ú
Í
À
²
¢
•
ˆ
z
k
\
L
<
-


÷çÖÆ·«Ÿ’‡zl_L<,ôä×̽¯£—ˆzk_RD5&
ü
ì
Ù
Å
±
”
‚
l
V
<
$
       ø       à       Ä       µ       §       ™       ˆ       z       l       \       P       B       5       (              
ÿñåÖÁ²¤—Š|paRB4%
÷éÜν±¤˜ŒqdVG8+öå×̽²¥“†{k0zipfile^
0z0\0younZ 0xshmlockfX0xconV
0x0T0writebR
0wrP
0workaN0withoutnL
0withoJ
0withdH0wincD0winB0widg@0whiche>0wherea:
0whene80welt4
0warni20wal100wag.0vol,0viru*0vfi(0version_&
0verba$0vani"
0valua 
0v1
0ut0usb0usa0update
0unusu0unlock_
0unionv0under_0ubu
0txn_w0twen0trulþ
0treetü0transfú&0total_changeø0tokencö0todô
0timelç0thumä0threatâ0thouà0thinÞ0thereiÖ0thereaÔ0theoÒ
0theirÎ0thecÌ0the©
0thank 
0text1ž"0testctrl_oœ0terminoš"0temp_store˜0tas–0tac”
0table’
0t0Œ
0synthŠ0supposeˆ0sup3†0suck„
0subsi‚0sty€0string1~
0stori|
0stmt_z0status_px
0stativ
0stat2t0stackor40sqlite_stmtstatus_rp,0sqlite_open_supn$0sqlite_notfl,0sqlite_ioerr_clj,0sqlite_enable_uh00sqlite_dbconfig_nf(0sqlite_busy_td(0sqlite3async_b 0sqlite3_t`60sqlite3_result_blob6^$0sqlite3_mat\$0sqlite3_desZ"0sqlite3_ckX0sqlite2V0sqlarfN0sql8L
0spectJ0specifH0sourceF
0somewD0solvB0soa@0smalle>
0sizeb<0single:0sin80sim6
0show_40short_2
0sh00set_.0serious,0sept*0selecti(
0seemi&0seed$0seconda"0schema_ "0savepoint_0samm
0safeg0runn
0rt0row_0row0rol0revert0returnt0result_s
0result_
0resor0rer
0repos
0remar0relatiþ0regardlü0recursiú0recompø0realloö
0read_ô0rawdò0ramdð0query_pî
0queryì0putiê0prowè
0prophæ0programmä0proceeâ0priorià0primarilÞ0preservaÜ0preiÚ0pragma_Ø0powerpÖ
0posixÔ0pointlÒ
0plattÐ0pieÎ0periÌ0peopleÊ0patÈ0partialiÆ0parent2Ä0panÂ
0page_À
0p4¾
0ow¼
0overaº0oute¸0other_¶0orga²0orderb°0ora®0optioni¨
0optio¦
0opera¤0open_su¢0opc 
0onlinž0oneœ0on0š0omit_get”0ok_s’0offe
‘‘œl      %¹7CREATE INDEX1. Syntax


 
 



 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 






 
 



 
 






 
 





The CREATE INDEX command consists of the keywords "CREATE INDEX" followed
by the name of the new index, the keyword "ON", the name of a previously
created table that is to be indexed, and a parenthesized list of table column
names and/or expressions that are used for the index key.
If the optional WHERE clause is included, then the index is a "partial index".


If the optional IF NOT EXISTS clause is present and another index
with the same name already exists, then this command becomes a no-op.

There are no arbitrary limits on the number of indices that can be
attached to a single table.  The number of columns in an index is 
limited to the value set by
sqlite3_limit(SQLITE_LIMIT_COLUMN,...).

Indexes are removed with the DROP INDEX command.



1.1. Unique Indexes

If the UNIQUE keyword appears between CREATE and INDEX then duplicate
index entries are not allowed.  Any attempt to insert a duplicate entry
will result in an error.

For the purposes of unique indices, all NULL values
are considered different from all other NULL values and are thus unique.
This is one of the two possible interpretations of the SQL-92 standard
(the language in the standard is ambiguous).  The interpretation used
by SQLite is the same and is the interpretation
followed by PostgreSQL, MySQL, Firebird, and Oracle.  Informix and
Microsoft SQL Server follow the other interpretation of the standard, which
is that all NULL values are equal to one another.



1.2. Indexes on Expressions

Expressions in an index may not reference other tables
and may not use subqueries nor functions whose result might
change (ex: random() or sqlite_version()).
Expressions in an index may only refer to columns in the table
that is being indexed.
Indexes on expression will not work with versions of SQLite prior
to version 3.9.0 (2015-10-14).
See the Indexes On Expressions document for additional information
about using general expressions in CREATE INDEX statements.



1.3. Descending Indexes

Each column name or expression can be followed by one
of the "ASC" or "DESC" keywords to indicate sort order.
The sort order may or may not be ignored depending
on the database file format, and in particular the schema format number.
The "legacy" schema format (1) ignores index
sort order.  The descending index schema format (4) takes index sort order
into account.  Only versions of SQLite 3.3.0 (2006-01-11)
and later are able to understand
the descending index format. For compatibility, version of SQLite between 3.3.0
and 3.7.9 use the legacy schema format by default.  The newer schema format is
used by default in version 3.7.10 (2012-01-16) and later.
The legacy_file_format pragma can be used to change set the specific
behavior for any version of SQLite.

1.4. NULLS FIRST and NULLS LAST

The NULLS FIRST and NULLS LAST predicates are not supported
for indexes.  For sorting purposes, SQLite considers NULL values 
to be smaller than all other values.  Hence NULL values always appear at
the beginning of an ASC index and at the end of a DESC index.



1.5. Collations

The COLLATE clause optionally following each column name
or expression defines a
collating sequence used for text entries in that column.
The default collating
sequence is the collating sequence defined for that column in the
CREATE TABLE statement.  Or if no collating sequence is otherwise defined,
the built-in BINARY collating sequence is used.
This page last modified on  2021-11-01 21:09:36 UTClang_createindex.html

u        K¡-Database Object Name ResolutionIn SQLite, a database object (a table, index, trigger or view) is identified
  by the name of the object and the name of the database that it resides in. 
  Database objects may reside in the main database, the temp database, or in
  an attached database.


  The syntax of the DROP TABLE, DROP INDEX, DROP VIEW, DROP TRIGGER,
  REINDEX, ALTER TABLE and many other commands all permit the user to
  specify a database object either by its name alone, or by a combination of
  its name and the name of its database. If no database is specified as part
  of the object reference, then SQLite searches the main, temp and all attached
  databases for an object with a matching name. The temp database is searched
  first, followed by the main database, followed all attached databases in the
  order that they were attached. The reference resolves to the first match
  found. For example:


      /* Add a table named 't1' to the temp, main and an attached database */
      ATTACH 'file.db' AS aux;
      CREATE TABLE t1(x, y);
      CREATE TEMP TABLE t1(x, y);
      CREATE TABLE aux.t1(x, y);

      DROP TABLE t1;         /* Drop table in temp database */
      DROP TABLE t1;         /* Drop table in main database */
      DROP TABLE t1;         /* Drop table in aux database */



  If a schema name is specified as part of an object reference, it must be
  either "main", or "temp" or the schema-name of an attached database.
  Like other SQL identifiers, schema names are case-insensitive.
  If a schema name is specified, then only that one schema is searched for
  the named object.


  Most object references may only resolve to a specific type of object (for
  example a reference that is part of a DROP TABLE statement may only resolve
  to a table object, not an index, trigger or view). However in some contexts 
  (e.g. REINDEX) an object reference may be resolve to more than one type
  of object. When searching database schemas for a named object, objects of
  types that cannot be used in the context of the reference are always 
  ignored.
This page last modified on  2020-02-10 20:33:26 UTClang_naming.htmlƒ=  %†37DROP TRIGGERThe DROP TRIGGER statement removes a trigger created by the 
CREATE TRIGGER statement. Once removed, the trigger definition is no
longer present in the sqlite_schema (or sqlite_temp_schema) table and is
not fired by any subsequent INSERT, UPDATE or DELETE statements.

Note that triggers are automatically dropped when the associated table is
dropped.
This page last modified on  2020-06-19 13:05:24 UTClang_droptrigger.html‹-     5–5CREATE VIRTUAL TABLEA virtual table is an interface to an external storage or computation
engine that appears to be a table but does not actually store information
in the database file.

In general, you can do anything with a virtual table that can be done
with an ordinary table, except that you cannot create indices or triggers on a
virtual table.  Some virtual table implementations might impose additional
restrictions.  For example, many virtual tables are read-only.

The module-name is the name of an object that implements
the virtual table.  The module-name must be registered with
the SQLite database connection using
sqlite3_create_module() or sqlite3_create_module_v2()
prior to issuing the CREATE VIRTUAL TABLE statement.
The module takes zero or more comma-separated arguments.
The arguments can be just about any text as long as it has balanced
parentheses.  The argument syntax is sufficiently general that the
arguments can be made to appear as column definitions in a traditional
CREATE TABLE statement.  
SQLite passes the module arguments directly
to the xCreate and xConnect methods of the module implementation
without any interpretation.  It is the responsibility
of the module implementation to parse and interpret its own arguments.

A virtual table is destroyed using the ordinary
DROP TABLE statement.  There is no
DROP VIRTUAL TABLE statement.
This page last modified on  2020-02-10 20:33:26 UTClang_createvtab.htmlA optimize will not run ANALYZE, but it will occasionally
do so either for tables that have never before been analyzed, or for tables
that have grown significantly since they were last analyzed.

Since the actions of PRAGMA optimize are determined to some extent by
prior queries that have been evaluated on the same database connection, it
is recommended that PRAGMA optimize be deferred until the database connection
is closing and has thus had an opportunity to accumulate as much usage information
as possible.  It is also reasonable to set a timer to run PRAGMA optimize
every few hours, or every few days, for database connections that stay open
for a long time.

Applications that desire more control can run PRAGMA optimize(0x03) to 
obtain a list of ANALYZE commands that SQLite thinks are appropriate to run,
but without actually running those commands.  If the returned set is 
non-empty, the application can then make a decision about whether or not
to run the suggested ANALYZE commands, perhaps after prompting the user
for guidance.

The PRAGMA optimize command was first introduced with 
SQLite 3.18.0 (2017-03-28) and is a no-op for all prior releases
of SQLite.



4. Approximate ANALYZE For Large Databases

By default, ANALYZE does a full scan of every index.  This can be slow for
large databases.  So beginning with SQLite version 3.32.0 (2020-05-22), the
PRAGMA analysis_limit command can be used to limit the amount of
scanning performed by ANALYZE, and thus help ANALYZE to run faster,
even on very large database files.  We call this running an
"approximate ANALYZE".

The recommended usage pattern for the analysis_limit pragma is
like this:

PRAGMA analysis_limit=1000;


This pragma tells the ANALYZE command to start a full scan
of the index as it normally would.  But when the number of rows visited
reaches 1000 (or whatever other limit is specified by the pragma), the
ANALYZE command will begin taking actions to stop the scan.  If
the left-most column of the index has changed at least once during the
previous 1000 steps, then the analysis stops immediately.  But if the
left-most column has always been the same, then ANALYZE skips ahead to
the first entry with a different left-most column and reads an additional
1000 rows before terminating.

The details of the effects of the analysis limit described in the previous
paragraph are subject to change in future versions of SQLite.  But the
core idea will remain the same.  An analysis limit of N will strive to
limit the number of rows visited in each index to approximately N.

Values of N between 100 and 1000 are recommended.
Or, to disable the analysis limit, causing ANALYZE to do a
complete scan of each index, set the analysis limit to 0.  The default
value for the analysis limit is 0 for backwards compatibility.

The values placed in the sqlite_stat1 table by an approximate ANALYZE
are not exactly the same as what would be computed by an unrestricted 
analysis.  But they are usually close enough.  The index statistics in
the sqlite_stat1 table are approximations in any case, so the fact that
the results of an approximate ANALYZE are slightly different from
a traditional full scan ANALYZE has little practical impact.  It is
possible to construct a pathological case where an approximate ANALYZE
is noticeably inferior to a full-scan ANALYZE, but such cases rare in
real-world problems.

A good rule of thumb seems to be to always set "PRAGMA analysis_limit=N"
for N between 100 and 1000 prior to running either "ANALYZE" or
"PRAGMA optimize".  The results are not quite as precise, but they
are precise enough, and the fact that the results are computed so much
faster means that developers are more likely to compute them.  An
approximate ANALYZE is better than not running ANALYZE at all.

4.1. Limitations of approximate ANALYZE

The content in the sqlite_stat4 table cannot be computed with
anything less than a full scan.  Hence, if a non-zero analysis limit
is specified, the sqlite_stat4 table is not computed.
This page last modified on  2020-06-18 21:18:56 UTClang_analyze.html
Ì̾)     ü/ANALYZE1. Overview



 
 




 The ANALYZE command gathers statistics about tables and
indices and stores the collected information
in internal tables of the database where the query optimizer can
access the information and use it to help make better query planning choices.
If no arguments are given, all attached databases are
analyzed.  If a schema name is given as the argument, then all tables
and indices in that one database are analyzed.  
If the argument is a table name, then only that table and the
indices associated with that table are analyzed.  If the argument
is an index name, then only that one index is analyzed.



1.1. Recommended usage pattern

Applications with long-lived databases that use complex
queries should consider running the following commands just prior
to closing each database connection:

PRAGMA analysis_limit=400;
PRAGMA optimize;


The optimize pragma is usually a no-op but it will occasionally
run ANALYZE if it seems like doing so will be useful to the query planner.
The analysis_limit pragma limits the scope of any ANALYZE command that
the optimize pragma runs so that it does not consume too many CPU cycles.
The constant "400" can be adjusted as needed.  Values between 100 and
1000 work well for most applications.

2. Details

 The default implementation stores all statistics in a single
table named "sqlite_stat1".  
 If SQLite is compiled with the
SQLITE_ENABLE_STAT4 option, then additional histogram data is
collected and stored in sqlite_stat4.
Older versions of SQLite would make use of the sqlite_stat2 table
or sqlite_stat3 table
when compiled with SQLITE_ENABLE_STAT2 or SQLITE_ENABLE_STAT3,
but all recent versions of
SQLite ignore the sqlite_stat2 and sqlite_stat3 tables.
Future enhancements may create
additional internal tables with the same name pattern except with
final digit larger than "4".
All of these tables are collectively referred to as "statistics tables".


 The content of the statistics tables can be queried using SELECT
and can be changed using the DELETE, INSERT, and UPDATE commands.
The DROP TABLE command works on statistics tables
as of SQLite version 3.7.9. (2011-11-01)
The ALTER TABLE command does not work on statistics tables.
Appropriate care should be used when changing the content of the statistics
tables as invalid content can cause SQLite to select inefficient
query plans.  Generally speaking, one should not modify the content of
the statistics tables by any mechanism other than invoking the
ANALYZE command.  
See "Manual Control Of Query Plans Using SQLITE_STAT Tables" for
further information.

 Statistics gathered by ANALYZE are not automatically updated as
the content of the database changes.  If the content of the database
changes significantly, or if the database schema changes, then one should
consider rerunning the ANALYZE command in order to update the statistics.

 The query planner loads the content of the statistics tables
into memory when the schema is read.  Hence, when an application
changes the statistics tables directly, SQLite will not immediately
notice the changes. An application
can force the query planner to reread the statistics tables by running
ANALYZE sqlite_schema. 



3. Automatically Running ANALYZE

The PRAGMA optimize command will automatically run ANALYZE on individual
tables on an as-needed basis.  The recommended practice is for applications
to invoke the PRAGMA optimize statement just before closing each database
connection.

Each SQLite database connection records cases when the query planner would
benefit from having accurate results of ANALYZE at hand.  These records
are held in memory and accumulate over the life of a database connection.
The PRAGMA optimize command looks at those records and runs ANALYZE on only
those tables for which new or updated ANALYZE data seems likely to be useful.
In most cases PRAGMC
›-›‡     1S/SQL Comment SyntaxComments are not SQL commands, but can occur within the text of
SQL queries passed to sqlite3_prepare_v2() and related interfaces.
Comments are treated as whitespace by the parser.
Comments can begin anywhere whitespace 
can be found, including inside expressions that span multiple lines.


SQL comments begin with two consecutive "-" characters (ASCII 0x2d)
and extend up to and including the next newline character (ASCII 0x0a)
or until the end of input, whichever comes first.

C-style comments begin
with "/*" and extend up to and including the next "*/" character pair
or until the end of input, whichever comes first.  C-style comments
can span multiple lines. 

Comments can appear anywhere whitespace can occur,
including inside expressions and in the middle of other SQL statements.
Comments do not nest.

This page last modified on  2020-02-10 17:23:44 UTClang_comment.html—P 7®K3The INDEXED BY Clause1. How INDEXED BY Works

The INDEXED BY phrase forces the SQLite query planner to use a
particular named index on a DELETE, SELECT, or UPDATE statement.
The INDEXED BY phrase is an SQLite extension and
is not portable to other SQL database engines.



 
 




The "INDEXED BY index-name" phrase specifies 
that the named index
must be used in order to look up values on the preceding table.
If index-name does not exist or cannot be used 
for the query, then the preparation of the SQL statement fails.
The "NOT INDEXED" clause specifies that no index shall be used when
accessing the preceding table, including implied indices create by
UNIQUE and PRIMARY KEY constraints.  However, the rowid
can still be used to look up entries even when "NOT INDEXED" is specified.

Some SQL database engines provide non-standard "hint" mechanisms which
can be used to give the query optimizer clues about what indices it should
use for a particular statement.  The INDEXED BY clause of SQLite is 
not a hinting mechanism and it should not be used as such.
The INDEXED BY clause does not give the optimizer hints about which index
to use; it gives the optimizer a requirement of which index to use.
If the query optimizer is unable to use the index specified by the
INDEXED BY clause, then the query will fail with an error.

The INDEXED BY clause is not intended for use in tuning
the performance of a query.  The intent of the INDEXED BY clause is
to raise a run-time error if a schema change, such as dropping or
creating an index, causes the query plan for a time-sensitive query
to change.  The INDEXED BY clause is designed to help detect
undesirable query plan changes during regression testing.
Application 
developers are admonished to omit all use of INDEXED BY during
application design, implementation, testing, and tuning.  If
INDEXED BY is to be used at all, it should be inserted at the very
end of the development process when "locking down" a design.

2. See Also


The query planner checklist describes steps that application
developers should following to help resolve query planner problems.
Notice the that the use of INDEXED BY is a last resort, to be used only
when all other measures fail.

The unary "+" operator
can be used to disqualify terms in the WHERE clause from use by indices.
Careful use of unary + can sometimes help prevent the query planner from
choosing a poor index without restricting it to using one specific index.
Careful placement of unary + operators is a better method for controlling 
which indices are used by a query.

The sqlite3_stmt_status() C/C++ interface together with the
SQLITE_STMTSTATUS_FULLSCAN_STEP and SQLITE_STMTSTATUS_SORT verbs
can be used to detect at run-time when an SQL statement is not
making effective use of indices.  Many applications may prefer to
use the sqlite3_stmt_status() interface to detect index misuse
rather than the INDEXED BY phrase described here.

This page last modified on  2021-02-06 15:33:07 UTClang_indexedby.html
¤¤žY            +¼k1SQLite KeywordsThe SQL standard specifies a large number of keywords which may not
be used as the names of tables, indices, columns, databases, user-defined
functions, collations, virtual table modules, or any other named object.
The list of keywords is so long that few people can remember them all.
For most SQL code, your safest bet is to never use any English language
word as the name of a user-defined object.

If you want to use a keyword as a name, you need to quote it.  There
are four ways of quoting keywords in SQLite:




        'keyword'
        A keyword in single quotes is a string literal.

        "keyword"
        A keyword in double-quotes is an identifier.

        &#91;keyword&#93;
        A keyword enclosed in square brackets is 
        an identifier.  This is not standard SQL.  This quoting mechanism
        is used by MS Access and SQL Server and is included in SQLite for
        compatibility.

        &#96;keyword&#96;
        A keyword enclosed in grave accents (ASCII code 96) is 
        an identifier.  This is not standard SQL.  This quoting mechanism
        is used by MySQL and is included in SQLite for
        compatibility.




For resilience when confronted with historical SQL statements, SQLite
will sometimes bend the quoting rules above:


If a keyword in single
quotes (ex: 'key' or 'glob') is used in a context where
an identifier is allowed but where a string literal is not allowed, then
the token is understood to be an identifier instead of a string literal.


If a keyword in double
quotes (ex: "key" or "glob") is used in a context where
it cannot be resolved to an identifier but where a string literal
is allowed, then the token is understood to be a string literal instead
of an identifier.


Programmers are cautioned not to use the two exceptions described in
the previous bullets.  We emphasize that they exist only so that old
and ill-formed SQL statements will run correctly.  Future versions of
SQLite might raise errors instead of accepting the malformed
statements covered by the exceptions above.


SQLite adds new keywords from time to time when it takes on new features.
So to prevent your code from being broken by future enhancements, you should
normally quote any identifier that is an English language word, even if
you do not have to.



The list below shows all possible keywords used by any build of
SQLite regardless of compile-time options.  
Most reasonable configurations use most or all of these keywords,
but some keywords may be omitted when SQL language features are
disabled.
Applications can use the
sqlite3_keyword_count(), sqlite3_keyword_name(), and
sqlite3_keyword_check() interfaces to determine the keywords
recognized by SQLite at run-time.
Regardless of the compile-time configuration, any identifier that is not on
the following 147-element

list is not a keyword to the SQL parser in SQLite:




ABORT
ACTION
ADD
AFTER
ALL
ALTER
ALWAYS
ANALYZE
AND
AS
ASC
ATTACH
AUTOINCREMENT
BEFORE
BEGIN
BETWEEN
BY
CASCADE
CASE
CAST
CHECK
COLLATE
COLUMN
COMMIT
CONFLICT
CONSTRAINT
CREATE
CROSS
CURRENT
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
DATABASE
DEFAULT
DEFERRABLE
DEFERRED
DELETE
DESC
DETACH
DISTINCT
DO
DROP
EACH
ELSE
END
ESCAPE
EXCEPT
EXCLUDE
EXCLUSIVE
EXISTS
EXPLAIN
FAIL
FILTER
FIRST
FOLLOWING
FOR
FOREIGN
FROM
FULL
GENERATED
GLOB
GROUP
GROUPS
HAVING
IF
IGNORE
IMMEDIATE
IN
INDEX
INDEXED
INITIALLY
INNER
INSERT
INSTEAD
INTERSECT
INTO
IS
ISNULL
JOIN
KEY
LAST
LEFT
LIKE
LIMIT
MATCH
MATERIALIZED
NATURAL
NO
NOT
NOTHING
NOTNULL
NULL
NULLS
OF
OFFSET
ON
OR
ORDER
OTHERS
OUTER
OVER
PARTITION
PLAN
PRAGMA
PRECEDING
PRIMARY
QUERY
RAISE
RANGE
RECURSIVE
REFERENCES
REGEXP
REINDEX
RELEASE
RENAME
REPLACE
RESTRICT
RETURNING
RIGHT
ROLLBACK
ROW
ROWS
SAVEPOINT
SELECT
SET
TABLE
TEMP
TEMPORARY
THEN
TIES
TO
TRANSACTION
TRIGGER
UNBOUNDED
UNION
UNIQUE
UPDATE
USING
VACUUM
VALUES
VIEW
VIRTUAL
WHEN
WHERE
WINDOW
WITH
WITHOUT


This page last modified on  2022-11-26 14:56:19 UTClang_keywords.htmlL Server and MySQL implementations
of the same idea work a little differently.

As an example of how UPDATE-FROM can be useful, 
suppose you have a point-of-sale application that accumulates
purchases in the SALES table.  At the end of the day, you want to adjust
the INVENTORY table according to the daily sales.  To do this, you can
run an UPDATE against the INVENTORY table that adjusts the quantity by
the aggregated sales for the day.  The statement would look like this:

UPDATE inventory
   SET quantity = quantity - daily.amt
  FROM (SELECT sum(quantity) AS amt, itemId FROM sales GROUP BY 2) AS daily
 WHERE inventory.itemId = daily.itemId;



The subquery in the FROM clause computes the amount by which the
inventory should be reduced for each itemId.  That subquery is joined
against the inventory table and the quantity of each affected inventory
row is reduced by the appropriate amount.


The target table is not included in the FROM clause, unless the intent
is to do a self-join against the target table.  In the event of a self-join,
the table in the FROM clause must be aliased to a different name
than the target table.


If the join between the target table and the FROM clause results in
multiple output rows for the same target table row, then only one of
those output rows is used for updating the target table.  The output
row selected is arbitrary and might change from one release of SQLite
to the next, or from one run to the next.

2.2.1. UPDATE FROM in other SQL database engines

SQL Server also supports UPDATE FROM, but in SQL Server the target
table must be included in the FROM clause.  In other words, the
target table is named twice in the statement.  With SQL Server,
the inventory adjustment statement demonstrated above would be written
like this:

UPDATE inventory
   SET quantity = quantity - daily.amt
  FROM inventory, 
       (SELECT sum(quantity) AS amt, itemId FROM sales GROUP BY 2) AS daily
 WHERE inventory.itemId = daily.itemId;


MySQL supports the UPDATE FROM idea, but it does so without using
a FROM clause.  Instead, the complete join specification is given in between
the UPDATE and SET keywords.  The equivalent MySQL statement would be
like this:

UPDATE inventory JOIN
       (SELECT sum(quantity) AS amt, itemId FROM sales GROUP BY 2) AS daily
       USING( itemId )
   SET inventory.quantity = inventory.quantity - daily.amt;


The MySQL UPDATE statement does not have just one target table like
other systems.  Any of the tables that participate in the join can
be modified in the SET clause.  The MySQL UPDATE syntax allows you to
update multiple tables at once!

2.3. Optional LIMIT and ORDER BY Clauses

If SQLite is built with the SQLITE_ENABLE_UPDATE_DELETE_LIMIT
compile-time option then the syntax of the UPDATE statement is extended
with optional ORDER BY and LIMIT clauses as follows:


 

 


If an UPDATE statement has a LIMIT clause, the maximum number of rows that
will be updated is found by evaluating the accompanying expression and casting
it to an integer value. A negative value is interpreted as "no limit".

If the LIMIT expression evaluates to non-negative value N and the
UPDATE statement has an ORDER BY clause, then all rows that would be updated in
the absence of the LIMIT clause are sorted according to the ORDER BY and the
first N updated. If the UPDATE statement also has an OFFSET clause,
then it is similarly evaluated and cast to an integer value. If the OFFSET
expression evaluates to a non-negative value M, then the first M
rows are skipped and the following N rows updated instead.

If the UPDATE statement has no ORDER BY clause, then all rows that
would be updated in the absence of the LIMIT clause are assembled in an
arbitrary order before applying the LIMIT and OFFSET clauses to determine 
which are actually updated.

The ORDER BY clause on an UPDATE statement is used only to determine which
rows fall within the LIMIT. The order in which rows are modified is arbitrary
and is not influenced by the ORDER BY clause.
This page last modified on  2020-07-18 16:35:00 UTClang_update.html
µµ¾@
        üO-UPDATE1. Overview



 
 



 
 




 
 



 
 



 
 




 
 




 
 




 
 



 
 







 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 



 
 




 
 




 
 




 
 



 
 






 
 



 
 






 
 



 
 




 
 





 
 




 
 




 
 



 
 



 
 




 
 




 
 




 
 



 
 








An UPDATE statement is used to modify a subset of the values stored in 
zero or more rows of the database table identified by the 
 specified as part of the UPDATE statement.

2. Details

If the UPDATE statement does not have a WHERE clause, all rows in the
table are modified by the UPDATE. Otherwise, the UPDATE affects only those
rows for which the WHERE clause
boolean expression is true. It is not an error if the
WHERE clause does not evaluate to true for any row in the table - this just
means that the UPDATE statement affects zero rows.

The modifications made to each row affected by an UPDATE statement are
determined by the list of assignments following the SET keyword. Each
assignment specifies a column-name to the left of the 
equals sign and a scalar expression to the right. 
For each affected row, the named columns
are set to the values found by evaluating the corresponding scalar 
expressions. If a single column-name appears more than once in the list of
assignment expressions, all but the rightmost occurrence is ignored. Columns
that do not appear in the list of assignments are left unmodified. The scalar
expressions may refer to columns of the row being updated. In this case all
scalar expressions are evaluated before any assignments are made.

Beginning in SQLite version 3.15.0 (2016-10-14), an assignment in
the SET clause can be a 
 on the left and a
row value of the same size on the right.


The optional "OR action" conflict clause that follows the
UPDATE keyword allows the user to nominate a specific
constraint conflict resolution algorithm to use during this one UPDATE command.
Refer to the section entitled ON CONFLICT for additional information.

2.1. Restrictions on UPDATE Statements Within CREATE TRIGGER

The following additional syntax restrictions apply to UPDATE statements that
occur within the body of a CREATE TRIGGER statement.  


  The table-name specified as part of an UPDATE 
      statement within
      a trigger body must be unqualified. In other words, the
      schema-name. prefix on the table name of the UPDATE is
      not allowed within triggers. Unless the table to which the trigger
      is attached is in the TEMP database, the table being updated by the
      trigger program must reside in the same database as it. If the table
      to which the trigger is attached is in the TEMP database, then the
      unqualified name of the table being updated is resolved in the same way
      as it is for a top-level statement (by searching first the TEMP database,
      then the main database, then any other databases in the order they were
      attached).

  The INDEXED BY and NOT INDEXED clauses are not allowed on UPDATE
      statements within triggers.

  The LIMIT and ORDER BY clauses for UPDATE are unsupported within
      triggers, regardless of the compilation options used to build SQLite.




2.2. UPDATE FROM

The UPDATE-FROM idea is an extension to SQL that allows an UPDATE
statement to be driven by other tables in the database. 
The "target" table is the specific table that is being
updated.  With UPDATE-FROM you can join the target table
against other tables in the database in order to help compute which
rows need updating and what the new values should be on those rows.
UPDATE-FROM is supported beginning in SQLite version 3.33.0
(2020-08-14).

Other relation database engines also implement UPDATE-FROM, but
because the construct is not part of the SQL standards, each product
implements UPDATE-FROM differently.  The SQLite implementation strives
to be compatible with PostgreSQL.  The SQG
ÏÚÏ
     !“Q3DROP TABLEThe DROP TABLE statement removes a table added with the
CREATE TABLE statement.  The name specified is the
table name.  The dropped table is completely removed from the database 
schema and the disk file.  The table can not be recovered.  
All indices and triggers
associated with the table are also deleted.

The optional IF EXISTS clause suppresses the error that would normally
result if the table does not exist.

If foreign key constraints are enabled, a DROP TABLE command performs an
implicit DELETE FROM command before removing the
table from the database schema. Any triggers attached to the table are
dropped from the database schema before the implicit DELETE FROM
is executed, so this cannot cause any triggers to fire. By contrast, an
implicit DELETE FROM does cause any configured
foreign key actions to take place. 
If the implicit DELETE FROM executed
as part of a DROP TABLE command violates any immediate foreign key constraints,
an error is returned and the table is not dropped. If 
the implicit DELETE FROM causes any 
deferred foreign key constraints to be violated, and the violations still
exist when the transaction is committed, an error is returned at the time
of commit.
This page last modified on  2020-02-10 20:33:26 UTClang_droptable.html‚9       „=/REPLACEThe REPLACE command is an alias for the "INSERT OR REPLACE"
variant of the INSERT command.  
This alias is provided for compatibility other SQL database engines.  See the 
INSERT command documentation for additional information.
This page last modified on  2020-02-10 20:33:26 UTClang_replace.htmlg #Ÿ5CREATE VIEW1. Syntax



 
 



 
 



 
 




 
 




 
 



 
 




 
 




 
 



 
 





 
 




 
 



 
 






 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 







2. Description

The CREATE VIEW command assigns a name to a pre-packaged 
SELECT statement. 
Once the view is created, it can be used in the FROM clause
of another SELECT in place of a table name.


If the "TEMP" or "TEMPORARY" keyword occurs in between "CREATE"
and "VIEW" then the view that is created is only visible to the
database connection that created it and is automatically deleted when
the database connection is closed.

 If a schema-name is specified, then the view 
is created in the specified database.
It is an error to specify both a schema-name
and the TEMP keyword on a VIEW, unless the schema-name 
is "temp".
If no schema name is specified, and the TEMP keyword is not present,
the VIEW is created in the main database.

You cannot DELETE, INSERT, or UPDATE a view.  Views are read-only 
in SQLite.  However, in many cases you can use an
INSTEAD OF trigger on the view to accomplish 
the same thing.  Views are removed 
with the DROP VIEW command.

If a column-name list follows 
the view-name, then that list determines
the names of the columns for the view.  If the column-name
list is omitted, then the names of the columns in the view are derived
from the names of the result-set columns in the .
The use of column-name list is recommended.  Or, if
column-name list is omitted, then the result
columns in the SELECT statement that defines the view should have
well-defined names using the 
"" syntax.
SQLite allows you to create views that depend on automatically 
generated column names, but you should avoid using them since the 
rules used to generate column names are not a defined part of the
interface and might change in future releases of SQLite.

The column-name list syntax was added in
SQLite versions 3.9.0 (2015-10-14).

This page last modified on  2020-02-10 20:33:26 UTClang_createview.htmlKhe table.  However, as this problem was discovered
many years after SQLite was widely deployed, we have resisted
fixing the problem for fear of breaking legacy applications.

At this time SQLite supports only FOR EACH ROW triggers, not FOR EACH
STATEMENT triggers. Hence explicitly specifying FOR EACH ROW is optional.
FOR EACH ROW implies that the SQL statements specified in the trigger
may be executed (depending on the WHEN clause) for each database row being
inserted, updated or deleted by the statement causing the trigger to fire.

Both the WHEN clause and the trigger actions may access elements of 
the row being inserted, deleted or updated using references of the form 
"NEW.column-name" and "OLD.column-name", where
column-name is the name of a column from the table that the trigger
is associated with. OLD and NEW references may only be used in triggers on
events for which they are relevant, as follows:



INSERT
NEW references are valid


UPDATE
NEW and OLD references are valid


DELETE
OLD references are valid




If a WHEN clause is supplied, the SQL statements specified
are only executed if the WHEN clause is true.
If no WHEN clause is supplied, the SQL statements
are executed every time the trigger fires.

The BEFORE or AFTER keyword determines when the trigger actions
will be executed relative to the insertion, modification or removal of the
associated row.  BEFORE is the default when neither keyword is present.

An ON CONFLICT clause may be specified as part of an UPDATE or INSERT
action within the body of the trigger.
However if an ON CONFLICT clause is specified as part of 
the statement causing the trigger to fire, then conflict handling
policy of the outer statement is used instead.

Triggers are automatically dropped
when the table that they are 
associated with (the table-name table) is 
dropped.  However if the trigger actions reference
other tables, the trigger is not dropped or modified if those other
tables are dropped or modified.

Triggers are removed using the DROP TRIGGER statement.

2.1. Syntax Restrictions On UPDATE, DELETE, and INSERT Statements Within
    Triggers

The UPDATE, DELETE, and INSERT
statements within triggers do not support
the full syntax for UPDATE, DELETE, and INSERT statements.  The following
restrictions apply:



  The name of the table to be modified in an UPDATE, DELETE, or INSERT
  statement must be an unqualified table name.  In other words, one must
  use just "tablename" not "database.tablename"
  when specifying the table. 


 For non-TEMP triggers,
  the table to be modified or queried must exist in the
  same database as the table or view to which the trigger is attached.
  TEMP triggers are not subject to the same-database rule.  A TEMP
  trigger is allowed to query or modify any table in any ATTACH-ed database.
  


  The "INSERT INTO table DEFAULT VALUES" form of the INSERT statement
  is not supported.
  


  The INDEXED BY and NOT INDEXED clauses are not supported for UPDATE and
  DELETE statements.
  


  The ORDER BY and LIMIT clauses on UPDATE and DELETE statements are not
  supported.  ORDER BY and LIMIT are not normally supported for UPDATE or
  DELETE in any context but can be enabled for top-level statements
  using the SQLITE_ENABLE_UPDATE_DELETE_LIMIT compile-time option.  However,
  that compile-time option only applies to top-level UPDATE and DELETE
  statements, not UPDATE and DELETE statements within triggers.
  


   are not supported for
  statements inside of triggers.
  




3. INSTEAD OF triggers

BEFORE and AFTER triggers work only on ordinary tables.
INSTEAD OF triggers work only on views.

If an INSTEAD OF INSERT trigger exists on a view, then it is
possible to execute an INSERT statement against that view.  No actual
insert occurs.  Instead, the statements contained within the trigger
are run.  INSTEAD OF DELETE and
INSTEAD OF UPDATE triggers work the same way for DELETE and UPDATE statements
against views.

Note that the sqlite3_changes() and sqlite3_total_changes() interfaces
do not count INSTEAD OF trigger firings, but the
count_changes pragma does count INSTEAD OF trigger firing.

4. Some Example Triggers

Assuming that customer records are stored in the "customers" table, and
that order records are stored in the "orders" table, the following
UPDATE trigger
ensures that all associated orders are redirected when a customer changes
his or her address:


CREATE TRIGGER update_customer_address UPDATE OF address ON customers 
  BEGIN
    UPDATE orders SET address = new.address WHERE customer_name = old.name;
  END;


With this trigger installed, executing the statement:


UPDATE customers SET address = '1 Main St.' WHERE name = 'Jack Jones';


causes the following to be automatically executed:


UPDATE orders SET address = '1 Main St.' WHERE customer_name = 'Jack Jones';


For an example of an INSTEAD OF trigger, consider the following schema:


CREATE TABLE customer(
  cust_id INTEGER PRIMARY KEY,
  cust_name TEXT,
  cust_addr TEXT
);
CREATE VIEW customer_address AS
   SELECT cust_id, cust_addr FROM customer;
CREATE TRIGGER cust_addr_chng
INSTEAD OF UPDATE OF cust_addr ON customer_address
BEGIN
  UPDATE customer SET cust_addr=NEW.cust_addr
   WHERE cust_id=NEW.cust_id;
END;


With the schema above, a statement of the form:


UPDATE customer_address SET cust_addr=$new_address WHERE cust_id=$cust_id;


Causes the customer.cust_addr field to be updated for a specific
customer entry that has customer.cust_id equal to the $cust_id parameter.
Note how the values assigned to the view are made available as field
in the special "NEW" table within the trigger body.



5. Cautions On The Use Of BEFORE triggers

If a BEFORE UPDATE or BEFORE DELETE trigger modifies or deletes a row
that was to have been updated or deleted, then the result of the subsequent
update or delete operation is undefined.  Furthermore, if a BEFORE trigger
modifies or deletes a row, then it is undefined whether or not AFTER triggers
that would have otherwise run on those rows will in fact run.


The value of NEW.rowid is undefined in a BEFORE INSERT trigger in which
the rowid is not explicitly set to an integer.

Because of the behaviors described above, programmers are encouraged to
prefer AFTER triggers over BEFORE triggers.



6. The RAISE() function

A special SQL function RAISE() may be used within a trigger-program,
with the following syntax 


 

 


When one of RAISE(ROLLBACK,...), RAISE(ABORT,...) or RAISE(FAIL,...)
is called during trigger-program
execution, the specified ON CONFLICT processing is performed and
the current query terminates.
An error code of SQLITE_CONSTRAINT is returned to the application,
along with the specified error message.

When RAISE(IGNORE) is called, the remainder of the current trigger program,
the statement that caused the trigger program to execute and any subsequent
trigger programs that would have been executed are abandoned. No database
changes are rolled back.  If the statement that caused the trigger program
to execute is itself part of a trigger program, then that trigger program
resumes execution at the beginning of the next step.




7. TEMP Triggers on Non-TEMP Tables

A trigger normally exists in the same database as the table named
after the "ON" keyword in the CREATE TRIGGER statement.  Except, it is
possible to create a TEMP TRIGGER on a table in another database.  
Such a trigger will only fire when changes
are made to the target table by the application that defined the trigger.
Other applications that modify the database will not be able to see the
TEMP trigger and hence cannot run the trigger.

When defining a TEMP trigger on a non-TEMP table, it is important to
specify the database holding the non-TEMP table.  For example,
in the following statement, it is important to say "main.tab1" instead
of just "tab1":


CREATE TEMP TRIGGER ex1 AFTER INSERT ON main.tab1 BEGIN ...


Failure to specify the schema name on the target table could result
in the TEMP trigger being reattached to a table with the same name in
another database whenever any schema change occurs.
This page last modified on  2022-09-27 13:16:55 UTClang_createtrigger.html
®®´`     é3RETURNING1. Overview



 
 



 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 






 
 



 
 








The RETURNING clause is not a statement itself, but a clause that can
optionally appear near the end of top-level
DELETE, INSERT, and UPDATE statements.
The effect of the RETURNING clause is to cause the statement to return
one result row for each database row that is deleted, inserted, or updated.
 RETURNING is not standard SQL.  It is an extension.
SQLite's syntax for RETURNING is modelled after 
PostgreSQL.
  

The RETURNING syntax has been supported by SQLite since version 3.35.0
(2021-03-12).

1.1. Typical Use


The RETURNING clause is designed to provide the application with the
values of columns that are filled in automatically by SQLite.  For
example:

CREATE TABLE t0(
  a INTEGER PRIMARY KEY,
  b DATE DEFAULT CURRENT_TIMESTAMP,
  c INTEGER
);
INSERT INTO t0(c) VALUES(random()) RETURNING *;



In the INSERT statement above, SQLite computes the values for all
three columns.  The RETURNING clause causes SQLite to report the chosen
values back to the application.  This saves the application from having
to issue a separate query to figure out exactly what values were inserted.

2. Details


The RETURNING clause is followed by a comma-separated list of
expressions.  These expressions are similar to the expressions following
the SELECT keyword in a SELECT statement in that they
define the values of the columns in the result set.  Each expression
defines the value for a single column.  Each expression may be
optionally followed by an AS clause that determines the name of
the result column.  The special "*" expression expands into a list
of all non-hidden columns of the table being deleted,
inserted, or updated.


For INSERT and UPDATE statements, references to columns in the table
being modified refer to the value of that column after the change
has been applied.  For DELETE statements, references to columns mean
the value before the delete occurs.


The RETURNING clause only returns rows that are directly modified
by the DELETE, INSERT, or UPDATE statement.  The RETURNING clause
does not report any additional database changes
caused by foreign key constraints or triggers.


A RETURNING clause for an UPSERT reports both inserted and
updated rows.

2.1. Processing Order


When a DELETE, INSERT, or UPDATE statement with a RETURNING clause
is run, all of the database changes occur during the first invocation
of sqlite3_step().  The RETURNING clause output is accumulated in
memory.  The first sqlite3_step() call returMÉX
)’_;CREATE TRIGGER1. Syntax



 
 



 
 



 
 




 
 




 
 





 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 



 
 






 
 



 
 




 
 




 
 



 
 




 
 






 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 






 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 




 
 






2. Description
The CREATE TRIGGER statement is used to add triggers to the 
database schema. Triggers are database operations 
that are automatically performed when a specified database event
occurs.  

Each trigger must specify that it will fire for one of
the following operations: DELETE, INSERT, UPDATE.
The trigger fires once for each row that is deleted, inserted,
or updated.  If the "UPDATE OF column-name"
syntax is used, then the trigger will only fire if
column-name appears on the left-hand side of
one of the terms in the SET clause of the UPDATE statement.

Due to an historical oversight, columns named in the "UPDATE OF"
clause do not actually have to exist in the table being updated.
Unrecognized column names are silently ignored.
It would be more helpful if SQLite would fail the CREATE TRIGGER
statement if any of the names in the "UPDATE OF" clause are not
columns in tJns one row of RETURNING
output and subsequent rows of RETURNING output are returned by subsequent
calls to sqlite3_step().
To put this another way, all RETURNING clause output is embargoed
until after all database modification actions are completed.


This means that if a statement has a RETURNING clause that generates
a large amount of output, either many rows or large
string or BLOB values, then the statement might use a lot of 
temporary memory to hold those values while it is running.


The first prototype of the RETURNING clause returned
values as they were generated.  That approach used less memory, but
it had other problems:



If the calls sqlite3_step() for two or more DML statements
where interleaved and if one of the
statements hit a constraint failure and aborted, reverting its
changes, then that could disrupt the operation of the other
DML statement.  This could not corrupt the database file, but
it could yield surprising and difficult-to-explain results in
the database.


If an application failed to call sqlite3_step() repeatedly until
it received SQLITE_DONE, then some of the database changes might
never occur.


The order of operations was different from client/server database
engines like PostgreSQL, which might cause portability issues
for some applications.



For these reasons, the current implementation was modified so that
all database changes happen before any RETURNING output is emitted.


While SQLite does guarantee that all database changes will occur
before any RETURNING output is emitted, it does not guarantee
that the order of individual RETURNING rows will match the order in
which those rows were changed in the database.  The output order
for the RETURNING rows is arbitrary and is not necessarily related
to the order in which the rows were processed internally.

3. Limitations And Caveats



The RETURNING clause is not available on DELETE and UPDATE statements
against virtual tables.
This limitation might be removed in future versions of SQLite.


The RETURNING clause is only available in top-level DELETE, INSERT,
and UPDATE statements.  The RETURNING clause cannot be used by
statements within triggers.


Even though a DML statement with a RETURNING clause returns table content,
it cannot be used as a subquery.  The RETURNING clause can only return
data to the application.  It is not currently possible to divert the
RETURNING output into another table or query.  PostgreSQL has the ability
to use a DML statement with a RETURNING clause like a view in a 
common table expressions. SQLite does not currently have that
ability, though that is something that might be added in a future release.


The rows emitted by the RETURNING clause appear in an arbitrary order.
That order might change depending on the database schema, upon the specific
release of SQLite used, or even from one execution of the same statement
to the next.
There is no way to cause the output rows to appear in a particular order.
Even if SQLite is compiled with the SQLITE_ENABLE_UPDATE_DELETE_LIMIT
option such that ORDER BY clauses are allowed on DELETE and UPDATE
statements, those ORDER BY clauses do not constrain the output order
of RETURNING.


The values emitted by the RETURNING clause are the values as seen
by the top-level DELETE, INSERT, or UPDATE statement
and do not reflect any subsequent value changes made by triggers.
Thus, if the database includes AFTER triggers that modifies some
of the values of each row inserted or updated, the RETURNING clause
emits the original values that are computed before those triggers run.


The RETURNING clause may not contain top-level aggregate functions or
window functions.  If there are subqueries in the RETURNING clause,
those subqueries may contain aggregates and window functions, but
aggregates cannot occur at the top level.


The RETURNING clause may only reference the table being modified.
In an UPDATE FROM statement, the auxiliary tables named in the FROM
clause may not participate in the RETURNING clause.


This page last modified on  2021-04-02 15:31:42 UTClang_returning.html
rr
G‚-+1Built-In Scalar SQL Functions1. Overview

The core functions shown below are available by default. 
Date &amp; Time functions,
aggregate functions,
window functions,
math functions, and
JSON functions are documented separately.  An
application may define additional
functions written in C and added to the database engine using
the sqlite3_create_function() API.




abs(X)
changes()
char(X1,X2,...,XN)
coalesce(X,Y,...)
format(FORMAT,...)
glob(X,Y)
hex(X)
ifnull(X,Y)
iif(X,Y,Z)
instr(X,Y)
last_insert_rowid()
length(X)
like(X,Y)
like(X,Y,Z)
likelihood(X,Y)
likely(X)
load_extension(X)
load_extension(X,Y)
lower(X)
ltrim(X)
ltrim(X,Y)
max(X,Y,...)
min(X,Y,...)
nullif(X,Y)
printf(FORMAT,...)
quote(X)
random()
randomblob(N)
replace(X,Y,Z)
round(X)
round(X,Y)
rtrim(X)
rtrim(X,Y)
sign(X)
soundex(X)
sqlite_compileoption_get(N)
sqlite_compileoption_used(X)
sqlite_offset(X)
sqlite_source_id()
sqlite_version()
substr(X,Y)
substr(X,Y,Z)
substring(X,Y)
substring(X,Y,Z)
total_changes()
trim(X)
trim(X,Y)
typeof(X)
unicode(X)
unlikely(X)
upper(X)
zeroblob(N)




2. Descriptions of built-in scalar SQL functions



abs(X)
  The abs(X) function returns the absolute value of the numeric
  argument X.  Abs(X) returns NULL if X is NULL. 
  Abs(X) returns 0.0 if X is a string or blob
  that cannot be converted to a numeric value.  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.


changes()
  The changes() function returns the number of database rows that were changed
  or inserted or deleted by the most recently completed INSERT, DELETE,
  or UPDATE statement, exclusive of statements in lower-level triggers.
  The changes() SQL function is a wrapper around the sqlite3_changes64()
  C/C++ function and hence follows the same rules for counting changes.


char(X1,X2,...,XN)
  The char(X1,X2,...,XN) function returns a string composed of characters having the
   unicode code point values of integers X1 through XN, respectively.


coalesce(X,Y,...)
  The coalesce() function returns a copy of its first non-NULL argument, or
  NULL if all arguments are NULL.  Coalesce() must have at least 
  2 arguments.


format(FORMAT,...)
  The format(FORMAT,...) SQL function works like the sqlite3_mprintf() C-language
  function and the printf() function from the standard C library.
  The first argument is a format string that specifies how to construct the output
  string using values taken from subsequent arguments.  If the FORMAT argument is
  missing or NULL then the result is NULL.  The %n format is silently ignored and
  does not consume an argument.  The %p format is an alias for %X.  The %z format
  is interchangeable with %s.  If there are too few arguments in the argument list,
  missing arguments are assumed to have a NULL value, which is translated into
  0 or 0.0 for numeric formats or an empty string for %s.  See the
  built-in prOƒk    ‡%-DETACHThis statement detaches an additional database connection previously 
attached using the ATTACH statement.  
When not in shared cache mode, 
it is possible to have the same database file attached multiple times using 
different names, and detaching one connection to a file will leave the 
others intact.


In shared cache mode, attempting to attach the same database file more
than once results in an error.
This page last modified on  2020-02-10 20:33:26 UTClang_detach.htmlPintf() documentation for additional information.


glob(X,Y)
  The glob(X,Y) function is equivalent to the
  expression "Y GLOB X".
  Note that the X and Y arguments are reversed in the glob() function
  relative to the infix GLOB operator.  Y is the string and X is the
  pattern.  So, for example, the following expressions are equivalent:
  
     name GLOB '*helium*'
     glob('*helium*',name)
  
  If the sqlite3_create_function() interface is used to
  override the glob(X,Y) function with an alternative implementation then
  the GLOB operator will invoke the alternative implementation.


hex(X)
  The hex() function interprets its argument as a BLOB and returns
  a string which is the upper-case hexadecimal rendering of the content of
  that blob.
  
  If the argument X in "hex(X)" is an
  integer or floating point number, then "interprets its argument as a BLOB" means
  that the binary number is first converted into a UTF8 text representation, then
  that text is interpreted as a BLOB.  Hence, "hex(12345678)" renders
  as "3132333435363738" not the binary representation of the integer value
  "0000000000BC614E".


ifnull(X,Y)
  The ifnull() function returns a copy of its first non-NULL argument, or
  NULL if both arguments are NULL.  Ifnull() must have exactly 2 arguments.
  The ifnull() function is equivalent to coalesce() with two arguments.


iif(X,Y,Z)
  The iif(X,Y,Z) function returns the value Y if X is true, and Z otherwise.
  The iif(X,Y,Z) function is logically equivalent to and generates the same
  bytecode as the CASE expression "CASE WHEN X THEN Y ELSE Z END".


instr(X,Y)
  The instr(X,Y) function finds the first occurrence of string Y within 
  string X and returns the number of prior characters plus 1, or 0 if
  Y is nowhere found within X.
  Or, if X and Y are both BLOBs, then instr(X,Y) returns one
  more than the number bytes prior to the first occurrence of Y, or 0 if
  Y does not occur anywhere within X.
  If both arguments X and Y to instr(X,Y) are non-NULL and are not BLOBs
  then both are interpreted as strings.
  If either X or Y are NULL in instr(X,Y) then the result is NULL.


last_insert_rowid()
  The last_insert_rowid() function returns the ROWID
  of the last row insert from the database connection which invoked the
  function.
  The last_insert_rowid() SQL function is a wrapper around the
  sqlite3_last_insert_rowid() C/C++ interface function.


length(X)
  For a string value X, the length(X) function returns the number of 
  characters (not bytes) in X prior to the first NUL character.
  Since SQLite strings do not normally contain NUL characters, the length(X)
  function will usually return the total number of characters in the string X.
  For a blob value X, length(X) returns the number of bytes in the blob.
  If X is NULL then length(X) is NULL.
  If X is numeric then length(X) returns the length of a string
  representation of X.
  
  Note that for strings, the length(X) function returns the character
  length of the string, not the byte length.  The character length is the number
  of characters in the string.  The character length is always different from
  the byte length for UTF-16 strings, and can be different from the byte length
  for UTF-8 strings if the string contains multi-byte characters.
  
  For BLOB values, length(X) always returns the byte-length of the BLOB.
  
  For string values, length(X) must read the entire string into memory in order
  to compute the character length.  But for BLOB values, that is not necessary as
  SQLite knows how many bytes are in the BLOB.  Hence, for multi-megabyte values,
  the length(X) function is usually much faster for BLOBs than for strings, since
  it does not need to load the value into memory.


like(X,Y)like(X,Y,Z)
  The like() function is used to implement the
  "Y LIKE X &#91;ESCAPE Z&#93;" expression. 
  If the optional ESCAPE clause is present, then the
  like() function is invoked with three arguments.  Otherwise, it is
  invoked with two arguments only. Note that the X and Y parameters are
  reversed in the like() functiQon relative to the infix LIKE operator.
  X is the pattern and Y is the string to match against that pattern.
  Hence, the following expressions are equivalent:
  
     name LIKE '%neon%'
     like('%neon%',name)
  
  The sqlite3_create_function() interface can be used to override the
  like() function and thereby change the operation of the
  LIKE operator.  When overriding the like() function, it may be important
  to override both the two and three argument versions of the like() 
  function. Otherwise, different code may be called to implement the
  LIKE operator depending on whether or not an ESCAPE clause was 
  specified.


likelihood(X,Y)
  The likelihood(X,Y) function returns argument X unchanged.
  The value Y in likelihood(X,Y) must be a floating point constant
  between 0.0 and 1.0, inclusive.
  The likelihood(X) function is a no-op that the code generator
  optimizes away so that it consumes no CPU cycles during run-time
  (that is, during calls to sqlite3_step()).
  The purpose of the likelihood(X,Y) function is to provide a hint
  to the query planner that the argument X is a boolean that is
  true with a probability of approximately Y.
  The unlikely(X) function is short-hand for likelihood(X,0.0625).
  The likely(X) function is short-hand for likelihood(X,0.9375).


likely(X)
  The likely(X) function returns the argument X unchanged.
  The likely(X) function is a no-op that the code generator
  optimizes away so that it consumes no CPU cycles at
  run-time (that is, during calls to sqlite3_step()).
  The purpose of the likely(X) function is to provide a hint
  to the query planner that the argument X is a boolean value
  that is usually true. The likely(X) function is equivalent
  to likelihood(X,0.9375). See also: unlikely(X).


load_extension(X)load_extension(X,Y)
  The load_extension(X,Y) function loads SQLite extensions out of the shared
  library file named X using the entry point Y.  The result of load_extension()
  is always a NULL.  If Y is omitted then the default entry point name is used.
  The load_extension() function raises an exception if the extension fails to
  load or initialize correctly.

  The load_extension() function will fail if the extension attempts to 
  modify or delete an SQL function or collating sequence.  The
  extension can add new functions or collating sequences, but cannot
  modify or delete existing functions or collating sequences because
  those functions and/or collating sequences might be used elsewhere
  in the currently running SQL statement.  To load an extension that
  changes or deletes functions or collating sequences, use the
  sqlite3_load_extension() C-language API.

  For security reasons, extension loading is disabled by default and must
  be enabled by a prior call to sqlite3_enable_load_extension().


lower(X)
  The lower(X) function returns a copy of string X with all ASCII characters
  converted to lower case.  The default built-in lower() function works
  for ASCII characters only.  To do case conversions on non-ASCII
  characters, load the ICU extension.


ltrim(X)ltrim(X,Y)
  The ltrim(X,Y) function returns a string formed by removing any and all
  characters that appear in Y from the left side of X.
  If the Y argument is omitted, ltrim(X) removes spaces from the left side
  of X.


max(X,Y,...)
  The multi-argument max() function returns the argument with the 
  maximum value, or return NULL if any argument is NULL. 
  The multi-argument max() function searches its arguments from left to right
  for an argument that defines a collating function and uses that collating
  function for all string comparisons.  If none of the arguments to max()
  define a collating function, then the BINARY collating function is used.
  Note that max() is a simple function when
  it has 2 or more arguments but operates as an
  aggregate function if given only a single argument.


min(X,Y,...)
  The multi-argument min() function returns the argument with the
  minimum value.
  The multi-argument min() function searches its arguments from left to right
  for an arRgument that defines a collating function and uses that collating
  function for all string comparisons.  If none of the arguments to min()
  define a collating function, then the BINARY collating function is used.
  Note that min() is a simple function when
  it has 2 or more arguments but operates as an 
  aggregate function if given
  only a single argument.


nullif(X,Y)
  The nullif(X,Y) function returns its first argument if the arguments are
  different and NULL if the arguments are the same.  The nullif(X,Y) function
  searches its arguments from left to right for an argument that defines a
  collating function and uses that collating function for all string
  comparisons.  If neither argument to nullif() defines a collating function
  then the BINARY collating function is used.


printf(FORMAT,...)
  The printf() SQL function is an alias for the format() SQL function.
  The format() SQL function was original named printf(). But the name was later
  changed to format() for compatibility with other database engines.  The original
  printf() name is retained as an alias so as not to break any legacy code.


quote(X)
  The quote(X) function returns the text of an SQL literal which
  is the value of its argument suitable for inclusion into an SQL statement.
  Strings are surrounded by single-quotes with escapes on interior quotes
  as needed.  BLOBs are encoded as hexadecimal literals.
  Strings with embedded NUL characters cannot be represented as string
  literals in SQL and hence the returned string literal is truncated prior
  to the first NUL.


random()
  The random() function returns a pseudo-random integer
  between -9223372036854775808 and +9223372036854775807.


randomblob(N)
  The randomblob(N) function return an N-byte blob containing pseudo-random
  bytes. If N is less than 1 then a 1-byte random blob is returned.

  Hint:  applications can generate globally unique identifiers
  using this function together with hex() and/or
  lower() like this:

  
  hex(randomblob(16))
  lower(hex(randomblob(16)))
  


replace(X,Y,Z)
  The replace(X,Y,Z) function returns a string formed by substituting
  string Z for every occurrence of string Y in string X.  The BINARY
  collating sequence is used for comparisons.  If Y is an empty
  string then return X unchanged.  If Z is not initially
  a string, it is cast to a UTF-8 string prior to processing.


round(X)round(X,Y)
  The round(X,Y) function returns a floating-point
  value X rounded to Y digits to the right of the decimal point.
  If the Y argument is omitted or negative, it is taken to be 0.


rtrim(X)rtrim(X,Y)
  The rtrim(X,Y) function returns a string formed by removing any and all
  characters that appear in Y from the right side of X.
  If the Y argument is omitted, rtrim(X) removes spaces from the right
  side of X.


sign(X)
  The sign(X) function returns -1, 0, or +1 if the argument X is a numeric
  value that is negative, zero, or positive, respectively.  If the argument
  to sign(X) is NULL or is a string or blob that cannot be losslessly converted
  into a number, then sign(X) returns NULL.


soundex(X)
  The soundex(X) function returns a string that is the soundex encoding 
  of the string X.
  The string "?000" is returned if the argument is NULL or contains
  no ASCII alphabetic characters.
  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.


sqlite_compileoption_get(N)
  The sqlite_compileoption_get() SQL function is a wrapper around the
  sqlite3_compileoption_get() C/C++ function.
  This routine returns the N-th compile-time option used to build SQLite
  or NULL if N is out of range.  See also the compile_options pragma.


sqlite_compileoption_used(X)
  The sqlite_compileoption_used() SQL function is a wrapper around the
  sqlite3_compileoption_used() C/C++ function.
  When the argument X to sqlite_compileoption_used(X) is a string which
  is the name of a compile-time option, this routine returns true (1) or
  false (0) depending on whether or not that option was used during the
  build.


sqlite_offset(X)
  The sqlite_offset(X) function returns the byte offset in the database
  file for the beginning of the record from which value would be read.
  If X is not a column in an ordinary table, then sqlite_offset(X) returns
  NULL.  The value returned by sqlite_offset(X) might reference either the
  original table or an index, depending on the query.  If the value X would
  normally be extracted from an index, the sqlite_offset(X) returns the
  offset to the corresponding index record.  If the value X would be
  extracted from the original table, then sqlite_offset(X) returns the offset
  to the table record.

  The sqlite_offset(X) SQL function is only available if SQLite is built
  using the -DSQLITE_ENABLE_OFFSET_SQL_FUNC compile-time option.


sqlite_source_id()
  The sqlite_source_id() function returns a string that identifies the
  specific version of the source code that was used to build the SQLite
  library.  The string returned by sqlite_source_id() is
  the date and time that the source code was checked in followed by
  the SHA3-256 hash for that check-in.  This function is
  an SQL wrapper around the sqlite3_sourceid() C interface.


sqlite_version()
  The sqlite_version() function returns the version string for the SQLite
  library that is running.  This function is an SQL
  wrapper around the sqlite3_libversion() C-interface.


substr(X,Y,Z)substr(X,Y)substring(X,Y,Z)substring(X,Y)
  The substr(X,Y,Z) function returns a substring of input string X that begins
  with the Y-th character and which is Z characters long.
  If Z is omitted then substr(X,Y) returns all characters through the end
  of the string X beginning with the Y-th.
  The left-most character of X is number 1.  If Y is negative
  then the first character of the substring is found by counting from the
  right rather than the left.  If Z is negative then
  the abs(Z) characters preceding the Y-th character are returned.
  If X is a string then characters indices refer to actual UTF-8 
  characters.  If X is a BLOB then the indices refer to bytes.
  
  "substring()" is an alias for "substr()" beginning with SQLite version 3.34.


total_changes()
  The total_changes() function returns the number of row changes
  caused by INSERT, UPDATE or DELETE
  statements since the current database connection was opened.
  This function is a wrapper around the sqlite3_total_changes64()
  C/C++ interface.


trim(X)trim(X,Y)
  The trim(X,Y) function returns a string formed by removing any and all
  characters that appear in Y from both ends of X.
  If the Y argument is omitted, trim(X) removes spaces from both ends of X.


typeof(X)
  The typeof(X) function returns a string that indicates the datatype of
  the expression X: "null", "integer", "real", "text", or "blob".


unicode(X)
  The unicode(X) function returns the numeric unicode code point corresponding to
  the first character of the string X.  If the argument to unicode(X) is not a string
  then the result is undefined.


unlikely(X)
  The unlikely(X) function returns the argument X unchanged.
  The unlikely(X) function is a no-op that the code generator
  optimizes away so that it consumes no CPU cycles at
  run-time (that is, during calls to sqlite3_step()).
  The purpose of the unlikely(X) function is to provide a hint
  to the query planner that the argument X is a boolean value
  that is usually not true. The unlikely(X) function is equivalent
  to likelihood(X, 0.0625).


upper(X)
  The upper(X) function returns a copy of input string X in which all 
  lower-case ASCII characters are converted to their upper-case equivalent.


zeroblob(N)
  The zeroblob(N) function returns a BLOB consisting of N bytes of 0x00.
  SQLite manages these zeroblobs very efficiently.  Zeroblobs can be used to
  reserve space for a BLOB that is later written using 
  incremental BLOB I/O.
  This SQL function is implemented using the sqlite3_result_zeroblob()
  routine from the C/C++ interface.



This page last modified on  2022-07-16 18:39:09 UTClang_corefunc.html
§¹§‹z
%‚—+7CREATE TABLE1. Syntax



 
 



 
 



 
 



 
 




 
 



 
 




 
 



 
 




 
 





 
 





 
 




 
 




 
 





 
 



 
 






 
 



 
 




 
 




 
 



 
 




 
 




 
 



 
 





 
 




 
 



 
 






 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 






 
 



 
 




 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 



 
 






 
 




 
 





 
 





2. The CREATE TABLE command

The "CREATE TABLE" command is used to create a new table in an SQLite 
database. A CREATE TABLE command specifies the following attributes of the
new table:


  The name of the new table.

   The database in which the new table is created. Tables may be 
      created in the main database, the temp database, or in any attached
      database.

   The name of each column in the table.

   The declared type of each column in the table.

   A default value or expression for each column in the table.

   A default collation sequence to use with each column.

   Optionally, a PRIMARY KEY for the table. Both single column and
       composite (multiple column) primary keys are supported.

   A set of SQL constraints for each table. SQLite supports UNIQUE, NOT
       NULL, CHECK and FOREIGN KEY constraints.

   Optionally, a generated column constraint.

   Whether the table is a WITHOUT ROWID table.

   Whether the table is subject to strict type checking.


Every CREATE TABLE statement must specify a name for the new table.
  Table names that begin with "sqlite_" are reserved for internT…^  ‹1DROP VIEWThe DROP VIEW statement removes a view created by the CREATE VIEW 
  statement. The view definition is removed from the database schema, but 
  no actual data in the underlying base tables is modified.

The view to drop is identified by the view-name and optional 
  schema-name specified as part of the DROP VIEW statement. This 
  reference is resolved using the standard procedure for object resolution.


  If the specified view cannot be found and the IF EXISTS clause is not 
  present, it is an error. If the specified view cannot be found and an IF
  EXISTS clause is present in the DROP VIEW statement, then the statement
  is a no-op.


This page last modified on  2020-02-10 20:33:26 UTClang_dropview.htmlˆc        ‘/REINDEXThe REINDEX command is used to delete and recreate indices from scratch.
This is useful when the definition of a collation sequence has changed, or
when there are indexes on expressions involving a function whose definition
has changed.


If the REINDEX keyword is not followed by a collation-sequence or database 
object identifier, then all indices in all attached databases are rebuilt.

If the REINDEX keyword is followed by a collation-sequence name, then
all indices in all attached databases that use the named collation sequences
are recreated. 

Or, if the argument attached to the REINDEX identifies a specific 
database table, then all indices attached to the database table are rebuilt. 
If it identifies a specific database index, then just that index is recreated.

For a command of the form "REINDEX name", a match
against collation-name takes precedence over a match
against index-name or table-name.
This ambiguity in the syntax may be avoided by always specifying a
schema-name when reindexing a specific table or index.
This page last modified on  2020-04-29 04:02:25 UTClang_reindex.htmlUal use. It
  is an error to attempt to create a table with a name that starts with
  "sqlite_".

 If a schema-name is specified, it must be either "main", 
  "temp", or the name of an attached database. In this case
  the new table is created in the named database. If the "TEMP" or "TEMPORARY"
  keyword occurs between the "CREATE" and "TABLE" then the new table is
  created in the temp database. It is an error to specify both a 
  schema-name and the TEMP or TEMPORARY keyword, unless the
  schema-name is "temp". 
  If no schema name is specified and the
  TEMP keyword is not present then the table is created in the main
  database.


  It is usually an error to attempt to create a new table in a database that
  already contains a table, index or view of the same name. However, if the
  "IF NOT EXISTS" clause is specified as part of the CREATE TABLE statement and
  a table or view of the same name already exists, the CREATE TABLE command
  simply has no effect (and no error message is returned). An error is still
  returned if the table cannot be created because of an existing index, even 
  if the "IF NOT EXISTS" clause is specified.

It is not an error to create a table that has the same name as an 
  existing trigger.

Tables are removed using the DROP TABLE statement.  



2.1. CREATE TABLE ... AS SELECT Statements

A "CREATE TABLE ... AS SELECT" statement creates and populates a database
table based on the results of a SELECT statement. The table has the same
number of columns as the rows returned by the SELECT statement. The name of
each column is the same as the name of the corresponding column in the result
set of the SELECT statement. The declared type of each column is determined
by the expression affinity of the corresponding expression in the result set
of the SELECT statement, as follows:



  Expression Affinity   Column Declared Type
  TEXT                  "TEXT"
  NUMERIC               "NUM"
  INTEGER               "INT"
  REAL                  "REAL"
  BLOB (a.k.a "NONE")   "" (empty string)


A table created using CREATE TABLE AS has no PRIMARY KEY and no
constraints of any kind. The default value of each column is NULL. The default
collation sequence for each column of the new table is BINARY.

Tables created using CREATE TABLE AS are initially populated with the
rows of data returned by the SELECT statement. Rows are assigned contiguously
ascending rowid values, starting with 1, in the order that they
are returned by the SELECT statement.



3. Column Definitions

Unless it is a CREATE TABLE ... AS SELECT statement, a CREATE TABLE includes
one or more , optionally followed by a list of
.  Each column definition consists of the
name of the column, optionally followed by the declared type of the column,
then one or more optional . Included in
the definition of "column constraints" for the purposes of the previous
statement are the COLLATE and DEFAULT clauses, even though these are not really
constraints in the sense that they do not restrict the data that the table may
contain. The other constraints - NOT NULL, CHECK, UNIQUE, PRIMARY KEY and
FOREIGN KEY constraints - impose restrictions on the table data.

The number of columns in a table is limited by the SQLITE_MAX_COLUMN
compile-time parameter. A single row of a table cannot store more than
SQLITE_MAX_LENGTH bytes of data. Both of these limits can be lowered at
runtime using the sqlite3_limit() C/C++ interface.

3.1. Column Data Types

Unlike most SQL databases, SQLite does not restrict the type of data that
may be inserted into a column based on the columns declared type. Instead,
SQLite uses dynamic typing. The declared type of a column is used to
determine the affinity of the column only.



3.2. The DEFAULT clause
The DEFAULT clause specifies a default value to use for the column if no
value is explicitly provided by the user when doing an INSERT. If there
is no explicit DEFAULT clause attached to a column definition, then the 
default value of the column is NULL. An explicit DEFAULT clause may specify
that the default value is NULL, a stringV constant, a blob constant, a
signed-number, or any constant expression enclosed in parentheses. A
default value may also be one of the special case-independent keywords
CURRENT_TIME, CURRENT_DATE or CURRENT_TIMESTAMP. For the purposes of the
DEFAULT clause, an expression is considered constant if it
contains no sub-queries, column or table references, bound parameters,
or string literals enclosed in double-quotes instead of single-quotes.

Each time a row is inserted into the table by an INSERT statement that 
does not provide explicit values for all table columns the values stored in
the new row are determined by their default values, as follows:


  If the default value of the column is a constant NULL, text, blob or
    signed-number value, then that value is used directly in the new row.

  If the default value of a column is an expression in parentheses, then
    the expression is evaluated once for each row inserted and the results
    used in the new row.

  If the default value of a column is CURRENT_TIME, CURRENT_DATE or
    CURRENT_TIMESTAMP, then the value used in the new row is a text
    representation of the current UTC date and/or time. For CURRENT_TIME, the
    format of the value is "HH:MM:SS". For CURRENT_DATE, "YYYY-MM-DD". The
    format for CURRENT_TIMESTAMP is "YYYY-MM-DD HH:MM:SS".




3.3. The COLLATE clause
The COLLATE clause specifies the name of a collating sequence to use as
the default collation sequence for the column. If no COLLATE clause is
specified, the default collation sequence is BINARY.

3.4. The GENERATED ALWAYS AS clause
A column that includes a GENERATED ALWAY AS clause is a generated column.
Generated columns are supported beginning with SQLite version 3.31.0 (2020-01-22).
See the separate documentation for details on the capabilities and
limitations of generated columns.



3.5. The PRIMARY KEY
Each table in SQLite may have at most one PRIMARY KEY. If the
  keywords PRIMARY KEY are added to a column definition, then the primary key
  for the table consists of that single column. Or, if a PRIMARY KEY clause 
  is specified as a , then the primary key of the table
  consists of the list of columns specified as part of the PRIMARY KEY clause.
  The PRIMARY KEY clause must contain only column names &mdash; the use of 
  expressions in an  of a PRIMARY KEY is not supported.
  An error is raised if more than one PRIMARY KEY clause appears in a
  CREATE TABLE statement.  The PRIMARY KEY is optional for ordinary tables
  but is required for WITHOUT ROWID tables.

If a table has a single column primary key and the declared type of that
  column is "INTEGER" and the table is not a WITHOUT ROWID table,
  then the column is known as an INTEGER PRIMARY KEY.
  See below for a description of the special properties and behaviors
  associated with an INTEGER PRIMARY KEY.

Each row in a table with a primary key must have a unique combination
  of values in its primary key columns. For the purposes of determining
  the uniqueness of primary key values, NULL values are considered distinct from
  all other values, including other NULLs. If an INSERT or UPDATE
  statement attempts to modify the table content so that two or more rows
  have identical primary key values, that is a constraint violation.

 According to the SQL standard, PRIMARY KEY should always imply NOT NULL.
  Unfortunately, due to a bug in some early versions, this is not the
  case in SQLite. Unless the column is an INTEGER PRIMARY KEY or
  the table is a WITHOUT ROWID table or a STRICT table 
  or the column is declared NOT NULL,
  SQLite allows NULL values in a PRIMARY KEY column.  SQLite could be fixed to
  conform to the standard, but doing so might break legacy applications.
  Hence, it has been decided to merely document the fact that SQLite
  allows NULLs in most PRIMARY KEY columns.



3.6. UNIQUE constraints
A UNIQUE constraint is similar to a PRIMARY KEY constraint, except
  that a single table may have any number of UNIQUE constraints. For each
  UNIQUE constraint on the table, each row must contain a unique combinatWion
  of values in the columns identified by the UNIQUE constraint. 
  For the purposes of UNIQUE constraints, NULL values
  are considered distinct from all other values, including other NULLs.
  As with PRIMARY KEYs, a UNIQUE  clause must contain
  only column names &mdash; the use of 
  expressions in an  of a UNIQUE 
  is not supported.
  

In most cases, UNIQUE and PRIMARY KEY
  constraints are implemented by creating a unique index in the database.
  (The exceptions are INTEGER PRIMARY KEY and PRIMARY KEYs on 
  WITHOUT ROWID tables.)
  Hence, the following schemas are logically equivalent:

  
  CREATE TABLE t1(a, b UNIQUE);
  CREATE TABLE t1(a, b PRIMARY KEY);
  CREATE TABLE t1(a, b);
         CREATE UNIQUE INDEX t1b ON t1(b);
  



3.7. CHECK constraints
A CHECK constraint may be attached to a column definition or
  specified as a table constraint. In practice it makes no difference. Each
  time a new row is inserted into the table or an existing row is updated,
  the expression associated with each CHECK constraint is evaluated and
  cast to a NUMERIC value in the same way as a CAST expression. If the 
  result is zero (integer value 0 or real value 0.0), then a constraint
  violation has occurred. If the CHECK expression evaluates to NULL, or
  any other non-zero value, it is not a constraint violation.
  The expression of a CHECK constraint may not contain a subquery.

CHECK constraints are only verified when the table is written, not when
   it is read.  Furthermore, verification of CHECK constraints can be
   temporarily disabled using the "PRAGMA ignore_check_constraints=ON;"
   statement.  Hence, it is possible that a query might produce results that
   violate the CHECK constraints.



3.8. NOT NULL constraints
A NOT NULL constraint may only be attached to a column definition,
  not specified as a table constraint.  Not surprisingly, a NOT NULL
  constraint dictates that the associated column may not contain a NULL value.
  Attempting to set the column value to NULL when inserting a new row or
  updating an existing one causes a constraint violation.  NOT NULL
  constraints are not verified during queries, so a query of a column might
  produce a NULL value even though the column is marked as NOT NULL, if the
  database file is corrupt.


4. Constraint enforcement

Constraints are checked during INSERT and UPDATE and by
PRAGMA integrity_check and PRAGMA quick_check and sometimes
by ALTER TABLE.  Queries and DELETE
statements do not normally verify constraints.
Hence, if a database file has been corrupted (perhaps by an external
program making direct changes to the database file without going through 
the SQLite library) a query might return data that violates a constraint.
For example:

CREATE TABLE t1(x INT CHECK( x>3 ));
/* Insert a row with X less than 3 by directly writing into the
** database file using an external program */
PRAGMA integrity_check;  -- Reports row with x less than 3 as corrupt
INSERT INTO t1(x) VALUES(2);  -- Fails with SQLITE_CORRUPT
SELECT x FROM t1;  -- Returns an integer less than 3 in spite of the CHECK constraint


Enforcement of CHECK constraints can be temporarily disabled using
the PRAGMA ignore_check_constraints=ON; statement.

4.1. Response to constraint violations

The response to a constraint violation is determined by the
  constraint conflict resolution algorithm. Each 
  PRIMARY KEY, UNIQUE, NOT NULL and CHECK constraint has a default conflict
  resolution algorithm. PRIMARY KEY, UNIQUE and NOT NULL constraints may be
  explicitly assigned a default conflict resolution algorithm by including
  a  in their definitions. Or, if a constraint definition
  does not include a  or it is a CHECK constraint, the default
  conflict resolution algorithm is ABORT. Different constraints within the
  same table may have different default conflict resolution algorithms. See
  the section titled ON CONFLICT for additional information.



5. ROWIDs and the INTEGER PRIMARY KEY

Except for WITHOUT ROWID tables, all rows within SQLite tables
have a 64-bit signed integer key that uniquely identifies the row within its table.
This integer is usually
called the "rowid". The rowid value can be accessed using one of the special
case-independent names "rowid", "oid", or "_rowid_" in place of a column name.
If a table contains a user defined column named "rowid", "oid" or "_rowid_",
then that name always refers the explicitly declared column and cannot be used
to retrieve the integer rowid value.

The rowid (and "oid" and "_rowid_") is omitted in WITHOUT ROWID tables.
WITHOUT ROWID tables are only available in SQLite version 3.8.2
(2013-12-06) and later.
A table that lacks the WITHOUT ROWID clause is called a "rowid table".

The data for rowid tables is stored as a B-Tree structure containing
one entry for each table row, using the rowid value as the key. This means that
retrieving or sorting records by rowid is fast. Searching for a record with a
specific rowid, or for all records with rowids within a specified range is
around twice as fast as a similar search made by specifying any other PRIMARY
KEY or indexed value.

 With one exception noted below, if a rowid table has a primary key that consists
of a single column and the declared type of that column is "INTEGER" in any mixture of
upper and lower case, then the column becomes an alias for the rowid. Such a
column is usually referred to as an "integer primary key". A PRIMARY KEY column
only becomes an integer primary key if the declared type name is exactly
"INTEGER".  Other integer type names like "INT" or "BIGINT" or "SHORT INTEGER"
or "UNSIGNED INTEGER" causes the primary key column to behave as an ordinary
table column with integer affinity and a unique index, not as an alias for
the rowid.

 The exception mentioned above is that if the declaration of a column with
declared type "INTEGER" includes an "PRIMARY KEY DESC" clause, it does not
become an alias for the rowid and is not classified as an integer primary key.
This quirk is not by design. It is due to a bug in early versions of SQLite.
But fixing the bug could result in backwards incompatibilities.
Hence, the original behavior has been retained (and documented) because odd
behavior in a corner case is far better than a compatibility break.  This means
that the following three table declarations all cause the column "x" to be an
alias for the rowid (an integer primary key):


CREATE TABLE t(x INTEGER PRIMARY KEY ASC, y, z);
CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x ASC));
CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x DESC));


But the following declaration does not result in "x" being an alias for
the rowid:

CREATE TABLE t(x INTEGER PRIMARY KEY DESC, y, z);


Rowid values may be modified using an UPDATE statement in the same
way as any other column value can, either using one of the built-in aliases
("rowid", "oid" or "_rowid_") or by using an alias created by an integer
primary key. Similarly, an INSERT statement may provide a value to use as the
rowid for each row inserted. Unlike normal SQLite columns, an integer primary
key or rowid column must contain integer values. Integer primary key or rowid
columns are not able to hold floating point values, strings, BLOBs, or NULLs.

If an UPDATE statement attempts to set an integer primary key or rowid column
to a NULL or blob value, or to a string or real value that cannot be losslessly
converted to an integer, a "datatype mismatch" error occurs and the statement
is aborted. If an INSERT statement attempts to insert a blob value, or a string
or real value that cannot be losslessly converted to an integer into an
integer primary key or rowid column, a "datatype mismatch" error occurs and the
statement is aborted.

If an INSERT statement attempts to insert a NULL value into a rowid or
integer primary key column, the system chooses an integer value to use as the
rowid automatically. A detailed description of how this is done is provided
separately.

The parent key of a foreign key constraint is not allowed to
use the rowid.  The parent key must used named columns only.
This page last modified on  2022-12-14 11:53:20 UTClang_createtable.htmlYied following the FROM keyword. A subquery specified
in the table-or-subquery following the FROM clause in a 
simple SELECT statement is
handled as if it was a table containing the data returned by executing the
subquery statement. Each column of the subquery has the
collation sequence and affinity of the corresponding expression
in the subquery statement.

If there is only a single table or subquery in the FROM
clause, then the input data used by the SELECT statement is the contents of the
named table. If there is more than one table or subquery in FROM clause
then the contents of all tables and/or subqueries
are joined into a single dataset for the simple SELECT statement to operate on.
Exactly how the data is combined depends on the specific  and
 used to connect the tables or subqueries together.

All joins in SQLite are based on the cartesian product of the left and
right-hand datasets. The columns of the cartesian product dataset are, in 
order, all the columns of the left-hand dataset followed by all the columns
of the right-hand dataset. There is a row in the cartesian product dataset
formed by combining each unique combination of a row from the left-hand 
and right-hand datasets. In other words, if the left-hand dataset consists of
Nleft rows of 
Mleft columns, and the right-hand dataset of
Nright rows of
Mright columns, then the cartesian product is a
dataset of 
Nleft&times;Nright
rows, each containing 
Mleft+Mright columns.

If the join-operator is "CROSS JOIN", "INNER JOIN", "JOIN" or a comma
(",") and there is no ON or USING clause, then the result of the join is
simply the cartesian product of the left and right-hand datasets. 
If join-operator does have ON or USING clauses, those are handled according to
the following bullet points:


   If there is an ON clause then the ON expression is
       evaluated for each row of the cartesian product as a 
       boolean expression. Only rows for which the expression evaluates to 
       true are included from the dataset.

   If there is a USING clause
       then each of the column names specified must exist in the datasets to 
       both the left and right of the join-operator. For each pair of named
       columns, the expression "lhs.X = rhs.X" is evaluated for each row of
       the cartesian product as a boolean expression. Only rows for which
       all such expressions evaluates to true are included from the
       result set. When comparing values as a result of a USING clause, the
       normal rules for handling affinities, collation sequences and NULL
       values in comparisons apply. The column from the dataset on the
       left-hand side of the join-operator is considered to be on the left-hand
       side of the comparison operator (=) for the purposes of collation 
       sequence and affinity precedence.

       For each pair of columns identified by a USING clause, the column
       from the right-hand dataset is omitted from the joined dataset. This 
       is the only difference between a USING clause and its equivalent ON
       constraint.

   If the NATURAL keyword is in the join-operator then an
       implicit USING clause is added to the join-constraints. The implicit
       USING clause contains each of the column names that appear in both
       the left and right-hand input datasets. If the left and right-hand
       input datasets feature no common column names, then the NATURAL keyword
       has no effect on the results of the join. A USING or ON clause may
       not be added to a join that specifies the NATURAL keyword.

   If the join-operator is a "LEFT JOIN" or "LEFT OUTER JOIN", then
       after
       the ON or USING filtering clauses have been applied, an extra row is 
       added to the output for each row in the original left-hand input 
       dataset that does not match any row in the right-hand dataset.
       The added rows contain NULL values in the columns
       that would normally contain values copied from the right-hand input
       dataset.  

   
       

       If the join-operator is a "RIGHT JOIN"Z or "RIGHT OUTER JOIN", then
       after the ON or USING filtering clauses have been applied, an extra row is 
       added to the output for each row in the original right-hand input 
       dataset that does not match any row in the left-hand dataset.
       The added rows contain NULL values in the columns
       that would normally contain values copied from the left-hand input
       dataset.  

   
       

       A "FULL JOIN" or "FULL OUTER JOIN" is a combination of a
       "LEFT JOIN" and a "RIGHT JOIN".  Extra rows of output are
       added for each row in left dataset that matches no rows in the right,
       and for each row in the right dataset that matches no rows in the
       left.  Unmatched columns are filled in with NULL.


When more than two tables are joined together as part of a FROM clause,
the join operations are processed in order from left to right. In other 
words, the FROM clause (A join-op-1 B join-op-2 C) is computed as 
((A join-op-1 B) join-op-2 C).



2.2. Special handling of CROSS JOIN.

There is no difference between the "INNER JOIN", "JOIN" and "," join
operators. They are completely interchangeable in SQLite.
The "CROSS JOIN" join operator produces the same result as the 
"INNER JOIN", "JOIN" and "," operators, but is 
handled differently by the query optimizer
in that it prevents the query optimizer from reordering
the tables in the join.  An application programmer can use the CROSS JOIN 
operator to directly influence the algorithm that is chosen to implement
the SELECT statement.  Avoid using CROSS JOIN except in specific situations 
where manual control of the query optimizer is desired.  Avoid using
CROSS JOIN early in the development of an application as doing so is
a premature
optimization.  The special handling of CROSS JOIN is an SQLite-specific
feature and is not a part of standard SQL.




2.3. WHERE clause filtering.

If a WHERE clause is specified, the WHERE expression is evaluated for 
each row in the input data as a boolean expression. Only rows for which the
WHERE clause expression evaluates to true are included from the dataset before
continuing.  Rows are excluded from the result if the WHERE clause
evaluates to either false or NULL.

For a JOIN or INNER JOIN or CROSS JOIN, there is no difference between 
a constraint expression in the WHERE clause and one in the ON clause.  However,
for a LEFT JOIN or LEFT OUTER JOIN, the difference is very important.  
In a LEFT JOIN,
the extra NULL row for the right-hand table is added after ON clause processing
but before WHERE clause processing.  A constraint of the form "left.x=right.y"
in an ON clause will therefore allow through the added all-NULL rows of the
right table.  But if that same constraint is in the WHERE clause a NULL in
"right.y" will prevent the expression "left.x=right.y" from being true, and
thus exclude that row from the output.




2.4. Generation of the set of result rows

Once the input data from the FROM clause has been filtered by the
WHERE clause expression (if any), the set of result rows for the simple 
SELECT are calculated. Exactly how this is done depends on whether the simple 
SELECT is an aggregate or non-aggregate query, and whether or not a GROUP
BY clause was specified.

 The list of expressions between the SELECT and FROM keywords is known as
the result expression list.  If a result expression is the special expression
"*" then all columns in the input data are substituted for that one expression.
If the expression is the alias of a table or subquery in the FROM clause
followed by ".*" then all columns from the named table or subquery are
substituted for the single expression. It is an error to use a "*" or
"alias.*" expression in any context other than a result expression list.
It is also an error to use a "*" or "alias.*" expression in a simple SELECT
query that does not have a FROM clause.

 The number of columns in the rows returned by a simple SELECT statement
is equal to the number of expressions in the result expression list after
substitution of * and alias.* expressions. Each [result row is calculated by
evaluating the expressions in the result expression list with respect to a
single row of input data or, for aggregate queries, with respect to a group
of rows.


  If the SELECT statement is a non-aggregate query, then 
    each expression in the result expression list is evaluated for each row in
    the dataset filtered by the WHERE clause.

  If the SELECT statement is an aggregate query without a GROUP
    BY clause, then each aggregate expression in the result-set is 
    evaluated once across the entire dataset. Each non-aggregate expression
    in the result-set is evaluated once for an arbitrarily selected row of
    the dataset. The same arbitrarily selected row is used for each
    non-aggregate expression. Or, if the dataset contains zero rows, then 
    each non-aggregate expression is evaluated against a row consisting
    entirely of NULL values.

   The single row of result-set data created by evaluating the aggregate
    and non-aggregate expressions in the result-set forms the result of an
    aggregate query without a GROUP BY clause. An aggregate query without a
    GROUP BY clause always returns exactly one row of data, even if there are
    zero rows of input data.

  
  If the SELECT statement is an aggregate query with a GROUP
    BY clause, then each of the expressions specified as part of the
    GROUP BY clause is evaluated for each row of the dataset according to
    the processing rules stated below for ORDER BY expressions. Each row
    is then assigned to a "group" based on the results; rows for which
    the results of evaluating the GROUP BY expressions are the same get
    assigned to the same group. For the purposes of grouping rows, NULL 
    values are considered equal. The usual rules for selecting a
    collation sequence with which to compare text values apply when evaluating
    expressions in a GROUP BY clause.  The expressions in the GROUP BY clause
    do not have to be expressions that appear in the result. The
    expressions in a GROUP BY clause may not be aggregate expressions.

    
    If a HAVING clause is specified, it is evaluated once for each group 
    of rows as a boolean expression. If the result of evaluating the
    HAVING clause is false, the group is discarded. If the HAVING clause is
    an aggregate expression, it is evaluated across all rows in the group. If
    a HAVING clause is a non-aggregate expression, it is evaluated with respect
    to an arbitrarily selected row from the group.  The HAVING expression may
    refer to values, even aggregate functions, that are not in the result.

    Each expression in the result-set is then evaluated once for each
    group of rows. If the expression is an aggregate expression, it is 
    evaluated across all rows in the group. Otherwise, it is evaluated against
    a single arbitrarily chosen row from within the group. If there is more
    than one non-aggregate expression in the result-set, then all such
    expressions are evaluated for the same row.

    Each group of input dataset rows contributes a single row to the 
    set of result rows. Subject to filtering associated with the DISTINCT
    keyword, the number of rows returned by an aggregate query with a GROUP
    BY clause is the same as the number of groups of rows produced by applying
    the GROUP BY and HAVING clauses to the filtered input dataset.




2.5. Bare columns in an aggregate query

The usual case is that all column names in an aggregate query are either
arguments to aggregate functions or else appear in the GROUP BY clause.
A result column which contains a column name that is not within an
aggregate function and that does not appear in the GROUP BY clause (if
one exists) is called a "bare" column.
Example:

SELECT a, b, sum(c) FROM tab1 GROUP BY a;

In the query above, the "a" column is part of the GROUP BY clause
and so each row of the output contains one of the distinct values for
"a".  The "c" column is contained within the sum() aggregate function
and so that output column is the sum of all "c" values in \rows that
have the same value for "a".  But what is the result of the bare 
column "b"? The answer is that the "b" result will be the
value for "b" in one of the input rows that form the aggregate.
The problem is that you usually do not know which input row is used
to compute "b", and so in many cases the value for "b" is undefined.


Special processing occurs when the aggregate function is 
either min() or max().  Example:

SELECT a, b, max(c) FROM tab1 GROUP BY a;


If there is exactly one min() or max() aggregate
in the query, then all bare columns in the result set take values from an
input row which also contains the minimum or maximum.  So in the query
above, the value of the "b" column in the output will be the value of
the "b" column in the input row that has the largest "c" value.
There are limitations on this special behavior of
min() and max():



If the same minimum or maximum value occurs on two or more rows,
then bare values might be selected from any of those rows.  The choice
is arbitrary.  There is no way to predict from which row the bare values
will be choosen.  The choice might be different for different bare columns
within the same query.


If there are two or more min() or max() aggregates
in the query, then bare column values will be taken from one of the rows
on which one of the aggregates has their minimum or maximum value.  The choice
of which min() or max() aggregate determines the 
selection of bare column values is arbitrary.  The choice might be different
for different bare columns within the same query.


This special processing for min() or max() aggregates
only works for the built-in implementation of those aggregates.  If an
application overrides the built-in min() or max() aggregates
with application-defined alternatives, then the values selected for bare
columns will be taken from an arbitrary row.


Most other SQL database engines disallow bare columns.  If you include
a bare column in a query, other database engines will usually raise an error.
The ability to include bare columns in a query is an SQLite-specific extension.




2.6. Removal of duplicate rows (DISTINCT processing)

One of the ALL or DISTINCT keywords may follow the SELECT keyword in a 
simple SELECT statement. If the simple SELECT is a SELECT ALL, then the
entire set of result rows are returned by the SELECT. If neither ALL or
DISTINCT are present, then the behavior is as if ALL were specified. 
If the simple SELECT is a SELECT DISTINCT, then duplicate rows are removed
from the set of result rows before it is returned. For the purposes of
detecting duplicate rows, two NULL values are considered to be equal. The
usual rules apply for selecting a collation
sequence to compare text values.



3. Compound Select Statements

Two or more simple SELECT statements may be connected together to form
a compound SELECT using the UNION, UNION ALL, INTERSECT or EXCEPT operator,
as shown by the following diagram:



 
 



 
 



 
 



 
 




 
 



 
 




 
 





 
 




 
 




 
 



 
 







 
 



 
 




 
 




 
 



 
 





 
 




 
 



 
 




 
 



 
 




 
 





 
 




 
 




 
 



 
 






 
 



 
 






 
 




 
 



 
 



 
 




 
 





 
 




 
 



 
 



 
 






 
 



 
 







In a compound SELECT, all the constituent SELECTs must return the same 
number of result columns. As the components of a compound SELECT must
be simple SELECT statements, they may not contain ORDER BY or LIMIT clauses.
ORDER BY and LIMIT clauses may only occur at the end of the entire compound
SELECT, and then only if the final element of the compound is not a VALUES clause.

A compound SELECT created using UNION ALL operator returns all the rows
from the SELECT to the left of the UNION ALL operator, and all the rows
from the SELECT to the right of it. The UNION operator works the same way as
UNION ALL, except that duplicate rows are removed from the final result set.
The INTERSECT operator returns the intersection of the results of the left and
right SELECTs.  The EXCEPT operator returns the subset of rows retu]rned by the
left SELECT that are not also returned by the right-hand SELECT. Duplicate
rows are removed from the results of INTERSECT and EXCEPT operators before the
result set is returned.

For the purposes of determining duplicate rows for the results of compound
SELECT operators, NULL values are considered equal to other NULL values and
distinct from all non-NULL values. The collation sequence used to compare 
two text values is determined as if the columns of the left and right-hand
SELECT statements were the left and right-hand operands of the equals (=)
operator, except that greater precedence is not assigned to a collation 
sequence specified with the postfix COLLATE operator. No affinity
transformations are applied to any values when comparing rows as part of a
compound SELECT. 

When three or more simple SELECTs are connected into a compound SELECT,
they group from left to right. In other words, if "A", "B" and "C" are all
simple SELECT statements, (A op B op C) is processed as ((A op B) op C).





4. The ORDER BY clause

If a SELECT statement that returns more than one row does not have an
ORDER BY clause, the order in which the rows are returned is undefined.
Or, if a SELECT statement does have an ORDER BY clause, then the list of
expressions attached to the ORDER BY determine the order in which rows
are returned to the user.


In a compound SELECT statement, only the last or right-most simple SELECT
may have an ORDER BY clause. That ORDER BY clause will apply across all elements of
the compound. If the right-most element of a compound SELECT is a VALUES clause,
then no ORDER BY clause is allowed on that statement.


Rows are first sorted based on the results of
evaluating the left-most expression in the ORDER BY list, then ties are broken
by evaluating the second left-most expression and so on. The order in which
two rows for which all ORDER BY expressions evaluate to equal values are
returned is undefined. Each ORDER BY expression may be optionally followed
by one of the keywords ASC (smaller values are returned first) or DESC (larger
values are returned first). If neither ASC or DESC are specified, rows
are sorted in ascending (smaller values first) order by default.



SQLite considers NULL values to be smaller than any other values
for sorting purposes.  Hence, NULLs naturally appear at the beginning
of an ASC order-by and at the end of a DESC order-by.  This can be changed
using the "ASC NULLS LAST" or "DESC NULLS FIRST" syntax.

Each ORDER BY expression is processed as follows:


If the ORDER BY expression is a constant integer K then the
expression is considered an alias for the K-th column of the result set
(columns are numbered from left to right starting with 1).

If the ORDER BY expression is an identifier that corresponds to
the alias of one of the output columns, then the expression is considered
an alias for that column.

Otherwise, if the ORDER BY expression is any other expression, it 
is evaluated and the returned value used to order the output rows. If
the SELECT statement is a simple SELECT, then an ORDER BY may contain any
arbitrary expressions. However, if the SELECT is a compound SELECT, then
ORDER BY expressions that are not aliases to output columns must be exactly
the same as an expression used as an output column.


For the purposes of sorting rows, values are compared in the same way
as for comparison expressions. The collation sequence used to compare
two text values is determined as follows:


  If the ORDER BY expression is assigned a collation sequence using
  the postfix COLLATE operator, then the specified collation sequence is
  used.
  Otherwise, if the ORDER BY expression is an alias to an expression
  that has been assigned a collation sequence using the postfix 
  COLLATE operator, then the collation sequence assigned to the aliased
  expression is used.
  Otherwise, if the ORDER BY expression is a column or an alias of
  an expression that is a column, then the default collation sequence for
  the column is used. 
  Otherwise, the BINARY collation sequence is used.
^

In a compound SELECT statement, all ORDER BY expressions are handled
as aliases for one of the result columns of the compound.
If an ORDER BY expression is not an integer alias, then SQLite searches
the left-most SELECT in the compound for a result column that matches either
the second or third rules above. If a match is found, the search stops and
the expression is handled as an alias for the result column that it has been
matched against. Otherwise, the next SELECT to the right is tried, and so on.
If no matching expression can be found in the result columns of any
constituent SELECT, it is an error. Each term of the ORDER BY clause is
processed separately and may be matched against result columns from different
SELECT statements in the compound.



5. The LIMIT clause

The LIMIT clause is used to place an upper bound on the number of rows
returned by the entire SELECT statement.

In a compound SELECT, only the
last or right-most simple SELECT may contain a LIMIT clause.  
In a compound SELECT, 
the LIMIT clause applies to the entire compound, not just the final SELECT.
If the right-most simple SELECT is a VALUES clause then no LIMIT clause
is allowed.

Any scalar expression may be used in the 
LIMIT clause, so long as it evaluates to an integer or a value that can be
losslessly converted to an integer. If the expression evaluates to a NULL 
value or any other value that cannot be losslessly converted to an integer, an
error is returned. If the LIMIT expression evaluates to a negative value,
then there is no upper bound on the number of rows returned. Otherwise, the
SELECT returns the first N rows of its result set only, where N is the value
that the LIMIT expression evaluates to. Or, if the SELECT statement would
return less than N rows without a LIMIT clause, then the entire result set is
returned. 

The expression attached to the optional OFFSET clause that may follow a
LIMIT clause must also evaluate to an integer, or a value that can be
losslessly converted to an integer. If an expression has an OFFSET clause,
then the first M rows are omitted from the result set returned by the SELECT
statement and the next N rows are returned, where M and N are the values that
the OFFSET and LIMIT clauses evaluate to, respectively. Or, if the SELECT
would return less than M+N rows if it did not have a LIMIT clause, then the
first M rows are skipped and the remaining rows (if any) are returned. If the
OFFSET clause evaluates to a negative value, the results are the same as if it
had evaluated to zero.

Instead of a separate OFFSET clause, the LIMIT clause may specify two
scalar expressions separated by a comma. In this case, the first expression
is used as the OFFSET expression and the second as the LIMIT expression.
This is counter-intuitive, as when using the OFFSET clause the second of
the two expressions is the OFFSET and the first the LIMIT. 
This reversal of the offset and limit is intentional
- it maximizes compatibility with other SQL database systems.
However, to avoid confusion, programmers are strongly encouraged to use
the form of the LIMIT clause that uses the "OFFSET" keyword and avoid
using a LIMIT clause with a comma-separated offset.



6. The VALUES clause

The phrase "VALUES(expr-list)" means the same thing
as "SELECT expr-list".  The phrase
"VALUES(expr-list-1),...,(expr-list-N)" means the same
thing as "SELECT expr-list-1 UNION ALL ... UNION ALL
SELECT expr-list-N".  Both forms are the same, except that
the number of SELECT statements in a compound is limited by
SQLITE_LIMIT_COMPOUND_SELECT whereas the number of rows in a
VALUES clause has no arbitrary limit.

There are some restrictions on the use of a VALUES clause that are
not shown on the syntax diagrams:



A VALUES clause cannot be followed by ORDER BY.


A VALUES clause cannot be followed by LIMIT.



7. The WITH Clause

SELECT statements may be optionally preceded by a single
WITH clause that defines one or more common table expressions
for use within the SELECT statement.



8. Table-valued Functions In The FROM Clause

A virtual table that contains hidden columns can be used like
a table-valued function in the FROM clause.  The arguments to the
table-valued function become constraints on the HIDDEN columns of
the virtual table.  Additional information can be found in the
virtual table documentation.




9. Deviations From Standard SQL

The SELECT syntax of SQLite differs slightly from standard SQL.
These differences are due to several reasons:


 In the mid-2000s, there was a lot of emphasis on keeping the library
        footprint as small as possible, so as not to use too much space
        on memory-limited flip-phones and similar.

 During the early years of SQLite, the lead developer sought to follow
        Postel's Law and to
        be forgiving and flexible in what input was accepted.

 There were bugs in early SQLite parsers that accepts some strange inputs.

 The lead developer's knowledge of SQL was imperfect.


Whatever the origin of the input quirks, we generally avoid trying to "fix" them,
as any new restrictions on the input syntax would likely cause at least some of
the millions of applications that use SQLite to break.  We do not want that.
The goal of the SQLite development team is to preserve backwards compability to
the fullest extent possible.  Hence, if a syntax quirk is harmless,
we leave it alone and document it here, rather than try to fix it.

9.1. Strange JOIN names

SQLite accepts all of the usual syntax for JOIN operators:



 
 




But it does not stop there.  SQLite is actually very flexible in how you
specify a join operator.  The general syntax is:


blah blah blah JOIN


Where there are between 1 and 3 instances of "blah", each of which can be
any of "CROSS", "FULL", "INNER", "LEFT", "NATURAL", "OUTER", or "RIGHT".  The SQLite
parser treats each of these keywords as an attribute of the join, which can be combined
in any order.  This creates the possibility of many new and creative join types beyond
what is specified by the syntax diagram.  Some of these non-standard join types are
specifically disallowed.  For example, you cannot say "INNER OUTER JOIN", because
that would be contradictory.  But you can say things like "OUTER LEFT NATURAL JOIN"
which means the same as "NATURAL LEFT OUTER JOIN".  Or you can say "LEFT RIGHT JOIN"
which is the same as "FULL JOIN".

Remember:  you can use these non-standard join types but you ought not.
Stick to using standard JOIN syntax for portability with other SQL database engines.

9.2. Precedence of comma-joins and CROSS JOIN

In standard SQL, joins that use the JOIN keyword take higher precedence
than comma-joins.  That is to say, JOIN operators happen before comma operators.
This is not the case in SQLite, where all joins have the same precedence.

Consider this example:


... FROM t1, t2 NATURAL FULL JOIN t3 ...


In standard SQL, the FULL JOIN between t2 and t3 would occur first, and
then the result of the left join would be cross-joined against t1.  But SQLite
always handles all joins from left to right.  Thus, SQLite will do a cross
join on t1 and t2 first, then the result of that cross join will feed into the FULL JOIN
with t3.  Inner joins are inherently associative, so the difference is only
evident if your FROM clause contains one or more outer joins.

You can work around this, and make your SQL statements portable across all
systems, by observing the following stylistic rules:


 Do not mix comma-joins with the JOIN keyword.  It is fine to use comma-joins,
but if you do, the you should use only comma-joins for the entire FROM clause.

 Prefer LEFT JOIN over other outer join operators.

 When in doubt, use parentheses to specify the exact join order that you intend.


Any one of these suggestions is sufficient to avoid problems, and most
programmers instinctively follow all of these suggestions without having to
be told, and so the lack of precedence difference between comma-joins and
the JOIN keyword in SQLite rarely comes up in practice.  But you should be aware
of the problem, in case it ever does appear.
This page last modified on  2022-10-26 20:02:18 UTClang_select.html
--ÿ/
ƒþ+-SELECT1. Overview


 
 



 
 




 
 




 
 



 
 




 
 




 
 



 
 





 
 




 
 



 
 






 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 







The SELECT statement is used to query the database.  The
result of a SELECT is zero or more rows of data where each row
has a fixed number of columns.  A SELECT statement does not make
any changes to the database.

The "" syntax diagram above attempts to show as much of the
SELECT statement syntax as possible in a single diagram, because some readers
find that helpful.  The following "" is an alternative
syntax diagrams that expresses the same syntax but tries to break the syntax 
down into smaller chunks.



 
 



 
 



 
 



 
 



 
 




 
 





 
 




 
 




 
 



 
 







 
 




 
 



 
 




 
 




 
 



 
 





 
 




 
 



 
 



 
 




 
 





 
 




 
 




 
 



 
 






 
 



 
 






 
 




 
 



 
 



 
 




 
 





 
 




 
 



 
 





 
 



 
 







Note that there are paths through the syntax diagrams that
are not allowed in practice.  Some examples:

A VALUES clause can be the first element in a compound SELECT
    that uses a WITH clause, but a simple SELECT that consists of
    just a VALUES clause cannot be preceded by a WITH clause.
The WITH clause must occur on the first SELECT of a compound SELECT.
    It cannot follow a .


These and other similar syntax restrictions are described in the text.

The SELECT statement is the most complicated command in the SQL language.
To make the description easier to follow, some of the passages below describe
the way the data returned by a SELECT statement is determined as a series of
steps. It is important to keep in mind that this is purely illustrative -
in practice neither SQLite nor any other SQL engine is required to follow 
this or any other specific process.



2. Simple Select Processing

The core of a SELECT statement is a "simple SELECT" shown by the
 and  syntax diagrams below.  
In practice, most SELECT statements are simple SELECT statements.



 
 



 
 



 
 



 
 




 
 



 
 




 
 





 
 




 
 




 
 



 
 







 
 



 
 




 
 




 
 



 
 





 
 




 
 



 
 




 
 



 
 




 
 





 
 




 
 




 
 



 
 






 
 



 
 






 
 




 
 



 
 



 
 




 
 





 
 




 
 



 
 



 
 






 
 



 
 







Generating the results of a simple SELECT
statement is presented as a four step process in the description below:


   FROM clause processing: The input data for the simple SELECT is
       determined. The input data is either implicitly a single row with 0
       columns (if there is no FROM clause) or is determined by the FROM
       clause.
   WHERE clause processing: The input data is filtered using the WHERE
       clause expression.  
   GROUP BY, HAVING and result-column expression processing: 
       The set of result rows is computed by aggregating the data according to
       any GROUP BY clause and calculating the result-set expressions for the
       rows of the filtered input dataset.  
   DISTINCT/ALL keyword processing: If the query is a "SELECT
       DISTINCT" query, duplicate rows are removed from the set of result rows.


There are two types of simple SELECT statement - aggregate and 
non-aggregate queries. A simple SELECT statement is an aggregate query if
it contains either a GROUP BY clause or one or more aggregate functions
in the result-set. Otherwise, if a simple SELECT contains no aggregate
functions or a GROUP BY clause, it is a non-aggregate query.




2.1. Determination of input data (FROM clause processing)

The input data used by a simple SELECT query is a set of N rows 
each M columns wide.

If the FROM clause is omitted from a simple SELECT statement, then the 
input data is implicitly a single row zero columns wide (i.e. N=1 and
M=0).

If a FROM clause is specified, the data on which a simple SELECT query
operates comes from the one or more tables or subqueries (SELECT statements
in parentheses) specifX-06-04).  Do not
confuse these two separate uses of the "ON&nbsp;CONFLICT" phrase.

The syntax for the ON CONFLICT clause is as shown above for
the CREATE TABLE command.  For the INSERT and
UPDATE commands, the keywords "ON CONFLICT" are replaced by "OR" so that
the syntax reads more naturally.  For example, instead of
"INSERT ON CONFLICT IGNORE" we have "INSERT OR IGNORE".
The keywords change but the meaning of the clause is the same
either way.

The ON CONFLICT clause applies to UNIQUE, NOT NULL,
CHECK, and PRIMARY KEY constraints.
The ON CONFLICT algorithm does not
apply to FOREIGN KEY constraints.
There are five conflict resolution algorithm choices:
ROLLBACK, ABORT, FAIL, IGNORE, and REPLACE.
The default conflict resolution algorithm is ABORT.  This
is what they mean:


ROLLBACK
 When an applicable constraint violation occurs, the ROLLBACK
resolution algorithm aborts the current SQL statement with
an SQLITE_CONSTRAINT error and rolls back the current transaction.
If no transaction is
active (other than the implied transaction that is created on every
command) then the ROLLBACK resolution algorithm works the same as the
ABORT algorithm.

ABORT
 When an applicable constraint violation occurs, the ABORT
resolution algorithm aborts the current SQL statement
with an SQLITE_CONSTRAINT error and backs out any changes
made by the current SQL statement; but changes caused
by prior SQL statements within the same transaction are preserved and the
transaction remains active.
This is the default behavior and the behavior specified by the SQL
standard.

FAIL
 When an applicable constraint violation occurs, the FAIL
resolution algorithm aborts the current SQL statement with an
SQLITE_CONSTRAINT error.  But the FAIL resolution does not
back out prior changes of the SQL statement that failed nor does
it end the transaction.
For example, if an UPDATE
statement encountered a constraint violation on the 100th row that
it attempts to update, then the first 99 row changes are preserved
but changes to rows 100 and beyond never occur.

The FAIL behavior only works for uniqueness, NOT NULL, and CHECK 
constraints.  A foreign key constraint violation causes an ABORT.


IGNORE
 When an applicable constraint violation occurs, 
the IGNORE resolution algorithm skips the one row that contains
the constraint violation and continues processing subsequent rows
of the SQL statement as if nothing went wrong.
Other rows before and after the row that
contained the constraint violation are inserted or updated
normally. No error is returned for uniqueness, NOT NULL, and
UNIQUE constraint errors when the IGNORE conflict resolution
algorithm is used.  However, the IGNORE conflict resolution
algorithm works like ABORT for foreign key constraint errors.



REPLACE
 When a UNIQUE or PRIMARY KEY constraint violation occurs, 
the REPLACE algorithm
deletes pre-existing rows that are causing the constraint violation
prior to inserting or updating the current row and the command continues 
executing normally.
If a NOT NULL constraint violation occurs, the REPLACE conflict
resolution replaces the NULL value with
the default value for that column, or if the column has no default
value, then the ABORT algorithm is used.
If a CHECK constraint or foreign key constraint violation occurs, 
the REPLACE conflict resolution algorithm works like ABORT.

When the REPLACE conflict resolution strategy deletes rows in order to
satisfy a constraint, delete triggers fire if and only if
recursive triggers are enabled.

The update hook is not invoked for rows that
are deleted by the REPLACE conflict resolution strategy.  Nor does
REPLACE increment the change counter.
The exceptional behaviors defined in this paragraph might change 
in a future release.


The algorithm specified in the OR clause of an INSERT or UPDATE
overrides any algorithm specified in a CREATE TABLE.
If no algorithm is specified anywhere, the ABORT algorithm is used.
This page last modified on  2021-11-01 21:09:36 UTClang_conflict.html
77¯N Þk-VACUUM1. Syntax


 
 




2. Description

  The VACUUM command rebuilds the database file, repacking it into a minimal
  amount of disk space. There are several 
  reasons an application might do this:


    Unless SQLite is running in "auto_vacuum=FULL" mode, when a large
     amount of data is deleted from the database file it leaves behind empty
     space, or "free" database pages. This means the database file might
     be larger than strictly necessary. Running VACUUM to rebuild the 
     database reclaims this space and reduces the size of the database file.

    Frequent inserts, updates, and deletes can cause the database file
     to become fragmented - where data for a single table or index is scattered 
     around the database file. Running VACUUM ensures that each table and
     index is largely stored contiguously within the database file. In some
     cases, VACUUM may also reduce the number of partially filled pages in
     the database, reducing the size of the database file further.

    When content is deleted from an SQLite database, the content is not
     usually erased but rather the space used to hold the content is marked as
     being available for reuse.  This can allow deleted content to be recovered
     by a hacker or by forensic analysis.  Running VACUUM will clean the database
     of all traces of deleted content, thus preventing an adversary from recovering
     deleted content.  Using VACUUM in this way is an alternative to setting
     PRAGMA secure_delete=ON. 

    Normally, the database page_size and whether or not the database
     supports auto_vacuum must be configured before the database file is
     actually created. However, when not in write-ahead log mode, the 
     page_size and/or auto_vacuum properties of an existing database may be
     changed by using the page_size  and/or 
     pragma auto_vacuum pragmas and then immediately VACUUMing
     the database. When in write-ahead log mode, only the auto_vacuum
  b£       9Å[1The ON CONFLICT ClauseThe ON CONFLICT clause is a
non-standard extension specific to SQLite 
that can appear in many other SQL commands.
It is given its own section in this document because it is not
part of standard SQL and therefore might not be familiar.

The ON CONFLICT clause described here has been a part of
SQLite since before version 3.0.0 (2004-06-18).  The phrase
"ON&nbsp;CONFLICT" is also part of UPSERT, which is an extension
to INSERT added in version 3.24.0 (2018`   support property can be changed using VACUUM.


By default, VACUUM operates on the main database.
Attached databases can be vacuumed by appending the appropriate
schema-name to the VACUUM statement.

Compatibility Warning: The ability to vacuum attached databases was
added in version 3.15.0 (2016-10-14).  Prior to that, a 
schema-name added to the
VACUUM statement would be silently ignored and the "main" schema would be
vacuumed.



2.1. VACUUM with an INTO clause

If the INTO clause is included, then the original database file is
unchanged and a new database is created in a file named by the
argument to the INTO clause.  The new database will contain the same
logical content as the original database, fully vacuumed.


The VACUUM command with an INTO clause is an alternative to the
backup API for generating backup copies of a live database.
The advantage of using VACUUM INTO is that the resulting backup
database is minimal in size and hence the amount of filesystem
I/O may be reduced.  Also, all deleted content is purged from the
backup, leaving behind no forensic traces.  On the other hand,
the backup API uses fewer CPU cycles and can be executed
incrementally.


The filename in the INTO clause can be an arbitrary SQL expression
that evaluates to a string.
The file named by the INTO clause must not previously exist, or
else it must be an empty file, or the VACUUM INTO command will
fail with an error.


The argument to INTO can be a URI filename if URI filenames
are enabled.
URL filenames are enabled if any of the following are true:

 The SQLite library was compiled with -DSQLITE_USE_URI=1.
 The sqlite3_config(SQLITE_CONFIG_URI,1) interfaces was
     invoked at start-time.
 The database connection that is running the VACUUM INTO
     statement was originally opened using the
     SQLITE_OPEN_URI flag.



The VACUUM INTO command is transactional in the sense that
the generated output database is a consistent snapshot of the
original database.  However, if the VACUUM INTO command is
interrupted by an unplanned shutdown or power lose, then
the generated output database might be incomplete and corrupt.
Also, SQLite does not invoke fsync() or FlushFileBuffers()
on the generated database to ensure that it has reached
non-volatile storage before completing.




3. How VACUUM works

The VACUUM command works by copying the contents of the database into
a temporary database file and then overwriting the original with the 
contents of the temporary file. When overwriting the original, a rollback
journal or write-ahead log WAL file is used just as it would be for any
other database transaction. This means that when VACUUMing a database, 
as much as twice the size of the original database file is required in free
disk space.

The VACUUM INTO command works the same way except that it uses the file
named on the INTO clause in place of the temporary database and omits the
step of copying the vacuumed database back over top of the original database.

The VACUUM command may change the ROWIDs of entries in any
tables that do not have an explicit INTEGER PRIMARY KEY.


A VACUUM will fail if there is an open transaction on the database
connection that is attempting to run the VACUUM.  Unfinalized SQL
statements typically hold a read transaction open, so the VACUUM
might fail if there are unfinalized SQL statements on the same connection.
VACUUM (but not VACUUM INTO) is a write operation and so if another
database connection is holding a lock that prevents writes, then
the VACUUM will fail.

An alternative to using the VACUUM command to
reclaim space after data has been deleted is auto-vacuum mode, enabled using
the auto_vacuum pragma. When auto_vacuum is enabled for a database
free pages may be reclaimed after deleting data, causing the file to shrink,
without rebuilding the entire database using VACUUM.  However, using
auto_vacuum can lead to extra database file fragmentation.  And auto_vacuum
does not compact partially filled pages of the database as VACUUM does.


This page last modified on  2022-06-15 00:04:17 UTClang_vacuum.html
œm  E¸{/Built-in Aggregate Functions1. Syntax


 
 



 
 



 
 




 
 



 
 




 
 





 
 




 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 






 
 



 
 






 
 






The aggregate functions shown below are available by default.  Additional
aggregate functions written in C may be added using the 
sqlite3_create_function()
API.


In any aggregate function that takes a single argument, that argument
can be preceded by the keyword DISTINCT.  In such cases, duplicate
elements are filtered before being passed into the aggregate function.
For example, the function "count(distinct X)" will return the number
of distinct values of column X instead of the total number of non-null
values in column X.





If a FILTER clause is provided, then only rows for which the expr is
true are included in the aggregate.




2. List of built-in aggregate functions



avg(X)
count(*)
count(X)
group_concat(X)
group_concat(X,Y)
max(X)
min(X)
sum(X)
total(X)




3. Descriptions of built-in aggregate functions



avg(X)
  The avg() function
  returns the average value of all non-NULL X within a
  group.  String and BLOB values that do not look like numbers are
  interpreted as 0.
  The result of avg() is always a floating point value whenever
  there is at least one non-NULL input even if all
  inputs are integers.  The result of avg() is NULL if and only if
  there are no non-NULL inputs.  


count(X)count(*)
  The count(X) function returns
  a count of the number of times
  that X is not NULL in a group.  The count(*) function
  (with no arguments) returns the total number of rows in the group.


group_concat(X)group_concat(X,Y)
  The group_concat() function returns
  a string which is the concatenation of
  all non-NULL values of X.  If parameter Y is present then
  it is used as the separator
  between instances of X.  A comma (",") is used as the separator
  if Y is omitted.  The order of the concatenated elements is
  arbitrary.


max(X)
  The max() aggregate function
  returns the maximum value of all values in the group.
  The maximum value is the value that would be returned last in an
  ORDER BY on the same column.  Aggregate max() returns NULL 
  if and only if there are no non-NULL values in the group.


min(X)
  The min() aggregate function
  returns the minimum non-NULL value of all values in the group.
  The minimum value is the first non-NULL value that would appear
  in an ORDER BY of the column.
  Aggregate min() returns NULL if and only if there are no non-NULL
  values in the group.


sum(X)total(X)
  The sum() and total() aggregate functions
  return the sum of all non-NULL values in the group.
  If there are no non-NULL input rows then sum() returns
  NULL but total() returns 0.0.
  NULL is not normally a helpful result for the sum of no rows
  but the SQL standard requires it and most other
  SQL database engines implement sum() that way so SQLite does it in the
  same way in order to be compatible.   The non-standard total() function
  is provided as a convenient way to work around this design problem
  in the SQL language.

  The result of total() is always a floating point value.
  The result of sum() is an integer value if all non-NULL inputs are integers.
  If any input to sum() is neither an integer nor a NULL,
  then sum() returns a floating point value
  which is an approximation of the mathematical sum.

  Sum() will throw an "integer overflow" exception if all inputs
  are integers or NULL
  and an integer overflow occurs at any point during the computation.
  Total() never throws an integer overflow.



This page last modified on  2022-01-20 21:38:08 UTClang_aggfunc.htmlpressions of a DO UPDATE refer to the original
unchanged value of the column, before the attempted INSERT.  To use the
value that would have been inserted had the constraint not failed,
add the special "excluded." table qualifier to the column name.

2.1. Examples

Some examples will help illustrate how UPSERT works:


CREATE TABLE vocabulary(word TEXT PRIMARY KEY, count INT DEFAULT 1);
INSERT INTO vocabulary(word) VALUES('jovial')
  ON CONFLICT(word) DO UPDATE SET count=count+1;


The upsert above inserts the new vocabulary word "jovial" if that
word is not already in the dictionary, or if it is already in the
dictionary, it increments the counter.  The "count+1" expression
could also be written as "vocabulary.count".  PostgreSQL requires the
second form, but SQLite accepts either.


CREATE TABLE phonebook(name TEXT PRIMARY KEY, phonenumber TEXT);
INSERT INTO phonebook(name,phonenumber) VALUES('Alice','704-555-1212')
  ON CONFLICT(name) DO UPDATE SET phonenumber=excluded.phonenumber;


In the second example, the expression in the DO UPDATE clause is
of the form "excluded.phonenumber".  The "excluded." prefix causes the
"phonenumber" to refer to the value for phonenumber that would have been
inserted had there been no conflict.  Hence, the effect of the upsert
is to insert a phonenumber of Alice if none exists, or to overwrite
any prior phonenumber for Alice with the new one.

Note that the DO UPDATE clause acts only on the single row
that experienced the constraint error during INSERT.  It is not
necessary to include a WHERE clause that restricts the action
to that one row.  The only use for the WHERE clause at
the end of the DO UPDATE is to optionally change the DO UPDATE
into a no-op depending on the original and/or new values.
For example:


CREATE TABLE phonebook2(
  name TEXT PRIMARY KEY,
  phonenumber TEXT,
  validDate DATE
);
INSERT INTO phonebook2(name,phonenumber,validDate)
  VALUES('Alice','704-555-1212','2018-05-08')
  ON CONFLICT(name) DO UPDATE SET
    phonenumber=excluded.phonenumber,
    validDate=excluded.validDate
  WHERE excluded.validDate>phonebook2.validDate;


In this last example, the phonebook2 entry is only
updated if the validDate for the newly inserted value is
newer than the entry already in the table.  If the table already
contains an entry with the same name and a current validDate,
then the WHERE clause causes the DO UPDATE to become a no-op.




2.2. Parsing Ambiguity

When the INSERT statement to which the UPSERT is attached
takes its values from a SELECT statement, there is a potential
parsing ambiguity.  The parser might not be able to tell if the
"ON" keyword is introducing the UPSERT or if it is the ON clause
of a join.  To work around this, the SELECT statement should always
include a WHERE clause, even if that WHERE clause is just
"WHERE true".

Ambiguous use of ON:


INSERT INTO t1 SELECT * FROM t2
ON CONFLICT(x) DO UPDATE SET y=excluded.y;


Ambiguity resolved using a WHERE clause:


INSERT INTO t1 SELECT * FROM t2 WHERE true
ON CONFLICT(x) DO UPDATE SET y=excluded.y;


3. Limitations

UPSERT does not currently work for virtual tables.

The conflict resolution algorithm for the update operation
of the DO UPDATE clause is always ABORT.  In other words, the behavior
is as if the DO UPDATE clause were actually written as
"DO UPDATE OR ABORT".  If the DO UPDATE clause encounters any
constraint violation, the entire INSERT statement rolls back and
halts.  This is true even if the DO UPDATE clause is
contained within an INSERT statement or a trigger that specifies some
other conflict resolution algorithm.

4. History

UPSERT syntax was added to SQLite with version 3.24.0 (2018-06-04).
The original implementation closely followed the PostgreSQL syntax in that
it only permitted a single ON CONFLICT clause and it required a
conflict target for on DO UPDATE.
The syntax was generalized to permit multiple ON CONFLICT clauses and
to allow DO UPDATE resolution without a conflict target in
SQLite version 3.35.0 (2021-03-12).
This page last modified on  2021-02-21 12:53:49 UTClang_upsert.html
¹î¹‚2      !„%3DROP INDEXThe DROP INDEX statement removes an index added
with the CREATE INDEX statement.  The index is completely removed from
the disk.  The only way to recover the index is to reenter the
appropriate CREATE INDEX command.

This page last modified on  2020-02-10 20:33:26 UTClang_dropindex.html°       ß]-UPSERT1. Syntax


 
 



 
 




 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 






 
 



 
 






 
 





2. Description

UPSERT is a clause added to INSERT that causes the
INSERT to behave as an UPDATE or a no-op if the INSERT would violate
a uniqueness constraint.
UPSERT is not standard SQL.  UPSERT in SQLite follows the
syntax established by PostgreSQL, with generalizations.

An UPSERT is an ordinary INSERT statement that is followed by
one or more ON CONFLICT clauses, as shown in the syntax diagram above.

The syntax in between the "ON CONFLICT" and "DO" keywords
is called the "conflict target".  The conflict target specifies a
uniqueness constraint that will trigger the upsert.  The conflict target
may be omitted on the last ON CONFLICT clause in the INSERT statement, but
is required for all other ON CONFLICT clauses.

If the insert operation would cause the conflict target uniqueness
constraint to fail, then the insert is omitted and
the corresponding DO NOTHING or DO UPDATE operation is performed instead.
The ON CONFLICT clauses are checked in the order specified.  If the last
ON CONFLICT clause omits the conflict target, then it will fire if any
uniqueness constraint fails which is not captured by prior ON CONFLICT clauses.

Only a single ON CONFLICT clause, specifically the first ON CONFLICT
clause with a matching conflict target, may run for each row of the INSERT.
When an ON CONFLICT clause fires, all subsequent ON CONFLICT clauses are
bypassed for that one row.


In the case of a multi-row insert, the upsert decision is made separately
for each row of the insert.

The UPSERT processing happens only for uniqueness constraints.
A "uniqueness constraint"
is an explicit UNIQUE or PRIMARY KEY constraint within
the CREATE TABLE statement, or a unique index.
UPSERT does not intervene for failed NOT NULL, CHECK,
or foreign key constraints
or for constraints that are implemented using triggers.

Column names in the exd
õåõâ:
;1ÄDate And Time Functions1. Overview


SQLite supports six date and time functions as follows:




 date(time-value, modifier, modifier, ...) 
 time(time-value, modifier, modifier, ...) 
 datetime(time-value, modifier, modifier, ...) 
 julianday(time-value, modifier, modifier, ...) 
 unixepoch(time-value, modifier, modifier, ...) 
 strftime(format, time-value, modifier, modifier, ...) 



All six date and time functions take an optional time value as an argument, followed
by zg’     £{/EXPLAIN1. Syntax

 

 


2. Description

An SQL statement can be preceded by the keyword "EXPLAIN" or
by the phrase "EXPLAIN QUERY PLAN".  Either modification causes the
SQL statement to behave as a query and to return information about
how the SQL statement would have operated if the EXPLAIN keyword or
phrase had been omitted.

The output from EXPLAIN and EXPLAIN QUERY PLAN is intended for
interactive analysis and troubleshooting only.  The details of the 
output format are subject to change from one release of SQLite to the next.
Applications should not use EXPLAIN or EXPLAIN QUERY PLAN since
their exact behavior is variable and only partially documented.

When the EXPLAIN keyword appears by itself it causes the statement
to behave as a query that returns the sequence of 
virtual machine instructions it would have used to execute the command had
the EXPLAIN keyword not been present. When the EXPLAIN QUERY PLAN phrase
appears, the statement returns high-level information regarding the query
plan that would have been used.

The EXPLAIN QUERY PLAN command is described in 
more detail here.

2.1. EXPLAIN operates at run-time, not at prepare-time

The EXPLAIN and EXPLAIN QUERY PLAN prefixes affect the behavior of
running a prepared statement using sqlite3_step().  The process of
generating a new prepared statement using sqlite3_prepare() or similar
is (mostly) unaffected by EXPLAIN.  (The exception to the previous sentence
is that some special opcodes used by EXPLAIN QUERY PLAN are omitted when
building an EXPLAIN QUERY PLAN prepared statement, as a performance
optimization.)

This means that actions that occur during sqlite3_prepare() are
unaffected by EXPLAIN.



Some PRAGMA statements do their work during sqlite3_prepare() rather
than during sqlite3_step().  Those PRAGMA statements are unaffected
by EXPLAIN.  They operate the same with or without the EXPLAIN prefix.
The set of PRAGMA statements that are unaffected by EXPLAIN can vary
from one release to the next.  Some PRAGMA statements operate during
sqlite3_prepare() depending on their arguments.  For consistent
results, avoid using EXPLAIN on PRAGMA statements.


The authorizer callback is invoked regardless of the presence of
EXPLAIN or EXPLAIN QUERY PLAN.

This page last modified on  2020-02-10 20:33:26 UTClang_explain.htmlhero or more modifiers.
The strftime() function also takes a format string as its first argument.



Date and time values can be stored as

 text in a subset of the ISO-8601 format,
 numbers representing the Julian day, or
 numbers representing the number of seconds since (or before) 1970-01-01 00:00:00 UTC
     (the unix timestamp).



All of the date time functions access time-values in any of the above time formats.


The date() function returns the date as text in this format: YYYY-MM-DD.


The time() function returns the time as text in this format: HH:MM:SS.


The datetime() function returns the date and time as text in their same formats: YYYY-MM-DD HH:MM:SS.


The julianday() function returns the 
Julian day - the
fractional number of days since noon in Greenwich on November 24, 4714 B.C. 
(Proleptic Gregorian calendar).




The unixepoch() function returns a unix timestamp - the number of seconds
since 1970-01-01 00:00:00 UTC.  The unixepoch() always returns an integer,
even if the input time-value has millisecond precision.


The strftime() routine returns the date formatted according to 
the format string specified as the first argument.
The format string supports the most common substitutions found in the 
strftime() function
from the standard C library plus two new substitutions, %f and %J.
The following is a complete list of valid strftime() substitutions:






 %d  day of month: 00
 %f  fractional seconds: SS.SSS
 %H  hour: 00-24 
 %j  day of year: 001-366
 %J  Julian day number (fractional)
 %m  month: 01-12
 %M  minute: 00-59
 %s  seconds since 1970-01-01
 %S  seconds: 00-59
 %w  day of week 0-6 with Sunday==0
 %W  week of year: 00-53
 %Y  year: 0000-9999
 %%  %




All other date and time functions can be expressed
in terms of strftime():




FunctionEquivalent (or nearly) strftime()
   date(...)        strftime('%Y-%m-%d', ...)
   time(...)        strftime('%H:%M:%S', ...)
   datetime(...)    strftime('%Y-%m-%d %H:%M:%S', ...)
   julianday(...)   strftime('%J', ...) -- note-1
   unixepoch(...)   strftime('%s', ...) -- note-1




The date(), time(), and datetime() functions all return text, and so their
strftime() equivalents are exact.  However (note-1) the julianday()
and unixepoch() functions return numeric values.  Their strftime() equivalents
return strings that is the text representation of the corresponding number.



The main reasons for providing functions other than strftime() are
for convenience and for efficiency. The julianday() and unixepoch()
functions return real and integer values respectively, and do not
incur the format conversion costs or inexactitude resulting from use
of the '%J' or '%s' format specifiers with the strftime() function.


2. Time Values

A time value can be in any of the following formats shown below.
The value is usually a string, though it can be an integer or floating
point number in the case of format 12.


 YYYY-MM-DD
 YYYY-MM-DD HH:MM
 YYYY-MM-DD HH:MM:SS
 YYYY-MM-DD HH:MM:SS.SSS
 YYYY-MM-DDTHH:MM
 YYYY-MM-DDTHH:MM:SS
 YYYY-MM-DDTHH:MM:SS.SSS
 HH:MM
 HH:MM:SS
 HH:MM:SS.SSS
 now
 DDDDDDDDDD



In formats 5 through 7, the "T" is a literal character separating 
the date and the time, as required by 
ISO-8601. 
Formats 8 through 10 that specify only a time assume a date of 
2000-01-01. Format 11, the string 'now', is converted into the 
current date and time as obtained from the xCurrentTime method
of the sqlite3_vfs object in use.
The 'now' argument to date and time functions always returns exactly the
same value for multiple invocations within the same sqlite3_step() call.
Universal Coordinated Time (UTC) is used. 
Format 12 is the 
Julian day number
expressed as an integer or floating point value.
Format 12 might also be interpreted as a unix timestamp if it is immediately followed
either the 'auto' or 'unixepoch' modifier.



Formats 2 through 10 may be optionally followed by a timezone indicator of the form
"&#91;+-&#93;HH:MM" or just "Z".  The date and time functions use UTC or "zulu"
time internally, and so the "Z" suffix is a no-op.  Any non-zero "HH:MMi" suffix is
subtracted from the indicated date and time in order to compute zulu time.
For example, all of the following time values are equivalent:



2013-10-07 08:23:19.120
2013-10-07T08:23:19.120Z
2013-10-07 04:23:19.120-04:00
2456572.84952685



In formats 4, 7, and 10, the fractional seconds value SS.SSS can have
one or more digits following the decimal point.  Exactly three digits are
shown in the examples because only the first three digits are significant
to the result, but the input string can have fewer or more than three digits
and the date/time functions will still operate correctly.
Similarly, format 12 is shown with 10 significant digits, but the date/time
functions will really accept as many or as few digits as are necessary to
represent the Julian day number.



The time-value (and all modifiers) may be omitted, in which case a time
value of 'now' is assumed.



3. Modifiers

The time value can be followed by zero or more modifiers that 
alter date and/or time. Each modifier
is a transformation that is applied to the time value to its left.
Modifiers are applied from left to right; order is important.
The available 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 day
 weekday N
 unixepoch
 julianday
 auto
 localtime
 utc 


The first six modifiers (1 through 6) 
simply add the specified amount of time to the date and time 
specified by the arguments to the left.
The 's' character at the end of the modifier names is optional.
Note that "&plusmn;NNN months" works by rendering the original date into
the YYYY-MM-DD format, adding the &plusmn;NNN to the MM month value, then
normalizing the result.  Thus, for example, the date 2001-03-31 modified
by '+1 month' initially yields 2001-04-31, but April only has 30 days
so the date is normalized to 2001-05-01.  A similar effect occurs when
the original date is February 29 of a leapyear and the modifier is
&plusmn;N years where N is not a multiple of four.

The "start of" modifiers (7 through 9) shift the date backwards 
to the beginning of the subject month, year or day.

The "weekday" modifier advances the date forward, if necessary,
to the next date where the weekday number is N. Sunday is 0, Monday is 1,
and so forth.
If the date is already on the desired weekday, the "weekday" modifier
leaves the date unchanged.  

The "unixepoch" modifier (11) only works if it immediately follows 
a time value in the DDDDDDDDDD format. 
This modifier causes the DDDDDDDDDD to be interpreted not 
as a Julian day number as it normally would be, but as
Unix Time - the 
number of seconds since 1970.  If the "unixepoch" modifier does not
follow a time value of the form DDDDDDDDDD which expresses the number
of seconds since 1970 or if other modifiers
separate the "unixepoch" modifier from prior DDDDDDDDDD then the
behavior is undefined.
For SQLite versions before 3.16.0 (2017-01-02), 
the "unixepoch" modifier only works for
dates between 0000-01-01 00:00:00 and 5352-11-01 10:52:47 (unix times
of -62167219200 through 106751991167).



The "julianday" modifier must immediately follow the initial
time-value which must be of the form DDDDDDDDD.  Any other use of
the 'julianday' modifier is an error and causes the function to return NULL.
The 'julianday' modifier forces the time-value number to be interpreted
as a julian-day number.  As this is the default behavior, the 'julianday'
modifier is scarcely more than a no-op.  The only difference is that
adding 'julianday' forces the DDDDDDDDD time-value format, and causes
a NULL to be returned if any other time-value format is used.



The "auto" modifier must immediately follow the initial time-value.
If the time-value is numeric (the DDDDDDDDDD format) then the 'auto'
modifier causes the time-value to interpreted as either a julian day
number or a unix timestamp, depending on its magnitude.  If the value
is between 0.0 and 5373484.499999, then it is interpreted as a julian
day number (corresponding to dates between
-4713-11-24 12:00:00 and 9999-12-31 23:59:59, inclusive).  For numeric
values outside of the range of valid julian day numbers, but within 
the range of -210866760000 to 253402300799, the 'auto' modifier causes
the value to be interpreted as a unix timestamp.  Other numeric values
are out of range and cause a NULL return.  The 'auto' modifier is a no-op 
for text time-values.

The 'auto' modifier can be used to work with date/time values even in
cases where it is not known if the julian day number or unix timestamp
formats are in use.  The 'auto' modifier will automatically select the
appropriate format.  However, there is a region of ambiguity.  Unix
timestamps for the first 63 days of 1970 will be interpreted as julian
day numbers.  The 'auto' modifier is very useful when the dataset is
guaranteed to not contain any dates within that region, but should be
avoided for applications that might make use of dates in the opening
months of 1970.



The "localtime" modifier (14) assumes the time value to its left is in
Universal Coordinated Time (UTC) and adjusts that time
value so that it is in localtime.  If "localtime"
follows a time that is not UTC, then the behavior is undefined.
The "utc" modifier is the opposite of "localtime".  
"utc" assumes that the time value
to its left is in the local timezone and adjusts that time value to be in UTC.
If the time to the left is not in localtime, then the result of "utc" is
undefined.

4. Examples

Compute the current date.

SELECT date();

Compute the last day of the current month.

SELECT date('now','start of month','+1 month','-1 day');


Compute the date and time given a unix timestamp 1092941466.


    SELECT datetime(1092941466, 'unixepoch');
    SELECT datetime(1092941466, 'auto'); -- Does not work for early 1970!


Compute the date and time given a unix timestamp 1092941466, and 
compensate for your local timezone.


  SELECT datetime(1092941466, 'unixepoch', 'localtime');


Compute the current unix timestamp.


  SELECT unixepoch();
  SELECT strftime('%s');


Compute the number of days since the signing of the US Declaration
of Independence.


  SELECT julianday('now') - julianday('1776-07-04');


Compute the number of seconds since a particular moment in 2004:


  SELECT unixepoch() - unixepoch('2004-01-01 02:34:56');



Compute the date of the first Tuesday in October
for the current year.



  SELECT date('now','start of year','+9 months','weekday 2');


Compute the time since the unix epoch in seconds with
millisecond precision:


  SELECT (julianday('now') - 2440587.5)*86400.0;


5. Caveats And Bugs

The computation of local time depends heavily on the whim 
of politicians and is thus difficult to get correct for 
all locales. In this implementation, the standard C library 
function localtime_r() is used to assist in the calculation of 
local time.  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.

These functions only work for dates between 0000-01-01 00:00:00
and 9999-12-31 23:59:59 (julian day numbers 1721059.5 through 5373484.5).
For dates outside that range, the results of these
functions are undefined.

Non-Vista Windows platforms only support one set of DST rules. 
Vista only supports two. Therefore, on these platforms, 
historical DST calculations will be incorrect. 
For example, in the US, in 2007 the DST rules changed. 
Non-Vista Windows platforms apply the new 2007 DST rules 
to all previous years as well. Vista does somewhat better
getting results correct back to 1986, when the rules were also changed.

All internal computations assume the 
Gregorian calendar
system.  They also assume that every
day is exactly 86400 seconds in duration; no leap seconds are incorporated.
This page last modified on  2022-01-27 15:08:03 UTClang_datefunc.html
õõ  »_-INSERT1. Overview



 
 



 
 




 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 



 
 






 
 




 
 



 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 






 
 



 
 




 
 






The INSERT statement comes in three basic forms.  

INSERT INTO table VALUES(...);
The first form (with the "VALUES" keyword) creates one or more
new rows in
an existing table. If the column-name list after
table-name is omitted then the number
of values inserted into each row
must be the same as the number of columns in the table. In this case
the result of evaluating the left-most expression from each term of
the VALUES list is inserted into the left-most column of each new row,
and so forth for each subsequent expression. If a column-name
list is specified, then the number of values in each term of the
VALUE list must match the number of
specified columns. Each of the named columns of the new row is populated
with the results of evaluating the corresponding VALUES expression. Table
columns that do not appear in the column list are populated with the 
default column value (specified as part of the CREATE TABLE statement), or
with NULL if no default value is specified.

INSERT INTO table SELECT ...;
The second form of the INSERT statement contains a SELECT statement
instead of a VALUES clause. A new entry is inserted into the table for each
row of data returned by executing the SELECT statement. If a column-list is
specified, the number of columns in the result of the SELECT must be the same
as the number of items in the column-list. Otherwise, if no column-list is
specified, the number of columns in the result of the SELECT must be the same
as the number of columns in the table. Any SELECT statement, including
compound SELECTs and SELECT statements with ORDER BY and/or LIMIT clauses, 
may be used in an INSERT statement of this form.

To avoid a parsing ambiguity, the SELECT statement should always
contain a WHERE clause, even if that clause is simply "WHERE true",
if the  is present.  Without the WHERE clause, the
parser does not know if the token "ON" is part of a join constraint
on the SELECT, or the beginning of the .

INSERT INTO table DEFAULT VALUES;
The third form of an INSERT statement is with DEFAULT VALUES.
The INSERT ... DEFAULT VALUES statement inserts a single new row into the
named table. Each column of the new row is populated with its 
default value, or with a NULL if no default value is specified 
as part of the column definition in the CREATE TABLE statement.
The  is not supported after DEFAULT VALUES.




The initial "INSERT" keyword can be replaced by
"REPLACE" or "INSERT OR action" to specify an alternative
constraint conflict resolution algorithm to use during 
that one INSERT command.
For compatibility with MySQL, the parser allows the use of the
single keyword REPLACE as an 
alias for "INSERT OR REPLACE".

The optional "schema-name." prefix on the 
table-name
is supported for top-level INSERT statements only.  The table name must be
unqualified for INSERT statements that occur within CREATE TRIGGER statements.
Similarly, the "DEFAULT VALUES" form of the INSERT statement is supported for
top-level INSERT statements only and not for INSERT statements within
triggers.


The optional "AS alias" phrase provides an alternative
name for the table into which content is being inserted.  The alias name
can be used within WHERE and SET clauses of the UPSERT.  If there is no
, then the alias is pointless, but also
harmless.

See the separate UPSERT documentation for the additional trailing
syntax that can cause an INSERT to behave as an UPDATE if the INSERT would
otherwise violate a uniqueness constraint.  The upsert clause is not
allowed on an "INSERT ... DEFAULT VALUES".
This page last modified on  2020-09-25 17:27:11 UTClang_insert.htmlaction.  Instead of cancelling the transaction,
the ROLLBACK TO command restarts the transaction again at the beginning.
All intervening SAVEPOINTs are canceled, however.

The RELEASE command is like a COMMIT for a SAVEPOINT.
The RELEASE command causes all savepoints back to and including the 
most recent savepoint with a matching name to be removed from the 
transaction stack.  The RELEASE of an inner transaction
does not cause any changes to be written to the database file; it merely
removes savepoints from the transaction stack such that it is
no longer possible to ROLLBACK TO those savepoints.
If a RELEASE command releases the outermost savepoint, so
that the transaction stack becomes empty, then RELEASE is the same
as COMMIT.
The COMMIT command may be used to release all savepoints and
commit the transaction even if the transaction was originally started
by a SAVEPOINT command instead of a BEGIN command.

If the savepoint-name in a RELEASE command does not match any
savepoint currently in the transaction stack, then no savepoints are
released, the database is unchanged, and the RELEASE command returns
an error.

Note that an inner transaction might commit (using the RELEASE command)
but then later have its work undone by a ROLLBACK in an outer transaction.
A power failure or program crash or OS crash will cause the outer-most
transaction to rollback, undoing all changes that have occurred within
that outer transaction, even changes that have supposedly been "committed"
by the RELEASE command.  Content is not actually committed on the disk 
until the outermost transaction commits.

There are several ways of thinking about the RELEASE command:



Some people view RELEASE as the equivalent of COMMIT for a SAVEPOINT.
This is an acceptable point of view as long as one remembers that the
changes committed by an inner transaction might later be undone by a
rollback in an outer transaction.


Another view of RELEASE is that it merges a named transaction into its
parent transaction, so that the named transaction and its parent become
the same transaction.  After RELEASE, the named transaction and its parent
will commit or rollback together, whatever their fate may be.



One can also think of savepoints as
"marks" in the transaction timeline.  In this view, the SAVEPOINT command
creates a new mark, the ROLLBACK TO command rewinds the timeline back
to a point just after the named mark, and the RELEASE command
erases marks from the timeline without actually making any
changes to the database.





3. Transaction Nesting Rules

The last transaction started will be the first
transaction committed or rolled back.

The BEGIN command only works if the transaction stack is empty, or
in other words if there are no pending transactions.  If the transaction
stack is not empty when the BEGIN command is invoked, then the command
fails with an error.

The COMMIT command commits all outstanding transactions and leaves
the transaction stack empty.

The RELEASE command starts with the most recent addition to the
transaction stack and releases savepoints backwards 
in time until it releases a savepoint with a matching savepoint-name.
Prior savepoints, even savepoints with matching savepoint-names, are
unchanged.
If the RELEASE command causes the
transaction stack to become empty (if the RELEASE command releases the
outermost transaction from the stack) then the transaction commits.

The ROLLBACK command without a TO clause rolls backs all transactions
and leaves the transaction stack empty.

The ROLLBACK command with a TO clause rolls back transactions going
backwards in time back to the most recent SAVEPOINT with a matching name.
The SAVEPOINT with the matching name remains on the transaction stack,
but all database changes that occurred after that SAVEPOINT was created
are rolled back.  If the savepoint-name in a ROLLBACK TO command does not
match any SAVEPOINT on the stack, then the ROLLBACK command fails with an
error and leaves the state of the database unchanged.
This page last modified on  2020-02-10 17:23:44 UTClang_savepoint.html
¤§      Í]-DELETE1. Overview



 
 



 
 



 
 



 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 







 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 



 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 






 
 



 
 






 
 




 
 





The DELETE command removes records from the table identified by the
   .

If the WHERE clause is not present, all records in the table are deleted.
   If a WHERE clause is supplied, then only those rows for which the
   WHERE clause boolean expression is true are deleted.
   Rows for which the expression is false or NULL are retained.



2. Restrictions on DELETE Statements Within CREATE TRIGGER

The following restrictions apply to DELETE statements that occur within the
   body of a CREATE TRIGGER statement:


  The table-name specified as part of a 
    DELETE statement within
    a trigger body must be sÈ!
+ƒ)The WITH Clause1. Overview


 
 



 
 




 
 



 
 




 
 




 
 



 
 




 
 




 
 



 
 





 
 




 
 



 
 






 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 







Common Table Expressions or CTEs act like temporary views that exist
only for the duration of a single SQL statement.  There are two kinds of
common table expressions: "ordinary" and "recursive". Ordinary 
common table expressions are helpful for making
queries easier to understand by factoring
subqueries out of the main SQL statement.
Recursive common table expressions
provide the ability to do hierarchical or
recursive queries of trees and graphs, a capability
that is not otherwise available in the SQL language.

All common table expressions (ordinary and recursive) are 
created by prepending a WITH clause in front of a SELECT, INSERT, DELETE,
or UPDATE statement.  A single WITH clause can specify one or more
common table expressions, some of which are ordinary and some of which
are recursive.



2. Ordinary Common Table Expressions

An ordinary common table em¦       !Ëa3Savepoints1. Syntax



 
 




 
 




 
 




2. Savepoints

 SAVEPOINTs are a method of creating transactions, similar to
BEGIN and COMMIT, except that the SAVEPOINT and RELEASE commands
are named and may be nested.

 The SAVEPOINT command starts a new transaction with a name.
The transaction names need not be unique.
A SAVEPOINT can be started either within or outside of
a BEGIN...COMMIT.  When a SAVEPOINT is the outer-most savepoint
and it is not within a BEGIN...COMMIT then the behavior is the
same as BEGIN DEFERRED TRANSACTION.

The ROLLBACK TO command reverts the state of the database back to what
it was just after the corresponding SAVEPOINT.  Note that unlike that
plain ROLLBACK command (without the TO keyword) the ROLLBACK TO command
does not cancel the transknxpression works as if it were a view that
exists for the duration of a single statement.  Ordinary common table
expressions are useful for factoring out subqueries and making the overall
SQL statement easier to read and understand.

A WITH clause can contain ordinary common table expressions even if
it includes the RECURSIVE keyword.  The use of RECURSIVE does not force
common table expressions to be recursive.



3. Recursive Common Table Expressions

A recursive common table expression can be used to write a query that
walks a tree or graph.  A recursive common table expression has the same
basic syntax as an ordinary common table expression, but with the following
additional attributes:


 The "" must be a compound select.  That is to say,
     the CTE body must be two or more individual SELECT statements
     separated by compound operators like UNION, UNION ALL, INTERSECT,
     or EXCEPT.
 One or more of the individual SELECT statements that make up
     the compound must be
     "recursive".  A SELECT statement is a recursive if
     its FROM clause contains exactly one reference to the
     the CTE table (the table named on the left-hand side of the
     AS clause).
 One or more of the SELECT statements in the compound must be
     non-recursive.
 All non-recursive SELECT statements must occur before any
     recursive SELECT statements.
 The recursive SELECT statements must be separated from the
     non-recursive SELECT statements
     and from each other by the UNION or UNION ALL operators.
     If there are two or more recursive SELECT statements, they all must
     be separated from each other using the same operator that separates
     the first recursive SELECT from the last non-recursive SELECT statement.
 Recursive SELECT statements may not use
     aggregate functions or window functions.     


To put it another way, a recursive common table expression must
look something like the following:



 
 



 
 





In the diagram above, initial-select means one or more
non-recursive SELECT statements and recursive-select means
one or more recursive SELECT statements.  The most common case is for there
to be exactly one initial-select and exactly one
recursive-select but more than one of each is allowed.

Call the table named by the  in a recursive
common table expression the "recursive table".
In the  bubble diagram above, the recursive
table must appear exactly once in the FROM clause of each
top-level SELECT statement in the recursive-select
and must not appear anywhere else in either the
initial-select or the
recursive-select, including subqueries.
The initial-select may be
a compound select, but it may not include an ORDER BY, LIMIT, or OFFSET.
The recursive-select may also be a compound select with
the restriction that all elements of that compound must be separated by
the same UNION or UNION ALL operator that separates
initial-select from recursive-select.
The recursive-select is allowed to include an
ORDER BY, LIMIT, and/or OFFSET but may not use
aggregate functions or window functions.

The ability for the recursive-select to be a compound
was added in version 3.34.0 (2020-12-01).  In earlier versions of
SQLite, the recursive-select could only be a single
simple SELECT statement.

The basic algorithm for computing the content of the recursive table
is as follows:


 Run the initial-select and add the results to a queue.
 While the queue is not empty:

 Extract a single row from the queue.
 Insert that single row into the recursive table
 Pretend that the single row just extracted is the only
     row in the recursive table and run the recursive-select,
     adding all results to the queue.



The basic procedure above may modified by the following additional rules:



  If a UNION operator connects the initial-select with the
  recursive-select, then only add rows to the queue if 
  no identical row has
  been previously added to the queue.  Repeated rows are discarded before being
  added to the queue even if the repeated rows have already been extracted
  from the queue by the recursion step.  oIf the operator is UNION ALL,
  then all rows generated by both the initial-select and the
  recursive-select are always added to the queue even if
  they are repeats.
  When determining if a row is repeated, NULL values compare
  equal to one another and not equal to any other value.

  The LIMIT clause, if present, determines the maximum number of rows that
  will ever be added to the recursive table in step 2b.
  Once the limit is reached, the recursion stops.
  A limit of zero means that no rows are ever added to the
  recursive table, and a negative limit means an unlimited number of rows
  may be added to the recursive table.

  The OFFSET clause, if it is present and has a positive value N, prevents the
  first N rows from being added to the recursive table.
  The first N rows are still processed
  by the recursive-select &mdash; they
  just are not added to the recursive table.  Rows are not counted toward
  fulfilling the LIMIT until all OFFSET rows have been skipped.

  If an ORDER BY clause is present, it determines the order in which rows
  are extracted from the queue in step 2a.  If there is no ORDER BY clause,
  then the order in which rows are extracted is undefined.  (In the current
  implementation, the queue becomes a FIFO if the ORDER BY clause is omitted,
  but applications should not depend on that fact since it might change.)




3.1. Recursive Query Examples

The following query returns all integers between 1 and 1000000:


WITH RECURSIVE
  cnt(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM cnt WHERE x&lt;1000000)
SELECT x FROM cnt;


Consider how this query works.  The initial-select
runs first and returns a single row
with a single column "1".  This one row is added to the queue.  In
step 2a, that one row is extracted from the queue and added to "cnt".
Then the recursive-select is run in accordance with step 2c generating
a single new row with value "2" to add to the queue.  The queue still
has one row, so step 2 repeats.  The "2" row is extracted and added to the
recursive table by steps 2a and 2b.  Then the row containing 2 is used 
as if it were the complete content of the recursive table and the 
recursive-select is run again, resulting in a row with value "3" being added
to the queue.  This repeats 999999 times until finally at step 2a the
only value on the queue is a row containing 1000000.  That row is
extracted and added to the recursive table.  But this time, the
WHERE clause causes the recursive-select to return no rows, so the
queue remains empty and the recursion stops.

Optimization note:
In the discussion above, statements like "insert the row into
the recursive table" should be understood conceptually, not literally.
It sounds as if SQLite is accumulating a huge table
containing one million rows, then going back and scanning that table
from top to bottom to generate the result.  What really happens
is that the query optimizer sees that values in the
"cnt" recursive table are only used once.  So as each row is added to
the recursive table, that row is immediately returned as a result of the main
SELECT statement and then discarded.  SQLite does not accumulate
a temporary table containing a million rows.  Very little memory is
needed to run the above example.  However, if the example had used
UNION instead of UNION ALL, then SQLite would have had to keep around
all previously generated content in order to check for duplicates.
For this reason, programmers should strive to use UNION ALL instead
of UNION when feasible.

Here is a variation on the previous example:


WITH RECURSIVE
  cnt(x) AS (
     SELECT 1
     UNION ALL
     SELECT x+1 FROM cnt
      LIMIT 1000000
  )
SELECT x FROM cnt;


There are two differences in this variation.  The initial-select is
"SELECT 1" instead of "VALUES(1)".  But those are just different
syntaxes for saying exactly the same thing.  The other change is that the
recursion is stopped by a LIMIT rather than a WHERE clause.  The use of
LIMIT means that when the one-millionth row is added to the "cnt" table
(and returned by the main SELECT, thanks to the qpuery optimizer)
then the recursion stops immediately regardless of how many rows might be
left in the queue.  On more complex queries, it can sometimes be
difficult to ensure that the WHERE clause will eventually cause the
queue to drain and the recursion to terminate.  But the LIMIT clause will
always stop the recursion.  So it is good practice to always include a
LIMIT clause as a safety if an upper bound on the size of the recursion 
is known.



3.2. Hierarchical Query Examples

Consider a table that describes the members of an organization as
well as the chain-of-command within that organization:


CREATE TABLE org(
  name TEXT PRIMARY KEY,
  boss TEXT REFERENCES org,
  height INT,
  -- other content omitted
);


Every member in the organization has a name, and most members have
a single boss.  (The head of the whole organization has a NULL
"boss" field.) The rows of the "org" table form a tree.

Here is a query that computes the average height over everyone
in Alice's organization, including Alice:


WITH RECURSIVE
  works_for_alice(n) AS (
    VALUES('Alice')
    UNION
    SELECT name FROM org, works_for_alice
     WHERE org.boss=works_for_alice.n
  )
SELECT avg(height) FROM org
 WHERE org.name IN works_for_alice;


The next example uses two 
common table expressions in a single WITH clause.  
The following table records a family tree:


CREATE TABLE family(
  name TEXT PRIMARY KEY,
  mom TEXT REFERENCES family,
  dad TEXT REFERENCES family,
  born DATETIME,
  died DATETIME, -- NULL if still alive
  -- other content
);


The "family" table is similar to the earlier "org" table except that 
now there are two parents to each member.
We want to know all living ancestors of Alice, from oldest to youngest.
An ordinary common table expression, "parent_of", is defined first.  That
ordinary CTE is a view that can be used to find all parents of any
individual.  That ordinary CTE is then used in the "ancestor_of_alice"
recursive CTE.  The recursive CTE is then used in the final query:


WITH RECURSIVE
  parent_of(name, parent) AS
    (SELECT name, mom FROM family UNION SELECT name, dad FROM family),
  ancestor_of_alice(name) AS
    (SELECT parent FROM parent_of WHERE name='Alice'
     UNION ALL
     SELECT parent FROM parent_of JOIN ancestor_of_alice USING(name))
SELECT family.name FROM ancestor_of_alice, family
 WHERE ancestor_of_alice.name=family.name
   AND died IS NULL
 ORDER BY born;




3.3. Queries Against A Graph

Suppose you have an undirected graph where each node is
identified by an integer and edges are defined by a table like
this:


CREATE TABLE edge(aa INT, bb INT);
CREATE INDEX edge_aa ON edge(aa);
CREATE INDEX edge_bb ON edge(bb);


The indexes are not required, but they do help performance
for large graphs.
To find all nodes of the graph that are connected to
node 59, use a query similar to the following:


WITH RECURSIVE nodes(x) AS (
   SELECT 59
   UNION
   SELECT aa FROM edge JOIN nodes ON bb=x
   UNION
   SELECT bb FROM edge JOIN nodes ON aa=x
)
SELECT x FROM nodes;



The initial-select in this case is the simple query
"SELECT 59".  This establishes the base case.  The
recursive-select consists of the other two
SELECT statements.  The first recursive SELECT follows edges
in the bb-to-aa direction and the second recursive SELECT follows
edges in the aa-to-bb direction.  UNION is used instead of
UNION ALL to prevent the recursion from entering an infinite
loop if the graph contains cycles.


Here is a real-world example of using a graph query against a
directed graph:
A version control system (VCS) will typically store the evolving
versions of a project as a directed acyclic graph (DAG).  Call each
version of the project a "checkin".  A single
checkin can have zero or more parents.  Most checkins (except the
first) have a single parent, but in the case of a merge, a checkin
might have two or three or more parents.  A schema to keep track of
checkins and the order in which they occur might look something like
this:


CREATE TABLE checkin(
  id INTEGER PRIMARY KEY,
  mtime INTEGER -- timestamp when tqhis checkin occurred
);
CREATE TABLE derivedfrom(
  xfrom INTEGER NOT NULL REFERENCES checkin, -- parent checkin
  xto INTEGER NOT NULL REFERENCES checkin,   -- derived checkin
  PRIMARY KEY(xfrom,xto)
);
CREATE INDEX derivedfrom_back ON derivedfrom(xto,xfrom);


This graph is acyclic.  And we assume that the mtime of every
child checkin is no less than the mtime of all its parents.  But
unlike the earlier examples, this graph might have multiple paths of
differing lengths between any two checkins.

We want to know the twenty most recent ancestors in time (out of
the thousands and thousands of ancestors in the whole DAG) for
checkin "@BASELINE".  (A query similar to this is used
by the Fossil VCS to
show the N most recent ancestors of a checkin.  For example:
http://www.sqlite.org/src/timeline?p=trunk&n=30.)


WITH RECURSIVE
  ancestor(id,mtime) AS (
    SELECT id, mtime FROM checkin WHERE id=@BASELINE
    UNION
    SELECT derivedfrom.xfrom, checkin.mtime
      FROM ancestor, derivedfrom, checkin
     WHERE ancestor.id=derivedfrom.xto
       AND checkin.id=derivedfrom.xfrom
     ORDER BY checkin.mtime DESC
     LIMIT 20
  )
SELECT * FROM checkin JOIN ancestor USING(id);



The "ORDER BY checkin.mtime DESC" term in the recursive-select makes
the query run much faster by preventing it from following
branches that merge checkins
from long ago.  The ORDER BY forces the recursive-select to focus
on the most recent checkins, the ones we want.  Without the ORDER BY
on the recursive-select, one would be forced to compute the complete set of
thousands of ancestors, sort them all by mtime, then take the top twenty.
The ORDER BY essentially sets up a priority queue that
forces the recursive query to look at the most recent ancestors first,
allowing the use of a LIMIT clause to restrict the scope of the
query to just the checkins of interest.



3.4. Controlling Depth-First Versus Breadth-First Search Of a Tree
Using ORDER BY

An ORDER BY clause on the recursive-select can be used to control
whether the search of a tree is depth-first or breadth-first.  To
illustrate, we will use a variation on the "org" table from an example
above, without the "height" column, and with some real data inserted:


CREATE TABLE org(
  name TEXT PRIMARY KEY,
  boss TEXT REFERENCES org
) WITHOUT ROWID;
INSERT INTO org VALUES('Alice',NULL);
INSERT INTO org VALUES('Bob','Alice');
INSERT INTO org VALUES('Cindy','Alice');
INSERT INTO org VALUES('Dave','Bob');
INSERT INTO org VALUES('Emma','Bob');
INSERT INTO org VALUES('Fred','Cindy');
INSERT INTO org VALUES('Gail','Cindy');


Here is a query to show the tree structure in a breadth-first pattern:


WITH RECURSIVE
  under_alice(name,level) AS (
    VALUES('Alice',0)
    UNION ALL
    SELECT org.name, under_alice.level+1
      FROM org JOIN under_alice ON org.boss=under_alice.name
     ORDER BY 2
  )
SELECT substr('..........',1,level*3) || name FROM under_alice;


The "ORDER BY 2" (which means the same as "ORDER BY under_alice.level+1")
causes higher levels in the organization chart (with smaller "level" values)
to be processed first, resulting in a breadth-first search.  The output is:


Alice
...Bob
...Cindy
......Dave
......Emma
......Fred
......Gail


But if we change the ORDER BY clause to add the "DESC" modifier, that will
cause lower levels in the organization (with larger "level" values) to be
processed first by the recursive-select, resulting in a depth-first search:


WITH RECURSIVE
  under_alice(name,level) AS (
    VALUES('Alice',0)
    UNION ALL
    SELECT org.name, under_alice.level+1
      FROM org JOIN under_alice ON org.boss=under_alice.name
     ORDER BY 2 DESC
  )
SELECT substr('..........',1,level*3) || name FROM under_alice;


The output of this revised query is:


Alice
...Bob
......Dave
......Emma
...Cindy
......Fred
......Gail


When the ORDER BY clause is omitted from the recursive-select, the
queue behaves as a FIFO, which results in a breadth-first search.




3.5. Outlandish Recursive Query Examples

The following query computes an approximation of the Mandelbrot Set
and outpurts the result as ASCII-art:


WITH RECURSIVE
  xaxis(x) AS (VALUES(-2.0) UNION ALL SELECT x+0.05 FROM xaxis WHERE x&lt;1.2),
  yaxis(y) AS (VALUES(-1.0) UNION ALL SELECT y+0.1 FROM yaxis WHERE y&lt;1.0),
  m(iter, cx, cy, x, y) AS (
    SELECT 0, x, y, 0.0, 0.0 FROM xaxis, yaxis
    UNION ALL
    SELECT iter+1, cx, cy, x*x-y*y + cx, 2.0*x*y + cy FROM m 
     WHERE (x*x + y*y) &lt; 4.0 AND iter&lt;28
  ),
  m2(iter, cx, cy) AS (
    SELECT max(iter), cx, cy FROM m GROUP BY cx, cy
  ),
  a(t) AS (
    SELECT group_concat( substr(' .+*#', 1+min(iter/7,4), 1), '') 
    FROM m2 GROUP BY cy
  )
SELECT group_concat(rtrim(t),x'0a') FROM a;


In this query, the "xaxis" and "yaxis" CTEs define the grid of points for
which the Mandelbrot Set will be approximated.  Each row in the
"m(iter,cx,cy,x,y)" CTE means that after "iter" iterations, the Mandelbrot
iteration starting at cx,cy has reached point x,y.  The number of iterations
in this example is limited to 28 (which severely limits the resolution of
the computation, but is sufficient for low-resolution ASCII-art output).
The "m2(iter,cx,cy)" CTE holds the maximum number of iterations reached when
starting at point cx,cy.
Finally, each row in the "a(t)" CTE holds a string 
which is a single line of the output ASCII-art.
The SELECT statement at the end just queries the "a" CTE to
retrieve all lines of ASCII-art, one by one.

Running the query above in an SQLite command-line shell results
in the following output:


                                    ....#
                                   ..#*..
                                 ..+####+.
                            .......+####....   +
                           ..##+*##########+.++++
                          .+.##################+.
              .............+###################+.+
              ..++..#.....*#####################+.
             ...+#######++#######################.
          ....+*################################.
 #############################################...
          ....+*################################.
             ...+#######++#######################.
              ..++..#.....*#####################+.
              .............+###################+.+
                          .+.##################+.
                           ..##+*##########+.++++
                            .......+####....   +
                                 ..+####+.
                                   ..#*..
                                    ....#
                                    +.




This next query solves a Sudoku puzzle.  The state of the puzzle is
defined by an 81-character string formed by reading entries from the
puzzle box row by row from left to right and then from top to bottom.
Blank squares in the puzzle are denoted by a "." character.  
Thus the input string:


53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79


Corresponds to a puzzle like this:



53  7   
6  195  
 98    6
8   6   3
4  8 3  1
7   2   6
 6    28
   419  5
    8  79



This is the query that solves the puzzle:


WITH RECURSIVE
  input(sud) AS (
    VALUES('53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79')
  ),
  digits(z, lp) AS (
    VALUES('1', 1)
    UNION ALL SELECT
    CAST(lp+1 AS TEXT), lp+1 FROM digits WHERE lp&lt;9
  ),
  x(s, ind) AS (
    SELECT sud, instr(sud, '.') FROM input
    UNION ALL
    SELECT
      substr(s, 1, ind-1) || z || substr(s, ind+1),
      instr( substr(s, 1, ind-1) || z || substr(s, ind+1), '.' )
     FROM x, digits AS z
    WHERE ind>0
      AND NOT EXISTS (
            SELECT 1
              FROM digits AS lp
             WHERE z.z = substr(s, ((ind-1)/9)*9 + lp, 1)
                OR z.z = substr(s, ((ind-1)%9) + (lp-1)*9 + 1, 1)
                OR z.z = substr(s, (((ind-1)/3) % 3) * 3
                        + ((ind-1)/27) * 27 + lp
                        + ((lp-1) / 3) * 6, 1)
         )
  )
SELECT s FROM x WHERE ind=0;


The "input" CTE defines the input puzzle.
The "digits" CTE defines a table that holds all digits between 1 and 9.
The work of solving the puzzle is undertaken by the "x" CTE.
An entry in x(s,ind) means that the 81-character string "s" is a valid
sudoku puzzle (it has no conflicts) and that the first unknown character
is at position "ind", or ind==0 if all character positions are filled in.
The goal, then, is to compute entries for "x" with an "ind" of 0.

The solver works by adding new entries to the "x" recursive table.
Given prior entries, the recursive-select tries to fill in a single new
position with all values between 1 and 9 that actually work in that
position.  The complicated "NOT EXISTS" subquery is the magic that
figures out whether or not each candidate "s" string is a valid
sudoku puzzle or not.

The final answer is found by looking for a string with ind==0.
If the original sudoku problem did not have a unique solution, then
the query will return all possible solutions.  If the original problem
was unsolvable, then no rows will be returned.  In this case, the unique
answer is:


534678912672195348198342567859761423426853791713924856961537284287419635345286179


The solution was computed in less than 300 milliseconds on a modern
workstation.



4. Materialization Hints


The "AS MATERIALIZED" and "AS NOT MATERIALIZED" forms of a common table expression
are non-standard SQL syntax copied from PostgreSQL.  Using MATERIALIZED or
NOT MATERIALIZED after the AS keyword provides non-binding hints to the query
planner about how the CTE should be implemented.


If the MATERIALIZED phrase is used, then select-stmt is
likely evaluated to generate an ephemeral table that is held in memory or a
temporary disk file, to be used in place of the
CTE table name whenever that table name appears in the subsequent SQL.
Because the select-stmt is evaluated immediately,
the opportunity to apply optimizations such as
query flattening or the push-down optimization, is lost.
(The CTE then acts as an "optimization fence".)


If the NOT MATERIALIZED phrase is used, then select-stmt
is substituted as a subquery in place of every occurrence of the CTE
table name.  Optimizations such as flattening and
push-down are then applied to the subquery as if
the subquery had by used in directly.  In spite of its name, the NOT MATERIALIZED
phrase does not prohibit the use of materialization.  The query planner
is still free to implement the subquery using materialization if
it feels that is the best solution.  The true meaning of NOT MATERIALIZED
is closer to "TREAT LIKE ANY ORDINARY VIEW OR SUBQUERY".  


If neither hint is present, then SQLite 3.35.0 (2021-03-12) and
later process the CTE as if the MATERIALIZED phrase were present if the
CTE is used more than once, or as if the NOT MATERIALIZED phrase were
present if the CTE is used only once.  Prior to SQLite 3.35.0, all
CTEs where treated as if the NOT MATERIALIZED phrase was present.
The decision of whether to treat a specific CTE as MATERIALIZED or
as NOT MATERIALIZED based on the number of uses is a heuristic that
is subject to change in future releases, if we come up with a better
query planning strategy.  The difference is purely a matter of
performance.  Equivalent answers should be computed either way.


Applications should not depend upon the semantic effects of this hint
with respect to when or how often user-defined functions are called.
Future versions of the query planner may disregard this hint.


The MATERIALIZED and NOT MATERIALIZED hints are only available in
SQLite version 3.35.0 (2021-03-12) and later.

5. Limitations And Caveats



The WITH clause cannot be used within a CREATE TRIGGER.

The WITH clause must appear at the beginning of a top-level SELECT statement
or at the beginning of a subquery.  The WITH clause cannot be prepended to
the second or subsequent SELECT statement of a compound select.

The SQL:1999 spec requires that the RECURSIVE keyword follow WITH in any
WITH clause that includes a recursive common table expression.  However, for
compatibility with SqlServer and Oracle, SQLite does not enforce this rule.

This page last modified on  2022-01-17 12:21:35 UTClang_with.htmlunqualified.  In other words, the
    schema-name. prefix on the table name is not allowed 
    within triggers. If the table to which the trigger is attached is
    not in the temp database, then DELETE statements within the trigger
    body must operate on tables within the same database as it. If the table
    to which the trigger is attached is in the TEMP database, then the
    unqualified name of the table being deleted is resolved in the same way as
    it is for a top-level statement (by searching first the TEMP database, then
    the main database, then any other databases in the order they were
    attached).
    
  The INDEXED BY and NOT INDEXED clauses are not allowed on DELETE
    statements within triggers.

  The LIMIT and ORDER BY clauses (described below) are unsupported for
    DELETE statements within triggers.

  The RETURNING clause is not supported for triggers.


3. Optional LIMIT and ORDER BY clauses

If SQLite is compiled with the SQLITE_ENABLE_UPDATE_DELETE_LIMIT
compile-time option, then the syntax of the DELETE statement is
extended by the addition of optional ORDER BY and LIMIT clauses:


 

 


If a DELETE statement has a LIMIT clause, the maximum number of rows that
will be deleted is found by evaluating the accompanying expression and casting
it to an integer value. If the result of the evaluating the LIMIT clause
cannot be losslessly converted to an integer value, it is an error. A 
negative LIMIT value is interpreted as "no limit". If the DELETE statement 
also has an OFFSET clause, then it is similarly evaluated and cast to an
integer value. Again, it is an error if the value cannot be losslessly
converted to an integer. If there is no OFFSET clause, or the calculated
integer value is negative, the effective OFFSET value is zero.

If the DELETE statement has an ORDER BY clause, then all rows that would 
be deleted in the absence of the LIMIT clause are sorted according to the 
ORDER BY. The first M rows, where M is the value found by
evaluating the OFFSET clause expression, are skipped, and the following 
N, where N is the value of the LIMIT expression, are deleted.
If there are less than N rows remaining after taking the OFFSET clause
into account, or if the LIMIT clause evaluated to a negative value, then all
remaining rows are deleted.

If the DELETE statement has no ORDER BY clause, then all rows that
would be deleted in the absence of the LIMIT clause are assembled in an
arbitrary order before applying the LIMIT and OFFSET clauses to determine 
the subset that are actually deleted.

The ORDER BY clause on a DELETE statement is used only to determine which
rows fall within the LIMIT. The order in which rows are deleted is arbitrary
and is not influenced by the ORDER BY clause.
This means that if there is a RETURNING clause, the rows returned by
the statement probably will not be in the order specified by the
ORDER BY clause.



4. The Truncate Optimization

When the WHERE clause and RETURNING clause are both  omitted
from a DELETE statement and the table being deleted has no triggers,
SQLite uses an optimization to erase the entire table content
without having to visit each row of the table individually.
This "truncate" optimization makes the delete run much faster.
Prior to SQLite version 3.6.5 (2008-11-12), the truncate optimization
also meant that the sqlite3_changes() and
sqlite3_total_changes() interfaces
and the count_changes pragma
will not actually return the number of deleted rows.  
That problem has been fixed as of version 3.6.5 (2008-11-12).

The truncate optimization can be permanently disabled for all queries
by recompiling
SQLite with the SQLITE_OMIT_TRUNCATE_OPTIMIZATION compile-time switch.

The truncate optimization can also be disabled at runtime using
the sqlite3_set_authorizer() interface.  If an authorizer callback
returns SQLITE_IGNORE for an SQLITE_DELETE action code, then
the DELETE operation will proceed but the truncate optimization will
be bypassed and rows will be deleted one by one.
This page last modified on  2021-02-02 12:11:09 UTClang_delete.html
]]“ !  +¥}-ATTACH DATABASE1. Overview


 
 



 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 






 
 



 
 







 The ATTACH DATABASE statement adds another database 
file to the current database connection. 
Database files that were previously attached can be removed using
the DETACH DATABASE command.

2. Details

The filename for the database to be attached is the value of
the expression that occurs before the AS keyword.
The filename of the database follows the same semantics as the
filename argument to sqlite3_open() and sqlite3_open_v2(); the
special name ":memory:" results in an in-memory database and an
empty string results in a new temporary database.
The filename argument can be a URI filename if URI filename processing
is enable on the database connection.  The default behavior is for
URI filenames to be disabled, however that might change in a future release
of SQLite, so application developers are advised to plan accordingly.

The name that occurs after the AS keyword is the name of the database
used internally by SQLite.
The schema-names 'main' and 
'temp' refer to the main database and the database used for 
temporary tables.  The main and temp databases cannot be attached or
detached.

 Tables in an attached database can be referred to using the syntax 
schema-name.table-name.  If the name of the table is unique
across all attached databases and the main and temp databases, then the
schema-name prefix is not required.  If two or more tables in
different databases have the same name and the 
schema-name prefix is not used on a table reference, then the
table chosen is the one in the database that was least recently attached.


Transactions involving multiple attached databases are atomic,
assuming that the main database is not ":memory:" and the 
journal_mode is not WAL.  If the main
database is ":memory:" or if the journal_mode is WAL, then 
transactions continue to be atomic within each individual
database file. But if the host computer crashes in the middle
of a COMMIT where two or more database files are updated,
some of those files might get the changes where others
might not.


 There is a limit, set using sqlite3_limit() and 
SQLITE_LIMIT_ATTACHED, to the number of databases that can be
simultaneously attached to a single database connection.
This page last modified on  2020-02-10 17:23:44 UTClang_attach.htmln if possible, or return SQLITE_BUSY.  If the
first statement after BEGIN DEFERRED is a write statement, then
a write transaction is started.



IMMEDIATE cause the database connection to start a new write
immediately, without waiting for a write statement.  The 
BEGIN IMMEDIATE might fail with SQLITE_BUSY if another write
transaction is already active on another database connection.



EXCLUSIVE is similar to IMMEDIATE in that a write transaction
is started immediately.  EXCLUSIVE and IMMEDIATE are the same
in WAL mode, but in other journaling modes, EXCLUSIVE prevents
other database connections from reading the database while the
transaction is underway.


2.3. Implicit versus explicit transactions


An implicit transaction (a transaction that is started automatically,
not a transaction started by BEGIN) is committed automatically when
the last active statement finishes.  A statement finishes when its
last cursor closes, which is guaranteed to happen when the
prepared statement is reset or
finalized.  Some statements might "finish"
for the purpose of transaction control prior to being reset or finalized,
but there is no guarantee of this.  The only way to ensure that a
statement has "finished" is to invoke sqlite3_reset() or
sqlite3_finalize() on that statement.  An open sqlite3_blob used for
incremental BLOB I/O also counts as an unfinished statement.
The sqlite3_blob finishes when it is closed.



The explicit COMMIT command runs immediately, even if there are
pending SELECT statements.  However, if there are pending
write operations, the COMMIT command
will fail with an error code SQLITE_BUSY.



An attempt to execute COMMIT might also result in an SQLITE_BUSY return code
if an another thread or process has an open read connection.
When COMMIT fails in this
way, the transaction remains active and the COMMIT can be retried later
after the reader has had a chance to clear.



In very old versions of SQLite (before version 3.7.11 - 2012-03-20)
the ROLLBACK will fail with an error code 
SQLITE_BUSY if there are any pending queries.  In more recent
versions of SQLite, the ROLLBACK will proceed and pending statements
will often be aborted, causing them to return an SQLITE_ABORT or
SQLITE_ABORT_ROLLBACK error.
In SQLite version 3.8.8 (2015-01-16) and later,
a pending read will continue functioning
after the ROLLBACK as long as the ROLLBACK does not modify the database
schema.



If PRAGMA journal_mode is set to OFF (thus disabling the rollback journal
file) then the behavior of the ROLLBACK command is undefined.


3. Response To Errors Within A Transaction

 If certain kinds of errors occur within a transaction, the
transaction may or may not be rolled back automatically.  The
errors that can cause an automatic rollback include:


 SQLITE_FULL: database or disk full
 SQLITE_IOERR: disk I/O error
 SQLITE_BUSY: database in use by another process
 SQLITE_NOMEM: out of memory



For all of these errors, SQLite attempts to undo just the one statement
it was working on and leave changes from prior statements within the
same transaction intact and continue with the transaction.  However, 
depending on the statement being evaluated and the point at which the
error occurs, it might be necessary for SQLite to rollback and
cancel the entire transaction.  An application can tell which
course of action SQLite took by using the
sqlite3_get_autocommit() C-language interface.

It is recommended that applications respond to the errors
listed above by explicitly issuing a ROLLBACK command.  If the 
transaction has already been rolled back automatically
by the error response, then the ROLLBACK command will fail with an
error, but no harm is caused by this.

Future versions of SQLite may extend the list of errors which
might cause automatic transaction rollback.  Future versions of
SQLite might change the error response.  In particular, we may
choose to simplify the interface in future versions of SQLite by
causing the errors above to force an unconditional rollback.
This page last modified on  2020-07-09 15:12:58 UTClang_transaction.html
PP½%"     #ú7Transaction1. Transaction Control Syntax



 
 




 
 




 
 




2. Transactions


No reads or writes occur except within a transaction.
Any command that accesses the database (basically, any SQL command,
except a few PRAGMA statements)
will automatically start a transaction if
one is not already in effect.  Automatically started transactions
are committed when the last SQL statement finishes.



Transactions can be started manually using the BEGIN
command.  Such transactions usually persist until the next
COMMIT or ROLLBACK command.  But a transaction will also 
ROLLBACK if the database is closed or if an error occurs
and the ROLLBACK conflict resolution algorithm is specified.
See the documentation on the ON CONFLICT
clause for additional information about the ROLLBACK
conflict resolution algorithm.



END TRANSACTION is an alias for COMMIT.


 Transactions created using BEGIN...COMMIT do not nest.
For nested transactions, use the SAVEPOINT and RELEASE commands.
The "TO SAVEPOINT name" clause of the ROLLBACK command shown
in the syntax diagram above is only applicable to SAVEPOINT
transactions.  An attempt to invoke the BEGIN command within
a transaction will fail with an error, regardless of whether
the transaction was started by SAVEPOINT or a prior BEGIN.
The COMMIT command and the ROLLBACK command without the TO clause
work the same on SAVEPOINT transactions as they do with transactions
started by BEGIN.

2.1. Read transactions versus write transactions

SQLite supports multiple simultaneous read transactions
coming from separate database connections, possibly in separate
threads or processes, but only one simultaneous write transaction.


A read transaction is used for reading only.  A write transaction
allows both reading and writing.  A read transaction is started
by a SELECT statement, and a write transaction is started by 
statements like CREATE, DELETE, DROP, INSERT, or UPDATE (collectively
"write statements").  If a write statement occurs while
a read transaction is active, then the read transaction is upgraded
to a write transaction if possible.  If some other database connection
has already modified the database or is already in the process of
modifying the database, then upgrading to a write transaction is
not possible and the write statement will fail with SQLITE_BUSY.



While a read transaction is active, any changes to the database that
are implemented by separate database connections will not be seen
by the database connection that started the read transaction.  If database
connection X is holding a read transaction, it is possible that some
other database connection Y might change the content of the database
while X's transaction is still open, however X will not be able to see 
those changes until after the transaction ends.  While its read
transaction is active, X will continue to see an historic snapshot of
the database prior to the changes implemented by Y.





2.2. DEFERRED, IMMEDIATE, and EXCLUSIVE transactions


Transactions can be DEFERRED, IMMEDIATE, or EXCLUSIVE.
The default transaction behavior is DEFERRED.



DEFERRED means that the transaction does not actually
start until the database is first accessed.  Internally,
the BEGIN DEFERRED statement merely sets a flag on the database 
connection that turns off the automatic commit that would normally
occur when the last statement finishes.  This causes the transaction
that is automatically started to persist until an explicit
COMMIT or ROLLBACK or until a rollback is provoked by an error
or an ON CONFLICT ROLLBACK clause.  If the first statement after
BEGIN DEFERRED is a SELECT, then a read transaction is started.
Subsequent write statements will upgrade the transaction to a
write transactiouxand also within all indexes, triggers,
and views that reference the column.  If the column name change would
result in a semantic ambiguity in a trigger or view, then the RENAME
COLUMN fails with an error and no changes are applied.



4. ALTER TABLE ADD COLUMN

 The ADD COLUMN syntax
is used to add a new column to an existing table.
The new column is always appended to the end of the list of existing columns.
The  rule defines the characteristics of the new column.
The new column may take any of the forms permissible in a CREATE TABLE
statement, with the following restrictions:

The column may not have a PRIMARY KEY or UNIQUE constraint.
The column may not have a default value of CURRENT_TIME, CURRENT_DATE, 
    CURRENT_TIMESTAMP, or an expression in parentheses.
If a NOT NULL constraint is specified, then the column must have a
    default value other than NULL.
If foreign key constraints are enabled and
    a column with a 
    is added, the column must have a default value of NULL.
The column may not be GENERATED ALWAYS ... STORED,
though VIRTUAL columns are allowed.


When adding a column with a CHECK constraint, or a NOT NULL constraint
on a generated column, the added constraints are tested against all 
preexisting rows in the table and the ADD COLUMN fails
if any constraint fails.  The testing of added constraints
against preexisting rows is a new enhancement as of SQLite version
3.37.0 (2021-11-27).

The ALTER TABLE command works by modifying the SQL text of the schema
stored in the sqlite_schema table.
No changes are made to table content for renames or column addition without
constraints.
Because of this,
the execution time of such ALTER TABLE commands is independent of
the amount of data in the table and such commands will 
run as quickly on a table with 10 million rows as on a table with 1 row.
When adding new columns that have CHECK constraints, or adding generated
columns with NOT NULL constraints, or when deleting columns, then all
existing data in the table must be either read (to test new constraints
against existing rows) or written (to remove deleted columns).  In those
cases, the ALTER TABLE command takes time that is proportional to the
amount of content in the table being altered.


After ADD COLUMN has been run on a database, that database will not
be readable by SQLite version 3.1.3 (2005-02-20) and earlier.



5. ALTER TABLE DROP COLUMN

 The DROP COLUMN syntax
is used to remove an existing column from a table.
The DROP COLUMN command removes the named column from the table,
and rewrites its content to purge the data associated
with that column.
The DROP COLUMN command only works if the column is not referenced
by any other parts of the schema and is not a PRIMARY KEY and
does not have a UNIQUE constraint.
Possible reasons why the DROP COLUMN command can fail include:

The column is a PRIMARY KEY or part of one.
The column has a UNIQUE constraint.
The column is indexed.
The column is named in the WHERE clause of a partial index.
The column is named in a table or column CHECK constraint
not associated with the column being dropped.
The column is used in a foreign key constraint.
The column is used in the expression of a generated column.
The column appears in a trigger or view.


5.1. How It Works

SQLite stores the schema as plain text in the sqlite_schema table.
The DROP COLUMN command (and all of the other variations of ALTER TABLE
as well) modify that text and then attempt to reparse the entire schema.
The command is only successful if the schema is still valid after the
text has been modified.  In the case of the DROP COLUMN command, the
only text modified is that the column definition is removed from the
CREATE TABLE statement.  The DROP COLUMN command will fail if there
are any traces of the column in other parts of the schema that will
prevent the schema from parsing after the CREATE TABLE statement has
been modified.

6. Disable Error Checking Using PRAGMA writable_schema=ON

ALTER TABLE will normally fail and make no changes if it encounters
any entries in the sqlite_schema table thyat do not parse.  For
example, if there is a malformed VIEW or TRIGGER associated with
table named "tbl1", then an attempt to rename "tbl1" to "tbl1neo" will
fail because the associated views and triggers could not be parsed.

Beginning with SQLite 3.38.0 (2022-02-22), this error checking
can be disabled by setting "PRAGMA writable_schema=ON;".  When
the schema is writable, ALTER TABLE silently ignores any rows of the
sqlite_schema table that do not parse.



7. Making Other Kinds Of Table Schema Changes

 The only schema altering commands directly supported by SQLite are the
"rename table", "rename column", "add column", "drop column"
commands shown above.  However, applications
can make other arbitrary changes to the format of a table using a simple
sequence of operations.
The steps to make arbitrary changes to the schema design of some table X
are as follows:



If foreign key constraints are enabled, disable them using PRAGMA foreign_keys=OFF.


Start a transaction.


Remember the format of all indexes, triggers, and views associated with table X.
This information will be needed in step 8 below.  One way to do this is
to run a query like the following:
SELECT type, sql FROM sqlite_schema WHERE tbl_name='X'.


Use CREATE TABLE to construct a new table "new_X" that is in the desired
revised format of table X.  Make sure that the name "new_X" does not collide
with any existing table name, of course.


Transfer content from X into new_X using a statement
like: INSERT INTO new_X SELECT ... FROM X.


Drop the old table X:  DROP TABLE X.


Change the name of new_X to X using: ALTER TABLE new_X RENAME TO X.


Use CREATE INDEX, CREATE TRIGGER, and CREATE VIEW
to reconstruct indexes, triggers, and views
associated with table X.  Perhaps use the old format of the triggers,
indexes, and views saved from step 3 above as a guide, making changes
as appropriate for the alteration.

If any views refer to table X in a way that is affected by the
schema change, then drop those views using DROP VIEW and recreate them
with whatever changes are necessary to accommodate the schema change
using CREATE VIEW.


If foreign key constraints were originally enabled
then run PRAGMA foreign_key_check to verify that the schema
change did not break any foreign key constraints.



Commit the transaction started in step 2.


If foreign keys constraints were originally enabled, reenable them now.





Caution:
Take care to follow the procedure above precisely.  The boxes below
summarize two procedures for modifying a table definition.  At first
glance, they both appear to accomplish the same thing.  However, the
procedure on the right does not always work, especially with the
enhanced rename table capabilities added by versions 3.25.0 and
3.26.0.  In the procedure on the right, the initial rename of the
table to a temporary name might corrupt references to that table in
triggers, views, and foreign key constraints.  The safe procedure on
the left constructs the revised table definition using a new temporary
name, then renames the table into its final name, which does not break
links.






Create new table
Copy data
Drop old table
Rename new into old



Rename old table
Create new table
Copy data
Drop old table


&uarr;Correct
&uarr;Incorrect



The 12-step generalized ALTER TABLE procedure
above will work even if the
schema change causes the information stored in the table to change.
So the full 12-step procedure above is appropriate for dropping a column,
changing the order of columns, adding or removing a UNIQUE constraint
or PRIMARY KEY, adding CHECK or FOREIGN KEY or NOT NULL constraints,
or changing the datatype for a column, for example.  However, a simpler
and faster procedure can optionally be used for
some changes that do no affect the on-disk content in any way.
The following simpler procedure is appropriate for removing
CHECK or FOREIGN KEY or NOT NULL constraints,
or adding, removing, or changing default values on
a column.


 Start a transaction.

 Run PRAGMA schema_version to determine the current schema
version number.  This number will be needed for step 6 below.

 Activate schema editing using 
PRAGMA writable_schema=ON.

 Run an UPDATE statement to change the definition of table X
in the sqlite_schema table: 
UPDATE sqlite_schema SET sql=... WHERE type='table' AND name='X';
Caution:  Making a change to the sqlite_schema table like this will
render the database corrupt and unreadable if the change contains
a syntax error.  It is suggested that careful testing of the UPDATE
statement be done on a separate blank database prior to using it on
a database containing important data.

 If the change to table X also affects other tables or indexes or
triggers are views within schema, then run UPDATE statements to modify
those other tables indexes and views too.  For example, if the name of
a column changes, all FOREIGN KEY constraints, triggers, indexes, and
views that refer to that column must be modified.
Caution:  Once again, making changes to the sqlite_schema 
table like this will render the database corrupt and unreadable if the 
change contains an error.  Carefully test this entire procedure
on a separate test database prior to using it on
a database containing important data and/or make backup copies of
important databases prior to running this procedure.

 Increment the schema version number using
PRAGMA schema_version=X where X is one
more than the old schema version number found in step 2 above.

 Disable schema editing using 
PRAGMA writable_schema=OFF.

 (Optional) Run PRAGMA integrity_check to verify that the
schema changes did not damage the database.

 Commit the transaction started on step 1 above.


If some future version of SQLite adds new ALTER TABLE capabilities, 
those capabilities will very likely use one of the two procedures
outlined above.



8. Why ALTER TABLE is such a problem for SQLite

Most SQL database engines store the schema already parsed into
various system tables.  On those database engines, ALTER TABLE merely 
has to make modifications to the corresponding system tables.

SQLite is different in that it stores the schema
in the sqlite_schema table as the original text of the CREATE
statements that define the schema.  Hence ALTER TABLE needs
to revise the text of the CREATE statement.  Doing
so can be tricky for certain "creative" schema designs.

The SQLite approach of storing the schema as text has advantages
for an embedded relational database.  For one, it means that the
schema takes up less space in the database file.  This is important
since a common SQLite usage pattern is to have many small,
separate database files instead of putting everything in one
big global database file, which is the usual approach for client/server
database engines.
Since the schema is duplicated in each separate database file, it is
important to keep the schema representation compact.

Storing the schema as text rather than as parsed tables also
give flexibility to the implementation.  Since the internal parse
of the schema is regenerated each time the database is opened, the
internal representation of the schema can change from one release
to the next.  This is important, as sometimes new features require
enhancements to the internal schema representation.  Changing the
internal schema representation would be much more difficult if the
schema representation was exposed in the database file.  So, in other
words, storing the schema as text helps maintain backwards 
compatibility, and helps ensure that older database files can be
read and written by newer versions of SQLite.

Storing the schema as text also makes the 
SQLite database file format easier to define, document, and 
understand. This helps make SQLite database files a
recommended storage format for long-term archiving of data.

The downside of storing schema a text is that it can make
the schema tricky to modify.  And for that reason, the ALTER TABLE
support in SQLite has traditionally lagged behind other SQL
database engines that store their schemas as parsed system tables
that are easier to modify.




This page last modified on  2022-08-10 18:45:48 UTClang_altertable.html
QQó#
#ås5ALTER TABLE1. Overview



 
 



 
 



 
 



 
 




 
 



 
 




 
 



 
 




 
 





 
 




 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 







 
 




 
 




 
 





 
 



 
 







SQLite supports a limited subset of ALTER TABLE.
The ALTER TABLE command in SQLite allows
these alterations of an existing table:
it can be renamed;
a column can be renamed;
a column can be added to it;
or
a column can be dropped from it.



2. ALTER TABLE RENAME

 The RENAME TO syntax changes the name of table-name
to new-table-name.
This command 
cannot be used to move a table between attached databases, only to rename 
a table within the same database.
If the table being renamed has triggers or indices, then these remain
attached to the table after it has been renamed.


Compatibility Note:
The behavior of ALTER TABLE when renaming a table was enhanced
in versions 3.25.0 (2018-09-15) and 3.26.0 (2018-12-01)
in order to carry the rename operation forward into triggers and
views that reference the renamed table.  This is considered an
improvement. Applications that depend on the older (and
arguably buggy) behavior can use the
PRAGMA legacy_alter_table=ON statement or the
SQLITE_DBCONFIG_LEGACY_ALTER_TABLE configuration parameter
on sqlite3_db_config() interface to make ALTER TABLE RENAME
behave as it did prior to version 3.25.0.



Beginning with release 3.25.0 (2018-09-15), references to the table
within trigger bodies and view definitions are also renamed.


 Prior to version 3.26.0 (2018-12-01), FOREIGN KEY references
to a table that is renamed were only edited if the
PRAGMA foreign_keys=ON, or in other words if
foreign key constraints were being enforced.  With
PRAGMA foreign_keys=OFF, FOREIGN KEY constraints would not be changed
when the table that the foreign key referred to (the "parent table")
was renamed.  Beginning with version 3.26.0, FOREIGN KEY constraints
are always converted when a table is renamed, unless the
PRAGMA legacy_alter_table=ON setting is engaged.  The following
table summarizes the difference:




PRAGMA foreign_keys
PRAGMA legacy_alter_table
Parent Table
references are updated
SQLite version
OffOffNo&lt; 3.26.0
OffOffYes&gt;= 3.26.0
OnOffYesall
OffOnNoall
OnOnYesall





3. ALTER TABLE RENAME COLUMN

 The RENAME COLUMN TO syntax changes the
column-name of table table-name
into new-column-name.  The column name is changed both
within the table definition itself w|, see
 JSON subcomponent extraction.


The % operator casts both of its operands to type
INTEGER and then computes the remainder after dividing the left integer
by the right integer. The other arithmetic operators perform integer
arithmetic if both operands are integers and no overflow would result,
or floating point arithmetic, per IEEE Standard 754, if either operand
is a real value or integer arithmetic would produce an overflow.
Integer divide yields an integer result, truncated toward zero.


The result of any binary operator is either a numeric value or 
NULL, except for the || concatenation operator,
and the -&gt; and -&gt;&gt; extract operators
which evaluate to either NULL or a text value.

All operators generally evaluate to NULL when any operand is NULL,
with specific exceptions as stated below. This is in accordance with
the SQL92 standard.

 When paired with NULL:
&nbsp;&nbsp;AND evaluates to 0 (false) when
the other operand is false; and
&nbsp;&nbsp;OR evaluates to 1 (true)
when the other operand is true.






The IS and IS NOT operators work
like = and != except when one or both of the
operands are NULL. In this case, if both operands are NULL, then the
IS operator evaluates to 1 (true) and the IS NOT operator evaluates
to 0 (false). If one operand is NULL and the other is not, then the
IS operator evaluates to 0 (false) and the IS NOT operator is 1 (true).
It is not possible for an IS or IS NOT expression to evaluate to NULL.





The IS NOT DISTINCT FROM operator is an alternative spelling
for the IS operator.
Likewise, the IS DISTINCT FROM operator means the same thing
as IS NOT.  Standard SQL does not support the compact IS and IS NOT
notation.  Those compact forms are an SQLite extension.  You have to use
the prolix and much less readable IS NOT DISTINCT FROM and
IS DISTINCT FROM operators on other SQL database engines.



3. Literal Values (Constants)

A literal value represents a constant.
Literal values may be integers, floating point numbers, strings,
BLOBs, or NULLs.

The syntax for integer and floating point literals (collectively
"numeric literals") is shown by the following diagram:


 

 



If a numeric literal has a decimal point or an exponentiation
clause or if it is less than -9223372036854775808 or
greater than 9223372036854775807, then it is a floating point literal.
Otherwise is it is an  integer literal.
The "E" character that begins the exponentiation
clause of a floating point literal can be either upper or lower case.
The "." character is always used 
as the decimal point even if the locale setting specifies "," for
this role - the use of "," for the decimal point would result in
syntactic ambiguity.



Hexadecimal integer literals follow the C-language notation of
"0x" or "0X" followed by hexadecimal digits.
For example, 0x1234 means the same as 4660
and 0x8000000000000000 means the same as -9223372036854775808.
 Hexadecimal integer literals are interpreted as 64-bit
two's-complement integers and are thus limited
to sixteen significant digits of precision.
Support for hexadecimal integers was added to SQLite
version 3.8.6 (2014-08-15).
For backwards compatibility, the "0x" hexadecimal integer
notation is only understood by the SQL language parser, not by the
type conversions routines.
String variables that
contain text formatted like hexadecimal integers are not
interpreted as hexadecimal integers when coercing the string value
into an integer due to a CAST expression or for a column affinity
transformation or prior to performing a numeric operation or for
any other run-time conversions.  When coercing a
string value in the format of a hexadecimal integer into an integer
value, the conversion process stops when the 'x' character is seen
so the resulting integer value is always zero.
SQLite only understands the hexadecimal integer notation when it
appears in the SQL statement text, not when it appears as
part of the content of the database.

 A string constant is formed by enclosing the
string in single quotes (').  A single quote within the string can
be encoded by putting t}wo single quotes in a row - as in Pascal.
C-style escapes using the backslash character are not supported because
they are not standard SQL.

 BLOB literals are string literals containing hexadecimal data and
preceded by a single "x" or "X" character.  Example: X'53514C697465'


A literal value can also be the token "NULL".




4. Parameters

A "variable" or "parameter" token
specifies a placeholder in the expression for a 
value that is filled in at runtime using the
sqlite3_bind() family of C/C++ interfaces.
Parameters can take several forms:





?NNN
A question mark followed by a number NNN holds a spot for the
NNN-th parameter.  NNN must be between 1 and SQLITE_MAX_VARIABLE_NUMBER.



?
A question mark that is not followed by a number creates a parameter
with a number one greater than the largest parameter number already assigned.
If this means the parameter number is greater than
SQLITE_MAX_VARIABLE_NUMBER, it is an error.
This parameter format is provided for compatibility with other database
engines.  But because it is easy to miscount the question marks, the
use of this parameter format is discouraged.  Programmers are encouraged
to use one of the symbolic formats below or the ?NNN format above instead.



:AAAA
A colon followed by an identifier name holds a spot for a 
named parameter with the name :AAAA.  
Named parameters are also numbered. The number assigned is one greater than
the largest parameter number already assigned. If this means the parameter
would be assigned a number greater than SQLITE_MAX_VARIABLE_NUMBER, it is
an error. To avoid confusion, it is best to avoid mixing named and numbered
parameters.


@AAAA
An "at" sign works exactly like a colon, except that the name of
the parameter created is @AAAA.


$AAAA
A dollar-sign followed by an identifier name also holds a spot for a named
parameter with the name $AAAA.  The identifier name in this case can include
one or more occurrences of "::" and a suffix enclosed in "(...)" containing
any text at all.  This syntax is the form of a variable name in the
Tcl programming language.  The presence
of this syntax results from the fact that SQLite is really a 
Tcl extension that has escaped into the wild.




Parameters that are not assigned values using
sqlite3_bind() are treated
as NULL.  The sqlite3_bind_parameter_index() interface can be used
to translate a symbolic parameter name into its equivalent numeric index.

The maximum parameter number is set at compile-time by
the SQLITE_MAX_VARIABLE_NUMBER macro.  An individual database connection
D can reduce its maximum parameter number below the compile-time maximum
using the sqlite3_limit(D, SQLITE_LIMIT_VARIABLE_NUMBER,...) interface.




5. The LIKE, GLOB, REGEXP, MATCH, and extract operators
The LIKE operator does a pattern matching comparison. The operand
to the right of the LIKE operator contains the pattern and the left hand
operand contains the string to match against the pattern.

A percent symbol ("%") in the LIKE pattern matches any
sequence of zero or more characters in the string.  An underscore
("_") in the LIKE pattern matches any single character in the
string.  Any other character matches itself or its lower/upper case
equivalent (i.e. case-insensitive matching).

Important Note: SQLite only
understands upper/lower case for ASCII characters by default.  The
LIKE operator is case sensitive by default for unicode characters that are
beyond the ASCII range.  For example,
the expression 'a'&nbsp;LIKE&nbsp;'A'
is TRUE but '&aelig;'&nbsp;LIKE&nbsp;'&AElig;' is FALSE.
The ICU extension to SQLite includes an enhanced version of the
LIKE operator that does case folding across all unicode characters.

If the optional ESCAPE clause is present, then the expression
following the ESCAPE keyword must evaluate to a string consisting of
a single character. This character may be used in the LIKE pattern
to include literal percent or underscore characters. The escape
character followed by a percent symbol (%), underscore (_), or a second
instance of the escape character itself matches a
literal percent ~symbol, underscore, or a single escape character,
respectively.

The infix LIKE operator is implemented by calling the
application-defined SQL functions like(Y,X) or
like(Y,X,Z).

The LIKE operator can be made case sensitive using the
case_sensitive_like pragma.



The GLOB operator is similar to LIKE but uses the Unix
file globbing syntax for its wildcards.  Also, GLOB is case
sensitive, unlike LIKE.  Both GLOB and LIKE may be preceded by
the NOT keyword to invert the sense of the test.  The infix GLOB 
operator is implemented by calling the function
glob(Y,X) and can be modified by overriding
that function.



The REGEXP operator is a special syntax for the regexp()
user function.  No regexp() user function is defined by default
and so use of the REGEXP operator will normally result in an
error message.  If an application-defined SQL function named "regexp"
is added at run-time, then the "X REGEXP Y" operator will
be implemented as a call to "regexp(Y,X)".



The MATCH operator is a special syntax for the match()
application-defined function.  The default match() function implementation
raises an exception and is not really useful for anything.
But extensions can override the match() function with more
helpful logic.



The extract operators act as a special syntax for functions
"-&gt;"() and "-&gt;&gt;"(). Default implementations for these functions
perform JSON subcomponent extraction,
but extensions can override them for other purposes.



6. The BETWEEN operator
The BETWEEN operator is logically equivalent to a pair of comparisons.
"x BETWEEN y AND z" is 
equivalent to 
"x&gt;=y AND x&lt;=z" except
that with BETWEEN, the x expression is only evaluated once.



7. The CASE expression
A CASE expression serves a role similar to IF-THEN-ELSE in other
programming languages.  

The optional expression that occurs in between the CASE keyword and the
first WHEN keyword is called the "base" expression. There are two
fundamental forms
of the CASE expression: those with a base expression and those without.

In a CASE without a base expression, each WHEN expression is evaluated
and the result treated as a boolean, starting with the leftmost and continuing
to the right. The result of the CASE expression is the evaluation of the THEN
expression that corresponds to the first WHEN expression that evaluates to
true. Or, if none of the WHEN expressions evaluate to true, the result of
evaluating the ELSE expression, if any. If there is no ELSE expression and
none of the WHEN expressions are true, then the overall result is NULL.

A NULL result is considered untrue when evaluating WHEN terms.

In a CASE with a base expression, the base expression is evaluated just
once and the result is compared against the evaluation of each WHEN 
expression from left to right. The result of the CASE expression is the 
evaluation of the THEN expression that corresponds to the first WHEN
expression for which the comparison is true. Or, if none of the WHEN
expressions evaluate to a value equal to the base expression, the result
of evaluating the ELSE expression, if any. If there is no ELSE expression and
none of the WHEN expressions produce a result equal to the base expression,
the overall result is NULL.

When comparing a base expression against a WHEN expression, the same
collating sequence, affinity, and NULL-handling rules apply as if the
base expression and WHEN expression are respectively the left- and
right-hand operands of an = operator. 

If the base 
expression is NULL then the result of the CASE is always the result 
of evaluating the ELSE expression if it exists, or NULL if it does not.

Both forms of the CASE expression use lazy, or short-circuit, 
evaluation.

The only difference between the following two CASE expressions is that 
the x expression is evaluated exactly once in the first example but 
might be evaluated multiple times in the second:


CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END
CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END


The built-in iif(x,y,z) SQL function is logically
equivalent to "CASE WHEN x THEN y ELSE z END".  The iif() function
is found in SQL Server and is included in SQLite for compatibility.
Some developers prefer the iif() function because it is more
concise.




8. The IN and NOT IN operators
The IN and NOT IN operators take an expression on the
left and a list of values or a subquery on the right.
When the right operand of an IN or NOT IN operator is a subquery, the
subquery must have the same number of columns as there are columns in
the row value of the left operand.  The subquery on the
right of an IN or NOT IN operator must be a scalar subquery if the left
expression is not a row value expression.
If the right operand of an IN or NOT IN operator is a list of values,
each of those values must be scalars and the left expression must also
be a scalar.
The right-hand side of an IN or NOT IN operator can be a
table name or table-valued function name in which 
case the right-hand side is understood to be subquery of
the form "(SELECT * FROM name)".
When the right operand is an empty set, the result of IN is false and the
result of NOT IN is true, regardless of the left operand and even if the
left operand is NULL.
The result of an IN or NOT IN operator is determined by the following
matrix:




Left operand is NULL
Right operand contains NULL
Right operand is an empty set
Left operand found within right operand
Result of IN operator
Result of NOT IN operator

no
no
no
no
false
true

does not matter
no
yes
no
false
true

no
does not matter
no
yes
true
false

no
yes
no
no
NULL
NULL

yes
does not matter
no
does not matter
NULL
NULL



Note that SQLite allows the parenthesized list of scalar values on
the right-hand side of an IN or NOT IN operator to be an empty list but
most other SQL database engines and the SQL92 standard require
the list to contain at least one element.

9. Table Column Names

A column name can be any of the names defined in the CREATE TABLE
statement or one of the following special identifiers: "ROWID",
"OID", or "_ROWID_".
The three special identifiers describe the
unique integer key (the rowid) associated with every 
row of every table and so are not available on WITHOUT ROWID tables.
The special identifiers only refer to the row key if the CREATE TABLE
statement does not define a real column with the same name.
The rowid can be used anywhere a regular
column can be used.



10. The EXISTS operator

The EXISTS operator always evaluates to one of the integer values 0 
and 1. If executing the SELECT statement specified as the right-hand 
operand of the EXISTS operator would return one or more rows, then the
EXISTS operator evaluates to 1. If executing the SELECT would return
no rows at all, then the EXISTS operator evaluates to 0. 

The number of columns in each row returned by the SELECT statement
(if any) and the specific values returned have no effect on the results
of the EXISTS operator. In particular, rows containing NULL values are
not handled any differently from rows without NULL values.



11. Subquery Expressions

A SELECT statement enclosed in parentheses is a subquery.
All types of SELECT statement, including
aggregate and compound SELECT queries (queries with keywords like
UNION or EXCEPT) are allowed as scalar subqueries.
The value of a subquery expression is the first row of the result
from the enclosed SELECT statement.
The value of a subquery expression is NULL if the enclosed
SELECT statement returns no rows.

A subquery that returns a single column is a scalar subquery and can
be used most anywhere.
A subquery that returns two or more columns is a row value
subquery and can only be used as the operand of a comparison operator.



12. Correlated Subqueries

A SELECT statement used as either a scalar subquery or as the 
right-hand operand of an IN, NOT IN or EXISTS expression may contain 
references to columns in the outer query. Such a subquery is known as
a correlated subquery. A correlated subquery is reevaluated each time
its result is required. An uncorrelated subquery is evaluated only once
and the result reused as necessary.



13. CAST expressions

A CAST ex€pression of the form "CAST(expr AS type-name)"
is used to convert the value of expr to 
a different storage class specified by type-name.
A CAST conversion is similar to the conversion that takes
place when a column affinity is applied to a value except that with
the CAST operator the conversion always takes place even if the conversion
lossy and irreversible, whereas column affinity only changes the data type
of a value if the change is lossless and reversible.

If the value of expr is NULL, then the result of the CAST
expression is also NULL. Otherwise, the storage class of the result
is determined by applying the rules for determining column affinity to
the type-name.




   Affinity of type-name
   Conversion Processing

   NONE 
   Casting a value to a type-name with no affinity 
  causes the value to
  be converted into a BLOB.  Casting to a BLOB consists of first casting
  the value to TEXT in the encoding of the database connection, then
  interpreting the resulting byte sequence as a BLOB instead of as TEXT.


   TEXT
   To cast a BLOB value to TEXT, the sequence of bytes that make up the
  BLOB is interpreted as text encoded using the database encoding.
  
   Casting an INTEGER or REAL value into TEXT renders the value as if via 
    sqlite3_snprintf() except that the resulting TEXT uses the encoding of
    the database connection.


   REAL
   When casting a BLOB value to a REAL, the value is first converted to
        TEXT.
       When casting a TEXT value to REAL, the longest possible prefix of
        the value that can be interpreted as a real number is extracted from
        the TEXT value and the remainder ignored. Any leading spaces in the
        TEXT value are ignored when converging from TEXT to REAL. If there is
        no prefix that can be interpreted as a real number, the result of the
        conversion is 0.0.


   INTEGER
   When casting a BLOB value to INTEGER, the value is first converted to
        TEXT.
       When casting a TEXT value to INTEGER, the longest possible prefix of
        the value that can be interpreted as an integer number is extracted from
        the TEXT value and the remainder ignored. Any leading spaces in the
        TEXT value when converting from TEXT to INTEGER are ignored. If there
        is no prefix that can be interpreted as an integer number, the result
        of the conversion is 0.  If the prefix integer is greater than
        +9223372036854775807 then the result of the cast is exactly
        +9223372036854775807.  Similarly, if the prefix integer is
        less than -9223372036854775808 then the result of the cast is
        exactly -9223372036854775808.

        When casting to INTEGER, if the text looks like a floating point
        value with an exponent, the exponent will be ignored because it is
        no part of the integer prefix.  For example,
        "(CAST '123e+5' AS INTEGER)" results in 123, not in 12300000.

         The CAST operator understands decimal
        integers only &mdash; conversion of hexadecimal integers stops 
        at the "x" in the "0x" prefix of the hexadecimal integer string 
        and thus result of the CAST is always zero.

      A cast of a REAL value into an INTEGER results in the integer
      between the REAL value and zero that is closest to the REAL value.
      If a REAL is greater than the greatest possible signed
      integer (+9223372036854775807) then the result is the greatest possible
      signed integer and if the REAL is less than the least possible signed
      integer (-9223372036854775808) then the result is the least possible
      signed integer.

      Prior to SQLite version 3.8.2 (2013-12-06),
      casting a REAL value greater than
      +9223372036854775807.0 into an integer resulted in the most negative
      integer, -9223372036854775808.  This behavior was meant to emulate the
      behavior of x86/x64 hardware when doing the equivalent cast.


   NUMERIC
   Casting a TEXT or BLOB value into NUMERIC yields either an INTEGER or
   a REAL result.
   If the input text looks like an integer (there is no decimal point nor
   exponent) and the value is small enough to fit in a 64-bit signed integer,
   then the result will be INTEGER.
   Input text that looks like floating point (there is a decimal point and/or
   an exponent) and the text describes a value that 
   can be losslessly converted back and forth between IEEE 754 64-bit float and a
   51-bit signed integer, then the result is INTEGER.
   (In the previous sentence, a 51-bit integer is specified since that is one
   bit less than the length of the mantissa of an IEEE 754 64-bit float and
   thus provides a 1-bit of margin for the text-to-float conversion operation.)
   Any text input that describes a value outside the range of a 64-bit
   signed integer yields a REAL result.
    Casting a REAL or INTEGER value to NUMERIC is a no-op, even if a real
   value could be losslessly converted to an integer.




Note that the result from casting any non-BLOB value into a 
BLOB and the result from casting any BLOB value into a non-BLOB value
may be different depending on whether the database encoding is UTF-8,
UTF-16be, or UTF-16le.




14. Boolean Expressions

The SQL language features several contexts where an expression is 
evaluated and the result converted to a boolean (true or false) value. These
contexts are:

  
     the WHERE clause of a SELECT, UPDATE or DELETE statement,
     the ON or USING clause of a join in a SELECT statement,
     the HAVING clause of a SELECT statement,
     the WHEN clause of an SQL trigger, and
     the WHEN clause or clauses of some CASE expressions.
  

To convert the results of an SQL expression to a boolean value, SQLite
first casts the result to a NUMERIC value in the same way as a 
CAST expression. A numeric zero value (integer value 0 or real 
value 0.0) is considered to be false.  A NULL value is still NULL.
All other values are considered true.

For example, the values NULL, 0.0, 0, 'english' and '0' are all considered
to be false. Values 1, 1.0, 0.1, -0.1 and '1english' are considered to 
be true.

Beginning with SQLite 3.23.0 (2018-04-02), SQLite recognizes the
identifiers "TRUE" and "FALSE" as boolean literals, if and only if those
identifiers are not already used for some other meaning.  If there already
exists columns or tables or other objects named TRUE or FALSE, then for
the sake of backwards compatibility, the TRUE and FALSE identifiers refer
to those other objects, not to the boolean values.

The boolean identifiers TRUE and FALSE are usually just aliases for
the integer values 1 and 0, respectively.  However, if TRUE or FALSE
occur on the right-hand side of an IS operator, then the IS operator
evaluates the left-hand operand as a boolean value and returns an appropriate
answer.

15. Functions
SQLite supports many simple, aggregate,
and window
SQL functions.  For presentation purposes, simple functions are further
subdivided into core functions, date-time functions,
and JSON functions.
Applications can add new functions, written in C/C++, using the
sqlite3_create_function() interface.



The main expression bubble diagram above shows a single syntax for
all function invocations.  But this is merely to simplify the expression
bubble diagram.  In reality, each type of function has a slightly different
syntax, shown below.  The function invocation syntax shown in the main
expression bubble diagram is the union of the three syntaxes shown here:


 

 

 

 

 

 



The OVER clause is required for window functions and is prohibited
otherwise.  The DISTINCT keyword is only allowed in aggregate functions.
The FILTER clause may not appear on a simple function.

It is possible to have an aggregate function with the same name as a
simple function, as long as the number of arguments for the two forms of the
function are different.  For example, the max() function with a
single argument is an aggregate and the max() function with two or more
arguments is a simple function.  Aggregate functions can usually also
be used as window functions.
This page last modified on  2022-08-10 18:45:48 UTClang_expr.html
   C%   SÀ1Built-In Mathematical SQL Functions1. Overview

The math functions shown below are part of the
SQLite amalgamation source file but are only active
if the amalgamation is compiled using the
-DSQLITE_ENABLE_MATH_FUNCTIONS compile-time option.

The arguments to math functions can be integers, floating-point numbers,
or strings or blobs that look like integers or real numbers.  If any argument
is NULL or is a string or blob that is not readily converted into a number,
then the fu‚×P$
=ĨM)SQL Language Expressions1. Syntax



 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 



 
 




 
 




 
 



 
 




 
 





 
 




 
 




 
 




 
 



 
 






 
 



 
 








2. Operators, and Parse-Affecting Attributes
SQLite understands these operators, listed in precedence1 order
(top to bottom / highest to lowest):


  



  
    Operators&nbsp;2
  
  
    ~&nbsp;&lsqb;expr&rsqb;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;&lsqb;expr&rsqb;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;&lsqb;expr&rsqb;
  
  
    &lsqb;expr&rsqb;&nbsp;COLLATE&nbsp;&lpar;collation-name&rpar;&nbsp;3
  
  
    ||&nbsp;&nbsp;&nbsp;-&gt;&nbsp;&nbsp;&nbsp;-&gt;&gt;
  
  
    *&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;%
  
  
    +&nbsp;&nbsp;&nbsp;-
  
  
    &amp;&ensp;&nbsp;|&nbsp;&nbsp;&nbsp;&lt;&lt;&ensp;&nbsp;&gt;&gt;
  
  
    &lsqb;expr&rsqb;&nbsp;ESCAPE&nbsp;&lsqb;escape-character-expr&rsqb;&nbsp;4
  
  
    &lt;&nbsp;&nbsp;&gt;&nbsp;&nbsp;&lt;=&nbsp;&nbsp;&gt;=
  
  
    =&nbsp;&nbsp;==&nbsp;&nbsp;&lt;&gt;&nbsp;&nbsp;!=&nbsp;&nbsp;IS&nbsp;&nbsp;&nbsp;IS&nbsp;NOT
      IS&nbsp;DISTINCT&nbsp;FROM&nbsp;&nbsp;&nbsp;IS&nbsp;NOT&nbsp;DISTINCT&nbsp;FROM
      &lsqb;expr&rsqb;&nbsp;BETWEEN5&nbsp;&lsqb;expr&rsqb;&nbsp;AND&nbsp;&lsqb;expr&rsqb;&ensp;
      IN5&nbsp;&nbsp;MATCH5&nbsp;&nbsp;LIKE5&nbsp;&nbsp;REGEXP5&nbsp;&nbsp;GLOB5
      &lsqb;expr&rsqb;&nbsp;ISNULL&nbsp;&nbsp;&lsqb;expr&rsqb;&nbsp;NOTNULL&nbsp;&nbsp;&nbsp;&lsqb;expr&rsqb;&nbsp;NOT&nbsp;NULL
    
  
  
    NOT&nbsp;&lsqb;expr&rsqb;
  
  
    AND
  
  
    OR
  



 Operators shown within the same table cell share precedence.
 "&lsqb;expr&rsqb;" denotes operand locations for non-binary operators.
 &nbsp;&nbsp;Operators with no "&lsqb;expr&rsqb;" adjunct are binary and left-associative. 
 The COLLATE clause (with its collation-name) acts as a single postfix operator.
 The ESCAPE clause (with its escape character) acts as a single postfix operator.
 &nbsp;&nbsp;It can only bind to a preceding &lsqb;expr&rsqb; LIKE &lsqb;expr&rsqb; expression.
 Each keyword in (BETWEEN IN GLOB LIKE MATCH REGEXP) may be prefixed
 &nbsp;&nbsp;by NOT, retaining the bare operator's precedence and associativity.





The COLLATE operator is a unary postfix
operator that assigns a collating sequence to an expression.
The collating sequence set by the COLLATE operator overrides the
collating sequence determined by the COLLATE clause in a table
column definition.
See the detailed discussion on collating sequences
in the Datatype In SQLite3 document for additional information.



The unary operator + is a no-op.  It can be applied
to strings, numbers, blobs or NULL and it always returns a result
with the same value as the operand.

Note that there are two variations of the equals and not equals
operators.  Equals can be either

= or ==.
The non-equals operator can be either
!= or &lt;&gt;.
The || operator is "concatenate" - it joins together
the two strings of its operands.
The -&gt; and -&gt;&gt; operators are "extract";
they extract the RHS component from the LHS.
For an example{nction will return NULL.
These functions also return NULL for domain errors, such as trying to
take the square root of a negative number, or compute the arccosine of a
value greater than 1.0 or less than -1.0.

The values returned by these functions are often approximations.
For example, the pi() function returns 
3.141592653589793115997963468544185161590576171875 which 
is about 1.22465e-16 too small, but it is the closest approximation available
for IEEE754 doubles.




acos(X)
acosh(X)
asin(X)
asinh(X)
atan(X)
atan2(Y,X)
atanh(X)
ceil(X)
ceiling(X)
cos(X)
cosh(X)
degrees(X)
exp(X)
floor(X)
ln(X)
log(B,X)
log(X)
log10(X)
log2(X)
mod(X,Y)
pi()
pow(X,Y)
power(X,Y)
radians(X)
sin(X)
sinh(X)
sqrt(X)
tan(X)
tanh(X)
trunc(X)




2. Descriptions of built-in scalar SQL math functions



acos(X)
  Return the arccosine of X.  The result is in radians.


acosh(X)
  Return the hyperbolic arccosine of X.


asin(X)
  Return the arcsine of X.  The result is in radians.


asinh(X)
  Return the hyperbolic arcsine of X.


atan(X)
  Return the arctangent of X.  The result is in radians.


atan2(Y,X)
  Return the arctangent of Y/X.  The result is in radians.  The
  result is placed into correct quadrant depending on the signs
  of X and Y.


atanh(X)
  Return the hyperbolic arctangent of X.


ceil(X)ceiling(X)
  Return the first representable integer value greater than or equal to X.
  For positive values of X, this routine rounds away from zero.
  For negative values of X, this routine rounds toward zero.


cos(X)
  Return the cosine of X.  X is in radians.


cosh(X)
  Return the hyperbolic cosine of X.


degrees(X)
  Convert value X from radians into degrees.


exp(X)
  Compute e (Euler's number, approximately 2.71828182845905) raised
  to the power X.


floor(X)
  Return the first representable integer value less than or equal to X.
  For positive numbers, this function rounds toward zero.
  For negative numbers, this function rounds away from zero.


ln(X)
  Return the natural logarithm of X.


log(X)log10(X)log(B,X)
  Return the base-10 logarithm for X.  Or, for the two-argument version,
  return the base-B logarithm of X.
  
  Compatibility note:  SQLite works like PostgreSQL in that the log() function
  computes a base-10 logarithm.  Most other SQL database engines compute a
  natural logarithm for log().  In the two-argument version of log(B,X), the
  first argument is the base and the second argument is the operand.  This is
  the same as in PostgreSQL and MySQL, but is reversed from SQL Server which
  uses the second argument as the base and the first argument as the operand.


log2(X)
  Return the logarithm base-2 for the number X.


mod(X,Y)
  Return the remainder after dividing X by Y.  This is similar to the '%'
  operator, except that it works for non-integer arguments.


pi()
  Return an approximation for &pi;.


pow(X,Y)power(X,Y)
  Compute X raised to the power Y.


radians(X)
  Convert X from degrees into radians.


sin(X)
  Return the sine of X.  X is in radians.


sinh(X)
  Return the hyperbolic sine of X.


sqrt(X)
  Return the square root of X.  NULL is returned if X is negative.


tan(X)
  Return the tangent of X.  X is in radians.


tanh(X)
  Return the hyperbolic tangent of X.


trunc(X)
  Return the representable integer in between X and 0 (inclusive)
  that is furthest away from zero.  Or, in other words, return the
  integer part of X, rounding toward zero.
  The trunc() function is similar to ceiling(X) and floor(X) except
  that it always rounds toward zero whereas ceiling(X) and floor(X) round
  up and down, respectively.



This page last modified on  2021-12-20 21:50:59 UTClang_mathfunc.html
qq&
gQ·U+sqlite3_malloc(), sqlite3_malloc64(), sqlite3_realloc(), sqlite3_realloc64(), sqlite3_free(), sqlite3_msize()C API: Memory Allocation SubsystemThe 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/free.html
;;—B'     )_-s+sqlite3_exec()C API: One-Step Query Execution InterfaceThe 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.

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/exec.html
ZIYZ¥t*
i)É=9sqlite3_mutex_alloc(), sqlite3_mutex_free(), sqlite3_mutex_enter(), sqlite3_mutex_try(), sqlite3_mutex_leave()C API: MutexesThe 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‡¢*)    ?kÃ7struct sqlite3_io_methodsC API: OS Interface File Virtual Methods ObjectEvery 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 point†4(
)aœM1sqlite3_mprintf(), sqlite3_vmprintf(), sqlite3_snprintf(), sqlite3_vsnprintf()C API: Formatted String Printing FunctionsThese 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
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/mprintf.htmler, 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() upgrades the database file lock.  In other words, xLock() moves the
database file lock in the direction NONE toward EXCLUSIVE. The argument to
xLock() is always on of SHARED, RESERVED, PENDING, or EXCLUSIVE, never
SQLITE_LOCK_NONE.  If the database file lock is already at or above the
requested lock, then the call to xLock() is a no-op.
xUnlock() downgrades the database file lock to either SHARED or NONE.
to xUnlock() is a no-op.
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 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/io_methods.html.  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_MAIN
  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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/mutex_alloc.html
ë2ë‚D,       =oƒ??sqlite3_clear_bindings()C API: Reset All Bindings On A Prepared StatementContrary to the intuition of many, sqlite3_reset() does not reset
the bindings on a prepared statement.
Use this routine to reset all host parameters to NULL.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/clear_bindings.htmlK+        C]SEsqlite3_aggregate_context()C API: Obtain Aggregate Function ContextImplementations 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
allocation 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
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/aggregate_context.html
¹¸’¹ƒV/    3U†+struct sqlite3_fileC API: OS Interface Open File HandleAn sqlite3_file object represents an open file in the
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/file.html„#.
KM†/sqlite3_authorizer(), SQLITE_ROLLBACK, SQLITE_IGNORE, SQLITE_FAIL, SQLITE_ABORT, SQLITE_REPLACEC API: Conflict resolution modesThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_fail.html”E-        Y]§E1sqlite3_changes(), sqlite3_changes64()C API: Count The Number Of Rows ModifiedThese functions return 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.
The two functions are identical except for the type of the return value
and that if the number of rows modified by the most recent INSERT, UPDATE
or DELETE is greater than the maximum value supported by type "int", then
the return value of sqlite3_changes() is undefined. Executing any other
type of SQL statement does not modify the value returned by these functions.

Only changes made directly by the INSERT, UPDATE or DELETE statement are
considered - auxiliary changes caused by triggers,
foreign key actions or REPLACE constraint resolution are not counted.

Changes to a view that are intercepted by
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

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/changes.html
áxVáŒr2
Š5IŽI=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, SQLITE_ATTACH, SQLITE_DETACH, SQLITE_ALTER_TABLE, SQLITE_REINDEX, SQLITE_ANALYZE, SQLITE_CREATE_VTABLE, SQLITE_DROP_VTABLE, SQLITE_FUNCTION, SQLITE_SAVEPOINT, SQLITE_COPY, SQLITE_RECURSIVEC API: Authorizer Action CodesThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_alter_table.htmlˆ1 7M#9sqlite3_stmt_status()C API: Prepared Statement StatusEach 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/stmt_status.html‰0   Ka3Msqlite3_enable_load_extension()C API: Enable Or Disable Extension LoadingSo 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/enable_load_extension.html
VÌ
…V,6
ƒ[œQKsqlite3_column_database_name(), sqlite3_column_database_name16(), sqlite3_column_table_name(), sqlite3_column_table_name16(), sqlite3_column_origin_name(), sqlite3_column_origin_name16()C API: Source Of Data In A Query ResultThese 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
column metadata interfaces
for the same prepared statement and result column
at the same time then the results are undefined.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/column_database_name.html„D5  yE‡=/SQLITE_INTEGER, SQLITE_FLOAT, SQLITE_BLOB, SQLITE_NULLC API: Fundamental DatatypesEvery 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_blob.html‚K4        7cƒe9sqlite3_db_readonly()C API: Determine if a database is read-onlyThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/db_readonly.htmlƒc3
]G„}ESQLITE_CHECKPOINT_PASSIVE, SQLITE_CHECKPOINT_FULL, SQLITE_CHECKPOINT_RESTART, SQLITE_CHECKPOINT_TRUNCATEC API: Checkpoint Mode ValuesThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_checkpoint_full.html
o
)s
oƒl: 3I†I5sqlite3_user_data()C API: User Data For FunctionsThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/user_data.html‚9     =K‚uISQLITE_INDEX_SCAN_UNIQUEC API: Virtual Table Scan FlagsVirtual table implementations are allowed to set the
sqlite3_index_info.idxFlags field to some combination of
these bits.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_index_scan_unique.htmlƒ38   ;?…Q=sqlite3_snapshot_free()C API: Destroy a snapshotThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/snapshot_free.html…T7 _K‰k5sqlite3_value_dup(), sqlite3_value_free()C API: Copy And Free SQL ValuesThe 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. If V is a pointer value, then the result
of sqlite3_value_dup(V) is a NULL value.

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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/value_dup.html
ÑÑ”,;
œE‹UCSQLITE_ERROR_MISSING_COLLSEQ, SQLITE_ERROR_RETRY, SQLITE_ERROR_SNAPSHOT, SQLITE_IOERR_READ, SQLITE_IOERR_SHORT_READ, SQLITE_IOERR_WRITE, SQLITE_IOERR_FSYNC, SQLITE_IOERR_DIR_FSYNC, SQLITE_IOERR_TRUNCATE, SQLITE_IOERR_FSTAT, SQLITE_IOERR_UNLOCK, SQLITE_IOERR_RDLOCK, SQLITE_IOERR_DELETE, SQLITE_IOERR_BLOCKED, SQLITE_IOERR_NOMEM, SQLITE_IOERR_ACCESS, SQLITE_IOERR_CHECKRESERVEDLOCK, SQLITE_IOERR_LOCK, SQLITE_IOERR_CLOSE, SQLITE_IOERR_DIR_CLOSE, SQLITE_IOERR_SHMOPEN, SQLITE_IOERR_SHMSIZE, SQLITE_IOERR_SHMLOCK, SQLITE_IOERR_SHMMAP, SQLITE_IOERR_SEEK, SQLITE_IOERR_DELETE_NOENT, SQLITE_IOERR_MMAP, SQLITE_IOERR_GETTEMPPATH, SQLITE_IOERR_CONVPATH, SQLITE_IOERR_VNODE, SQLITE_IOERR_AUTH, SQLITE_IOERR_BEGIN_ATOMIC, SQLITE_IOERR_COMMIT_ATOMIC, SQLITE_IOERR_ROLLBACK_ATOMIC, SQLITE_IOERR_DATA, SQLITE_IOERR_CORRUPTFS, SQLITE_LOCKED_SHAREDCACHE, SQLITE_LOCKED_VTAB, SQLITE_BUSY_RECOVERY, SQLITE_BUSY_SNAPSHOT, SQLITE_BUSY_TIMEOUT, SQLITE_CANTOPEN_NOTEMPDIR, SQLITE_CANTOPEN_ISDIR, SQLITE_CANTOPEN_FULLPATH, SQLITE_CANTOPEN_CONVPATH, SQLITE_CANTOPEN_DIRTYWAL, SQLITE_CANTOPEN_SYMLINK, SQLITE_CORRUPT_VTAB, SQLITE_CORRUPT_SEQUENCE, SQLITE_CORRUPT_INDEX, SQLITE_READONLY_RECOVERY, SQLITE_READONLY_CANTLOCK, SQLITE_READONLY_ROLLBACK, SQLITE_READONLY_DBMOVED, SQLITE_READONLY_CANTINIT, SQLITE_READONLY_DIRECTORY, SQLITE_ABORT_ROLLBACK, SQLITE_CONSTRAINT_CHECK, SQLITE_CONSTRAINT_COMMITHOOK, SQLITE_CONSTRAINT_FOREIGNKEY, SQLITE_CONSTRAINT_FUNCTION, SQLITE_CONSTRAINT_NOTNULL, SQLITE_CONSTRAINT_PRIMARYKEY, SQLITE_CONSTRAINT_TRIGGER, SQLITE_CONSTRAINT_UNIQUE, SQLITE_CONSTRAINT_VTAB, SQLITE_CONSTRAINT_ROWID, SQLITE_CONSTRAINT_PINNED, SQLITE_CONSTRAINT_DATATYPE, SQLITE_NOTICE_RECOVER_WAL, SQLITE_NOTICE_RECOVER_ROLLBACK, SQLITE_WARNING_AUTOINDEX, SQLITE_AUTH_USER, SQLITE_OK_LOAD_PERMANENTLY, SQLITE_OK_SYMLINKC API: Extended Result CodesIn 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 2006-10-09
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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_abort_rollback.html

ï
‰b=      
3’y-C API: IntroductionC-language Interface Specification for SQLite


These pages are intended to be precise and detailed specification.
For a tutorial introduction, see instead:

SQLite In 5 Minutes Or Less and/or
the Introduction To The SQLite C/C++ Interface.

This same content is also available as a
single large HTML file.


The SQLite interface elements can be grouped into three categories:


List Of Objects.
    This is a list of all abstract objects and datatypes used by the
    SQLite library.  There are couple dozen objects in total, but
    the two most important objects are:
    A database connection object sqlite3, and the
    prepared statement object sqlite3_stmt.

List Of Constants.
    This is a list of numeric constants used by SQLite and represented by
    #defines in the sqlite3.h header file.  These constants
    are things such as numeric result codes from
    various interfaces (ex: SQLITE_OK) or flags passed
    into functions to control behavior
    (ex: SQLITE_OPEN_READONLY).

List Of Functions.
    This is a list of all functions and methods operating on the 
    objects and using and/or
    returning constants.  There
    are many functions, but most applications only use a handful.c3ref/intro.html’<
C¢=sqlite3_keyword_count(), sqlite3_keyword_name(), sqlite3_keyword_check()C API: SQL Keyword CheckingThese 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 &#91;...&#93;.  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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/keyword_check.html
55—H>  EC-m=struct sqlite3_mutex_methodsC API: Mutex Methods ObjectAn 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/mutex_methods.html
e=eƒU@    #I†1/SQLITE_DENYC API: Authorizer Return CodesThe 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
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_deny.html›@?        3Yµa5sqlite3_blob_open()C API: Open A BLOB For Incremental I/OThis interfaces opens a 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 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/blob_open.html
–=À–‚'C
C7‚G-SQLITE_UTF8, SQLITE_UTF16LE, SQLITE_UTF16BE, SQLITE_UTF16, SQLITE_ANY, SQLITE_UTF16_ALIGNEDC API: Text EncodingsThese constant define integer codes that represent the various
text encodings supported by SQLite.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_any.htmlˆzB ES7Gsqlite3_wal_autocheckpoint()C API: Configure an auto-checkpointThe 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
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/wal_autocheckpoint.html@A    Gc/Isqlite3_enable_shared_cache()C API: Enable Or Disable Shared Pager CacheThis routine enables or disables the sharing of the database cache
and schema data structures between connections
to the same database. Sharing is enabled if the argument is true
and disabled if the argument is false.

This interface is omitted if SQLite is compiled with
-DSQLITE_OMIT_SHARED_CACHE.  The -DSQLITE_OMIT_SHARED_CACHE
compile-time option is recommended because the
use of shared cache mode is discouraged.

Cache sharing is enabled and disabled for an entire process.
This is a change as of SQLite version 3.5.0 (2007-09-04).
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
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/enable_shared_cache.html
LÔLƒ9F        7K…c/struct sqlite3_pcacheC API: Custom Page Cache ObjectThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/pcache.htmlIE        3W™u5sqlite3_interrupt()C API: Interrupt A Long-Running QueryThis 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/interrupt.htmlˆ)D     GKIsqlite3_bind_parameter_name()C API: Name Of A Host ParameterThe 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(),
sqlite3_bind_parameter_count(), and
sqlite3_bind_parameter_index().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/bind_parameter_name.html

âZA„J       Aq†kCsqlite3_vtab_on_conflict()C API: Determine The Virtual Table Conflict PolicyThis 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vtab_on_conflict.htmlŠI      iS’Y9sqlite3_column_name(), sqlite3_column_name16()C API: Column Names In A Result SetThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/column_name.html‡H   5]Œc7sqlite3_data_count()C API: Number of columns in a result setThe 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() 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()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/data_count.htmlŠG
;’W=sqlite3_vtab_nochange()C API: Determine If Virtual Table Column Access Is For UPDATEIf the sqlite3_vtab_nochange(X) routine is called within the xColumn
method of a virtual table, then it might return true if the
column is being fetched as part of an UPDATE operation during which the
column value will not change.  The virtual table implementation can use
this hint as permission 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_xxxxx() interfaces.
In that case, sqlite3_value_nochange(X) will return true for the
same column in the xUpdate method.

The sqlite3_vtab_nochange() routine is an optimization.  Virtual table
implementations should continue to give a correct answer even if the
sqlite3_vtab_nochange() interface were to always return false.  In the
current implementation, the sqlite3_vtab_nochange() interface does always
returns false for the enhanced UPDATE FROM statement.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vtab_nochange.html
‘x  å…_‘…KO      3W‰y5sqlite3_db_config()C API: Configure database connectionsThe 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
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/db_config.html„#N
YA† CSQLITE_LOCK_NONE, SQLITE_LOCK_SHARED, SQLITE_LOCK_RESERVED, SQLITE_LOCK_PENDING, SQLITE_LOCK_EXCLUSIVEC API: File Locking LevelsSQLite 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.  These values are ordered from
lest restrictive to most restrictive.

The argument to xLock() is always SHARED or higher.  The argument to
xUnlock is either SHARED or NONE.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_lock_exclusive.html„]M      /9ˆC1sqlite3_strglob()C API: String GlobbingThe 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/strglob.htmlƒL       7C…/struct sqlite3_backupC API: Online Backup ObjectThe 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
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/backup.html‰K        3ac5sqlite3_blob_read()C API: Read Data From A BLOB IncrementallyThis 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/blob_read.html
þÇïþ‡nR
[QASQLITE_ACCESS_EXISTS, SQLITE_ACCESS_READWRITE, SQLITE_ACCESS_READC API: Flags for the xAccess VFS methodThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_access_exists.html‹UQ
ˆWŽCsqlite3_open_v2(), SQLITE_OPEN_READONLY, SQLITE_OPEN_READWRITE, SQLITE_OPEN_CREATE, SQLITE_OPEN_DELETEONCLOSE, SQLITE_OPEN_EXCLUSIVE, SQLITE_OPEN_AUTOPROXY, SQLITE_OPEN_URI, SQLITE_OPEN_MEMORY, 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_SUPER_JOURNAL, SQLITE_OPEN_NOMUTEX, SQLITE_OPEN_FULLMUTEX, SQLITE_OPEN_SHAREDCACHE, SQLITE_OPEN_PRIVATECACHE, SQLITE_OPEN_WAL, SQLITE_OPEN_NOFOLLOW, SQLITE_OPEN_EXRESCODEC API: Flags For File Open OperationsThese 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.

Only those flags marked as "Ok for sqlite3_open_v2()" may be
used as the third argument to the sqlite3_open_v2() interface.
The other flags have historically been ignored by sqlite3_open_v2(),
though future versions of SQLite might change so that an error is
raised if any of the disallowed bits are passed into sqlite3_open_v2().
Applications should not depend on the historical behavior.

Note in particular that passing the SQLITE_OPEN_EXCLUSIVE flag into
sqlite3_open_v2() does *not* cause the underlying database file
to be opened using O_EXCL.  Passing SQLITE_OPEN_EXCLUSIVE into
sqlite3_open_v2() has historically be a no-op and might become an
error in future versions of SQLite.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_open_autoproxy.html†6P      Ik‹Ksqlite3_database_file_object()C API: Database File Corresponding To A JournalIf 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/database_file_object.html
Ÿ¤ŸT
†G™?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_ATOMICC API: Device CharacteristicsThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_iocap_atomic.htmlŽYS        SU›-sqlite3_close(), sqlite3_close_v2()C API: Closing A Database ConnectionThe 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 finalize all
prepared statements, close all BLOB handles, and
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/close.html
?&  #ì?‰*X 7u‘9sqlite3_db_filename()C API: Return The Filename For A Database ConnectionThe 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()

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/db_filename.html†4W   +_‹S-sqlite3_sleep()C API: Suspend Execution For A Short TimeThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/sleep.html„V K_†+Msqlite3_cancel_auto_extension()C API: Cancel Automatic Extension LoadingThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/cancel_auto_extension.html‰WU UE’/sqlite3_status(), sqlite3_status64()C API: SQLite Runtime StatusThese 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 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()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/status.html

;øˆf[       ;=C3struct sqlite3_snapshotC API: Database SnapshotAn 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.
1 Constructor: sqlite3_snapshot_get()
1 Destructor: sqlite3_snapshot_free()
3 Methods:
 sqlite3_snapshot_cmp(),
sqlite3_snapshot_open(),
sqlite3_snapshot_recover()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/snapshot.htmlŠ@Z
+A’oEsqlite3_filename_database(), sqlite3_filename_journal(), sqlite3_filename_wal()C API: Translate filenamesThese routines are available to 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/filename_database.html‹BY     si•
=sqlite3_create_module(), sqlite3_create_module_v2()C API: Register A Virtual Table ImplementationThese 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 created and any existing modules with the
same name are dropped.

See also: sqlite3_drop_modules()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/create_module.html
¯
n  į„^      =g†c?sqlite3_result_subtype()C API: Setting The Subtype Of An SQL FunctionThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/result_subtype.html‡']        =M'?sqlite3_get_autocommit()C API: Test For Auto-Commit ModeThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/get_autocommit.html…\        5Yˆ{7sqlite3_blob_bytes()C API: Return The Size Of An Open BLOBReturns 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/blob_bytes.html
'F£'ˆya
AY#USQLITE_DESERIALIZE_FREEONCLOSE, SQLITE_DESERIALIZE_RESIZEABLE, SQLITE_DESERIALIZE_READONLYC API: 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_deserialize_freeonclose.htmlƒ `     C]„}Esqlite3_context_db_handle()C API: Database Connection For FunctionsThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/context_db_handle.html7_     ==W?sqlite3_load_extension()C API: Load An ExtensionThis 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/load_extension.html
2ãE2„d      
-‡U3C API: File NameType sqlite3_filename is used by SQLite to pass filenames to the
xOpen method of a VFS. It may be cast to (const char*) and treated
as a normal, nul-terminated, UTF-8 buffer containing the filename, but
may also be passed to special APIs such as:


  sqlite3_filename_database()
  sqlite3_filename_journal()
  sqlite3_filename_wal()
  sqlite3_uri_parameter()
  sqlite3_uri_boolean()
  sqlite3_uri_int64()
  sqlite3_uri_key()

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/filename.html“c      Ae¤oCsqlite3_autovacuum_pages()C API: Autovacuum Compaction Amount CallbackThe sqlite3_autovacuum_pages(D,C,P,X) interface registers a callback
function C that is invoked prior to each autovacuum of the database
file.  The callback is passed a copy of the generic data pointer (P),
the schema-name of the attached database that is being autovacuumed,
the size of the database file in pages, the number of free pages,
and the number of bytes per page, respectively.  The callback should
return the number of free pages that should be removed by the
autovacuum.  If the callback returns zero, then no autovacuum happens.
If the value returned is greater than or equal to the number of
free pages, then a complete autovacuum happens.

If there are multiple ATTACH-ed database files that are being
modified as part of a transaction commit, then the autovacuum pages
callback is invoked separately for each file.

The callback is not reentrant. The callback function should
not attempt to invoke any other SQLite interface.  If it does, bad
things may happen, including segmentation faults and corrupt database
files.  The callback function should be a simple function that
does some arithmetic on its input parameters and returns a result.

The X parameter to sqlite3_autovacuum_pages(D,C,P,X) is an optional
destructor for the P parameter.  If X is not NULL, then X(P) is
invoked whenever the database connection closes or when the callback
is overwritten by another invocation of sqlite3_autovacuum_pages().

There is only one autovacuum pages callback per database connection.
Each call to the sqlite3_autovacuum_pages() interface overrides all
previous invocations for that database connection.  If the callback
argument (C) to sqlite3_autovacuum_pages(D,C,P,X) is a NULL pointer,
then the autovacuum steps callback is cancelled.  The return value
from sqlite3_autovacuum_pages() is normally SQLITE_OK, but might
be some other error code if something goes wrong.  The current
implementation will only return SQLITE_OK or SQLITE_MISUSE, but other
return codes might be added in future releases.

If no autovacuum pages callback is specified (the usual case) or
a NULL pointer is provided for the callback,
then the default behavior is to vacuum all free pages.  So, in other
words, the default behavior is the same as if the callback function
were something like this:


See also lists of
  Objects,
  Constants, and
  Functions.c3ref/autovacuum_pages.html†b      CiŠeEsqlite3_overload_function()C API: Overload A Function For A Virtual TableVirtual 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/overload_function.html
¯        Ø诌6g       ;c—3=sqlite3_db_cacheflush()C API: Flush caches to disk mid-transactionIf 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/db_cacheflush.htmlÀ,f
ƒgOü 9sqlite3_column_blob(), sqlite3_column_double(), sqlite3_column_int(), sqlite3_column_int64(), sqlite3_column_text(), sqlite3_column_text16(), sqlite3_column_value(), sqlite3_column_bytes(), sqlite3_column_bytes16(), sqlite3_column_type()C API: Result Values From A QuerySummary:


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 evaluatŒ%e  QY—1sqlite3_trace(), sqlite3_profile()C API: Tracing And Profiling FunctionsThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/profile.htmlžed (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
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.

Strings returned by sqlite3_column_text16() always have the endianness
which is native to the platform, regardless of the text encoding set
for the database.

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.

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:



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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/column_blob.html
q qƒ)i =„y?sqlite3_stmt_isexplain()C API: Query The EXPLAIN Setting For A Prepared StatementThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/stmt_isexplain.html`h        5kš7sqlite3_threadsafe()C API: Test To See If The Library Is ThreadsafeThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/threadsafe.html
™½™„!k   9{†u;sqlite3_drop_modules()C API: Remove Unnecessary Virtual Table ImplementationsThe 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()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/drop_modules.html˜@j  AO¯Y9struct sqlite3_mem_methodsC API: Memory Allocation RoutinesAn 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_MAIN 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/mem_methods.html
Íd͆;n
‡w3„;1sqlite3_file_control(), sqlite3_log(), sqlite3_step(), SQLITE_OK, SQLITE_ERROR, SQLITE_INTERNAL, SQLITE_PERM, SQLITE_BUSY, SQLITE_LOCKED, SQLITE_NOMEM, SQLITE_READONLY, SQLITE_INTERRUPT, SQLITE_IOERR, SQLITE_CORRUPT, SQLITE_NOTFOUND, SQLITE_FULL, SQLITE_CANTOPEN, SQLITE_PROTOCOL, SQLITE_EMPTY, SQLITE_SCHEMA, SQLITE_TOOBIG, SQLITE_CONSTRAINT, SQLITE_MISMATCH, SQLITE_MISUSE, SQLITE_NOLFS, SQLITE_AUTH, SQLITE_FORMAT, SQLITE_RANGE, SQLITE_NOTADB, SQLITE_NOTICE, SQLITE_WARNING, SQLITE_ROW, SQLITE_DONEC API: Result CodesMany 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
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_abort.htmlŠVm
O“;ASQLITE_SYNC_NORMAL, SQLITE_SYNC_FULL, SQLITE_SYNC_DATAONLYC API: Synchronization Type FlagsWhen 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.)
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_sync_dataonly.html‡l       3O5sqlite3_db_status()C API: Database Connection StatusThis 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/db_status.html
˜¥R˜‰7r     q{m7SQLITE_TXN_NONE, SQLITE_TXN_READ, SQLITE_TXN_WRITEC API: Allowed return values from [sqlite3_txn_state()]These constants define the current transaction state of a database file.
The sqlite3_txn_state(D,S) interface returns one of these
constants in order to describe the transaction state of schema S
in database connection D.



 SQLITE_TXN_NONE
The SQLITE_TXN_NONE state means that no transaction is currently
pending.


 SQLITE_TXN_READ
The SQLITE_TXN_READ state means that the database is currently
in a read transaction.  Content has been read from the database file
but nothing in the database file has changed.  The transaction state
will advanced to SQLITE_TXN_WRITE if any changes occur and there are
no other conflicting concurrent write transactions.  The transaction
state will revert to SQLITE_TXN_NONE following a ROLLBACK or
COMMIT.


 SQLITE_TXN_WRITE
The SQLITE_TXN_WRITE state means that the database is currently
in a write transaction.  Content has been written to the database file
but has not yet committed.  The transaction state will change to
to SQLITE_TXN_NONE at the next ROLLBACK or COMMIT.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_txn_none.html‚Pq    9eƒi;sqlite3_declare_vtab()C API: Declare The Schema Of A Virtual TableThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/declare_vtab.htmlŠvp
Q“s3sqlite3_vfs_find(), sqlite3_vfs_register(), sqlite3_vfs_unregister()C API: Virtual File System ObjectsA 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vfs_find.html‡_o      +]Ž+-sqlite3_reset()C API: Reset A Prepared Statement ObjectThe 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_*() 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 bindings on the prepared statement S.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/reset.html

(»‡5u     
IŽ
)C API: Error Logging InterfaceThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/log.htmlŽjt   5cœ'7sqlite3_blob_write()C API: Write Data Into A BLOB IncrementallyThis 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/blob_write.html…Us    AQŠ9struct sqlite3_vtab_cursorC API: Virtual Table Cursor ObjectEvery 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
xOpen method of the module and are destroyed
by the 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vtab_cursor.html
:
:…Dx    ;Q‰WGSQLITE_SERIALIZE_NOCOPYC API: Flags for sqlite3_serializeZero 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_serialize_nocopy.html…w    3[ˆe5sqlite3_next_stmt()C API: Find the next prepared statementThis 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/next_stmt.htmlŠvv     
I”};C API: Experimental InterfacesSQLite C Interface

Experimental And Deprecated Interfaces

SQLite interfaces can be subdivided into three categories:


Stable
Experimental
Deprecated


Stable interfaces will be maintained indefinitely in a backwards
compatible way.  An application that uses only stable interfaces
should always be able to relink against a newer version of SQLite
without any changes.

Experimental interfaces are subject to change.  
Applications that use experimental interfaces
may need to be modified when upgrading to a newer SQLite release, though
this is rare.
When new interfaces are added to SQLite, they generally begin
as experimental interfaces.  After an interface has been in use for
a while and the developers are confident that the design of the interface
is sound and worthy of long-term support, the interface is marked
as stable.

Deprecated interfaces have been superceded by better methods of
accomplishing the same thing and should be avoided in new applications.
Deprecated interfaces continue to be supported for the sake of
backwards compatibility.  At some point in the future, it is possible
that deprecated interfaces may be removed.

Key points:


Experimental interfaces are subject to change and/or removal 
at any time.

Deprecated interfaces should not be used in new code and might
be removed in some future release.c3ref/experimental.html
DD9y        ;w¹%=sqlite3_vtab_distinct()C API: Determine if a virtual table query is DISTINCTThis API may only be used from within an xBestIndex method
of a virtual table implementation. The result of calling this
interface from outside of xBestIndex() is undefined and probably harmful.

The sqlite3_vtab_distinct() interface returns an integer between 0 and
3.  The integer returned by sqlite3_vtab_distinct()
gives the virtual table additional information about how the query
planner wants the output to be ordered. As long as the virtual table
can meet the ordering requirements of the query planner, it may set
the "orderByConsumed" flag.


If the sqlite3_vtab_distinct() interface returns 0, that means
that the query planner needs the virtual table to return all rows in the
sort order defined by the "nOrderBy" and "aOrderBy" fields of the
sqlite3_index_info object.  This is the default expectation.  If the
virtual table outputs all rows in sorted order, then it is always safe for
the xBestIndex method to set the "orderByConsumed" flag, regardless of
the return value from sqlite3_vtab_distinct().

If the sqlite3_vtab_distinct() interface returns 1, that means
that the query planner does not need the rows to be returned in sorted order
as long as all rows with the same values in all columns identified by the
"aOrderBy" field are adjacent.  This mode is used when the query planner
is doing a GROUP BY.

If the sqlite3_vtab_distinct() interface returns 2, that means
that the query planner does not need the rows returned in any particular
order, as long as rows with the same values in all "aOrderBy" columns
are adjacent.  Furthermore, only a single row for each particular
combination of values in the columns identified by the "aOrderBy" field
needs to be returned.  It is always ok for two or more rows with the same
values in all "aOrderBy" columns to be returned, as long as all such rows
are adjacent.  The virtual table may, if it chooses, omit extra rows
that have the same value for all columns identified by "aOrderBy".
However omitting the extra rows is optional.
This mode is used for a DISTINCT query.

If the sqlite3_vtab_distinct() interface returns 3, that means
that the query planner needs only distinct rows but it does need the
rows to be sorted. The virtual table implementation is free to omit
rows that are identical in all aOrderBy columns, if it wants to, but
it is not required to omit any rows.  This mode is used for queries
that have both DISTINCT and ORDER BY clauses.


For the purposes of comparing virtual table output values to see if the
values are same value for sorting purposes, two NULL values are considered
to be the same.  In other words, the comparison operator is "IS"
(or "IS NOT DISTINCT FROM") and not "==".

If a virtual table implementation is unable to meet the requirements
specified above, then it must not set the "orderByConsumed" flag in the
sqlite3_index_info object or an incorrect answer may result.

A virtual table implementation is always free to return rows in any order
it wants, as long as the "orderByConsumed" flag is not set.  When the
the "orderByConsumed" flag is unset, the query planner will add extra
bytecode to ensure that the final results returned by the SQL query are
ordered correctly.  The use of the "orderByConsumed" flag and the
sqlite3_vtab_distinct() interface is merely an optimization.  Careful
use of the sqlite3_vtab_distinct() interface and the "orderByConsumed"
flag might help queries against a virtual table to run faster.  Being
overly aggressive and setting the "orderByConsumed" flag when it is not
valid to do so, on the other hand, might cause SQLite to return incorrect
results.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vtab_distinct.html
       ¨      ¨ŒUz  ]m—O3sqlite3_complete(), sqlite3_complete16()C API: Determine If An SQL Statement Is CompleteThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/complete.html
$‹$ˆd|  9m  ;sqlite3_snapshot_cmp()C API: Compare the ages of two snapshot handles.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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/snapshot_cmp.html–r{
„m¨IKSQLITE_STMTSTATUS_FULLSCAN_STEP, SQLITE_STMTSTATUS_SORT, SQLITE_STMTSTATUS_AUTOINDEX, SQLITE_STMTSTATUS_VM_STEP, SQLITE_STMTSTATUS_REPREPARE, SQLITE_STMTSTATUS_RUN, SQLITE_STMTSTATUS_FILTER_MISS, SQLITE_STMTSTATUS_FILTER_HIT, SQLITE_STMTSTATUS_MEMUSEDC API: Status Parameters for prepared statementsThese 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
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
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
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
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
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
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_FILTER_HIT
SQLITE_STMTSTATUS_FILTER_MISS
SQLITE_STMTSTATUS_FILTER_HIT is the number of times that a join
step was bypassed because a Bloom filter returned not-found.  The
corresponding SQLITE_STMTSTATUS_FILTER_MISS value is the number of
times that the Bloom filter returned a find, and thus the join step
had to be processed as normal.


 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.


See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_stmtstatus_counter.html
tãtŽl~    +9œi-sqlite3_limit()C API: Run-time LimitsThis 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
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_".)
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/limit.htmlˆ} 5A)7sqlite3_blob_close()C API: Close A BLOB HandleThis 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/blob_close.html
¨Z¨ƒ. W=…91sqlite3_stricmp(), sqlite3_strnicmp()C API: String ComparisonThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/stricmp.html‘#       3M¡=+struct sqlite3_stmtC API: Prepared Statement ObjectAn 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:


 Create the prepared statement object using sqlite3_prepare_v2().
 Bind values to parameters using the sqlite3_bind_*()
interfaces.
 Run the SQL by calling sqlite3_step() one or more times.
 Reset the prepared statement using sqlite3_reset() then go back
to step 2.  Do this zero or more times.
 Destroy the object using sqlite3_finalize().

6 Constructors:


sqlite3_prepare
sqlite3_prepare16
sqlite3_prepare16_v2
sqlite3_prepare16_v3
sqlite3_prepare_v2
sqlite3_prepare_v3



1 Destructor: sqlite3_finalize()
51 Methods:


sqlite3_bind_blob
sqlite3_bind_blob64
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_pointer
sqlite3_bind_text
sqlite3_bind_text16
sqlite3_bind_text64
sqlite3_bind_value
sqlite3_bind_zeroblob
sqlite3_bind_zeroblob64
sqlite3_clear_bindings
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_data_count
sqlite3_db_handle
sqlite3_expanded_sql
sqlite3_normalized_sql
sqlite3_reset
sqlite3_sql
sqlite3_step
sqlite3_stmt_busy
sqlite3_stmt_isexplain
sqlite3_stmt_readonly
sqlite3_stmt_scanstatus
sqlite3_stmt_scanstatus_reset
sqlite3_stmt_status



See also lists of
  Objects,
  Constants, and
  Functions.c3ref/stmt.html
ôô     eIªK9sqlite3_get_auxdata(), sqlite3_set_auxdata()C API: Function Auxiliary DataThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/get_auxdata.html
c[ct       3Cš_5sqlite3_serialize()C API: Serialize a databaseThe 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 omitted if SQLite is compiled with the
SQLITE_OMIT_DESERIALIZE option.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/serialize.html‘!    q[ WAsqlite3_create_filename(), sqlite3_free_filename()C API: Create and Destroy VFS FilenamesThese 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 not 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).
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/create_filename.html
ll•
‚K§I1sqlite3_errcode(), sqlite3_extended_errcode(), sqlite3_errmsg(), sqlite3_errmsg16(), sqlite3_errstr(), sqlite3_error_offset()C API: Error Codes And MessagesIf 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 include the following:


 sqlite3_errcode()
 sqlite3_extended_errcode()
 sqlite3_errmsg()
 sqlite3_errmsg16()
 sqlite3_error_offset()


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.

If the most recent error references a specific token in the input
SQL, the sqlite3_error_offset() interface returns the byte offset
of the start of that token.  The byte offset returned by
sqlite3_error_offset() assumes that the input SQL is UTF8.
If the most recent error does not reference a specific token in the input
SQL, then the sqlite3_error_offset() function returns -1.

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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/errcode.html‡v      5WŽK7sqlite3_randomness()C API: Pseudo-Random Number GeneratorSQLite contains a high-quality pseudo-random number generator (PRNG) used to
select random 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/randomness.html_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 controls
or indicates the lifetime of the object referenced by the third parameter.
These three options exist:
 (1) A destructor to dispose of the BLOB or string after SQLite has finished
with it may be passed. It 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.
 (2) The special constant, SQLITE_STATIC, may be passsed to indicate that
the application remains responsible for disposing of the object. In this
case, the object and the provided pointer to it must remain valid until
either the prepared statement is finalized or the same SQL parameter is
bound to something else, whichever occurs sooner.
 (3) The constant, SQLITE_TRANSIENT, may be passed to indicate that the
object is to be copied prior to the return from sqlite3_bind_*(). The
object and pointer to it must remain valid until then. SQLite will then
manage the lifetime of its private copy.

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
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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/bind_blob.html
ÀÀ¶4
„Weç5sqlite3_bind_blob(), sqlite3_bind_blob64(), sqlite3_bind_double(), sqlite3_bind_int(), sqlite3_bind_int64(), sqlite3_bind_null(), sqlite3_bind_text(), sqlite3_bind_text16(), sqlite3_bind_text64(), sqlite3_bind_value(), sqlite3_bind_pointer(), sqlite3_bind_zeroblob(), sqlite3_bind_zeroblob64()C API: Binding Values To Prepared StatementsIn 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.


 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-
Õ'Õ‚N   -G„9SQLITE_SHM_NLOCKC API: Maximum xShmLock indexThe 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
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_shm_nlock.html‘U  ;¡U=sqlite3_snapshot_open()C API: Start a read transaction on an historical snapshotThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/snapshot_open.html
nn‚ I]‚OKsqlite3_reset_auto_extension()C API: Reset Automatic Extension LoadingThis interface disables all automatic extensions previously
registered using sqlite3_auto_extension().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/reset_auto_extension.htmlƒ
        53…;-struct sqlite3_mutexC API: Mutex HandleThe 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/mutex.html•`         9{©s;sqlite3_busy_handler()C API: Register A Callback To Handle SQLITE_BUSY ErrorsThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/busy_handler.html
x
%x‡     =E?sqlite3_wal_checkpoint()C API: Checkpoint a databaseThe 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/wal_checkpoint.htmlŒ
       gQ–W7sqlite3_mutex_held(), sqlite3_mutex_notheld()C API: Mutex Verification RoutinesThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/mutex_held.html‹W   wy•!?sqlite3_auto_extension(), struct sqlite3_api_routinesC API: Automatically Load Statically Linked ExtensionsThis 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:



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()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/auto_extension.htmlion.

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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/unlock_notify.html
(L(† 
†31…A;SQLITE_MUTEX_FAST, SQLITE_MUTEX_RECURSIVE, SQLITE_MUTEX_STATIC_MAIN, SQLITE_MUTEX_STATIC_MEM, SQLITE_MUTEX_STATIC_MEM2, SQLITE_MUTEX_STATIC_OPEN, SQLITE_MUTEX_STATIC_PRNG, SQLITE_MUTEX_STATIC_LRU, SQLITE_MUTEX_STATIC_LRU2, 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_VFS3C API: Mutex TypesThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_mutex_fast.html…1 3K‰[+struct sqlite3_blobC API: A Handle To An Open BLOBAn instance of this object represents an open BLOB on which
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.
1 Constructor: sqlite3_blob_open()
1 Destructor: sqlite3_blob_close()
4 Methods:
 sqlite3_blob_bytes(),
sqlite3_blob_read(),
sqlite3_blob_reopen(),
sqlite3_blob_write()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/blob.html¯s ;AÞO=sqlite3_unlock_notify()C API: Unlock NotificationWhen 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 connect²
7
-7r
„M™uCSQLITE_LIMIT_LENGTH, SQLITE_LIMIT_SQL_LENGTH, SQLITE_LIMIT_COLUMN, SQLITE_LIMIT_EXPR_DEPTH, SQLITE_LIMIT_COMPOUND_SELECT, SQLITE_LIMIT_VDBE_OP, SQLITE_LIMIT_FUNCTION_ARG, SQLITE_LIMIT_ATTACHED, SQLITE_LIMIT_LIKE_PATTERN_LENGTH, SQLITE_LIMIT_VARIABLE_NUMBER, SQLITE_LIMIT_TRIGGER_DEPTH, SQLITE_LIMIT_WORKER_THREADSC API: Run-Time Limit CategoriesThese 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 in SQLite.



 SQLITE_LIMIT_LENGTH
The maximum size of any string or BLOB or table row, in bytes.


 SQLITE_LIMIT_SQL_LENGTH
The maximum length of an SQL statement, in bytes.


 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
The maximum depth of the parse tree on any expression.


 SQLITE_LIMIT_COMPOUND_SELECT
The maximum number of terms in a compound SELECT statement.


 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
The maximum number of arguments on a function.


 SQLITE_LIMIT_ATTACHED
The maximum number of attached databases.



SQLITE_LIMIT_LIKE_PATTERN_LENGTH
The maximum length of the pattern argument to the LIKE or
GLOB operators.



SQLITE_LIMIT_VARIABLE_NUMBER
The maximum index number of any parameter in an SQL statement.


 SQLITE_LIMIT_TRIGGER_DEPTH
The maximum depth of recursion for triggers.


 SQLITE_LIMIT_WORKER_THREADS
The maximum number of auxiliary worker threads that a single
prepared statement may start.

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_limit_attached.html…     
C‰I-C API: 64-Bit Integer TypesBecause 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/int64.htmlŠ9        }O“Csqlite3_collation_needed(), sqlite3_collation_needed16()C API: Collation Needed CallbacksTo 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/collation_needed.html
iëiŒ~     qU˜=sqlite3_total_changes(), sqlite3_total_changes64()C API: Total Number Of Rows ModifiedThese functions return 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. The two functions are identical except for the
type of the return value and that if the number of rows modified by the
connection exceeds the maximum value supported by type "int", then
the return value of sqlite3_total_changes() is undefined. 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

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/total_changes.htmlŽ        1Q›3sqlite3_wal_hook()C API: Write-Ahead Log Commit HookThe 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. The return value is
a copy of the third parameter from the previous call, if any, or 0.
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/wal_hook.htmla 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
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/create_function.html
-Ú-¤!        =cÇ?sqlite3_set_authorizer()C API: Compile-Time Authorization CallbacksThis 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 i¸´
y[å?Asqlite3_create_function(), sqlite3_create_function16(), sqlite3_create_function_v2(), sqlite3_create_window_function()C API: Create Or Redefine SQL FunctionsThese 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
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 ¶s 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 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 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 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/set_authorizer.html
h   Æh¦R
‚KCÉmIsqlite3_preupdate_hook(), sqlite3_preupdate_old(), sqlite3_preupdate_count(), sqlite3_preupdate_depth(), sqlite3_preupdate_new(), sqlite3_preupdate_blobwrite()C API: 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 preºŒ6 7G—W9sqlite3_deserialize()C API: Deserialize a databaseThe 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.

It is not possible to deserialized into the TEMP database.  If the
S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the
function returns SQLITE_ERROR.

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 omitted if SQLite is compiled with the
SQLITE_OMIT_DESERIALIZE option.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/deserialize.htmlupdate 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_sequence 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
DELETE 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.

When the sqlite3_blob_write() API is used to update a blob column,
the pre-update hook is invoked with SQLITE_DELETE. This is because the
in this case the new values are not available. In this case, when a
callback made with op==SQLITE_DELETE is actuall a write using the
sqlite3_blob_write() API, the sqlite3_preupdate_blobwrite() returns
the index of the column being written. In other cases, where the
pre-update hook is being invoked for some other reason, including a
regular DELETE, sqlite3_preupdate_blobwrite() returns -1.

See also:  sqlite3_update_hook()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/preupdate_blobwrite.html
‘{
'E¡y1SQLITE_TRACE_STMT, SQLITE_TRACE_PROFILE, SQLITE_TRACE_ROW, SQLITE_TRACE_CLOSEC API: SQL Trace Event CodesThese 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
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
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
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
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.

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_trace.html
=ÑC=Š 17“3sqlite3_trace_v2()C API: SQL Trace HookThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/trace_v2.htmlƒ
      ?c„SAsqlite3_soft_heap_limit()C API: Deprecated Soft Heap Limit InterfaceThis 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/soft_heap_limit.html’+      
o£=?C API: Name Of The Folder Holding Temporary FilesIf 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 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:


See also lists of
  Objects,
  Constants, and
  Functions.c3ref/temp_directory.html
K_¡K‚R!   KMƒaMsqlite3_stmt_scanstatus_reset()C API: Zero Scan-Status CountersZero 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/stmt_scanstatus_reset.html…:         =Q‰I?sqlite3_release_memory()C API: Attempt To Free Heap MemoryThe 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()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/release_memory.html‘       ;} g=sqlite3_stmt_readonly()C API: Determine If An SQL Statement Writes The DatabaseThe 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:



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 IMMEDIATE and
BEGIN EXCLUSIVE commands do touch the database and so
sqlite3_stmt_readonly() returns false for those commands.

This routine returns false if there is any possibility that the
statement might change the database file.  A false return does
not guarantee that the statement will change the database file.
For example, an UPDATE statement might have a WHERE clause that
makes it a no-op, but the sqlite3_stmt_readonly() result would still
be false.  Similarly, a CREATE TABLE IF NOT EXISTS statement is a
read-only no-op if the table already exists, but
sqlite3_stmt_readonly() still returns false for such a statement.

If prepared statement X is an EXPLAIN or EXPLAIN QUERY PLAN
statement, then sqlite3_stmt_readonly(X) returns the same value as
if the EXPLAIN or EXPLAIN QUERY PLAN prefix were omitted.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/stmt_readonly.html
((“T"     5W¦-struct sqlite3_valueC API: Dynamically Typed Value ObjectSQLite 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 objects returned by sqlite3_vtab_rhs_value()
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_type() family of
interfaces require protected sqlite3_value objects.
19 Methods:


sqlite3_value_blob
sqlite3_value_bytes
sqlite3_value_bytes16
sqlite3_value_double
sqlite3_value_dup
sqlite3_value_encoding
sqlite3_value_free
sqlite3_value_frombind
sqlite3_value_int
sqlite3_value_int64
sqlite3_value_nochange
sqlite3_value_numeric_type
sqlite3_value_pointer
sqlite3_value_subtype
sqlite3_value_text
sqlite3_value_text16
sqlite3_value_text16be
sqlite3_value_text16le
sqlite3_value_type



See also lists of
  Objects,
  Constants, and
  Functions.c3ref/value.html
ííš#
9[±q9sqlite3_uri_parameter(), sqlite3_uri_boolean(), sqlite3_uri_int64(), sqlite3_uri_key()C API: Obtain Values For URI ParametersThese are utility routines, useful to 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 (2020-01-22) 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/uri_boolean.html

)
)‹S$
‚#Y”7sqlite3_str_appendf(), sqlite3_str_vappendf(), sqlite3_str_append(), sqlite3_str_appendall(), sqlite3_str_appendchar(), sqlite3_str_reset()C API: Add Content To A Dynamic StringThese 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).
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/str_append.html
ii•%
'a§iUSQLITE_VTAB_CONSTRAINT_SUPPORT, SQLITE_VTAB_INNOCUOUS, SQLITE_VTAB_DIRECTONLYC API: Virtual Table Configuration OptionsThese 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
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 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
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
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.


See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_vtab_constraint_support.html

pܤ~(
†QoÈGSQLITE_DBSTATUS_LOOKASIDE_USED, SQLITE_DBSTATUS_CACHE_USED, SQLITE_DBSTATUS_SCHEMA_USED, SQLITE_DBSTATUS_STMT_USED, SQLITE_DBSTATUS_LOOKASIDE_HIT, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, SQLITE_DBSTATUS_CACHE_HIT, SQLITE_DBSTATUS_CACHE_MISS, SQLITE_DBSTATUS_CACHE_WRITE, SQLITE_DBSTATUS_DEFERRED_FKS, SQLITE_DBSTATUS_CACHE_USED_SHARED, SQLITE_DBSTATUS_CACHE_SPILL, SQLITE_DBSTATUS_MAXC API: Status Parameters for database connectionsThese 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
This parameter returns the number of lookaside memory slots currently
chÉa'
IK‘Isqlite3_win32_set_directory(), sqlite3_win32_set_directory8(), sqlite3_win32_set_directory16()C API: Win32 Specific InterfaceThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/win32_set_directory.html‹&
[”7sqlite3_libversion(), sqlite3_sourceid(), sqlite3_libversion_number()C API: Run-Time Library Version NumbersThese 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.



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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/libversion.htmlecked out.


 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
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
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
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
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
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
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
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
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
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
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
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.


See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_dbstatus_options.html
©R©ƒ%* 1s…3sqlite3_db_mutex()C API: Retrieve the mutex for a database connectionThis 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/db_mutex.html—*)
7¬]ASQLITE_DETERMINISTIC, SQLITE_DIRECTONLY, SQLITE_SUBTYPE, SQLITE_INNOCUOUSC API: Function FlagsThese constants may be ORed together with the
preferred text encoding as the fourth argument
to sqlite3_create_function(), sqlite3_create_function16(), or
sqlite3_create_function_v2().



 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() function is deterministic, for example, but
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
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
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() 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() 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
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).


See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_deterministic.html
óô‚a-        K[ƒqMsqlite3_set_last_insert_rowid()C API: Set the Last Insert Rowid value.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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/set_last_insert_rowid.html©s,
‚_Ðe7struct sqlite3_index_info, struct sqlite3_index_constraint, struct sqlite3_index_orderby, struct sqlite3_index_constraint_usageC API: Virtual Table Indexing InformationThe 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:



where OP is =, &lt;, &lt;=, &gt;, or &gt;=.  The particular operator is
stored in aConstraint[].op using one of the
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 querÆŽ        +
k™u=sqlite3_vtab_in_first(), sqlite3_vtab_in_next()C API: Find all elements on the right-hand side of an IN constraint.These interfaces are only useful from within the
xFilter() method of a virtual table implementation.
The result of invoking these interfaces from any other context
is undefined and probably harmful.

The X parameter in a call to sqlite3_vtab_in_first(X,P) or
sqlite3_vtab_in_next(X,P) must be one of the parameters to the
xFilter method which invokes these routines, and specifically
a parameter that was previously selected for all-at-once IN constraint
processing use the sqlite3_vtab_in() interface in the
xBestIndex method.  If the X parameter is not
an xFilter argument that was selected for all-at-once IN constraint
processing, then these routines return SQLITE_MISUSE or perhaps
exhibit some other undefined or harmful behavior.

Use these routines to access all values on the right-hand side
of the IN constraint using code like the following:



On success, the sqlite3_vtab_in_first(X,P) and sqlite3_vtab_in_next(X,P)
routines return SQLITE_OK and set *P to point to the first or next value
on the RHS of the IN constraint.  If there are no more values on the
right hand side of the IN constraint, then *P is set to NULL and these
routines return SQLITE_DONE.  The return value might be
some other value, such as SQLITE_NOMEM, in the event of a malfunction.

The *ppOut values returned by these routines are only valid until the
next call to either of these routines or until the end of the xFilter
method from which these routines were called.  If the virtual table
implementation needs to retain the *ppOut values for longer, it must make
copies.  The *ppOut values are protected.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vtab_in_first.htmlied.

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 =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 (2013-12-06).
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 (2015-10-14).
It may therefore only be used if
sqlite3_libversion_number() returns a value greater than or equal to
3009000.
3 Methods:
 sqlite3_vtab_collation(),
sqlite3_vtab_distinct(),
sqlite3_vtab_rhs_value()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/index_info.html
펫í‰:0      ya{Asqlite3_column_decltype(), sqlite3_column_decltype16()C API: Declared Datatype Of A Query ResultThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/column_decltype.html‹_/
#5•=ISQLITE_PREPARE_PERSISTENT, SQLITE_PREPARE_NORMALIZE, SQLITE_PREPARE_NO_VTABC API: Prepare FlagsThese 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
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
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
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.

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_prepare_normalize.htmlˆn.  /_?1sqlite3_str_new()C API: Create A New Dynamic String ObjectThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/str_new.html
íí‹4   AK•Csqlite3_progress_handler()C API: Query Progress CallbacksThe 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.

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/progress_handler.html‚m3     Kiƒ{Msqlite3_extended_result_codes()C API: Enable Or Disable Extended Result CodesThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/extended_result_codes.html‰;2        7Y‘O9sqlite3_blob_reopen()C API: Move a BLOB Handle to a New RowThis 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/blob_reopen.html†=1
#]ŠYASQLITE_SHM_UNLOCK, SQLITE_SHM_LOCK, SQLITE_SHM_SHARED, SQLITE_SHM_EXCLUSIVEC API: Flags for the xShmLock VFS methodThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_shm_exclusive.html
f
C÷Êf¤X8       CEÈEsqlite3_wal_checkpoint_v2()C API: Checkpoint a databaseThe 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ʈ)7  {Ž5Esqlite3_compileoption_used(), sqlite3_compileoption_get()C API: Run-Time Library Compilation Options DiagnosticsThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/compileoption_get.html„H6    3u‡U5sqlite3_txn_state()C API: Determine the transaction state of a databaseThe sqlite3_txn_state(D,S) interface returns the current
transaction state of schema S in database connection D.  If S is NULL,
then the highest transaction state of any schema on database connection D
is returned.  Transaction states are (in order of lowest to highest):

 SQLITE_TXN_NONE
 SQLITE_TXN_READ
 SQLITE_TXN_WRITE

If the S argument to sqlite3_txn_state(D,S) is not the name of
a valid schema, then -1 is returned.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/txn_state.html‹95    ?W•=Asqlite3_stmt_scanstatus()C API: Prepared Statement Scan StatusThis 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()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/stmt_scanstatus.html 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
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/wal_checkpoint_v2.html
·Ë·:
†CÑ7sqlite3_value_blob(), sqlite3_value_double(), sqlite3_value_int(), sqlite3_value_int64(), sqlite3_value_pointer(), sqlite3_value_text(), sqlite3_value_text16(), sqlite3_value_text16le(), sqlite3_value_text16be(), sqlite3_value_bytes(), sqlite3_value_bytes16(), sqlite3_value_type(), sqlite3_value_numeric_type(), sqlite3_value_nochange(), sqlite3_value_frombind(), sqlite3_value_encoding()C API: Obtaining SQL ValuesSummary:


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 retuÌ19
‚#g9?SQLITE_SCANSTAT_NLOOP, SQLITE_SCANSTAT_NVISIT, SQLITE_SCANSTAT_EST, SQLITE_SCANSTAT_NAME, SQLITE_SCANSTAT_EXPLAIN, SQLITE_SCANSTAT_SELECTIDC API: Prepared Statement Scan Status OpcodesThe 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
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
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
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
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
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_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.

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_scanstat_est.htmlrn 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
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 datatype after conversion is returned.

The sqlite3_value_encoding(X) interface returns one of SQLITE_UTF8,
SQLITE_UTF16BE, or SQLITE_UTF16LE according to the current encoding
of the value X, assuming that X has type TEXT.  If sqlite3_value_type(X)
returns something other than SQLITE_TEXT, then the return value from
sqlite3_value_encoding(X) is meaningless.  Calls to
sqlite3_value_text(X), sqlite3_value_text16(X), sqlite3_value_text16be(X),
sqlite3_value_text16le(X), sqlite3_value_bytes(X), or
sqlite3_value_bytes16(X) might change the encoding of the value X and
thus change the return from subsequent calls to sqlite3_value_encoding(X).

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()
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/value_blob.html
šÑÙöš‚X>
Eƒ!YSQLITE_WIN32_DATA_DIRECTORY_TYPE, SQLITE_WIN32_TEMP_DIRECTORY_TYPEC API: Win32 Directory TypesThese macros are only available on Windows.  They define the allowed values
for the type argument to the sqlite3_win32_set_directory interface.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_win32_data_directory_type.htmlƒ_=  Cm…kEsqlite3_db_release_memory()C API: Free Memory Used By A Database ConnectionThe 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()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/db_release_memory.html‹t<    {c•s9SQLITE_VERSION, SQLITE_VERSION_NUMBER, SQLITE_SOURCE_IDC API: Compile-Time Library Version NumbersThe 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 (2009-09-11),
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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_source_id.htmlˆ+;  /{1sqlite3_db_name()C API: Return The Schema Name For A Database ConnectionThe sqlite3_db_name(D,N) interface returns a pointer to the schema name
for the N-th database on database connection D, or a NULL pointer of N is
out of range.  An N value of 0 means the main database file.  An N of 1 is
the "temp" schema.  Larger values of N correspond to various ATTACH-ed
databases.

Space to hold the string that is returned by sqlite3_db_name() is managed
by SQLite itself.  The string might be deallocated by any operation that
changes the schema, including ATTACH or DETACH or calls to
sqlite3_serialize() or sqlite3_deserialize(), even operations that
occur on a different thread.  Applications that need to
remember the string long-term should make their own copy.  Applications that
are accessing the same database connection simultaneously on multiple
threads should mutex-protect calls to this API and should make their own
private copy of the result prior to releasing the mutex.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/db_name.html

]
’L@
ˆ
i›uMSQLITE_INDEX_CONSTRAINT_EQ, SQLITE_INDEX_CONSTRAINT_GT, SQLITE_INDEX_CONSTRAINT_LE, SQLITE_INDEX_CONSTRAINT_LT, SQLITE_INDEX_CONSTRAINT_GE, SQLITE_INDEX_CONSTRAINT_MATCH, SQLITE_INDEX_CONSTRAINT_LIKE, SQLITE_INDEX_CONSTRAINT_GLOB, SQLITE_INDEX_CONSTRAINT_REGEXP, SQLITE_INDEX_CONSTRAINT_NE, SQLITE_INDEX_CONSTRAINT_ISNOT, SQLITE_INDEX_CONSTRAINT_ISNOTNULL, SQLITE_INDEX_CONSTRAINT_ISNULL, SQLITE_INDEX_CONSTRAINT_IS, SQLITE_INDEX_CONSTRAINT_LIMIT, SQLITE_INDEX_CONSTRAINT_OFFSET, SQLITE_INDEX_CONSTRAINT_FUNCTIONC API: Virtual Table Constraint Operator CodesThese 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.

The left-hand operand of the operator is given by the corresponding
aConstraint[].iColumn field.  An iColumn of -1 indicates the left-hand
operand is the rowid.
The SQLITE_INDEX_CONSTRAINT_LIMIT and SQLITE_INDEX_CONSTRAINT_OFFSET
operators have no left-hand operand, and so for those operators the
corresponding aConstraint[].iColumn is meaningless and should not be
used.

All operator values from SQLITE_INDEX_CONSTRAINT_FUNCTION through
value 255 are reserved to represent functions that are overloaded
by the xFindFunction method of the virtual table
implementation.

The right-hand operands for each constraint might be accessible using
the sqlite3_vtab_rhs_value() interface.  Usually the right-hand
operand is only available if it appears as a single constant literal
in the input SQL.  If the right-hand operand is another column or an
expression (even a constant expression) or a parameter, then the
sqlite3_vtab_rhs_value() probably will not be able to extract it.
The SQLITE_INDEX_CONSTRAINT_ISNULL and
SQLITE_INDEX_CONSTRAINT_ISNOTNULL operators have no right-hand operand
and hence calls to sqlite3_vtab_rhs_value() for those operators will
always return SQLITE_NOTFOUND.

The collating sequence to be used for comparison can be found using
the sqlite3_vtab_collation() interface.  For most real-world virtual
tables, the collating sequence of constraints does not matter (for example
because the constraints are numeric) and so the sqlite3_vtab_collation()
interface is no commonly needed.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_index_constraint_eq.html‰?        9Q‘%1struct sqlite3_contextC API: SQL Function Context ObjectThe 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(),
sqlite3_aggregate_context(), sqlite3_user_data(),
sqlite3_context_db_handle(), sqlite3_get_auxdata(),
and/or sqlite3_set_auxdata().
26 Methods:


sqlite3_aggregate_context
sqlite3_context_db_handle
sqlite3_get_auxdata
sqlite3_result_blob
sqlite3_result_blob64
sqlite3_result_double
sqlite3_result_error
sqlite3_result_error16
sqlite3_result_error_code
sqlite3_result_error_nomem
sqlite3_result_error_toobig
sqlite3_result_int
sqlite3_result_int64
sqlite3_result_null
sqlite3_result_pointer
sqlite3_result_subtype
sqlite3_result_text
sqlite3_result_text16
sqlite3_result_text16be
sqlite3_result_text16le
sqlite3_result_text64
sqlite3_result_value
sqlite3_result_zeroblob
sqlite3_result_zeroblob64
sqlite3_set_auxdata
sqlite3_user_data



See also lists of
  Objects,
  Constants, and
  Functions.c3ref/context.html
¤Z¤‘2B 7_¡79sqlite3_update_hook()C API: Data Change Notification CallbacksThe 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_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 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/update_hook.html‡"A  3{5sqlite3_stmt_busy()C API: Determine If A Prepared Statement Has Been ResetThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/stmt_busy.htmlÑailable if SQLite is compiled with SQLITE_DEBUG.



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.



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.



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.



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.



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.



No longer in use.



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=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 super-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.



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.



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.



The SQLITE_FCNTL_PERSIST_WAL opcode is used to set or query the
persistent WriÒte 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.



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.



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.



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.



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.



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.



The SQLITE_FCNTL_BUSYHANDLER
file-contrÓol 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.



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.



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.



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.



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.



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.



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.



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.



The SQLITE_FCNTL_ZIPVFS opcode is implemented by zipvfs only. All other
VFS should return SQLITE_NOTFOUND for this opcode.



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.



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.



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.



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.



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.



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.



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.



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.




The EXPERIMENTAL SQLITE_FCNTL_EXTERNAL_READER opcode is used to detect
whether or not there is a database client in another process with a wal-mode
transaction open on the database or not. It is only available on unix.The
(void*) argument passed with this file-control should be a pointer to a
value of type (int). The integer value is set to 1 if the database is a wal
mode database and there exists at least one client in another process that
currently has an SQL transaction open on the database. It is set to 0 if
the database is not a wal-mode db, or if there is no such connection in any
other process. This opcode cannot be used to detect transactions opened
by clients within the current process, only within other processes.




Used by the cksmvfs VFS module only.



If there is currently no transaction open on the database, and the
database is not a temp db, then this file-control purges the contents
of the in-memory page cache. If there is an open transaction, or if
the db is a temp-db, it is a no-op, not an error.

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_fcntl_begin_atomic_write.html
…       ´…’+D        io¢g9sqlite3_commit_hook(), sqlite3_rollback_hook()C API: Commit And Rollback Notification CallbacksThe sqlite3_commit_hook() interface registers a callback
function to be invoked whenever a transaction is 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 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/commit_hook.htmlŒ3CyU‚†_WSQLITE_FCNTL_LOCKSTATE, SQLITE_FCNTL_GET_LOCKPROXYFILE, SQLITE_FCNTL_SET_LOCKPROXYFILE, SQLITE_FCNTL_LAST_ERRNO, SQLITE_FCNTL_SIZE_HINT, SQLITE_FCNTL_CHUNK_SIZE, SQLITE_FCNTL_FILE_POINTER, SQLITE_FCNTL_SYNC_OMITTED, SQLITE_FCNTL_WIN32_AV_RETRY, SQLITE_FCNTL_PERSIST_WAL, SQLITE_FCNTL_OVERWRITE, SQLITE_FCNTL_VFSNAME, SQLITE_FCNTL_POWERSAFE_OVERWRITE, SQLITE_FCNTL_PRAGMA, SQLITE_FCNTL_BUSYHANDLER, SQLITE_FCNTL_TEMPFILENAME, SQLITE_FCNTL_MMAP_SIZE, SQLITE_FCNTL_TRACE, SQLITE_FCNTL_HAS_MOVED, SQLITE_FCNTL_SYNC, SQLITE_FCNTL_COMMIT_PHASETWO, SQLITE_FCNTL_WIN32_SET_HANDLE, SQLITE_FCNTL_WAL_BLOCK, SQLITE_FCNTL_ZIPVFS, SQLITE_FCNTL_RBU, SQLITE_FCNTL_VFS_POINTER, SQLITE_FCNTL_JOURNAL_POINTER, SQLITE_FCNTL_WIN32_GET_HANDLE, SQLITE_FCNTL_PDB, SQLITE_FCNTL_BEGIN_ATOMIC_WRITE, SQLITE_FCNTL_COMMIT_ATOMIC_WRITE, SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE, SQLITE_FCNTL_LOCK_TIMEOUT, SQLITE_FCNTL_DATA_VERSION, SQLITE_FCNTL_SIZE_LIMIT, SQLITE_FCNTL_CKPT_DONE, SQLITE_FCNTL_RESERVE_BYTES, SQLITE_FCNTL_CKPT_START, SQLITE_FCNTL_EXTERNAL_READER, SQLITE_FCNTL_CKSM_FILE, SQLITE_FCNTL_RESET_CACHEC API: Standard File Control OpcodesThese integer constants are opcodes for the xFileControl method
of the sqlite3_io_methods object and for the sqlite3_file_control()
interface.




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 only avÐELETEONCLOSE 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.



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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vfs.html
dd¿E      _Aüy)sqlite3_syscall_ptr(), struct sqlite3_vfsC API: OS Interface ObjectAn 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 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 2007-09-04, then increased to 2
with SQLite version 3.7.0 on 2010-07-21, and then increased
to 3 with SQLite version 3.7.6 on 2011-04-12.  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 2008-07-16
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.



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_SUPER_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_DÕ
×#×–HG       C=«mEsqlite3_last_insert_rowid()C API: Last Insert RowidEach entry in most SQLite tables (except for WITHOUT ROWID tables)
has a unique 64-bit signed
integer key called the "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 INSERTs 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/last_insert_rowid.htmlƒYF    ;]…=sqlite3_value_subtype()C API: Finding The Subtype Of SQL ValuesThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/value_subtype.html
à    >à†ZI  9=Œ%;sqlite3_test_control()C API: Testing InterfaceThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/test_control.html>H 
m™e?C API: Name Of The Folder Holding Database FilesIf 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 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/data_directory.html
IIŸ3J
'U¼S7sqlite3_initialize(), sqlite3_shutdown(), sqlite3_os_init(), sqlite3_os_end()C API: Initialize The SQLite LibraryThe 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 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/initialize.html
œ˜ÂœÁ,N
ˆeùK9sqlite3_result_blob(), sqlite3_result_blob64(), sqlite3_result_double(), sqlite3_result_error(), sqlite3_result_error16(), sqlite3_result_error_toobig(), sqlite3_result_error_nomem(), sqlite3_result_error_code(), sqlite3_result_int(), sqlite3_result_int64(), sqlite3_result_null(), sqlite3_result_text(), sqlite3_result_text64(), sqlite3_result_text16(), sqlite3_result_text16le(), sqlite3_result_text16be(), sqlite3_result_value(), sqlite3_result_pointer(), sqlite3_result_zerobÛ„1M
‚7C…GAsqlite3_aggregate_count(), sqlite3_expired(), sqlite3_transfer_bindings(), sqlite3_global_recover(), sqlite3_thread_cleanup(), sqlite3_memory_alarm()C API: Deprecated FunctionsThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/aggregate_count.html‹RL
=•A?sqlite3_vtab_collation()C API: Determine The Collation For a Virtual Table ConstraintThis function may only be called from within a call to the xBestIndex
method of a virtual table.  This function returns a pointer to a string
that is the name of the appropriate collation sequence to use for text
comparisons on the constraint identified by its arguments.

The first argument must be the pointer to 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.

Important:
The first parameter must be the same pointer that is passed into the
xBestMethod() method.  The first parameter may not be a pointer to a
different sqlite3_index_info object, even an exact copy.

The return value is computed as follows:


 If the constraint comes from a WHERE clause expression that contains
a COLLATE operator, then the name of the collation specified by
that COLLATE operator is returned.
 If there is no COLLATE operator, but the column that is the subject
of the constraint specifies an alternative collating sequence via
a COLLATE clause on the column definition within the CREATE TABLE
statement that was passed into sqlite3_declare_vtab(), then the
name of that alternative collating sequence is returned.
 Otherwise, "BINARY" is returned.

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vtab_collation.htmlˆdK       oQgCsqlite3_memory_used(), sqlite3_memory_highwater()C API: Memory Allocator StatisticsSQLite 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/memory_highwater.htmlÜlob(), sqlite3_result_zeroblob64()C API: Setting The Result Of An SQL FunctionThese 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 any of the sqlite3_result_text* interfaces
other than sqlite3_result_text64() is negative, then SQLite computes
the string length itself by searching the 2nd parameter for 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/result_blob.html

YÅi†bR 3UŒ3+struct sqlite3_vtabC API: Virtual Table Instance ObjectEvery 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vtab.html‚XQ 
K„?;C API: Loadable Extension ThunkA 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/api_routines.htmlP 
a;C API: Low-Level Control Of Database FilesThe 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
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/file_control.html…#O 5M‰/7sqlite3_str_finish()C API: Finalize A Dynamic StringThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/str_finish.html
cícŽqT‹E‚‘Y[SQLITE_CONFIG_SINGLETHREAD, SQLITE_CONFIG_MULTITHREAD, SQLITE_CONFIG_SERIALIZED, SQLITE_CONFIG_MALLOC, SQLITE_CONFIG_GETMALLOC, SQLITE_CONFIG_SCRATCH, SQLITE_CONFIG_PAGECACHE, SQLITE_CONFIG_HEAP, SQLITE_CONFIG_MEMSTATUS, SQLITE_CONFIG_MUTEX, SQLITE_CONFIG_GETMUTEX, SQLITE_CONFIG_LOOKASIDE, SQLITE_CONFIG_PCACHE, SQLITE_CONFIG_GETPCACHE, SQLITE_CONFIG_LOG, SQLITE_CONFIG_URI, SQLITE_CONFIG_PCACHE2, SQLITE_CONFIG_GETPCACHE2, SQLITE_CONFIG_COVERING_INDEX_SCAN, SQLITE_CONFIG_SQLLOG, SQLITE_CONFIG_MMAP_SIZE, SQLITE_CONFIG_WIN32_HEAPSIZE, SQLITE_CONFIG_PCACHE_HDRSZ, SQLITE_CONFIG_PMASZ, SQLITE_CONFIG_STMTJRNL_SPILL, SQLITE_CONFIG_SMALL_MALLOC, SQLITE_CONFIG_SORTERREF_SIZE, SQLITE_CONFIG_MEMDB_MAXSIZEC API: Configuration OptionsThese 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
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=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
There are no arguments to this option.  This option sets the
threading mode to Multi-thread.  In other words, it disables
mutexing oßS      =]žg?sqlite3_vtab_rhs_value()C API: Constraint values in xBestIndex()This API may only be used from within the xBestIndex method
of a virtual table implementation. The result of calling this interface
from outside of an xBestIndex method are undefined and probably harmful.

When the sqlite3_vtab_rhs_value(P,J,V) interface is invoked from within
the xBestIndex method of a virtual table implementation, with P being
a copy of the sqlite3_index_info object pointer passed into xBestIndex and
J being a 0-based index into P->aConstraint[], then this routine
attempts to set *V to the value of the right-hand operand of
that constraint if the right-hand operand is known.  If the
right-hand operand is not known, then *V is set to a NULL pointer.
The sqlite3_vtab_rhs_value(P,J,V) interface returns SQLITE_OK if
and only if *V is set to a value.  The sqlite3_vtab_rhs_value(P,J,V)
inteface returns SQLITE_NOTFOUND if the right-hand side of the J-th
constraint is not available.  The sqlite3_vtab_rhs_value() interface
can return an result code other than SQLITE_OK or SQLITE_NOTFOUND if
something goes wrong.

The sqlite3_vtab_rhs_value() interface is usually only successful if
the right-hand operand of a constraint is a literal value in the original
SQL statement.  If the right-hand operand is an expression or a reference
to some other column or a host parameter, then sqlite3_vtab_rhs_value()
will probably return SQLITE_NOTFOUND.

Some constraints, such as SQLITE_INDEX_CONSTRAINT_ISNULL and
SQLITE_INDEX_CONSTRAINT_ISNOTNULL, have no right-hand operand.  For such
constraints, sqlite3_vtab_rhs_value() always returns SQLITE_NOTFOUND.

The sqlite3_value object returned in *V is a protected sqlite3_value
and remains valid for the duration of the xBestIndex method call.
When xBestIndex returns, the sqlite3_value object returned by
sqlite3_vtab_rhs_value() is automatically deallocated.

The "_rhs_" in the name of this routine is an abbreviation for
"Right-Hand Side".
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vtab_rhs_value.htmlàn 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=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
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=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
 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
 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
 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
 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
 The SQLITE_CONFIG_SCRATCH option is no longer used.



 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
 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
 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=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
 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=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
 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
 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
 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
 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
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
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 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
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 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
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
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
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
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
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
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 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.

See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_config_covering_index_scan.html
LDL“tV    Ko¦Msqlite3_table_column_metadata()C API: Extract Metadata About A Column Of A TableThe 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.



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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/table_column_metadata.html‡8U        /Co1sqlite3_strlike()C API: String LIKE MatchingThe 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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/strlike.htmlå
the data between the two databases, and finally
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()

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()

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_XXX extended error code.

The sqlite3_backup_step() might return SQLITE_READONLY if

 the destination database was opened read-only, or
 the destination database is using write-ahead-log journaling
and the destination and source page sizes differ, or
 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 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_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()

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() 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 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/backup_finish.html
‚.‚‹(X   -W•?/sqlite3_config()C API: Configuring The SQLite LibraryThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/config.htmlÇBW‚?Œ=sqlite3_backup_init(), sqlite3_backup_step(), sqlite3_backup_finish(), sqlite3_backup_remaining(), sqlite3_backup_pagecount()C API: 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:

sqlite3_backup_init() is called once to initialize the
backup,
sqlite3_backup_step() is called one or more times to transferä
ÊÊœ2Y
;W¶/Csqlite3_create_collation(), sqlite3_create_collation_v2(), sqlite3_create_collation16()C API: Define New Collating SequencesThese 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:


 If A==B then B==A.
 If A==B and B==C then A==C.
 If A&lt;B THEN B&gt;A.
 If A&lt;B and B&lt;C then A&lt;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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/create_collation.html
ÇÇ”5Z    _k§7sqlite3_get_table(), sqlite3_free_table()C API: Convenience Routines For Running QueriesThis 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:



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:



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().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/free_table.html
ú       þÅú‰G]  1a‘k3sqlite3_finalize()C API: Destroy A Prepared Statement ObjectThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/finalize.html†5\     9?‹Y;sqlite3_busy_timeout()C API: Set A Busy TimeoutThis routine sets a 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
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/busy_timeout.html‹~[

O–9sqlite3_str_errcode(), sqlite3_str_length(), sqlite3_str_value()C API: Status Of A Dynamic StringThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/str_errcode.html
š
Œ©‹šáUa
M]Áu+sqlite3_open(), sqlite3_open16()C API: Opening A New Database ConnectionThese 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 objecë„`        9Q‡;sqlite3_system_errno()C API: Low-level system error codeAttempt 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/system_errno.html__
KM;sqlite3_sql(), sqlite3_expanded_sql(), sqlite3_normalized_sql()C API: Retrieving Statement SQLThe 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 freed by the application
by passing it to sqlite3_free().

The sqlite3_normalized_sql() interface is only available if
the SQLITE_ENABLE_NORMALIZE compile-time option is defined.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/expanded_sql.html„p^ IgˆKsqlite3_bind_parameter_index()C API: Index Of A Parameter With A Given NameReturn the index of an SQL parameter given its name.  The
index value returned is suitable for use as the second
parameter to 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(),
sqlite3_bind_parameter_count(), and
sqlite3_bind_parameter_name().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/bind_parameter_index.htmlìt,
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().
The use of shared cache mode is discouraged and hence shared cache
capabilities may be omitted from many builds of SQLite.  In such cases,
this option is a no-op.

SQLITE_OPEN_PRIVATECACHE
The database is opened shared cache disabled, overriding
the default shared cache setting provided by
sqlite3_enable_shared_cache().


 SQLITE_OPEN_EXRESCODE
The database connection comes up in "extended result code mode".
In other words, the database behaves has if
sqlite3_extended_result_codes(db,1) where called on the database
connection as soon as the connection is created. In addition to setting
the extended result code mode, this flag also causes sqlite3_open_v2()
to return an extended result code.


 SQLITE_OPEN_NOFOLLOW
The database filename is not allowed to contain 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_* bits
then the behavior is undefined.  Historic versions of SQLite
have silently ignored surplus bits in the flags parameter to
sqlite3_open_v2(), however that behavior might not be carried through
into future versions of SQLite and so applications should not rely
upon it.  Note in particular that the SQLITE_OPEN_EXCLUSIVE flag is a no-op
for sqlite3_open_v2().  The SQLITE_OPEN_EXCLUSIVE does *not* cause
the open to fail if the databíase already exists.  The SQLITE_OPEN_EXCLUSIVE
flag is intended for use by the VFS interface only, and not
by sqlite3_open_v2().

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

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:").



The query component of a URI may contain parameters that are interpreted
either by SQLite itself, or by a 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 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.
Use "ro" instead:  "file:data.db?mode=ro".


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
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/open.html
‰‰’sb     )O¤_1struct sqlite3C API: Database Connection HandleEach 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.
3 Constructors:
 sqlite3_open(),
sqlite3_open16(),
sqlite3_open_v2()
2 Destructors:
 sqlite3_close(),
sqlite3_close_v2()
76 Methods:


sqlite3_autovacuum_pages
sqlite3_blob_open
sqlite3_busy_handler
sqlite3_busy_timeout
sqlite3_changes
sqlite3_changes64
sqlite3_collation_needed
sqlite3_collation_needed16
sqlite3_commit_hook
sqlite3_create_collation
sqlite3_create_collation16
sqlite3_create_collation_v2
sqlite3_create_function
sqlite3_create_function16
sqlite3_create_function_v2
sqlite3_create_module
sqlite3_create_module_v2
sqlite3_create_window_function
sqlite3_db_cacheflush
sqlite3_db_config
sqlite3_db_filename
sqlite3_db_mutex
sqlite3_db_name
sqlite3_db_readonly
sqlite3_db_release_memory
sqlite3_db_status
sqlite3_drop_modules
sqlite3_enable_load_extension
sqlite3_errcode
sqlite3_errmsg
sqlite3_errmsg16
sqlite3_error_offset
sqlite3_errstr
sqlite3_exec
sqlite3_extended_errcode
sqlite3_extended_result_codes
sqlite3_file_control
sqlite3_free_table
sqlite3_get_autocommit
sqlite3_get_table
sqlite3_interrupt
sqlite3_last_insert_rowid
sqlite3_limit
sqlite3_load_extension
sqlite3_next_stmt
sqlite3_overload_function
sqlite3_prepare
sqlite3_prepare16
sqlite3_prepare16_v2
sqlite3_prepare16_v3
sqlite3_prepare_v2
sqlite3_prepare_v3
sqlite3_preupdate_blobwrite
sqlite3_preupdate_count
sqlite3_preupdate_depth
sqlite3_preupdate_hook
sqlite3_preupdate_new
sqlite3_preupdate_old
sqlite3_profile
sqlite3_progress_handler
sqlite3_rollback_hook
sqlite3_set_authorizer
sqlite3_set_last_insert_rowid
sqlite3_system_errno
sqlite3_table_column_metadata
sqlite3_total_changes
sqlite3_total_changes64
sqlite3_trace
sqlite3_trace_v2
sqlite3_txn_state
sqlite3_unlock_notify
sqlite3_update_hook
sqlite3_wal_autocheckpoint
sqlite3_wal_checkpoint
sqlite3_wal_checkpoint_v2
sqlite3_wal_hook



See also lists of
  Objects,
  Constants, and
  Functions.c3ref/sqlite3.htmlðrst 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
 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
 This option is used to enable or disable 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.

Originally this option disabled all triggers.  However, since
SQLite version 3.35.0, TEMP triggers are still allowed even if
this option is off.  So, in other words, this option now only disables
triggers in the main database schema or in the schemas of ATTACH-ed
databases. 



SQLITE_DBCONFIG_ENABLE_VIEW
 This option is used to enable or disable 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.

Originally this option disabled all views.  However, since
SQLite version 3.35.0, TEMP views are still allowed even if
this option is off.  So, in other words, this option now only disables
views in the main database schema or in the schemas of ATTACH-ed
databases. 



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
 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 eitheñr 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
 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
 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
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
 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
 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:

 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.
 sqlite3_db_config(db, SQLITE_DBCONFIG_RESET_DATABASE, 1, 0);
 sqlite3_exec(db, "VACUUM", 0, 0, 0);
 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
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.
 The PRAGMA schema_version=N statement.
 Writes to the sqlite_dbpage virtual table.
 Direct writes to shadow tables.




 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
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
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
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
The SQLITE_DBCONFIG_TRUSTED_SCHEMA option tells SQLite to
assume that database schemas 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
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 (2004-06-18).  Without this setting,
newly created databases are generally not understandable by SQLite versions
prior to 3.3.0 (2006-01-11).  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.


See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_dbconfig_defensive.html
        3      3í9c‰mÐCKSQLITE_DBCONFIG_MAINDBNAME, SQLITE_DBCONFIG_LOOKASIDE, SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE, SQLITE_DBCONFIG_ENABLE_QPSG, SQLITE_DBCONFIG_TRIGGER_EQP, SQLITE_DBCONFIG_RESET_DATABASE, SQLITE_DBCONFIG_DEFENSIVE, SQLITE_DBCONFIG_WRITABLE_SCHEMA, SQLITE_DBCONFIG_LEGACY_ALTER_TABLE, SQLITE_DBCONFIG_DQS_DML, SQLITE_DBCONFIG_DQS_DDL, SQLITE_DBCONFIG_ENABLE_VIEW, SQLITE_DBCONFIG_LEGACY_FILE_FORMAT, SQLITE_DBCONFIG_TRUSTED_SCHEMA, SQLITE_DBCONFIG_MAXC API: Database Connection Configuration OptionsThese 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
 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 fiï
ff…3e  Kw‰3SQLITE_STATIC, SQLITE_TRANSIENTC API: Constants Defining Special Destructor BehaviorThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_static.html—_d     /{®1sqlite3_vtab_in()C API: Identify and handle IN constraints in xBestIndexThis interface may only be used from within an
xBestIndex() method of a virtual table implementation.
The result of invoking this interface from any other context is
undefined and probably harmful.

A constraint on a virtual table of the form
"column IN (...)" is
communicated to the xBestIndex method as a
SQLITE_INDEX_CONSTRAINT_EQ constraint.  If xBestIndex wants to use
this constraint, it must set the corresponding
aConstraintUsage[].argvIndex to a postive integer.  Then, under
the usual mode of handling IN operators, SQLite generates bytecode
that invokes the xFilter() method once for each value
on the right-hand side of the IN operator.  Thus the virtual table
only sees a single value from the right-hand side of the IN operator
at a time.

In some cases, however, it would be advantageous for the virtual
table to see all values on the right-hand of the IN operator all at
once.  The sqlite3_vtab_in() interfaces facilitates this in two ways:



A call to sqlite3_vtab_in(P,N,-1) will return true (non-zero)
if and only if the P->aConstraint[N] constraint
is an IN operator that can be processed all at once.  In other words,
sqlite3_vtab_in() with -1 in the third argument is a mechanism
by which the virtual table can ask SQLite if all-at-once processing
of the IN operator is even possible.


A call to sqlite3_vtab_in(P,N,F) with F==1 or F==0 indicates
to SQLite that the virtual table does or does not want to process
the IN operator all-at-once, respectively.  Thus when the third
parameter (F) is non-negative, this interface is the mechanism by
which the virtual table tells SQLite how it wants to process the
IN operator.


The sqlite3_vtab_in(P,N,F) interface can be invoked multiple times
within the same xBestIndex method call.  For any given P,N pair,
the return value from sqlite3_vtab_in(P,N,F) will always be the same
within the same xBestIndex call.  If the interface returns true
(non-zero), that means that the constraint is an IN operator
that can be processed all-at-once.  If the constraint is not an IN
operator or cannot be processed all-at-once, then the interface returns
false.

All-at-once processing of the IN operator is selected if both of the
following conditions are met:


 The P->aConstraintUsage[N].argvIndex value is set to a positive
integer.  This is how the virtual table tells SQLite that it wants to
use the N-th constraint.

 The last call to sqlite3_vtab_in(P,N,F) for which F was
non-negative had F>=1.


If either or both of the conditions above are false, then SQLite uses
the traditional one-at-a-time processing strategy for the IN constraint.
If both conditions are true, then the argvIndex-th parameter to the
xFilter method will be an sqlite3_value that appears to be NULL,
but which can be passed to sqlite3_vtab_in_first() and
sqlite3_vtab_in_next() to find all values on the right-hand side
of the IN constraint.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vtab_in.htmlUnpin() 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() 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() method must return the number of pages currently
stored in the cache, both pinned and unpinned.



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.



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() 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() 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.



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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/pcache_methods2.html
N¸N†fg        7eŒ9sqlite3_vtab_config()C API: Virtual Table Interface ConfigurationThis 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/vtab_config.html¸<f  IYï7Astruct sqlite3_pcache_methods2C API: Application Defined 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() 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() 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().



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 xô
“†“ƒoj      3{†5sqlite3_db_handle()C API: Find The Database Handle Of A Prepared StatementThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/db_handle.html†1i    1E‹e)struct sqlite3_strC API: Dynamic String ObjectAn instance of the sqlite3_str object contains a dynamically-sized
string under construction.

The lifecycle of an sqlite3_str object is as follows:

 The sqlite3_str object is created using sqlite3_str_new().
 Text is appended to the sqlite3_str object using various
methods, such as sqlite3_str_appendf().
 The sqlite3_str object is destroyed and the string it created
is returned using the sqlite3_str_finish() interface.

1 Constructor: sqlite3_str_new()
1 Destructor: sqlite3_str_finish()
9 Methods:


sqlite3_str_append
sqlite3_str_appendall
sqlite3_str_appendchar
sqlite3_str_appendf
sqlite3_str_errcode
sqlite3_str_length
sqlite3_str_reset
sqlite3_str_value
sqlite3_str_vappendf



See also lists of
  Objects,
  Constants, and
  Functions.c3ref/str.htmlˆAh  A]CCsqlite3_snapshot_recover()C API: Recover snapshots from a wal fileIf 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/snapshot_recover.html
œYœ…9l 7C‰k/struct sqlite3_moduleC API: Virtual Table ObjectThis 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/module.html—#k       }Q¬UEsqlite3_soft_heap_limit64(), sqlite3_hard_heap_limit64()C API: Impose A Limit On Heap SizeThese 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 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/hard_heap_limit64.html
¡        '6¡…p    9]ˆs;sqlite3_column_count()C API: Number Of Columns In A Result SetReturn 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()
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/column_count.html¡%o 
MÁg+C API: Evaluate An SQL StatementAfter 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_prù…fn      IKŠKsqlite3_bind_parameter_count()C API: Number Of SQL ParametersThis 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 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(),
sqlite3_bind_parameter_name(), and
sqlite3_bind_parameter_index().
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/bind_parameter_count.htmlkm 9Oš5;sqlite3_snapshot_get()C API: Record A Database SnapshotThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/snapshot_get.htmlepare_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 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 (2010-03-26,
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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/step.html
²
²ƒBr AK…a9struct sqlite3_pcache_pageC API: Custom Page Cache ObjectThe 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/pcache_page.html‹q
Ž]†ESQLITE_TESTCTRL_FIRST, SQLITE_TESTCTRL_PRNG_SAVE, SQLITE_TESTCTRL_PRNG_RESTORE, SQLITE_TESTCTRL_PRNG_RESET, SQLITE_TESTCTRL_BITVEC_TEST, SQLITE_TESTCTRL_FAULT_INSTALL, SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS, SQLITE_TESTCTRL_PENDING_BYTE, SQLITE_TESTCTRL_ASSERT, SQLITE_TESTCTRL_ALWAYS, SQLITE_TESTCTRL_RESERVE, SQLITE_TESTCTRL_OPTIMIZATIONS, SQLITE_TESTCTRL_ISKEYWORD, SQLITE_TESTCTRL_SCRATCHMALLOC, SQLITE_TESTCTRL_INTERNAL_FUNCTIONS, SQLITE_TESTCTRL_LOCALTIME_FAULT, SQLITE_TESTCTRL_EXPLAIN_STMT, SQLITE_TESTCTRL_ONCE_RESET_THRESHOLD, SQLITE_TESTCTRL_NEVER_CORRUPT, SQLITE_TESTCTRL_VDBE_COVERAGE, SQLITE_TESTCTRL_BYTEORDER, SQLITE_TESTCTRL_ISINIT, SQLITE_TESTCTRL_SORTER_MMAP, SQLITE_TESTCTRL_IMPOSTER, SQLITE_TESTCTRL_PARSER_COVERAGE, SQLITE_TESTCTRL_RESULT_INTREAL, SQLITE_TESTCTRL_PRNG_SEED, SQLITE_TESTCTRL_EXTRA_SCHEMA_CHECKS, SQLITE_TESTCTRL_SEEK_COUNT, SQLITE_TESTCTRL_TRACEFLAGS, SQLITE_TESTCTRL_TUNE, SQLITE_TESTCTRL_LOGEST, SQLITE_TESTCTRL_LASTC API: Testing Interface Operation CodesThese 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_testctrl_always.html
©©¤Kt
‚OÆ%1sqlite3_prepare(), sqlite3_prepare_v2(), sqlite3_prepare_v3(), sqlite3_prepare16(), sqlite3_prepare16_v2(), sqlite3_prepare16_v3()C API: Compiling An SQL StatementTo 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 ü•|s
„Q=¦=MSQLITE_STATUS_MEMORY_USED, SQLITE_STATUS_PAGECACHE_USED, SQLITE_STATUS_PAGECACHE_OVERFLOW, SQLITE_STATUS_SCRATCH_USED, SQLITE_STATUS_SCRATCH_OVERFLOW, SQLITE_STATUS_MALLOC_SIZE, SQLITE_STATUS_PARSER_STACK, SQLITE_STATUS_PAGECACHE_SIZE, SQLITE_STATUS_SCRATCH_SIZE, SQLITE_STATUS_MALLOC_COUNTC API: Status ParametersThese integer constants designate various run-time status parameters
that can be returned by sqlite3_status().



 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
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
This parameter records the number of separate memory allocations
currently checked out.


 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
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
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
No longer used.


 SQLITE_STATUS_SCRATCH_OVERFLOW
No longer used.


 SQLITE_STATUS_SCRATCH_SIZE
No longer used.


 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.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/c_status_malloc_count.htmlthe 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:



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.



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.



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.
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.



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.  The
sqlite3_prepare_v2() interface works exactly the same as
sqlite3_prepare_v3() with a zero prepFlags parameter.
See also lists of
  Objects,
  Constants, and
  Functions.c3ref/prepare.htmlþd that one of the rollback journal modes be used for
    transactions larger than a few dozen megabytes.
    Beginning with version 3.11.0 (2016-02-15), 
    WAL mode works as efficiently with
    large transactions as does rollback mode.
    


2. How WAL Works

The traditional rollback journal works by writing a copy of the
original unchanged database content into a separate rollback journal file
and then writing changes directly into the database file.  In the
event of a crash or ROLLBACK, the original content contained in the
rollback journal is played back into the database file to
revert the database file to its original state.  The COMMIT occurs
when the rollback journal is deleted.

The WAL approach inverts this.  The original content is preserved
in the database file and the changes are appended into a separate
WAL file.  A COMMIT occurs when a special record indicating a commit
is appended to the WAL.  Thus a COMMIT can happen without ever writing
to the original database, which allows readers to continue operating
from the original unaltered database while changes are simultaneously being
committed into the WAL.  Multiple transactions can be appended to the
end of a single WAL file.



2.1. Checkpointing

Of course, one wants to eventually transfer all the transactions that
are appended in the WAL file back into the original database.  Moving
the WAL file transactions back into the database is called a
"checkpoint".

Another way to think about the difference between rollback and 
write-ahead log is that in the rollback-journal
approach, there are two primitive operations, reading and writing,
whereas with a write-ahead log
there are now three primitive operations:  reading, writing, and
checkpointing.

By default, SQLite does a checkpoint automatically when the WAL file
reaches a threshold size of 1000 pages.  (The
SQLITE_DEFAULT_WAL_AUTOCHECKPOINT compile-time option can be used to
specify a different default.) Applications using WAL do
not have to do anything in order to for these checkpoints to occur.  
But if they want to, applications can adjust the automatic checkpoint
threshold.  Or they can turn off the automatic checkpoints and run 
checkpoints during idle moments or in a separate thread or process.



2.2. Concurrency

When a read operation begins on a WAL-mode database, it first
remembers the location of the last valid commit record in the WAL.
Call this point the "end mark".  Because the WAL can be growing and
adding new commit records while various readers connect to the database,
each reader can potentially have its own end mark.  But for any
particular reader, the end mark is unchanged for the duration of the
transaction, thus ensuring that a single read transaction only sees
the database content as it existed at a single point in time.

When a reader needs a page of content, it first checks the WAL to
see if that page appears there, and if so it pulls in the last copy
of the page that occurs in the WAL prior to the reader's end mark.
If no copy of the page exists in the WAL prior to the reader's end mark,
then the page is read from the original database file.  Readers can
exist in separate processes, so to avoid forcing every reader to scan
the entire WAL looking for pages (the WAL file can grow to
multiple megabytes, depending on how often checkpoints are run), a
data structure called the "wal-index" is maintained in shared memory
which helps readers locate pages in the WAL quickly and with a minimum
of I/O.  The wal-index greatly improves the performance of readers,
but the use of shared memory means that all readers must exist on the
same machine.  This is why the write-ahead log implementation will not
work on a network filesystem.

Writers merely append new content to the end of the WAL file.
Because writers do nothing that would interfere with the actions of
readers, writers and readers can run at the same time.  However,
since there is only one WAL file, there can only be one writer at
a time.

A checkpoint operation takes content from the WAL file
and transfers it back into the origÿinal database file.
A checkpoint can run concurrently with readers, however the checkpoint
must stop when it reaches a page in the WAL that is past the end mark
of any current reader.  The checkpoint has to stop at that point because
otherwise it might overwrite part of the database file that the reader
is actively using.  The checkpoint remembers (in the wal-index) how far
it got and will resume transferring content from the WAL to the database
from where it left off on the next invocation.

Thus a long-running read transaction can prevent a checkpointer from
making progress.  But presumably every read transaction will eventually
end and the checkpointer will be able to continue.

Whenever a write operation occurs, the writer checks how much progress
the checkpointer has made, and if the entire WAL has been transferred into
the database and synced and if no readers are making use of the WAL, then
the writer will rewind the WAL back to the beginning and start putting new
transactions at the beginning of the WAL.  This mechanism prevents a WAL
file from growing without bound.



2.3. Performance Considerations

Write transactions are very fast since they only involve writing
the content once (versus twice for rollback-journal transactions)
and because the writes are all sequential.  Further, syncing the
content to the disk is not required, as long as the application is
willing to sacrifice durability following a power loss or hard reboot.
(Writers sync the WAL on every transaction commit if
PRAGMA synchronous is set to FULL but omit this sync if
PRAGMA synchronous is set to NORMAL.)

On the other hand, read performance deteriorates as the WAL file
grows in size since each reader must check the WAL file for the content
and the time needed to check the WAL file is proportional
to the size of the WAL file.  The wal-index helps find content
in the WAL file much faster, but performance still falls off with
increasing WAL file size.  Hence, to maintain good read performance 
it is important to keep the WAL file size down by
running checkpoints at regular intervals.

Checkpointing does require sync operations in order to avoid
the possibility of database corruption following a power loss
or hard reboot.  The WAL must be synced to persistent storage
prior to moving content from the WAL into the database and the
database file must by synced prior to resetting the WAL.
Checkpoint also requires more seeking.
The checkpointer makes an effort to
do as many sequential page writes to the database as it can (the pages
are transferred from WAL to database in ascending order) but even
then there will typically be many seek operations interspersed among
the page writes.  These factors combine to make checkpoints slower than
write transactions.

The default strategy is to allow successive write transactions to
grow the WAL until the WAL becomes about 1000 pages in size, then to
run a checkpoint operation for each subsequent COMMIT until the WAL
is reset to be smaller than 1000 pages.  By default, the checkpoint will be
run automatically by the same thread that does the COMMIT that pushes
the WAL over its size limit.  This has the effect of causing most
COMMIT operations to be very fast but an occasional COMMIT (those that trigger
a checkpoint) to be much slower.  If that effect is undesirable, then
the application can disable automatic checkpointing and run the
periodic checkpoints in a separate thread, or separate process.
(Links to commands and interfaces to accomplish this are
shown below.)


Note that with PRAGMA synchronous set to NORMAL, the checkpoint
is the only operation to issue an I/O barrier or sync operation
(fsync() on unix or FlushFileBuffers() on windows).  If an application
therefore runs checkpoint in a separate thread or process, the main
thread or process that is doing database queries and updates will never
block on a sync operation.  This helps to prevent "latch-up" in applications
running on a busy disk drive.  The downside to
this configuration is that transactions are no longer durable and
might rollback following a power failure or hard reset.


Notice too that there is a tradeoff between average read performance
and average write performance.  To maximize the read performance,
one wants to keep the WAL as small as possible and hence run checkpoints
frequently, perhaps as often as every COMMIT.  To maximize
write performance, one wants to amortize the cost of each checkpoint
over as many writes as possible, meaning that one wants to run checkpoints
infrequently and let the WAL grow as large as possible before each 
checkpoint.  The decision of how often to run checkpoints may therefore
vary from one application to another depending on the relative read
and write performance requirements of the application.
The default strategy is to run a checkpoint once the WAL
reaches 1000 pages and this strategy seems to work well in test applications on 
workstations, but other strategies might work better on different 
platforms or for different workloads.

3. Activating And Configuring WAL Mode

An SQLite database connection defaults to 
journal_mode=DELETE.  To convert to WAL mode, use the
following pragma:


PRAGMA journal_mode=WAL;


The journal_mode pragma returns a string which is the new journal mode.
On success, the pragma will return the string "wal".  If 
the conversion to WAL could not be completed (for example, if the VFS
does not support the necessary shared-memory primitives) then the
journaling mode will be unchanged and the string returned from the
primitive will be the prior journaling mode (for example "delete").


3.1. Automatic Checkpoint

By default, SQLite will automatically checkpoint whenever a COMMIT
occurs that causes the WAL file to be 1000 pages or more in size, or when the 
last database connection on a database file closes.  The default 
configuration is intended to work well for most applications.
But programs that want more control can force a checkpoint
using the wal_checkpoint pragma or by calling the
sqlite3_wal_checkpoint() C interface.  The automatic checkpoint
threshold can be changed or automatic checkpointing can be completely
disabled using the wal_autocheckpoint pragma or by calling the
sqlite3_wal_autocheckpoint() C interface.  A program can also 
use sqlite3_wal_hook() to register a callback to be invoked whenever
any transaction commits to the WAL.  This callback can then invoke
sqlite3_wal_checkpoint() or sqlite3_wal_checkpoint_v2() based on whatever
criteria it thinks is appropriate.  (The automatic checkpoint mechanism
is implemented as a simple wrapper around sqlite3_wal_hook().)

3.2. Application-Initiated Checkpoints

An application can initiate a checkpoint using any writable database
connection on the database simply by invoking
sqlite3_wal_checkpoint() or sqlite3_wal_checkpoint_v2().
There are three subtypes of checkpoints that vary in their aggressiveness:
PASSIVE, FULL, and RESTART.  The default checkpoint style is PASSIVE, which
does as much work as it can without interfering with other database
connections, and which might not run to completion if there are
concurrent readers or writers.
All checkpoints initiated by sqlite3_wal_checkpoint() and
by the automatic checkpoint mechanism are PASSIVE.  FULL and RESTART
checkpoints try harder to run the checkpoint to completion and can only
be initiated by a call to sqlite3_wal_checkpoint_v2().  See the
sqlite3_wal_checkpoint_v2() documentation for additional information
on FULL and RESET checkpoints.

3.3. Persistence of WAL mode

Unlike the other journaling modes, 
PRAGMA journal_mode=WAL is
persistent.  If a process sets WAL mode, then closes and reopens the
database, the database will come back in WAL mode.  In contrast, if
a process sets (for example) PRAGMA journal_mode=TRUNCATE and then closes and
reopens the database will come back up in the default rollback mode of
DELETE rather than the previous TRUNCATE setting.

The persistence of WAL mode means that applications can be converted
to using SQLite in WAL mode without making any changes to the application
itself.  One has merely to run "PRAGMA journal_mode=WAL;" on the
database file(s) using the command-line shell or other utility, then
restart the application.

The WAL journal mode will be set on all
connections to the same database file if it is set on any one connection.




4. The WAL File

While a database connection is open on a WAL-mode database, SQLite
maintains an extra journal file called a "Write Ahead Log" or "WAL File".
The name of this file on disk is usually the name of the database file
with an extra "-wal" suffix, though different naming rules may
apply if SQLite is compiled with SQLITE_ENABLE_8_3_NAMES.

The WAL file exists for as long as any database connection has the
database open.  Usually, the WAL file is deleted automatically when the
last connection to the database closes.  However, if the last process to
have the database open exits without cleanly
shutting down the database connection, or if the 
SQLITE_FCNTL_PERSIST_WAL file control is used, then the WAL file
might be retained on disk after all connections to the database have
been closed.  The WAL file is part of the persistent state of the
database and should be kept with the database if the database is copied
or moved.  If a database file is separated from its WAL file, then
transactions that were previously committed to the database might be lost,
or the database file might become corrupted.
The only safe way to remove a WAL file is
to open the database file using one of the sqlite3_open() interfaces
then immediately close the database using sqlite3_close().

The WAL file format is precisely defined and is cross-platform.



5. Read-Only Databases

Older versions of SQLite could not read a WAL-mode database that was
read-only.  In other words, write access was required in order to read a
WAL-mode database.  This constraint was relaxed beginning with
SQLite version 3.22.0 (2018-01-22).

On newer versions of SQLite,
a WAL-mode database on read-only media, or a WAL-mode database that lacks
write permission, can still be read as long as one or more of the following
conditions are met:

The -shm and -wal files already exists and are readable
There is write permission on the directory containing the database so
    that the -shm and -wal files can be created.
The database connection is opened using the
    immutable query parameter.


Even though it is possible to open a read-only WAL-mode database,
it is good practice to converted to 
PRAGMA journal_mode=DELETE prior to burning an
SQLite database image onto read-only media.



6. Avoiding Excessively Large WAL Files

In normal cases, new content is appended to the WAL file until the
WAL file accumulates about 1000 pages (and is thus about 4MB 
in size) at which point a checkpoint is automatically run and the WAL file
is recycled.  The checkpoint does not normally truncate the WAL file
(unless the journal_size_limit pragma is set).  Instead, it merely
causes SQLite to start overwriting the WAL file from the beginning.
This is done because it is normally faster to overwrite an existing file
than to append.  When the last connection to a database closes, that
connection does one last checkpoint and then deletes the WAL and its
associated shared-memory file, to clean up the disk.

So in the vast majority of cases, applications need not worry about
the WAL file at all.  SQLite will automatically take care of it.  But
it is possible to get SQLite into a state where the WAL file will grow
without bound, causing excess disk space usage and slow queries speeds.
The following bullets enumerate some of the ways that this can happen
and how to avoid them.



Disabling the automatic checkpoint mechanism.
In its default configuration, SQLite will checkpoint the WAL file at the
conclusion of any transaction when the WAL file is more than 1000 pages
long.  However, compile-time and run-time options exist that can disable
or defer this automatic checkpoint.  If an application disables the
automatic checkpoint, then there is nothing to prevent the WAL file
from growing excessively.


Checkpoint starvation.
A checkpoint is only able to run to completion, and reset the WAL file,
if there are no other database connections using the WAL file.  If another
connection has a read transaction open,
then the checkpoint cannot reset the WAL file because
doing so might delete content out from under the reader.
The checkpoint will do as much work as it can without upsetting the
reader, but it cannot run to completion.
The checkpoint will start up again where it left off after the next
write transaction.  This repeats until some checkpoint is able to complete.

However, if a database has many concurrent overlapping readers
and there is always at least one active reader, then
no checkpoints will be able to complete
and hence the WAL file will grow without bound.

This scenario can be avoided by ensuring that there are "reader gaps":
times when no processes are reading from the 
database and that checkpoints are attempted during those times.
In applications with many concurrent readers, one might also consider 
running manual checkpoints with the SQLITE_CHECKPOINT_RESTART or
SQLITE_CHECKPOINT_TRUNCATE option which will ensure that the checkpoint
runs to completion before returning.  The disadvantage of using
SQLITE_CHECKPOINT_RESTART and SQLITE_CHECKPOINT_TRUNCATE is that
readers might block while the checkpoint is running.


Very large write transactions.
A checkpoint can only complete when no other transactions are running, 
which means the WAL file cannot be reset in the middle of a write
transaction.  So a large change to a large database
might result in a large WAL file.  The WAL file will be checkpointed
once the write transaction completes (assuming there are no other readers
blocking it) but in the meantime, the file can grow very big.

As of SQLite version 3.11.0 (2016-02-15), 
the WAL file for a single transaction
should be proportional in size to the transaction itself.  Pages that
are changed by the transaction should only be written into the WAL file
once.  However, with older versions of SQLite, the same page might be
written into the WAL file multiple times if the transaction grows larger
than the page cache.


7. Implementation Of Shared-Memory For The WAL-Index

The wal-index is implemented using an ordinary file that is
mmapped for robustness.  Early (pre-release) implementations of WAL mode
stored the wal-index in volatile shared-memory, such as files created in
/dev/shm on Linux or /tmp on other unix systems.  The problem
with that approach is that processes with a different root directory
(changed via chroot)
will see different files and hence use different shared memory areas,
leading to database corruption.  Other methods for creating nameless
shared memory blocks are not portable across the various flavors of
unix.  And we could not find any method to create nameless shared
memory blocks on windows.  The only way we have found to guarantee
that all processes accessing the same database file use the same shared
memory is to create the shared memory by mmapping a file in the same
directory as the database itself.

Using an ordinary disk file to provide shared memory has the 
disadvantage that it might actually do unnecessary disk I/O by
writing the shared memory to disk.  However, the developers do not
think this is a major concern since the wal-index rarely exceeds
32 KiB in size and is never synced.  Furthermore, the wal-index 
backing file is deleted when the last database connection disconnects,
which often prevents any real disk I/O from ever happening.

Specialized applications for which the default implementation of
shared memory is unacceptable can devise alternative methods via a
custom VFS.  
For example, if it is known that a particular database
will only be accessed by threads within a single process, the wal-index
can be implemented using heap memory instead of true shared memory.



8. Use of WAL Without Shared-Memory

Beginning in SQLite version 3.7.4 (2010-12-07), 
WAL databases can be created, read, and
written even if shared memory is unavailable as long as the
locking_mode is set to EXCLUSIVE before the first attempted access.
In other words, a process can interact with
a WAL database without using shared memory if that
process is guaranteed to be the only process accessing the database.
This feature allows WAL databases to be created, read, and written
by legacy VFSes that lack the "version 2" shared-memory
methods xShmMap, xShmLock, xShmBarrier, and xShmUnmap on the
sqlite3_io_methods object.

If EXCLUSIVE locking mode
is set prior to the first WAL-mode 
database access, then SQLite never attempts to call any of the
shared-memory methods and hence no shared-memory
wal-index is ever created.
In that case, the database connection remains in EXCLUSIVE mode
as long as the journal mode is WAL; attempts to change the locking
mode using "PRAGMA locking_mode=NORMAL;" are no-ops.
The only way to change out of EXCLUSIVE locking mode is to first
change out of WAL journal mode.

If NORMAL locking mode is in effect for the first WAL-mode database
access, then the shared-memory wal-index is created.  This means that the
underlying VFS must support the "version 2" shared-memory.
If the VFS does not support shared-memory methods, then the attempt to
open a database that is already in WAL mode, or the attempt convert a
database into WAL mode, will fail.
As long as exactly one connection is using a shared-memory wal-index, 
the locking mode can be changed freely between NORMAL and EXCLUSIVE.  
It is only when the shared-memory wal-index is omitted, when the locking 
mode is EXCLUSIVE prior to the first WAL-mode database access, that the 
locking mode is stuck in EXCLUSIVE.



9. Sometimes Queries Return SQLITE_BUSY In WAL Mode

The second advantage of WAL-mode is that
writers do not block readers and readers to do not block writers.
This is mostly true.
But there are some obscure cases where a query against a WAL-mode
database can return SQLITE_BUSY, so applications should be prepared
for that happenstance.

Cases where a query against a WAL-mode database can return SQLITE_BUSY
include the following:


If another database connection has the database mode open
in exclusive locking mode then all queries against the
database will return SQLITE_BUSY.  Both Chrome and Firefox open their
database files in exclusive locking mode, so attempts to read Chrome or
Firefox databases while the applications are running will run into this
problem, for example.


When the last connection to a particular database is closing, that
connection will acquire an exclusive lock for a short time while it
cleans up the WAL and shared-memory files.  If a second database tries
to open and query the database while the first connection
is still in the middle
of its cleanup process, the second connection might get an SQLITE_BUSY
error.


If the last connection to a database crashed, then the first new
connection to open the database will start a recovery process.  An
exclusive lock is held during recovery.  So if a third database connection
tries to jump in and query while the second connection is running recovery,
the third connection will get an SQLITE_BUSY error.




10. Backwards Compatibility

The database file format is unchanged for WAL mode.  However, the
WAL file and the wal-index are new concepts and so older versions of 
SQLite will not know
how to recover a crashed SQLite database that was operating in WAL mode
when the crash occurred.
To prevent older versions of SQLite (prior to version 3.7.0, 2010-07-22)
from trying to recover
a WAL-mode database (and making matters worse) the database file format
version numbers (bytes 18 and 19 in the database header)
are increased from 1 to 2 in WAL mode.
Thus, if an older version of SQLite attempts to connect to an SQLite
database that is operating in WAL mode, it will report an error along
the lines of "file is encrypted or is not a database".

One can explicitly change out of WAL mode using a pragma such as
this:


PRAGMA journal_mode=DELETE;



Deliberately changing out of WAL mode changes the database file format
version numbers back to 1 so that older versions of SQLite can once again 
access the database file.
This page last modified on  2018-11-26 12:01:01 UTCwal.html
\\×u
3ƒ-IWrite-Ahead Logging1. Overview

The default method by which SQLite implements
atomic commit and rollback is a rollback journal.
Beginning with version 3.7.0 (2010-07-21), a new "Write-Ahead Log" option
(hereafter referred to as "WAL") is available.

There are advantages and disadvantages to using WAL instead of
a rollback journal.  Advantages include:




WAL is significantly faster in most scenarios.
WAL provides more concurrency as readers do not block writers and 
    a writer does not block readers.  Reading and writing can proceed 
    concurrently.
Disk I/O operations tends to be more sequential using WAL.
WAL uses many fewer fsync() operations and is thus less vulnerable to
    problems on systems where the fsync() system call is broken.


But there are also disadvantages:


WAL normally requires that the VFS 
    support shared-memory primitives.
    (Exception: WAL without shared memory)
    The built-in unix and windows VFSes
    support this but third-party extension VFSes for custom operating
    systems might not.
All processes using a database must be on the same host computer;
    WAL does not work over a network filesystem.
Transactions that involve changes against multiple ATTACHed
    databases are atomic for each individual database, but are not
    atomic across all databases as a set.
It is not possible to change the page_size after entering WAL
    mode, either on an empty database or by using VACUUM or by restoring
    from a backup using the backup API.  You must be in a rollback journal
    mode to change the page size.
It is not possible to open read-only WAL databases.
    The opening process must have write privileges for "-shm"
    wal-index shared memory file associated with the database, if that
    file exists, or else write access on the directory containing
    the database file if the "-shm" file does not exist.
    Beginning with version 3.22.0 (2018-01-22), a read-only 
    WAL-mode database file can be opened if
    the -shm and -wal files
    already exists or those files can be created or the
    database is immutable.
WAL might be very slightly slower (perhaps 1% or 2% slower)
    than the traditional rollback-journal approach
    in applications that do mostly reads and seldom write.
There is an additional quasi-persistent "-wal" file and
    "-shm" shared memory file associated with each
    database, which can make SQLite less appealing for use as an 
    application file-format.
There is the extra operation of checkpointing which, though automatic
    by default, is still something that application developers need to
    be mindful of.
WAL works best with smaller transactions.  WAL does
    not work well for very large transactions.  For transactions larger than
    about 100 megabytes, traditional rollback journal modes will likely
    be faster.  For transactions in excess of a gigabyte, WAL mode may 
    fail with an I/O or disk-full error.
    It is recommendeýcommon the word is.  Larger numbers
mean the word is more common.  If you omit the rank when populating
the table, then a rank of 1 is assumed.  But if you have rank 
information, you can supply it and the virtual table will show a
slight preference for selecting more commonly used terms.  To
populate the rank from an fts4aux table "search_aux" do something
like this:


INSERT INTO demo(word,rank)
   SELECT term, documents FROM search_aux WHERE col='*';


To query the virtual table, include a MATCH operator in the WHERE
clause.  For example:


SELECT word FROM demo WHERE word MATCH 'kennasaw';


Using a dataset of American place names (derived from
http://geonames.usgs.gov/domestic/download_data.htm) the query above
returns 20 results beginning with:


kennesaw
kenosha
kenesaw
kenaga
keanak


If you append the character '*' to the end of the pattern, then
a prefix search is performed.  For example:


SELECT word FROM demo WHERE word MATCH 'kennes*';


Yields 20 results beginning with:


kennesaw
kennestone
kenneson
kenneys
keanes
keenes


2. Search Refinements

By default, the spellfix1 table returns no more than 20 results.
(It might return less than 20 if there were fewer good matches.)
You can change the upper bound on the number of returned rows by
adding a "top=N" term to the WHERE clause of your query, where N
is the new maximum.  For example, to see the 5 best matches:


SELECT word FROM demo WHERE word MATCH 'kennes*' AND top=5;


Each entry in the spellfix1 virtual table is associated with
a particular language, identified by the integer "langid" column.
The default langid is 0 and if no other actions are taken, the
entire vocabulary is a part of the 0 language.  But if your application
needs to operate in multiple languages, then you can specify different
vocabulary items for each language by specifying the langid field
when populating the table.  For example:


INSERT INTO demo(word,langid) SELECT word, 0 FROM en_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 1 FROM de_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 2 FROM fr_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 3 FROM ru_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 4 FROM cn_vocabulary;


After the virtual table has been populated with items from multiple
languages, specify the language of interest using a "langid=N" term
in the WHERE clause of the query:


SELECT word FROM demo WHERE word MATCH 'hildes*' AND langid=1;


Note that if you do not include the "langid=N" term in the WHERE clause,
the search will be against language 0 (English in the example above.)
All spellfix1 searches are against a single language id.  There is no
way to search all languages at once.
 

3. Virtual Table Details

Each row in the spellfix1 virtual table has a unique rowid 
with seven columns plus five extra hidden columns.
The columns are as follows:


rowid
A unique integer number associated with each
vocabulary item in the table.  This can be used
as a foreign key on other tables in the database.

word
The text of the word that matches the pattern.
Both word and pattern can contain unicode characters
and can be mixed case.

rank
This is the rank of the word, as specified in the
original INSERT statement.


distance
This is an edit distance or Levenshtein distance going
from the pattern to the word.

langid
This is the language-id of the word.  All queries are
against a single language-id, which defaults to 0.
For any given query this value is the same on all rows.

score
The score is a combination of rank and distance.  The
idea is that a lower score is better.  The virtual table
attempts to find words with the lowest score and 
by default (unless overridden by ORDER BY) returns
results in order of increasing score.

matchlen
In a prefix search, the matchlen is the number of characters in
the string that match against the prefix.  For a non-prefix search,
this is the same as length(word).

phonehash
This column shows the phonetic hash prefix that was used to restrict
the search.  For any given query, this column should be the same for
every row.  This information is available for diagnostic purposes and
is not normally considered useful in real applications.

top
(HIDDEN)  For any query, this value is the same on all
rows.  It is an integer which is the maximum number of
rows that will be output.  The actually number of rows
output might be less than this number, but it will never
be greater.  The default value for top is 20, but that
can be changed for each query by including a term of
the form "top=N" in the WHERE clause of the query.

scope
(HIDDEN)  For any query, this value is the same on all
rows.  The scope is a measure of how widely the virtual
table looks for matching words.  Smaller values of
scope cause a broader search.  The scope is normally
chosen automatically and is capped at 4.  Applications
can change the scope by including a term of the form
"scope=N" in the WHERE clause of the query.  Increasing
the scope will make the query run faster, but will reduce
the possible corrections.

srchcnt
(HIDDEN)  For any query, this value is the same on all
rows.  This value is an integer which is the number of
words examined using the edit-distance algorithm to
find the top matches that are ultimately displayed.  This
value is for diagnostic use only.

soundslike
(HIDDEN)  When inserting vocabulary entries, this field
can be set to a spelling that matches what the word
sounds like.  See the DEALING WITH UNUSUAL AND DIFFICULT
SPELLINGS section below for details.

command
(HIDDEN)  The value of the "command" column is always NULL.  However,
applications can insert special strings into the "command" column in order
to provoke certain behaviors in the spellfix1 virtual table.
For example, inserting the string 'reset' into the "command" column
will cause the virtual table to reread its edit distance weights
(if there are any).


4. Algorithm

The spellfix1 virtual table creates a single
shadow table named "%_vocab" (where the % is replaced by the name of
the virtual table; Ex: "demo_vocab" for the "demo" virtual table).  
the shadow table contains the following columns:


id
The unique id (INTEGER PRIMARY KEY)

rank
The rank of word.

langid
The language id for this entry.

word
The original UTF8 text of the vocabulary word

k1
The word transliterated into lower-case ASCII.  
There is a standard table of mappings from non-ASCII
characters into ASCII.  Examples: "æ" -> "ae",
"þ" -> "th", "ß" -> "ss", "á" -> "a", ...  The
accessory function spellfix1_translit(X) will do
the non-ASCII to ASCII mapping.  The built-in lower(X)
function will convert to lower-case.  Thus:
k1 = lower(spellfix1_translit(word)).

If the word is already all lower-case ASCII, then the k1 column
will contain a NULL.  This reduces the storage requirements for
the %_vocab table and helps spellfix to run a little faster.
Therefore, it is advantageous to populate as much of the spellfix
table as possible using lower-case ASCII vocabulary.

k2
This field holds a phonetic code derived from coalesce(k1,word).
Letters that have similar sounds are mapped into the same symbol.
For example, all vowels and vowel clusters become the
single symbol "A".  And the letters "p", "b", "f", and
"v" all become "B".  All nasal sounds are represented
as "N".  And so forth.  The mapping is based on
ideas found in Soundex, Metaphone, and other
long-standing phonetic matching systems.  This key can
be generated by the function spellfix1_phonehash(X).  
Hence: k2 = spellfix1_phonehash(coalesce(k1,word))


There is also a function for computing the Wagner edit distance or the
Levenshtein distance between a pattern and a word.  This function
is exposed as spellfix1_editdist(X,Y).  The edit distance function
returns the "cost" of converting X into Y.  Some transformations
cost more than others.  Changing one vowel into a different vowel,
for example is relatively cheap, as is doubling a constant, or
omitting the second character of a double-constant.  Other transformations
or more expensive.  The idea is that the edit distance function returns
a low cost for words that are similar and a higher cost for words
that are further apart.  In this implementation, the maximum cost
of any single-character edit (delete, insert, or substitute) is 100,
with lower costs for some edits (such as transforming vowels).

The "score" for a comparison is the edit distance between the pattern
and the word, adjusted down by the base-2 logarithm of the word rank.
For example, a match with distance 100 but rank 1000 would have a
score of 122 (= 100 - log2(1000) + 32) whereas a match with distance
100 with a rank of 1 would have a score of 131 (100 - log2(1) + 32).
(NB:  The constant 32 is added to each score to keep it from going
negative in case the edit distance is zero.)  In this way, frequently
used words get a slightly lower cost which tends to move them toward
the top of the list of alternative spellings.

A straightforward implementation of a spelling corrector would be
to compare the search term against every word in the vocabulary
and select the 20 with the lowest scores.  However, there will 
typically be hundreds of thousands or millions of words in the
vocabulary, and so this approach is not fast enough.

Suppose the term that is being spell-corrected is X.  To limit
the search space, X is converted to a k2-like key using the
equivalent of:


   key = spellfix1_phonehash(lower(spellfix1_translit(X)))


This key is then limited to "scope" characters.  The default scope
value is 4, but an alternative scope can be specified using the
"scope=N" term in the WHERE clause.  After the key has been truncated,
the edit distance is run against every term in the vocabulary that
has a k2 value that begins with the abbreviated key.

For example, suppose the input word is "Paskagula".  The phonetic 
key is "BACACALA" which is then truncated to 4 characters "BACA".
The edit distance is then run on the 4980 entries (out of
272,597 entries total) of the vocabulary whose k2 values begin with
BACA, yielding "Pascagoula" as the best match.

Only terms of the vocabulary with a matching langid are searched.
Hence, the same table can contain entries from multiple languages
and only the requested language will be used.  The default langid
is 0.



5. Configurable Edit Distance

The built-in Wagner edit-distance function with fixed weights can be
replaced by the editdist3() edit-distance function
with application-defined weights and support for unicode, by specifying
the "edit_cost_table=TABLENAME" parameter to the spellfix1 module
when the virtual table is created.
For example:


CREATE VIRTUAL TABLE demo2 USING spellfix1(edit_cost_table=APPCOST);


The editdist3() edit-distance function can also be selected or 
deselected at run-time by inserting an appropriate string into the
"command" column of the virtual table:


INSERT INTO demo2(command) VALUES('edit_cost_table=APPCOST');



In the examples above, the APPCOST table would be interrogated to find
the edit distance coefficients.  It is the presence of the "edit_cost_table="
parameter to the spellfix1 module name that causes editdist3() to be used
in place of the built-in edit distance function.  If APPCOST is an empty
string, then the built-in Wagner edit-distance function is used.

The edit distance coefficients are normally read from the APPCOST table
once and there after stored in memory.  Hence, run-time changes to the
APPCOST table will not normally affect the edit distance results.
However, inserting the special string 'reset' into the "command" column of the
virtual table causes the edit distance coefficients to be reread the
APPCOST table.  Hence, applications should run a SQL statement similar
to the following when changes to the APPCOST table occur:


INSERT INTO demo2(command) VALUES("reset");


6. Dealing With Unusual And Difficult Spellings

The algorithm above works quite well for most cases, but there are
exceptions.  These exceptions can be dealt with by making additional
entries in the virtual table using the "soundslike" column.

For example, many words of Greek origin begin with letters "ps" where
the "p" is silent.  Ex:  psalm, pseudonym, psoriasis, psyche.  In
another example, many Scottish surnames can be spelled with an
initial "Mac" or "Mc".  Thus, "MacKay" and "McKay" are both pronounced
the same.

Accommodation can be made for words that are not spelled as they
sound by making additional entries into the virtual table for the
same word, but adding an alternative spelling in the "soundslike"
column.  For example, the canonical entry for "psalm" would be this:


  INSERT INTO demo(word) VALUES('psalm');


To enhance the ability to correct the spelling of "salm" into
"psalm", make an addition entry like this:


  INSERT INTO demo(word,soundslike) VALUES('psalm','salm');


It is ok to make multiple entries for the same word as long as
each entry has a different soundslike value.  Note that if no
soundslike value is specified, the soundslike defaults to the word
itself.

Listed below are some cases where it might make sense to add additional
soundslike entries.  The specific entries will depend on the application
and the target language.


Silent "p" in words beginning with "ps":  psalm, psyche
Silent "p" in words beginning with "pn":  pneumonia, pneumatic
Silent "p" in words beginning with "pt":  pterodactyl, ptolemaic
Silent "d" in words beginning with "dj":  djinn, Djikarta
Silent "k" in words beginning with "kn":  knight, Knuthson
Silent "g" in words beginning with "gn":  gnarly, gnome, gnat
"Mac" versus "Mc" beginning Scottish surnames
"Tch" sounds in Slavic words:  Tchaikovsky vs. Chaykovsky
The letter "j" pronounced like "h" in Spanish:  LaJolla
Words beginning with "wr" versus "r":  write vs. rite
Miscellaneous problem words such as "debt", "tsetse",
      "Nguyen", "Van Nuyes".


7. Auxiliary Functions

The source code module that implements the spellfix1 virtual table also
implements several SQL functions that might be useful to applications
that employ spellfix1 or for testing or diagnostic work while developing
applications that use spellfix1.  The following auxiliary functions are
available:


editdist3(P,W)editdist3(P,W,L)editdist3(T)
These routines provide direct access to the version of the Wagner
edit-distance function that allows for application-defined weights
on edit operations.  The first two forms of this function compare
pattern P against word W and return the edit distance.  In the first
function, the langid is assumed to be 0 and in the second, the
langid is given by the L parameter.  The third form of this function
reloads edit distance coefficients from the table named by T.

spellfix1_editdist(P,W)
This routine provides access to the built-in Wagner edit-distance
function that uses default, fixed costs.  The value returned is
the edit distance needed to transform W into P.

spellfix1_phonehash(X)
This routine constructs a phonetic hash of the pure ascii input word X
and returns that hash.  This routine is used internally by spellfix1 in
order to transform the K1 column of the shadow table into the K2
column.

spellfix1_scriptcode(X)
Given an input string X, this routine attempts to determine the dominant
script of that input and returns the ISO-15924 numeric code for that
script.  The current implementation understands the following scripts:

 215 - Latin
 220 - Cyrillic
 200 - Greek

Additional language codes might be added in future releases.

spellfix1_translit(X)
This routine transliterates unicode text into pure ascii, returning
the pure ascii representation of the input text X.  This is the function
that is used internally to transform vocabulary words into the K1
column of the shadow table.





8. The editdist3 function

The editdist3 algorithm is a function that computes the minimum edit 
distance (a.k.a. the Levenshtein distance) between two input strings.
The editdist3 algorithm is a configurable alternative to the default
edit distance function of spellfix1.
Features of editdist3 include:


It works with unicode (UTF8) text.

A table of insertion, deletion, and substitution costs can be 
       provided by the application.

Multi-character insertions, deletions, and substitutions can be
       enumerated in the cost table.


9. The editdist3 COST table

To program the costs of editdist3, create a table such as the following:


CREATE TABLE editcost(
  iLang INT,   -- The language ID
  cFrom TEXT,  -- Convert text from this
  cTo   TEXT,  -- Convert text into this
  iCost INT    -- The cost of doing the conversion
);


The cost table can be named anything you want - it does not have to be
called "editcost".  And the table can contain additional columns.
The only requirement is that the
table must contain the four columns show above, with exactly the names shown.

The iLang column is a non-negative integer that identifies a set of costs
appropriate for a particular language.  The editdist3 function will only use
a single iLang value for any given edit-distance computation.  The default
value is 0.  It is recommended that applications that only need to use a
single language always use iLang==0 for all entries.

The iCost column is the numeric cost of transforming cFrom into cTo.  This
value should be a non-negative integer, and should probably be less than 100.
The default single-character insertion and deletion costs are 100 and the
default single-character to single-character substitution cost is 150.  A
cost of 10000 or more is considered "infinite" and causes the rule to be
ignored.

The cFrom and cTo columns show edit transformation strings.  Either or both
columns may contain more than one character.  Or either column (but not both)
may hold an empty string.  When cFrom is empty, that is the cost of inserting
cTo.  When cTo is empty, that is the cost of deleting cFrom.

In the spellfix1 algorithm, cFrom is the text as the user entered it and
cTo is the correctly spelled text as it exists in the database.  The goal
of the editdist3 algorithm is to determine how close the user-entered text is
to the dictionary text.

There are three special-case entries in the cost table:


cFromcToMeaning
'''?'The default insertion cost
'?'''The default deletion cost
'?''?'The default substitution cost


If any of the special-case entries shows above are omitted, then the
value of 100 is used for insertion and deletion and 150 is used for
substitution.  To disable the default insertion, deletion, and/or substitution
set their respective cost to 10000 or more.

Other entries in the cost table specific transforms for particular 
characters.
The cost of specific transforms should be less than the default costs, or else
the default costs will take precedence and the specific transforms will never 
be used.

Some example, cost table entries:


INSERT INTO editcost(iLang, cFrom, cTo, iCost)
VALUES(0, 'a', 'ä', 5);


The rule above says that the letter "a" in user input can be matched against
the letter "ä" in the dictionary with a penalty of 5.


INSERT INTO editcost(iLang, cFrom, cTo, iCost)
VALUES(0, 'ss', 'ß', 8);


The number of characters in cFrom and cTo do not need to be the same.  The
rule above says that "ss" on user input will match "ß" with a penalty of 8.

10. Experimenting with the editcost3() function

The spellfix1 virtual table
uses editdist3 if the "edit_cost_table=TABLE" option
is specified as an argument when the spellfix1 virtual table is created.  
But editdist3 can also be tested directly using the built-in "editdist3()"
SQL function.  The editdist3() SQL function has 3 forms:


 editdist3('TABLENAME');
 editdist3('string1', 'string2');
 editdist3('string1', 'string2', langid);


The first form loads the edit distance coefficients from a table called
'TABLENAME'.  Any prior coefficients are discarded.  So when experimenting
with weights and the weight table changes, simply rerun the single-argument
form of editdist3() to reload revised coefficients.  Note that the 
edit distance
weights used by the editdist3() SQL function are independent from the
weights used by the spellfix1 virtual table.

The second and third forms return the computed edit distance between strings
'string1' and "string2'.  In the second form, a language id of 0 is used.
The language id is specified in the third form.
This page last modified on  2018-02-14 14:14:05 UTCspellfix1.html
  ”      ”¬Ov
C‚ØE)The Spellfix1 Virtual Table1. Overview

This spellfix1 virtual table can be used to search
a large vocabulary for close matches.  For example, spellfix1
can be used to suggest corrections to misspelled words.  Or,
it could be used with FTS4 to do full-text search using potentially
misspelled words.

The implementation for the spellfix1 virtual table is held in the
SQLite source tree in the miscellaneous extensions folder and in
particular in the file 
ext/misc/spellfix1.c.
The spellfix1 virtual table is not included in the SQLite amalgamation
and is not a part of any standard SQLite build.  It is a loadable extension.

Once the spellfix1 extension is loaded, an instance of the spellfix1 
virtual table is created like this:


CREATE VIRTUAL TABLE demo USING spellfix1;


The "spellfix1" term is the name of the spellfix module and must be 
entered as shown.  The "demo" term is the
name of the virtual table you will be creating and can be altered
to suit the needs of your application.  The virtual table is initially
empty.  In order for the virtual table to be useful, you will need to
populate it with your vocabulary.  Suppose you
have a list of words in a table named "big_vocabulary".  Then do this:


INSERT INTO demo(word) SELECT word FROM big_vocabulary;


If you intend to use this virtual table in cooperation with an FTS4
table (for spelling correction of search terms) then you might extract
the vocabulary using an fts4aux table:


INSERT INTO demo(word) SELECT term FROM search_aux WHERE col='*';


You can also provide the virtual table with a "rank" for each word.
The "rank" is an estimate of how 
WW›%w       5µ+SQLite Is Serverless1. SQLite Is Serverless


Most SQL database engines are implemented as a separate server process.
Programs that want to access the database communicate with the server
using some kind of interprocess communication (typically TCP/IP) to send 
requests to the server and to receive back results. 
SQLite does not work this way. 
With SQLite, the process that wants to access the database reads and 
writes directly from the database files on disk. 
There is no intermediary server process.



There are advantages and disadvantages to being serverless.
The main advantage is that there is no separate server process
to install, setup, configure, initialize, manage, and troubleshoot. 
This is one reason why SQLite is a 
"zero-configuration" database engine. 
Programs that use SQLite require no administrative support for 
setting up the database engine before they are run.
Any program that is able to access the disk is able to use an SQLite database.



On the other hand, a database engine that uses a server can 
provide better protection from bugs in the client 
application - stray pointers in a client cannot corrupt memory 
on the server. 
And because a server is a single persistent process,
it is able to control database access with more precision, 
allowing for finer-grained locking and better concurrency.



Most SQL database engines are client/server based. 
Of those that are serverless, SQLite is the only one
known to this author that allows multiple applications
to access the same database at the same time. 


2. Classic Serverless Vs. Neo-Serverless


(This section was added on 2018-04-02)


Recently, folks have begun to use the
word "serverless" to mean something subtly different from its intended
meaning in this document.  Here are two possible definitions of "serverless":



Classic Serverless:
The database engine runs within the same process, thread, and address space
as the application.  There is no message passing or network activity.


Neo-Serverless:
The database engine runs in a separate namespace from the application,
probably on a separate machine, but the database is provided as a
turn-key service by the hosting provider, requires no management or
administration by the application owners, and is so easy to use
that the developers can think of the database as being serverless
even if it really does use a server under the covers.



SQLite is an example of a classic serverless database engine.
With SQLite, there are no other processes, threads, machines, or
other mechanisms (apart from host computer OS and filesystem)
to help provide database services or implementation.  There really
is no server.


Microsoft Azure Cosmo DB
and
Amazon S3
are examples of a neo-serverless databases.
These database are implemented by server processes running separately
in the cloud.
But the servers are maintained and administered by the ISP, not by
the application developer.
Application developers just use the service.  Developers do not have to
provision, configure, or manage database server instances, as all of that
work is handled automatically by the service provider.  Database servers
do in fact exist, they are just hidden from the developers.


It is important to understand these two different definitions for
"serverless".
When a database claims to be "serverless",
be sure to discern whether they mean "classic serverless"
or "neo-serverless".
This page last modified on  2018-04-02 15:25:54 UTCserverless.htmlntent ordered from left to right
so the pages to the left have smaller keys than the pages to the right.)
The next to left-most child of the root page is '/001', and so on,
each sibling page identified by a 3-digit hex  value.
The children of the 451st left-most sibling have paths such
as '/1c2/000/, '/1c2/001/' etc.

Overflow pages are specified by appending a '+' character and a 
six-digit hexadecimal value to the path to the cell they are linked
from. For example, the three overflow pages in a chain linked from 
the left-most cell of the 450th child of the root page are identified
by the paths:

'/1c2/000+000000'         // First page in overflow chain
'/1c2/000+000001'         // Second page in overflow chain
'/1c2/000+000002'         // Third page in overflow chain



If the paths are sorted using the BINARY collation sequence, then
the overflow pages associated with a cell will appear earlier in the
sort-order than its child page:

'/1c2/000/'               // Left-most child of 451st child of root




3. Aggregated Data


Beginning with SQLite version 3.31.0 (2020-01-22), the DBSTAT table
has a new hidden column named "aggregate", which if constrained to be
TRUE will cause DBSTAT to generate one row per btree in the database,
rather than one row per page.  When running in aggregated mode, the 
"path", "pagetype", and "pgoffset" columns are always NULL and the
"pageno" column holds the number of pages in the entire btree, rather
than the number of the page that corresponds to the row.


The following table shows the meanings of the (non-hidden) columns of
DBSTAT in both normal and aggregated mode:




Column
Normal meaning
Aggregate-mode meaning


name

The name of the table or index that is implemented by
the btree of the current row

path
See description above
Always NULL

pageno
The page number of the database page for the current row
The total number of pages in the btree for the current row

pagetype
'leaf' or 'interior'
Always NULL

ncell
Number of cells on the current page or btree

payload
Bytes of useful payload on the current page or btree

unused
Unused bytes of on the current page or btree

mx_payload
The largest payload found anywhere in the current page
or btree.

pgoffset
Byte offset to the start of the page
Always NULL

pgsize
Total storage space used by the current page or btree.



4. Example uses of the dbstat virtual table


To find the total number of pages used to store table "xyz" in schema "aux1",
use either of the following two queries (the first is the traditional way,
and the second shows the use of the aggregated feature):

SELECT count(*) FROM dbstat('aux1') WHERE name='xyz';
SELECT pageno FROM dbstat('aux1',1) WHERE name='xyz';



To see how efficiently the content of a table is stored on disk,
compute the amount of space used to hold actual content divided
by the total amount of disk space used.  The closer this number
is to 100%, the more efficient the packing.  (In this example, the
'xyz' table is assumed to be in the 'main' schema.  Again, there
are two different versions that show the use of DBSTAT both without
and with the new aggregated feature, respectively.)

SELECT sum(pgsize-unused)*100.0/sum(pgsize) FROM dbstat WHERE name='xyz';
SELECT (pgsize-unused)*100.0/pgsize FROM dbstat
 WHERE name='xyz' AND aggregate=TRUE;



To find the average fan-out for a table, run:

SELECT avg(ncell) FROM dbstat WHERE name='xyz' AND pagetype='internal';




Modern filesystems operate faster when disk accesses are sequential.
Hence, SQLite will run faster if the content of the database file
is on sequential pages.  To find out what fraction of the pages in
a database are sequential (and thus obtain a measurement that might
be useful in determining when to VACUUM), run a query like the following:

CREATE TEMP TABLE s(rowid INTEGER PRIMARY KEY, pageno INT);
INSERT INTO s(pageno) SELECT pageno FROM dbstat ORDER BY path;
SELECT sum(s1.pageno+1==s2.pageno)*1.0/count(*)
  FROM s AS s1, s AS s2
 WHERE s1.rowid+1=s2.rowid;
DROP TABLE s;

This page last modified on  2020-01-22 17:49:40 UTCdbstat.html
D5D¿}y  aÿMeasuring and Reducing CPU Usage in SQLite1. Overview

The graph below shows the number of CPU cycles used by SQLite on a
standard workload, for versions of SQLite going back about 10 years.
Recent versions of SQLite use about one third as many the CPU cycles
compared to older versions.


This article describes how the SQLite developers measure CPU usage,
what those measurements actually mean, and the techniques used by
SQLite developers on their continuing quest to further r
»?x        =ö3#The DBSTAT Virtual Table1. Overview


The DBSTAT virtual table is a read-only eponymous virtual table that returns
information about the amount of disk space used to store the content
of an SQLite database.
Example use cases for the
DBSTAT virtual table include the sqlite3_analyzer.exe
utility program and the
table size pie-chart in
the Fossil-implemented version control system
for SQLite.



The DBSTAT virtual table is available on all 
database connections when SQLite is built using the
SQLITE_ENABLE_DBSTAT_VTAB compile-time option.


The DBSTAT virtual table is an eponymous virtual table, meaning
that is not necessary to run CREATE VIRTUAL TABLE to create an
instance of the dbstat virtual table before using it.  The "dbstat"
module name can be used as if it were a table name to query the
dbstat virtual table directly.  For example:

SELECT * FROM dbstat;



If a named virtual table that uses the dbstat module is desired,
then the recommended way to create an instance of the dbstat
virtual table is as follows:

CREATE VIRTUAL TABLE temp.stat USING dbstat(main);



Note the "temp." qualifier before the virtual table name ("stat").  This
qualifier causes the virtual table to be temporary - to only exist for
the duration of the current database connection.  This is the
recommended approach.


The "main" argument to dbstat is default schema
for which information is to be provided.  The default is "main", and
so the use of "main" in the example above is redundant.  For any
particular query, the schema can be changed by specifying the
alternative schema as a function argument to the virtual table
name in the FROM clause of the query.  (See further discussion of
table-valued functions in the FROM clause for more details.)


The schema for the DBSTAT virtual table looks like this:
CREATE TABLE dbstat(
  name       TEXT,        -- Name of table or index
  path       TEXT,        -- Path to page from root
  pageno     INTEGER,     -- Page number, or page count
  pagetype   TEXT,        -- 'internal', 'leaf', 'overflow', or NULL
  ncell      INTEGER,     -- Cells on page (0 for overflow pages)
  payload    INTEGER,     -- Bytes of payload on this page or btree
  unused     INTEGER,     -- Bytes of unused space on this page or btree
  mx_payload INTEGER,     -- Largest payload size of all cells on this row
  pgoffset   INTEGER,     -- Byte offset of the page in the database file
  pgsize     INTEGER,     -- Size of the page, in bytes
  schema     TEXT HIDDEN, -- Database schema being analyzed
  aggregate  BOOL HIDDEN  -- True to enable aggregate mode
);



The DBSTAT table only reports on the content of btrees within the database file.
Freelist pages, pointer-map pages, and the lock page are omitted from
the analysis.


By default, there is a single row in the DBSTAT table for each
btree page the database file.  Each row provides
information about the space utilization of that one page of the
database.  However, if the hidden column "aggregate" is TRUE, then
results are aggregated and there is a single row in the DBSTAT table
for each btree in the database, providing information about space
utilization across the entire btree.


2. The "path" column of the dbstat virtual table


The "path" column describes the path taken from the 
root node of the btree structure to each page.  The
"path" of the root node itself is '/'.
The "path" is NULL when "aggregate" is TRUE.

The "path" for the left-most child page of the root of
a btree page is '/000/'. (Btrees store coeduce the
CPU usage of the SQLite library.






Measured using cachegrind on Ubuntu 16.04 on x64 with gcc 5.4.0 and -Os.



2. Measuring Performance

In brief, the CPU performance of SQLite is measured as follows:


 Compile SQLite in an as-delivered configuration, without any special
     telemetry or debugging options.
 Link SQLite against a test program that runs approximately 30,000
     SQL statements representing a typical workload.
 Count the number of CPU cycles consumed using
     cachegrind.


2.1. Compile Options

For performance measurement, SQLite is compiled in approximately the same
way as it would be for use in production systems.  The compile-time configuration
is "approximate" in the sense that every production use of SQLite is 
different. Compile-time options used by one system are not necessarily
the same as those used by others.  The key point is that options that 
significantly impact the generated machine code are avoided.  For example,
the -DSQLITE_DEBUG option is omitted because that option inserts thousands
of assert() statements in the middle of performance critical sections of the
SQLite library.  The -pg option (on GCC) is omitted because it causes the
compiler to emit extra probabilistic performance measuring code which interferes
with actual performance measurements.


For performance measurements,
the -Os option is used (optimize for size) rather than -O2 because the
-O2 option creates so much code movement that it is difficult to associate
specific CPU instructions to C source code lines.

2.2. Workload


The "typical" workload is generated by the
speedtest1.c
program in the canonical SQLite source tree.  This program strives to
exercise the SQLite library in a way that is typical of real-world
applications.  Of course, every application is different, and so
no test program can exactly mirror the behavior of all applications.


The speedtest1.c program is updated from time to time as the SQLite
developers' understanding of what constitutes "typical" usage evolves.


The 
speed-check.sh shell
script, also in the canonical source tree, is used to run the speedtest1.c
program.  To replicate the performance measurements, collect the following
files into a single directory:

 the "speed-check.sh" script,
 the "speedtest1.c" test program, and
 the SQLite amalgamation source files "sqlite3.c" and
     "sqlite3.h"


Then run "sh speed-check.sh trunk".


2.3. Performance Measurement


Cachegrind is used to
measure performance because it gives answers that are repeatable to 
7 or more significant digits.  In comparison, actual (wall-clock)
run times are scarcely repeatable beyond one significant digit.



2.4. Microoptimizations


The high repeatability of cachegrind allows the SQLite developers to
implement and measure "microoptimizations".  A microoptimization is
a change to the code that results in a very small performance increase.
Typical micro-optimizations reduce the number of CPU cycles by 0.1% or
0.05% or even less.  Such improvements are impossible to measure with
real-world timings.  But hundreds or thousands of microoptimizations
add up, resulting in measurable real-world performance gains.

3. Performance Measurement Workflow


As SQLite developers edit the SQLite source code, they run the
speed-check.sh
shell script to track the performance impact of changes.  This
script compiles the speedtest1.c program, runs it under cachegrind,
processes the cachegrind output using the
cg_anno.tcl TCL
script, then saves the results in a series of text files.
Typical output from the speed-check.sh script looks like this:


==8683== 
==8683== I   refs:      1,060,925,768
==8683== I1  misses:       23,731,246
==8683== LLi misses:            5,176
==8683== I1  miss rate:          2.24%
==8683== LLi miss rate:          0.00%
==8683== 
==8683== D   refs:        557,686,925  (361,828,925 rd   + 195,858,000 wr)
==8683== D1  misses:        5,067,063  (  3,544,278 rd   +   1,522,785 wr)
==8683== LLd misses:           57,958  (     16,067 rd   +      41,891 wr)
==8683== D1  miss rate:           0.9% (        1.0%     +         0.8%  )
==8683== LLd miss rate:           0.0% (        0.0%     +         0.0%  )
==8683== 
==8683== LL refs:          28,798,309  ( 27,275,524 rd   +   1,522,785 wr)
==8683== LL misses:            63,134  (     21,243 rd   +      41,891 wr)
==8683== LL miss rate:            0.0% (        0.0%     +         0.0%  )
   text    data     bss     dec     hex filename
 523044    8240    1976  533260   8230c sqlite3.o
 220507 1007870 7769352 sqlite3.c


The important parts of the output (the parts that the developers pay
the most attention to) are shown in red.
Basically, the developers want to know the size of the compiled SQLite
library and how many CPU cycles were needed to run the performance test.

The output from the 
cg_anno.tcl script
shows the number of CPU cycles spent on each line of code.
The report is approximately 80,000 lines long.  The following is a brief
snippet taken from the middle of the report to show what it looks like:


         .  SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){
         .    MemPage *pPage;
         .    assert( cursorOwnsBtShared(pCur) );
         .    assert( pRes!=0 );
         .    assert( *pRes==0 || *pRes==1 );
         .    assert( pCur-&gt;skipNext==0 || pCur-&gt;eState!=CURSOR_VALID );
   369,648    pCur-&gt;info.nSize = 0;
   369,648    pCur-&gt;curFlags &amp;= ~(BTCF_ValidNKey|BTCF_ValidOvfl);
   369,648    *pRes = 0;
   739,296    if( pCur-&gt;eState!=CURSOR_VALID ) return btreeNext(pCur, pRes);
 1,473,580    pPage = pCur-&gt;apPage&#91;pCur-&gt;iPage&#93;;
 1,841,975    if( (++pCur-&gt;aiIdx&#91;pCur-&gt;iPage&#93;)&gt;=pPage-&gt;nCell ){
     4,340      pCur-&gt;aiIdx&#91;pCur-&gt;iPage&#93;--;
     5,593      return btreeNext(pCur, pRes);
         .    }
   728,110    if( pPage-&gt;leaf ){
         .      return SQLITE_OK;
         .    }else{
     3,117      return moveToLeftmost(pCur);
         .    }
   721,876  }



The numbers on the left are the CPU cycle counts for that line of code,
of course.


The cg_anno.tcl script removes extraneous details from the default 
cachegrind annotation
output so that before-and-after reports can be compared using a 
side-by-side diff to view specific details of how a
micro-optimization attempt affected performance.


4. Limitations

The use of the standardized speedtest1.c workload and cachegrind has
enabled significant performance improvement.
However, it is important to recognize the limitations of this approach:



Performance measurements are done with a single compiler (gcc 5.4.0),
optimization setting (-Os), and
on a single platform (Ubuntu 16.04 LTS on x64).  The performance of
other compilers and processors may vary.


The speedtest1.c workload that is being measured tries to be representative
of a wide range of typical uses of SQLite.  But every application is
different.  The speedtest1.c workload might not be a good proxy for the
kinds of activities performed by some applications.  The SQLite developers
are constantly working to improve the speedtest1.c program, to make it
a better proxy for actual SQLite usage.  Community feedback is welcomed.


The cycle counts provided by cachegrind are a good proxy for actual
performance, but they are not 100% accurate.


Only CPU cycle counts are being measured here. 
CPU cycle counts are a good proxy for energy consumption,
but do not necessary correlate well with real-world timings.
Time spent doing I/O is not reflected in the CPU cycle counts,
and I/O time predominates in many SQLite usage scenarios.

This page last modified on  2018-11-24 19:14:44 UTCcpu.htmlite permission is required
to recover the database after opening, and the database cannot be
opened read-only.


-uri BOOLEAN

If true, then interpret the filename argument as a URI filename.  If
false, then the argument is a literal filename.  The default value is
"false".


-vfs VFSNAME

Use an alternative VFS named by the argument.


-fullmutex BOOLEAN

If true, multiple threads can safely attempt to use the database.
If false, such attempts are unsafe. The default value depends upon
how the extension is built.


-nofollow BOOLEAN

If true, and the database name refers to a symbolic link,
it will not be followed to open the true database file.
If false, symbolic links will be followed.
The default is "false".








Once an SQLite database is open, it can be controlled using 
methods of the dbcmd.
There are currently 40 methods
defined.




authorizer
backup
bind_fallback
busy
cache
changes
close
collate
collation_needed
commit_hook
complete
config
copy
deserialize


enable_load_extension
errorcode
eval
exists
function
incrblob
interrupt
last_insert_rowid
nullvalue
onecolumn
preupdate
profile
progress
restore


rollback_hook
serialize
status
timeout
total_changes
trace
trace_v2
transaction
unlock_notify
update_hook
version
wal_hook





The use of each of these methods will be explained in the sequel, though
not in the order shown above.


The "eval" method


The most useful dbcmd method is "eval".  The eval method is used
to execute SQL on the database.  The syntax of the eval method looks
like this:


dbcmd&nbsp;&nbsp;eval&nbsp;&nbsp;?options?&nbsp;&nbsp;sql
&nbsp;&nbsp;?array-name?&nbsp;&nbsp;?script?



The job of the eval method is to execute the SQL statement or statements
given in the second argument.  For example, to create a new table in
a database, you can do this:


sqlite3 db1 ./testdb
db1 eval {CREATE TABLE t1(a int, b text)}


The above code creates a new table named t1 with columns
a and b.  What could be simpler?

Query results are returned as a list of column values.  If a
query requests 2 columns and there are 3 rows matching the query,
then the returned list will contain 6 elements.  For example:


db1 eval {INSERT INTO t1 VALUES(1,'hello')}
db1 eval {INSERT INTO t1 VALUES(2,'goodbye')}
db1 eval {INSERT INTO t1 VALUES(3,'howdy!')}
set x &#91;db1 eval {SELECT * FROM t1 ORDER BY a}&#93;


The variable $x is set by the above code to


1 hello 2 goodbye 3 howdy!


You can also process the results of a query one row at a time
by specifying the name of an array variable and a script following
the SQL code.  For each row of the query result, the values of all
columns will be inserted into the array variable and the script will
be executed.  For instance:


db1 eval {SELECT * FROM t1 ORDER BY a} values {
&nbsp;&nbsp;&nbsp;&nbsp;parray values
&nbsp;&nbsp;&nbsp;&nbsp;puts ""
}


This last code will give the following output:


values(*) = a b
values(a) = 1
values(b) = hello

values(*) = a b
values(a) = 2
values(b) = goodbye

values(*) = a b
values(a) = 3
values(b) = howdy!



For each column in a row of the result, the name of that column
is used as an index in to array and the value of the column is stored
in the corresponding array entry.  (Caution:  If two or more columns
in the result set of a query have the same name, then the last column
with that name will overwrite prior values and earlier columns with the
same name will be inaccessible.) The special array index * is
used to store a list of column names in the order that they appear.



Normally, NULL SQL results are stored in the array using the
nullvalue setting.  However, if
the -withoutnulls option is used, then NULL SQL values
cause the corresponding array element to be unset instead.



If the array variable name is omitted or is the empty string, then the value of
each column is stored in a variable with the same name as the column
itself.  For example:



db1 eval {SELECT * FROM t1 ORDER BY a} {
&nbsp;&nbsp;&nbsp;&nbsp;puts "a=$a b=$b"
}



From this we get the following output



a=1 b=hello
a=2 b=goodbye
a=3 b=howdy!





Tcl variable names can appear in the SQL statement of the second argument
in any position where it is legal to put a string or number literal.  The
value of the variable is substituted for the variable name.  If the
variable does not exist a NULL values is used.  For example:



db1 eval {INSERT INTO t1 VALUES(5,$bigstring)}



Note that it is not necessary to quote the $bigstring value.  That happens
automatically.  If $bigstring is a large string or binary object, this
technique is not only easier to write, it is also much more efficient
since it avoids making a copy of the content of $bigstring.



If the $bigstring variable has both a string and a "bytearray" representation,
then TCL inserts the value as a string.  If it has only a "bytearray"
representation, then the value is inserted as a BLOB.  To force a
value to be inserted as a BLOB even if it also has a text representation,
use a "@" character to in place of the "$".  Like this:



db1 eval {INSERT INTO t1 VALUES(5,@bigstring)}



If the variable does not have a bytearray representation, then "@" works
just like "$".  Note that ":" works like "$" in all cases so the following
is another way to express the same statement:



db1 eval {INSERT INTO t1 VALUES(5,:bigstring)}


The use of ":" instead of "$" before the name of a variable can 
sometimes be useful if the SQL text is enclosed in double-quotes "..."
instead of curly-braces {...}.  
When the SQL is contained within double-quotes "..." then TCL will do
the substitution of $-variables, which can lead to SQL injection if
extreme care is not used.  But TCL will never substitute a :-variable
regardless of whether double-quotes "..." or curly-braces {...} are 
used to enclose the SQL, so the use of :-variables adds an extra 
measure of defense against SQL
injection.



The "close" method



As its name suggests, the "close" method to an SQLite database just
closes the database.  This has the side-effect of deleting the
dbcmd Tcl command.  Here is an example of opening and then
immediately closing a database:



sqlite3 db1 ./testdb
db1 close



If you delete the dbcmd directly, that has the same effect
as invoking the "close" method.  So the following code is equivalent
to the previous:


sqlite3 db1 ./testdb
rename db1 {}


The "transaction" method



The "transaction" method is used to execute a TCL script inside an SQLite
database transaction.  The transaction is committed when the script completes,
or it rolls back if the script fails.  If the transaction occurs within
another transaction (even one that is started manually using BEGIN) it
is a no-op.



The transaction command can be used to group together several SQLite
commands in a safe way.  You can always start transactions manually using
BEGIN, of
course.  But if an error occurs so that the COMMIT or ROLLBACK are never
run, then the database will remain locked indefinitely.  Also, BEGIN
does not nest, so you have to make sure no other transactions are active
before starting a new one.  The "transaction" method takes care of
all of these details automatically.



The syntax looks like this:



dbcmd&nbsp;&nbsp;transaction&nbsp;&nbsp;?transaction-type?
&nbsp;&nbsp;script




The transaction-type can be one of deferred,
exclusive or immediate.  The default is deferred.


The "cache" method



The "eval" method described above keeps a cache of
prepared statements
for recently evaluated SQL commands.  
The "cache" method is used to control this cache.
The first form of this command is:


dbcmd&nbsp;&nbsp;cache size&nbsp;&nbsp;N


This sets the maximum number of statements that can be cached.
The upper limit is 100.  The default is 10.  If you set the cache size
to 0, no caching is done.

The second form of the command is this:



dbcmd&nbsp;&nbsp;cache flush


The cache-flush method 
finalizes
all prepared statements currently
in the cache.


The "complete" method



The "complete" method takes a string of supposed SQL as its only argument.
It returns TRUE if the string is a complete statement of SQL and FALSE if
there is more to be entered.

The "complete" method is useful when building interactive applications
in order to know when the user has finished entering a line of SQL code.
This is really just an interface to the 
sqlite3_complete() C
function.

The "config" method



The "config" method queries or changes certain configuration settings for
the database connection using the sqlite3_db_config() interface.
Run this method with no arguments to get a TCL list of available
configuration settings and their current values:


dbcmd&nbsp;&nbsp;config


The above will return something like this:


defensive 0 dqs_ddl 1 dqs_dml 1 enable_fkey 0 enable_qpsg 0 enable_trigger 1 enable_view 1 fts3_tokenizer 1 legacy_alter_table 0 legacy_file_format 0 load_extension 0 no_ckpt_on_close 0 reset_database 0 trigger_eqp 0 trusted_schema 1 writable_schema 0


Add the name of an individual configuration setting to query the current
value of that setting.  Optionally add a boolean value to change a setting.


The following four configuration changes are recommended for maximum
application security.  Turning off the trust_schema setting prevents
virtual tables and dodgy SQL functions from being used inside of triggers,
views, CHECK constraints, generated columns, and expression indexes.
Turning off the dqs_dml and dqs_ddl settings prevents the use of 
double-quoted strings.  Turning on defensive prevents direct writes
to shadow tables.


db config trusted_schema 0
db config defensive 1
db config dqs_dml 0
db config dqs_ddl 0


The "copy" method



The "copy" method copies data from a file into a table.
It returns the number of rows processed successfully from the file.
The syntax of the copy method looks like this:


dbcmd&nbsp;&nbsp;copy&nbsp;&nbsp;conflict-algorithm
&nbsp;&nbsp;table-name&nbsp;&nbsp;&nbsp;file-name&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;?column-separator?
&nbsp;&nbsp;?null-indicator?


Conflict-algorithm must be one of the SQLite conflict algorithms for
the INSERT statement: rollback, abort,
fail,ignore, or replace. See the SQLite Language
section for ON CONFLICT for more information.
The conflict-algorithm must be specified in lower case.


Table-name must already exists as a table.  File-name must exist, and
each row must contain the same number of columns as defined in the table.
If a line in the file contains more or less than the number of columns defined,
the copy method rollbacks any inserts, and returns an error.

Column-separator is an optional column separator string.  The default is
the ASCII tab character \t. 

Null-indicator is an optional string that indicates a column value is null.
The default is an empty string.  Note that column-separator and
null-indicator are optional positional arguments; if null-indicator
is specified, a column-separator argument must be specified and
precede the null-indicator argument.

The copy method implements similar functionality to the .import
SQLite shell command. 

The "timeout" method


The "timeout" method is used to control how long the SQLite library
will wait for locks to clear before giving up on a database transaction.
The default timeout is 0 millisecond.  (In other words, the default behavior
is not to wait at all.)

The SQLite database allows multiple simultaneous
readers or a single writer but not both.  If any process is writing to
the database no other process is allows to read or write.  If any process
is reading the database other processes are allowed to read but not write.
The entire database shared a single lock.

When SQLite tries to open a database and finds that it is locked, it
can optionally delay for a short while and try to open the file again.
This process repeats until the query times out and SQLite returns a
failure.  The timeout is adjustable.  It is set to 0 by default so that
if the database is locked, the SQL statement fails immediately.  But you
can use the "timeout" method to change the timeout value to a positive
number.  For example:

db1 timeout 2000

The argument to the timeout method is the maximum number of milliseconds
to wait for the lock to clear.  So in the example above, the maximum delay
would be 2 seconds.

The "busy" method


The "busy" method, like "timeout", only comes into play when the
database is locked.  But the "busy" method gives the programmer much more
control over what action to take.  The "busy" method specifies a callback
Tcl procedure that is invoked whenever SQLite tries to open a locked
database.  A single integer argument is appended to the callback before
it is invoke.  The argument is the number of prior calls to the busy
callback for the current locking event.  It is intended that
the callback will do some other useful work for a short while 
(such as service GUI events) then return
so that the lock can be tried again.  The callback procedure should
return "0" if it wants SQLite to try again to open the database and
should return "1" if it wants SQLite to abandon the current operation.

If the busy method is invoked without an argument, the name of the callback
procedure last set by the busy method is returned.  If no callback procedure
has been set, an empty string is returned.

The "enable_load_extension" method


The extension loading mechanism of SQLite (accessed using the
load_extension() SQL function) is turned off by default.  This is
a security precaution.  If an application wants to make use of the
load_extension() function it must first turn the capability on using
this method.

This method takes a single boolean argument which will turn the
extension loading functionality on or off.

For best security, do not use this method unless truly needed, 
and run PRAGMA trusted_schema=OFF or the
"db config trusted_schema 0" method before
invoking this method.

This method maps to the sqlite3_enable_load_extension() C/C++
interface.

The "exists" method


The "exists" method is similar to "onecolumn" and "eval" in that
it executes SQL statements.  The difference is that the "exists" method
always returns a boolean value which is TRUE if a query in the SQL
statement it executes returns one or more rows and FALSE if the SQL
returns an empty set.

The "exists" method is often used to test for the existence of
rows in a table.  For example:


if {&#91;db exists {SELECT 1 FROM table1 WHERE user=$user}&#93;} {
&nbsp;&nbsp;&nbsp;# Processing if $user exists
} else {
&nbsp;&nbsp;&nbsp;# Processing if $user does not exist
}


The "last_insert_rowid" method


The "last_insert_rowid" method returns an integer which is the ROWID
of the most recently inserted database row.

The "function" method


The "function" method registers new SQL functions with the SQLite engine.
The arguments are the name of the new SQL function and a TCL command that
implements that function.  Arguments to the function are appended to the
TCL command before it is invoked.


For security reasons, it is recommended that applications first set
PRAGMA trusted_schema=OFF or run the 
"db config trusted_schema 0"
method before using this method.


The syntax looks like this:



dbcmd&nbsp;&nbsp;function
&nbsp;&nbsp;sql-name
&nbsp;&nbsp;?options?
&nbsp;&nbsp;script



The following example creates a new SQL function named "hex" that converts
its numeric argument in to a hexadecimal encoded string:



db function hex {format 0x%X}


The "function" method accepts the following options:



-argcount INTEGER

Specify the number of arguments that the SQL function accepts.  The default
value of -1 means any number of arguments.

-deterministic

This option indicates that the function will always return the same
answer given the same argument values.  The SQLite query optimizer
uses this information to cache answers from function calls with 
constant inputs and reuse the result rather than invoke the function
repeatedly.


-directonly

This option restricts the function to only be usable by direct
top-level SQL statement.  The function will not be accessible to
triggers, views, CHECK constraints, generated columns, or index
expressions.  This option is recommended for all application-defined
SQL functions, and is highly recommended for any SQL
function that has side effects or that reveals internal state of
the application.

Security Warning:
Without this switch, an attacker might be able to change the
schema of a database file to include the new function inside a trigger
or view or CHECK constraint and thereby trick the application into
running the function with parameters of the attacker's choosing.
Hence, if the new function has side effects or reveals internal
state about the application and the -directonly option is not
used, that is a potential security vulnerability.


-innocuous

This option indicates that the function has no side effects and
does not leak any information that cannot be computed directly
from its input parameters.  When this option is specified, the
function may be used in triggers, views, CHECK constraints,
generated columns, and/or index expressions even if
PRAGMA trusted_schema=OFF.  The use of this option is discouraged
unless it is truly needed.


-returntype integer|real|text|blob|any

This option is used to configure the type of the result returned by the
function.  If this option is set to "any" (the default), SQLite attempts to
determine the type of each value returned by the function implementation based
on the Tcl value's internal type. Or, if it is set to "text" or "blob", the
returned value is always a text or blob value, respectively. If this option is
set to "integer", SQLite attempts to coerce the value returned by the function
to an integer. If this is not possible without data loss, it attempts to coerce
it to a real value, and finally falls back to text. If this option is set to
"real", an attempt is made to return a real value, falling back to text if this
is not possible.







The "nullvalue" method



The "nullvalue" method changes the representation for NULL returned
as result of the "eval" method.


db1 nullvalue NULL


The "nullvalue" method is useful to differ between NULL and empty
column values as Tcl lacks a NULL representation.  The default
representation for NULL values is an empty string.

The "onecolumn" method


The "onecolumn" method works like 
"eval" in that it evaluates the
SQL query statement given as its argument.  The difference is that
"onecolumn" returns a single element which is the first column of the
first row of the query result.

This is a convenience method.  It saves the user from having to
do a "&#91;lindex&nbsp;...&nbsp;0&#93;" on the results of an "eval"
in order to extract a single column result.

The "changes" method


The "changes" method returns an integer which is the number of rows
in the database that were inserted, deleted, and/or modified by the most
recent "eval" method.

The "total_changes" method


The "total_changes" method returns an integer which is the number of rows
in the database that were inserted, deleted, and/or modified since the
current database connection was first opened.

The "authorizer" method


The "authorizer" method provides access to the 
sqlite3_set_authorizer
C/C++ interface.  The argument to authorizer is the name of a procedure that
is called when SQL statements are being compiled in order to authorize
certain operations.  The callback procedure takes 5 arguments which describe
the operation being coded.  If the callback returns the text string
"SQLITE_OK", then the operation is allowed.  If it returns "SQLITE_IGNORE",
then the operation is silently disabled.  If the return is "SQLITE_DENY"
then the compilation fails with an error.


If the argument is an empty string then the authorizer is disabled.
If the argument is omitted, then the current authorizer is returned.

The "bind_fallback" method


The "bind_fallback" method gives the application control over how to
handle parameter binding when no TCL variable matches the parameter name.

When the eval method sees a named SQL
parameter such as "$abc" or ":def" or "@ghi" in an SQL statement, it tries
to look up a TCL variable with the same name, and it binds the value
of that TCL variable to the SQL parameter.  If no such TCL variable exists,
the default behavior is to bind an SQL NULL value to the parameter.  However,
if a bind_fallback proc is specified, then that proc is invoked with the
name of the SQL parameter and the return value from the proc is bound to
the SQL parameter.  Or if the proc returns an error, then the SQL statement
aborts with that error.  If the proc returns with some code other than
TCL_OK or TCL_ERROR, then the SQL parameter is bound to NULL, as it would
be by default.

The "bind_fallback" method has a single optional argument.  If the argument
is an empty string, then the bind_fallback is cancelled and the default behavior
is restored.  If the argument is a non-empty string, then the argument is a
TCL command (usually the name of a proc) to invoke whenever an SQL parameter 
is seen that does not match any TCL variable.  If the "bind_fallback" method 
is given no arguments, then the current bind_fallback command is returned.

As an example, the following setup causes TCL to throw an error if
an SQL statement contains an parameter that does not match any global
TCL variable:


proc bind_error {nm} {
  error "no such variable: $nm"
}
db bind_fallback bind_error


The "progress" method


This method registers a callback that is invoked periodically during
query processing.  There are two arguments: the number of SQLite virtual
machine opcodes between invocations, and the TCL command to invoke.
Setting the progress callback to an empty string disables it.

The progress callback can be used to display the status of a lengthy
query or to process GUI events during a lengthy query.

The "collate" method


This method registers new text collating sequences.  There are
two arguments: the name of the collating sequence and the name of a
TCL procedure that implements a comparison function for the collating
sequence.


For example, the following code implements a collating sequence called
"NOCASE" that sorts in text order without regard to case:



proc nocase_compare {a b} {
  return &#91;string compare &#91;string tolower $a] &#91;string tolower $b]]
}
db collate NOCASE nocase_compare


The "collation_needed" method


This method registers a callback routine that is invoked when the SQLite
engine needs a particular collating sequence but does not have that
collating sequence registered.  The callback can register the collating
sequence.  The callback is invoked with a single parameter which is the
name of the needed collating sequence.

The "commit_hook" method


This method registers a callback routine that is invoked just before
SQLite tries to commit changes to a database.  If the callback throws
an exception or returns a non-zero result, then the transaction rolls back
rather than commit.

The "rollback_hook" method


This method registers a callback routine that is invoked just before
SQLite tries to do a rollback.  The script argument is run without change.

The "status" method

This method returns status information from the most recently evaluated
SQL statement.  The status method takes a single argument which should be
either "steps" or "sorts".  If the argument is "steps", then the method
returns the number of full table scan steps that the previous SQL statement
evaluated.  If the argument is "sorts", the method returns the number of
sort operations.  This information can be used to detect queries that are
not using indices to speed search or sorting.

The status method is basically a wrapper on the
sqlite3_stmt_status() C-language interface.

The "update_hook" method


This method registers a callback routine that is invoked just before
each row is modified by an UPDATE, INSERT, or DELETE statement.  Four
arguments are appended to the callback before it is invoked:


The keyword "INSERT", "UPDATE", or "DELETE", as appropriate
The name of the database which is being changed
The table that is being changed
The rowid of the row in the table being changed


The "wal_hook" method


This method registers a callback routine that is invoked after transaction
commit when the database is in WAL mode.  Two arguments are appended to the
callback command before it is invoked:


The name of the database on which the transaction was committed
The number of entries in the write-ahead log (WAL) file for that database


This method might decide to run a checkpoint either itself or as a
subsequent idle callback.  Note that SQLite only allows a single WAL hook.
By default this single WAL hook is used for the auto-checkpointing.  If you
set up an explicit WAL hook, then that one WAL hook must ensure that checkpoints
are occurring since the auto-checkpointing mechanism will be disabled.

This method should return an integer value that is equivalent to an 
SQLite error code (usually 0 for SQLITE_OK in the case of success or 1 for
SQLITE_ERROR if some error occurs). As in sqlite3_wal_hook(), the results of
returning an integer that does not correspond to an SQLite error code are
undefined. If the value returned by the script cannot be interpreted as an
integer value, or if the script throws a Tcl exception, no error is returned to
SQLite but a Tcl background-error is raised.

The "incrblob" method


This method opens a TCL channel that can be used to read or write
into a preexisting BLOB in the database.  The syntax is like this:


dbcmd&nbsp;&nbsp;incrblob&nbsp;&nbsp;?-readonly?
&nbsp;&nbsp;?DB?&nbsp;&nbsp;TABLE&nbsp;&nbsp;COLUMN&nbsp;&nbsp;ROWID



The command returns a new TCL channel for reading or writing to the BLOB.
The channel is opened using the underlying 
sqlite3_blob_open() C-language
interface.  Close the channel using the close command of TCL.


The "errorcode" method


This method returns the numeric error code that resulted from the most
recent SQLite operation.

The "trace" method


The "trace" method registers a callback that is invoked as each SQL
statement is compiled.  The text of the SQL is appended as a single string
to the command before it is invoked.  This can be used (for example) to
keep a log of all SQL operations that an application performs.


The "trace_v2" method


The "trace_v2" method registers a callback that is invoked as each SQL
statement is compiled. The syntax is as follows:



dbcmd&nbsp;&nbsp;trace_v2&nbsp;&nbsp;?callback?&nbsp;&nbsp;?mask?


This command causes the "callback" script to be invoked whenever
certain conditions occurs.  The conditions are determined by the mask
argument, which should be a TCL-list of zero or more of the following
keywords:


 statement
 profile
 row
 close


Traces for statement invoke the callback with two arguments
whenever a new SQL statement is run.
The first argument is an integer which is the value of the pointer
to the underlying sqlite3_stmt object.  This integer can be used
to correlate SQL statement text with the result of a profile
or row callback. The second argument is the
unexpanded text of the SQL statement being run.  By "unexpanded", we
mean that variable substitutions in the text are not expanded into the
variable values.  This is different from the behavior of the "trace"
method which does expand variable substitutions.

Traces for profile invoke the callback with two arguments
as each SQL statement finishes.  The first argument is an integer which
is the value of the underlying sqlite3_stmt object.  The second
argument is the approximate run-time for the statement in nanoseconds.
The run-time is the best estimate available depending on the capabilities
of the platform on which the application is running.

Traces for row invoke the callback with a single argument
whenever a new result row is available from an SQL statement.
The argument is an integer which is the value of the underlying
sqlite3_stmt object pointer.

Traces for close invoke the callback with a single argument
as the database connection is closing.  The argument is an integer which
is the value of a pointer to the underlying sqlite3 object that is
closing.

There can only be a single trace callback registered on a database
connection.  Each use of "trace" or "trace_v2" cancels all prior
trace callback.

The "backup" method


The "backup" method makes a backup copy of a live database.  The
command syntax is like this:


dbcmd&nbsp;&nbsp;backup&nbsp;&nbsp;?source-database?&nbsp;&nbsp;backup-filename


The optional source-database argument tells which database in
the current connection should be backed up.  The default value is main
(or, in other words, the primary database file).  To back up TEMP tables
use temp.  To backup an auxiliary database added to the connection
using the ATTACH command, use the name of that database as it was assigned
in the ATTACH command.

The backup-filename is the name of a file into which the backup is
written.  Backup-filename does not have to exist ahead of time, but if
it does, it must be a well-formed SQLite database.

The "restore" method


The "restore" method copies the content from a separate database file 
into the current database connection, overwriting any preexisting content.
The command syntax is like this:


dbcmd&nbsp;&nbsp;restore&nbsp;&nbsp;?target-database?&nbsp;&nbsp;source-filename


The optional target-database argument tells which database in
the current connection should be overwritten with new content.  
The default value is main 
(or, in other words, the primary database file).  To repopulate the TEMP tables
use temp.  To overwrite an auxiliary database added to the connection
using the ATTACH command, use the name of that database as it was assigned
in the ATTACH command.

The source-filename is the name of an existing well-formed SQLite
database file from which the content is extracted.

The "serialize" method


The "serialize" method creates a BLOB which is a complete copy of an
underlying database.  The syntax is like this:


dbcmd&nbsp;&nbsp;serialize&nbsp;&nbsp;?database?


The optional argument is the name of the schema or database to be serialized.
The default value is "main".

This routine returns a TCL byte-array that is the complete content of
the identified database.  This byte-array can be written into a file and
then used as an ordinary SQLite database, or it can be sent over a TCP/IP
connection to some other application, or passed to the "deserialize" method
of another database connection.

This method only functions if SQLite is compiled with -DSQLITE_ENABLE_DESERIALIZE

The "deserialize" method

The "deserialize" method takes a TCL byte-array that contains an SQLite
database file and adds it to the database connection.  The syntax is:


dbcmd&nbsp;&nbsp;deserialize&nbsp;&nbsp;?database?&nbsp;&nbsp;value


The option database argument identifies which attached database
should receive the deserialization.  The default is "main".

This command causes SQLite to disconnect from the previous database and
reattach to an in-memory database with the content in value.  If value
is not a byte-array containing a well-defined SQLite database, then subsequent
commands will likely return SQLITE_CORRUPT errors.

This method only functions if SQLite is compiled with -DSQLITE_ENABLE_DESERIALIZE

The "interrupt" method

The "interrupt" method invokes the sqlite3_interrupt() interface, causing
any pending queries to halt.

The "version" method

  Return the current library version. For example, "3.23.0".

The "profile" method

This method is used to profile the execution of SQL statements run by
   the application. The syntax is as follows:



dbcmd&nbsp;&nbsp;profile&nbsp;&nbsp;?script?


Unless script is an empty string, this method arranges for the
script to be evaluated after the execution of each SQL statement.
Two arguments are appended to script before it is invoked: the
text of the SQL statement executed and the time elapsed while executing
the statement, in nanoseconds.

A database handle may only have a single profile script registered at
any time. If there is already a script registered when the profile method
is invoked, the previous profile script is replaced by the new one. If the 
script argument is an empty string, any previously registered 
profile callback is canceled but no new profile script is registered.


The "unlock_notify" method

The unlock_notify method is used access the sqlite3_unlock_notify()
   interface to the SQLite core library for testing purposes.  The use of
   this method by applications is discouraged.


This page last modified on  2022-12-14 16:19:41 UTCtclsqlite.html
åå‚•rz
[„ªs)The Tcl interface to the SQLite libraryThe Tcl interface to the SQLite library

The SQLite library is designed to be very easy to use from
a Tcl or Tcl/Tk script.  SQLite
began as a Tcl extension
and the primary test suite for SQLite is written in TCL.  SQLite
can be used with any programming language, but its connections to
TCL run deep.

This document gives an overview of the Tcl
programming interface for SQLite.

The API

The interface to the SQLite library consists of single
tcl command named sqlite3
Because there is only this
one command, the interface is not placed in a separate
namespace.

The sqlite3 command is mostly used as follows
to open or create a database:


sqlite3&nbsp;&nbsp;dbcmd&nbsp;&nbsp;?database-name?&nbsp;&nbsp;?options?


To get information only, the sqlite3 command may be given exactly
one argument, either "-version", "-sourceid" or "-has-codec", which will
return the specified datum with no other effect.


With other arguments, the sqlite3 command opens the database
named in the second non-option argument, or named "" if there is no such.
If the open succeeds, a new Tcl command named by the first argument is created
and "" is returned.
(This approach is similar to the way widgets are created in Tk.)
If the open fails, an error is raised without creating a Tcl command
and an error message string is returned.

If the database does not already exist, the default behavior
is for it to be created automatically (though this can be changed by
using the "-create false" option).



The name of the database is usually just the name of a disk file in which
the database is stored.  If the name of the database is 
the special name ":memory:", then a new database is created
in memory.  If the name of the database is an empty string, then
the database is created in an empty file that is automatically deleted
when the database connection closes.  URI filenames can be used if
the "-uri yes" option is supplied on the sqlite3 command.



Options understood by the sqlite3 command include:





-create BOOLEAN

If true, then a new database is created if one does not already exist.
If false, then an attempt to open a database file that does not previously
exist raises an error.  The default behavior is "true".


-nomutex BOOLEAN

If true, then all mutexes for the database connection are disabled.
This provides a small performance boost in single-threaded applications.


-readonly BOOLEAN

If true, then open the database file read-only.  If false, then the
database is opened for both reading and writing if filesystem permissions
allow, or for reading only if filesystem write permission is denied
by the operating system.  The default setting is "false".  Note that
if the previous process to have the database did not exit cleanly
and left behind a hot journal, then the wrof C/C++ interface routine listed below.



   sqlite3_open() 
   sqlite3_prepare() 
   sqlite3_step() 
   sqlite3_column() 
   sqlite3_finalize() 
   sqlite3_close() 



  Note that the list of routines above is conceptual rather than actual.
  Many of these routines come in multiple versions.
  For example, the list above shows a single routine
  named sqlite3_open() when in fact there are three separate routines
  that accomplish the same thing in slightly different ways:
  sqlite3_open(), sqlite3_open16() and sqlite3_open_v2().
  The list mentions sqlite3_column()
  when in fact no such routine exists.
  The "sqlite3_column()" shown in the list is a placeholder for
  an entire family of routines that extra column
  data in various datatypes.



  Here is a summary of what the core interfaces do:




sqlite3_open()

  This routine 
  opens a connection to an SQLite database file and returns a
  database connection object.  This is often the first SQLite API
  call that an application makes and is a prerequisite for most other
  SQLite APIs.  Many SQLite interfaces require a pointer to
  the database connection object as their first parameter and can
  be thought of as methods on the database connection object.
  This routine is the constructor for the database connection object.


sqlite3_prepare()

  This routine
  converts SQL text into a prepared statement object and returns a pointer
  to that object.  This interface requires a database connection pointer
  created by a prior call to sqlite3_open() and a text string containing
  the SQL statement to be prepared.  This API does not actually evaluate
  the SQL statement.  It merely prepares the SQL statement for evaluation.

  Think of each SQL statement as a small computer program.  The purpose
  of sqlite3_prepare() is to compile that program into object code.
  The prepared statement is the object code.  The sqlite3_step() interface
  then runs the object code to get a result.

  New applications should always invoke sqlite3_prepare_v2() instead
  of sqlite3_prepare().  The older sqlite3_prepare() is retained for
  backwards compatibility.  But sqlite3_prepare_v2() provides a much
  better interface.

sqlite3_step()

  This routine is used to evaluate a prepared statement that has been
  previously created by the sqlite3_prepare() interface.  The statement
  is evaluated up to the point where the first row of results are available.
  To advance to the second row of results, invoke sqlite3_step() again.
  Continue invoking sqlite3_step() until the statement is complete.
  Statements that do not return results (ex: INSERT, UPDATE, or DELETE
  statements) run to completion on a single call to sqlite3_step().

sqlite3_column()

  This routine returns a single column from the current row of a result
  set for a prepared statement that is being evaluated by sqlite3_step().
  Each time sqlite3_step() stops with a new result set row, this routine
  can be called multiple times to find the values of all columns in that row.
  
  As noted above, there really is no such thing as a "sqlite3_column()"
  function in the SQLite API.  Instead, what we here call "sqlite3_column()"
  is a place-holder for an entire family of functions that return
  a value from the result set in various data types.  There are also routines
  in this family that return the size of the result (if it is a string or
  BLOB) and the number of columns in the result set.  

  
     sqlite3_column_blob() 
     sqlite3_column_bytes() 
     sqlite3_column_bytes16() 
     sqlite3_column_count() 
     sqlite3_column_double() 
     sqlite3_column_int() 
     sqlite3_column_int64() 
     sqlite3_column_text() 
     sqlite3_column_text16() 
     sqlite3_column_type() 
     sqlite3_column_value() 
  


sqlite3_finalize()

  This routine destroys a prepared statement created by a prior call
  to sqlite3_prepare().  Every prepared statement must be destroyed using
  a call to this routine in order to avoid memory leaks.

sqlite3_close()

  This routine closes a database connection previously opened by a call
  to sqlite3_open().  All prepared statements associated with the
  connection should be finalized prior to closing the
  connection.


4. Typical Usage Of Core Routines And Objects


  An application will typically use
  sqlite3_open() to create a single database connection
  during initialization.
  Note that sqlite3_open() can be used to either open existing database
  files or to create and open new database files.
  While many applications use only a single database connection, there is
  no reason why an application cannot call sqlite3_open() multiple times
  in order to open multiple database connections - either to the same
  database or to different databases.  Sometimes a multi-threaded application
  will create separate database connections for each thread.
  Note that a single database connection can access two or more
  databases using the ATTACH SQL command, so it is not necessary to
  have a separate database connection for each database file.



  Many applications destroy their database connections using calls to
  sqlite3_close() at shutdown.  Or, for example, an application that
  uses SQLite as its application file format might
  open database connections in response to a File/Open menu action
  and then destroy the corresponding database connection in response
  to the File/Close menu.



  To run an SQL statement, the application follows these steps:



   Create a prepared statement using sqlite3_prepare(). 
   Evaluate the prepared statement by calling sqlite3_step() one
       or more times. 
   For queries, extract results by calling 
       sqlite3_column() in between
       two calls to sqlite3_step(). 
   Destroy the prepared statement using sqlite3_finalize(). 



  The foregoing is all one really needs to know in order to use SQLite
  effectively.  All the rest is optimization and detail.


5. Convenience Wrappers Around Core Routines


  The sqlite3_exec() interface is a convenience wrapper that carries out
  all four of the above steps with a single function call.  A callback
  function passed into sqlite3_exec() is used to process each row of
  the result set.  The sqlite3_get_table() is another convenience wrapper
  that does all four of the above steps.  The sqlite3_get_table() interface
  differs from sqlite3_exec() in that it stores the results of queries
  in heap memory rather than invoking a callback.



  It is important to realize that neither sqlite3_exec() nor
  sqlite3_get_table() do anything that cannot be accomplished using
  the core routines.  In fact, these wrappers are implemented purely in
  terms of the core routines.



6. Binding Parameters and Reusing Prepared Statements


  In prior discussion, it was assumed that each SQL statement is prepared
  once, evaluated, then destroyed.  However, SQLite allows the same
  prepared statement to be evaluated multiple times.  This is accomplished
  using the following routines:



   sqlite3_reset() 
   sqlite3_bind() 



  After a prepared statement has been evaluated by one or more calls to
  sqlite3_step(), it can be reset in order to be evaluated again by a
  call to sqlite3_reset().
  Think of sqlite3_reset() as rewinding the prepared statement program
  back to the beginning.
  Using sqlite3_reset() on an existing prepared statement rather than
  creating a new prepared statement avoids unnecessary calls to
  sqlite3_prepare().
  For many SQL statements, the time needed
  to run sqlite3_prepare() equals or exceeds the time needed by
  sqlite3_step().  So avoiding calls to sqlite3_prepare() can give
  a significant performance improvement.



  It is not commonly useful to evaluate the exact same SQL
  statement more than once.  More often, one wants to evaluate similar
  statements.  For example, you might want to evaluate an INSERT statement
  multiple times with different values.  Or you might want to evaluate
  the same query multiple times using a different key in the WHERE clause.
  To accommodate
  this, SQLite allows SQL statements to contain parameters
  which are "bound" to values prior to being evaluated.  These values can
  later be changed and the same prepared statement can be evaluated
  a second time using the new values.



  SQLite allows a parameter wherever
  a string literal, numeric constant, or NULL is allowed.
  (Parameters may not be used for column or table names.)
  A parameter takes one of the following forms:



   ? 
   ?NNN 
   :AAA 
   $AAA 
   @AAA 



  In the examples above, NNN is an integer value and
  AAA is an identifier.
  A parameter initially has a value of NULL.
  Prior to calling sqlite3_step() for the first time or immediately
  after sqlite3_reset(), the application can invoke the
  sqlite3_bind() interfaces to attach values
  to the parameters.  Each call to sqlite3_bind()
  overrides prior bindings on the same parameter.



  An application is allowed to prepare multiple SQL statements in advance
  and evaluate them as needed.
  There is no arbitrary limit to the number of outstanding
  prepared statements.
  Some applications call sqlite3_prepare() multiple times at start-up to
  create all of the prepared statements they will ever need.  Other
  applications keep a cache of the most recently used prepared statements
  and then reuse prepared statements out of the cache when available.
  Another approach is to only reuse prepared statements when they are
  inside of a loop.


7. Configuring SQLite


  The default configuration for SQLite works great for most applications.
  But sometimes developers want to tweak the setup to try to squeeze out
  a little more performance, or take advantage of some obscure feature.

  The sqlite3_config() interface is used to make global, process-wide
  configuration changes for SQLite.  The sqlite3_config() interface must
  be called before any database connections are created.  The
  sqlite3_config() interface allows the programmer to do things like:

Adjust how SQLite does memory allocation, including setting up
    alternative memory allocators appropriate for safety-critical
    real-time embedded systems and application-defined memory allocators.
Set up a process-wide error log.
Specify an application-defined page cache.
Adjust the use of mutexes so that they are appropriate for various
    threading models, or substitute an 
    application-defined mutex system.
 

  After process-wide configuration is complete and database connections
  have been created, individual database connections can be configured using
  calls to sqlite3_limit() and sqlite3_db_config().

8. Extending SQLite


  SQLite includes interfaces that can be used to extend its functionality.
  Such routines include:



   sqlite3_create_collation() 
   sqlite3_create_function() 
   sqlite3_create_module() 
   sqlite3_vfs_register() 



  The sqlite3_create_collation() interface is used to create new
  collating sequences for sorting text.
  The sqlite3_create_module() interface is used to register new
  virtual table implementations.
  The sqlite3_vfs_register() interface creates new VFSes.



  The sqlite3_create_function() interface creates new SQL functions - 
  either scalar or aggregate.  The new function implementation typically
  makes use of the following additional interfaces:



   sqlite3_aggregate_context() 
   sqlite3_result() 
   sqlite3_user_data() 
   sqlite3_value() 



  All of the built-in SQL functions of SQLite are created using exactly
  these same interfaces.  Refer to the SQLite source code, and in particular
  the 
  date.c and
  func.c source files
  for examples.



  Shared libraries or DLLs can be used as loadable extensions to SQLite.

9. Other Interfaces


  This article only mentions the most important and most commonly
  used SQLite interfaces.
  The SQLite library includes many other APIs implementing useful
  features that are not described here.  
  A complete list of functions that form the SQLite
  application programming interface is found at the
  C/C++ Interface Specification.
  Refer to that document for complete and authoritative information about
  all SQLite interfaces.

This page last modified on  2017-09-29 12:11:33 UTCcintro.html
!!‡y|    ;1SQLite Is TransactionalSQLite is Transactional

A transactional database is one in which all changes and queries
appear to be
Atomic, Consistent, Isolated, and Durable
(ACID).
SQLite implements 
serializable
transactions that are atomic, consistent, isolated, and durable,
even if the transaction is interrupted by a program crash, an
operating system crash, or a power failure to the computer.



We here restate and amplify the previous sentence for emphasis:
All changes within a single transaction in SQLite either occur
completely or not at all, even if the act of writing the change
out to the disk is interrupted by

a program crash,
an operating system crash, or
a power failure.




The claim of the previous paragraph is extensively checked in the
SQLite regression test suite using a special test harness that 
simulates the effects on a database file of operating system crashes 
and power failures.



Additional information

This page last modified on  2021-02-12 00:39:31 UTCtransactional.htmlóN{
gæ%#An Introduction To The SQLite C/C++ Interface1. Summary

The following two objects and eight methods comprise the essential
elements of the SQLite interface:


sqlite3 &rarr;
The database connection object.  Created by
sqlite3_open() and destroyed by sqlite3_close().

sqlite3_stmt &rarr;
The prepared statement object.  Created by
sqlite3_prepare() and destroyed by sqlite3_finalize().


sqlite3_open() &rarr;
Open a connection to a new or existing SQLite database.
The constructor for sqlite3.

sqlite3_prepare() &rarr;
Compile SQL text into
byte-code that will do the work of querying or updating the database. 
The constructor for sqlite3_stmt.

sqlite3_bind() &rarr;
Store application data into
parameters of the original SQL.


sqlite3_step() &rarr;
Advance an sqlite3_stmt to the next result row or to completion.

sqlite3_column() &rarr;
Column values in the current result row for an sqlite3_stmt.

sqlite3_finalize() &rarr;
Destructor for sqlite3_stmt.

sqlite3_close() &rarr;
Destructor for sqlite3.

sqlite3_exec() &rarr;
A wrapper function that does sqlite3_prepare(), sqlite3_step(),
sqlite3_column(), and sqlite3_finalize() for
a string of one or more SQL statements.


2. Introduction


  SQLite has more than 225 APIs.
  However, most of the APIs are optional and very specialized
  and can be ignored by beginners.
  The core API is small, simple, and easy to learn.
  This article summarizes the core API.



  A separate document, The SQLite C/C++ Interface,
  provides detailed
  specifications for all C/C++ APIs for SQLite.  Once
  the reader
  understands the basic principles of operation for SQLite, 
  that document should be used as a reference
  guide.  This article is intended as introduction only and is neither a
  complete nor authoritative reference for the SQLite API.


3. Core Objects And Interfaces


  The principal task of an SQL database engine is to evaluate SQL statements
  of SQL.  To accomplish this, the developer needs two objects:



   The database connection object: sqlite3 
   The prepared statement object: sqlite3_stmt 



  Strictly speaking, the prepared statement object is not required since
  the convenience wrapper interfaces, sqlite3_exec or
  sqlite3_get_table, can be used and these convenience wrappers
  encapsulate and hide the prepared statement object.
  Nevertheless, an understanding of
  prepared statements is needed to make full use of SQLite.



  The database connection and prepared statement objects are controlled
  by a small set doing the insert.


In order to maximize compatibility between SQLite and other database
engines, and so that the example above will work on SQLite as it does
on other SQL database engines,
SQLite supports the concept of "type affinity" on columns.
The type affinity of a column is the recommended type for data stored
in that column.  The important idea here is that the type is recommended, not
required.  Any column can still store any type of data.
It is just that some columns, given the choice, will prefer to use
one storage class over another.  The preferred storage class for
a column is called its "affinity".


Each column in an SQLite 3 database is assigned one of the
following type affinities:

        TEXT
        NUMERIC
        INTEGER
        REAL
        BLOB


(Historical note:  The "BLOB" type affinity used to be called "NONE".
But that term was easy to confuse with "no affinity" and so it was
renamed.)

A column with TEXT affinity stores all data using storage classes
NULL, TEXT or BLOB. If numerical data is inserted into a column with
TEXT affinity it is converted into text form before being stored.

A column with NUMERIC affinity may contain values using all five
storage classes.  When text data is inserted into a NUMERIC column, the
storage class of the text is converted to INTEGER or REAL (in order of
preference) if the text is a well-formed integer or real literal, respectively.
If the TEXT value is a well-formed integer literal that is too large
to fit in a 64-bit signed integer, it is converted to REAL.
For conversions between TEXT and REAL storage classes, only the first
15 significant decimal digits of the number are preserved.
If the TEXT value is not a well-formed integer or real literal,
then the value is stored as TEXT.
For the purposes of this paragraph, hexadecimal integer
literals are not considered well-formed and are stored as TEXT.
(This is done for historical compatibility with versions of SQLite
prior to version 3.8.6 2014-08-15 where hexadecimal integer
literals were first introduced into SQLite.)
If a floating point value that can be represented exactly as an integer
is inserted into a column with NUMERIC affinity, the value is
converted into an integer.
No attempt is made to convert NULL or BLOB values.

A string might look like a floating-point literal with
a decimal point and/or exponent notation but as long as
the value can be expressed as an integer, the NUMERIC affinity will convert
it into an integer. Hence, the string '3.0e+5' is stored in a
column with NUMERIC affinity as the integer 300000, not as the floating
point value 300000.0.

A column that uses INTEGER affinity behaves the same as a column
with NUMERIC affinity.  The difference between INTEGER and NUMERIC affinity
is only evident in a CAST expression:  The expression
"CAST(4.0 AS INT)" returns an integer 4, whereas
"CAST(4.0 AS NUMERIC)" leaves the value as a floating-point 4.0.

A column with REAL affinity behaves like a column with NUMERIC
affinity except that it forces integer values into floating point
representation.  (As an internal optimization, small floating point
values with no fractional component and stored in columns with REAL
affinity are written to disk as integers in order to take up less 
space and are automatically converted back into floating point as
the value is read out.
This optimization is completely invisible at the SQL level and can only
be detected by examining the raw bits of the database file.)

A column with affinity BLOB does not prefer one storage class over
another and no attempt is made to coerce data from one storage class into
another.



3.1. Determination Of Column Affinity

For tables not declared as STRICT,
the affinity of a column is determined by the declared type
of the column, according to the following rules in the order shown:


  If the declared type contains the string "INT" then it
  is assigned INTEGER affinity.

  If the declared type of the column contains any of the strings
  "CHAR", "CLOB", or "TEXT" then that
  column has TEXT affinity.  Notice that the type VARCHAR contains the
  string "CHAR" and is thus assigned TEXT affinity.

  If the declared type for a column
  contains the string "BLOB" or if
  no type is specified then the column has affinity BLOB.

  If the declared type for a column
  contains any of the strings "REAL", "FLOA",
  or "DOUB" then the column has REAL affinity.

  Otherwise, the affinity is NUMERIC.


Note that the order of the rules for determining column affinity
is important.  A column whose declared type is "CHARINT" will match
both rules 1 and 2 but the first rule takes precedence and so the 
column affinity will be INTEGER.

3.1.1. Affinity Name Examples

The following table shows how many common datatype names from
more traditional SQL implementations are converted into affinities by the five rules of the
previous section.  This table shows only a small subset of the
datatype names that SQLite will accept.  Note that numeric arguments
in parentheses that following the type name (ex: "VARCHAR(255)") are
ignored by SQLite - SQLite does not impose any length restrictions
(other than the large global SQLITE_MAX_LENGTH limit) on the length of
strings, BLOBs or numeric values.

 

Example Typenames From TheCREATE TABLE Statement
        or CAST Expression
    Resulting Affinity
    Rule Used To Determine Affinity


  INT
  INTEGER
  TINYINT
  SMALLINT
  MEDIUMINT
  BIGINT
  UNSIGNED BIG INT
  INT2
  INT8
INTEGER
1


  CHARACTER(20)
  VARCHAR(255)
  VARYING CHARACTER(255)
  NCHAR(55)
  NATIVE CHARACTER(70)
  NVARCHAR(100)
  TEXT
  CLOB
TEXT
2


  BLOB
  no datatype specified
BLOB
3


  REAL
  DOUBLE
  DOUBLE PRECISION
  FLOAT
REAL
4


  NUMERIC
  DECIMAL(10,5)
  BOOLEAN
  DATE
  DATETIME
NUMERIC
5



Note that a declared type of "FLOATING POINT" would give INTEGER
affinity, not REAL affinity, due to the "INT" at the end of "POINT".
And the declared type of "STRING" has an affinity of NUMERIC, not TEXT.



3.2. Affinity Of Expressions

Every table column has a type affinity (one of BLOB, TEXT, INTEGER,
REAL, or NUMERIC) but expressions do not necessarily have an affinity.

Expression affinity is determined by the following rules:


  The right-hand operand of an IN or NOT IN
  operator has no affinity if the operand is a list, or has the same
  affinity as the affinity of the result set expression if the operand
  is a SELECT.

  When an expression is a simple reference to a column of a
  real table (not a VIEW or subquery) then the expression
  has the same affinity as the table column.
  
  Parentheses around the column name are ignored.  Hence if
  X and Y.Z are column names, then (X) and (Y.Z) are also considered
  column names and have the affinity of the corresponding columns.
  
  Any operators applied to column names, including the no-op 
   unary "+" operator, convert the column name into an expression which
   always has no affinity.  Hence even if X and Y.Z are column names, the
   expressions +X and +Y.Z are not column names and have no affinity.
  

  An expression of the form "CAST(expr AS type)"
  has an affinity that is the same as a column with a declared
  type of "type".

  A COLLATE operator has the same affinity as its left-hand side operand.

  Otherwise, an expression has no affinity.




3.3. Column Affinity For Views And Subqueries

The "columns" of a VIEW or FROM-clause subquery are really
the expressions
in the result set of the SELECT statement that implements the VIEW
or subquery.  Thus, the affinity for columns of a VIEW or subquery
are determined by the expression affinity rules above.
Consider an example:


CREATE TABLE t1(a INT, b TEXT, c REAL);
CREATE VIEW v1(x,y,z) AS SELECT b, a+c, 42 FROM t1 WHERE b!=11;


The affinity of the v1.x column will be the same as the affinity
of t1.b (TEXT), since v1.x maps directly into t1.b.  But
columns v1.y and v1.z both have no affinity, since those columns
map into expression a+c and 42, and expressions always have no
affinity.



3.3.1. Column Affinity For Compound Views

When the SELECT statement that implements a VIEW or 
FROM-clause subquery is a compound SELECT then the affinity of 
each column of the VIEW or subquery will
be the affinity of the corresponding result column for
one of the individual SELECT statements that make up 
the compound.  
However, it is indeterminate which of the SELECT statements will 
be used to determine affinity.
Different constituent SELECT statements might be used to determine 
affinity at different times during query evaluation.  The choice
might vary across different versions of SQLite.  The choice might
change between one query and the next in the same version of SQLite.
The choice might be different at different times within the same
query.  Hence, you can never be sure what affinity will be used
for columns of a compound SELECT that have different affinities in
the constituent subqueries.

Best practice is to avoid mixing affinities in a compound SELECT
if you care about the datatype of the result.  Mixing affinities in
a compound SELECT can lead to surprising and unintuitive results.
See, for example, forum post 02d7be94d7.

3.4. Column Affinity Behavior Example

The following SQL demonstrates how SQLite uses column affinity
to do type conversions when values are inserted into a table.



CREATE TABLE t1(
    t  TEXT,     -- text affinity by rule 2
    nu NUMERIC,  -- numeric affinity by rule 5
    i  INTEGER,  -- integer affinity by rule 1
    r  REAL,     -- real affinity by rule 4
    no BLOB      -- no affinity by rule 3
);

-- Values stored as TEXT, INTEGER, INTEGER, REAL, TEXT.
INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0', '500.0');
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|text

-- Values stored as TEXT, INTEGER, INTEGER, REAL, REAL.
DELETE FROM t1;
INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0, 500.0);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|real

-- Values stored as TEXT, INTEGER, INTEGER, REAL, INTEGER.
DELETE FROM t1;
INSERT INTO t1 VALUES(500, 500, 500, 500, 500);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|integer

-- BLOBs are always stored as BLOBs regardless of column affinity.
DELETE FROM t1;
INSERT INTO t1 VALUES(x'0500', x'0500', x'0500', x'0500', x'0500');
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
blob|blob|blob|blob|blob

-- NULLs are also unaffected by affinity
DELETE FROM t1;
INSERT INTO t1 VALUES(NULL,NULL,NULL,NULL,NULL);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
null|null|null|null|null





4. Comparison Expressions

SQLite version 3 has the usual set of SQL comparison operators
including "=", "==", "&lt;", "&lt;=", "&gt;", "&gt;=", "!=", "",
"IN", "NOT IN", "BETWEEN", "IS", and "IS NOT", .



4.1. Sort Order

The results of a comparison depend on the storage classes of the
operands, according to the following rules:

  A value with storage class NULL is considered less than any
  other value (including another value with storage class NULL).

  An INTEGER or REAL value is less than any TEXT or BLOB value.
  When an INTEGER or REAL is compared to another INTEGER or REAL, a
  numerical comparison is performed.

  A TEXT value is less than a BLOB value.  When two TEXT values
  are compared an appropriate collating sequence is used to determine 
  the result.  

  When two BLOB values are compared, the result is
  determined using memcmp().




4.2. Type Conversions Prior To Comparison

SQLite may attempt to convert values between the storage classes
INTEGER, REAL, and/or TEXT before performing a comparison.
Whether or not any conversions are attempted before the comparison takes
place depends on the type affinity of the operands.

To "apply affinity" means to convert an operand to a particular storage
class if and only if the conversion does not lose essential information.
Numeric values can always be converted into TEXT.  TEXT values 
can be converted into numeric values if the text content is a well-formed 
integer or real literal, but not a hexadecimal integer literal.
BLOB values are converted into TEXT values by  simply interpreting
the binary BLOB content as a text string in the current database
encoding.

Affinity is applied to operands of a comparison operator prior to
the comparison according to the following rules in the order shown:


If one operand has INTEGER, REAL or NUMERIC affinity
and the other operand has TEXT or BLOB or no affinity
then NUMERIC affinity is applied to other operand.

If one operand has TEXT affinity and the other has no affinity,
then TEXT affinity is applied to the other operand.

Otherwise, no affinity is applied and both operands are compared
as is.


The expression "a BETWEEN b AND c" is treated as two separate
binary comparisons "a &gt;= b AND a &lt;= c", even if that means
different affinities are applied to 'a' in each of the comparisons.
Datatype conversions in comparisons of the
form "x IN (SELECT y ...)" are handled as if
the comparison were really "x=y".
The expression "a IN (x, y, z, ...)" is equivalent to "a = +x OR
a = +y OR a = +z OR ...".  
In other words, the values to the right of the IN operator (the "x", "y",
and "z" values in this example) are considered to have no affinity, 
even if they happen to be column values or CAST expressions.  


4.3. Comparison Example



CREATE TABLE t1(
    a TEXT,      -- text affinity
    b NUMERIC,   -- numeric affinity
    c BLOB,      -- no affinity
    d            -- no affinity
);

-- Values will be stored as TEXT, INTEGER, TEXT, and INTEGER respectively
INSERT INTO t1 VALUES('500', '500', '500', 500);
SELECT typeof(a), typeof(b), typeof(c), typeof(d) FROM t1;
text|integer|text|integer

-- Because column "a" has text affinity, numeric values on the
-- right-hand side of the comparisons are converted to text before
-- the comparison occurs.
SELECT a &lt; 40,   a &lt; 60,   a &lt; 600 FROM t1;
0|1|1

-- Text affinity is applied to the right-hand operands but since
-- they are already TEXT this is a no-op; no conversions occur.
SELECT a &lt; '40', a &lt; '60', a &lt; '600' FROM t1;
0|1|1

-- Column "b" has numeric affinity and so numeric affinity is applied
-- to the operands on the right.  Since the operands are already numeric,
-- the application of affinity is a no-op; no conversions occur.  All
-- values are compared numerically.
SELECT b &lt; 40,   b &lt; 60,   b &lt; 600 FROM t1;
0|0|1

-- Numeric affinity is applied to operands on the right, converting them
-- from text to integers.  Then a numeric comparison occurs.
SELECT b &lt; '40', b &lt; '60', b &lt; '600' FROM t1;
0|0|1

-- No affinity conversions occur.  Right-hand side values all have
-- storage class INTEGER which are always less than the TEXT values
-- on the left.
SELECT c &lt; 40,   c &lt; 60,   c &lt; 600 FROM t1;
0|0|0

-- No affinity conversions occur.  Values are compared as TEXT.
SELECT c &lt; '40', c &lt; '60', c &lt; '600' FROM t1;
0|1|1

-- No affinity conversions occur.  Right-hand side values all have
-- storage class INTEGER which compare numerically with the INTEGER
-- values on the left.
SELECT d &lt; 40,   d &lt; 60,   d &lt; 600 FROM t1;
0|0|1

-- No affinity conversions occur.  INTEGER values on the left are
-- always less than TEXT values on the right.
SELECT d &lt; '40', d &lt; '60', d &lt; '600' FROM t1;
1|1|1



All of the results in the example are the same if the comparisons are
commuted - if expressions of the form "a&lt;40" are rewritten
as "40&gt;a".

5. Operators

Mathematical operators (+, -, *, /, %, &lt;&lt;, &gt;&gt;,
&amp;, and |) interpret both operands as if they were numbers.
STRING or BLOB operands automatically convert into REAL or INTEGER values.
If the STRING or BLOB looks like a real number (if it has a decimal point
or an exponent) or if the value is outside the range that can be represented
as a 64-bit signed integer, then it converts to REAL.  Otherwise the operand
converts to INTEGER.
The implied type conversion of mathematical operands is slightly different
from CAST to NUMERIC in that string and BLOB values that
look like real numbers but have no fractional part are kept as REAL
instead of being converted into INTEGER as they !would be for CAST to NUMERIC.
The conversion from STRING or BLOB into REAL or INTEGER is performed
even if it is lossy and irreversible.
Some mathematical operators (%, &lt;&lt;, &gt;&gt;, &amp;, and |) expect
INTEGER operands.  For those operators, REAL operands are converted into INTEGER
in the same way as a CAST to INTEGER.
The &lt;&lt;, &gt;&gt;, &amp;, and | operators always return an INTEGER (or NULL)
result, but the % operator returns either INTEGER or REAL (or NULL)
depending on the type of its operands.
A NULL operand on a mathematical operator yields a NULL result.
An operand on a mathematical operator that does not look in any way
numeric and is not NULL is converted to 0 or 0.0.
Division by zero gives a result of NULL.


6. Sorting, Grouping and Compound SELECTs

When query results are sorted by an ORDER BY clause, values with storage
class NULL come first, followed by INTEGER and REAL values
interspersed in numeric order, followed by TEXT values in collating
sequence order, and finally BLOB values in memcmp() order.  No storage
class conversions occur before the sort.

When grouping values with the GROUP BY clause values with
different storage classes are considered distinct, except for INTEGER
and REAL values which are considered equal if they are numerically
equal. No affinities are applied to any values as the result of a
GROUP by clause.

The compound SELECT operators UNION,
INTERSECT and EXCEPT perform implicit comparisons between values.
No affinity is applied to comparison operands for the implicit
comparisons associated with UNION, INTERSECT, or EXCEPT - the values
are compared as is.



7. Collating Sequences

When SQLite compares two strings, it uses a collating sequence or
collating function (two terms for the same thing) to determine which
string is greater or if the two strings are equal.
SQLite has three built-in collating functions:  BINARY, NOCASE, and 
RTRIM.


BINARY - Compares string data using memcmp(), regardless
                   of text encoding.
NOCASE - Similar to binary, except that it uses
     sqlite3_strnicmp() for the comparison.  Hence the 26 upper case
     characters of ASCII are folded to their lower case equivalents before
     the comparison is performed.  Note that only ASCII characters
     are case folded.  SQLite does not attempt to do full
     UTF case folding due to the size of the tables required.
     Also note that any U+0000 characters in the string are considered
     string terminators for comparison purposes.

RTRIM - The same as binary, except that trailing space
     characters are ignored.


An application can register additional collating functions using
the sqlite3_create_collation() interface.

Collating functions only matter when comparing string values.
Numeric values are always compared numerically, and BLOBs are always
compared byte-by-byte using memcmp().

7.1. Assigning Collating Sequences from SQL


Every column of every
table has an associated collating function.  If no collating function
is explicitly defined, then the collating function defaults to BINARY.
The COLLATE clause of the column definition is used
to define alternative collating functions for a column.






The rules for determining which collating function to use for a
binary comparison operator (=, &lt;, &gt;, &lt;=, &gt;=, !=, IS, and
IS NOT) are as follows:


If either operand has an explicit collating function assignment
using the postfix COLLATE operator, then the explicit collating function
is used for comparison, with precedence to the collating function of the
left operand.

If either operand is a column, then the collating function of
that column is used with precedence to the left operand.
For the purposes of the previous sentence, a column name
preceded by one or more unary "+" operators and/or CAST operators
is still considered a column name.


Otherwise, the BINARY collating function is used for comparison.




An operand of a comparison is considered to have an explicit
collating function assignment (rule 1 above) 
if any subexpression of the operand uses
the postfix COLLATE operator.  Thus, if a COLLATE operator is used
anywhere in a comparison expression, the collating function defined
by that operator is used for string comparison regardless of what 
table columns might be a part of that expression.  If two or more
COLLATE operator subexpressions appear anywhere in a comparison, the 
left most explicit collating function is used regardless of how deeply the
COLLATE operators are nested in the expression and regardless of
how the expression is parenthesized.



The expression "x BETWEEN y and z" is logically
equivalent to two comparisons "x &gt;= y AND x &lt;= z" and works with
respect to collating functions as if it were two separate comparisons.
The expression "x IN (SELECT y ...)" is handled in the same way as the
expression "x = y" for the purposes of determining the collating sequence.
The collating sequence used for expressions of the form 
"x IN (y, z, ...)" is the collating sequence of x.
If an explicit collating sequence is required on an IN operator
it should be applied to the left operand, like this: 
"x COLLATE nocase IN (y,z, ...)".
  


Terms of the ORDER BY clause that is part of a SELECT
statement may be assigned a collating sequence using the 
COLLATE operator, in which case the specified collating function is
used for sorting.
Otherwise, if the expression sorted by an ORDER BY clause is
a column, then the collating sequence of the column is used to
determine sort order. If the expression is not a column and has no
COLLATE clause, then the BINARY collating sequence is used.
  

7.2. Collation Sequence Examples

The examples below identify the collating sequences that would be used to
determine the results of text comparisons that may be performed by various
SQL statements. Note that a text comparison may not be required, and no
collating sequence used, in the case of numeric, blob or NULL values.



CREATE TABLE t1(
    x INTEGER PRIMARY KEY,
    a,                 /* collating sequence BINARY */
    b COLLATE BINARY,  /* collating sequence BINARY */
    c COLLATE RTRIM,   /* collating sequence RTRIM  */
    d COLLATE NOCASE   /* collating sequence NOCASE */
);
                   /* x   a     b     c       d */
INSERT INTO t1 VALUES(1,'abc','abc', 'abc  ','abc');
INSERT INTO t1 VALUES(2,'abc','abc', 'abc',  'ABC');
INSERT INTO t1 VALUES(3,'abc','abc', 'abc ', 'Abc');
INSERT INTO t1 VALUES(4,'abc','abc ','ABC',  'abc');
 
/* Text comparison a=b is performed using the BINARY collating sequence. */
SELECT x FROM t1 WHERE a = b ORDER BY x;
--result 1 2 3

/* Text comparison a=b is performed using the RTRIM collating sequence. */
SELECT x FROM t1 WHERE a = b COLLATE RTRIM ORDER BY x;
--result 1 2 3 4

/* Text comparison d=a is performed using the NOCASE collating sequence. */
SELECT x FROM t1 WHERE d = a ORDER BY x;
--result 1 2 3 4

/* Text comparison a=d is performed using the BINARY collating sequence. */
SELECT x FROM t1 WHERE a = d ORDER BY x;
--result 1 4

/* Text comparison 'abc'=c is performed using the RTRIM collating sequence. */
SELECT x FROM t1 WHERE 'abc' = c ORDER BY x;
--result 1 2 3

/* Text comparison c='abc' is performed using the RTRIM collating sequence. */
SELECT x FROM t1 WHERE c = 'abc' ORDER BY x;
--result 1 2 3

/* Grouping is performed using the NOCASE collating sequence (Values
** 'abc', 'ABC', and 'Abc' are placed in the same group). */
SELECT count(*) FROM t1 GROUP BY d ORDER BY 1;
--result 4

/* Grouping is performed using the BINARY collating sequence.  'abc' and
** 'ABC' and 'Abc' form different groups */
SELECT count(*) FROM t1 GROUP BY (d || '') ORDER BY 1;
--result 1 1 2

/* Sorting or column c is performed using the RTRIM collating sequence. */
SELECT x FROM t1 ORDER BY c, x;
--result 4 1 2 3

/* Sorting of (c||'') is performed using the BINARY collating sequence. */
SELECT x FROM t1 ORDER BY (c||''), x;
--result 4 2 3 1

/* Sorting of column c is performed using the NOCASE collating sequence. */
SELECT x FROM t1 ORDER BY c COLLATE NOCASE, x;
--result 2 4 3 1


This page last modified on  2022-04-12 00:22:10 UTCdatatype3.html
±±Þ.}
3ƒ¼)Datatypes In SQLite1. Datatypes In SQLite
Most SQL database engines (every SQL database engine other than SQLite,
as far as we know) uses static, rigid typing.  With static typing, the datatype
of a value is determined by its container - the particular column in
which the value is stored.

SQLite uses a more general dynamic type system.  In SQLite, the datatype
of a value is associated with the value itself, not with its container.
The dynamic type system of SQLite is backwards
compatible with the more common static type systems of other database engines
in the sense that SQL statements that work on statically typed databases
work the same way in SQLite.  However, the dynamic typing in SQLite allows
it to do things which are not possible in traditional rigidly typed
databases.  Flexible typing is a feature of SQLite, not a bug.

Update:
As of version 3.37.0 (2021-11-27), SQLite provides STRICT tables
that do rigid type enforcement, for developers who prefer that kind of thing.



2. Storage Classes and Datatypes

Each value stored in an SQLite database (or manipulated by the
database engine) has one of the following storage classes:

  NULL.
  The value is a NULL value.

  INTEGER. The value is a signed integer, stored in 0, 1,
  2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.

  REAL. The value is a floating point value, stored as
  an 8-byte IEEE floating point number.

  TEXT. The value is a text string, stored using the
  database encoding (UTF-8, UTF-16BE or UTF-16LE).

  BLOB. The value is a blob of data, stored exactly as
  it was input.


A storage class is more general than a datatype.
The INTEGER storage class, for example, includes 7 different integer
datatypes of different lengths.
This makes a difference on disk. 
But as soon as INTEGER values are read off of disk and into memory for
processing, they are converted to the most general datatype
(8-byte signed integer).
And so for the most part, "storage class" is indistinguishable from 
"datatype" and the two terms can be used interchangeably.

Any column in an SQLite version 3 database,
except an INTEGER PRIMARY KEY column, may be used to store a value 
of any storage class.

All values in SQL statements, whether they are literals embedded in SQL
statement text or parameters bound to 
precompiled SQL statements
have an implicit storage class.
Under circumstances described below, the
database engine may convert values between numeric storage classes
(INTEGER and REAL) and TEXT during query execution. 




2.1. Boolean Datatype

SQLite does not have a separate Boolean storage class.
Instead, Boolean values are stored as integers 0 (false) and 1 (true).

SQLite recognizes the keywords "TRUE" and "FALSE",
as of version 3.23.0 (2018-04-02) but those keywords are
really just alternative spellings for the integer literals 1 and 0
respectively.



2.2. Date and Time Datatype

SQLite does not have a storage class set aside for storing
dates and/or times.
Instead, the built-in Date And Time Functions of SQLite are capable of 
storing dates and times as TEXT, REAL, or INTEGER values:


TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
REAL as Julian day numbers, the number of days since
noon in Greenwich on November 24, 4714 B.C. according to the
proleptic Gregorian calendar.
INTEGER as Unix Time, the number of seconds since
1970-01-01 00:00:00 UTC.


Applications can choose to store dates and times in any of these
formats and freely convert between formats using the built-in
date and time functions.




3. Type Affinity


SQL database engines that use rigid typing will usually try to
automatically convert values to the appropriate datatype.  Consider this:


CREATE TABLE t1(a INT, b VARCHAR(10));
INSERT INTO t1(a,b) VALUES('123',456);



Rigidly-typed database will convert the string '123' into an
integer 123 and the integer 456 into a string '456' prior to
$ ORDER BY rank;


 As well as the column values and rowid of a matching row, an application
may use FTS5 auxiliary functions to retrieve extra information regarding
the matched row. For example, an auxiliary function may be used to retrieve
a copy of a column value for a matched row with all instances of the matched
term surrounded by html &lt;b&gt;&lt;/b&gt; tags. Auxiliary functions are
invoked in the same way as SQLite scalar functions, except that the name
of the FTS5 table is specified as the first argument. For example:

-- Query for rows that match "fts5". Return a copy of the "body" column
-- of each row with the matches surrounded by &lt;b&gt;&lt;/b&gt; tags.
SELECT highlight(email, 2, '&lt;b&gt;', '&lt;/b&gt;') FROM email('fts5');


A description of the available auxiliary functions, and more details
regarding configuration of the special "rank" column, are 
available below. Custom auxiliary functions may also be implemented in C and registered with
FTS5, just as custom SQL functions may be registered with the SQLite core.

 As well as searching for all rows that contain a term, FTS5 allows 
the user to search for rows that contain:


   any terms that begin with a specified prefix,
   "phrases" - sequences of terms or prefix terms that must feature in a
       document for it to match the query, 
   sets of terms, prefix terms or phrases that appear within a specified
       proximity of each other (these are called "NEAR queries"), or
   boolean combinations of any of the above.


 Such advanced searches are requested by providing a more complicated 
FTS5 query string as the text to the right of the MATCH operator (or =
operator, or as the first argument to a table-valued function syntax). The 
full query syntax is described here.


2. Compiling and Using FTS5

2.1. Building FTS5 as part of SQLite

As of version 3.9.0 (2015-10-14),
FTS5 is included as part of the SQLite amalgamation.
If using one of the two autoconf build system, FTS5 is
enabled by specifying the "--enable-fts5" option when running the configure
script.  (FTS5 is currently disabled by default for the
source-tree configure script and enabled by default for
the amalgamation configure script, but these defaults might
change in the future.)

Or, if sqlite3.c is compiled using some other build system, by arranging for
the SQLITE_ENABLE_FTS5 pre-processor symbol to be defined.

2.2. Building a Loadable Extension

Alternatively, FTS5 may be built as a loadable extension.

The canonical FTS5 source code consists of a series of *.c and other files
in the "ext/fts5" directory of the SQLite source tree. A build process reduces
this to just two files - "fts5.c" and "fts5.h" - which may be used to build an
SQLite loadable extension.


   Obtain the latest SQLite code from fossil.
   Create a Makefile as described in How To Compile SQLite.
   Build the "fts5.c" target. Which also creates fts5.h.


$ wget -c http://www.sqlite.org/src/tarball/SQLite-trunk.tgz?uuid=trunk -O SQLite-trunk.tgz
.... output ...
$ tar -xzf SQLite-trunk.tgz
$ cd SQLite-trunk
$ ./configure && make fts5.c
... lots of output ...
$ ls fts5.&#91;ch]
fts5.c        fts5.h



  The code in "fts5.c" may then be compiled into a loadable extension or
  statically linked into an application as described in 
  Compiling Loadable Extensions. There are two entry points defined, both
  of which do the same thing:


   sqlite3_fts_init
   sqlite3_fts5_init



  The other file, "fts5.h", is not required to compile the FTS5 extension. 
  It is used by applications that implement custom FTS5 tokenizers or auxiliary functions.


3. Full-text Query Syntax


The following block contains a summary of the FTS query syntax in BNF form.
A detailed explanation follows.

&lt;phrase&gt;    := string &#91;*]
&lt;phrase&gt;    := &lt;phrase&gt; + &lt;phrase&gt;
&lt;neargroup&gt; := NEAR ( &lt;phrase&gt; &lt;phrase&gt; ... &#91;, N] )
&lt;query&gt;     := &#91; &#91;-] &lt;colspec&gt; :] &#91;&#94;] &lt;phrase&gt;
&lt;query&gt;     := &#91; &#91;-] &lt;colspec&gt; :] &lt;neargroup&gt;
&lt;query&gt;     := &#91;% &#91;-] &lt;colspec&gt; :] ( &lt;query&gt; )
&lt;query&gt;     := &lt;query&gt; AND &lt;query&gt;
&lt;query&gt;     := &lt;query&gt; OR &lt;query&gt;
&lt;query&gt;     := &lt;query&gt; NOT &lt;query&gt;
&lt;colspec&gt;   := colname
&lt;colspec&gt;   := { colname1 colname2 ... }



3.1. FTS5 Strings

Within an FTS expression a string may be specified in one of two ways:


   By enclosing it in double quotes ("). Within a string, any embedded
       double quote characters may be escaped SQL-style - by adding a second
       double-quote character.

   As an FTS5 bareword that is not "AND", "OR" or "NOT" (case sensitive). 
       An FTS5 bareword is a string of one or more consecutive characters that
       are all either:
       
       
          Non-ASCII range characters (i.e. unicode codepoints greater 
              than 127), or 
          One of the 52 upper and lower case ASCII characters, or
          One of the 10 decimal digit ASCII characters, or
          The underscore character (unicode codepoint 96).
          The substitute character (unicode codepoint 26).
       

       Strings that include any other characters must be quoted. Characters
       that are not currently allowed in barewords, are not quote characters and
       do not currently serve any special purpose in FTS5 query expressions may
       at some point in the future be allowed in barewords or used to implement
       new query functionality. This means that queries that are currently
       syntax errors because they include such a character outside of a quoted
       string may be interpreted differently by some future version of FTS5.



3.2. FTS5 Phrases

FTS queries are made up of phrases. A phrase is an ordered list of 
one or more tokens. A string is transformed into a phrase by passing it to
the FTS table tokenizer. Two phrases can be concatenated into a single 
large phrase using the "+" operator. For example, assuming the tokenizer
module being used tokenizes the input "one.two.three" to three separate
tokens, the following four queries all specify the same phrase:

... MATCH '"one two three"'
... MATCH 'one + two + three'
... MATCH '"one two" + three'
... MATCH 'one.two.three'



A phrase matches a document if the document contains at least one sub-sequence
of tokens that matches the sequence of tokens that make up the phrase.


3.3. FTS5 Prefix Queries

If a "*" character follows a string within an FTS expression, then the final
token extracted from the string is marked as a prefix token. As you
might expect, a prefix token matches any document token of which it is a 
prefix. For example, the first two queries in the following block will match
any document that contains the token "one" immediately followed by the token
"two" and then any token that begins with "thr".

... MATCH '"one two thr" * '
... MATCH 'one + two + thr*'
... MATCH '"one two thr*"'      -- May not work as expected!


The final query in the block above may not work as expected. Because the
"*" character is inside the double-quotes, it will be passed to the tokenizer,
which will likely discard it (or perhaps, depending on the specific tokenizer
in use, include it as part of the final token) instead of recognizing it as
a special FTS character.




3.4. FTS5 Initial Token Queries

If a "&#94;" character appears immediately before a phrase that is not part of a
NEAR query, then that phrase only matches a document only if it starts at the
first token in a column. The "&#94;" syntax may be combined with a 
column filter, but may not be inserted into the middle of
a phrase.

... MATCH '&#94;one'              -- first token in any column must be "one"
... MATCH '&#94; one + two'       -- phrase "one two" must appear at start of a column
... MATCH '&#94; "one two"'       -- same as previous 
... MATCH 'a : &#94;two'          -- first token of column "a" must be "two"
... MATCH 'NEAR(&#94;one, two)'   -- syntax error! 
... MATCH 'one + &#94;two'        -- syntax error! 
... MATCH '"&#94;one two"'        -- May not work as expected!



3.5. FTS5 NEAR Queries

Two &or more phrases may be grouped into a NEAR group. A NEAR group
is specified by the token "NEAR" (case sensitive) followed by an open
parenthesis character, followed by two or more whitespace separated phrases, optionally followed by a comma and the numeric parameter N, followed by
a close parenthesis. For example:

... MATCH 'NEAR("one two" "three four", 10)'
... MATCH 'NEAR("one two" thr* + four)'


If no N parameter is supplied, it defaults to 10. A NEAR group
matches a document if the document contains at least one clump of tokens that: 

 
   contains at least one instance of each phrase, and 
   for which the number of tokens between the end of the first phrase 
       and the beginning of the last phrase in the clump is less than or equal to N.


For example:

CREATE VIRTUAL TABLE f USING fts5(x);
INSERT INTO f(rowid, x) VALUES(1, 'A B C D x x x E F x');

... MATCH 'NEAR(e d, 4)';                      -- Matches!
... MATCH 'NEAR(e d, 3)';                      -- Matches!
... MATCH 'NEAR(e d, 2)';                      -- Does not match!

... MATCH 'NEAR("c d" "e f", 3)';              -- Matches!
... MATCH 'NEAR("c"   "e f", 3)';              -- Does not match!

... MATCH 'NEAR(a d e, 6)';                    -- Matches!
... MATCH 'NEAR(a d e, 5)';                    -- Does not match!

... MATCH 'NEAR("a b c d" "b c" "e f", 4)';    -- Matches!
... MATCH 'NEAR("a b c d" "b c" "e f", 3)';    -- Does not match!



3.6. FTS5 Column Filters


A single phrase or NEAR group may be restricted to matching text within a
specified column of the FTS table by prefixing it with the column name 
followed by a colon character. Or to a set of columns by prefixing it
with a whitespace separated list of column names enclosed in parenthesis
("curly brackets") followed by a colon character. Column names may be specified
using either of the two forms described for strings above. Unlike strings that
are part of phrases, column names are not passed to the tokenizer module.
Column names are case-insensitive in the usual way for SQLite column names -
upper/lower case equivalence is understood for ASCII-range characters only.

... MATCH 'colname : NEAR("one two" "three four", 10)'
... MATCH '"colname" : one + two + three'

... MATCH '{col1 col2} : NEAR("one two" "three four", 10)'
... MATCH '{col2 col1 col3} : one + two + three'



If a column filter specification is preceded by a "-" character, then
it is interpreted as a list of column not to match against. For example:

-- Search for matches in all columns except "colname"
... MATCH '- colname : NEAR("one two" "three four", 10)'

-- Search for matches in all columns except "col1", "col2" and "col3"
... MATCH '- {col2 col1 col3} : one + two + three'



Column filter specifications may also be applied to arbitrary expressions
enclosed in parenthesis. In this case the column filter applies to all 
phrases within the expression. Nested column filter operations may only 
further restrict the subset of columns matched, they can not be used to 
re-enable filtered columns. For example:

-- The following are equivalent:
... MATCH '{a b} : ( {b c} : "hello" AND "world" )'
... MATCH '(b : "hello") AND ({a b} : "world")'



Finally, a column filter for a single column may be specified by using
the column name as the LHS of a MATCH operator (instead of the usual
table name). For example:

-- Given the following table
CREATE VIRTUAL TABLE ft USING fts5(a, b, c);

-- The following are equivalent
SELECT * FROM ft WHERE b MATCH 'uvw AND xyz';
SELECT * FROM ft WHERE ft MATCH 'b : (uvw AND xyz)';

-- This query cannot match any rows (since all columns are filtered out): 
SELECT * FROM ft WHERE b MATCH 'a : xyz';



3.7. FTS5 Boolean Operators


Phrases and NEAR groups may be arranged into expressions using boolean
operators. In order of precedence, from highest (tightest grouping) to
lowest (loosest grouping), the operators are:


  Operator Function

  &lt;query1&gt; NOT &lt;query2&gt; 
      Matches if query1 matches and query2 does not match.

  &lt;query1&gt; AND &lt;query2&gt; 
      Matches if both 'query1 and query2 match.

  &lt;query1&gt; OR &lt;query2&gt; 
      Matches if either query1 or query2 match.




Parenthesis may be used to group expressions in order to modify operator
precedence in the usual ways. For example:

-- Matches documents that contain at least one instance of either "one"
-- or "two", but do not contain any instances of token "three".
... MATCH 'one OR two NOT three'

-- Match all documents that contain the token "two" but not "three", or
-- contain the token "one".
... MATCH 'one OR (two NOT three)'



Phrases and NEAR groups may also be connected by implicit AND operators.
For simplicity, these are not shown in the BNF grammar above. Essentially, any
sequence of phrases or NEAR groups (including those restricted to matching
specified columns) separated only by whitespace are handled as if there were an
implicit AND operator between each pair of phrases or NEAR groups. Implicit
AND operators are never inserted after or before an expression enclosed in
parenthesis. For example:

... MATCH 'one two three'         -- 'one AND two AND three'
... MATCH 'three "one two"'       -- 'three AND "one two"'
... MATCH 'NEAR(one two) three'   -- 'NEAR(one two) AND three'
... MATCH 'one OR two three'      -- 'one OR two AND three'

... MATCH '(one OR two) three'    -- Syntax error!
... MATCH 'func(one two)'         -- Syntax error!



4. FTS5 Table Creation and Initialization

Each argument specified as part of a "CREATE VIRTUAL TABLE ... USING fts5 
..." statement is either a column declaration or a configuration option. A
column declaration consists of one or more whitespace separated FTS5
barewords or string literals quoted in any manner acceptable to SQLite.

The first string or bareword in a column declaration is the column name. It
is an error to attempt to name an fts5 table column "rowid" or "rank", or to
assign the same name to a column as is used by the table itself. This is not
supported.

Each subsequent string or bareword in a column declaration is a column
option that modifies the behaviour of that column. Column options are
case-independent. Unlike the SQLite core, FTS5 considers unrecognized column
options to be errors. Currently, the only option recognized is 
"UNINDEXED" (see below).

A configuration option consists of an FTS5 bareword - the option name -
followed by an "=" character, followed by the option value. The option value is
specified using either a single FTS5 bareword or a string literal, again quoted
in any manner acceptable to the SQLite core. For example:

CREATE VIRTUAL TABLE mail USING fts5(sender, title, body, tokenize = 'porter ascii');


 There are currently the following configuration options:


   The "tokenize" option, used to configure a custom tokenizer.
   The "prefix" option, used to add prefix indexes
       to an FTS5 table.
   The "content" option, used to make the FTS5 table an 
       external content or contentless table.
   The "content_rowid" option, used to set the rowid field of an 
       external content table.
   The "columnsize" option, used to configure
       whether or not the size in tokens of each value in the FTS5 table is
       stored separately within the database.
   The "detail" option. This option may be used 
       to reduce the size of the FTS index on disk by omitting some information
       from it.  



4.1. The UNINDEXED column option

The contents of columns qualified with the UNINDEXED column option are not
added to the FTS index. This means that for the purposes of MATCH queries and
FTS5 auxiliary functions, the column contains no matchable tokens. 

For example, to avoid adding the contents of the "uuid" field to the FTS
index:
CREATE VIRTUAL TABLE customers USING fts5(name, addr, uuid UNINDEXED);



4.2. Prefix Indexes

 By default, FTS5 maintains a single index recording the location of each
token instance within the document set. This means that querying for complete
tokens is fast, as it requires a single lookup, but querying for a prefix 
token can be slow, as it requires a range scan. For example, to query for
the p(refix token "abc*" requires a range scan of all tokens greater than
or equal to "abc" and less than "abd".

 A prefix index is a separate index that records the location of all
instances of prefix tokens of a certain length in characters used to speed
up queries for prefix tokens. For example, optimizing a query for prefix
token "abc*" requires a prefix index of three-character prefixes.

 To add prefix indexes to an FTS5 table, the "prefix" option is set to
either a single positive integer or a text value containing a white-space
separated list of one or more positive integer values. A prefix index is
created for each integer specified. If more than one "prefix" option is
specified as part of a single CREATE VIRTUAL TABLE statement, all apply.

-- Two ways to create an FTS5 table that maintains prefix indexes for
-- two and three character prefix tokens.
CREATE VIRTUAL TABLE ft USING fts5(a, b, prefix='2 3');
CREATE VIRTUAL TABLE ft USING fts5(a, b, prefix=2, prefix=3);



4.3. Tokenizers

 The CREATE VIRTUAL TABLE "tokenize" option is used to configure the
specific tokenizer used by the FTS5 table. The option argument must be either
an FTS5 bareword, or an SQL text literal. The text of the argument is itself
treated as a white-space series of one or more FTS5 barewords or SQL text
literals. The first of these is the name of the tokenizer to use. The second
and subsequent list elements, if they exist, are arguments passed to the
tokenizer implementation.

 Unlike option values and column names, SQL text literals intended as
tokenizers must be quoted using single quote characters. For example:

-- The following are all equivalent
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'porter ascii');
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = "porter ascii");
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = "'porter' 'ascii'");
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = '''porter'' ''ascii''');

-- But this will fail:
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = '"porter" "ascii"');

-- This will fail too:
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'porter' 'ascii');




FTS5 features three built-in tokenizer modules, described in subsequent
sections:


   The unicode61 tokenizer, based on the Unicode 6.1 standard. This
       is the default.

   The ascii tokenizer, which assumes all characters outside of
  the ASCII codepoint range (0-127) are to be treated as token characters.

   The porter tokenizer, which implements the 
porter stemming algorithm.


 It is also possible to create custom tokenizers for FTS5. The API for doing so is described here.

4.3.1. Unicode61 Tokenizer

 The unicode tokenizer classifies all unicode characters as either 
"separator" or "token" characters. By default all space and punctuation
characters, as defined by Unicode 6.1, are considered separators, and all 
other characters as token characters. More specifically, all unicode 
characters assigned to a 

general category beginning with "L" or "N" (letters and numbers,
specifically) or to category "Co" ("other, private use") are considered tokens.
All other characters are separators.
 
Each contiguous run of one or more token characters is considered to be a
token. The tokenizer is case-insensitive according to the rules defined by
Unicode 6.1.

 By default, diacritics are removed from all Latin script characters. This
means, for example, that "A", "a", "&#192;", "&#224;", "&#194;" and "&#226;"
are all considered to be equivalent.

 Any arguments following "unicode61" in the token specification are treated
as a list of alternating option names and values. Unicode61 supports the
following options:


   Option  Usage
   remove_diacritics
  This option should be set to "0", "1" or "2". The default value is "1".
  If it is set to "1" or "2", then diacritics are removed from Latin script
  characters as described above. However, if it is set to "1", then diacritics
  are not removed in the fairly uncommon case where a single unicode codepoint
  is used to represent a character with more that one diacritic. For example,
  dia)critics are not removed from codepoint 0x1ED9 ("LATIN SMALL LETTER O WITH
  CIRCUMFLEX AND DOT BELOW"). This is technically a bug, but cannot be fixed
  without creating backwards compatibility problems. If this option is set to
  "2", then diacritics are correctly removed from all Latin characters.

   categories
  This option may be used to modify the set of Unicode general categories
  that are considered to correspond to token characters. The argument must
  consist of a space separated list of two-character general category
  abbreviations (e.g. "Lu" or "Nd"), or of the same with the second character
  replaced with an asterisk ("*"), interpreted as a glob pattern. The default
  value is "L* N* Co".

   tokenchars
   This option is used to specify additional unicode characters that 
  should be considered token characters, even if they are white-space or
  punctuation characters according to Unicode 6.1. All characters in the
  string that this option is set to are considered token characters.

   separators
   This option is used to specify additional unicode characters that 
  should be considered as separator characters, even if they are token
  characters according to Unicode 6.1. All characters in the string that 
  this option is set to are considered separators.


 For example:

-- Create an FTS5 table that does not remove diacritics from Latin
-- script characters, and that considers hyphens and underscore characters
-- to be part of tokens. 
CREATE VIRTUAL TABLE ft USING fts5(a, b, 
    tokenize = "unicode61 remove_diacritics 0 tokenchars '-_'"
);


 or:

-- Create an FTS5 table that, as well as the default token character classes,
-- considers characters in class "Mn" to be token characters.
CREATE VIRTUAL TABLE ft USING fts5(a, b, 
    tokenize = "unicode61 categories 'L* N* Co Mn'"
);


 The fts5 unicode61 tokenizer is byte-for-byte compatible with the fts3/4
unicode61 tokenizer.

4.3.2. Ascii Tokenizer

 The Ascii tokenizer is similar to the Unicode61 tokenizer, except that:


   All non-ASCII characters (those with codepoints greater than 127) are
  always considered token characters. If any non-ASCII characters are specified
  as part of the separators option, they are ignored.  

   Case-folding is only performed for ASCII characters. So while "A" and
  "a" are considered to be equivalent, "&#195;" and "&#227;" are distinct.

   The remove_diacritics option is not supported.


 For example:

-- Create an FTS5 table that uses the ascii tokenizer, but does not
-- consider numeric characters to be part of tokens.
CREATE VIRTUAL TABLE ft USING fts5(a, b, 
    tokenize = "ascii separators '0123456789'"
);


4.3.3. Porter Tokenizer

 The porter tokenizer is a wrapper tokenizer. It takes the output of some
other tokenizer and applies the 
porter stemming algorithm
to each token before it returns it to FTS5. This allows search terms like
"correction" to match similar words such as "corrected" or "correcting". The
porter stemmer algorithm is designed for use with English language terms 
only - using it with other languages may or may not improve search utility.

 By default, the porter tokenizer operates as a wrapper around the default
tokenizer (unicode61). Or, if one or more extra arguments are added to the
"tokenize" option following "porter", they are treated as a specification for
the underlying tokenizer that the porter stemmer uses. For example:

-- Two ways to create an FTS5 table that uses the porter tokenizer to
-- stem the output of the default tokenizer (unicode61). 
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = porter); 
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'porter unicode61');

-- A porter tokenizer used to stem the output of the unicode61 tokenizer,
-- with diacritics removed before stemming.
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'porter unicode61 remove_diacritics 1');




4.3.4. The Experimental Trigram Tokenizer


The experimental trigram tokenizer extends FTS5 to support substring
matching in general, instead of the usual token matching. When using the
trigram *tokenizer, a query or phrase token may match any sequence of characters
within a row, not just a complete token. For example:

CREATE VIRTUAL TABLE tri USING fts5(a, tokenize="trigram");
INSERT INTO tri VALUES('abcdefghij KLMNOPQRST uvwxyz');

-- The following queries all match the single row in the table
SELECT * FROM tri('cdefg');
SELECT * FROM tri('cdefg AND pqr');
SELECT * FROM tri('"hij klm" NOT stuv');



The trigram tokenizer supports a single option - "case_sensitive". With the default 
value, 0, matching is case-insensitive. If this value is set to 1, then all matches
are case-sensitive.

-- A case-sensitive trigram index
CREATE VIRTUAL TABLE tri USING fts5(a, tokenize="trigram case_sensitive 1");



FTS5 tables that use the trigram tokenizer also support indexed GLOB and LIKE
pattern matching. For example:

SELECT * FROM tri WHERE a LIKE '%cdefg%';
SELECT * FROM tri WHERE a GLOB '*ij klm*xyz';



If an FTS5 trigram tokenizer is created with the case_sensitive option set to 1,
it may only index GLOB queries, not LIKE.


Notes:


   Substrings consisting of fewer than 3 unicode characters do not match any
       rows when used with a full-text query. If a LIKE or GLOB pattern does not
       contain at least one sequence of non-wildcard unicode characters, FTS5
       falls back to a linear scan of the entire table.

   If the FTS5 table is created with the detail=none or detail=column option
       specified, full-text queries may not contain any tokens longer than 3
       unicode characters. LIKE and GLOB pattern matching may be slightly slower,
       but still works. If the index is to be used only for LIKE and/or GLOB
       pattern matching, these options are worth experimenting with to reduce
       the index size.



4.4. External Content and Contentless Tables


Normally, when a row is inserted into an FTS5 table, as well as the various
full-text index entries and other data a copy of the row is stored in a private
table managed by the FTS5 module. When column values are requested from the
FTS5 table by the user or by an auxiliary function implementation, they are
read from this private table. The "content" option may be used to create an
FTS5 table that stores only FTS full-text index entries. Because the column
values themselves are usually much larger than the associated full-text index
entries, this can save significant database space.


There are two ways to use the "content" option:

   By setting it to an empty string to create a contentless FTS5 table. In
       this case FTS5 assumes that the original column values are unavailable
       to it when processing queries. Full-text queries and some auxiliary
       functions can still be used, but no column values apart from the rowid
       may be read from the table.

   By setting it to the name of a database object (table, virtual table or
       view) that may be queried by FTS5 at any time to retrieve the column
       values. This is known as an "external content" table. In this case all
       FTS5 functionality may be used, but it is the responsibility of the user
       to ensure that the contents of the full-text index are consistent with
       the named database object. If they are not, query results may be
       unpredictable.  



4.4.1. Contentless Tables

 A contentless FTS5 table is created by setting the "content" option to
an empty string. For example:

CREATE VIRTUAL TABLE f1 USING fts5(a, b, c, content='');


 Contentless FTS5 tables do not support UPDATE or DELETE statements, or
INSERT statements that do not supply a non-NULL value for the rowid field.
Contentless tables do not support REPLACE conflict handling. REPLACE 
and INSERT OR REPLACE statements are treated as regular INSERT statements.
Rows may be deleted from a contentless table using an FTS5 delete command.

 Attempting to read any column value except the rowid from a contentless
FTS5 table returns an SQL NULL value.


4.4.2. External Content Tables

 An external content FTS5 table is created by setting the content 
option to the name of a table, virtual table+ or view (hereafter the "content
table") within the same database. Whenever column values are required by
FTS5, it queries the content table as follows, with the rowid of the row
for which values are required bound to the SQL variable:

SELECT &lt;content_rowid&gt;, &lt;cols&gt; FROM &lt;content&gt; WHERE &lt;content_rowid&gt; = ?;


 In the above, &lt;content&gt; is replaced by the name of the content table.
By default, &lt;content_rowid&gt; is replaced by the literal text "rowid". Or,
if the "content_rowid" option is set within the CREATE VIRTUAL TABLE statement,
by the value of that option. &lt;cols&gt; is replaced by a comma-separated list
of the FTS5 table column names. For example:

-- If the database schema is: 
CREATE TABLE tbl (a, b, c, d INTEGER PRIMARY KEY);
CREATE VIRTUAL TABLE fts USING fts5(a, c, content=tbl, content_rowid=d);

-- Fts5 may issue queries such as:
SELECT d, a, c FROM tbl WHERE d = ?;


 The content table may also be queried as follows:

SELECT &lt;content_rowid&gt;, &lt;cols&gt; FROM &lt;content&gt; ORDER BY &lt;content_rowid&gt; ASC;
SELECT &lt;content_rowid&gt;, &lt;cols&gt; FROM &lt;content&gt; ORDER BY &lt;content_rowid&gt; DESC;


 It is still the responsibility of the user to ensure that the contents of
an external content FTS5 table are kept up to date with the content table. 
One way to do this is with triggers. For example:

-- Create a table. And an external content fts5 table to index it.
CREATE TABLE tbl(a INTEGER PRIMARY KEY, b, c);
CREATE VIRTUAL TABLE fts_idx USING fts5(b, c, content='tbl', content_rowid='a');

-- Triggers to keep the FTS index up to date.
CREATE TRIGGER tbl_ai AFTER INSERT ON tbl BEGIN
  INSERT INTO fts_idx(rowid, b, c) VALUES (new.a, new.b, new.c);
END;
CREATE TRIGGER tbl_ad AFTER DELETE ON tbl BEGIN
  INSERT INTO fts_idx(fts_idx, rowid, b, c) VALUES('delete', old.a, old.b, old.c);
END;
CREATE TRIGGER tbl_au AFTER UPDATE ON tbl BEGIN
  INSERT INTO fts_idx(fts_idx, rowid, b, c) VALUES('delete', old.a, old.b, old.c);
  INSERT INTO fts_idx(rowid, b, c) VALUES (new.a, new.b, new.c);
END;


 Like contentless tables, external content tables do not support REPLACE
conflict handling. Any operations that specify REPLACE conflict handling are
handled using ABORT.


4.5. The Columnsize Option

Normally, FTS5 maintains a special backing table within the database that
stores the size of each column value in tokens inserted into the main FTS5
table in a separate table. This backing table is used by the
xColumnSize API function, which is in turn used by
the built-in bm25 ranking function (and is likely to be useful 
to other ranking functions as well).

In order to save space, this backing table may be omitted by setting the
columnsize option to zero. For example:

-- A table without the xColumnSize() values stored on disk:
CREATE VIRTUAL TABLE ft USING fts5(a, b, c, columnsize=0);

-- Three equivalent ways of creating a table that does store the
-- xColumnSize() values on disk:
CREATE VIRTUAL TABLE ft USING fts5(a, b, c);
CREATE VIRTUAL TABLE ft USING fts5(a, b, c, columnsize=1);
CREATE VIRTUAL TABLE ft USING fts5(a, b, columnsize='1', c);


 It is an error to set the columnsize option to any value other than
0 or 1.

 If an FTS5 table is configured with columnsize=0 but is not a
contentless table, the xColumnSize API function
still works, but runs much more slowly. In this case, instead of reading
the value to return directly from the database, it reads the text value
itself and count the tokens within it on demand.

Or, if the table is also a contentless table,
then the following apply:


   The xColumnSize API always returns -1. There is no way to determine 
       the number of tokens in a value stored within a contentless FTS5 table
       configured with columnsize=0.

   Each inserted row must be accompanied by an explicitly specified rowid
       value. If a contentless table is configured with columnsize=0,
       attempting to insert a NULL value into the rowid is an SQLITE_MISMATCH
       error.

   All queries on the table must be full-text queries. In othe,r words,
       they must use the MATCH or = operator with the table-name column as the
       left-hand operand, or else use the table-valued function syntax. Any
       query that is not a full-text query results in an error.


 The name of the table in which the xColumnSize values are stored
(unless columnsize=0 is specified) is "&lt;name&gt;_docsize", where 
&lt;name&gt; is the name of the FTS5 table itself. The 
sqlite3_analyzer
tool may be used on an existing database in order to determine how much
space might be saved by recreating an FTS5 table using columnsize=0.


4.6. The Detail Option

 For each term in a document, the FTS index maintained by FTS5 
stores the rowid of the document, the column number of the column that contains
the term and the offset of the term within the column value. The "detail"
option may be used to omit some of this information. This reduces the space
that the index consumes within the database file, but also reduces the
capability and efficiency of the system.

 The detail option may be set to "full" (the default value), "column" or
"none". For example:

-- The following two lines are equivalent (because the default value
-- of "detail" is "full". 
CREATE VIRTUAL TABLE ft1 USING fts5(a, b, c);
CREATE VIRTUAL TABLE ft1 USING fts5(a, b, c, detail=full);

CREATE VIRTUAL TABLE ft2 USING fts5(a, b, c, detail=column);
CREATE VIRTUAL TABLE ft3 USING fts5(a, b, c, detail=none);


If the detail option is set to column, then for each term the FTS
index records the rowid and column number only, omitting the term offset
information. This results in the following restrictions:


   NEAR queries are not available.
   Phrase queries are not available.
   Assuming the table is not also a 
  contentless table, the 
  xInstCount, xInst, 
  xPhraseFirst and xPhraseNext
  are slower than usual. This is because instead of reading the required data
  directly from the FTS index they have to load and tokenize the document text 
  on demand.
   If the table is also a contentless table, the xInstCount, xInst, 
  xPhraseFirst and xPhraseNext APIs behave as if the current row contains no
  phrase matches at all (i.e. xInstCount() returns 0).

  
If the detail option is set to none, then for each term the FTS
index records just the rowid is stored. Both column and offset information
are omitted. As well as the restrictions itemized above for detail=column
mode, this imposes the following extra limitations:


   Column filter queries are not available.
   Assuming the table is not also a contentless table, the 
  xPhraseFirstColumn and 
  xPhraseNextColumn are slower than usual. 

   If the table is also a contentless table, the xPhraseFirstColumn and
  xPhraseNextColumn APIs behave as if the current row contains no phrase
  matches at all (i.e. xPhraseFirstColumn() sets the iterator to EOF).


 In one test that indexed a large set of emails (1636 MiB on disk), the FTS
index was 743 MiB on disk with detail=full, 340 MiB with detail=column and 134
MiB with detail=none.


5.  Auxiliary Functions 

 Auxiliary functions are similar to SQL scalar functions,
except that they may only be used within full-text queries (those that use
the MATCH operator) on an FTS5 table. Their results are calculated based not
only on the arguments passed to them, but also on the current match and 
matched row. For example, an auxiliary function may return a numeric value
indicating the accuracy of the match (see the bm25() function), 
or a fragment of text from the matched row that contains one or more 
instances of the search terms (see the snippet() function).

To invoke an auxiliary function, the name of the FTS5 table should be
specified as the first argument. Other arguments may follow the first,
depending on the specific auxiliary function being invoked. For example, to
invoke the "highlight" function:

SELECT highlight(email, 2, '&lt;b&gt;', '&lt;/b&gt;') FROM email WHERE email MATCH 'fts5'


The built-in auxiliary functions provided as part of FTS5 are described in
the following section. Applications may also implement 
custom- auxiliary functions in C.

5.1. Built-in Auxiliary Functions

 FTS5 provides three built-in auxiliary functions:


   The bm25() auxiliary function returns a real value
       reflecting the accuracy of the current match. Better matches are
       assigned numerically lower values.

   The highlight() auxiliary function returns a copy
       of the text from one of the columns of the current match with each
       instance of a queried term within the result surrounded by specified
       markup (for example "&lt;b&gt;" and "&lt;/b&gt;").

   The snippet() auxiliary function selects a short
       fragment of text from one of the columns of the matched row and returns
       it with each instance of a queried term surrounded by markup in
       the same manner as the highlight() function. The fragment of text is
       selected so as to maximize the number of queried terms it contains.



5.1.1. The bm25() function

 The built-in auxiliary function bm25() returns a real value indicating
how well the current row matches the full-text query. The better the match,
the numerically smaller the value returned. A query such as the following may
be used to return matches in order from best to worst match:

SELECT * FROM fts WHERE fts MATCH ? ORDER BY bm25(fts)


 In order to calculate a documents score, the full-text query is separated
    into its component phrases. The bm25 score for document D and 
    query Q is then calculated as follows:

 

 In the above, nPhrase is the number of phrases in the query.
    |D| is the number of tokens in the current document, and
    avgdl is the average number of tokens in all documents within the
    FTS5 table.  k1 and b are both constants,
    hard-coded at 1.2 and 0.75 respectively.

 The "-1" term at the start of the formula is not found in most
implementations of the BM25 algorithm. Without it, a better match is assigned
a numerically higher BM25 score. Since the default sorting order is
"ascending", this means that appending "ORDER BY bm25(fts)" to a query would
cause results to be returned in order from worst to best. The "DESC" keyword
would be required in order to return the best matches first. In order to
avoid this pitfall, the FTS5 implementation of BM25 multiplies the result
by -1 before returning it, ensuring that better matches are assigned
numerically lower scores.

 IDF(qi) is the inverse-document-frequency of query 
    phrase i. It is calculated as follows, where N is the total
    number of rows in the FTS5 table and n(qi) is the total
    number of rows that contain at least one instance of phrase i:

 

 Finally, f(qi,D) is the phrase frequency of phrase 
i. By default, this is simply the number of occurrences of the phrase
within the current row. However, by passing extra real value arguments to 
the bm25() SQL function, each column of the table may be assigned a different
weight and the phrase frequency calculated as follows:

 

 where wc is the weight assigned to column c and
n(qi,c) is the number of occurrences of phrase i in
column c of the current row. The first argument passed to bm25()
following the table name is the weight assigned to the leftmost column of
the FTS5 table. The second is the weight assigned to the second leftmost
column, and so on. If there are not enough arguments for all table columns,
remaining columns are assigned a weight of 1.0. If there are too many 
trailing arguments, the extras are ignored. For example:

-- Assuming the following schema:
CREATE VIRTUAL TABLE email USING fts5(sender, title, body);

-- Return results in bm25 order, with each phrase hit in the "sender"
-- column considered the equal of 10 hits in the "body" column, and
-- each hit in the "title" column considered as valuable as 5 hits in
-- the "body" column.
SELECT * FROM email WHERE email MATCH ? ORDER BY bm25(email, 10.0, 5.0);


Refer to wikipedia for 
more information regarding
BM25 and its variants.


5.1.2. The highlight() function

 The highlight() function returns a copy of the text from a specified 
column of the current row with extra markup text inser.ted to mark the start 
and end of phrase matches. 

The highlight() must be invoked with exactly three arguments following 
the table name. To be interpreted as follows:


   An integer indicating the index of the FTS table column to read the 
       text from. Columns are numbered from left to right starting at zero.

   The text to insert before each phrase match.

   The text to insert after each phrase match.


For example:

-- Return a copy of the text from the leftmost column of the current
-- row, with phrase matches marked using html "b" tags.
SELECT highlight(fts, 0, '&lt;b&gt;', '&lt;/b&gt;') FROM fts WHERE fts MATCH ?


In cases where two or more phrase instances overlap (share one or more
tokens in common), a single open and close marker is inserted for each set
of overlapping phrases. For example:

-- Assuming this:
CREATE VIRTUAL TABLE ft USING fts5(a);
INSERT INTO ft VALUES('a b c x c d e');
INSERT INTO ft VALUES('a b c c d e');
INSERT INTO ft VALUES('a b c d e');

-- The following SELECT statement returns these three rows:
--   '&#91;a b c&#93; x &#91;c d e&#93;'
--   '&#91;a b c&#93; &#91;c d e&#93;'
--   '&#91;a b c d e&#93;'
SELECT highlight(ft, 0, '&#91;', '&#93;') FROM ft WHERE ft MATCH 'a+b+c AND c+d+e';



5.1.3. The snippet() function

The snippet() function is similar to highlight(), except that instead of
returning entire column values, it automatically selects and extracts a
short fragment of document text to process and return. The snippet() function
must be passed five parameters following the table name argument:


   An integer indicating the index of the FTS table column to select
       the returned text from. Columns are numbered from left to right 
       starting at zero. A negative value indicates that the column should
       be automatically selected.

   The text to insert before each phrase match within the returned text.

   The text to insert after each phrase match within the returned text.

   The text to add to the start or end of the selected text to indicate
       that the returned text does not occur at the start or end of its column,
       respectively.

   The maximum number of tokens in the returned text. This must be greater
       than zero and equal to or less than 64. 



5.2. Sorting by Auxiliary Function Results

 All FTS5 tables feature a special hidden column named "rank". If the
current query is not a full-text query (i.e. if it does not include a MATCH
operator), the value of the "rank" column is always NULL. Otherwise, in a
full-text query, column rank contains by default the same value as would be
returned by executing the bm25() auxiliary function with no trailing 
arguments.

 The difference between reading from the rank column and using the bm25()
function directly within the query is only significant when sorting by the
returned value. In this case, using "rank" is faster than using bm25().

-- The following queries are logically equivalent. But the second may
-- be faster, particularly if the caller abandons the query before
-- all rows have been returned (or if the queries were modified to 
-- include LIMIT clauses).
SELECT * FROM fts WHERE fts MATCH ? ORDER BY bm25(fts);
SELECT * FROM fts WHERE fts MATCH ? ORDER BY rank;


 Instead of using bm25() with no trailing arguments, the specific auxiliary
function mapped to the rank column may be configured either on a per-query
basis, or by setting a different persistent default for the FTS table.

 In order to change the mapping of the rank column for a single query, 
a term similar to either of the following is added to the WHERE clause of a 
query:

rank MATCH 'auxiliary-function-name(arg1, arg2, ...)'
rank = 'auxiliary-function-name(arg1, arg2, ...)'


 The right-hand-side of the MATCH or = operator must be a constant
expression that evaluates to a string consisting of the auxiliary function to
invoke, followed by zero or more comma separated arguments within parenthesis.
Arguments must be SQL literals. For example:

-- The following queries are logically equivalent. But the second may
-- be faster/. See above. 
SELECT * FROM fts WHERE fts MATCH ? ORDER BY bm25(fts, 10.0, 5.0);
SELECT * FROM fts WHERE fts MATCH ? AND rank MATCH 'bm25(10.0, 5.0)' ORDER BY rank;


 The table-valued function syntax may also be used to specify an alternative
ranking function. In this case the text describing the ranking function should
be specified as the second table-valued function argument. The following three
queries are equivalent:

SELECT * FROM fts WHERE fts MATCH ? AND rank MATCH 'bm25(10.0, 5.0)' ORDER BY rank;
SELECT * FROM fts WHERE fts = ? AND rank = 'bm25(10.0, 5.0)' ORDER BY rank;
SELECT * FROM fts WHERE fts(?, 'bm25(10.0, 5.0)') ORDER BY rank;


 The default mapping of the rank column for a table may be modified 
using the FTS5 rank configuration option.

6. Special INSERT Commands


6.1. The 'automerge' Configuration Option


  Instead of using a single data structure on disk to store the full-text
  index, FTS5 uses a series of b-trees. Each time a new transaction is
  committed, a new b-tree containing the contents of the committed transaction
  is written into the database file. When the full-text index is queried, each
  b-tree must be queried individually and the results merged before being
  returned to the user.


  In order to prevent the number of b-trees in the database from becoming too
  large (slowing down queries), smaller b-trees are periodically merged into
  single larger b-trees containing the same data. By default, this happens
  automatically within INSERT, UPDATE or DELETE statements that modify the
  full-text index. The 'automerge' parameter determines how many smaller
  b-trees are merged together at a time. Setting it to a small value can
  speed up queries (as they have to query and merge the results from fewer 
  b-trees), but can also slow down writing to the database (as each INSERT,
  UPDATE or DELETE statement has to do more work as part of the automatic
  merging process).


  Each of the b-trees that make up the full-text index is assigned to a "level"
  based on its size. Level-0 b-trees are the smallest, as they contain the
  contents of a single transaction. Higher level b-trees are the result of
  merging two or more level-0 b-trees together and so they are larger. FTS5
  begins to merge b-trees together once there exist M or more b-trees 
  with the same level, where M is the value of the 'automerge' 
  parameter.


  The maximum allowed value for the 'automerge' parameter is 16. The default
  value is 4. Setting the 'automerge' parameter to 0 disables the automatic 
  incremental merging of b-trees altogether.

INSERT INTO ft(ft, rank) VALUES('automerge', 8);


6.2. The 'crisismerge' Configuration Option

The 'crisismerge' option is similar to 'automerge', in that it determines
how and how often the component b-trees that make up the full-text index are
merged together. Once there exist C or more b-trees on a single level
within the full-text index, where C is the value of the 'crisismerge'
option, all b-trees on the level are immediately merged into a single b-tree.

The difference between this option and the 'automerge' option is that when
the 'automerge' limit is reached FTS5 only begins to merge the b-trees
together. Most of the work is performed as part of subsequent INSERT, 
UPDATE or DELETE operations. Whereas when the 'crisismerge' limit is reached,
the offending b-trees are all merged immediately. This means that an INSERT,
UPDATE or DELETE that triggers a crisis-merge may take a long time to 
complete.

The default 'crisismerge' value is 16. There is no maximum limit. Attempting
to set the 'crisismerge' parameter to a value of 0 or 1 is equivalent to
setting it to the default value (16). It is an error to attempt to set the
'crisismerge' option to a negative value.

INSERT INTO ft(ft, rank) VALUES('crisismerge', 16);



6.3. The 'delete' Command

 This command is only available with external content and contentless tables. It
is used to delete the index entries associated with a single row from the
full-text index. This command and the delete-all
command are the only 0ways to remove entries from the full-text index of a
contentless table.

 In order to use this command to delete a row, the text value 'delete' 
must be inserted into the special column with the same name as the table.
The rowid of the row to delete is inserted into the rowid column. The
values inserted into the other columns must match the values currently
stored in the table. For example:

-- Insert a row with rowid=14 into the fts5 table.
INSERT INTO ft(rowid, a, b, c) VALUES(14, $a, $b, $c);

-- Remove the same row from the fts5 table.
INSERT INTO ft(ft, rowid, a, b, c) VALUES('delete', 14, $a, $b, $c);


 If the values "inserted" into the text columns as part of a 'delete'
command are not the same as those currently stored within the table, the
results may be unpredictable.

 The reason for this is easy to understand: When a document is inserted
into the FTS5 table, an entry is added to the full-text index to record the
position of each token within the new document. When a document is removed,
the original data is required in order to determine the set of entries that
need to be removed from the full-text index. So if the data supplied to FTS5
when a row is deleted using this command is different from that used to
determine the set of token instances when it was inserted, some full-text 
index entries may not be correctly deleted, or FTS5 may try to remove index 
entries that do not exist. This can leave the full-text index in an
unpredictable state, making future query results unreliable.


6.4. The 'delete-all' Command

 This command is only available with external content and contentless tables. It
deletes all entries from the full-text index.

INSERT INTO ft(ft) VALUES('delete-all');


6.5. The 'integrity-check' Command

 This command is used to verify that the full-text index is internally
consistent, and, optionally, that it is consistent with any 
external content table.

The integrity-check command is invoked by inserting the text value
'integrity-check' into the special column with the same name as the FTS5
table. If a value is supplied for the "rank" column, it must be either
0 or 1. For example:

INSERT INTO ft(ft) VALUES('integrity-check');
INSERT INTO ft(ft, rank) VALUES('integrity-check', 0);
INSERT INTO ft(ft, rank) VALUES('integrity-check', 1);


The three forms above are equivalent for all FTS tables that are
not external content tables. They check that the index data structures are 
not corrupt, and, if the FTS table is not contentless, that the contents of
the index match the contents of the table itself.

For an external content table, the contents of the index are only
compared to the contents of the external content table if the value 
specified for the rank column is 1.

In all cases, if any discrepancies are found, the command fails 
with an SQLITE_CORRUPT_VTAB error.


6.6. The 'merge' Command

INSERT INTO ft(ft, rank) VALUES('merge', 500);


 This command merges b-tree structures together until roughly N pages
of merged data have been written to the database, where N is the absolute
value of the parameter specified as part of the 'merge' command. The size of
each page is as configured by the FTS5 pgsz option.

 If the parameter is a positive value, B-tree structures are only eligible
for merging if one of the following is true:


   There are U or more such b-trees on a
       single level (see the documentation for the FTS5 automerge option
       for an explanation of b-tree levels), where U is the value assigned
       to the FTS5 usermerge option option.
   A merge has already been started (perhaps by a 'merge' command that
       specified a negative parameter).


 It is possible to tell whether or not the 'merge' command found any 
b-trees to merge together by checking the value returned by the
sqlite3_total_changes() API before and after the command is executed. If
the difference between the two values is 2 or greater, then work was performed.
If the difference is less than 2, then the 'merge' command was a no-op. In this
case there is no reason to execute the same 'merge' comma1nd again, at least
until after the FTS table is next updated.

 If the parameter is negative, and there are B-tree structures on more than
one level within the FTS index, all B-tree structures are assigned to the same
level before the merge operation is commenced. Additionally, if the parameter
is negative, the value of the usermerge configuration option is not 
respected - as few as two b-trees from the same level may be merged together.

 The above means that executing the 'merge' command with a negative
parameter until the before and after difference in the return value of
sqlite3_total_changes() is less than two optimizes the FTS index in the
same way as the FTS5 optimize command. However, if a new b-tree is added
to the FTS index while this process is ongoing, FTS5 will move the new 
b-tree to the same level as the existing b-trees and restart the merge. To
avoid this, only the first call to 'merge' should specify a negative parameter.
Each subsequent call to 'merge' should specify a positive value so that the
merge started by the first call is run to completion even if new b-trees are
added to the FTS index.


6.7. The 'optimize' Command

This command merges all individual b-trees that currently make up the
full-text index into a single large b-tree structure. This ensures that the
full-text index consumes the minimum space within the database and is in the
fastest form to query.

Refer to the documentation for the FTS5 automerge option for more details
regarding the relationship between the full-text index and its component
b-trees.

INSERT INTO ft(ft) VALUES('optimize');


Because it reorganizes the entire FTS index, the optimize command can 
take a long time to run. The FTS5 merge command can be used to divide
the work of optimizing the FTS index into multiple steps. To do this:


   Invoke the 'merge' command once with the parameter set to -N, then
   Invoke the 'merge' command zero or more times with the parameter set to N.


where N is the number of pages of data to merge within each invocation of
the merge command. The application should stop invoking merge when the
difference in the value returned by the sqlite3_total_changes() function before
and after the merge command drops to below two. The merge commands may be
issued as part of the same or separate transactions, and by the same or
different database clients. Refer to the documentation for the 
merge command for further details.


6.8. The 'pgsz' Configuration Option

 This command is used to set the persistent "pgsz" option.

 The full-text index maintained by FTS5 is stored as a series of fixed-size
blobs in a database table. It is not strictly necessary for all blobs that make
up a full-text index to be the same size. The pgsz option determines the size
of all blobs created by subsequent index writers. The default value is 1000.

INSERT INTO ft(ft, rank) VALUES('pgsz', 4072);



6.9. The 'rank' Configuration Option

 This command is used to set the persistent "rank" option.

 The rank option is used to change the default auxiliary function mapping
for the rank column. The option should be set to a text value in the same
format as described for "rank MATCH ?" terms 
above. For example:

INSERT INTO ft(ft, rank) VALUES('rank', 'bm25(10.0, 5.0)');



6.10. The 'rebuild' Command

 This command first deletes the entire full-text index, then rebuilds it
based on the contents of the table or content
table.  It is not available with contentless
tables.

INSERT INTO ft(ft) VALUES('rebuild');



6.11. The 'usermerge' Configuration Option

 This command is used to set the persistent "usermerge" option.

 The usermerge option is similar to the automerge and crisismerge options.
It is the minimum number of b-tree segments that will be merged together by
a 'merge' command with a positive parameter. For example:

INSERT INTO ft(ft, rank) VALUES('usermerge', 4);


 The default value of the usermerge option is 4. The minimum allowed value
is 2, and the maximum 16.


7. Extending FTS5

FTS5 features APIs allowing it to be extended by:


   Adding new auxiliary fu2nctions implemented in C, and
   Adding new tokenizers, also implemented in C.


 The built-in tokenizers and auxiliary functions described in this
document are all implemented using the publicly available API described
below.

 Before a new auxiliary function or tokenizer implementation may be 
registered with FTS5, an application must obtain a pointer to the "fts5_api"
structure. There is one fts5_api structure for each database connection with
which the FTS5 extension is registered. To obtain the pointer, the application
invokes the SQL user-defined function fts5() with a single argument.  That
argument must be set to a pointer to a pointer to an fts5_api object
using the sqlite3_bind_pointer() interface.
The following example code demonstrates the technique:

/*
** Return a pointer to the fts5_api pointer for database connection db.
** If an error occurs, return NULL and leave an error in the database 
** handle (accessible using sqlite3_errcode()/errmsg()).
*/
fts5_api *fts5_api_from_db(sqlite3 *db){
  fts5_api *pRet = 0;
  sqlite3_stmt *pStmt = 0;

  if( SQLITE_OK==sqlite3_prepare(db, "SELECT fts5(?1)", -1, &pStmt, 0) ){
    sqlite3_bin_pointer(pStmt, (void*)&pRet, "fts5_api_ptr", NULL);
    sqlite3_step(pStmt);
  }
  sqlite3_finalize(pStmt);
  return pRet;
}


Backwards Compatibility Warning:
Prior to SQLite version 3.20.0 (2017-08-01), the fts5() worked slightly
differently.  Older applications that extend FTS5 must be revised to use 
the new technique shown above.

 The fts5_api structure is defined as follows. It exposes three methods, 
one each for registering new auxiliary functions and tokenizers, and one for
retrieving existing tokenizer. The latter is intended to facilitate the
implementation of "tokenizer wrappers" similar to the built-in
porter tokenizer.

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*)
  );
};


 To invoke a method of the fts5_api object, the fts5_api pointer itself
should be passed as the methods first argument followed by the other, method
specific, arguments. For example:

rc = pFts5Api->xCreateTokenizer(pFts5Api, ... other args ...);


 The fts5_api structure methods are described individually in the following
sections.


7.1. Custom Tokenizers

 To create a custom tokenizer, an application must implement three
functions: a tokenizer constructor (xCreate), a destructor (xDelete) and a
function to do the actual tokenization (xTokenize). The type of each
function is as for the member variables of the fts5_tokenizer struct:

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    0x30002
#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 */


 The implementation is registered with the FTS5 module by calling the
xCreateTokenizer() method of the fts5_api object. If there is already a
tokenizer with the same name, it is replaced.  If a non-NULL xDestroy parameter
is passed to xCreateTokenizer(), it is invoked with a copy of the pContext
pointer passed as the only argument when the database handle is closed or when
the tokenizer is replaced.

 If successful, xCreateTokenizer() returns SQLITE_OK. Otherwise, it
returns an SQLite error code. In this case the xDestroy function is not 
invoked.

 When an FTS5 table uses the custom tokenizer, the FTS5 core calls xCreate()
once to create a tokenizer, then xTokenize() zero or more times to tokenize
strings, then xDelete() to free any resources allocated by xCreate(). More
specifically:


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 text4 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.

7.1.1. 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:

    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.

        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.

        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     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.




7.2. Custom Auxiliary Functions

 Implementing a custom auxiliary function is similar to implementing a
scalar SQL function. The implementation
should be a C function of type fts5_extension_function, defined as follows:

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 */
);


 The implementation is registered with the FTS5 module by calling the
xCreateFunction() method of the fts5_api object. If there is already an
auxiliary function with the same name, it is replaced by the new function.
If a non-NULL xDestroy parameter is passed to xCreateFunction(), it is invoked
with a copy of the pContext pointer passed as the only argument when the
database handle is closed or when the registered auxiliary function is
replaced.

 If successful, xCreateFunction() returns SQLITE_OK. Otherwise, it
returns an SQLite error code. In this case the xDestroy function is not 
invoked.

 The final three arguments passed to the auxiliary function callback are
similar to the three arguments passed to the implementation of a scalar SQL
function. All arguments except the first passed to the auxiliary function are
available to the implementation in the apVal&#91;&#93; array. The
implementation should return a result or error via the content handle pCtx.

 The first argument passed to an auxiliary function callback is a pointer
to a structure containing methods that may be invoked in order to obtain
information regarding the current query or row. The second argument is an
opaque handle that should be passed as the first argument to any such method 
invocation. For example, the following auxiliary fun6ction definition returns
the total number of tokens in all columns of the current row:

/*
** Implementation of an auxiliary function that returns the number
** of tokens in the current row (including all columns).
*/
static void column_size_imp(
  const Fts5ExtensionApi *pApi,
  Fts5Context *pFts,
  sqlite3_context *pCtx,
  int nVal,
  sqlite3_value **apVal
){
  int rc;
  int nToken;
  rc = pApi->xColumnSize(pFts, -1, &nToken);
  if( rc==SQLITE_OK ){
    sqlite3_result_int(pCtx, nToken);
  }else{
    sqlite3_result_error_code(pCtx, rc);
  }
}


The following section describes the API offered to auxiliary function
implementations in detail. Further examples may be found in the "fts5_aux.c"
file of the source code.


7.2.1. 
  Custom Auxiliary Functions API Reference


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);
};




void *(*xUserData)(Fts5Context*)

Return a copy of the context pointer the extension function was 
   registered with.



int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *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.



int (*xColumnCount)(Fts5Context*)

Return the number of columns in the table.



int (*xColumnSize)(Fts5Context*, int iCol, int *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.



int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn)

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 is7 returned. Otherwise,
   if an error occurs, an SQLite error code is returned and the final values
   of (*pz) and (*pn) are undefined.



int (*xPhraseCount)(Fts5Context*)

Returns the number of phrases in the current query expression.



int (*xPhraseSize)(Fts5Context*, int iPhrase)

Returns the number of tokens in phrase iPhrase of the query. Phrases
   are numbered starting from zero.



int (*xInstCount)(Fts5Context*, int *pnInst)

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.



int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff)

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.



sqlite3_int64 (*xRowid)(Fts5Context*)

Returns the rowid of the current row.



int (*xTokenize)(Fts5Context*, 
    const char *pText, int nText, 
    void *pCtx,                   
    int (*xToken)(void*, int, const char*, int, int, int)       
)

Tokenize text using the tokenizer belonging to the FTS5 table.



int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData,
    int(*)(const Fts5ExtensionApi*,Fts5Context*,void*)
)

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.



int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*))

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
  8 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.



void *(*xGetAuxdata)(Fts5Context*, int 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.



int (*xRowCount)(Fts5Context*, sqlite3_int64 *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;



int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*)

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).



void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff)

See xPhraseFirst above.



int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*)

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.



void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol)

See xPhraseFirstColumn above.






8. The fts5vocab Virtual Table Module

 The fts5vocab virtual table module allows users to extract information from
an FTS5 full-text index directly. The fts5vocab module is a part of FTS5 - it 
is available whene9ver FTS5 is.

 Each fts5vocab table is associated with a single FTS5 table. An fts5vocab
table is usually created by specifying two arguments in place of column names
in the CREATE VIRTUAL TABLE statement - the name of the associated FTS5 table
and the type of fts5vocab table. Currently there are three types of fts5vocab
table; "row", "col" and "instance". Unless the fts5vocab table is created
within the "temp" database, it must be part of the same database as the
associated FTS5 table.

-- Create an fts5vocab "row" table to query the full-text index belonging
-- to FTS5 table "ft1".
CREATE VIRTUAL TABLE ft1_v USING fts5vocab('ft1', 'row');

-- Create an fts5vocab "col" table to query the full-text index belonging
-- to FTS5 table "ft2".
CREATE VIRTUAL TABLE ft2_v USING fts5vocab(ft2, col);

-- Create an fts5vocab "instance" table to query the full-text index
-- belonging to FTS5 table "ft3".
CREATE VIRTUAL TABLE ft3_v USING fts5vocab(ft3, instance);


 If an fts5vocab table is created in the temp database, it may be associated
with an FTS5 table in any attached database. In order to attach the fts5vocab
table to an FTS5 table located in a database other than "temp", the name of the
database is inserted before the FTS5 table name in the CREATE VIRTUAL TABLE 
arguments. For example:

-- Create an fts5vocab "row" table to query the full-text index belonging
-- to FTS5 table "ft1" in database "main".
CREATE VIRTUAL TABLE temp.ft1_v USING fts5vocab(main, 'ft1', 'row');

-- Create an fts5vocab "col" table to query the full-text index belonging
-- to FTS5 table "ft2" in attached database "aux".
CREATE VIRTUAL TABLE temp.ft2_v USING fts5vocab('aux', ft2, col);

-- Create an fts5vocab "instance" table to query the full-text index 
-- belonging to FTS5 table "ft3" in attached database "other".
CREATE VIRTUAL TABLE temp.ft2_v USING fts5vocab('aux', ft3, 'instance');


 Specifying three arguments when creating an fts5vocab table in any database
other than "temp" results in an error.

 An fts5vocab table of type "row" contains one row for each distinct term
in the associated FTS5 table. The table columns are as follows:


  ColumnContents
  term The term, as stored in the FTS5 index.
  doc  The number of rows that contain at least one instance of the term.
  cnt  The total number of instances of the term in the entire FTS5 table.


 An fts5vocab table of type "col" contains one row for each distinct term/column
combination in the associated FTS5 table. Table columns are as follows:


  ColumnContents
  term The term, as stored in the FTS5 index.
  col  The name of the FTS5 table column that contains the term.
  doc  The number of rows in the FTS5 table for which column $col
                   contains at least one instance of the term.
  cnt  The total number of instances of the term that appear in
                   column $col of the FTS5 table (considering all rows). 


 An fts5vocab table of type "instance" contains one row for each term
instance stored in the associated FTS index. Assuming the FTS5 table is
created with the 'detail' option set to 'full', table columns are as follows:


  ColumnContents
  term   The term, as stored in the FTS5 index.
  doc    The rowid of the document that contains the term instance.
  col    The name of the column that contains the term instance.
  offset The index of the term instance within its column. Terms 
                     are numbered in order of occurrence starting from 0.


 If the FTS5 table is created with the 'detail' option set to 'col', then
the offset column of an instance virtual table always contains NULL.
In this case there is one row in the table for each unique term/doc/col 
combination. Or, if the FTS5 table is created with 'detail' set to 'none',
then both offset and col always contain NULL values. For
detail=none FTS5 tables, there is one row in the fts5vocab table for each
unique term/doc combination.

Example:

-- Assuming a database created using:
CREATE VIRTUAL TABLE ft1 USING fts5(c1, c2);
INSERT INTO ft1 VALUES('apple banana cherry', 'banana banana cherry');
:INSERT INTO ft1 VALUES('cherry cherry cherry', 'date date date');

-- Then querying the following fts5vocab table (type "col") returns:
--
--    apple  | c1 | 1 | 1
--    banana | c1 | 1 | 1
--    banana | c2 | 1 | 2
--    cherry | c1 | 2 | 4
--    cherry | c2 | 1 | 1
--    date   | c3 | 1 | 3
--
CREATE VIRTUAL TABLE ft1_v_col USING fts5vocab(ft1, col);

-- Querying an fts5vocab table of type "row" returns:
--
--    apple  | 1 | 1
--    banana | 1 | 3
--    cherry | 2 | 5
--    date   | 1 | 3
--
CREATE VIRTUAL TABLE ft1_v_row USING fts5vocab(ft1, row);

-- And, for type "instance"
INSERT INTO ft1 VALUES('apple banana cherry', 'banana banana cherry');
INSERT INTO ft1 VALUES('cherry cherry cherry', 'date date date');
--
--    apple  | 1 | c1 | 0
--    banana | 1 | c1 | 1
--    banana | 1 | c2 | 0
--    banana | 1 | c2 | 1
--    cherry | 1 | c1 | 2
--    cherry | 1 | c2 | 2
--    cherry | 2 | c1 | 0
--    cherry | 2 | c1 | 1
--    cherry | 2 | c1 | 2
--    date   | 2 | c2 | 0
--    date   | 2 | c2 | 1
--    date   | 2 | c2 | 2
--
CREATE VIRTUAL TABLE ft1_v_instance USING fts5vocab(ft1, instance);




9. FTS5 Data Structures

This section describes at a high-level the way the FTS module stores its
index and content in the database. It is not necessary to read or understand
the material in this section in order to use FTS in an application. However, it
may be useful to application developers attempting to analyze and understand
FTS performance characteristics, or to developers contemplating enhancements to
the existing FTS feature set.


When an FTS5 virtual table is created in a database, between 3 and 5 real
tables are created in the database. These are known as "shadow tables", and
are used by the virtual table module to store persistent data. They should not
be accessed directly by the user. Many other virtual table modules, including
FTS3 and rtree, also create and use shadow tables.

FTS5 creates the following shadow tables. In each case the actual table name
is based on the name of the FTS5 virtual table (in the following, replace
% with the name of the virtual table to find the actual shadow table name).

-- This table contains most of the full-text index data. 
CREATE TABLE %_data(id INTEGER PRIMARY KEY, block BLOB);

-- This table contains the remainder of the full-text index data. 
-- It is almost always much smaller than the %_data table. 
CREATE TABLE %_idx(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;

-- Contains the values of persistent configuration parameters.
CREATE TABLE %_config(k PRIMARY KEY, v) WITHOUT ROWID;

-- Contains the size of each column of each row in the virtual table
-- in tokens. This shadow table is not present if the "columnsize"
-- option is set to 0.
CREATE TABLE %_docsize(id INTEGER PRIMARY KEY, sz BLOB);

-- Contains the actual data inserted into the FTS5 table. There
-- is one "cN" column for each indexed column in the FTS5 table.
-- This shadow table is not present for contentless or external 
-- content FTS5 tables. 
CREATE TABLE %_content(id INTEGER PRIMARY KEY, c0, c1...);


The following sections describe in more detail how these five tables are
used to store FTS5 data.

9.1. Varint Format

The sections below refer to 64-bit signed integers stored in "varint" form.
FTS5 uses the same varint format as used in various places by the SQLite core.

A varint is between 1 and 9 bytes in length. The varint consists of either
zero or more bytes which have the high-order bit set followed by a single byte
with the high-order bit clear, or nine bytes, whichever is shorter. The lower
seven bits of each of the first eight bytes and all 8 bits of the ninth byte
are used to reconstruct the 64-bit twos-complement integer. Varints are
big-endian: bits taken from the earlier byte of the varint are more significant
than bits taken from the later bytes.

9.2. The FTS Index (%_idx and %_data tables)

The FTS index is an ordered key-value store where the keys are document
terms or term prefixes and the associated values are "doclists". A doclist is a
packed array of varints that encod;es the position of each instance of the term
within the FTS5 table. The position of a single term instance is defined as the
combination of:


   The rowid of the FTS5 table row it appears in,
   The index of the column the term instance appears in (columns are
       numbered from left to right starting from zero), and
   The offset of the term within the column value (i.e. the number of 
       tokens that appear within the column value before this one).


The FTS index contains up to (nPrefix+1) entries for each token in the 
data set, where nPrefix is the number of defined 
prefix indexes.

Keys associated with the main FTS index (the one that is not a prefix
index) are prefixed with the character "0". Keys for the first prefix 
index are prefixed with "1". Keys for the second prefix index are
prefixed with "2", and so on. For example, if the token "document" is 
inserted into an FTS5 table with prefix indexes
specified by prefix="2 4", then the keys added to the FTS index would be 
"0document", "1do" and "2docu".

The FTS index entries are not stored in a single tree or hash table
structure. Instead, they are stored in a series of immutable b-tree like
structures referred to as "segment b-trees". Each time a write to the FTS5
table is committed, one or more (but usually just one) new segment b-trees
are added containing both the new entries and tombstones for any deleted
entries. When the FTS index is queried, the reader queries each segment 
b-tree in turn and merges the results, giving priority to newer data.

Each segment b-tree is assigned a numerical level. When a new segment 
b-tree is written to the database as part of committing a transaction,
it is assigned to level 0. Segment b-trees belonging to a single level are
periodically merged together to create a single, larger segment b-tree
that is assigned to the next level (i.e. level 0 segment b-trees are 
merged to become a single level 1 segment b-tree). Thus the numerically
larger levels contain older data in (usually) larger segment b-trees. 
Refer to the 
'automerge',
'crisismerge' and
'usermerge' options, along
with the 
'merge' and
'optimize' commands for details on how to
control the merging.

In cases where the doclist associated with a term or term prefix is very
large, there may be an associated doclist
index. A doclist index is similar to the set of internal nodes of a b-tree.
It allows a large doclist to be efficiently queried for rowids or ranges of
rowids. For example, when processing a query like:

SELECT ... FROM fts_table('term') WHERE rowid BETWEEN ? AND ?


FTS5 uses the segment b-tree index to locate the doclist for term "term",
then uses its doclist index (assuming it is present) to efficiently identify
the subset of matches with rowids in the required range.

9.2.1. The %_data Table Rowid Space

CREATE TABLE %_data(
  id INTEGER PRIMARY KEY, 
  block BLOB
);


The %_data table is used to store three types of records:


   The special structure record, 
       stored with id=1.
   The special averages record, 
       stored with id=10.
   A record to store each segment b-tree
       leaf and doclist index leaf and
       internal node. See below for how id values are calculated for these
       records.


Each segment b-tree in the system is assigned a unique 16-bit segment id.
Segment ids may only be reused after the original owner segment b-tree is
completely merged into a higher level segment b-tree. Within a segment b-tree,
each leaf page is assigned a unique page number - 1 for the first leaf page, 2
for the second, and so on.

Each doclist index leaf page is also assigned a page number. The first
(leftmost) leaf page in a doclist index is assigned the same page number as 
the segment b-tree leaf page on which its term appears (because doclist indexes
are only created for terms with very long doclists, at most one term per
segment b-tree leaf has an associated doclist index). Call this page number P.
If the doclist is so large that it requires a second leaf, the second leaf is
assigned page number P+1. The third leaf P+2. Each t<ier of a doclist index
b-tree (leaves, parents of leaves, grandparents etc.) is assigned page numbers
in this fashion, starting with page number P.

The "id" value used in the %_data table to store any given segment b-tree
leaf or doclist index leaf or node is composed as follows:


Rowid&nbsp;Bits Contents
38..43  (16 bit) Segment b-tree id value.
37  (1 bit) Doclist index flag. Set for doclist index pages, clear
                for segment b-tree leaves.
32..36  (5 bits) Height in tree. This is set to 0 for segment b-tree
                    and doclist index leaves, to 1 for the parents of doclist
                    index leaves, 2 for the grandparents, etc.
0..31  (32 bits) Page number


9.2.2. Structure Record Format

The structure record identifies the set of segment b-trees that make up the 
current FTS index, along with details of any ongoing incremental merge
operations. It is stored in the %_data table with id=1.

A structure record begins with a single 32-bit unsigned value - the cookie
value.  This value is incremented each time the structure is modified.
Following the cookie value are three varint values, as follows:


   The number of levels in the index (i.e. the maximum level associated
       with any segment b-tree plus one).
   The total number of segment b-trees in the index.
   The total number of segment b-tree leaves written to level 0 trees
       since the FTS5 table was created.


Then, for each level from 0 to nLevel:


   The number of input segments from the previous level being used as
       inputs for the current incremental merge, or zero if there is no
       ongoing incremental merge to create a new segment b-tree for this level.
   The total number of segment b-trees on the level.
   Then, for each segment b-tree, from oldest to newest:
  
     The segment id.
     Page number of first leaf (often 1, always >0).
     Page number of last leaf (always >0).
  


9.2.3. Averages Record Format

The averages record, which is always stored with id=10 in the %_data table,
does not store the average of anything. Instead, it contains a vector of
(nCol+1) packed varint values, where nCol is the number of columns in the FTS5
table, including unindexed columns. The first varint contains the total 
number of rows in the FTS5 table. The second contains the total number of
tokens in all values stored in the leftmost FTS5 table column. The third the
number of tokens in all values for the next leftmost, and so on. The value for
unindexed columns is always zero.

9.2.4. Segment B-Tree Format

9.2.4.1. The Key/Doclist Format

The key/doclist format is a format used to store a series of keys (document
terms or term prefixes prefixed by a single character to indentify the specific
index to which they belong) in sorted order, each with their associated
doclist. The format consists of alternating keys and doclists packed together.

The first key is stored as:

   A varint indicating the number of bytes in the key (N), followed by
   The key data itself (N bytes).


Each subsequent key is stored as:

   A varint indicating the size of the prefix that the key has in common
       with the previous key in bytes,
   A varint indicating the number of bytes in the key following the
       common prefix (N), followed by
   The key suffix data itself (N bytes).


For example, if the first two keys in an FTS5 key/doclist record are
"0challenger" and "0chandelier", then the first key is stored as varint 11
followed by the 11 bytes "0challenger", and the second key is stored as varints
4 and 7, followed by the 7 bytes "ndelier".



Figure 1 - Term/Doclist Format


Each doclist identifies the rows (by their rowid values) that contain at
least one instance of the term or term prefix and an associated position list,
or "poslist" enumerating the position of each term instance within the row. In
this sense a "position" is defined as a column number and term offset within
the column value. 

Within a doclist, documents are always stored in order sorted by rowid.  The
first rowid in a doclist is stored as is, as a varint.= It is immediately
followed by its associated position list. Following this, the difference
between the first rowid and the second, as a varint, followed by the doclist
associated with the second rowid in the doclist. And so on.

There is no way to determine the size of a doclist by parsing it. This must
be stored externally. See the section below for
details of how this is accomplished in FTS5.



Figure 2 - Doclist Format


A position list - often shortened to "poslist" - identifies the column
and token offset within the row of each instance of the token in question.
The format of a poslist is:


   Varint set to twice the size of the poslist, not including this field,
       plus one if the "delete" flag is set on the entry.
   A (possibly empty) list of offsets for column 0 (the leftmost column) of
       the row. Each offset is stored as a varint. The first varint contains
       the value of the first offset, plus 2. The second variant contains the
       difference between the second and first offsets, plus 2. etc. For
       example, if the offset list is to contain offsets 0, 10, 15 and 16, it
       is encoded by packing the following values, encoded as varints, end to
       end:
       
           2, 12, 7, 3

   For each column other than column 0 that contains one of more instances
       of the token:
  
     Byte value 0x01.
     The column number, as a varint.
     An offset list, in the same format as the offset list for column 0.
  




Figure 3 - Position List (poslist) With Offsets in Columns 0 and i


9.2.4.2. Pagination

If it is small enough (by default this means smaller than 4000 bytes), the
entire contents of a segment b-tree may be stored in the key/doclist format
described in the previous section as a single blob within the %_data table.
Otherwise, the key/doclist is split into pages (by default, of approximately
4000 bytes each) and stored in a contiguous set of entries in the %_data table
(see above for details).

When a key/doclist is divided into pages, the following modifications are
made to the format:


   A single varint or key data field never spans two pages.
   The first key on each page is not prefix-compressed. It is stored in
       the format described above for the first key of a doclist - its size as
       a varint followed by the key data.
   If there are one or more rowids on a page before the first key, then
       the first of them is not delta compressed. It is stored as is, just as
       if it were the first rowid of its doclist (which it may or may not be).


Each page also has fixed-size 4-byte header and a variably-sized footer.
The header is divided into 2 16-bit big-endian integer fields. They
contain:


   The byte offset of the first rowid value on the page, if it occurs
       before the first key, or 0 otherwise.
   The byte offset of the page footer.


The page footer consists of a series of varints containing the byte offset
of each key that appears on the page. The page footer is zero bytes in size
if there are no keys on the page.



Figure 4 - Page Format


9.2.4.3. Segment Index Format

The result of formatting the contents of the segment b-tree in the 
key/doclist format and then splitting it into pages is something very
similar to the leaves of a b+tree. Instead of creating a format for
the internal nodes of this b+tree and storing them in the %_data table
alongside the leaves, the keys that would have been stored on such nodes are
added to the %_idx table, defined as:

CREATE TABLE %_idx(
  segid INTEGER,              -- segment id
  term TEXT,                  -- prefix of first key on page
  pgno INTEGER,               -- (2*pgno + bDoclistIndex)
  PRIMARY KEY(segid, term)
);


For each "leaf" page that contains at least one key, an entry is added
to the %_idx table. Fields are set as follows:


  ColumnContents
  segid   The integer segment id.
  term    The smallest prefix of the first key on the page that
                      is larger than all keys on the previous page. For the
                      first page in a segment, this prefix is >zero bytes in
                      size.
  pgno    This field encodes both the page number (within the
                      segment - starting from 1) and the doclist index flag.
                      The doclist index flag is set if the final key on the
                      page has an associated 
                      doclist index. The value of this field is:
                      
       (pgno*2 + bDoclistIndexFlag)



Then, to find the leaf for segment i that may contain term t, instead of
searching through internal nodes, FTS5 runs the query:

SELECT pgno FROM %_idx WHERE segid=$i AND term>=$t ORDER BY term LIMIT 1


9.2.4.4. Doclist Index Format

The segment index described in the previous
section allows a segment b-tree to be efficiently queried by term or,
assuming there is a prefix index of the required size, a term prefix. The data
structure described in this section, doclist indexes, allows FTS5 to
efficiently search for a rowid or range or rowids within the doclist associated
with a single term or term prefix.

Not all keys have associated doclists indexes. By default, a doclist index
is only added for a key if its doclist spans more than 4 segment b-tree leaf
pages. Doclist indexes are themselves b-trees, with both leaves and internal
nodes stored as entries in the %_data table, but in practice most doclists are
small enough to fit on a single leaf. FTS5 uses the same rough size for doclist
index node and leaves as it does for segment b-tree leaves (by default 4000
bytes).

Doclist index leaves and internal nodes use the same page format. The first
byte is a "flags" byte. This is set to 0x00 for the root page of the doclist
index b-tree, and 0x01 for all other pages. The remainder of the page is a
series of tightly packed varints, as follows:


   page number of leftmost child page, followed by
   the smallest rowid value on the left most child page, followed by
   one varint for each subsequent child page, containing the value:
  
     0x00 if there are no rowids on the child page (this can only happen
         when the "child" page is actually a segment b-tree leaf), or
     the difference between the smallest rowid on the child page and
         the previous rowid value stored on the doclist index page.
  


For the leftmost doclist index leaf in a doclist index, the leftmost child
page is the first segment b-tree leaf after the one that contains the key
itself.

9.3. Document Sizes Table (%_docsize table)

CREATE TABLE %_docsize(
    id INTEGER PRIMARY KEY,   -- id of FTS5 row this record pertains to
    sz BLOB                   -- blob containing nCol packed varints
);


Many common search result ranking functions require as an input the size 
in tokens of the result document (as a search term hit in a short document is
considered more significant than one in a long document). To provide fast
access to this information, for each row in the FTS5 table there exists a 
corresponding record (with the same rowid) in the %_docsize shadow table
that contains the size of each column value in the row, in tokens.

The column value sizes are stored in a blob containing one packed varint for
each column of the FTS5 table, from left to right. The varint contains, of
course, the total number of tokens in the corresponding column value. Unindexed
columns are included in this vector of varints; for them the value is always
set to zero.

This table is used by the xColumnSize API. It can
be omitted altogether by specifying the 
columnsize=0 option. In that case the
xColumnSize API is still available to auxiliary functions, but runs much more
slowly.

9.4. The Table Contents (%_content table)

CREATE TABLE %_content(id INTEGER PRIMARY KEY, c0, c1...);


The actual table content - the values inserted into the FTS5 table, is
stored in the %_content table. This table is created with one "c*" column for
each column of the FTS5 table, including any unindexed columns. The values for
the leftmost FTS5 table column are stored in column "c0" of the %_content
table, the values from the next FTS5 table column in column "c1"?, and so on.

This table is omitted completely for 
external content or contentless FTS5 tables.
tables.

9.5. Configuration Options (%_config table)

CREATE TABLE %_config(k PRIMARY KEY, v) WITHOUT ROWID;


This table stores the values of any persistent configuration options. 
Column "k" stores the name of the option (text) and column "v" the value.
Example contents:

sqlite> SELECT * FROM fts_tbl_config;
┌─────────────┬──────â”
│      k      │  v   │
├─────────────┼──────┤
│ crisismerge │ 8    │
│ pgsz        │ 8000 │
│ usermerge   │ 4    │
│ version     │ 4    │
└─────────────┴──────┘




  Appendix A: Comparison with FTS3/4


 Also available is the similar but more mature FTS3/4 module. 
FTS5 is a new version of FTS4 that includes various fixes and solutions for 
problems that could not be fixed in FTS4 without sacrificing backwards 
compatibility. Some of these problems are 
described below.

 Application Porting Guide 

 In order to use FTS5 instead of FTS3 or FTS4, applications usually require
minimal modifications. Most of these fall into three categories - changes
required to the CREATE VIRTUAL TABLE statement used to create the FTS table,
changes required to SELECT queries used to execute queries against the table,
and changes required to applications that use FTS auxiliary functions.

 Changes to CREATE VIRTUAL TABLE statements 


 The module name must be changed from "fts3" or "fts4" to "fts5".

 All type information or constraint specifications must be removed from
     column definitions. FTS3/4 ignores everything following the column name in
     a column definition, FTS5 attempts to parse it (and will report an error
     if it fails to).

 The "matchinfo=fts3" option is not available. The 
     "columnsize=0" option is equivalent.

 The notindexed= option is not available. Adding UNINDEXED
     to the column definition is equivalent.

 The ICU tokenizer is not available.

 The compress=, uncompress= and languageid= options are not available.
     There is as of yet no equivalent for their functionality.


 -- FTS3/4 statement 
CREATE VIRTUAL TABLE t1 USING fts4(
  linkid INTEGER,
  header CHAR(20),
  text VARCHAR,
  notindexed=linkid,
  matchinfo=fts3,
  tokenizer=unicode61
);

 -- FTS5 equivalent (note - the "tokenizer=unicode61" option is not
 -- required as this is the default for FTS5 anyway)
CREATE VIRTUAL TABLE t1 USING fts5(
  linkid UNINDEXED,
  header,
  text,
  columnsize=0
);


 Changes to SELECT statements 


   The "docid" alias does not exist. Applications must use "rowid"
          instead.

   The behaviour of queries when a column-filter is specified both as
          part of the FTS query and by using a column as the LHS of a MATCH
          operator is slightly different. For a table with columns "a" and "b"
          and a query similar to:
... a MATCH 'b: string'

       FTS3/4 searches for matches in column "b". However, FTS5 always
          returns zero rows, as results are first filtered for column "b", then
          for column "a", leaving no results. In other words, in FTS3/4 the
          inner filter overrides the outer, in FTS5 both filters are applied.

   The FTS query syntax (right hand side of the MATCH operator) has
          changed in some ways. The FTS5 syntax is quite close to the FTS4
          "enhanced syntax". The main difference is that FTS5 is fussier 
          about unrecognized punctuation characters and similar within query
          strings. Most queries that work with FTS3/4 should also work with
          FTS5, and those that do not should return parse errors.


 Auxiliary Function Changes 

 FTS5 has no matchinfo() or offsets() function, and the snippet() function
is not as fully-featured as in FTS3/4. However, since FTS5 does provide 
an API allowing applications to create custom auxiliary functions, any
required functionality may be implemented within the application code.

 The set of built-in auxiliary functions provided by FTS5 may be 
improved upon in the future.

 Other Issues


   The functionality provided by the fts4aux module is now provided
          by fts5vocab. The schema of these two tables is slightly different.

   The FTS3/4 "merge=X,Y" command has been replaced by the 
          FTS5 merge command.

   The FTS3/4 "automerge=X" command has been replaced by the 
          FTS5 automerge option.



 
  Summary of Technical Differences 


FTS5 is similar to FTS3/4 in that the primary task of each is to maintain
an index mapping from each unique token to a list of instances of that token 
within a set of documents, where each instance is identified by the document 
in which it appears and its position within that document. For example:

-- Given the following SQL:
CREATE VIRTUAL TABLE ft USING fts5(a, b);
INSERT INTO ft(rowid, a, b) VALUES(1, 'X Y', 'Y Z');
INSERT INTO ft(rowid, a, b) VALUES(2, 'A Z', 'Y Y');

-- The FTS5 module creates the following mapping on disk:
A --&gt; (2, 0, 0)
X --&gt; (1, 0, 0)
Y --&gt; (1, 0, 1) (1, 1, 0) (2, 1, 0) (2, 1, 1)
Z --&gt; (1, 1, 1) (2, 0, 1)


In the example above, each triple identifies the location of a token
instance by rowid, column number (columns are numbered sequentially
starting at 0 from left to right) and position within the column value (the
first token in a column value is 0, the second is 1, and so on). Using this
index, FTS5 is able to provide timely answers to queries such as "the set
of all documents that contain the token 'A'", or "the set of all documents
that contain the sequence 'Y Z'". The list of instances associated with a
single token is called an "instance-list".

The principle difference between FTS3/4 and FTS5 is that in FTS3/4,
each instance-list is stored as a single large database record, whereas
in FTS5 large instance-lists are divided between multiple database records.
This has the following implications for dealing with large databases that
contain large lists:


   FTS5 is able to load instance-lists into memory incrementally in
       order to reduce memory usage and peak allocation size. FTS3/4 very
       often loads entire instance-lists into memory.

   When processing queries that feature more than one token, FTS5 is
       sometimes able to determine that the query can be answered by
       inspecting a subset of a large instance-list. FTS3/4 almost always
       has to traverse entire instance-lists.

   If an instance-list grows so large that it exceeds
       the SQLITE_MAX_LENGTH limit, FTS3/4 is unable to handle it. FTS5
       does not have this problem. 


For these reasons, many complex queries may use less memory and run faster 
using FTS5.

Some other ways in which FTS5 differs from FTS3/4 are:


   FTS5 supports "ORDER BY rank" for returning results in order of
       decreasing relevancy.

   FTS5 features an API allowing users to create custom auxiliary 
       functions for advanced ranking and text processing applications. The
       special "rank" column may be mapped to a custom auxiliary function
       so that adding "ORDER BY rank" to a query works as expected.

   FTS5 recognizes unicode separator characters and case equivalence by
       default. This is also possible using FTS3/4, but must be explicitly
       enabled.

   The query syntax has been revised where necessary to remove
       ambiguities and to make it possible to escape special characters
       in query terms.

   By default, FTS3/4 occasionally merges together two or more of the
       b-trees that make up its full-text index within an INSERT, UPDATE or
       DELETE statement executed by the user. This means that any operation
       on an FTS3/4 table may turn out to be surprisingly slow, as FTS3/4 
       may unpredictably choose to merge together two or more large b-trees
       within it. FTS5 uses incremental merging by default, which limits
       the amount of processing that may take place within any given 
       INSERT, UPDATE or DELETE operation.

This page last modified on  2022-09-24 16:31:11 UTCfts5.html
YKYÁ)
/ƒ‚The RBU Extension1. The RBU Extension

The RBU extension is an add-on for SQLite designed for use with large 
SQLite database files on low-power devices at the edge of a network. RBU
may be used for two separate tasks:


   RBU Update operations. An RBU Update is a bulk update of a
          database file that may include many insert, update and delete
          operations on one or more tables.
   RBU Vacuum operations. An RBU Vacuum optimizes and rebuilds an
          entiA‡¶8~
7Žì-SQLite FTS5 Extension1. Overview of FTS5

FTS5 is an SQLite virtual table module that provides 
full-text search
functionality to database applications. In their most elementary form, 
full-text search engines allow the user to efficiently search a large 
collection of documents for the subset that contain one or more instances of a
search term. The search functionality provided to world wide web users by
Google is, among other things, a full-text search
engine, as it allows users to search for all documents on the web that contain,
for example, the term "fts5".

To use FTS5, the user creates an FTS5 virtual table with one or more
columns. For example:

CREATE VIRTUAL TABLE email USING fts5(sender, title, body);


It is an error to add types, constraints or PRIMARY KEY declarations to 
a CREATE VIRTUAL TABLE statement used to create an FTS5 table. Once created,
an FTS5 table may be populated using INSERT, UPDATE or DELETE statements
like any other table. Like any other table with no PRIMARY KEY declaration, an
FTS5 table has an implicit INTEGER PRIMARY KEY field named rowid. 

Not shown in the example above is that there are also 
various options that may be provided to FTS5 as
part of the CREATE VIRTUAL TABLE statement to configure various aspects of the
new table. These may be used to modify the way in which the FTS5 table extracts
terms from documents and queries, to create extra indexes on disk to speed up
prefix queries, or to create an FTS5 table that acts as an index on content
stored elsewhere.

Once populated, there are three ways to execute a full-text query against
the contents of an FTS5 table:

 Using a MATCH operator in the WHERE clause of a SELECT statement, or
     Using an equals ("=") operator in the WHERE clause of a SELECT statement, or
     using the table-valued function syntax.


If using the MATCH or = operators, the expression to the left of the MATCH
   operator is usually the name of the FTS5 table (the exception is when 
   specifying a column-filter). The expression on the right
   must be a text value specifying the term to search for. For the table-valued
   function syntax, the term to search for is specified as the first table argument.
   For example:

-- Query for all rows that contain at least once instance of the term
-- "fts5" (in any column). The following three queries are equivalent.
SELECT * FROM email WHERE email MATCH 'fts5';
SELECT * FROM email WHERE email = 'fts5';
SELECT * FROM email('fts5');


 By default, FTS5 full-text searches are case-independent. Like any other
SQL query that does not contain an ORDER BY clause, the example above returns
results in an arbitrary order. To sort results by relevance (most to least
relevant), an ORDER BY may be added to a full-text query as follows:

-- Query for all rows that contain at least once instance of the term
-- "fts5" (in any column). Return results in order from best to worst
-- match.  
SELECT * FROM email WHERE email MATCH 'fts5'#Bre database file, with results similar to SQLite's native VACUUM
          command.  


The acronym RBU stands for "Resumable Bulk Update".

Both of the RBU functions may be accomplished using SQLite's built-in 
SQL commands - RBU update via a series of INSERT, DELETE and 
UPDATE commands within a single transaction, and RBU vacuum by a single
VACUUM command.  The RBU module provides the following advantages over
these simpler approaches:



RBU may be more efficient

The most efficient way to apply changes to a B-Tree (the data structure
that SQLite uses to store each table and index on disk) is to make the
changes in key order. But if an SQL table has one or more indexes, the key
order for each index may be different from the main table and the other
auxiliary indexes. As a result, when executing a series of INSERT,
UPDATE and DELETE statements it is not generally possible to order the
operations so that all b-trees are updated in key order. The RBU update
process works around this by applying all changes to the main table in one 
pass, then applying changes to each index in separate passes, ensuring each
B-Tree is updated optimally. For a large database file (one that does not
fit in the OS disk cache) this procedure can result in two orders of
magnitude faster updates.

An RBU Vacuum operation requires less temporary disk space and writes
less data to disk than an SQLite VACUUM. An SQLite VACUUM requires roughly
twice the size of the final database file in temporary disk space to run.
The total amount of data written is around three times the size of the
final database file. By contrast, an RBU Vacuum requires roughly the size
of the final database file in temporary disk space and writes a total of
twice that to disk.

On the other hand, an RBU Vacuum uses more CPU than a regular SQLite
VACUUM - in one test as much as five times as much. For this reason, an RBU
Vacuum is often significantly slower than an SQLite VACUUM under the same
conditions.

RBU runs in the background

An ongoing RBU operation (either an update or a vacuum) does not
interfere with read access to the database file.

RBU runs incrementally

RBU operations may be suspended and then later resumed, perhaps with
intervening power outages and/or system resets. For an RBU update, the
original database content remains visible to all database readers until 
the entire update has been applied - even if the update is suspended and
then later resumed.



The RBU extension is not enabled by default. To enable it, compile the
amalgamation with the SQLITE_ENABLE_RBU compile-time option.



2. RBU Updates
2.1. RBU Update Limitations

The following limitations apply to RBU updates:


The changes must consist of INSERT, UPDATE, and DELETE
    operations only.  CREATE and DROP operations are not
    supported.
INSERT statements may not use default values.
UPDATE and DELETE statements must identify the target rows
    by rowid or by non-NULL PRIMARY KEY values.
UPDATE statements may not modify PRIMARY KEY or rowid values.
    
RBU updates cannot be applied to any tables that contain a column
       named "rbu_control".
The RBU update will not fire any triggers.
The RBU update will not detect or prevent foreign key or
       CHECK constraint violations.
All RBU updates use the "OR ROLLBACK" constraint handling mechanism.
    
The target database may not be in WAL mode.
The target database may not contain indexes on expressions.
    Indexes on expressions are supported beginning with SQLite 3.30.0
    (2019-10-04).
No other writes may occur on the target database while the
       RBU update is being applied.  A read-lock is held on the target
       database to prevent this.



2.2. Preparing an RBU Update File

All changes to be applied by RBU are stored in a separate SQLite database
called the "RBU database".  The database that is to be modified is called
the "target database".

For each table in the target database that will be modified by the update,
a corresponding table is created within the RBU database. The RBU database
table schema is not the same as thatC of the target database, but is derived
from it as described below.

The RBU database table contains a single row for each target database 
row inserted, updated or deleted by the update. Populating the RBU database
tables is described in the following section.




2.2.1. The RBU Database Schema


For each table in the target database, the RBU database should contain a table
named "data&lt;integer&gt;_&lt;target-table-name&gt;" where
&lt;target-table-name&gt; is the name of the table in the target
database and &lt;integer&gt; is any sequence of zero or more numeric
characters (0-9). Tables within the RBU database are processed in order by 
name (from smallest to largest according to the BINARY collation sequence),
so the order in which target tables are updated is influenced by the selection 
of the &lt;integer&gt; portion of the data_% table name. While this can
be useful when using RBU to update 
certain types of virtual tables, there is normally no
reason to use anything other than an empty string in place of
&lt;integer&gt;.

The data_% table must have all the same columns as the target table, plus
one additional column named "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.

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". The rbu_rowid column is mapped to the tables ROWID.
For example, if the target database 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);


Virtual tables for which the "rowid" column does 
not function like a primary key value cannot be updated using RBU.


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);




2.2.2. RBU Database Contents

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. 

The "rbu_control" column may also be set to integer value 2 for 
an INSERT. In this case, the new row silently replaces any existing row that
has the same primary key values. This is equivalent to a DELETE followed by an
INSERT with the same primary key values. It is not the same as an SQL REPLACE
command, as in that case the new row may replace any conflicting rows (i.e.
those that conflict due to UNIQUE constraints or indexes), not just those with
conflicting primary keys.

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
oDther 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');


If RBU is used to update a large BLOB value within a target database, it
may be more efficient to store a patch or delta that can be used to modify
the existing BLOB instead of an entirely new value within the RBU database. 
RBU allows deltas to be specified in two ways:


   In the "fossil delta" format - the format used for blob deltas by the 
  Fossil source-code management system, or

   In a custom format defined by the RBU application.


 The fossil delta format may only be used to update BLOB values. Instead
of storing the new BLOB within the data_% table, the fossil delta is stored
instead. And instead of specifying an 'x' as part of the rbu_control string
for the column to be updated, an 'f' character is stored. When processing
an 'f' update, RBU loads the original BLOB data from disk, applies the fossil
delta to it and stores the results back into the database file. The RBU
databases generated by sqldiff --rbu make use of fossil deltas wherever
doing so would save space in the RBU database.

 To use a custom delta format, the RBU application must register a
user-defined SQL function named "rbu_delta" before beginning to process the
update. rbu_delta() will be invoked with two arguments - the original value
stored in the target table column and the delta value provided as part of
the RBU update. It should return the result of applying the delta to the
original value. To use the custom delta function, the character of the
rbu_control value corresponding to the target column to update must be
set to 'd' instead of 'x'. Then, instead of updating the target table with the
value stored in the corresponding data_% column, RBU invokes the user-defined
SQL function "rbu_delta()" and the store in the target table column.

For example, this row:

INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..d');


causes RBU to update the target database table in a way similar to:

UPDATE t1 SET c = rbu_delta(c, 'usa') WHERE a = 4;


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_% tables themselves should have no PRIMARY KEY declarations.
However, RBU is more efficient if reading the rows in from each data_%
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_% tables.



2.2.3. Using RBU with FTS3/4 Tables

Usually, an FTS3 or FTS4 table is an example of a virtual table 
with a rowid that works like a PRIMARY KEY. So, for the following FTS4 tables:

CREATE VIRTUAL TABLE ft1 USING fts4(addr, text);
CREATE VIRTUAL TABLE ft2 USING fts4;             -- impliciEt "content" column


The data_% tables may be created as follows:

CREATE TABLE data_ft1 USING fts4(addr, text, rbu_rowid, rbu_control);
CREATE TABLE data_ft2 USING fts4(content, rbu_rowid, rbu_control);


And populated as if the target table were an ordinary SQLite table with no
explicit PRIMARY KEY columns.

Contentless FTS4 tables are handled similarly,
except that any attempt to update or delete rows will cause an error when
applying the update.

External content FTS4 tables may also be 
updated using RBU. In this case the user is required to configure the RBU
database so that the same set of UPDATE, DELETE and INSERT operations are
applied to the FTS4 index as to the underlying content table. As for all
updates of external content FTS4 tables, the user is also required to ensure
that any UPDATE or DELETE operations are applied to the FTS4 index before
they are applied to the underlying content table (refer to FTS4 documentation
for a detailed explanation). In RBU, this is done by ensuring that the name
of the data_% table used to write to the FTS4 table sorts before the name
of the data_% table used to update the underlying content table using the
BINARY collation sequence. In order to avoid duplicating data within the
RBU database, an SQL view may be used in place of one of the data_% tables.
For example, for the target database schema:

CREATE TABLE ccc(addr, text);
CREATE VIRTUAL TABLE ccc_fts USING fts4(addr, text, content=ccc);



  The following RBU database schema may be used: 

CREATE TABLE data_ccc(addr, text, rbu_rowid, rbu_control);
CREATE VIEW data0_ccc_fts AS SELECT * FROM data_ccc;

 

  The data_ccc table may then be populated as normal with the updates intended
  for target database table ccc. The same updates will be read by RBU from
  the data0_ccc_fts view and applied to FTS table ccc_fts. Because
  "data0_ccc_fts" is smaller than "data_ccc", the FTS table will be updated
  first, as required.


  Cases in which the underlying content table has an explicit INTEGER PRIMARY
  KEY column are slightly more difficult, as the text values stored in the
  rbu_control column are slightly different for the FTS index and its
  underlying content table. For the underlying content table, a character
  must be included in any rbu_control text values for the explicit IPK, but
  for the FTS table itself, which has an implicit rowid, it should not. This
  is inconvenient, but can be solved using a more complicated view, as follows:

-- Target database schema
CREATE TABLE ddd(i INTEGER PRIMARY KEY, k TEXT);
CREATE VIRTUAL TABLE ddd_fts USING fts4(k, content=ddd);

-- RBU database schema
CREATE TABLE data_ccc(i, k, rbu_control);
CREATE VIEW data0_ccc_fts AS SELECT i AS rbu_rowid, k, CASE 
  WHEN rbu_control IN (0,1) THEN rbu_control ELSE substr(rbu_control, 2) END
FROM data_ccc;



  The substr() function in the SQL view above returns the text of the
  rbu_control argument with the first character (the one corresponding to
  column "i", which is not required by the FTS table) removed.



2.2.4. Automatically Generating RBU Updates with sqldiff


  As of SQLite version 3.9.0 (2015-10-14), 
  the sqldiff utility is able to generate
  RBU databases representing the difference between two databases with
  identical schemas. For example, the following command:

sqldiff --rbu t1.db t2.db



  Outputs an SQL script to create an RBU database which, if used to update
  database t1.db, patches it so that its contents are identical to that of
  database t2.db.


  By default, sqldiff attempts to process all non-virtual tables within
  the two databases provided to it. If any table appears in one database
  but not the other, or if any table has a slightly different schema in
  one database it is an error. The "--table" option may be useful if this
  causes a problem
  

  Virtual tables are ignored by default by sqldiff. However, it is possible 
  to explicitly create an RBU data_% table for a virtual table that features
  a rowid that functions like a primary key using a command such as:

sqldiff --rbu --table &lt;virtualF-table-name&gt; t1.db t2.db



  Unfortunately, even though virtual tables are ignored by default, any
  underlying database tables that they create in order to
  store data within the database are not, and sqldiff will include add these
  to any RBU database. For this reason, users attempting to use sqldiff to
  create RBU updates to apply to target databases with one or more virtual
  tables will likely have to run sqldiff using the --table option separately
  for each table to update in the target database.

2.3. RBU Update C/C++ Programming

The RBU extension interface allows an application to apply an RBU update 
stored in an RBU database to an existing target database.
The procedure is as follows:



Open an RBU handle using the sqlite3rbu_open(T,A,S) function.

The T argument is the name of the target database file.
The A argument is the name of the RBU database file.
The S argument is the name of a "state database" used to store
state information needed to resume the update after an interruption.
The S argument can be NULL in which case the state information
is stored in the RBU database in various tables whose names all
begin with "rbu_".

The sqlite3rbu_open(T,A,S) function returns a pointer to
an "sqlite3rbu" object, which is then passed into the subsequent
interfaces.



Register any required virtual table modules with the database
handle returned by sqlite3rbu_db(X) (where argument X is the sqlite3rbu
pointer returned from sqlite3rbu_open()).  Also, if required, register
the rbu_delta() SQL function using 
sqlite3_create_function_v2().


Invoke the sqlite3rbu_step(X) function one or more times on
the sqlite3rbu object pointer X. Each call to sqlite3rbu_step() 
performs a single b-tree operation, so thousands of calls may be 
required to apply a complete update.  The sqlite3rbu_step() 
interface will return SQLITE_DONE when the update has been
completely applied.


Call sqlite3rbu_close(X) to destroy the sqlite3rbu object pointer.
If sqlite3rbu_step(X) 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 state database (or in the RBU
database if the name of the state database file in sqlite3rbu_open()
is NULL) for later resumption of the update.


If an update is only partially applied to the target database by the
time sqlite3rbu_close() is called, state information is saved 
within the state database if it exists, or otherwise in the RBU database. 
This allows subsequent processes to automatically
resume the RBU update from where it left off.
If state information is stored in the RBU database, it can be removed
by dropping all tables whose names begin with "rbu_".

For more details, refer to the comments in 
header file
sqlite3rbu.h.



3. RBU Vacuum

3.1. RBU Vacuum Limitations

When compared with SQLite's built-in VACUUM command, RBU Vacuum has the
following limitations:


  It may not be used on a database that contains indexes on expressions.
  The database being vacuumed may not be in WAL mode.


3.2. RBU Vacuum C/C++ Programming

 This section provides an overview of and example code demonstrating the
    integration of RBU Vacuum into an application program.  For full details,
    refer to the comments in 
    header file
    sqlite3rbu.h.

 RBU Vacuum applications all implement some variation of the following
procedure:


   An RBU handle is created by calling sqlite3rbu_vacuum(T, S).

       Argument T is the name of the database file to vacuum. Argument S is
      the name of a database in which the RBU module will save its state if the
      vacuum operation is suspended.

       If state database S does not exist when sqlite3rbu_vacuum() is
      invoked, it is automatically created and populated with the single table
      used to store the state of an RBU vacuum - "rbu_state". If an ongoing RBU
      vacuum is suspended, this table is populated with state data. The next
      time sqlite3rbu_vacuum() is called with the same S parameter, it detects
      this data and attempts to resume the suspended vacuum operation. When
      an RBU vacuum operation is completed or encounters an error, RBU 
      automatically deletes the contents of the rbu_state table. In this case,
      the next call to sqlite3rbu_vacuum() starts an entirely new vacuum
      operation from scratch.

       It is a good idea to establish a convention for determining the RBU
      vacuum state database name based on the target database name. The
      example code below uses "&lt;target&gt;-vacuum", where &lt;target&gt; is
      the name of the database being vacuumed.

   Any custom collation sequences used by indexes within the database
      being vacuumed are registered with both of the database handles returned
      by the sqlite3rbu_db() function.

   Function sqlite3rbu_step() is called on the RBU handle until either
      the RBU vacuum is finished, an error occurs or the application wishes to
      suspend the RBU vacuum.

       Each call to sqlite3rbu_step() does a small amount of work towards
      completing the vacuum operation. Depending on the size of the database, a
      single vacuum may require thousands of calls to sqlite3rbu_step().
      sqlite3rbu_step() returns SQLITE_DONE if the vacuum operation has
      finished, SQLITE_OK if the vacuum operation has not finished but no error
      has occurred, and an SQLite error code if an error is encountered. If
      an error does occur, all subsequent calls to sqlite3rbu_step() immediately
      return the same error code.

   Finally, sqlite3rbu_close() is called to close the RBU handle. If the
      application stopped calling sqlite3rbu_step() before either the vacuum
      finished or an error occurred, the state of the vacuum is saved in the
      state database so that it may be resumed later on.

       Like sqlite3rbu_step(), if the vacuum operation has finished,
      sqlite3rbu_close() returns SQLITE_DONE. If the vacuum has not finished
      but no error has occurred, SQLITE_OK is returned. Or, if an error has
      occurred, an SQLite error code is returned. If an error occurred as part
      of a prior call to sqlite3rbu_step(), sqlite3rbu_close() returns the
      same error code.


The following example code illustrates the techniques described above.  

/*
** Either start a new RBU vacuum or resume a suspended RBU vacuum on 
** database zTarget. Return when either an error occurs, the RBU 
** vacuum is finished or when the application signals an interrupt
** (code not shown).
**
** If the RBU vacuum is completed successfully, return SQLITE_DONE.
** If an error occurs, return SQLite error code. Or, if the application
** signals an interrupt, suspend the RBU vacuum operation so that it
** may be resumed by a subsequent call to this function and return
** SQLITE_OK.
**
** This function uses the database named "&lt;zTarget&gt;-vacuum" for
** the state database, where &lt;zTarget&gt; is the name of the database 
** being vacuumed.
*/
int do_rbu_vacuum(const char *zTarget){
  int rc;
  char *zState;                   /* Name of state database */
  sqlite3rbu *pRbu;               /* RBU vacuum handle */

  zState = sqlite3_mprintf("%s-vacuum", zTarget);
  if( zState==0 ) return SQLITE_NOMEM;
  pRbu = sqlite3rbu_vacuum(zTarget, zState);
  sqlite3_free(zState);

  if( pRbu ){
    sqlite3 *dbTarget = sqlite3rbu_db(pRbu, 0);
    sqlite3 *dbState = sqlite3rbu_db(pRbu, 1);

    /* Any custom collation sequences used by the target database must
    ** be registered with both database handles here.  */

    while( sqlite3rbu_step(pRbu)==SQLITE_OK ){
      if( &lt;application has signaled interrupt&gt; ) break;
    }
  }
  rc = sqlite3rbu_close(pRbu);
  return rc;
}

This page last modified on  2019-09-26 19:34:22 UTCrbu.htmlHr problem was that
if the contacts database on the phone was being synced, that would lock the
database file.  Then if a call came in, the database lock would prevent them
from querying the contacts database in order to find the appropriate 
ring-tone for the incoming call, or a photo of the caller to show on screen,
and so forth.
WAL mode (circa 2010) is a better solution to this problem as it permits 
simultaneous access without breaking transaction isolation.

Applications that build their own copy of SQLite from source code
are encouraged to use the -DSQLITE_OMIT_SHARED_CACHE compile-time option,
as the resulting binary will be both smaller and faster.

The shared-cache interfaces described here will continue to be supported
in SQLite, to insure full backwards compatibility.  However, the use of
shared-cache is discouraged.

2. Shared-Cache Locking Model

Externally, from the point of view of another process or thread, two
or more database connections using a shared-cache appear as a single 
connection. The locking protocol used to arbitrate between multiple 
shared-caches or regular database users is described elsewhere.







Figure 1

Figure 1 depicts an example runtime configuration where three 
database connections have been established. Connection 1 is a normal
SQLite database connection. Connections 2 and 3 share a cache 
The normal locking
protocol is used to serialize database access between connection 1 and
the shared cache. The internal protocol used to serialize (or not, see
"Read-Uncommitted Isolation Mode" below) access to the shared-cache by
connections 2 and 3 is described in the remainder of this section.


There are three levels to the shared-cache locking model, 
transaction level locking, table level locking and schema level locking. 
They are described in the following three sub-sections.

2.1. Transaction Level Locking

SQLite connections can open two kinds of transactions, read and write
transactions. This is not done explicitly, a transaction is implicitly a
read-transaction until it first writes to a database table, at which point
it becomes a write-transaction.

At most one connection to a single shared cache may open a 
write transaction at any one time. This may co-exist with any number of read 
transactions. 


2.2. Table Level Locking

When two or more connections use a shared-cache, locks are used to 
serialize concurrent access attempts on a per-table basis. Tables support 
two types of locks, "read-locks" and "write-locks". Locks are granted to
connections - at any one time, each database connection has either a
read-lock, write-lock or no lock on each database table.


At any one time, a single table may have any number of active read-locks
or a single active write lock. To read data from a table, a connection must 
first obtain a read-lock. To write to a table, a connection must obtain a 
write-lock on that table. If a required table lock cannot be obtained,
the query fails and SQLITE_LOCKED is returned to the caller.
 

Once a connection obtains a table lock, it is not released until the
current transaction (read or write) is concluded.


2.2.1. Read-Uncommitted Isolation Mode

The behaviour described above may be modified slightly by using the 
read_uncommitted pragma to change the isolation level from serialized 
(the default), to read-uncommitted.

 A database connection in read-uncommitted mode does not attempt 
to obtain read-locks before reading from database tables as described 
above. This can lead to inconsistent query results if another database
connection modifies a table while it is being read, but it also means that
a read-transaction opened by a connection in read-uncommitted mode can
neither block nor be blocked by any other connection.

Read-uncommitted mode has no effect on the locks required to write to
database tables (i.e. read-uncommitted connections must still obtain 
write-locks and hence database writes may still block or be blocked). 
Also, read-uncommitted mode has no effect on the sqlite_schema
locks required by the rules enumerated below (see section 
"Schema (sqlite_schema) Level Locking").



  /* Set the value of the read-uncommitted flag:
  **
  **   True  -> Set the connection to read-uncommitted mode.
  **   False -> Set the connection to serialized (the default) mode.
  */
  PRAGMA read_uncommitted = &lt;boolean&gt;;

  /* Retrieve the current value of the read-uncommitted flag */
  PRAGMA read_uncommitted;


2.3. Schema (sqlite_schema) Level Locking

The sqlite_schema table supports shared-cache read and write 
locks in the same way as all other database tables (see description 
above). The following special rules also apply:



A connection must obtain a read-lock on sqlite_schema before 
accessing any database tables or obtaining any other read or write locks.
Before executing a statement that modifies the database schema (i.e. 
a CREATE or DROP TABLE statement), a connection must obtain a write-lock on 
sqlite_schema.

A connection may not compile an SQL statement if any other connection
is holding a write-lock on the sqlite_schema table of any attached
database (including the default database, "main"). 



3. Thread Related Issues

In SQLite versions 3.3.0 through 3.4.2 when shared-cache mode is enabled, 
a database connection may only be
used by the thread that called sqlite3_open() to create it.
And a connection could only share cache with another connection in the
same thread.
These restrictions were dropped beginning with SQLite 
version 3.5.0 (2007-09-04).


4. Shared Cache And Virtual Tables


In older versions of SQLite,
shared cache mode could not be used together with virtual tables.
This restriction was removed in SQLite version 3.6.17 (2009-08-10).

5. Enabling Shared-Cache Mode

Shared-cache mode is enabled on a per-process basis. Using the C 
interface, the following API can be used to globally enable or disable
shared-cache mode:



int sqlite3_enable_shared_cache(int);


Each call to sqlite3_enable_shared_cache() affects subsequent database
connections created using sqlite3_open(), sqlite3_open16(), or
sqlite3_open_v2().  Database connections that already exist are
unaffected.  Each call to sqlite3_enable_shared_cache() overrides
all previous calls within the same process.


Individual database connections created using sqlite3_open_v2() can
choose to participate or not participate in shared cache mode by using
the SQLITE_OPEN_SHAREDCACHE or SQLITE_OPEN_PRIVATECACHE flags the
third parameter.  The use of either of these flags overrides the
global shared cache mode setting established by sqlite3_enable_shared_cache().
No more than one of the flags should be used; if both SQLITE_OPEN_SHAREDCACHE
and SQLITE_OPEN_PRIVATECACHE flags are used in the third argument to
sqlite3_open_v2() then the behavior is undefined.

When URI filenames are used, the "cache" query parameter can be used
to specify whether or not the database will use shared cache.  Use
"cache=shared" to enable shared cache and "cache=private" to disable
shared cache.   The ability to use URI query parameters to specify the
cache sharing behavior of a database connection allows cache sharing to
be controlled in ATTACH statements.  For example:


ATTACH 'file:aux.db?cache=shared' AS aux;




6. Shared Cache And In-Memory Databases


Beginning with SQLite version 3.7.13 (2012-06-11), 
shared cache can be used on
in-memory databases, provided that the database is created using
a URI filename.  For backwards compatibility, shared cache is always
disabled for in-memory
databases if the unadorned name ":memory:" is used to open the database.
Prior to version 3.7.13, shared cache was always
disabled for in-memory databases regardless of the database name used,
current system shared cache setting, or query parameters or flags.



Enabling shared-cache for an in-memory database allows two or more
database connections in the same process to have access to the same
in-memory database.  An in-memory database in shared cache is automatically
deleted and memory is reclaimed when the last connection to that database
closes.

This page last modified on  2022-08-15 11:37:22 UTCsharedcache.html
D
¢žD†©m‚
AŒÓ #The SQLite Bytecode Engine1. Executive Summary

SQLite works by translating SQL statements into bytecode and
then running that bytecode in a virtual machine.  This document
describes how the bytecode engine works.

This document describes SQLite internals.  The information provided
here is not needed for routine application development using SQLite.
This document is intended for people who want to delve more deeply into
the internal operation of SQLite.

The bytecode engine is not an API of SQLite.  Details
about the bytecode engine change from one release of SQLite to the next.
Applications that use SQLite should not depend on any of the details
found in this document.



2. Introduction

SQLite works by translating each SQL statement into bytecode and
then running that bytecode.
A prepared statement in SQLite is mostly just the bytecode needed to
implement the corresponding SQL.  The sqlite3_prepare_v2() interface
is a compiler that translates SQL into bytecode.
The sqlite3_step() interface is the virtual machine that runs the
bytecode contained within the prepared statement.

The bytecode virtual machine is the heart of SQLite.
Programmers who want to understand how SQLite operates internally
must be familiar with the bytecode engine.

Historically, the bytecode engine in SQLite is called the
"Virtual DataBase Engine" or "VDBEK¥x‚      'Ë3+8+3 FilenamesSQLite And 8+3 Filenames


The default configuration of SQLite assumes the underlying filesystem
supports long filenames.



SQLite does not impose any naming requirements on database files.
SQLite will happily work with a database file that has any filename extension
or with no extension at all.
When auxiliary files are needed for a rollback journal or
a write-ahead log or for one of the other kinds of
temporary disk files, then the name for the auxiliary file is normally
constructed by appending a suffix onto the end of the database file name.
For example, if the original database is call "app.db" then
the rollback journal will be called "app.db-journal"
and the write-ahead log will be called "app.db-wal".
This approach to auxiliaJÊN‚
=”E-SQLite Shared-Cache Mode1. SQLite Shared-Cache Mode

Starting with version 3.3.0 (2006-01-11), 
SQLite includes a special "shared-cache"
mode (disabled by default) intended for use in embedded servers. If
shared-cache mode is enabled and a thread establishes multiple connections
to the same database, the connections share a single data and schema cache.
This can significantly reduce the quantity of memory and IO required by
the system.

In version 3.5.0 (2007-09-04), 
shared-cache mode was modified so that the same
cache can be shared across an entire process rather than just within
a single thread.  Prior to this change, there were restrictions on
passing database connections between threads.  Those restrictions were
dropped in 3.5.0 update.  This document describes shared-cache mode
as of version 3.5.0.

Shared-cache mode changes the semantics
of the locking model in some cases. The details are described by
this document. A basic understanding of the normal SQLite locking model (see
File Locking And Concurrency In SQLite Version 3
for details) is assumed.



1.1. Use of shared-cache is discouraged

Shared-cache mode is an obsolete feature.  The use of shared-cache mode
is discouraged.  Most use cases for shared-cache are better served by
WAL mode.

Shared-cache mode was invented in 2006 at the request of developers
of Symbian.  TheiGry file naming works great on systems that
support long filenames.  But on systems that impose 8+3 filename
constraints, the auxiliary files do not fit the 8+3 format even though
the original database file does.



Changing Filesystems


The recommended fix for this problem is to select a different
filesystem.  These days, there is a huge selection of high-performance, 
reliable, patent-free filesystems that support long filenames.  
Where possible, it is recommended that embedded devices use one
of these other filesystems.  This will avoid compatibility issues
and the danger of
database corruption caused by inconsistent use of 8+3 filenames.


Adjusting SQLite To Use 8+3 Filenames


Some devices are compelled to use an older filesystem with 8+3
filename restrictions for backwards compatibility, or due
to other non-technical factors.  In such situations, SQLite can be
coerced into using auxiliary files that fit the 8+3 pattern as follows:



Compile the SQLite library with the either the compile-time
       options SQLITE_ENABLE_8_3_NAMES=1 or
       SQLITE_ENABLE_8_3_NAMES=2.
       Support for 8+3 filenames is not included in SQLite by default
       because it does introduce some overhead.  The overhead is tiny,
       but even so, we do not want to burden the billions of SQLite
       applications that do not need 8+3 filename support.

If the SQLITE_ENABLE_8_3_NAMES=1 option
       is used, then SQLite is capable of using 8+3 filenames but that
       capabilities is disabled and must be enabled separately for each
       database connection by using
       using URI filenames when opening or
       ATTACH-ing the database files and include the
       "8_3_names=1" query parameter in the URI.  If SQLite
       is compiled with
       SQLITE_ENABLE_8_3_NAMES=2 then
       8+3 filenames are enabled by default and this step can be
       skipped.

Make sure that database filenames follow the 8+3 filename
       format and that they do not have an empty name or extension.
       In other words, the database filename must contain between
       1 and 8 characters in the base name and between 1 and 3 characters
       in the extension.  Blank extensions are not allowed.



When the steps above are used, SQLite will shorten filename extensions
by only using the last 3 characters of
the extension.  Thus, for example, a file that would normally be called
"app.db-journal" is shortened to just "app.nal".
Similarly, "app.db-wal" will become "app.wal" and
"app.db-shm" becomes "app.shm".



Note that it is very important that the database filename have some kind
of extension.  If there is no extension, then SQLite creates auxiliary
filenames by appending to the base name of the file.  Thus, a database
named "db01" would have a rollback journal file named
"db01-journal".  And as this filename has no extension to shorten
to 3 characters, it will be used as-is, and will violate 8+3 naming rules.




Database Corruption Warning


If a database file is accessed using 8+3 naming rather than the default
long filename, then it must be consistently accessed 
using 8+3 naming by every database
connection every time it is opened, or else there is a risk of database
corruption.
The auxiliary rollback journal and write-ahead log files are essential
to SQLite for being about to recover from a crash.  If an application is
using 8+3 names and crashes, then the information needed to safely recover
from the crash is stored in files with the ".nal" or
".wal" extension.  If the next application to open the database
does not specify the "8_3_names=1" URI parameter, then SQLite
will use the long filenames to try to locate the rollback journal or
write-ahead log files.  It will not find them, since they were saved using
8+3 names by the application that crashed, and hence the database will not
be properly recovered and will likely go corrupt.



Using a database file with 8+3 filenames in some cases while in 
other cases using long filenames is equivalent to
deleting a hot journal.

This page last modified on  2011-08-15 23:00:56 UTCshortnames.htmlL".  This website uses the terms
"bytecode engine", "VDBE", "virtual machine", and "bytecode virtual
machine" interchangeably, as they all mean the same thing.


This article also uses the terms "bytecode program" and
"prepared statement" interchangeably, as they are mostly the same thing.

2.1. VDBE Source Code

The source code to the bytecode engine is in the 
vdbe.c source
file.  The opcode definitions in this document are derived
from comments in that source file. The 
source code comments are the canonical source of information
about the bytecode engine.  When in doubt, refer to the source code.

In addition to the primary vdbe.c source code file, there are 
other helper code files in the source tree, all of whose names
begin with "vdbe" - short for "Virtual DataBase Engine".

Remember that the names and meanings of opcodes often change from
one release of SQLite to the next.  So if you are studying the EXPLAIN
output from SQLite, you should reference the version of this document
(or the vdbe.c source code)
that corresponds to the version of SQLite that ran the EXPLAIN.
Otherwise, the description of the opcodes may not be accurate.
This document is derived from SQLite
 version 3.40.1 check-in
df5c253c0b3dd dated 2022-12-28.




2.2. Instruction Format


A bytecoded program in SQLite consists of one or more instructions.
Each instruction has an opcode and
five operands named P1, P2  P3, P4, and P5.  The P1, P2, and P3 
operands are 32-bit signed integers.  These operands often refer to 
registers.  For instructions that operate on b-tree cursors,
the P1 operand is usually the cursor number.
For jump instructions, P2 is usually the jump destination.
P4 may be a 32-bit signed integer, a 64-bit signed integer, a
64-bit floating point value, a string literal, a Blob literal,
a pointer to a collating sequence comparison function, or a
pointer to the implementation of an application-defined SQL
function, or various other things.  P5 is an 16-bit unsigned integer
normally used to hold flags.  Bits of the P5 flag can sometimes affect
the opcode in subtle ways.  For example, if the 
SQLITE_NULLEQ (0x0080) bit of the P5 operand
is set on the Eq opcode, then the NULL values compare
equal to one another.  Otherwise NULL values compare different
from one another.


Some opcodes use all five operands.  Some opcodes use
one or two.  Some opcodes use none of the operands.


The bytecode engine begins execution on instruction number 0.
Execution continues until a Halt instruction is seen, or until
the program counter becomes greater than the address of
last instruction, or until there is an error.
When the bytecode engine halts, all memory
that it allocated is released and all database cursors it may
have had open are closed.  If the execution stopped due to an
error, any pending transactions are terminated and changes made
to the database are rolled back.



The ResultRow opcode causes the
bytecode engine to pause and the corresponding sqlite3_step()
call to return SQLITE_ROW.  Before invoking
ResultRow, the bytecoded program will
have loaded the results for a single row of a query into a series
of registers.  C-language APIs such as sqlite3_column_int()
or sqlite3_column_text() extract the query results from those
registers.  The bytecode engine resumes with the next instruction
after the ResultRow on the next call
to sqlite3_step().


2.3. Registers


Every bytecode program has a fixed (but potentially large) number of
registers.  A single register can hold a variety of objects:

 A NULL value
 A signed 64-bit integer
 An IEEE double-precision (64-bit) floating point number
 An arbitrary length strings
 An arbitrary length BLOB
 A RowSet object (See the RowSetAdd, RowSetRead, and
                      RowSetTest opcodes)
 A Frame object (Used by subprograms - see Program)



A register can also be "Undefined" meaning that it holds no value
at all.  Undefined is different from NULL.  Depending on compile-time
options, an attempt to read an undefined register will usually cause
a run-time error.  If the code generator (sqlite3_prMepare_v2())
ever generates a prepared statement that reads an Undefined register,
that is a bug in the code generator.


Registers are numbered beginning with 0.
Most opcodes refer to at least one register.

The number of registers in a single prepared statement is fixed
at compile-time.  The content of all registers is cleared when
a prepared statement is reset or
finalized.

The internal Mem object stores the value for a single register.
The abstract sqlite3_value object that is exposed in the API is really
just a Mem object or register.

2.4. B-Tree Cursors


A prepared statement can have
zero or more open cursors.  Each cursor is identified by a
small integer, which is usually the P1 parameter to the opcode
that uses the cursor.
There can be multiple cursors open on the same index or table.
All cursors operate independently, even cursors pointing to the same
indices or tables.
The only way for the virtual machine to interact with a database
file is through a cursor.
Instructions in the virtual machine can create a new cursor 
(ex: OpenRead or OpenWrite),
read data from a cursor (Column),
advance the cursor to the next entry in the table
(ex: Next or Prev), and so forth.
All cursors are automatically
closed when the prepared statement is reset or
finalized.




2.5. Subroutines, Coroutines, and Subprograms

The bytecode engine has no stack on which to store the return address
of a subroutine.  Return addresses must be stored in registers.
Hence, bytecode subroutines are not reentrant.


The Gosub opcode stores the current program counter into
register P1 then jumps to address P2.  The Return opcode jumps
to address P1+1.  Hence, every subroutine is associated with two integers:
the address of the entry point in the subroutine and the register number
that is used to hold the return address.

The Yield opcode swaps the value of the program counter with
the integer value in register P1.  This opcode is used to implement
coroutines.  Coroutines are often used to implement subqueries from
which content is pulled on an as-needed basis.


Triggers need to be reentrant.


Since bytecode
subroutines are not reentrant a different mechanism must be used to
implement triggers.  Each trigger is implemented using a separate bytecode
program with its own opcodes, program counter, and register set.  The
Program opcode invokes the trigger subprogram.  The Program instruction
allocates and initializes a fresh register set for each invocation of the
subprogram, so subprograms can be reentrant and recursive.  The
Param opcode is used by subprograms to access content in registers
of the calling bytecode program.


2.6. Self-Altering Code


Some opcodes are self-altering.
For example, the Init opcode (which is always the first opcode
in every bytecode program) increments its P1 operand.  Subsequent
Once opcodes compare their P1 operands to the P1 value for
the Init opcode in order to determine if the one-time initialization
code that follows should be skipped.
Another example is the String8 opcode which converts its P4
operand from UTF-8 into the correct database string encoding, then
converts itself into a String opcode.



3. Viewing The Bytecode

Every SQL statement that SQLite interprets results in a program
for the virtual machine.  But if the SQL statement begins with
the keyword EXPLAIN the virtual machine will not execute the
program.  Instead, the instructions of the program will be returned,
one instruction per row,
like a query result.  This feature is useful for debugging and
for learning how the virtual machine operates.  For example:


$&nbsp;sqlite3&nbsp;ex1.db
sqlite&gt;&nbsp;explain&nbsp;delete&nbsp;from&nbsp;tbl1&nbsp;where&nbsp;two&lt;20;
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;p4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p5&nbsp;&nbsp;comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;-------------&nbsp;&nbsp;----&nbsp;&nbsp;----&nbsp;&nbsp;----&nbsp;&nbsp;----N---------&nbsp;&nbsp;--&nbsp;&nbsp;-------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Init&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;Start&nbsp;at&nbsp;12&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Null&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;r[1]=NULL&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;root=2&nbsp;iDb=0;&nbsp;tbl1
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;r[2]=tbl1.two
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(BINARY)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;51&nbsp;&nbsp;if&nbsp;r[2]&gt;=r[3]&nbsp;goto&nbsp;9
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rowid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;r[4]=rowid&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Once&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tbl1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Noop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;O&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;01&nbsp;&nbsp;usesStmtJournal=0
13&nbsp;&nbsp;&nbsp;&nbsp;TableLock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tbl1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;iDb=0&nbsp;root=2&nbsp;write=1
14&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;r[3]=20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;Goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00

Any application can run an EXPLAIN query to get output similar to 
the above.
However, indentation to show the loop structure is not generated
by the SQLite core.  The command-line shell contains extra logic
for indenting loops.
Also, the "comment" column in the EXPLAIN output
is only provided if SQLite is compiled with the
-DSQLITE_ENABLE_EXPLAIN_COMMENTS options.

When SQLite is compiled with the SQLITE_DEBUG compile-time option,
extra PRAGMA commands are available that are useful for debugging and
for exploring the operation of the VDBE.  For example the vdbe_trace
pragma can be enabled to cause a disassembly of each VDBE opcode to be
printed on standard output as the opcode is executed.  These debugging
pragmas include:

 PRAGMA parser_trace
 PRAGMA vdbe_addoptrace
 PRAGMA vdbe_debug
 PRAGMA vdbe_listing
 PRAGMA vdbe_trace



4. The Opcodes

There are currently 186
opcodes defined by the virtual machine.
All currently defined opcodes are described in the table below.
This table was generated automatically by scanning the source code
from the file
vdbe.c.


Remember: The VDBE opcodes are not part of the interface 
definition for SQLite.  The number of opcodes and their names and meanings
change from one release of SQLite to the next.
The opcodes shown in the table below are valid for SQLite
 version 3.40.1 check-in
df5c253c0b3dd dated 2022-12-28.



  
  
  
  
  Opcode NameDescription

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.

Add
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.

AddImm
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.

Affinity
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.

AggFinal
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.

AggInverse
Execute the xInverse function for an aggregate.
The function has P5 arguments.  P4 is a pointer to the
FuncDPef structure that specifies the function.  Register P3 is the
accumulator.

The P5 arguments are taken from register P2 and its
successors.

AggStep
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.

AggStep1
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.

AggValue
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.

And
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.

AutoCommit
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.

BeginSubrtn
Mark the beginning of a subroutine that can be entered in-line
or that can be called using Gosub.  The subroutine should
be terminated by an Return instruction that has a P1 operand that
is the same as the P2 operand to this opcode and that has P3 set to 1.
If the subroutine is entered in-line, then the Return will simply
fall through.  But if the subroutine is entered using Gosub, then
the Return will jump back to the first instruction after the Gosub.

This routine works by loading a NULL into the P2 register.  When the
return address register contains a NULL, the Return instruction is
a no-op that simply falls through to the next instruction (assuming that
the Return opcode has a P3 value of 1).  Thus if the subroutine is
entered in-line, then the Return will cause in-line execution to
continue.  But if the subroutine is entered via Gosub, then the
Return will cause a return to the address following the Gosub.

This opcode is identical to Null.  It has a different name
only to make the byte code easier to read and verify.

BitAnd
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.

BitNot
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.

BitOr
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.

Blob
P4 points to a blob of data P1 bytes long.  Store this
blob in register P2.  If P4 is a NULL pointer, then construct
a zero-filled blob that is P1 bytes long in P2.

Cast
Force the value in register P1 to be the type defined by P2.


 P2=='A' &rarr; BLOB
 P2=='B' &rarr; TEXT
 P2=='C' &rarr; NUMERIC
 P2=='D' &rarr; INTEGER
 P2=='E' &rarr; REAL


A NULL value is not changed by this routine.  It remains NULL.

Checkpoint
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&#91;P3&#93; if the checQkpoint returns
SQLITE_BUSY or not, respectively.  Write the number of pages in the
WAL after the checkpoint into mem&#91;P3+1&#93; and the number of pages
in the WAL that have been checkpointed after the checkpoint
completes into mem&#91;P3+2&#93;.  However on an error, mem&#91;P3+1&#93; and
mem&#91;P3+2&#93; are initialized to -1.

Clear
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 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

Close
Close a cursor previously opened as P1.  If P1 is not
currently open, this instruction is a no-op.

ClrSubtype
Clear the subtype from register P1.

CollSeq
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.

Column
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 than (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 bit is set in P5 then the result is guaranteed
to only be used by the length() function or the equivalent.  The content
of large blobs is not loaded, thus saving CPU cycles.  If the
OPFLAG_TYPEOFARG bit is set then the result will only be used by the
typeof() function or the IS NULL or IS NOT NULL operators or the
equivalent.  In this case, all content loading can be omitted.

ColumnsUsed
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.

Compare
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 Jump instruct.

If P5 has the OPFLAG_PERMUTE bit set, then the order of comparison is
determined by the most recent 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.

This opcode must be immediately followed by an Jump opcode.

Concat
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.

RP3 = 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().

Copy
Make a copy of registers P1..P1+P3 into registers P2..P2+P3.

If the 0x0002 bit of P5 is set then also clear the MEM_Subtype flag in the
destination.  The 0x0001 bit of P5 indicates that this Copy opcode cannot
be merged.  The 0x0001 bit is used by the query planner and does not
come into play during query execution.

This instruction makes a deep copy of the value.  A duplicate
is made of any string or blob constant.  See also SCopy.

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.

CreateBtree
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&gt;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.

CursorHint
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.

CursorLock
Lock the btree to which cursor P1 is pointing so that the btree cannot be
written by an other cursor.

CursorUnlock
Unlock the btree to which cursor P1 is pointing so that it can be
written by other cursors.

DecrJumpZero
Register P1 must hold an integer.  Decrement the value in P1
and jump to P2 if the new value is exactly zero.

DeferredSeek
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.

Delete
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 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,S 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.

Destroy
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

Divide
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.

DropIndex
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.

DropTable
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.

DropTrigger
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.

ElseEq
This opcode must follow an Lt or 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
Lt or Gt.

If result of an Eq comparison on the same two operands as the
prior Lt or Gt would have been true, then jump to P2.
If the result of an Eq comparison on the two previous
operands would have been false or NULL, then fall through.

EndCoroutine
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

Eq
Compare the values in register P1 and P3.  If reg(P3)==reg(P1) then
jump to address 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 Tstrings 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.

This opcode saves the result of comparison for use by the new
Jump opcode.

Expire
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.

Filter
Compute a hash on the key contained in the P4 registers starting
with r&#91;P3&#93;.  Check to see if that hash is found in the
bloom filter hosted by register P1.  If it is not present then
maybe jump to P2.  Otherwise fall through.

False negatives are harmless.  It is always safe to fall through,
even if the value is in the bloom filter.  A false negative causes
more CPU cycles to be used, but it should still yield the correct
answer.  However, an incorrect answer may well arise from a
false positive - if the jump is taken when it should fall through.

FilterAdd
Compute a hash on the P4 registers starting with r&#91;P3&#93; and
add that hash to the bloom filter contained in r&#91;P1&#93;.

FinishSeek
If cursor P1 was previously moved via DeferredSeek, complete that
seek operation now, without further delay.  If the cursor seek has
already occurred, this instruction is a no-op.

FkCheck
Halt with an SQLITE_CONSTRAINT error if there are any unresolved
foreign key constraint violations.  If there are no foreign key
constraint violations, this is a no-op.

FK constraint violations are also checked when the prepared statement
exits.  This opcode is used to raise foreign key constraint errors prior
to returning results such as a row change count or the result of a
RETURNING clause.

FkCounter
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).

FkIfZero
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).

Found
If P4==0 then register P3 holds a blob constructed by MakeRecord.  If
P4&gt;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

Function
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 iUs 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

Ge
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.

Gosub
Write the current address onto register P1
and then jump to address P2.

Goto
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.

Gt
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.

Halt
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.

HaltIfNull
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.

IdxDelete
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.  Also, do not raise
this (self-correcting and non-critical) error if in writable_schema mode.

IdxGE
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.

IdxGT
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.

IdxInsert
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 Vzero, 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 Insert.

IdxLE
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.

IdxLT
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.

IdxRowid
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.

If
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.

IfNoHope
Register P3 is the first of P4 registers that form an unpacked
record.  Cursor P1 is an index btree.  P2 is a jump destination.
In other words, the operands to this opcode are the same as the
operands to NotFound and IdxGT.

This opcode is an optimization attempt only.  If this opcode always
falls through, the correct answer is still obtained, but extra works
is performed.

A value of N in the seekHit flag of cursor P1 means that there exists
a key P3:N that will match some record in the index.  We want to know
if it is possible for a record P3:P4 to match some record in the
index.  If it is not possible, we can skips some work.  So if seekHit
is less than P4, attempt to find out if a match is possible by running
NotFound.

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

IfNot
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.

IfNotOpen
If cursor P1 is not open or if P1 is set to a NULL row using the
NullRow opcode, then jump to instruction P2. Otherwise, fall through.

IfNotZero
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.

IfNullRow
Check the cursor P1 to see if it isW 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.

If P1 is not an open cursor, then this opcode is a no-op.

IfPos
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.

IfSmaller
Estimate the number of rows in the table P1.  Jump to P2 if that
estimate is less than approximately 2**(0.1*P3).

IncrVacuum
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.

Init
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 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.

InitCoroutine
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

Insert
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 IdxInsert.

Int64
P4 is a pointer to a 64-bit integer value.
Write that value into register P2.

IntCopy
Transfer the integer value held in register P1 into register P2.

This is an optimized version of SCopy that works only for integer
values.

Integer
The 32-bit integer value P1 is written into register P2.

IntegrityCk
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
fiXle, not the main database file.

This opcode is used to implement the integrity_check pragma.

IsNull
Jump to P2 if the value in register P1 is NULL.

IsTrue
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&#91;P2&#93; := r&#91;P1&#93; IS TRUE
 If P3==1 and P4==1  then  r&#91;P2&#93; := r&#91;P1&#93; IS FALSE
 If P3==0 and P4==1  then  r&#91;P2&#93; := r&#91;P1&#93; IS NOT TRUE
 If P3==1 and P4==0  then  r&#91;P2&#93; := r&#91;P1&#93; IS NOT FALSE


IsType
Jump to P2 if the type of a column in a btree is one of the types specified
by the P5 bitmask.

P1 is normally a cursor on a btree for which the row decode cache is
valid through at least column P3.  In other words, there should have been
a prior Column for column P3 or greater.  If the cursor is not valid,
then this opcode might give spurious results.
The the btree row has fewer than P3 columns, then use P4 as the
datatype.

If P1 is -1, then P3 is a register number and the datatype is taken
from the value in that register.

P5 is a bitmask of data types.  SQLITE_INTEGER is the least significant
(0x01) bit. SQLITE_FLOAT is the 0x02 bit. SQLITE_TEXT is 0x04.
SQLITE_BLOB is 0x08.  SQLITE_NULL is 0x10.

Take the jump to address P2 if and only if the datatype of the
value determined by P1 and P3 corresponds to one of the bits in the
P5 bitmask.

JournalMode
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.

Jump
Jump to the instruction at address P1, P2, or P3 depending on whether
in the most recent Compare instruction the P1 vector was less than
equal to, or greater than the P2 vector, respectively.

This opcode must immediately follow an Compare opcode.

Last
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&gt;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.

Le
This works just like the Lt opcode except that the jump is taken if
the content of register P3 is less than or equal to the content of
register P1.  See the Lt opcode for additional information.

LoadAnalysis
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.

Lt
Compare the values in register P1 and P3.  If reg(P3)&lt;reg(P1) then
jump to address P2.

If the SQLITE_JUMPIFNULL bit of P5 is set and either reg(P1) or
reg(P3) is NULL then the take the jump.  If the SQLITE_JUMPIFNULL
bit is clear then fall through if either operand is NULL.

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 appropriYate 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.

This opcode saves the result of comparison for use by the new
Jump opcode.

MakeRecord
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 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.

The meaning of P5 depends on whether or not the SQLITE_ENABLE_NULL_TRIM
compile-time option is enabled:

* If SQLITE_ENABLE_NULL_TRIM is enabled, then the P5 is the index
of the right-most table that can be null-trimmed.

* If SQLITE_ENABLE_NULL_TRIM is omitted, then P5 has the value
OPFLAG_NOCHNG_MAGIC if the MakeRecord opcode is allowed to
accept no-change records with serial_type 10.  This value is
only used inside an assert() and does not affect the end result.

MaxPgcnt
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.

MemMax
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.

Move
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.

Multiply
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.

MustBeInt
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.

Ne
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.

NewRowid
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&gt;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.

Next
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
Rewind opcode used to position the cursor.  Next is not allowed
to follow SeekLT, SeekLE, or 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 andZ that this instruction could have been
omitted if that index had been unique.  P3 is usually 0.  P3 is
always either 0 or 1.

If P5 is positive and the jump is taken, then event counter
number P5-1 in the prepared statement is incremented.

See also: Prev

NoConflict
If P4==0 then register P3 holds a blob constructed by MakeRecord.  If
P4&gt;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 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

Noop
Do nothing.  This instruction is often useful as a jump
destination.

Not
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.

NotExists
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 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 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

NotFound
If P4==0 then register P3 holds a blob constructed by MakeRecord.  If
P4&gt;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

NotNull
Jump to P2 if the value in register P1 is not NULL.

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
Ne or Eq.

NullRow
Move the cursor P1 to a null row.  Any Column operations
that occur while the cursor is on the null row will always
write a NULL.

If cursor P1 is not previously opened, open it now to a special
pseudo-cursor that always returns NULL for every column.

Offset
Store in register r&#91;P3&#93; 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 Column.[

This opcode is only available if SQLite is compiled with the
-DSQLITE_ENABLE_OFFSET_SQL_FUNC option.

OffsetLimit
This opcode performs a commonly used computation associated with
LIMIT and OFFSET processing.  r&#91;P1&#93; holds the limit counter.  r&#91;P3&#93;
holds the offset counter.  The opcode computes the combined value
of the LIMIT and OFFSET and stores that value in r&#91;P2&#93;.  The r&#91;P2&#93;
value computed is the total number of rows that will need to be
visited in order to complete the query.

If r&#91;P3&#93; is zero or negative, that means there is no OFFSET
and r&#91;P2&#93; is set to be the value of the LIMIT, r&#91;P1&#93;.

if r&#91;P1&#93; is zero or negative, that means there is no LIMIT
and r&#91;P2&#93; is set to -1.

Otherwise, r&#91;P2&#93; is set to the sum of r&#91;P1&#93; and r&#91;P3&#93;.

Once
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 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 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.

OpenAutoindex
This opcode works the same as 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.

OpenDup
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 OpenEphemeral
opcode.  Only ephemeral cursors may be duplicated.

Duplicate ephemeral cursors are used for self-joins of materialized views.

OpenEphemeral
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.

If P3 is positive, then reg&#91;P3&#93; is modified slightly so that it
can be used as zero-length data for Insert.  This is an optimization
that avoids an extra Blob opcode to initialize that register.

OpenPseudo
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 Column opcode.  The 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.

OpenRead
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&gt;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 w\ill only be used for
equality lookups (implemented as a pair of opcodes SeekGE/IdxGT
of SeekLE/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

OpenWrite
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 SeekGE/IdxGT
of SeekLE/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: OpenRead, ReopenIdx

Or
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.

Pagecount
Write the current number of pages in database P1 to memory cell P2.

Param
This opcode is only ever present in sub-programs called via the
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 Program instruction.

ParseSchema
Read and parse all entries from the schema 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.

Permutation
Set the permutation used by the Compare operator in the next
instruction.  The permutation is stored in the P4 operand.

The permutation is only valid for the next opcode which must be
an Compare that has the OPFLAG_PERMUTE bit set in P5.

The first integer in the P4 integer array is the length of the array
and does not become part of the permutation.

Prev
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
Last opcode used to position the cursor.  Prev is not allowed
to follow SeekGT, SeekGE, or 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.

If P5 is positive and the jump is taken, then event counter
nu]mber P5-1 in the prepared statement is incremented.

Program
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.

PureFunc
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 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 PureFunc instead of Function, and
if they were, they throw an error.

See also: AggStep, AggFinal, Function

ReadCookie
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.

Real
P4 is a pointer to a 64-bit floating point value.
Write that value into register P2.

RealAffinity
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.

ReleaseReg
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 SCopy,
a change to the value of the source register for the 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.

Remainder
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.

ReopenIdx
The ReopenIdx opcode works like 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 SeekGE/IdxGT
of SeekLE/IdxLT)


See also: OpenRead, OpenWrite

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.

ResetSorter
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 OpenEphemeral or SorterOpen.

ResultRow
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.

Return
Jump to the address stored in register P1.  If P1 is a return address
register, then this accomplishes a return from a subroutine.

If P3 is 1, then the jump is only taken if register P1 holds an integer
values, otherwise execution falls through to the next opcode, and the
Return becomes a no-op. If P3 is 0, then register P1 must hold an
integer or else an assert() is raised.  P3 should be set to 1 when
this opcode is used in combination with BeginSubrtn, and set to 0
otherwise.

The value in register P1 is unchanged by this opcode.

P2 is not used by the byte-code engine.  However, if P2 is positive
and also less than the current address, then the "EXPLAIN" output
formatter in the CLI will indent all opcodes from the P2 opcode up
to be not including the current Return.   P2 should be the first opcode
in the subroutine from which this opcode is returning.  Thus the P2
value is a byte-code indentation hint.  See tag-20220407a in
wherecode.c and shell.c.

Rewind
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.

RowCell
P1 and P2 are both open cursors. Both must be opened on the same type
of table - intkey or index. This opcode is used as part of copying
the current row from P2 into P1. If the cursors are opened on intkey
tables, register P3 contains the rowid to use with the new record in
P1. If they are opened on index tables, P3 is not used.

This opcode must be followed by either an Insert or InsertIdx opcode
with the OPFLAG_PREFORMAT flag set to complete the insert operation.

RowData
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 caus_ed 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 Function or
by any use of another cursor pointing to the same table.

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.

RowSetAdd
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.

RowSetRead
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.

RowSetTest
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&gt;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).

Savepoint
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).

SCopy
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 Copy to make a complete
copy.

SeekEnd
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.

SeekGE
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

SeekGT
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

SeekHit
Increase or decrease the seekHit value for cursor P1, if necessary,
so that it is no less than P2 and no greater than P3.

The seekHit integer represents the maximum of terms in an index for which
there is known to be at least one match.  If the seekHit value is smaller
than the total number of equality terms in an index lookup, then the
IfNoHope opcode might run to see if the IN loop can be abandoned
early, thus saving work.  This is part of the IN-early-out optimization.

P1 must be a valid b-tree cursor.

SeekLE
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

SeekLT
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

SeekRowid
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 NotExists opcode performs the same operation, but with NotExists
the P3 register must be guaranteed to contain an integer value.  With this
opcode, register P3 might not contain an integer.

The 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

SeekScan
This opcode is a prefaix opcode to SeekGE.  In other words, this
opcode must be immediately followed by SeekGE. This constraint is
checked by assert() statements.

This opcode uses the P1 through P4 operands of the subsequent
SeekGE.  In the text that follows, the operands of the subsequent
SeekGE opcode are denoted as SeekOP.P1 through SeekOP.P4.   Only
the P1, P2 and P5 operands of this opcode are also used, and  are called
This.P1, This.P2 and This.P5.

This opcode helps to optimize IN operators on a multi-column index
where the IN operator is on the later terms of the index by avoiding
unnecessary seeks on the btree, substituting steps to the next row
of the b-tree instead.  A correct answer is obtained if this opcode
is omitted or is a no-op.

The SeekGE.P3 and SeekGE.P4 operands identify an unpacked key which
is the desired entry that we want the cursor SeekGE.P1 to be pointing
to.  Call this SeekGE.P3/P4 row the "target".

If the SeekGE.P1 cursor is not currently pointing to a valid row,
then this opcode is a no-op and control passes through into the SeekGE.

If the SeekGE.P1 cursor is pointing to a valid row, then that row
might be the target row, or it might be near and slightly before the
target row, or it might be after the target row.  If the cursor is
currently before the target row, then this opcode attempts to position
the cursor on or after the target row by invoking sqlite3BtreeStep()
on the cursor between 1 and This.P1 times.

The This.P5 parameter is a flag that indicates what to do if the
cursor ends up pointing at a valid row that is past the target
row.  If This.P5 is false (0) then a jump is made to SeekGE.P2.  If
This.P5 is true (non-zero) then a jump is made to This.P2.  The P5==0
case occurs when there are no inequality constraints to the right of
the IN constraing.  The jump to SeekGE.P2 ends the loop.  The P5!=0 case
occurs when there are inequality constraints to the right of the IN
operator.  In that case, the This.P2 will point either directly to or
to setup code prior to the IdxGT or IdxGE opcode that checks for
loop terminate.

Possible outcomes from this opcode:

 If the cursor is initally not pointed to any valid row, then
fall through into the subsequent SeekGE opcode.

 If the cursor is left pointing to a row that is before the target
row, even after making as many as This.P1 calls to
sqlite3BtreeNext(), then also fall through into SeekGE.

 If the cursor is left pointing at the target row, either because it
was at the target row to begin with or because one or more
sqlite3BtreeNext() calls moved the cursor to the target row,
then jump to This.P2..,

 If the cursor started out before the target row and a call to
to sqlite3BtreeNext() moved the cursor off the end of the index
(indicating that the target row definitely does not exist in the
btree) then jump to SeekGE.P2, ending the loop.

 If the cursor ends up on a valid row that is past the target row
(indicating that the target row does not exist in the btree) then
jump to SeekOP.P2 if This.P5==0 or to This.P2 if This.P5&gt;0.


Sequence
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.

SequenceTest
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.

SetCookie
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.

If P2 is the SCHEMA_VERSION cookie (cookie number 1) then the internal
schema version is set to P3-P5.  The "PRAGMA schema_version=N" statement
has P5 set to 1, so that the internal schema version will be different
from the database schema version, resulting in a schema reset.

ShiftLeft
Shift the integer value in register P2 to the lbeft 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.

ShiftRight
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.

SoftNull
Set register P1 to have the value NULL as seen by the 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 SCopy, the copies will continue to be valid.

Sort
This opcode does exactly the same thing as 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 Sort opcode instead of 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.

SorterCompare
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&#91;P3&#93; 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.

SorterData
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.

SorterInsert
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.

SorterNext
This opcode works just like Next except that P1 must be a
sorter object for which the 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.

SorterOpen
This opcode works like 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.

SorterSort
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 Sort and Rewind that is used
for Sorter objects.

SqlExec
Run the SQL statement or statements specified in the P4 string.

String
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&#91;P3&#93;==P5 ) reg&#91;P2&#93; := CAST(reg&#91;P2&#93; as BLOB)

String8
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.

Subtract
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.
c
TableLock
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.

Trace
Write P4 on the statement trace output if statement tracing is
enabled.

Operand P1 must be 0x7fffffff and P2 must positive.

Transaction
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.  If P2 is 2 or more
then an exclusive 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.

TypeCheck
Apply affinities to the range of P2 registers beginning with P1.
Take the affinities from the Table object in P4.  If any value
cannot be coerced into the correct type, then raise an error.

This opcode is similar to Affinity except that this opcode
forces the register type to the Table column type.  This is used
to implement "strict affinity".

GENERATED ALWAYS AS ... STATIC columns are only checked if P3
is zero.  When P3 is non-zero, no type checking occurs for
static generated columns.  Virtual columns are computed at query time
and so they are never checked.

Preconditions:


 P2 should be the number of non-virtual columns in the
table of P4.
 Table P4 should be a STRICT table.


If any precondition is false, an assertion fault occurs.

Vacuum
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.

Variable
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().

VBegin
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.

VColumn
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 VColumn.

VCreate
P2 is a register that holds the name of a virtual table in database
P1. Call the xCreate method for that table.

VDestroy
P4 is the name of a virtual table in database P1.  Call the xDestroy method
of that table.

VFilter
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.

VInitIn
Set register P2 to be a pointer to a ValueList object for cursor P1
with cache register P3 and output register P3+1.  This ValueList object
can be used as the first argument to sqlite3_vtab_in_first() and
sqlite3_vtab_in_next() to extract all of the values stored in the P1
cursor.  Register P3 is used to hold the values returned by
sqlite3_vtab_in_first() and sqlite3_vtab_in_next().

VNext
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.

VOpen
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.

VRename
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.

VUpdate
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.

Yield
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

ZeroOrNull
If all both registers P1 and P3 are NOT NULL, then store a zero in
register P2.  If either registers P1 or P3 are NULL then put
a NULL in register P2.

  
  

This page last modified on  2022-08-10 18:45:48 UTCopcode.htmlebase use will work as desired.

Issues Arising with Remote Database Files

This diagram shows components and their linkages
for reference in the discussion following:







  The issues arise from the properties and utilization
  of the two data/control channels between the above three blocks.


Channel Traffic Volume

  The "API Call" channel carries less information
  than the "File I/O" channel.
  API calls to submit queries or specify data modification
  normally require substantially fewer bits to be passed
  back and forth than are transferred to/from
  the database file to store or find the data.
  Query result retrieval will normally require much more file traffic
  than API traffic because the data to be returned is rarely
  to be found without reading unrequested data.

Channel Bandwidth

  The API Call channel operates at processor main memory speeds
  (Giga-words/second), with data often passed by reference (and so not copied.)
  In contrast, even the fastest File I/O channels are slower.
  They require the data to be copied, usually over a medium
  requiring bit-serialization. For spinning magnetic media,
  transfers await platter rotation and head movement, then
  are limited by spin velocity.


  When the File I/O channel includes a network connection,
  (in addition to some genuine File I/O at its far end),
  additional slowness is imposed. Even where raw transfer
  rate does not limit bandwidth, the traffic must still be
  packetized and buffered at both ends.
  Additional layers of I/O handlers add scheduling delays.
  However, slowed transfers are the least significant
  issue with network filesystems.

Channel Reliability

  The "API Call" channel is highly reliable, to the extent
  that error rates are unstated and ignored as negligible.
  The channel fails only when the system loses power
  (excepting meteorites, etc.)


  The "File I/O" channel, when it directly reaches a local storage device,
  is also highly reliable.
  (Spinning storage MTBF exceeds 1 million hours,
  and NVRAM lasts longer.)
  Local devices also have a characteristic
  which is critical for enabling database management software
  to be designed to ensure ACID behavior:
  When all process writes to the device have completed,
  (when POSIX fsync() or Windows FlushFileBuffers() calls return),
  the filesystem then either has
  stored the "written" data or will do so
  before storing any subsequently written data.


  When network filesystem apparatus and software layers are interposed
  between filesystem clients and a filesystem over an actual storage device,
  significant sources of failure and misbehavior are introduced.
  While network data transfers are error-checked well, transfer packets
  do not all reliably arrive at their destination once sent.
  Some packets are clobbered by other packets and must be resent.
  Under packet clobbering conditions, repeated retries
  can impose delays exceeding
  what is needed for similar data to reach local storage.
  Some portions of what a client writes can end up stored
  out of time order relative to other portions written.


  Because of the disordering and outright data loss
  which occur in network filesystem writes, it is critical
  that sets of file writes can be accurately known to be done
  before a subsequent set of file writes begins.
  This assurance is obtained by use of robustly designed
  and correctly implemented fsync() (or equivalent) OS functions.
  Unfortunately for some applications, network filesystem sync
  operation can be less robust than local filesystem sync.
  Attaining robust sync in the face of network packet transport errors
  is hard, and safeguards are sometimes relaxed in favor of performance.


  A similar hazard arises with file locking in network filesystems.
  SQLite relies on exclusive locks for write operations, and those have
  been known to operate incorrectly for some network filesystems. This
  has led to database corruption. That may happen again as the designers
  of such change their implementation to suit more common use cases.


  The bottom line is that network filesystem sync and locking reliability
  vary among implementations and installations. The design
  assumptions upon which it relies may hold more true where
  an application is tested than where it is relied upon.
  Rely upon it at your (and your customers') peril.
  See How To Corrupt Your Database Files.


Performance and Reliability Issues

  From the above diagram and discussion, it is obvious that
  performance (aka "speed") is degraded by insertion
  of a network link into one of the two channels.
  Consideration of relative traffic volumes between
  the API Call channel and the File I/O channel
  reveals that such insertion will have less performance
  impact at the API Call channel.


  Consideration of reliability impact is easier, with a clearer outcome:
  Inserting a network link into the API Call channel may also result
  in call failures at times. But if the Client Application
  has bothered to use SQL/SQLite transactions properly,
  such failures will only cause a transaction to fail
  and be rolled back, without compromising the integrity
  of the data. In contrast, if the network link is
  inserted into the File I/O channel, transactions may fail
  (as for the API Call insertion) but with the additional
  effect that the remote database is corrupted.


  These network unreliability issues can be mitigated,
  completely or to an acceptable degree,
  by using SQLite in rollback mode.
  However, the SQLite library is not tested in across-a-network
  scenarios, nor is that reasonably possible.
  Hence, use of a remote database is done at the user's risk.


Recommendations

  Generally, if your data is separated from the application
  by a network, you want to use a client/server database.
  This is due to the fact that the database engine acts
  as a bandwidth-reducing filter on the database traffic.

  If your data is separated from the application by a network,
  you want the low-traffic link to be across the network,
  not the high-traffic link. This means that the database engine
  needs to be on the same machine as the database itself.
  Such is the case with a client/server database like PostgreSQL.
  SQLite is different in that the database engine runs on
  the same machine as the application, which forces the
  higher-traffic link to traverse the network in remote
  database scenarios.  That normally results in lower performance.

  Network filesystems do not support the ability to do
  simultaneous reads and writes while at the same time
  keeping the database consistent.
  So if you have multiple clients on multiple different
  machines which need to do simultaneous database
  reads and writes, you have these choices:

  1.  Use a client/server database engine.
  PostgreSQL
  is an excellent choice. A variation of this is:

  2.  Host an SQLite database in WAL mode, but do
  all reads and writes from processes on the same machine
  that stores the database file.
  Implement a proxy that runs on the database machine that
  relays read/write requests from remote machines.

  3.  Use SQLite in rollback mode.
  This means you can have multiple simultaneous readers or one writer,
  but not simultaneous readers and writers.

  Application programmers should be cognizant of the possibility
  that their application's users will elect to use a remote database
  if they can do so. Unless one of the above choices
  has been effected, or one at a time, exclusive access is used,
  a programmer should consider blocking that
  election unless reliability is of little importance.

Summary

  Choose the technology that is right for you and your customers.
  If your data lives on a different machine from your application,
  then you should consider a client/server database.
  SQLite is designed for situations where the data and application
  coexist on the same machine.
  SQLite can still be made to work in many remote database
  situations, but a client/server solution will usually work
  better in that scenario.

This page last modified on  2022-06-22 21:14:29 UTCuseovernet.html
ÞÞÈ‚
o+SQLite Over a Network, Caveats and ConsiderationsSQLite Over a Network,Caveats and Considerations


Introduction

  Users of the SQLite library, particularly application developers,
  who want to access a SQLite database
  from different systems connected by a network are often
  tempted to simply open a database connection by specifying
  a filename which references a database file somewhere within
  a network filesystem. ("remote database" here)
  This "file" is then accessed by means of
  OS API's which permit the illusion of I/O from/to a local file.
  The illusion is good but imperfect in important ways.

  This simple, "remote database" approach is usually not the best way
  to use a single SQLite database from multiple systems,
  (even if it appears to "work"),
  as it often leads to various kinds of trouble and grief.
  Because these problems are inevitable with some usages,
  but not frequent or repeatable,
  it behooves application developers to not rely
  on early testing success to decide
  that their remote datadhey-value store
The database schema contains a single table that looks something like this:

CREATE TABLE storage(name TEXT PRIMARY KEY, value ANYTHING);


3.2. The "value" column output from the json_tree virtual tables

The json_tree and json_each table-valued functions that are
built into SQLite both have a "value" column that can hold values of
type INTEGER, REAL, or TEXT depending on the type of the corresponding
JSON field.  For example:

SELECT typeof(value) FROM json_each('{"a":1,"b":2.5,"c":"hello"}');


The query above returns three rows of one column with values
"integer", "real", and "text", respectively.

3.3. Storage for dirty data

 Analysts sometimes encounter CSV files where some columns contain
a mixture of integer, real, and text data.  CSV file that are obtained
from Excel spreadsheet exports commonly have this trait, for example.
When importing such "dirty data" into an SQL database, it is convenient
to have flexible columns to import into.

 Dirty data is not restricted to CSV files coming out of Excel, of
course.  There are many data sources in which a single field might
contain a mix of types.  For example, a data column might the number
of seconds since 1970 sometimes, or as a text date string in other cases.
It is desirable to clean up these inconsistent representations,
but at the same time it is convenient to be able to store all the different
representations in the same column of the intermediate database while the
cleanup is underway.

3.4. Dynamic programming languages

SQLite began as a TCL extension that later escaped into the wild.
TCL is a dynamic language in the sense that the programmer does not need
to be aware of datatypes.  Under the hood, TCL keeps careful track of the
datatype of every value, but to the developer and user of a TCL program,
everything looks like a string.  Flexible typing is a natural fit for
use with dynamic programming languages like TCL and others, since with
a dynamic programming language, you can not always predict in advance what
datatype a variable will hold.  So when you need to store the value of that
variable into the database, having a database that is supports flexible
typing makes storage much easier.

3.5. Data typename cross-compatibility

Every SQL database engine seems to have its own unique set of supported
datatype names:


 BIGINT
 UNSIGNED SMALL INT
 TEXT
 VARCHAR
 VARYING CHARACTER
 NATIONAL VARYING CHARACTER
 NVARCHAR
 JSON
 REAL
 FLOAT
 DOUBLE PRECISION
  ... and so forth ...


The fact that SQLite will accept any of these names as a valid typename,
and let you store any kind of content into the column, increases the chances
that a script written to run on some other SQL database engine will also
work in SQLite.

3.6. Repurposing unused or disused columns in legacy databases

 Because an SQLite database file is a single file on disk, some
applications use SQLite as an application file format.  This means
that a single instance of the application might, over the course of its
life, talk to hundreds or thousands of separate databases, each in a separate
file.  When such applications evolve over years, some columns in the
underlying database will have their meanings altered subtly.  Or, it might
be desirable to repurpose an existing column to serve two or more purposes.
This is much easier to do if the column has a flexible datatype.

4. Perceived Disadvantages of Flexible Typing (With Rebuttals)

 The following perceived disadvantages of flexible typing were
    gleaned and compiled from countless posts on Hacker News and
    Reddit and similar forums where developers discuss these sorts of
    things.  If you can think of other reasons why flexible typing
    is a bad idea, please contact the SQLite developers or leave a
    post on the SQLite Forum so
    that your idea can be added to the list.


4.1. We've never done it that way before

 Many skeptics of flexible typing simply express
shock and disbelief, without offering any rationale for why they think
flexible typing is a bad idea.  Without supporting arguments, one must
assume theiir reason for not liking flexible typing is that it is different
from what they are used to.

 Presumably, many developers who are aghast at SQLite's flexible
typing feel this way because they have just never encountered anything
like it before.  All prior exposure to databases and especially SQL
databases has involved rigid typing, and the readers mental model of
SQL includes rigid typing as a fundamental feature.  Flexible typing
upsets their world-view.

 Yes, flexible typing is a new way of thinking about data in an
SQL database.  But new is not necessary bad.  Sometimes, and I think
especially in the case of flexible typing, innovation leads to improvement.

4.2. Rigid type enforcement helps prevent application bugs

 It has become a point of doctrine among many programmers that the
best way to prevent application bugs is strict type enforcement.  But I
find no evidence in support of this.

 To be sure, strict type enforcement does help prevent some kinds of
bugs in lower-level languages like C and C++ that present a model that is
close to machine hardware.  But this does not seem to
be the case for higher-abstraction languages in which all data is 
passed around in a "Value" superclass of some kind which is subclassed
for the various lower-level data types.  When everything is a Value
object, specific datatypes cease to be important.

 This technical note is being writing by the original author of SQLite.
I having been writing TCL programs for 27 years.  TCL has no type enforcement
whatsoever.  The "Value" class in TCL (called Tcl_Obj) can hold many
different datatypes, but it presents the content to the program and to
the application user as a string.  And I've had a lot of bugs in
those TCL programs over the years.  But I do not recall a single instance
where the bugs might have been caught by a rigid type system.  I have
also written a lot of C code over a span of 35 years, not the
least of which is SQLite itself.  I have found the type system in C
to be very helpful at finding and preventing problems.  For the
Fossil Version Control System, which is written
in C, I have even implemented supplemental static analysis programs that
scan the Fossil source code prior to compilation, looking for problems
that compilers miss.  This works well for compiled programs.

 The SQL language model is a higher-level abstraction that C/C++.
In SQLite, every data item is stored in memory as an "sqlite3_value" object.
There are subclasses of this object for strings, integer, floating-point
numbers, blobs, and other representations.  Everything is passed around
inside the SQL language implemented by SQLite as "sqlite3_value" objects
so the underlying datatype does not really matter.  I have never found
rigid type enforcement to be helpful in languages like TCL and SQLite
that have a single "Value" superclass used to represent any data element.
Fossil makes extensive use of SQLite in its implementation.  There have
been many bugs in Fossil over its 14-years history, but I cannot recall
a single bug that might have been prevented by rigid type enforcement in
the SQLite.  C-language bugs might have been caught by better type enforcement
(which is why I wrote the supplemental source code scanners), but no
SQL bugs.

 Based on decades of experience, I reject the thesis that rigid
type enforcement helps prevent application bugs.  I will accept and
believe a slightly modified thesis:  Rigid type enforcement helps to
prevent applications bugs in languages that lack a single
top-level "Value" superclass.  But SQLite does have the
single "sqlite3_value" superclass, so that proverb does not apply.

4.3. Rigid type enforcement prevents data pollution

 Some people contend that if you have rigorous constraints on the
schema, and especially strict enforcement of column datatypes, this
will help prevent incorrect data from being added to the database.
This is not true.  It is true that type enforcement might help prevent
egregiously incorrect data from getting into the system.
But type enforcement is no help in prevent subtly incorrect data
from being recorded.

 So, for example, rigid type enforcement can successfully prevent
the customer name (text) from being inserted into integer
Customer.creditScore column.  On the other hand, if that mistake occurs,
it is very easy to spot the problem and find all affected rows.
But type enforcement is no help in preventing a bug where the customer
family name and given name are reversed, since both are text fields.

 (Aside:  Decades ago, I worked on a team where there was a woman
named "Merritt Tracy".  "Merritt" was her given name and "Tracy" was
her family name.  She reported that she spend an inordinate amount of
time and energy trying to correct databases that had "Tracy" has her 
given name and "Merritt" as her family name.)

 By suppressing easy-to-detect errors and passing through only the
hard-to-detect errors, rigid type enforcement can actually make it more
difficult to find and fix bugs.  Data errors tend to cluster.  If you have
20 different data sources, most of the data errors will usually come
from just 2 or 3 of those sources.  The presence of egregious
errors (such as text in an integer column) is a convenient early warning
signal that something is amiss.  The source of the problem can be 
tracked quickly and extra scrutiny applied to the source of the
egregious errors, thus hopefully also fixing the subtle errors too.
When egregious errors are suppressed, you lose an important signal
that helps you to detect and fix the subtle errors.

 Data errors are inevitable.  They will happen regardless of how
much type checking is done.  Rigid type enforcement can catch only
a small subset of those cases - the most obvious cases.  It does
nothing to help find and fix the more subtle cases.  And, by suppressing
the signal of which data sources are problematic, it can sometimes
make the subtle errors more difficult to locate.

4.4. Other SQL database engines don't work this way

 Because SQLite is less restrictive and allows you to do more things,
SQL scripts that work on other database engines will also usually work
on SQLite, but script written initially for SQLite might not work
on more restrictive database engines.  This can cause problems when
developers user SQLite for prototyping and testing and then migrate their
application to a more restrictive SQL engine for deployment.  If the
application was (unintentionally) taking advantage of the flexible
typing available in SQLite, then it will fail when migrated.

 People use this problem to argue that SQLite should be more
restrictive about datatypes.  But you could just as easily turn
that argument around and say that other database engines should be
more flexible with regard to datatypes.  The application was working
correctly under SQLite, prior to be migrated, after all.  If rigid
type enforcement is really all that useful, why did it break an
application that was previously working?

5. If You Insist On Rigid Type Enforcement...

As of SQLite version 3.37.0 (2021-11-27), SQLite supports this
development style using STRICT tables.

If you find a real-world case where STRICT tables prevented or
would have prevented a bug in an application, please post a message to the
SQLite Forum so that we can add your story
to this document.

6. Embrace Freedom

If flexible typing in an SQL database is a new concept to you,
I encourage you to give it a try.  It probably will not cause you
any problems and it might make your program simpler and easier to
write and maintain.  I think that even if you are skeptical at first,
if you will just give flexible typing a try, you will eventually
come to realize that it is a better approach and will start
encouraging other database vendors to support at least an ANY
datatype if not complete SQLite-style type flexibility.

Most of the time, flexible typing does not matter because a column
stores a single well-defined type.  But occasionally you will run
across situations where having a flexible type system makes the
solution to your problem cleaner and easier.
This page last modified on  2021-08-24 21:13:00 UTCflextypegood.html
LLû ‚
OõU/The Advantages Of Flexible Typing1. Introduction

SQLite provides developers with the freedom to store content in
any desired format, regardless of the declared datatype of the column.
Some people find this feature troublesome.  Some developers are shocked
to discover that it is possible to insert text into a column marked INTEGER.

This article advocates in favor of the flexible type rules
in SQLite.

2. About Flexible Typing

Details regarding the flexible type system of SQLite are found
in the separate Datatypes In SQLite document.  Here is a quick
summary:


 Datatype names on column definitions are optional.  A column definition
        can consist of just the column name and nothing else.
 When datatype names are provided, they can be just about any text.
        SQLite attempts to deduce the preferred datatype for the column based
        on the datatype name in the column definition, but that preferred
        datatype is advisory, not mandatory.  The preferred datatype is
        call the "column affinity".
 An attempt is made to transform incoming data into the preferred
        datatype of the column.  (All SQL database engines do this, not
        just SQLite.)  If this transformation is successful, all is well.
        But if unsuccessful, instead of raising an error, SQLite just stores
        the content using its original datatype.
 The above can lead to situations that advocates of rigid typing
        find incommodious:
        
        Column DatatypeTypes Allowed In That Column
        INTEGERINTEGER, REAL, TEXT, BLOB
        REALREAL, TEXT, BLOB
        TEXTTEXT, BLOB
        BLOBINTEGER, REAL, TEXT, BLOB
        
 Note that an INTEGER or REAL value will never end up being stored
        in a TEXT column, since an INTEGER or REAL value can and always will
        be converted into its equivalent TEXT representation.  Similarly,
        and INTEGER will never be stored in a REAL column because it will
        always be converted into a REAL.  But TEXT does not always look like
        and INTEGER or REAL value and so cannot always be converted.  And a
        BLOB cannot be converted into anything and nothing else can be
        converted into a BLOB.



3. Cases Where Flexible Typing Is Useful

Some readers, upon first encountering flexible typing in SQLite, ask
themselves "how could this ever be useful?"  Here is an
attempt to answer that question:

3.1. Attribute tables

 Many applications, especially those that use SQLite as an
application file format, need a place to store miscellaneous attributes
such as thumbnail images (as BLOB values), short pieces of text (such
as the user's name), as well as numeric, date, and JSON values.  It is
convenient to create a single table to handle this storage:

CREATE TABLE attribute(name TEXT PRIMARY KEY, value) WITHOUT ROWID;


Without flexible typing, such a table would need to be more complex,
with separate columns for each possible type of data.  Flexible typing
of the "value" column makes the table conceptually simpler, more
space-efficient, and easier to access and update.

In the Fossil version control system, each
repository has a CONFIG table that is used to store all kinds of settings
with every possible datatype.  The user-specific configuration file
for Fossil (the ~/.fossil file) is a separate SQLite database that contains
a single attribute table hold the user-specific state across all
repositories.

 Some applications use an SQLite database as a pure kgtensions using compile-time options like:


 -DSQLITE_ENABLE_FTS3
 -DSQLITE_ENABLE_FTS5
 -DSQLITE_ENABLE_RTREE
 -DSQLITE_ENABLE_DBSTAT_VTAB
 -DSQLITE_ENABLE_JSON1
 -DSQLITE_ENABLE_RBU
 -DSQLITE_ENABLE_SESSION


The amalgamation contains everything you need to integrate SQLite 
into a larger project.  Just copy the amalgamation into your source 
directory and compile it along with the other C code files in your project.
(A more detailed discussion of the compilation process is
available.)
You may also want to make use of the "sqlite3.h" header file that 
defines the programming API for SQLite. 
The sqlite3.h header file is available separately. 
The sqlite3.h file is also contained within the amalgamation, in
the first few thousand lines. So if you have a copy of 
sqlite3.c but cannot seem to locate sqlite3.h, you can always 
regenerate the sqlite3.h by copying and pasting from the amalgamation.

In addition to making SQLite easier to incorporate into other
projects, the amalgamation also makes it run faster. Many
compilers are able to do additional optimizations on code when 
it is contained with in a single translation unit such as it 
is in the amalgamation. We have measured performance improvements
of between 5 and 10% when we use the amalgamation to compile 
SQLite rather than individual source files.  The downside of this
is that the additional optimizations often take the form of 
function inlining which tends to make the size of the resulting
binary image larger.



3. The Split Amalgamation

Developers sometimes experience trouble debugging the
quarter-million line amalgamation source file because some debuggers
are only able to handle source code line numbers less than 32,768.
The amalgamation source code runs fine.  One just cannot single-step
through it in a debugger.

To circumvent this limitation, the amalgamation is also available in
a split form, consisting of files "sqlite3-1.c", "sqlite3-2.c", and
so forth, where each file is less than 32,768 lines in length and
where the concatenation of the files contain all of the code for the
complete amalgamation.  Then there is a separate source file named
"sqlite3-all.c" which basically consists of code like this:

#include "sqlite3-1.c"
#include "sqlite3-2.c"
#include "sqlite3-3.c"
#include "sqlite3-4.c"
#include "sqlite3-5.c"
#include "sqlite3-6.c"
#include "sqlite3-7.c"


Applications using the split amalgamation simply compile against
"sqlite3-all.c" instead of "sqlite3.c".  The two files work exactly
the same.  But with "sqlite3-all.c", no single source file contains more
than 32,767 lines of code, and so it is more convenient to use some
debuggers.  The downside of the split amalgamation is that it consists
of 6 C source code files instead of just 1.

4. Download Copies Of The Amalgamation

The amalgamation and
the sqlite3.h header file are available on
the download page as a file 
named sqlite-amalgamation-X.zip
where the X is replaced by the appropriate version number.



5. Building The Amalgamation From Canonical Source Code

To build the amalgamation (either the full amalgamation or the
split amalgamation), first
get the canonical source code from one of the three servers.
Then, on both unix-like systems and on Windows systems that have the
free MinGW development environment
installed, the amalgamation can be built using the
following commands:

sh configure
make sqlite3.c


To build using Microsoft Visual C++, run this command:

nmake /f makefile.msc sqlite3.c


In both cases, the split amalgamation can be obtained by
substituting "sqlite3-all.c" for "sqlite3.c" as the make target.

5.1. Dependencies

The build process makes extensive use of the 
Tcl scripting language.  You will need to have a
copy of TCL installed in order for the make targets above to work.
Easy-to-use installers can be obtained from http://www.tcl-lang.org/.
Many unix workstations have Tcl installed by default.

5.2. See Also

Additional notes on compiling SQLite can be found on the
How To Compile SQLite page.
This page last modified on  2022-04-25 03:42:01 UTCamalgamation.html
Ôˆˆ8‚
KSQLite FTS3 and FTS4 ExtensionsOverview


  FTS3 and FTS4 are SQLite virtual table modules that allows users to perform 
  full-text searches on a set of documents. The most common (and effective) 
  way to describe full-text searches is "what Google, Yahoo, and Bing do
  with documents placed on the World Wide Web". Users input a term, or series 
  of terms, perhaps connected by a binary operator or grouped together into a 
  phrase, and the full-text query system finds the set of documents that best 
  matches those terms considering the operators and groupings the user has 
  specified. This article describes the deployment and usage of FTS3 and FTS4.


  FTS1 and FTS2 are obsolete full-text search modules for SQLite.  There are known
  issues with these older modules and their use should be avoided.
  Portions of the original FTS3 code were contributed to the SQLite project 
  by Scott Hess of Google. It is now 
  developed and maintained as part of SQLite.

1. Introduction to FTS3 and FTS4


  The FTS3 and FTS4 extension modules allows users to create special tables with a 
  built-in full-text index (hereafter "FTS tables"). The full-text index
  allows the user to efficienm® ‚   ;Ûk/The SQLite Amalgamation1. Executive Summary

Over 100 separate source files are concatenated into a
single large file of C-code named "sqlite3.c" and
referred to as "the amalgamation". The amalgamation
contains everything an application needs to embed SQLite.

Combining all the code for SQLite into one big file makes SQLite
easier to deploy &mdash; there is just one file to keep track of.
And because all code is in
a single translation unit, compilers can do
better inter-procedure and inlining optimization
resulting in machine code that is between 5% and 10% faster.

2. The SQLite Amalgamation

The SQLite library consists of 111 files of C code
(as of Version 3.37.0 - 2021-11-27)
in the core with 22 additional files that
implement certain commonly used extensions.

Of the 133
main source files, about 75% are C code and about 25% are C header files.
Most of these are "source" files in the sense that they are stored
in the SQLite version control system
and are edited manually in an ordinary text editor.
But some of the C-language files are generated using scripts
or auxiliary programs.  For example, the
parse.y
file contains an LALR(1) grammar of the SQL language which is compiled,
by the Lemon parser generator, to produce a parser contained in the file
"parse.c" accompanied by token identifiers in "parse.h".


The makefiles for SQLite have an "sqlite3.c" target for building the
amalgamation, to contain all C code for the core SQLite library and the
FTS3, FTS5, RTREE, DBSTAT, JSON1,
RBU and SESSION
extensions.
This file contains about 238K lines of code
(or 145K if you omit blank lines and comments) and is over 8.4 megabytes
in size (as of 2021-12-29).

Though the various extensions are included in the
"sqlite3.c" amalgamation file, they are disabled using #ifdef statements.
Activate the exkntly query the database for all rows that contain
  one or more words (hereafter "tokens"), even if the table
  contains many large documents.


  For example, if each of the 517430 documents in the 
  "Enron E-Mail Dataset"
  is inserted into both an FTS table and an ordinary SQLite table
  created using the following SQL script:

CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT);     /* FTS3 table */
CREATE TABLE enrondata2(content TEXT);                        /* Ordinary table */



  Then either of the two queries below may be executed to find the number of
  documents in the database that contain the word "linux" (351). Using one
  desktop PC hardware configuration, the query on the FTS3 table returns in
  approximately 0.03 seconds, versus 22.5 for querying the ordinary table.

SELECT count(*) FROM enrondata1 WHERE content MATCH 'linux';  /* 0.03 seconds */
SELECT count(*) FROM enrondata2 WHERE content LIKE '%linux%'; /* 22.5 seconds */



  Of course, the two queries above are not entirely equivalent. For example
  the LIKE query matches rows that contain terms such as "linuxophobe"
  or "EnterpriseLinux" (as it happens, the Enron E-Mail Dataset does not
  actually contain any such terms), whereas the MATCH query on the FTS3 table
  selects only those rows that contain "linux" as a discrete token. Both 
  searches are case-insensitive. The FTS3 table consumes around 2006 MB on
  disk compared to just 1453 MB for the ordinary table. Using the same
  hardware configuration used to perform the SELECT queries above, the FTS3
  table took just under 31 minutes to populate, versus 25 for the ordinary
  table.

1.1. Differences between FTS3 and FTS4




  FTS3 and FTS4 are nearly identical. They share most of their code in common,
  and their interfaces are the same. The differences are:


   FTS4 contains query performance optimizations that may significantly
       improve the performance of full-text queries that contain terms that are
       very common (present in a large percentage of table rows).

   FTS4 supports some additional options that may used with the matchinfo()
       function. 

   Because it stores extra information on disk in two new 
       shadow tables in order to support the performance
       optimizations and extra matchinfo() options, FTS4 tables may consume more
       disk space than the equivalent table created using FTS3. Usually the overhead
       is 1-2% or less, but may be as high as 10% if the documents stored in the
       FTS table are very small. The overhead may be reduced by specifying the
       directive "matchinfo=fts3" as part of the FTS4 table
       declaration, but this comes at the expense of sacrificing some of the
       extra supported matchinfo() options.

   FTS4 provides hooks (the compress and uncompress 
       options) allowing data to be stored in a compressed 
       form, reducing disk usage and IO.



  FTS4 is an enhancement to FTS3. 
  FTS3 has been available since SQLite version 3.5.0 (2007-09-04)
  The enhancements for FTS4 were added with SQLite version 3.7.4
  (2010-12-07).


  Which module, FTS3 or FTS4, should you use in your application?  FTS4 is
  sometimes significantly faster than FTS3, even orders of magnitude faster
  depending on the query, though in the common case the performance of the two
  modules is similar. FTS4 also offers the enhanced matchinfo() outputs which
  can be useful in ranking the results of a MATCH operation.  On the
  other hand, in the absence of a matchinfo=fts3 directive FTS4 requires a little
  more disk space than FTS3, though only a percent of two in most cases.


  For newer applications, FTS4 is recommended; though if compatibility with older 
  versions of SQLite is important, then FTS3 will usually serve just as well.  

1.2. Creating and Destroying FTS Tables


  Like other virtual table types, new FTS tables are created using a 
  CREATE VIRTUAL TABLE statement. The module name, which follows
  the USING keyword, is either "fts3" or "fts4". The virtual table module arguments may
  be left empty, in whoich case an FTS table with a single user-defined 
  column named "content" is created. Alternatively, the module arguments
  may be passed a list of comma separated column names. 


  If column names are explicitly provided for the FTS table as part of
  the CREATE VIRTUAL TABLE statement, then a datatype name may be optionally 
  specified for each column. This is pure syntactic sugar, the
  supplied typenames are not used by FTS or the SQLite core for any
  purpose. The same applies to any constraints specified along with an
  FTS column name - they are parsed but not used or recorded by the system
  in any way.

-- Create an FTS table named "data" with one column - "content":
CREATE VIRTUAL TABLE data USING fts3();

-- Create an FTS table named "pages" with three columns:
CREATE VIRTUAL TABLE pages USING fts4(title, keywords, body);

-- Create an FTS table named "mail" with two columns. Datatypes
-- and column constraints are specified along with each column. These
-- are completely ignored by FTS and SQLite. 
CREATE VIRTUAL TABLE mail USING fts3(
  subject VARCHAR(256) NOT NULL,
  body TEXT CHECK(length(body)&lt;10240)
);



  As well as a list of columns, the module arguments passed to a CREATE
  VIRTUAL TABLE statement used to create an FTS table may be used to specify
  a tokenizer. This is done by specifying a string of the form
  "tokenize=&lt;tokenizer name&gt; &lt;tokenizer args&gt;" in place of a column
  name, where &lt;tokenizer name&gt; is the name of the tokenizer to use and
  &lt;tokenizer args&gt; is an optional list of whitespace separated qualifiers
  to pass to the tokenizer implementation. A tokenizer specification may be
  placed anywhere in the column list, but at most one tokenizer declaration is
  allowed for each CREATE VIRTUAL TABLE statement. See below for a 
  detailed description of using (and, if necessary, implementing) a tokenizer.

-- Create an FTS table named "papers" with two columns that uses
-- the tokenizer "porter".
CREATE VIRTUAL TABLE papers USING fts3(author, document, tokenize=porter);

-- Create an FTS table with a single column - "content" - that uses
-- the "simple" tokenizer.
CREATE VIRTUAL TABLE data USING fts4(tokenize=simple);

-- Create an FTS table with two columns that uses the "icu" tokenizer.
-- The qualifier "en_AU" is passed to the tokenizer implementation
CREATE VIRTUAL TABLE names USING fts3(a, b, tokenize=icu en_AU);



  FTS tables may be dropped from the database using an ordinary DROP TABLE
  statement. For example:

-- Create, then immediately drop, an FTS4 table.
CREATE VIRTUAL TABLE data USING fts4();
DROP TABLE data;


1.3. Populating FTS Tables

  
    FTS tables are populated using INSERT, UPDATE and DELETE
    statements in the same way as ordinary SQLite tables are.

  
    As well as the columns named by the user (or the "content" column if no
    module arguments were specified as part of the CREATE VIRTUAL TABLE 
    statement), each FTS table has a "rowid" column. The rowid of an FTS
    table behaves in the same way as the rowid column of an ordinary SQLite 
    table, except that the values stored in the rowid column of an FTS table 
    remain unchanged if the database is rebuilt using the VACUUM command. 
    For FTS tables, "docid" is allowed as an alias along with the usual "rowid",
    "oid" and "_oid_" identifiers. Attempting to insert or update a row with a 
    docid value that already exists in the table is an error, just as it would 
    be with an ordinary SQLite table.

  
    There is one other subtle difference between "docid" and the normal SQLite
    aliases for the rowid column. Normally, if an INSERT or UPDATE statement 
    assigns discrete values to two or more aliases of the rowid column, SQLite 
    writes the rightmost of such values specified in the INSERT or UPDATE
    statement to the database. However, assigning a non-NULL value to both
    the "docid" and one or more of the SQLite rowid aliases when inserting or
    updating an FTS table is considered an error. See below for an example.

-- Create an FTS table
CpREATE VIRTUAL TABLE pages USING fts4(title, body);

-- Insert a row with a specific docid value.
INSERT INTO pages(docid, title, body) VALUES(53, 'Home Page', 'SQLite is a software...');

-- Insert a row and allow FTS to assign a docid value using the same algorithm as
-- SQLite uses for ordinary tables. In this case the new docid will be 54,
-- one greater than the largest docid currently present in the table.
INSERT INTO pages(title, body) VALUES('Download', 'All SQLite source code...');

-- Change the title of the row just inserted.
UPDATE pages SET title = 'Download SQLite' WHERE rowid = 54;

-- Delete the entire table contents.
DELETE FROM pages;

-- The following is an error. It is not possible to assign non-NULL values to both
-- the rowid and docid columns of an FTS table.
INSERT INTO pages(rowid, docid, title, body) VALUES(1, 2, 'A title', 'A document body');


  
    To support full-text queries, FTS maintains an inverted index that maps
    from each unique term or word that appears in the dataset to the locations
    in which it appears within the table contents. For the curious, a 
    complete description of the data structure used to store
    this index within the database file appears below. A feature of
    this data structure is that at any time the database may contain not
    one index b-tree, but several different b-trees that are incrementally
    merged as rows are inserted, updated and deleted. This technique improves 
    performance when writing to an FTS table, but causes some overhead for
    full-text queries that use the index. Evaluating the special "optimize" command, 
    an SQL statement of the
    form "INSERT INTO &lt;fts-table&gt;(&lt;fts-table&gt;) VALUES('optimize')",
    causes FTS to merge all existing index b-trees into a single large
    b-tree containing the entire index. This can be an expensive operation,
    but may speed up future queries. 

  
    For example, to optimize the full-text index for an FTS table named
    "docs":

-- Optimize the internal structure of FTS table "docs".
INSERT INTO docs(docs) VALUES('optimize');


  
    The statement above may appear syntactically incorrect to some. Refer to
    the section describing the simple fts queries for an explanation.

  
    There is another, deprecated, method for invoking the optimize 
    operation using a SELECT statement. New code should use statements
    similar to the INSERT above to optimize FTS structures.


1.4. Simple FTS Queries


  As for all other SQLite tables, virtual or otherwise, data is retrieved
  from FTS tables using a SELECT statement.


  FTS tables can be queried efficiently using SELECT statements of two
  different forms:


  
    Query by rowid. If the WHERE clause of the SELECT statement
    contains a sub-clause of the form "rowid = ?", where ? is an SQL expression,
    FTS is able to retrieve the requested row directly using the equivalent 
    of an SQLite INTEGER PRIMARY KEY index.

  
    Full-text query. If the WHERE clause of the SELECT statement contains
    a sub-clause of the form "&lt;column&gt; MATCH ?", FTS is able to use 
    the built-in full-text index to restrict the search to those documents 
    that match the full-text query string specified as the right-hand operand
    of the MATCH clause.



  If neither of these two query strategies can be used, all
  queries on FTS tables are implemented using a linear scan of the entire
  table. If the table contains large amounts of data, this may be an 
  impractical approach (the first example on this page shows that a linear
  scan of 1.5 GB of data takes around 30 seconds using a modern PC).

-- The examples in this block assume the following FTS table:
CREATE VIRTUAL TABLE mail USING fts3(subject, body);

SELECT * FROM mail WHERE rowid = 15;                -- Fast. Rowid lookup.
SELECT * FROM mail WHERE body MATCH 'sqlite';       -- Fast. Full-text query.
SELECT * FROM mail WHERE mail MATCH 'search';       -- Fast. Full-text query.
SELECT * FROM mail WHERE rowid BETWEEN 15 AND 20;   -- Fast. Rowid lookup.
SELECT * FROqM mail WHERE subject = 'database';      -- Slow. Linear scan.
SELECT * FROM mail WHERE subject MATCH 'database';  -- Fast. Full-text query.



  In all of the full-text queries above, the right-hand operand of the MATCH
  operator is a string consisting of a single term. In this case, the MATCH
  expression evaluates to true for all documents that contain one or more 
  instances of the specified word ("sqlite", "search" or "database", depending 
  on which example you look at). Specifying a single term as the right-hand
  operand of the MATCH operator results in the simplest and most common type 
  of full-text query possible. However more complicated queries are possible,
  including phrase searches, term-prefix searches and searches for documents 
  containing combinations of terms occurring within a defined proximity of each
  other. The various ways in which the full-text index may be queried are
  described below.


  Normally, full-text queries are case-insensitive. However, this
  is dependent on the specific tokenizer used by the FTS table
  being queried. Refer to the section on tokenizers for details.


  The paragraph above notes that a MATCH operator with a simple term as the
  right-hand operand evaluates to true for all documents that contain the
  specified term. In this context, the "document" may refer to either the 
  data stored in a single column of a row of an FTS table, or to the contents
  of all columns in a single row, depending on the identifier used as the
  left-hand operand to the MATCH operator. If the identifier specified as
  the left-hand operand of the MATCH operator is an FTS table column name,
  then the document that the search term must be contained in is the value
  stored in the specified column. However, if the identifier is the name
  of the FTS table itself, then the MATCH operator evaluates to true
  for each row of the FTS table for which any column contains the search 
  term. The following example demonstrates this:

-- Example schema
CREATE VIRTUAL TABLE mail USING fts3(subject, body);

-- Example table population
INSERT INTO mail(docid, subject, body) VALUES(1, 'software feedback', 'found it too slow');
INSERT INTO mail(docid, subject, body) VALUES(2, 'software feedback', 'no feedback');
INSERT INTO mail(docid, subject, body) VALUES(3, 'slow lunch order',  'was a software problem');

-- Example queries
SELECT * FROM mail WHERE subject MATCH 'software';    -- Selects rows 1 and 2
SELECT * FROM mail WHERE body    MATCH 'feedback';    -- Selects row 2
SELECT * FROM mail WHERE mail    MATCH 'software';    -- Selects rows 1, 2 and 3
SELECT * FROM mail WHERE mail    MATCH 'slow';        -- Selects rows 1 and 3

  

  At first glance, the final two full-text queries in the example above seem
  to be syntactically incorrect, as there is a table name ("mail") used as
  an SQL expression. The reason this is acceptable is that each FTS table
  actually has a HIDDEN column with the same name
  as the table itself (in this case, "mail"). The value stored in this
  column is not meaningful to the application, but can be used as the 
  left-hand operand to a MATCH operator. This special column may also be
  passed as an argument to the FTS auxiliary functions.


  The following example illustrates the above. The expressions "docs", 
  "docs.docs" and "main.docs.docs" all refer to column "docs". However, the 
  expression "main.docs" does not refer to any column. It could be used to 
  refer to a table, but a table name is not allowed in the context in which
  it is used below.

-- Example schema
CREATE VIRTUAL TABLE docs USING fts4(content);

-- Example queries
SELECT * FROM docs WHERE docs MATCH 'sqlite';              -- OK.
SELECT * FROM docs WHERE docs.docs MATCH 'sqlite';         -- OK.
SELECT * FROM docs WHERE main.docs.docs MATCH 'sqlite';    -- OK.
SELECT * FROM docs WHERE main.docs MATCH 'sqlite';         -- Error.

 
1.5. Summary


  From the users point of view, FTS tables are similar to ordinary SQLite
  tables in many ways. Data may be added to, modified within and removred 
  from FTS tables using the INSERT, UPDATE and DELETE commands just as 
  it may be with ordinary tables. Similarly, the SELECT command may be used 
  to query data. The following list summarizes the differences between FTS
  and ordinary tables:


   
    As with all virtual table types, it is not possible to create indices or
    triggers attached to FTS tables. Nor is it possible to use the ALTER TABLE
    command to add extra columns to FTS tables (although it is possible to use
    ALTER TABLE to rename an FTS table).

   
    Data-types specified as part of the "CREATE VIRTUAL TABLE" statement
    used to create an FTS table are ignored completely. Instead of the
    normal rules for applying type affinity to inserted values, all
    values inserted into FTS table columns (except the special rowid
    column) are converted to type TEXT before being stored.

   
    FTS tables permit the special alias "docid" to be used to refer to the
    rowid column supported by all virtual tables.

   
    The FTS MATCH operator is supported for queries based on the built-in
    full-text index. 

   
    The FTS auxiliary functions, snippet(), offsets(), and matchinfo() are 
    available to support full-text queries.

  
    

    Every FTS table has a hidden column with the 
    same name as the table itself. The value contained in each row for the
    hidden column is a blob that is only useful as the left operand of a
    MATCH operator, or as the left-most argument to one
    of the FTS auxiliary functions.
    





2. Compiling and Enabling FTS3 and FTS4


  Although FTS3 and FTS4 are included with the SQLite core source code, they are not
  enabled by default. To build SQLite with FTS functionality enabled, define
  the preprocessor macro SQLITE_ENABLE_FTS3 when compiling. New applications
  should also define the SQLITE_ENABLE_FTS3_PARENTHESIS macro to enable the
  enhanced query syntax (see below). Usually, this is done by adding the 
  following two switches to the compiler command line:

-DSQLITE_ENABLE_FTS3
-DSQLITE_ENABLE_FTS3_PARENTHESIS



  Note that enabling FTS3 also makes FTS4 available.  There is not a separate
  SQLITE_ENABLE_FTS4 compile-time option.  A build of SQLite either supports
  both FTS3 and FTS4 or it supports neither.


  If using the amalgamation autoconf based build system, setting the CPPFLAGS
  environment variable while running the 'configure' script is an easy
  way to set these macros. For example, the following command:

CPPFLAGS="-DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS" ./configure &lt;configure options&gt;



  where &lt;configure options&gt; are those options normally passed to
  the configure script, if any.


  Because FTS3 and FTS4 are virtual tables, The SQLITE_ENABLE_FTS3 compile-time option
  is incompatible with the SQLITE_OMIT_VIRTUALTABLE option.


  If a build of SQLite does not include the FTS modules, then any attempt to prepare an
  SQL statement to create an FTS3 or FTS4 table or to drop or access an existing 
  FTS table in any way will fail. The error message returned will be similar 
  to "no such module: ftsN" (where N is either 3 or 4).


  If the C version of the ICU library
  is available, then FTS may also be compiled with the SQLITE_ENABLE_ICU
  pre-processor macro defined. Compiling with this macro enables an FTS
  tokenizer that uses the ICU library to split a document into terms
  (words) using the conventions for a specified language and locale.

-DSQLITE_ENABLE_ICU

  


3. Full-text Index Queries


  The most useful thing about FTS tables is the queries that may be 
  performed using the built-in full-text index. Full-text queries are 
  performed by specifying a clause of the form 
  "&lt;column&gt; MATCH &lt;full-text query expression&gt;" as part of the WHERE 
  clause of a SELECT statement that reads data from an FTS table. 
  Simple FTS queries that return all documents that 
  contain a given term are described above. In that discussion the right-hand
  operand of the MATCH operator was assumed to be a string consisting of a
  ssingle term. This section describes the more complex query types supported 
  by FTS tables, and how they may be utilized by specifying a more
  complex query expression as the right-hand operand of a MATCH operator.


  FTS tables support three basic query types:


  

  Token or token prefix queries. 
    An FTS table may be queried for all documents that contain a specified
    term (the simple case described above), or for
    all documents that contain a term with a specified prefix. As we have
    seen, the query expression for a specific term is simply the term itself.
    The query expression used to search for a term prefix is the prefix
    itself with a '*' character appended to it. For example:


-- Virtual table declaration
CREATE VIRTUAL TABLE docs USING fts3(title, body);

-- Query for all documents containing the term "linux":
SELECT * FROM docs WHERE docs MATCH 'linux';

-- Query for all documents containing a term with the prefix "lin". This will match
-- all documents that contain "linux", but also those that contain terms "linear",
--"linker", "linguistic" and so on.
SELECT * FROM docs WHERE docs MATCH 'lin*';



  
    Normally, a token or token prefix query is matched against the FTS table 
    column specified as the left-hand side of the MATCH operator. Or, if the
    special column with the same name as the FTS table itself is specified,
    against all columns. This may be overridden by specifying a column-name
    followed by a ":" character before a basic term query. There may be space
    between the ":" and the term to query for, but not between the column-name
    and the ":" character. For example:

   
-- Query the database for documents for which the term "linux" appears in
-- the document title, and the term "problems" appears in either the title
-- or body of the document.
SELECT * FROM docs WHERE docs MATCH 'title:linux problems';

-- Query the database for documents for which the term "linux" appears in
-- the document title, and the term "driver" appears in the body of the document
-- ("driver" may also appear in the title, but this alone will not satisfy the
-- query criteria).
SELECT * FROM docs WHERE body MATCH 'title:linux driver';



  
    If the FTS table is an FTS4 table (not FTS3), a token may also be prefixed
    with a "&#94;" character. In this case, in order to match the token must
    appear as the very first token in any column of the matching row. Examples:


-- All documents for which "linux" is the first token of at least one
-- column.
SELECT * FROM docs WHERE docs MATCH '&#94;linux';

-- All documents for which the first token in column "title" begins with "lin".
SELECT * FROM docs WHERE body MATCH 'title: &#94;lin*';





  Phrase queries.
    A phrase query is a query that retrieves all documents that contain a
    nominated set of terms or term prefixes in a specified order with no
    intervening tokens. Phrase queries are specified by enclosing a space
    separated sequence of terms or term prefixes in double quotes (").
    For example:


-- Query for all documents that contain the phrase "linux applications".
SELECT * FROM docs WHERE docs MATCH '"linux applications"';

-- Query for all documents that contain a phrase that matches "lin* app*". As well as
-- "linux applications", this will match common phrases such as "linoleum appliances"
-- or "link apprentice".
SELECT * FROM docs WHERE docs MATCH '"lin* app*"';





  NEAR queries. 
    A NEAR query is a query that returns documents that contain a two or
    more nominated terms or phrases within a specified proximity of each 
    other (by default with 10 or less intervening terms). A NEAR query is 
    specified by putting the keyword "NEAR" between two phrase, token or 
    token prefix queries. To specify a proximity other than the default,
    an operator of the form "NEAR/&lt;N&gt;" may be used, where
    &lt;N&gt; is the maximum number of intervening terms allowed.
    For example:


-- Virtual table declaration.
CREATE VIRTUAL TABLE docs USING fts4();

-- Virtual table data.
INSERT INTO docs tVALUES('SQLite is an ACID compliant embedded relational database management system');

-- Search for a document that contains the terms "sqlite" and "database" with
-- not more than 10 intervening terms. This matches the only document in
-- table docs (since there are only six terms between "SQLite" and "database" 
-- in the document).
SELECT * FROM docs WHERE docs MATCH 'sqlite NEAR database';

-- Search for a document that contains the terms "sqlite" and "database" with
-- not more than 6 intervening terms. This also matches the only document in
-- table docs. Note that the order in which the terms appear in the document
-- does not have to be the same as the order in which they appear in the query.
SELECT * FROM docs WHERE docs MATCH 'database NEAR/6 sqlite';

-- Search for a document that contains the terms "sqlite" and "database" with
-- not more than 5 intervening terms. This query matches no documents.
SELECT * FROM docs WHERE docs MATCH 'database NEAR/5 sqlite';

-- Search for a document that contains the phrase "ACID compliant" and the term
-- "database" with not more than 2 terms separating the two. This matches the
-- document stored in table docs.
SELECT * FROM docs WHERE docs MATCH 'database NEAR/2 "ACID compliant"';

-- Search for a document that contains the phrase "ACID compliant" and the term
-- "sqlite" with not more than 2 terms separating the two. This also matches
-- the only document stored in table docs.
SELECT * FROM docs WHERE docs MATCH '"ACID compliant" NEAR/2 sqlite';



  
    More than one NEAR operator may appear in a single query. In this case each
    pair of terms or phrases separated by a NEAR operator must appear within the
    specified proximity of each other in the document. Using the same table and
    data as in the block of examples above:



-- The following query selects documents that contains an instance of the term 
-- "sqlite" separated by two or fewer terms from an instance of the term "acid",
-- which is in turn separated by two or fewer terms from an instance of the term
-- "relational".
SELECT * FROM docs WHERE docs MATCH 'sqlite NEAR/2 acid NEAR/2 relational';

-- This query matches no documents. There is an instance of the term "sqlite" with
-- sufficient proximity to an instance of "acid" but it is not sufficiently close
-- to an instance of the term "relational".
SELECT * FROM docs WHERE docs MATCH 'acid NEAR/2 sqlite NEAR/2 relational';



  Phrase and NEAR queries may not span multiple columns within a row.


  The three basic query types described above may be used to query the full-text
  index for the set of documents that match the specified criteria. Using the
  FTS query expression language it is possible to perform various set 
  operations on the results of basic queries. There are currently three 
  supported operations:


   The AND operator determines the intersection of two sets of documents.

   The OR operator calculates the union of two sets of documents.

   The NOT operator (or, if using the standard syntax, a unary "-" operator)
       may be used to compute the relative complement of one set of
       documents with respect to another.



  The FTS modules may be compiled to use one of two slightly different versions
  of the full-text query syntax, the "standard" query syntax and the "enhanced" 
  query syntax. The basic term, term-prefix, phrase and NEAR queries described 
  above are the same in both versions of the syntax. The way in which set 
  operations are specified is slightly different. The following two sub-sections 
  describe the part of the two query syntaxes that pertains to set operations. 
  Refer to the description of how to compile fts for compilation notes.


3.1. 
  Set Operations Using The Enhanced Query Syntax


  The enhanced query syntax supports the AND, OR and NOT binary set operators.
  Each of the two operands to an operator may be a basic FTS query, or the
  result of another AND, OR or NOT set operation. Operators must be entered
  using capital letters. Otherwise, they are interpreted as basic term queries
  uinstead of set operators.


  The AND operator may be implicitly specified. If two basic queries appear 
  with no operator separating them in an FTS query string, the results are
  the same as if the two basic queries were separated by an AND operator.
  For example, the query expression "implicit operator" is a more succinct
  version of "implicit AND operator".

-- Virtual table declaration
CREATE VIRTUAL TABLE docs USING fts3();

-- Virtual table data
INSERT INTO docs(docid, content) VALUES(1, 'a database is a software system');
INSERT INTO docs(docid, content) VALUES(2, 'sqlite is a software system');
INSERT INTO docs(docid, content) VALUES(3, 'sqlite is a database');

-- Return the set of documents that contain the term "sqlite", and the
-- term "database". This query will return the document with docid 3 only.
SELECT * FROM docs WHERE docs MATCH 'sqlite AND database';

-- Again, return the set of documents that contain both "sqlite" and
-- "database". This time, use an implicit AND operator. Again, document
-- 3 is the only document matched by this query. 
SELECT * FROM docs WHERE docs MATCH 'database sqlite';

-- Query for the set of documents that contains either "sqlite" or "database".
-- All three documents in the database are matched by this query.
SELECT * FROM docs WHERE docs MATCH 'sqlite OR database';

-- Query for all documents that contain the term "database", but do not contain
-- the term "sqlite". Document 1 is the only document that matches this criteria.
SELECT * FROM docs WHERE docs MATCH 'database NOT sqlite';

-- The following query matches no documents. Because "and" is in lowercase letters,
-- it is interpreted as a basic term query instead of an operator. Operators must
-- be specified using capital letters. In practice, this query will match any documents
-- that contain each of the three terms "database", "and" and "sqlite" at least once.
-- No documents in the example data above match this criteria.
SELECT * FROM docs WHERE docs MATCH 'database and sqlite';



  The examples above all use basic full-text term queries as both operands of 
  the set operations demonstrated. Phrase and NEAR queries may also be used,
  as may the results of other set operations. When more than one set operation
  is present in an FTS query, the precedence of operators is as follows:


  OperatorEnhanced Query Syntax Precedence
  NOT  Highest precedence (tightest grouping).
  AND 
  OR   Lowest precedence (loosest grouping).



  When using the enhanced query syntax, parenthesis may be used to override
  the default precedence of the various operators. For example:

-- Return the docid values associated with all documents that contain the
-- two terms "sqlite" and "database", and/or contain the term "library".
SELECT docid FROM docs WHERE docs MATCH 'sqlite AND database OR library';

-- This query is equivalent to the above.
SELECT docid FROM docs WHERE docs MATCH 'sqlite AND database'
  UNION
SELECT docid FROM docs WHERE docs MATCH 'library';

-- Query for the set of documents that contains the term "linux", and at least
-- one of the phrases "sqlite database" and "sqlite library".
SELECT docid FROM docs WHERE docs MATCH '("sqlite database" OR "sqlite library") AND linux';

-- This query is equivalent to the above.
SELECT docid FROM docs WHERE docs MATCH 'linux'
  INTERSECT
SELECT docid FROM (
  SELECT docid FROM docs WHERE docs MATCH '"sqlite library"'
    UNION
  SELECT docid FROM docs WHERE docs MATCH '"sqlite database"'
);



3.2. Set Operations Using The Standard Query Syntax


  FTS query set operations using the standard query syntax are similar, but
  not identical, to set operations with the enhanced query syntax. There
  are four differences, as follows:


   Only the implicit version of the AND operator is supported.
    Specifying the string "AND" as part of a standard query syntax query is
    interpreted as a term query for the set of documents containing the term 
    "and".



   Parenthesis are not supported.



   The NOT operator is not supported. Instead of the NOT 
    operator, the stvandard query syntax supports a unary "-" operator that
    may be applied to basic term and term-prefix queries (but not to phrase
    or NEAR queries). A term or term-prefix that has a unary "-" operator
    attached to it may not appear as an operand to an OR operator. An FTS
    query may not consist entirely of terms or term-prefix queries with unary
    "-" operators attached to them.


-- Search for the set of documents that contain the term "sqlite" but do
-- not contain the term "database".
SELECT * FROM docs WHERE docs MATCH 'sqlite -database';



   The relative precedence of the set operations is different. 
   In particular, using the standard query syntax the "OR" operator has a
   higher precedence than "AND". The precedence of operators when using the
   standard query syntax is: 



  OperatorStandard Query Syntax Precedence
  Unary "-"  Highest precedence (tightest grouping).
  OR  
  AND  Lowest precedence (loosest grouping).



  The following example illustrates precedence of operators using the standard 
  query syntax:


-- Search for documents that contain at least one of the terms "database"
-- and "sqlite", and also contain the term "library". Because of the differences
-- in operator precedences, this query would have a different interpretation using
-- the enhanced query syntax.
SELECT * FROM docs WHERE docs MATCH 'sqlite OR database library';




4. Auxiliary Functions - Snippet, Offsets and Matchinfo


  The FTS3 and FTS4 modules provide three special SQL scalar functions that may be useful
  to the developers of full-text query systems: "snippet", "offsets" and
  "matchinfo". The purpose of the "snippet" and "offsets" functions is to allow
  the user to identify the location of queried terms in the returned documents.
  The "matchinfo" function provides the user with metrics that may be useful
  for filtering or sorting query results according to relevance.


  The first argument to all three special SQL scalar functions
  must be the FTS hidden column of the FTS table that the function is
  applied to.  The FTS hidden column is an automatically-generated column found on
  all FTS tables that has the same name as the FTS table itself.
  For example, given an FTS table named "mail":

SELECT offsets(mail) FROM mail WHERE mail MATCH &lt;full-text query expression&gt;;
SELECT snippet(mail) FROM mail WHERE mail MATCH &lt;full-text query expression&gt;;
SELECT matchinfo(mail) FROM mail WHERE mail MATCH &lt;full-text query expression&gt;;



  The three auxiliary functions are only useful within a SELECT statement that
  uses the FTS table's full-text index. If used within a SELECT that uses
  the "query by rowid" or "linear scan" strategies, then the snippet and
  offsets both return an empty string, and the matchinfo function returns
  a blob value zero bytes in size.


  All three auxiliary functions extract a set of "matchable phrases" from
  the FTS query expression to work with. The set of matchable phrases for
  a given query consists of all phrases (including unquoted tokens and
  token prefixes) in the expression except those that are prefixed with
  a unary "-" operator (standard syntax) or are part of a sub-expression 
  that is used as the right-hand operand of a NOT operator.


  With the following provisos, each series of tokens in the FTS table that
  matches one of the matchable phrases in the query expression is known as a
  "phrase match":


   If a matchable phrase is part of a series of phrases connected by
       NEAR operators in the FTS query expression, then each phrase match
       must be sufficiently close to other phrase matches of the relevant
       types to satisfy the NEAR condition.

   If the matchable phrase in the FTS query is restricted to matching
       data in a specified FTS table column, then only phrase matches that 
       occur within that column are considered.

 


4.1. The Offsets Function


  For a SELECT query that uses the full-text index, the offsets() function 
  returns a text value containing a series of space-separated integers. For
  eachw term in each phrase match of the current row, 
  there are four integers in the returned list. Each set of four integers is 
  interpreted as follows:


  Integer Interpretation
  0 
      The column number that the term instance occurs in (0 for the
          leftmost column of the FTS table, 1 for the next leftmost, etc.).
  1
      The term number of the matching term within the full-text query
          expression. Terms within a query expression are numbered starting
          from 0 in the order that they occur.
  2
      The byte offset of the matching term within the column.
  3
      The size of the matching term in bytes.



  The following block contains examples that use the offsets function.

CREATE VIRTUAL TABLE mail USING fts3(subject, body);
INSERT INTO mail VALUES('hello world', 'This message is a hello world message.');
INSERT INTO mail VALUES('urgent: serious', 'This mail is seen as a more serious mail');

-- The following query returns a single row (as it matches only the first
-- entry in table "mail". The text returned by the offsets function is
-- "0 0 6 5 1 0 24 5".
--
-- The first set of four integers in the result indicate that column 0
-- contains an instance of term 0 ("world") at byte offset 6. The term instance
-- is 5 bytes in size. The second set of four integers shows that column 1
-- of the matched row contains an instance of term 0 ("world") at byte offset
-- 24. Again, the term instance is 5 bytes in size.
SELECT offsets(mail) FROM mail WHERE mail MATCH 'world';

-- The following query returns also matches only the first row in table "mail".
-- In this case the returned text is "1 0 5 7 1 0 30 7".
SELECT offsets(mail) FROM mail WHERE mail MATCH 'message';

-- The following query matches the second row in table "mail". It returns the
-- text "1 0 28 7 1 1 36 4". Only those occurrences of terms "serious" and "mail"
-- that are part of an instance of the phrase "serious mail" are identified; the
-- other occurrences of "serious" and "mail" are ignored.
SELECT offsets(mail) FROM mail WHERE mail MATCH '"serious mail"';




4.2. The Snippet Function


  The snippet function is used to create formatted fragments of document text
  for display as part of a full-text query results report. The snippet function 
  may be passed between one and six arguments, as follows:


  Argument Default Value Description
  0 N/A
       The first argument to the snippet function must always be the FTS hidden column
           of the FTS table being queried and from which the snippet is to be taken.  The
           FTS hidden column is an automatically generated column with the same name as the
           FTS table itself.
  1 "&lt;b&gt;"
       The "start match" text.
  2 "&lt;/b&gt;"
       The "end match" text.
  3 "&lt;b&gt;...&lt;/b&gt;"
       The "ellipses" text.
  4 -1
       The FTS table column number to extract the returned fragments of
           text from. Columns are numbered from left to right starting with
           zero. A negative value indicates that the text may be extracted
           from any column.
  5 -15
       The absolute value of this integer argument is used as the 
           (approximate) number of tokens to include in the returned text 
           value. The maximum allowable absolute value is 64. The value of
           this argument is referred to as N in the discussion below.



  The snippet function first attempts to find a fragment of text consisting
  of |N| tokens within the current row that contains at least one phrase 
  match for each matchable phrase matched somewhere in the current row, 
  where |N| is the absolute value of the sixth argument passed to the
  snippet function. If the text stored in a single column contains less than
  |N| tokens, then the entire column value is considered. Text fragments 
  may not span multiple columns.


  If such a text fragment can be found, it is returned with the following
  modifications:


   If the text fragment does not begin at the start of a column value,
       the "ellipses" text is prepended to it.
   If the textx fragment does not finish at the end of a column value,
       the "ellipses" text is appended to it.
   For each token in the text fragment that is part of a phrase match,
       the "start match" text is inserted into the fragment before the token,
       and the "end match" text is inserted immediately after it.



  If more than one such fragment can be found, then fragments that contain
  a larger number of "extra" phrase matches are favored. The start of
  the selected text fragment may be moved a few tokens forward or backward
  to attempt to concentrate the phrase matches toward the center of the
  fragment.


  Assuming N is a positive value, if no fragments can be found that
  contain a phrase match corresponding to each matchable phrase, the snippet
  function attempts to find two fragments of approximately N/2 tokens
  that between them contain at least one phrase match for each matchable phrase
  matched by the current row. If this fails, attempts are made to find three
  fragments of N/3 tokens each and finally four N/4 token
  fragments. If a set of four fragments cannot be found that encompasses the
  required phrase matches, the four fragments of N/4 tokens that provide
  the best coverage are selected.


  If N is a negative value, and no single fragment can be found 
  containing the required phrase matches, the snippet function searches
  for two fragments of |N| tokens each, then three, then four. In
  other words, if the specified value of N is negative, the sizes
  of the fragments is not decreased if more than one fragment is required
  to provide the desired phrase match coverage.


  After the M fragments have been located, where M is between
  two and four as described in the paragraphs above, they are joined together
  in sorted order with the "ellipses" text separating them. The three 
  modifications enumerated earlier are performed on the text before it is 
  returned.

Note: In this block of examples, newlines and whitespace characters have
been inserted into the document inserted into the FTS table, and the expected
results described in SQL comments. This is done to enhance readability only,
they would not be present in actual SQLite commands or output.

-- Create and populate an FTS table.
CREATE VIRTUAL TABLE text USING fts4();
INSERT INTO text VALUES('
  During 30 Nov-1 Dec, 2-3oC drops. Cool in the upper portion, minimum temperature 14-16oC 
  and cool elsewhere, minimum temperature 17-20oC. Cold to very cold on mountaintops, 
  minimum temperature 6-12oC. Northeasterly winds 15-30 km/hr. After that, temperature 
  increases. Northeasterly winds 15-30 km/hr.     
');

-- The following query returns the text value:
--
--   "&lt;b&gt;...&lt;/b&gt;cool elsewhere, minimum temperature 17-20oC. &lt;b&gt;Cold&lt;/b&gt; to very 
--    &lt;b&gt;cold&lt;/b&gt; on mountaintops, minimum temperature 6&lt;b&gt;...&lt;/b&gt;".
--
SELECT snippet(text) FROM text WHERE text MATCH 'cold';

-- The following query returns the text value:
--
--   "...the upper portion, &#91;minimum&#93; &#91;temperature&#93; 14-16oC and cool elsewhere,
--    &#91;minimum&#93; &#91;temperature&#93; 17-20oC. Cold..."
--
SELECT snippet(text, '&#91;', '&#93;', '...') FROM text WHERE text MATCH '"min* tem*"'



4.3. The Matchinfo Function


  The matchinfo function returns a blob value. If it is used within a query
  that does not use the full-text index (a "query by rowid" or "linear scan"),
  then the blob is zero bytes in size. Otherwise, the blob consists of zero
  or more 32-bit unsigned integers in machine byte-order. The exact number
  of integers in the returned array depends on both the query and the value
  of the second argument (if any) passed to the matchinfo function.


  The matchinfo function is called with either one or two arguments. As for
  all auxiliary functions, the first argument must be the special 
  FTS hidden column. The second argument, if it is specified, must be a text value
  comprised only of the characters 'p', 'c', 'n', 'a', 'l', 's', 'x', 'y' and 'b'.
  If no second argument is explicitlyy supplied, it defaults to "pcx". The
  second argument is referred to as the "format string" below.


  Characters in the matchinfo format string are processed from left to right. 
  Each character in the format string causes one or more 32-bit unsigned
  integer values to be added to the returned array. The "values" column in
  the following table contains the number of integer values appended to the
  output buffer for each supported format string character. In the formula
  given, cols is the number of columns in the FTS table, and 
  phrases is the number of matchable phrases in 
  the query. 


  CharacterValuesDescription
  p 1 The number of matchable phrases in the query.
  c 1 The number of user defined columns in the FTS
    table (i.e. not including the docid or the FTS hidden column).
  x 3 * cols * phrases 
    

      For each distinct combination of a phrase and table column, the
      following three values:
      
         In the current row, the number of times the phrase appears in 
             the column.
         The total number of times the phrase appears in the column in
             all rows in the FTS table.
         The total number of rows in the FTS table for which the 
             column contains at least one instance of the phrase.
      
      The first set of three values corresponds to the left-most column
      of the table (column 0) and the left-most matchable phrase in the
      query (phrase 0). If the table has more than one column, the second
      set of three values in the output array correspond to phrase 0 and
      column 1. Followed by phrase 0, column 2 and so on for all columns of
      the table. And so on for phrase 1, column 0, then phrase 1, column 1
      etc. In other words, the data for occurrences of phrase p in
      column c may be found using the following formula:

          hits_this_row  = array&#91;3 * (c + p*cols) + 0&#93;
          hits_all_rows  = array&#91;3 * (c + p*cols) + 1&#93;
          docs_with_hits = array&#91;3 * (c + p*cols) + 2&#93;

  ycols * phrases 
    

      For each distinct combination of a phrase and table column, the
      number of usable phrase matches that appear in the column. This is
      usually identical to the first value in each set of three returned by the
      matchinfo 'x' flag. However, the number of hits reported by the
      'y' flag is zero for any phrase that is part of a sub-expression
      that does not match the current row. This makes a difference for
      expressions that contain AND operators that are descendants of OR
      operators. For example, consider the expression: 

          a OR (b AND c)

      and the document:

          "a c d"

      The matchinfo 'x' flag would report a single hit for the phrases "a" and "c".
      However, the 'y' directive reports the number of hits for "c" as zero, as
      it is part of a sub-expression that does not match the document - (b AND c).
      For queries that do not contain AND operators descended from OR
      operators, the result values returned by 'y' are always the same as
      those returned by 'x'.


      The first value in the array of integer values corresponds to the
      leftmost column of the table (column 0) and the first phrase in the query
      (phrase 0). The values corresponding to other column/phrase combinations
      may be located using the following formula:


          hits_for_phrase_p_column_c  = array&#91;c + p*cols&#93;

      For queries that use OR expressions, or those that use LIMIT or return
      many rows, the 'y' matchinfo option may be faster than 'x'.

b((cols+31)/32) * phrases 



  The matchinfo 'b' flag provides similar information to the
  matchinfo 'y' flag, but in a more
  compact form. Instead of the precise number of hits, 'b' provides a single
  boolean flag for each phrase/column combination. If the phrase is present in
  the column at least once (i.e. if the corresponding integer output of 'y' would
  be non-zero), the corresponding flag is set. Otherwise cleared.


  If the table has 32 or fewer columzns, a single unsigned integer is output for
  each phrase in the query. The least significant bit of the integer is set if the
  phrase appears at least once in column 0. The second least significant bit is
  set if the phrase appears once or more in column 1. And so on.


  If the table has more than 32 columns, an extra integer is added to the output
  of each phrase for each extra 32 columns or part thereof. Integers
  corresponding to the same phrase are clumped together. For example, if a table
  with 45 columns is queried for two phrases, 4 integers are output. The first
  corresponds to phrase 0 and columns 0-31 of the table. The second integer
  contains data for phrase 0 and columns 32-44, and so on.


  For example, if nCol is the number of columns in the table, to determine if
  phrase p is present in column c:


    p_is_in_c = array&#91;p * ((nCol+31)/32)&#93; & (1 &lt;&lt; (c % 32))


  n 1 The number of rows in the FTS4 table. This value is
    only available when querying FTS4 tables, not FTS3.
  a cols For each column, the average number of
    tokens in the text values stored in the column (considering all rows in
    the FTS4 table). This value is only available when querying FTS4 tables,
    not FTS3.  
  l cols 
    For each column, the length of the value stored in the current row of the
    FTS4 table, in tokens.  This value is only available when querying
    FTS4 tables, not FTS3. And only if the "matchinfo=fts3" directive was not
    specified as part of the "CREATE VIRTUAL TABLE" statement used to create
    the FTS4 table.
  s cols For each column, the length of the longest 
    subsequence of phrase matches that the column value has in common
    with the query text. For example, if a table column contains the text
    'a b c d e' and the query is 'a c "d e"', then the length of the longest
    common subsequence is 2 (phrase "c" followed by phrase "d e").
    
    



  For example:

-- Create and populate an FTS4 table with two columns:
CREATE VIRTUAL TABLE t1 USING fts4(a, b);
INSERT INTO t1 VALUES('transaction default models default', 'Non transaction reads');
INSERT INTO t1 VALUES('the default transaction', 'these semantics present');
INSERT INTO t1 VALUES('single request', 'default data');

-- In the following query, no format string is specified and so it defaults
-- to "pcx". It therefore returns a single row consisting of a single blob
-- value 80 bytes in size (20 32-bit integers - 1 for "p", 1 for "c" and
-- 3*2*3 for "x"). If each block of 4 bytes in the blob is interpreted 
-- as an unsigned integer in machine byte-order, the values will be:
--
--     3 2  1 3 2  0 1 1  1 2 2  0 1 1  0 0 0  1 1 1
--
-- The row returned corresponds to the second entry inserted into table t1.
-- The first two integers in the blob show that the query contained three
-- phrases and the table being queried has two columns. The next block of
-- three integers describes column 0 (in this case column "a") and phrase
-- 0 (in this case "default"). The current row contains 1 hit for "default"
-- in column 0, of a total of 3 hits for "default" that occur in column
-- 0 of any table row. The 3 hits are spread across 2 different rows.
--
-- The next set of three integers (0 1 1) pertain to the hits for "default"
-- in column 1 of the table (0 in this row, 1 in all rows, spread across 
-- 1 rows).
--
SELECT matchinfo(t1) FROM t1 WHERE t1 MATCH 'default transaction "these semantics"';

-- The format string for this query is "ns". The output array will therefore
-- contain 3 integer values - 1 for "n" and 2 for "s". The query returns
-- two rows (the first two rows in the table match). The values returned are:
--
--     3  1 1
--     3  2 0
--
-- The first value in the matchinfo array returned for both rows is 3 (the 
-- number of rows in the table). The following two values are the lengths 
-- of the longest common subsequence of phrase matches in each column.
SELECT matchinfo(t1, 'ns') FROM t1 WHERE t1 MATCH 'default transaction';



  The matchinfo function is much faster than either the snippet or offset{s
  functions. This is because the implementation of both snippet and offsets
  is required to retrieve the documents being analyzed from disk, whereas
  all data required by matchinfo is available as part of the same portions
  of the full-text index that are required to implement the full-text query
  itself. This means that of the following two queries, the first may be
  an order of magnitude faster than the second:

SELECT docid, matchinfo(tbl) FROM tbl WHERE tbl MATCH &lt;query expression&gt;;
SELECT docid, offsets(tbl) FROM tbl WHERE tbl MATCH &lt;query expression&gt;;



  The matchinfo function provides all the information required to calculate
  probabilistic "bag-of-words" relevancy scores such as 
  Okapi BM25/BM25F that may
  be used to order results in a full-text search application. Appendix A of this 
  document, "search application tips", contains an example of using the
  matchinfo() function efficiently.


5. Fts4aux - Direct Access to the Full-Text Index


  As of version 3.7.6 (2011-04-12), 
  SQLite includes a new virtual table module called 
  "fts4aux", which can be used to inspect the full-text index of an existing
  FTS table directly. Despite its name, fts4aux works just as well with FTS3
  tables as it does with FTS4 tables. Fts4aux tables are read-only. The only
  way to modify the contents of an fts4aux table is by modifying the
  contents of the associated FTS table. The fts4aux module is automatically
  included in all builds that include FTS.


  An fts4aux virtual table is constructed with one or two arguments.  When
  used with a single argument, that argument is the unqualified name of the
  FTS table that it will be used to access.  To access a table in a different
  database (for example, to create a TEMP fts4aux table that will access an
  FTS3 table in the MAIN database) use the two-argument form and give the
  name of the target database (ex: "main") in the first argument and the name
  of the FTS3/4 table as the second argument.  (The two-argument form of 
  fts4aux was added for SQLite version 3.7.17 (2013-05-20)
  and will throw an error in prior releases.)
  For example:

-- Create an FTS4 table
CREATE VIRTUAL TABLE ft USING fts4(x, y);

-- Create an fts4aux table to access the full-text index for table "ft"
CREATE VIRTUAL TABLE ft_terms USING fts4aux(ft);

-- Create a TEMP fts4aux table accessing the "ft" table in "main"
CREATE VIRTUAL TABLE temp.ft_terms_2 USING fts4aux(main,ft);



  For each term present in the FTS table, there are between 2 and N+1 rows
  in the fts4aux table, where N is the number of user-defined columns in
  the associated FTS table. An fts4aux table always has the same four columns, 
  as follows, from left to right:


  Column NameColumn Contents
  term 
    Contains the text of the term for this row.
  col 
    This column may contain either the text value '*' (i.e. a single 
    character, U+002a) or an integer between 0 and N-1, where N is
    again the number of user-defined columns in the corresponding FTS table.

  documents
    This column always contains an integer value greater than zero.
    
    If the "col" column contains the value '*', then this column
    contains the number of rows of the FTS table that contain at least one
    instance of the term (in any column). If col contains an integer
    value, then this column contains the number of rows of the FTS table that
    contain at least one instance of the term in the column identified by
    the col value. As usual, the columns of the FTS table are numbered
    from left to right, starting with zero.

  occurrences
    This column also always contains an integer value greater than zero.
    
    If the "col" column contains the value '*', then this column
    contains the total number of instances of the term in all rows of the 
    FTS table (in any column). Otherwise, if col contains an integer
    value, then this column contains the total number of instances of the
    term that appear in the FTS table column identified by the col
    value.

  languageid (hidden)
    

    |This column determines which languageid is used to
    extract vocabulary from the FTS3/4 table.
    
    The default value for languageid is 0.  If an alternative language
    is specified in WHERE clause constraints, then that alternative is
    used instead of 0.  There can only be a single languageid per query.
    In other words, the WHERE clause cannot contain a range constraint
    or IN operator on the languageid.



  For example, using the tables created above:

INSERT INTO ft(x, y) VALUES('Apple banana', 'Cherry');
INSERT INTO ft(x, y) VALUES('Banana Date Date', 'cherry');
INSERT INTO ft(x, y) VALUES('Cherry Elderberry', 'Elderberry');

-- The following query returns this data:
--
--     apple       |  *  |  1  |  1
--     apple       |  0  |  1  |  1
--     banana      |  *  |  2  |  2
--     banana      |  0  |  2  |  2
--     cherry      |  *  |  3  |  3
--     cherry      |  0  |  1  |  1
--     cherry      |  1  |  2  |  2
--     date        |  *  |  1  |  2
--     date        |  0  |  1  |  2
--     elderberry  |  *  |  1  |  2
--     elderberry  |  0  |  1  |  1
--     elderberry  |  1  |  1  |  1
--
SELECT term, col, documents, occurrences FROM ft_terms;



  In the example, the values in the "term" column are all lower case, 
  even though they were inserted into table "ft" in mixed case. This is because
  an fts4aux table contains the terms as extracted from the document text
  by the tokenizer. In this case, since table "ft" uses the 
  simple tokenizer, this means all terms have been folded to
  lower case. Also, there is (for example) no row with column "term"
  set to "apple" and column "col" set to 1. Since there are no instances
  of the term "apple" in column 1, no row is present in the fts4aux table.


  During a transaction, some of the data written to an FTS table may be 
  cached in memory and written to the database only when the transaction is 
  committed. However the implementation of the fts4aux module is only able 
  to read data from the database. In practice this means that if an fts4aux 
  table is queried from within a transaction in which the associated 
  FTS table has been modified, the results of the query are likely to reflect 
  only a (possibly empty) subset of the changes made.


6. FTS4 Options


  If the "CREATE VIRTUAL TABLE" statement specifies module FTS4 (not FTS3), 
  then special directives - FTS4 options - similar to the "tokenize=*" option
  may also appear in place of column names. An FTS4 option consists of the
  option name, followed by an "=" character, followed by the option value.
  The option value may optionally be enclosed in single or double quotes, with
  embedded quote characters escaped in the same way as for SQL literals. There
  may not be whitespace on either side of the "=" character. For example,
  to create an FTS4 table with the value of option "matchinfo" set to "fts3":

-- Create a reduced-footprint FTS4 table.
CREATE VIRTUAL TABLE papers USING fts4(author, document, matchinfo=fts3);



  FTS4 currently supports the following options:


  OptionInterpretation
  compress
    The compress option is used to specify the compress function. It is an error to
    specify a compress function without also specifying an uncompress
    function. See below for details.

  content
    The content allows the text being indexed to be
    stored in a separate table distinct from the FTS4 table,
    or even outside of SQLite.

  languageid
    The languageid option causes the FTS4 table to have an additional hidden
    integer column that identifies the language of the text contained in
    each row.  The use of the languageid option allows the same FTS4 table
    to hold text in multiple languages or scripts, each with different tokenizer
    rules, and to query each language independently of the others.
    
  matchinfo 
    When set to the value "fts3", the matchinfo option reduces the amount of
    information stored by FTS4 with the consequence that the "l" option of
    matchinfo() is no longer available.

  notindexed 
    This option is used to }specify the name of a column for which data is
    not indexed. Values stored in columns that are not indexed are not
    matched by MATCH queries. Nor are they recognized by auxiliary functions.
    A single CREATE VIRTUAL TABLE statement may have any number of notindexed 
    options.

  order
    

    The "order" option may be set to either "DESC" or "ASC" (in upper or
    lower case). If it is set to "DESC", then FTS4 stores its data in such
    a way as to optimize returning results in descending order by docid.
    If it is set to "ASC" (the default), then the data structures are 
    optimized for returning results in ascending order by docid.  In other
    words, if many of the queries run against the FTS4 table use "ORDER BY
    docid DESC", then it may improve performance to add the "order=desc" 
    option to the CREATE VIRTUAL TABLE statement.

  prefix
    This option may be set to a comma-separated list of positive non-zero 
    integers. For each integer N in the list, a separate index is created
    in the database file to optimize prefix queries where
    the query term is N bytes in length, not including the '*' character,
    when encoded using UTF-8. See below for details.

  uncompress
    This option is used to specify the uncompress function. It is an error to
    specify an uncompress function without also specifying a compress
    function. See below for details.



  When using FTS4, specifying a column name that contains an "=" character
  and is not either a "tokenize=*" specification or a recognized FTS4 option
  is an error. With FTS3, the first token in the unrecognized directive is 
  interpreted as a column name. Similarly, specifying multiple "tokenize=*"
  directives in a single table declaration is an error when using FTS4, whereas
  the second and subsequent "tokenize=*" directives are interpreted as column
  names by FTS3. For example:

-- An error. FTS4 does not recognize the directive "xyz=abc".
CREATE VIRTUAL TABLE papers USING fts4(author, document, xyz=abc);

-- Create an FTS3 table with three columns - "author", "document"
-- and "xyz".
CREATE VIRTUAL TABLE papers USING fts3(author, document, xyz=abc);

-- An error. FTS4 does not allow multiple tokenize=* directives
CREATE VIRTUAL TABLE papers USING fts4(tokenize=porter, tokenize=simple);

-- Create an FTS3 table with a single column named "tokenize". The
-- table uses the "porter" tokenizer.
CREATE VIRTUAL TABLE papers USING fts3(tokenize=porter, tokenize=simple);

-- An error. Cannot create a table with two columns named "tokenize".
CREATE VIRTUAL TABLE papers USING fts3(tokenize=porter, tokenize=simple, tokenize=icu);





6.1. The compress= and uncompress= options


  The compress and uncompress options allow FTS4 content to be stored in
  the database in a compressed form. Both options should be set to the name
  of an SQL scalar function registered using sqlite3_create_function()
  that accepts a single argument. 


  The compress function should return a compressed version of the value 
  passed to it as an argument. Each time data is written to the FTS4 table, 
  each column value is passed to the compress function and the result value 
  stored in the database. The compress function may return any type of SQLite 
  value (blob, text, real, integer or null).


  The uncompress function should uncompress data previously compressed by
  the compress function. In other words, for all SQLite values X, it should
  be true that uncompress(compress(X)) equals X. When data that has been
  compressed by the compress function is read from the database by FTS4, it
  is passed to the uncompress function before it is used.


  If the specified compress or uncompress functions do not exist, the table
  may still be created. An error is not returned until the FTS4 table is
  read (if the uncompress function does not exist) or written (if it is the 
  compress function that does not exist).

-- Create an FTS4 table that stores data in compressed form. This
-- assumes that the scalar functions zip() and unzip() have been (or
-- wil~l be) added to the database handle.
CREATE VIRTUAL TABLE papers USING fts4(author, document, compress=zip, uncompress=unzip);



  When implementing the compress and uncompress functions it is important to
  pay attention to data types. Specifically, when a user reads a value from
  a compressed FTS table, the value returned by FTS is exactly the same
  as the value returned by the uncompress function, including the data type.
  If that data type is not the same as the data type of the original value as
  passed to the compress function (for example if the uncompress function is
  returning BLOB when compress was originally passed TEXT), then the users
  query may not function as expected.




6.2. The content= option 


  The content option allows FTS4 to forego storing the text being indexed.
  The content option can be used in two ways:


 The indexed documents are not stored within the SQLite database 
        at all (a "contentless" FTS4 table), or

 The indexed documents are stored in a database table created and
        managed by the user (an "external content" FTS4 table).



  Because the indexed documents themselves are usually much larger than 
  the full-text index, the content option can be used to achieve 
  significant space savings.


6.2.1.  Contentless FTS4 Tables 


  In order to create an FTS4 table that does not store a copy of the indexed
  documents at all, the content option should be set to an empty string.
  For example, the following SQL creates such an FTS4 table with three
  columns - "a", "b", and "c":

CREATE VIRTUAL TABLE t1 USING fts4(content="", a, b, c);



  Data can be inserted into such an FTS4 table using an INSERT statements.
  However, unlike ordinary FTS4 tables, the user must supply an explicit
  integer docid value. For example:

-- This statement is Ok:
INSERT INTO t1(docid, a, b, c) VALUES(1, 'a b c', 'd e f', 'g h i');

-- This statement causes an error, as no docid value has been provided:
INSERT INTO t1(a, b, c) VALUES('j k l', 'm n o', 'p q r');



  It is not possible to UPDATE or DELETE a row stored in a contentless FTS4
  table. Attempting to do so is an error.


  Contentless FTS4 tables also support SELECT statements. However, it is
  an error to attempt to retrieve the value of any table column other than
  the docid column. The auxiliary function matchinfo() may be used, but
  snippet() and offsets() may not. For example:

-- The following statements are Ok:
SELECT docid FROM t1 WHERE t1 MATCH 'xxx';
SELECT docid FROM t1 WHERE a MATCH 'xxx';
SELECT matchinfo(t1) FROM t1 WHERE t1 MATCH 'xxx';

-- The following statements all cause errors, as the value of columns
-- other than docid are required to evaluate them.
SELECT * FROM t1;
SELECT a, b FROM t1 WHERE t1 MATCH 'xxx';
SELECT docid FROM t1 WHERE a LIKE 'xxx%';
SELECT snippet(t1) FROM t1 WHERE t1 MATCH 'xxx';



  Errors related to attempting to retrieve column values other than docid
  are runtime errors that occur within sqlite3_step(). In some cases, for
  example if the MATCH expression in a SELECT query matches zero rows, there
  may be no error at all even if a statement does refer to column values 
  other than docid.


6.2.2.  External Content FTS4 Tables 


  An "external content" FTS4 table is similar to a contentless table, except
  that if evaluation of a query requires the value of a column other than 
  docid, FTS4 attempts to retrieve that value from a table (or view, or 
  virtual table) nominated by the user (hereafter referred to as the "content
  table"). The FTS4 module never writes to the content table, and writing
  to the content table does not affect the full-text index. It is the
  responsibility of the user to ensure that the content table and the 
  full-text index are consistent.


  An external content FTS4 table is created by setting the content option
  to the name of a table (or view, or virtual table) that may be queried by
  FTS4 to retrieve column values when required. If the nominated table does
  not exist, then an external content table behaves in the same way as
  a contentless table. For example:

CREATE TABLE t2(id INTEGER PRIMARY KEY, a, b, c);
CREATE VIRTUAL TABLE t3 USING fts4(content="t2", a, c);



  Assuming the nominated table does exist, then its columns must be the same 
  as or a superset of those defined for the FTS table.  The external table
  must also be in the same database file as the FTS table.  In other words,
  The external table cannot be in a different database file connected using
  ATTACH nor may one of the FTS table and the external content be in the
  TEMP database when the other is in a persistent database file such as MAIN.


  When a users query on the FTS table requires a column value other than
  docid, FTS attempts to read the requested value from the corresponding column of
  the row in the content table with a rowid value equal to the current FTS
  docid. Only the subset of content-table columns duplicated in the FTS/34
  table declaration can be queried for - to retrieve values from any other
  columns the content table must be queried directly. Or, if such a row cannot
  be found in the content table, a NULL value is used instead. For example:

CREATE TABLE t2(id INTEGER PRIMARY KEY, a, b, c);
CREATE VIRTUAL TABLE t3 USING fts4(content="t2", b, c);

INSERT INTO t2 VALUES(2, 'a b', 'c d', 'e f');
INSERT INTO t2 VALUES(3, 'g h', 'i j', 'k l');
INSERT INTO t3(docid, b, c) SELECT id, b, c FROM t2;
-- The following query returns a single row with two columns containing
-- the text values "i j" and "k l".
--
-- The query uses the full-text index to discover that the MATCH 
-- term matches the row with docid=3. It then retrieves the values
-- of columns b and c from the row with rowid=3 in the content table
-- to return.
--
SELECT * FROM t3 WHERE t3 MATCH 'k';

-- Following the UPDATE, the query still returns a single row, this
-- time containing the text values "xxx" and "yyy". This is because the
-- full-text index still indicates that the row with docid=3 matches
-- the FTS4 query 'k', even though the documents stored in the content
-- table have been modified.
--
UPDATE t2 SET b = 'xxx', c = 'yyy' WHERE rowid = 3;
SELECT * FROM t3 WHERE t3 MATCH 'k';

-- Following the DELETE below, the query returns one row containing two
-- NULL values. NULL values are returned because FTS is unable to find
-- a row with rowid=3 within the content table.
--
DELETE FROM t2;
SELECT * FROM t3 WHERE t3 MATCH 'k';



  When a row is deleted from an external content FTS4 table, FTS4 needs to
  retrieve the column values of the row being deleted from the content table.
  This is so that FTS4 can update the full-text index entries for each token
  that occurs within the deleted row to indicate that row has been 
  deleted. If the content table row cannot be found, or if it contains values
  inconsistent with the contents of the FTS index, the results can be difficult
  to predict. The FTS index may be left containing entries corresponding to the
  deleted row, which can lead to seemingly nonsensical results being returned
  by subsequent SELECT queries. The same applies when a row is updated, as
  internally an UPDATE is the same as a DELETE followed by an INSERT.


  This means that in order to keep an FTS in sync with an external content
  table, any UPDATE or DELETE operations must be applied first to the FTS
  table, and then to the external content table. For example:

CREATE TABLE t1_real(id INTEGER PRIMARY KEY, a, b, c, d);
CREATE VIRTUAL TABLE t1_fts USING fts4(content="t1_real", b, c);

-- This works. When the row is removed from the FTS table, FTS retrieves 
-- the row with rowid=123 and tokenizes it in order to determine the entries 
-- that must be removed from the full-text index.
-- 
DELETE FROM t1_fts WHERE rowid = 123;
DELETE FROM t1_real WHERE rowid = 123;

-- This does not work. By the time the FTS table is updated, the row
-- has already been deleted from the underlying content table. As a result
-- FTS is unable to determine the entries to remove from the FTS index and
-- so the index and content table are left out of sync.
--
DELETE FROM t1_real WHERE r€owid = 123;
DELETE FROM t1_fts WHERE rowid = 123;


  
  Instead of writing separately to the full-text index and the content table,
  some users may wish to use database triggers to keep the full-text index
  up to date with respect to the set of documents stored in the content table.
  For example, using the tables from earlier examples:

CREATE TRIGGER t2_bu BEFORE UPDATE ON t2 BEGIN
  DELETE FROM t3 WHERE docid=old.rowid;
END;
CREATE TRIGGER t2_bd BEFORE DELETE ON t2 BEGIN
  DELETE FROM t3 WHERE docid=old.rowid;
END;

CREATE TRIGGER t2_au AFTER UPDATE ON t2 BEGIN
  INSERT INTO t3(docid, b, c) VALUES(new.rowid, new.b, new.c);
END;
CREATE TRIGGER t2_ai AFTER INSERT ON t2 BEGIN
  INSERT INTO t3(docid, b, c) VALUES(new.rowid, new.b, new.c);
END;



  The DELETE trigger must be fired before the actual delete takes place
  on the content table. This is so that FTS4 can still retrieve the original
  values in order to update the full-text index. And the INSERT trigger must
  be fired after the new row is inserted, so as to handle the case where the
  rowid is assigned automatically within the system. The UPDATE trigger must
  be split into two parts, one fired before and one after the update of the
  content table, for the same reasons.


  The FTS4 "rebuild" command
  deletes the entire full-text index and rebuilds it based on the current
  set of documents in the content table. Assuming again that "t3" is the
  name of the external content FTS4 table, the rebuild command looks like this:

INSERT INTO t3(t3) VALUES('rebuild');



  This command may also be used with ordinary FTS4 tables, for example if
  the implementation of the tokenizer changes.  It is an
  error to attempt to rebuild the full-text index maintained by a contentless
  FTS4 table, since no content will be available to do the rebuilding.





6.3. The languageid= option


  When the languageid option is present, it specifies the name of
  another hidden column that is added to the FTS4
  table and which is used to specify the language stored in each row
  of the FTS4 table.  The name of the languageid hidden column must
  be distinct from all other column names in the FTS4 table.  Example:

CREATE VIRTUAL TABLE t1 USING fts4(x, y, languageid="lid")



  The default value of a languageid column is 0. Any value inserted
  into a languageid column is converted to a 32-bit (not 64) signed
  integer.


  By default, FTS queries (those that use the MATCH operator)
  consider only those rows with the languageid column set to 0. To
  query for rows with other languageid values, a constraint of the
  form " = " must be added to the queries
  WHERE clause. For example:

SELECT * FROM t1 WHERE t1 MATCH 'abc' AND lid=5;



  It is not possible for a single FTS query to return rows with
  different languageid values. The results of adding WHERE clauses
  that use other operators (e.g.  lid!=5, or lid&lt;=5) are undefined.


  If the content option is used along with the languageid option,
  then the named languageid column must exist in the content= table
  (subject to the usual rules - if a query never needs to read the
  content table then this restriction does not apply).


  When the languageid option is used, SQLite invokes the xLanguageid()
  on the sqlite3_tokenizer_module object immediately after the object
  is created in order to pass in the language id that the
  tokenizer should use.  The xLanguageid() method will never be called
  more than once for any single tokenizer object.  The fact that different
  languages might be tokenized differently is one reason why no single
  FTS query can return rows with different languageid values.
  





6.4. The matchinfo= option


  The matchinfo option may only be set to the value "fts3". 
  Attempting to set matchinfo to anything other than "fts3" is an error.
  If this option is specified, then some of the extra information stored by
  FTS4 is omitted. This reduces the amount of disk space consumed by
  an FTS4 table until it is almost the same as the amount that would
  be used by the equivalent FTS3 table, but also means that the data
  accessed by passing the 'l' flag to the matchinfo() function is
  not available. 




6.5. The notindexed= option


  Normally, the FTS module maintains an inverted index of all terms in
  all columns of the table. This option is used to specify the name of
  a column for which entries should not be added to the index. Multiple
  "notindexed" options may be used to specify that multiple columns should
  be omitted from the index. For example:

-- Create an FTS4 table for which only the contents of columns c2 and c4
-- are tokenized and added to the inverted index.
CREATE VIRTUAL TABLE t1 USING fts4(c1, c2, c3, c4, notindexed=c1, notindexed=c3);



  Values stored in unindexed columns are not eligible to match MATCH 
  operators. They do not influence the results of the offsets() or matchinfo()
  auxiliary functions. Nor will the snippet() function ever return a
  snippet based on a value stored in an unindexed column.




6.6. The prefix= option


  The FTS4 prefix option causes FTS to index term prefixes of specified lengths
  in the same way that it always indexes complete terms.  The prefix option
  must be set to a comma separated list of positive non-zero integers. 
  For each value N in the list, prefixes of length N bytes (when encoded 
  using UTF-8) are indexed.  FTS4 uses term prefix indexes to speed up
  prefix queries. The cost, of course, is that indexing term prefixes as
  well as complete terms increases the database size and slows down write 
  operations on the FTS4 table.


  Prefix indexes may be used to optimize prefix queries in two cases.
  If the query is for a prefix of N bytes, then a prefix index created
  with "prefix=N" provides the best optimization. Or, if no "prefix=N"
  index is available, a "prefix=N+1" index may be used instead. 
  Using a "prefix=N+1" index is less
  efficient than a "prefix=N" index, but is better than no prefix index at all.

-- Create an FTS4 table with indexes to optimize 2 and 4 byte prefix queries.
CREATE VIRTUAL TABLE t1 USING fts4(c1, c2, prefix="2,4");

-- The following two queries are both optimized using the prefix indexes.
SELECT * FROM t1 WHERE t1 MATCH 'ab*';
SELECT * FROM t1 WHERE t1 MATCH 'abcd*';

-- The following two queries are both partially optimized using the prefix
-- indexes. The optimization is not as pronounced as it is for the queries
-- above, but still an improvement over no prefix indexes at all.
SELECT * FROM t1 WHERE t1 MATCH 'a*';
SELECT * FROM t1 WHERE t1 MATCH 'abc*';





7. Special Commands For FTS3 and FTS4


  Special INSERT operates can be used to issue commands to FTS3 and FTS4 tables.
  Every FTS3 and FTS4 has a hidden, read-only column which is the same name as
  the table itself.  INSERTs into this hidden column are interpreted as commands
  to the FTS3/4 table.  For a table with the name "xyz" the following commands
  are supported:


INSERT INTO xyz(xyz) VALUES('optimize');
INSERT INTO xyz(xyz) VALUES('rebuild');
INSERT INTO xyz(xyz) VALUES('integrity-check');
INSERT INTO xyz(xyz) VALUES('merge=X,Y');
INSERT INTO xyz(xyz) VALUES('automerge=N');




7.1. The "optimize" command


  The "optimize" command causes FTS3/4 to merge together all of its
  inverted index b-trees into one large and complete b-tree.  Doing
  an optimize will make subsequent queries run faster since there are
  fewer b-trees to search, and it may reduce disk usage by coalescing
  redundant entries.  However, for a large FTS table, running optimize
  can be as expensive as running VACUUM.  The optimize command
  essentially has to read and write the entire FTS table, resulting
  in a large transaction.


  In batch-mode operation, where an FTS table is initially built up
  using a large number of INSERT operations, then queried repeatedly
  without further changes, it is often a good idea
  to run "optimize" after the last INSERT and before the first query.



7.2. The "rebuild" command


  The "rebuild" command causes SQLite to discard the entire FTS3/4
  table and then rebuild it again from original text.  The concept
  ‚is similar to REINDEX, only that it applies to an
  FTS3/4 table instead of an ordinary index.


  The "rebuild" command should be run whenever the implementation
  of a custom tokenizer changes, so that all content can be retokenized.
  The "rebuild" command is also useful when using the
  FTS4 content option after changes have been made to the original
  content table.



7.3. The "integrity-check" command


  The "integrity-check" command causes SQLite to read and verify
  the accuracy of all inverted indices in an FTS3/4 table by comparing
  those inverted indices against the original content. The 
  "integrity-check" command silently succeeds if the inverted
  indices are all ok, but will fail with an SQLITE_CORRUPT error
  if any problems are found.


  The "integrity-check" command is similar in concept to
 PRAGMA integrity_check.  In a working system, the "integrity-command"
 should always be successful.  Possible causes of integrity-check
 failures include:
  
   The application has made changes to the FTS shadow tables
       directly, without using the FTS3/4 virtual table, causing
       the shadow tables to become out of sync with each other.
   Using the FTS4 content option and failing to manually keep
       the content in sync with the FTS4 inverted indices.
   Bugs in the FTS3/4 virtual table.  (The "integrity-check"
       command was original conceived as part of the test suite
       for FTS3/4.)
   Corruption to the underlying SQLite database file.  (See
       documentation on how to corrupt and SQLite database for
       additional information.)
  



7.4. The "merge=X,Y" command


  The "merge=X,Y" command (where X and Y are integers) causes SQLite
  to do a limited amount of work toward merging the various inverted
  index b-trees of an FTS3/4 table together into one large b-tree.
  The X value is the target number of "blocks" to be merged, and Y is
  the minimum number of b-tree segments on a level required before
  merging will be applied to that level.  The value of Y should
  be between 2 and 16 with a recommended value of 8.  The value of X
  can be any positive integer but values on the order of 100 to 300
  are recommended.


  When an FTS table accumulates 16 b-tree segments at the same level,
  the next INSERT into that table will cause all 16 segments to be
  merged into a single b-tree segment at the next higher level.  The
  effect of these level merges is that most INSERTs into an FTS table
  are very fast and take minimal memory, but an occasional INSERT is
  slow and generates a large transaction because of the need to
  do merging. This results in "spiky" performance of INSERTs.


  To avoid spiky INSERT performance, an application can run the
  "merge=X,Y" command periodically, possibly in an idle thread or
  idle process, to ensure that the FTS table never accumulates
  too many b-tree segments at the same level.  INSERT performance
  spikes can generally be avoided, and performance of FTS3/4 can be
  maximized, by running "merge=X,Y" after every few thousand
  document inserts.  Each "merge=X,Y" command will run in a separate
  transaction (unless they are grouped together using BEGIN...COMMIT,
  of course).  The transactions can be kept small by choosing a value
  for X in the range of 100 to 300.  The idle thread that is running
  the merge commands can know when it is done by checking the difference
  in sqlite3_total_changes() before and after each "merge=X,Y"
  command and stopping the loop when the difference drops below two.



7.5. The "automerge=N" command


  The "automerge=N" command (where N is an integer between 0 and 15,
  inclusive) is used to configure an FTS3/4 tables "automerge" parameter,
  which controls automatic incremental inverted index merging. The default 
  automerge value for new tables is 0, meaning that automatic incremental 
  merging is completely disabled. If the value of the automerge parameter
  is modified using the "automerge=N" command, the new parameter value is
  stored persistently in the database and is used by all subsequently
  esƒtablished database connections.


  Setting the automerge parameter to a non-zero value enables automatic
  incremental merging. This causes SQLite to do a small amount of inverted 
  index merging after every INSERT operation. The amount of merging 
  performed is designed so that the FTS3/4 table never reaches a point 
  where it has 16 segments at the same level and hence has to do a large 
  merge in order to complete an insert.  In other words, automatic 
  incremental merging is designed to prevent spiky INSERT performance.


  The downside of automatic incremental merging is that it makes
  every INSERT, UPDATE, and DELETE operation on an FTS3/4 table run
  a little slower, since extra time must be used to do the incremental
  merge.  For maximum performance, it is recommended that applications
  disable automatic incremental merge and instead use the 
  "merge" command in an idle process to keep the inverted indices
  well merged.  But if the structure of an application does not easily
  allow for idle processes, the use of automatic incremental merge is
  a very reasonable fallback solution.


  The actual value of the automerge parameter determines the number of
  index segments merged simultaneously by an automatic inverted index
  merge. If the value is set to N, the system waits until there are at
  least N segments on a single level before beginning to incrementally
  merge them. Setting a lower value of N causes segments to be merged more
  quickly, which may speed up full-text queries and, if the workload 
  contains UPDATE or DELETE operations as well as INSERTs, reduce the space
  on disk consumed by the full-text index. However, it also increases the
  amount of data written to disk.


  For general use in cases where the workload contains few UPDATE or DELETE
  operations, a good choice for automerge is 8. If the workload contains
  many UPDATE or DELETE commands, 
  or if query speed is a concern, it may be advantageous to reduce automerge
  to 2.


  For reasons of backwards compatibility, the "automerge=1" command sets
  the automerge parameter to 8, not 1 (a value of 1 would make no sense 
  anyway, as merging data from a single segment is a no-op).



8. Tokenizers


  An FTS tokenizer is a set of rules for extracting terms from a document 
  or basic FTS full-text query. 


  Unless a specific tokenizer is specified as part of the CREATE 
  VIRTUAL TABLE statement used to create the FTS table, the default 
  tokenizer, "simple", is used. The simple tokenizer extracts tokens from
  a document or basic FTS full-text query according to the following 
  rules:


   A term is a contiguous sequence of eligible characters, where 
    eligible characters are all alphanumeric characters and all characters with
    Unicode codepoint values greater than or equal to 128.
    All other characters are
    discarded when splitting a document into terms. Their only contribution is
    to separate adjacent terms.

   All uppercase characters within the ASCII range (Unicode codepoints
    less than 128), are transformed to their lowercase equivalents as part
    of the tokenization process. Thus, full-text queries are
    case-insensitive when using the simple tokenizer.



  For example, when a document containing the text "Right now, they're very
  frustrated.", the terms extracted from the document and added to the 
  full-text index are, in order, "right now they re very frustrated". Such
  a document would match a full-text query such as "MATCH 'Frustrated'", 
  as the simple tokenizer transforms the term in the query to lowercase
  before searching the full-text index.


  As well as the "simple" tokenizer, the FTS source code features a tokenizer 
  that uses the Porter 
  Stemming algorithm. This tokenizer uses the same rules to separate
  the input document into terms including folding all terms into lower case,
  but also uses the Porter Stemming algorithm to reduce related English language
  words to a common root. For example, using the same input document as in the
  paragraph above, the porter t„okenizer extracts the following tokens:
  "right now thei veri frustrat". Even though some of these terms are not even
  English words, in some cases using them to build the full-text index is more
  useful than the more intelligible output produced by the simple tokenizer.
  Using the porter tokenizer, the document not only matches full-text queries
  such as "MATCH 'Frustrated'", but also queries such as "MATCH 'Frustration'",
  as the term "Frustration" is reduced by the Porter stemmer algorithm to 
  "frustrat" - just as "Frustrated" is. So, when using the porter tokenizer,
  FTS is able to find not just exact matches for queried terms, but matches
  against similar English language terms. For more information on the 
  Porter Stemmer algorithm, please refer to the page linked above.


  Example illustrating the difference between the "simple" and "porter"
  tokenizers:

-- Create a table using the simple tokenizer. Insert a document into it.
CREATE VIRTUAL TABLE simple USING fts3(tokenize=simple);
INSERT INTO simple VALUES('Right now they''re very frustrated');

-- The first of the following two queries matches the document stored in
-- table "simple". The second does not.
SELECT * FROM simple WHERE simple MATCH 'Frustrated';
SELECT * FROM simple WHERE simple MATCH 'Frustration';

-- Create a table using the porter tokenizer. Insert the same document into it
CREATE VIRTUAL TABLE porter USING fts3(tokenize=porter);
INSERT INTO porter VALUES('Right now they''re very frustrated');

-- Both of the following queries match the document stored in table "porter".
SELECT * FROM porter WHERE porter MATCH 'Frustrated';
SELECT * FROM porter WHERE porter MATCH 'Frustration';



  If this extension is compiled with the SQLITE_ENABLE_ICU pre-processor
  symbol defined, then there exists a built-in tokenizer named "icu"
  implemented using the ICU library. The first argument passed to the
  xCreate() method (see fts3_tokenizer.h) of this tokenizer may be
  an ICU locale identifier. For example "tr_TR" for Turkish as used
  in Turkey, or "en_AU" for English as used in Australia. For example:

CREATE VIRTUAL TABLE thai_text USING fts3(text, tokenize=icu th_TH)



  The ICU tokenizer implementation is very simple. It splits the input
  text according to the ICU rules for finding word boundaries and discards
  any tokens that consist entirely of white-space. This may be suitable
  for some applications in some locales, but not all. If more complex
  processing is required, for example to implement stemming or
  discard punctuation, this can be done by creating a tokenizer
  implementation that uses the ICU tokenizer as part of its implementation.




  The "unicode61" tokenizer is available beginning with SQLite version 3.7.13
  (2012-06-11).
  Unicode61 works very much like "simple" except that it does simple unicode
  case folding according to rules in Unicode Version 6.1 and it recognizes
  unicode space and punctuation characters and uses those to separate tokens.
  The simple tokenizer only does case folding of ASCII characters and only
  recognizes ASCII space and punctuation characters as token separators.


  By default, "unicode61" attempts to remove diacritics from Latin script
  characters. This behaviour can be overridden by adding the tokenizer argument
  "remove_diacritics=0". For example:

-- Create tables that remove alldiacritics from Latin script characters
-- as part of tokenization.
CREATE VIRTUAL TABLE txt1 USING fts4(tokenize=unicode61);
CREATE VIRTUAL TABLE txt2 USING fts4(tokenize=unicode61 "remove_diacritics=2");

-- Create a table that does not remove diacritics from Latin script
-- characters as part of tokenization.
CREATE VIRTUAL TABLE txt3 USING fts4(tokenize=unicode61 "remove_diacritics=0");


The remove_diacritics option may be set to "0", "1" or "2". The default
   value is "1".  If it is set to "1" or "2", then diacritics are removed from
   Latin script characters as described above. However, if it is set to "1",
   then diacritics are not removed in the fairly uncommon case where a single
   unic…ode codepoint is used to represent a character with more that one
   diacritic. For example, diacritics are not removed from codepoint 0x1ED9
   ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW"). This is technically
   a bug, but cannot be fixed without creating backwards compatibility
   problems. If this option is set to "2", then diacritics are correctly
   removed from all Latin characters.


  It is also possible to customize the set of codepoints that unicode61 treats
  as separator characters. The "separators=" option may be used to specify one
  or more extra characters that should be treated as separator characters, and
  the "tokenchars=" option may be used to specify one or more extra characters
  that should be treated as part of tokens instead of as separator characters.
  For example:

-- Create a table that uses the unicode61 tokenizer, but considers "."
-- and "=" characters to be part of tokens, and capital "X" characters to
-- function as separators.
CREATE VIRTUAL TABLE txt3 USING fts4(tokenize=unicode61 "tokenchars=.=" "separators=X");

-- Create a table that considers space characters (codepoint 32) to be
-- a token character
CREATE VIRTUAL TABLE txt4 USING fts4(tokenize=unicode61 "tokenchars= ");



  If a character specified as part of the argument to "tokenchars=" is considered
  to be a token character by default, it is ignored. This is true even if it has
  been marked as a separator by an earlier "separators=" option. Similarly, if
  a character specified as part of a "separators=" option is treated as a separator
  character by default, it is ignored. If multiple "tokenchars=" or "separators="
  options are specified, all are processed. For example:

-- Create a table that uses the unicode61 tokenizer, but considers "."
-- and "=" characters to be part of tokens, and capital "X" characters to
-- function as separators. Both of the "tokenchars=" options are processed
-- The "separators=" option ignores the "." passed to it, as "." is by
-- default a separator character, even though it has been marked as a token
-- character by an earlier "tokenchars=" option.
CREATE VIRTUAL TABLE txt5 USING fts4(
    tokenize=unicode61 "tokenchars=." "separators=X." "tokenchars=="
);



  The arguments passed to the "tokenchars=" or "separators=" options are 
  case-sensitive. In the example above, specifying that "X" is a separator
  character does not affect the way "x" is handled.



8.1. Custom (Application Defined) Tokenizers


  In addition to providing built-in "simple", "porter" and (possibly) "icu" and
  "unicode61" tokenizers,
  FTS provides an interface for applications to implement and register custom
  tokenizers written in C.  The interface used to create a new tokenizer is defined
  and described in the fts3_tokenizer.h source file.


  Registering a new FTS tokenizer is similar to registering a new
  virtual table module with SQLite. The user passes a pointer to a
  structure containing pointers to various callback functions that
  make up the implementation of the new tokenizer type. For tokenizers,
  the structure (defined in fts3_tokenizer.h) is called
  "sqlite3_tokenizer_module".


  FTS does not expose a C-function that users call to register new
  tokenizer types with a database handle. Instead, the pointer must
  be encoded as an SQL blob value and passed to FTS through the SQL
  engine by evaluating a special scalar function, "fts3_tokenizer()".
  The fts3_tokenizer() function may be called with one or two arguments,
  as follows:

SELECT fts3_tokenizer(&lt;tokenizer-name&gt;);
SELECT fts3_tokenizer(&lt;tokenizer-name&gt;, &lt;sqlite3_tokenizer_module ptr&gt;);



  Where &lt;tokenizer-name&gt; is parameter to which a string is bound using
  sqlite3_bind_text() where the string identifies the tokenizer and
  &lt;sqlite3_tokenizer_module ptr&gt; is a parameter to which a BLOB is
  bound using sqlite3_bind_blob() where the value of the BLOB is a
  pointer to an sqlite3_tokenizer_module structure.
  If the second argument is present,
  it is registered as tokenizer &lt;tokenizer-n†ame&gt; and a copy of it
  returned. If only one argument is passed, a pointer to the tokenizer
  implementation currently registered as &lt;tokenizer-name&gt; is returned,
  encoded as a blob. Or, if no such tokenizer exists, an SQL exception
  (error) is raised.


  Prior to SQLite version 3.11.0 (2016-02-15), the arguments to
  fts3_tokenizer() could be literal strings or BLOBs. They did not have to
  be bound parameters.  But that could lead to security problems in the
  event of an SQL injection.  Hence, the legacy behavior is now disabled
  by default.  But the old legacy behavior can be enabled, for backwards
  compatibility in applications that really need it, 
  by calling
  sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,1,0).


  The following block contains an example of calling the fts3_tokenizer()
  function from C code:

/*
** Register a tokenizer implementation with FTS3 or FTS4.
*/
int registerTokenizer(
  sqlite3 *db,
  char *zName,
  const sqlite3_tokenizer_module *p
){
  int rc;
  sqlite3_stmt *pStmt;
  const char *zSql = "SELECT fts3_tokenizer(?1, ?2)";

  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);
}

/*
** Query FTS for the tokenizer implementation named zName.
*/
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 ){
      memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp));
    }
  }

  return sqlite3_finalize(pStmt);
}





8.2. Querying Tokenizers

The "fts3tokenize" virtual table can be used to directly access any
   tokenizer.  The following SQL demonstrates how to create an instance 
   of the fts3tokenize virtual table:

CREATE VIRTUAL TABLE tok1 USING fts3tokenize('porter');


The name of the desired tokenizer should be substituted in place of
   'porter' in the example, of course.  If the tokenizer requires one or
   more arguments, they should be separated by commas in the fts3tokenize
   declaration (even though they are separated by spaces in declarations
   of regular fts4 tables). The following creates fts4 and fts3tokenize
   tables that use the same tokenizer:
CREATE VIRTUAL TABLE text1 USING fts4(tokenize=icu en_AU);
CREATE VIRTUAL TABLE tokens1 USING fts3tokenize(icu, en_AU);

CREATE VIRTUAL TABLE text2 USING fts4(tokenize=unicode61 "tokenchars=@." "separators=123");
CREATE VIRTUAL TABLE tokens2 USING fts3tokenize(unicode61, "tokenchars=@.", "separators=123");

   

   Once the virtual table is created, it can be queried as follows:

SELECT token, start, end, position 
  FROM tok1
 WHERE input='This is a test sentence.';


The virtual table will return one row of output for each token in the
   input string.  The "token" column is the text of the token.  The "start"
   and "end" columns are the byte offset to the beginning and end of the
   token in the original input string.  
   The "position" column is the sequence number
   of the token in the original input string.  There is also an "input"
   column which is simply a copy of the input string that is specified in
   the WHERE clause.  Note that a constraint of the form "input=?" must
   appear in the WHERE clause or else the virtual table will have no input
   to tokenize and will return no rows.  The example above generates
   the following output:

thi|0|4|0
is|5|7|1
a|8|9|2
test|10|14|3
sentenc|15|23|4


Notice that the tokens in the result set from the fts3tokenize virtual
   table have been transformed according to the rules of the tokenizer.
   Since this example used the "porter" tokenizer, the "This" token wa‡s
   converted into "thi".  If the original text of the token is desired,
   it can be retrieved using the "start" and "end" columns with the
   substr() function.  For example:

SELECT substr(input, start+1, end-start), token, position
  FROM tok1
 WHERE input='This is a test sentence.';


The fts3tokenize virtual table can be used on any tokenizer, regardless
   of whether or not there exists an FTS3 or FTS4 table that actually uses
   that tokenizer.

 

9. Data Structures


  This section describes at a high-level the way the FTS module stores its
  index and content in the database. It is not necessary to read or 
  understand the material in this section in order to use FTS in an 
  application. However, it may be useful to application developers attempting 
  to analyze and understand FTS performance characteristics, or to developers 
  contemplating enhancements to the existing FTS feature set.





9.1. Shadow Tables

  For each FTS virtual table in a database, three to five real (non-virtual) tables
  are created to store the underlying data.  These real tables are called "shadow tables".
  The real tables are named "%_content",
  "%_segdir", "%_segments", "%_stat", and "%_docsize", where "%" is replaced by the name
  of the FTS virtual table.


  The leftmost column of the "%_content" table is an INTEGER PRIMARY KEY field
  named "docid". Following this is one column for each column of the FTS
  virtual table as declared by the user, named by prepending the column name
  supplied by the user with "cN", where N is the index of the 
  column within the table, numbered from left to right starting with 0. Data
  types supplied as part of the virtual table declaration are not used as
  part of the %_content table declaration. For example:

-- Virtual table declaration
CREATE VIRTUAL TABLE abc USING fts4(a NUMBER, b TEXT, c);

-- Corresponding %_content table declaration
CREATE TABLE abc_content(docid INTEGER PRIMARY KEY, c0a, c1b, c2c);



  The %_content table contains the unadulterated data inserted by the user 
  into the FTS virtual table by the user. If the user does not explicitly
  supply a "docid" value when inserting records, one is selected automatically
  by the system.


  The %_stat and %_docsize tables are only created if the FTS table uses the
  FTS4 module, not FTS3. Furthermore, the %_docsize table is omitted if the
  FTS4 table is created with the "matchinfo=fts3" directive
  specified as part of the CREATE VIRTUAL TABLE statement. If they are created,
  the schema of the two tables is as follows:
CREATE TABLE %_stat(
  id INTEGER PRIMARY KEY, 
  value BLOB
);

CREATE TABLE %_docsize(
  docid INTEGER PRIMARY KEY,
  size BLOB
);



  For each row in the FTS table, the %_docsize table contains a corresponding
  row with the same "docid" value. The "size" field contains a blob consisting
  of N FTS varints, where N is the number of user-defined columns
  in the table. Each varint in the "size" blob is the number of tokens in the
  corresponding column of the associated row in the FTS table. The %_stat table
  always contains a single row with the "id" column set to 0. The "value" 
  column contains a blob consisting of N+1 FTS varints, where N
  is again the number of user-defined columns in the FTS table. The first
  varint in the blob is set to the total number of rows in the FTS table. The
  second and subsequent varints contain the total number of tokens stored in
  the corresponding column for all rows of the FTS table.


  The two remaining tables, %_segments and %_segdir, are used to store the 
  full-text index. Conceptually, this index is a lookup table that maps each 
  term (word) to the set of docid values corresponding to records in the 
  %_content table that contain one or more occurrences of the term. To
  retrieve all documents that contain a specified term, the FTS module
  queries this index to determine the set of docid values for records that
  contain the term, then retrieves the required documents from the %_content
  table. Regardless of the schema of the FTS virtual tableˆ, the %_segments
  and %_segdir tables are always created as follows:

CREATE TABLE %_segments(
  blockid INTEGER PRIMARY KEY,       -- B-tree node id
  block blob                         -- B-tree node data
);

CREATE TABLE %_segdir(
  level INTEGER,
  idx INTEGER,
  start_block INTEGER,               -- Blockid of first node in %_segments
  leaves_end_block INTEGER,          -- Blockid of last leaf node in %_segments
  end_block INTEGER,                 -- Blockid of last node in %_segments
  root BLOB,                         -- B-tree root node
  PRIMARY KEY(level, idx)
);



  The schema depicted above is not designed to store the full-text index 
  directly. Instead, it is used to store one or more b-tree structures. There
  is one b-tree for each row in the %_segdir table. The %_segdir table
  row contains the root node and various meta-data associated with the
  b-tree structure, and the %_segments table contains all other (non-root)
  b-tree nodes. Each b-tree is referred to as a "segment". Once it has
  been created, a segment b-tree is never updated (although it may be
  deleted altogether).


  The keys used by each segment b-tree are terms (words). As well as the
  key, each segment b-tree entry has an associated "doclist" (document list).
  A doclist consists of zero or more entries, where each entry consists of:


   A docid (document id), and
   A list of term offsets, one for each occurrence of the term within
       the document. A term offset indicates the number of tokens (words)
       that occur before the term in question, not the number of characters
       or bytes. For example, the term offset of the term "war" in the
       phrase "Ancestral voices prophesying war!" is 3.



  Entries within a doclist are sorted by docid. Positions within a doclist
  entry are stored in ascending order.


  The contents of the logical full-text index is found by merging the
  contents of all segment b-trees. If a term is present in more than one
  segment b-tree, then it maps to the union of each individual doclist. If,
  for a single term, the same docid occurs in more than one doclist, then only
  the doclist that is part of the most recently created segment b-tree is 
  considered valid. 


  Multiple b-tree structures are used instead of a single b-tree to reduce
  the cost of inserting records into FTS tables. When a new record is 
  inserted into an FTS table that already contains a lot of data, it is
  likely that many of the terms in the new record are already present in
  a large number of existing records. If a single b-tree were used, then
  large doclist structures would have to be loaded from the database,
  amended to include the new docid and term-offset list, then written back
  to the database. Using multiple b-tree tables allows this to be avoided
  by creating a new b-tree which can be merged with the existing b-tree
  (or b-trees) later on. Merging of b-tree structures can be performed as
  a background task, or once a certain number of separate b-tree structures
  have been accumulated. Of course, this scheme makes queries more expensive
  (as the FTS code may have to look up individual terms in more than one
  b-tree and merge the results), but it has been found that in practice this
  overhead is often negligible.
  
9.2. Variable Length Integer (varint) Format


  Integer values stored as part of segment b-tree nodes are encoded using the
  FTS varint format. This encoding is similar, but not identical, to
  the SQLite varint format.


  An encoded FTS varint consumes between one and ten bytes of space. The
  number of bytes required is determined by the sign and magnitude of the
  integer value encoded. More accurately, the number of bytes used to store
  the encoded integer depends on the position of the most significant set bit
  in the 64-bit twos-complement representation of the integer value. Negative
  values always have the most significant bit set (the sign bit), and so are
  always stored using the full ten bytes. Positive integer values may be
  stored using less space.


‰  The final byte of an encoded FTS varint has its most significant bit 
  cleared. All preceding bytes have the most significant bit set. Data
  is stored in the remaining seven least significant bits of each byte.
  The first byte of the encoded representation contains the least significant
  seven bits of the encoded integer value. The second byte of the encoded
  representation, if it is present, contains the seven next least significant
  bits of the integer value, and so on. The following table contains examples
  of encoded integer values:


  DecimalHexadecimalEncoded Representation
  430x000000000000002B0x2B 
  2008150x000000000003106F0xEF 0xA0 0x0C
  -10xFFFFFFFFFFFFFFFF0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x01

  

9.3. Segment B-Tree Format


  Segment b-trees are prefix-compressed b+-trees. There is one segment b-tree
  for each row in the %_segdir table (see above). The root node of the segment
  b-tree is stored as a blob in the "root" field of the corresponding row
  of the %_segdir table. All other nodes (if any exist) are stored in the 
  "blob" column of the %_segments table. Nodes within the %_segments table are
  identified by the integer value in the blockid field of the corresponding
  row. The following table describes the fields of the %_segdir table:


  Column           Interpretation
  level             
    Between them, the contents of the "level" and "idx" fields define the
    relative age of the segment b-tree. The smaller the value stored in the
    "level" field, the more recently the segment b-tree was created. If two
    segment b-trees are of the same "level", the segment with the larger
    value stored in the "idx" column is more recent. The PRIMARY KEY constraint
    on the %_segdir table prevents any two segments from having the same value
    for both the "level" and "idx" fields.
  idx               See above.
  start_block      
    The blockid that corresponds to the node with the smallest blockid that 
    belongs to this segment b-tree. Or zero if the entire segment b-tree
    fits on the root node. If it exists, this node is always a leaf node.
  leaves_end_block 
    The blockid that corresponds to the leaf node with the largest blockid 
    that belongs to this segment b-tree. Or zero if the entire segment b-tree
    fits on the root node.
  end_block 
    This field may contain either an integer or a text field consisting of
    two integers separated by a space character (unicode codepoint 0x20).

    The first, or only, integer is the blockid that corresponds to the interior
    node with the largest blockid that belongs to this segment b-tree. Or zero
    if the entire segment b-tree fits on the root node. If it exists, this node
    is always an interior node.

    The second integer, if it is present, is the aggregate size of all data
    stored on leaf pages in bytes. If the value is negative, then the segment
    is the output of an unfinished incremental-merge operation, and the
    absolute value is current size in bytes.

  root             
    Blob containing the root node of the segment b-tree.



  Apart from the root node, the nodes that make up a single segment b-tree are
  always stored using a contiguous sequence of blockids. Furthermore, the
  nodes that make up a single level of the b-tree are themselves stored as
  a contiguous block, in b-tree order. The contiguous sequence of blockids
  used to store the b-tree leaves are allocated starting with the blockid
  value stored in the "start_block" column of the corresponding %_segdir row,
  and finishing at the blockid value stored in the "leaves_end_block"
  field of the same row. It is therefore possible to iterate through all the
  leaves of a segment b-tree, in key order, by traversing the %_segments 
  table in blockid order from "start_block" to "leaves_end_block".  

9.3.1. Segment B-Tree Leaf Nodes


  The following diagram depicts the format of a segment b-tree leaf node.


  
   Segment B-Tree Leaf Node Format



  The first term stored on each node ("Term 1" in the figure above) iŠs
  stored verbatim. Each subsequent term is prefix-compressed with respect
  to its predecessor. Terms are stored within a page in sorted (memcmp)
  order.

9.3.2. Segment B-Tree Interior Nodes


  The following diagram depicts the format of a segment b-tree interior 
  (non-leaf) node.


  
   Segment B-Tree Interior Node Format



9.4. Doclist Format


  A doclist consists of an array of 64-bit signed integers, serialized using
  the FTS varint format. Each doclist entry is made up of a series of two 
  or more integers, as follows:


   The docid value. The first entry in a doclist contains the literal docid
       value. The first field of each subsequent doclist entry contains the 
       difference between the new docid and the previous one (always a positive 
       number).
   Zero or more term-offset lists. A term-offset list is present for each
       column of the FTS virtual table that contains the term. A term-offset
       list consists of the following:
     
        Constant value 1. This field is omitted for any term-offset list
            associated with column 0.
        The column number (1 for the second leftmost column, etc.). This
            field is omitted for any term-offset list associated with column 0.
        A list of term-offsets, sorted from smallest to largest. Instead
            of storing the term-offset value literally, each integer stored 
            is the difference between the current term-offset and the previous 
            one (or zero if the current term-offset is the first), plus 2.
     
   Constant value 0.



  
   FTS3 Doclist Format



  
   FTS Doclist Entry Format



  For doclists for which the term appears in more than one column of the FTS
  virtual table, term-offset lists within the doclist are stored in column 
  number order. This ensures that the term-offset list associated with 
  column 0 (if any) is always first, allowing the first two fields of the
  term-offset list to be omitted in this case.


10. Limitations

10.1.  UTF-16 byte-order-mark problem 

For UTF-16 databases, when using the "simple" tokenizer, it is possible to use
malformed unicode strings to cause the 
integrity-check special command to falsely report
corruption, or for auxiliary functions to return
incorrect results. More specifically, the bug can be triggered by any of the following:


  A UTF-16 byte-order-mark (BOM) is embedded at the beginning of an SQL string
       literal value inserted into an FTS3 table. For example:

INSERT INTO fts_table(col) VALUES(char(0xfeff)||'text...');


  Malformed UTF-8 that SQLite converts to a UTF-16 byte-order-mark is
       embedded at the beginning of an SQL string literal value inserted 
       into an FTS3 table.

  A text value created by casting a blob that begins with the two
       bytes 0xFF and 0xFE, in either possible order, is inserted into an
       FTS3 table. For example:
       
INSERT INTO fts_table(col) VALUES(CAST(X'FEFF' AS TEXT));



Everything works correctly if any of the following are true:

 The database encoding is UTF-8.
 All text strings are insert using one of the
     sqlite3_bind_text() family of functions.
 Literal strings contain no byte-order-marks.
 A tokenizer is used that recognizes byte-order-marks
     as whitespace.  (The default "simple" tokenizer for
     FTS3/4 does not think that BOMs are whitespace, but
     the unicode tokenizer does.)

All of the above conditions must be false in order for problems
to occur.  And even if all of the conditiona above are false,
most things will still operator correctly.  Only the
integrity-check command and the
auxiliary functions might given
unexpected results.



  Appendix A: Search Application Tips



  FTS is primarily designed to support Boolean full-text queries - queries
  to find the set of documents that match a specified criteria. However, many 
  (most?) search applications require that results are somehow ranked in order
  of "relevance", where "relevance" is defined as the likelihood that the user
  who performed the search is interested in a specific‹ element of the returned
  set of documents. When using a search engine to find documents on the world
  wide web, the user expects that the most useful, or "relevant", documents 
  will be returned as the first page of results, and that each subsequent page 
  contains progressively less relevant results. Exactly how a machine can 
  determine document relevance based on a users query is a complicated problem
  and the subject of much ongoing research.


  One very simple scheme might be to count the number of instances of the 
  users search terms in each result document. Those documents that contain
  many instances of the terms are considered more relevant than those with
  a small number of instances of each term. In an FTS application, the 
  number of term instances in each result could be determined by counting
  the number of integers in the return value of the offsets function.
  The following example shows a query that could be used to obtain the
  ten most relevant results for a query entered by the user:

-- This example (and all others in this section) assumes the following schema
CREATE VIRTUAL TABLE documents USING fts3(title, content);

-- Assuming the application has supplied an SQLite user function named "countintegers"
-- that returns the number of space-separated integers contained in its only argument,
-- the following query could be used to return the titles of the 10 documents that contain
-- the greatest number of instances of the users query terms. Hopefully, these 10
-- documents will be those that the users considers more or less the most "relevant".
SELECT title FROM documents 
  WHERE documents MATCH &lt;query&gt;
  ORDER BY countintegers(offsets(documents)) DESC
  LIMIT 10 OFFSET 0



  The query above could be made to run faster by using the FTS matchinfo
  function to determine the number of query term instances that appear in each
  result. The matchinfo function is much more efficient than the offsets 
  function. Furthermore, the matchinfo function provides extra information
  regarding the overall number of occurrences of each query term in the entire
  document set (not just the current row) and the number of documents in which 
  each query term appears. This may be used (for example) to attach a higher
  weight to less common terms which may increase the overall computed relevancy 
  of those results the user considers more interesting.

-- If the application supplies an SQLite user function called "rank" that
-- interprets the blob of data returned by matchinfo and returns a numeric
-- relevancy based on it, then the following SQL may be used to return the
-- titles of the 10 most relevant documents in the dataset for a users query.
SELECT title FROM documents 
  WHERE documents MATCH &lt;query&gt;
  ORDER BY rank(matchinfo(documents)) DESC
  LIMIT 10 OFFSET 0



  The SQL query in the example above uses less CPU than the first example
  in this section, but still has a non-obvious performance problem. SQLite
  satisfies this query by retrieving the value of the "title" column and
  matchinfo data from the FTS module for every row matched by the users
  query before it sorts and limits the results. Because of the way SQLite's
  virtual table interface works, retrieving the value of the "title" column
  requires loading the entire row from disk (including the "content" field,
  which may be quite large). This means that if the users query matches
  several thousand documents, many megabytes of "title" and "content" data
  may be loaded from disk into memory even though they will never be used
  for any purpose. 


  The SQL query in the following example block is one solution to this 
  problem. In SQLite, when a sub-query 
  used in a join contains a LIMIT clause, the results of the sub-query are
  calculated and stored in temporary table before the main query is executed.
  This means that SQLite will load only the docid and matchinfo data for each
  row matching the users query into memory, determine the docid values
  corresponding to the ten most relevant documents, then lŒoad only the title
  and content information for those 10 documents only. Because both the matchinfo
  and docid values are gleaned entirely from the full-text index, this results
  in dramatically less data being loaded from the database into memory.

SELECT title FROM documents JOIN ( 
    SELECT docid, rank(matchinfo(documents)) AS rank 
    FROM documents
    WHERE documents MATCH &lt;query&gt;
    ORDER BY rank DESC 
    LIMIT 10 OFFSET 0
) AS ranktable USING(docid)
ORDER BY ranktable.rank DESC



  The next block of SQL enhances the query with solutions to two other problems
  that may arise in developing search applications using FTS:


   
       The snippet function cannot be used with the above query. Because
       the outer query does not include a "WHERE ... MATCH" clause, the snippet 
       function may not be used with it. One solution is to duplicate the WHERE
       clause used by the sub-query in the outer query. The overhead associated
       with this is usually negligible.
   
       The relevancy of a document may depend on something other than just
       the data available in the return value of matchinfo. For example
       each document in the database may be assigned a static weight based
       on factors unrelated to its content (origin, author, age, number
       of references etc.). These values can be stored by the application
       in a separate table that can be joined against the documents table
       in the sub-query so that the rank function may access them.



  This version of the query is very similar to that used by the 
  sqlite.org documentation search 
  application.

-- This table stores the static weight assigned to each document in FTS table
-- "documents". For each row in the documents table there is a corresponding row
-- with the same docid value in this table.
CREATE TABLE documents_data(docid INTEGER PRIMARY KEY, weight);

-- This query is similar to the one in the block above, except that:
--
--   1. It returns a "snippet" of text along with the document title for display. So
--      that the snippet function may be used, the "WHERE ... MATCH ..." clause from
--      the sub-query is duplicated in the outer query.
--
--   2. The sub-query joins the documents table with the document_data table, so that
--      implementation of the rank function has access to the static weight assigned
--      to each document.
SELECT title, snippet(documents) FROM documents JOIN ( 
    SELECT docid, rank(matchinfo(documents), documents_data.weight) AS rank
    FROM documents JOIN documents_data USING(docid)
    WHERE documents MATCH &lt;query&gt;
    ORDER BY rank DESC 
    LIMIT 10 OFFSET 0
) AS ranktable USING(docid)
WHERE documents MATCH &lt;query&gt;
ORDER BY ranktable.rank DESC



  All the example queries above return the ten most relevant query results.
  By modifying the values used with the OFFSET and LIMIT clauses, a query 
  to return (say) the next ten most relevant results is easy to construct. 
  This may be used to obtain the data required for a search applications second
  and subsequent pages of results.


  The next block contains an example rank function that uses matchinfo data 
  implemented in C. Instead of a single weight, it allows a weight to be 
  externally assigned to each column of each document. It may be registered
  with SQLite like any other user function using sqlite3_create_function.

 Security Warning: Because it is just an ordinary SQL function, 
  rank() may be invoked as part of any SQL query in any context. This means
  that the first argument passed may not be a valid matchinfo blob.
  Implementors should take care to handle this case without causing buffer
  overruns or other potential security problems.

/*
** SQLite user defined function to use with matchinfo() to calculate the
** relevancy of an FTS match. The value returned is the relevancy score
** (a real value greater than or equal to zero). A larger value indicates 
** a more relevant document.
**
** The overall relevancy returned is the sum of the relevancies of each 
** column value in the FTS table. The relevancy of a column value is the
** sum of the following for each reportable phrase in the FTS query:
**
**   (&lt;hit count&gt; / &lt;global hit count&gt;) * &lt;column weight&gt;
**
** where &lt;hit count&gt; is the number of instances of the phrase in the
** column value of the current row and &lt;global hit count&gt; is the number
** of instances of the phrase in the same column of all rows in the FTS
** table. The &lt;column weight&gt; is a weighting factor assigned to each
** column by the caller (see below).
**
** The first argument to this function must be the return value of the FTS 
** matchinfo() function. Following this must be one argument for each column 
** of the FTS table containing a numeric weight factor for the corresponding 
** column. Example:
**
**     CREATE VIRTUAL TABLE documents USING fts3(title, content)
**
** The following query returns the docids of documents that match the full-text
** query &lt;query&gt; sorted from most to least relevant. When calculating
** relevance, query term instances in the 'title' column are given twice the
** weighting of those in the 'content' column.
**
**     SELECT docid FROM documents 
**     WHERE documents MATCH &lt;query&gt; 
**     ORDER BY rank(matchinfo(documents), 1.0, 0.5) DESC
*/
static void rankfunc(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
  int *aMatchinfo;                /* Return value of matchinfo() */
  int nMatchinfo;                 /* Number of elements in aMatchinfo&#x5B;&#x5D; */
  int nCol = 0;                   /* Number of columns in the table */
  int nPhrase = 0;                /* Number of phrases in the query */
  int iPhrase;                    /* Current phrase */
  double score = 0.0;             /* Value to return */

  assert( sizeof(int)==4 );

  /* Check that the number of arguments passed to this function is correct.
  ** If not, jump to wrong_number_args. Set aMatchinfo to point to the array
  ** of unsigned integer values returned by FTS function matchinfo. Set
  ** nPhrase to contain the number of reportable phrases in the users full-text
  ** query, and nCol to the number of columns in the table. Then check that the
  ** size of the matchinfo blob is as expected. Return an error if it is not.
  */
  if( nVal&lt;1 ) goto wrong_number_args;
  aMatchinfo = (unsigned int *)sqlite3_value_blob(apVal&#x5B;0&#x5D;);
  nMatchinfo = sqlite3_value_bytes(apVal&#x5B;0&#x5D;) / sizeof(int);
  if( nMatchinfo&gt;=2 ){
    nPhrase = aMatchinfo&#x5B;0&#x5D;;
    nCol = aMatchinfo&#x5B;1&#x5D;;
  }
  if( nMatchinfo!=(2+3*nCol*nPhrase) ){
    sqlite3_result_error(pCtx,
      "invalid matchinfo blob passed to function rank()", -1);
    return;
  }
  if( nVal!=(1+nCol) ) goto wrong_number_args;

  /* Iterate through each phrase in the users query. */
  for(iPhrase=0; iPhrase&lt;nPhrase; iPhrase++){
    int iCol;                     /* Current column */

    /* Now iterate through each column in the users query. For each column,
    ** increment the relevancy score by:
    **
    **   (&lt;hit count&gt; / &lt;global hit count&gt;) * &lt;column weight&gt;
    **
    ** aPhraseinfo&#x5B;&#x5D; points to the start of the data for phrase iPhrase. So
    ** the hit count and global hit counts for each column are found in 
    ** aPhraseinfo&#x5B;iCol*3&#x5D; and aPhraseinfo&#x5B;iCol*3+1&#x5D;, respectively.
    */
    int *aPhraseinfo = &aMatchinfo&#x5B;2 + iPhrase*nCol*3&#x5D;;
    for(iCol=0; iCol&lt;nCol; iCol++){
      int nHitCount = aPhraseinfo&#x5B;3*iCol&#x5D;;
      int nGlobalHitCount = aPhraseinfo&#x5B;3*iCol+1&#x5D;;
      double weight = sqlite3_value_double(apVal&#x5B;iCol+1&#x5D;);
      if( nHitCount>0 ){
        score += ((double)nHitCount / (double)nGlobalHitCount) * weight;
      }
    }
  }

  sqlite3_result_double(pCtx, score);
  return;

  /* Jump here if the wrong number of arguments are passed to this function */
wrong_number_args:
  sqlite3_result_error(pCtx, "wrong number of arguments to function rank()", -1);
}

This page last modified on  2022-08-10 18:11:15 UTCfts3.htmlŽct, array, or
string is passed into JSON function, that function will usually throw
an error.  (Exceptions to this rule are json_valid() and
json_quote().)


For the purposes of determining validity, leading and trailing whitespace
on JSON inputs is ignored.  Interior whitespace is also ignored, in accordance
with the JSON spec.  These routines accept exactly the 
rfc-7159 JSON syntax
&mdash; no more and no less.



3.2. PATH arguments


For functions that accept PATH arguments, that PATH must be well-formed or
else the function will throw an error.
A well-formed PATH is a text value that begins with exactly one
'$' character followed by zero or more instances
of ".objectlabel" or "&#91;arrayindex&#93;".


The arrayindex is usually a non-negative integer N.  In
that case, the array element selected is the N-th element
of the array, starting with zero on the left.
The arrayindex can also be of the form "#-N"
in which case the element selected is the N-th from the
right.  The last element of the array is "#-1".  Think of
the "#" characters as the "number of elements in the array".  Then
the expression "#-1" evaluates to the integer that corresponds to 
the last entry in the array.  It is sometimes useful for the array
index to be just the # character, for example when appending
a value to an existing JSON array:


json_set('[0,1,2]','$[#]','new')
&rarr; '[0,1,2,"new"]'






3.3. VALUE arguments


For functions that accept "value" arguments (also shown as
"value1" and "value2"),
those arguments are usually understood
to be literal strings that are quoted and become JSON string values
in the result.  Even if the input value strings look like 
well-formed JSON, they are still interpreted as literal strings in the
result.


However, if a value argument comes directly from the result of another
JSON function or from the -> operator (but not the ->> operator),
then the argument is understood to be actual JSON and
the complete JSON is inserted rather than a quoted string.


For example, in the following call to json_object(), the value
argument looks like a well-formed JSON array.  However, because it is just
ordinary SQL text, it is interpreted as a literal string and added to the
result as a quoted string:


json_object('ex','[52,3.14159]')
&rarr; '{"ex":"[52,3.14159]"}'

json_object('ex',('52,3.14159]'->>'$'))
&rarr; '{"ex":"[52,3.14159]"}'





But if the value argument in the outer json_object() call is the
result of another JSON function like json() or json_array(), then
the value is understood to be actual JSON and is inserted as such:


json_object('ex',json('[52,3.14159]'))
&rarr; '{"ex":[52,3.14159]}'

json_object('ex',json_array(52,3.14159))
&rarr; '{"ex":[52,3.14159]}'

json_object('ex','[52,3.14159]'->'$')
&rarr; '{"ex":[52,3.14159]}'





To be clear: "json" arguments are always interpreted as JSON
regardless of where the value for that argument comes from.  But
"value" arguments are only interpreted as JSON if those arguments
come directly from another JSON function or the -> operator.

3.4. Compatibility


The current implementation of this JSON library uses a recursive descent
parser.  In order to avoid using excess stack space, any JSON input that has
more than 2000 levels of nesting is considered invalid.   Limits on nesting
depth are allowed for compatible implementations of JSON by
RFC-7159 section 9.


4. Function Details

The following sections provide additional detail on the operation of
the various JSON functions and operators:



4.1. The json() function

The json(X) function verifies that its argument X is a valid
JSON string and returns a minified version of that JSON string
(with all unnecessary whitespace removed).  If X is not a well-formed
JSON string, then this routine throws an error.

In other words, this function converts raw text that looks like
JSON into actual JSON so that it may be passed into the value argument
of some other json function and will be interpreted as JSON rather than
a string.  This function is not appropriate for testing whether or not
a particular string is well-formed JSON - use the json_valid() routine
below for that task.

If the argument X to json(X) contains JSON objects with duplicate
labels, then it is undefined whether or not the duplicates are
preserved.  The current implementation preserves duplicates.
However, future enhancements
to this routine may choose to silently remove duplicates.


Example:


json(' { "this" : "is", "a": [ "test" ] } ')
&rarr; '{"this":"is","a":["test"]}'






4.2. The json_array() function

The json_array() SQL function accepts zero or more arguments and
returns a well-formed JSON array that is composed from those arguments.
If any argument to json_array() is a BLOB then an error is thrown.

An argument with SQL type TEXT is normally converted into a quoted 
JSON string.  However, if the argument is the output from another json1
function, then it is stored as JSON.  This allows calls to json_array()
and json_object() to be nested.  The json() function can also
be used to force strings to be recognized as JSON.

Examples:


json_array(1,2,'3',4)
&rarr; '[1,2,"3",4]'

json_array('[1,2]')
&rarr; '["[1,2]"]'

json_array(json_array(1,2))
&rarr; '[[1,2]]'

json_array(1,null,'3','[4,5]','{"six":7.7}')
&rarr; '[1,null,"3","[4,5]","{\"six\":7.7}"]'

json_array(1,null,'3',json('[4,5]'),json('{"six":7.7}'))
&rarr; '[1,null,"3",[4,5],{"six":7.7}]'







4.3. The json_array_length() function

The json_array_length(X) function returns the number of elements
in the JSON array X, or 0 if X is some kind of JSON value other
than an array.  The json_array_length(X,P) locates the array at path P
within X and returns the length of that array, or 0 if path P locates
an element or X other than a JSON array, and NULL if path P does not
locate any element of X.  Errors are thrown if either X is not 
well-formed JSON or if P is not a well-formed path.

Examples:


json_array_length('[1,2,3,4]')
&rarr; 4

json_array_length('[1,2,3,4]', '$')
&rarr; 4

json_array_length('[1,2,3,4]', '$[2]')
&rarr; 0

json_array_length('{"one":[1,2,3]}')
&rarr; 0

json_array_length('{"one":[1,2,3]}', '$.one')
&rarr; 3

json_array_length('{"one":[1,2,3]}', '$.two')
&rarr; NULL







4.4. The json_extract() function

The json_extract(X,P1,P2,...) extracts and returns one or more 
values from the
well-formed JSON at X.  If only a single path P1 is provided, then the
SQL datatype of the result is NULL for a JSON null, INTEGER or REAL
for a JSON numeric value, an INTEGER zero for a JSON false value,
an INTEGER one for a JSON true value, the dequoted text for a 
JSON string value, and a text representation for JSON object and array values.
If there are multiple path arguments (P1, P2, and so forth) then this
routine returns SQLite text which is a well-formed JSON array holding
the various values.

Examples:


json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$')
&rarr; '{"a":2,"c":[4,5,{"f":7}]}'

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c')
&rarr; '[4,5,{"f":7}]'

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]')
&rarr; '{"f":7}'

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f')
&rarr; 7

json_extract('{"a":2,"c":[4,5],"f":7}','$.c','$.a')
&rarr; '[[4,5],2]'

json_extract('{"a":2,"c":[4,5],"f":7}','$.c[#-1]')
&rarr; 5

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x')
&rarr; NULL

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x', '$.a')
&rarr; '[null,2]'

json_extract('{"a":"xyz"}', '$.a')
&rarr; 'xyz'

json_extract('{"a":null}', '$.a')
&rarr; NULL




There is a subtle incompatibility between the json_extract() function
in SQLite and the json_extract() function in MySQL.  The MySQL version
of json_extract() always returns JSON.  The SQLite version of
json_extract() only returns JSON if there are two or more PATH arguments
(because the result is then a JSON array) or if the single PATH argument
references an array or object.  In SQLite, if json_extract() has only
a single PATH argument and that PATH references a JSON null or a string
or a numeric value, then json_extract() returns the corresponding SQL
NULL, TEXT, INTEGER, or REAL value.

The difference between MySQL json_extract() and SQLite json_extract()
really only stands out when accessing individual values within the JSON
that are strings or NULLs.  The following table demonstrates the difference:



OperationSQLite ResultMySQL Result
json_extract('{"a":null,"b":"xyz"}','$.a')NULL'null'
json_extract('{"a":null,"b":"xyz"}','$.b')'xyz''"xyz"'




4.5. The -> and ->> operators

Beginning with SQLite version 3.38.0 (2022-02-22), the ->
and ->> operators are available for extracting subcomponents of JSON.
The SQLite implementation of the -> and ->> operators strive to be
compatible with both MySQL and PostgreSQL.
The -> and ->> operators take a JSON string
as their left operand and a PATH expression or object field
label or array index as their right operand.  The -> operator
returns a JSON representation of the selected subcomponent or NULL if that
subcomponent does not exist.  The ->> operator returns an SQL TEXT,
INTEGER, REAL, or NULL value that represents the selected subcomponent,
or NULL if the subcomponent does not exist.

Both the -> and ->> operators select the same subcomponent
of the JSON to their left.  The difference is that -> always returns a
JSON representation of that subcomponent and the ->> operator always
returns an SQL representation of that subcomponent.  Thus, these operators
are subtly different from a two-argument json_extract() function call.
A call to json_extract() with two arguments will return a JSON representation
of the subcomponent if and only if the subcomponent is a JSON array or
object, and will return an SQL representation of the subcomponent if the
subcomponent is a JSON null, string, or numeric value.

The right-hand operand to the -> and ->> operators can
be a well-formed JSON path expression.  This is the form used by MySQL.
For compatibility with PostgreSQL,
the -> and ->> operators also accept a text label or
integer as their right-hand operand.  If the right operand is a text
label X, then it is interpreted as the JSON path '$.X'.  If the right
operand is an integer value N, then it is interpreted as the JSON path '$[N]'.

Examples:


'{"a":2,"c":[4,5,{"f":7}]}' -> '$'
&rarr; '{"a":2,"c":[4,5,{"f":7}]}'

'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c'
&rarr; '[4,5,{"f":7}]'

'{"a":2,"c":[4,5,{"f":7}]}' -> 'c'
&rarr; '[4,5,{"f":7}]'

'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c[2]'
&rarr; '{"f":7}'

'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c[2].f'
&rarr; '7'

'{"a":2,"c":[4,5],"f":7}' -> '$.c[#-1]'
&rarr; '5'

'{"a":2,"c":[4,5,{"f":7}]}' -> '$.x'
&rarr; NULL

'[11,22,33,44]' -> 3
&rarr; '44'

'[11,22,33,44]' ->> 3
&rarr; 44

'{"a":"xyz"}' -> '$.a'
&rarr; '"xyz"'

'{"a":"xyz"}' ->> '$.a'
&rarr; 'xyz'

'{"a":null}' -> '$.a'
&rarr; 'null'

'{"a":null}' ->> '$.a'
&rarr; NULL










4.6. The json_insert(), json_replace, and json_set() functions

The json_insert(), json_replace, and json_set() functions all take
a single JSON value as their first argument followed by zero or more
pairs of path and value arguments, and return a new JSON string formed
by updating the input JSON by the path/value pairs.  The functions
differ only in how they deal with creating new values and overwriting
preexisting values.




FunctionOverwrite if already exists?Create if does not exist?

json_insert()NoYes

json_replace()YesNo

json_set()YesYes


The json_insert(), json_replace(), and json_set() functions always
take an odd number of arguments.  The first argument is always the original
JSON to be edited.  Subsequent arguments occur in pairs with the first
element of each pair being a path and the second element being the value
to insert or replace or set on that path.

Edits occur sequentially from left to right.  Changes caused by
prior edits can affect the path search for subsequent edits.

If the value of a path/value pair is an SQLite TEXT value, then it
is normally inserted as a quoted JSON string, even if the string looks
like valid JSON.  However, if the value is the result of another
json1 function (such as json() or json_array() or json_object())
or if it is the result of the -> operator,
then it is interpreted as JSON and is inserted as JSON re‘taining all
of its substructure.  Values that are the result of the ->> operator
are always interpreted as TEXT and are inserted as a JSON string even
if they look like valid JSON.

These routines throw an error if the first JSON argument is not
well-formed or if any PATH argument is not well-formed or if any
argument is a BLOB.

To append an element onto the end of an array, using json_insert()
with an array index of "#".  Examples:


json_insert('[1,2,3,4]','$[#]',99)
&rarr; '[1,2,3,4,99]'

json_insert('[1,[2,3],4]','$[1][#]',99)
&rarr; '[1,[2,3,99],4]'




Other examples:


json_insert('{"a":2,"c":4}', '$.a', 99)
&rarr; '{"a":2,"c":4}'

json_insert('{"a":2,"c":4}', '$.e', 99)
&rarr; '{"a":2,"c":4,"e":99}'

json_replace('{"a":2,"c":4}', '$.a', 99)
&rarr; '{"a":99,"c":4}'

json_replace('{"a":2,"c":4}', '$.e', 99)
&rarr; '{"a":2,"c":4}'

json_set('{"a":2,"c":4}', '$.a', 99)
&rarr; '{"a":99,"c":4}'

json_set('{"a":2,"c":4}', '$.e', 99)
&rarr; '{"a":2,"c":4,"e":99}'

json_set('{"a":2,"c":4}', '$.c', '[97,96]')
&rarr; '{"a":2,"c":"[97,96]"}'

json_set('{"a":2,"c":4}', '$.c', json('[97,96]'))
&rarr; '{"a":2,"c":[97,96]}'

json_set('{"a":2,"c":4}', '$.c', json_array(97,96))
&rarr; '{"a":2,"c":[97,96]}'






4.7. The json_object() function

The json_object() SQL function accepts zero or more pairs of arguments
and returns a well-formed JSON object that is composed from those arguments.
The first argument of each pair is the label and the second argument of
each pair is the value.
If any argument to json_object() is a BLOB then an error is thrown.

The json_object() function currently allows duplicate labels without
complaint, though this might change in a future enhancement.

An argument with SQL type TEXT it is normally converted into a quoted 
JSON string even if the input text is well-formed JSON.  
However, if the argument is the direct result from another JSON
function or the -> operator (but not the ->> operator), 
then it is treated as JSON and all of its JSON type information
and substructure is preserved.  This allows calls to json_object()
and json_array() to be nested.  The json() function can also
be used to force strings to be recognized as JSON.

Examples:


json_object('a',2,'c',4)
&rarr; '{"a":2,"c":4}'

json_object('a',2,'c','{e:5}')
&rarr; '{"a":2,"c":"{e:5}"}'

json_object('a',2,'c',json_object('e',5))
&rarr; '{"a":2,"c":{"e":5}}'






4.8. The json_patch() function

The json_patch(T,P) SQL function runs the
RFC-7396 MergePatch algorithm
to apply patch P against input T.  The patched copy of T is returned.

MergePatch can add, modify, or delete elements of a JSON Object,
and so for JSON Objects, the json_patch() routine is a generalized
replacement for json_set() and json_remove().  However, MergePatch
treats JSON Array objects as atomic.  MergePatch cannot append to an
Array nor modify individual elements of an Array.  It can only insert,
replace, or delete the whole Array as a single unit.  Hence, json_patch()
is not as useful when dealing with JSON that includes Arrays,
especially Arrays with lots of substructure.

Examples:


json_patch('{"a":1,"b":2}','{"c":3,"d":4}')
&rarr; '{"a":1,"b":2,"c":3,"d":4}'

json_patch('{"a":[1,2],"b":2}','{"a":9}')
&rarr; '{"a":9,"b":2}'

json_patch('{"a":[1,2],"b":2}','{"a":null}')
&rarr; '{"b":2}'

json_patch('{"a":1,"b":2}','{"a":9,"b":null,"c":8}')
&rarr; '{"a":9,"c":8}'

json_patch('{"a":{"x":1,"y":2},"b":3}','{"a":{"y":9},"c":8}')
&rarr; '{"a":{"x":1,"y":9},"b":3,"c":8}'






4.9. The json_remove() function

The json_remove(X,P,...) function takes a single JSON value as its
first argument followed by zero or more path arguments.
The json_remove(X,P,...) function returns
a copy of the X parameter with all the elements 
identified by path arguments removed.  Paths that select elements
not found in X are silently ignored.

Removals occurs sequentially from left to right.  Changes caused by
prior removals can affect the path search for subsequent arguments.

If the json_remove(X) function is called with no path arguments,
then it returns the input X reformatted, wi’th excess whitespace
removed.

The json_remove() function throws an error if the first argument
is not well-formed JSON or if any later argument is not a well-formed
path, or if any argument is a BLOB.

Examples:


json_remove('[0,1,2,3,4]','$[2]')
&rarr; '[0,1,3,4]'

json_remove('[0,1,2,3,4]','$[2]','$[0]')
&rarr; '[1,3,4]'

json_remove('[0,1,2,3,4]','$[0]','$[2]')
&rarr; '[1,2,4]'

json_remove('[0,1,2,3,4]','$[#-1]','$[0]')
&rarr; '[1,2,3]'

json_remove('{"x":25,"y":42}')
&rarr; '{"x":25,"y":42}'

json_remove('{"x":25,"y":42}','$.z')
&rarr; '{"x":25,"y":42}'

json_remove('{"x":25,"y":42}','$.y')
&rarr; '{"x":25}'

json_remove('{"x":25,"y":42}','$')
&rarr; NULL






4.10. The json_type() function

The json_type(X) function returns the "type" of the outermost element
of X.  The json_type(X,P) function returns the "type" of the element
in X that is selected by path P.  The "type" returned by json_type() is
one of the following SQL text values:
'null', 'true', 'false', 'integer', 'real', 'text', 'array', or 'object'.
If the path P in json_type(X,P) selects an element that does not exist
in X, then this function returns NULL.

The json_type() function throws an error if any of its arguments is
not well-formed or is a BLOB.

Examples:


json_type('{"a":[2,3.5,true,false,null,"x"]}')
&rarr; 'object'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$')
&rarr; 'object'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a')
&rarr; 'array'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[0]')
&rarr; 'integer'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[1]')
&rarr; 'real'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[2]')
&rarr; 'true'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[3]')
&rarr; 'false'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[4]')
&rarr; 'null'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[5]')
&rarr; 'text'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[6]')
&rarr; NULL






4.11. The json_valid() function

The json_valid(X) function return 1 if the argument X is well-formed
JSON and return 0 if the argument X is not well-formed JSON.

Examples:


json_valid('{"x":35}')
&rarr; 1

json_valid('{"x":35')
&rarr; 0






4.12. The json_quote() function

The json_quote(X) function converts the SQL value X (a number or a
string) into its corresponding JSON representation.  If X is a JSON value
returned by another JSON function, then this function is a no-op.

Examples:


json_quote(3.14159)
&rarr; 3.14159

json_quote('verdant')
&rarr; '"verdant"'

json_quote('[1]')
&rarr; '"[1]"'

json_quote(json('[1]'))
&rarr; '[1]'

json_quote('[1,')
&rarr; '"[1"'







4.13. The json_group_array() and json_group_object()
aggregate SQL functions

The json_group_array(X) function is an 
aggregate SQL function that returns a JSON array
comprised of all X values in the aggregation.
Similarly, the json_group_object(NAME,VALUE) function returns a JSON object
comprised of all NAME/VALUE pairs in the aggregation.






4.14. The json_each() and json_tree() table-valued functions

The json_each(X) and json_tree(X) table-valued functions walk the
JSON value provided as their first argument and return one row for each
element.  The json_each(X) function only walks the immediate children
of the top-level array or object,
or just the top-level element itself if the top-level
element is a primitive value.
The json_tree(X) function recursively walks through the
JSON substructure starting with the top-level element.  

The json_each(X,P) and json_tree(X,P) functions work just like
their one-argument counterparts except that they treat the element
identified by path P as the top-level element.

The schema for the table returned by json_each() and json_tree() is
as follows:


CREATE TABLE json_tree(
    key ANY,             -- key for current element relative to its parent
    value ANY,           -- value for the current element
    type TEXT,           -- 'object','array','string','integer', etc.
    atom ANY,            -- value for primitive types, null for array & object
    id INTEGER,          -- integer ID for this element
    parent INTEGER,      -- integer ID for the parent of this element
    fullkey TEXT,        -- full path describing the current element
    path TEXT,           -- path to the container of the current row
    json JSON HIDDEN,    -- 1st input parameter: the raw JSON
    root TEXT HIDDEN     -- 2nd input parameter: the PATH at which to start
);



The "key" column is the integer array index for elements of a JSON array 
and the text label for elements of a JSON object.  The key column is
NULL in all other cases.


The "atom" column is the SQL value corresponding to primitive elements - 
elements other than JSON arrays and objects.  The "atom" column is NULL
for a JSON array or object.  The "value" column is the same as the
"atom" column for primitive JSON elements but takes on the text JSON value
for arrays and objects.


The "type" column is an SQL text value taken from ('null', 'true', 'false',
'integer', 'real', 'text', 'array', 'object') according to the type of
the current JSON element.


The "id" column is an integer that identifies a specific JSON element
within the complete JSON string.  The "id" integer is an internal housekeeping
number, the computation of which might change in future releases.  The
only guarantee is that the "id" column will be different for every row.


The "parent" column is always NULL for json_each().
For json_tree(),
the "parent" column is the "id" integer for the parent of the current
element, or NULL for the top-level JSON element or the element identified
by the root path in the second argument.


The "fullkey" column is a text path that uniquely identifies the current
row element within the original JSON string.  The complete key to the
true top-level element is returned even if an alternative starting point
is provided by the "root" argument.


The "path" column is the path to the array or object container that holds 
the current row, or the path to the current row in the case where the 
iteration starts on a primitive type and thus only provides a single
row of output.

4.14.1. Examples using json_each() and json_tree()

Suppose the table "CREATE TABLE user(name,phone)" stores zero or
more phone numbers as a JSON array object in the user.phone field.
To find all users who have any phone number with a 704 area code:


SELECT DISTINCT user.name
  FROM user, json_each(user.phone)
 WHERE json_each.value LIKE '704-%';


Now suppose the user.phone field contains plain text if the user
has only a single phone number and a JSON array if the user has multiple
phone numbers.  The same question is posed: "Which users have a phone number
in the 704 area code?"  But now the json_each() function can only be called
for those users that have two or more phone numbers since json_each()
requires well-formed JSON as its first argument:


SELECT name FROM user WHERE phone LIKE '704-%'
UNION
SELECT user.name
  FROM user, json_each(user.phone)
 WHERE json_valid(user.phone)
   AND json_each.value LIKE '704-%';


Consider a different database with "CREATE TABLE big(json JSON)".
To see a complete line-by-line decomposition of the data:


SELECT big.rowid, fullkey, value
  FROM big, json_tree(big.json)
 WHERE json_tree.type NOT IN ('object','array');


In the previous, the "type NOT IN ('object','array')" term of the
WHERE clause suppresses containers and only lets through leaf elements.
The same effect could be achieved this way:


SELECT big.rowid, fullkey, atom
  FROM big, json_tree(big.json)
 WHERE atom IS NOT NULL;


Suppose each entry in the BIG table is a JSON object 
with a '$.id' field that is a unique identifier
and a '$.partlist' field that can be a deeply nested object.
You want to find the id of every entry that contains one
or more references to uuid '6fa5181e-5721-11e5-a04e-57f3d7b32808' anywhere
in its '$.partlist'.


SELECT DISTINCT json_extract(big.json,'$.id')
  FROM big, json_tree(big.json, '$.partlist')
 WHERE json_tree.key='uuid'
   AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808';

This page last modified on  2022-06-24 16:56:23 UTCjson1.html
úúÓe‚
Eƒ¦w!JSON Functions And Operators1. Overview

By default, SQLite supports fifteen functions and two operators for
dealing with JSON values.  There are also two table-valued functions
that can be used to decompose a JSON string.


There are 15 scalar functions and operators:



json(json)



json_array(value1,value2,...)



json_array_length(json)json_array_length(json,path)



json_extract(json,path,...)



json -> path



json ->> path



json_insert(json,path,value,...)



json_object(label1,value1,...)



json_patch(json1,json2)



json_remove(json,path,...)



json_replace(json,path,value,...)



json_set(json,path,value,...)



json_type(json)json_type(json,path)



json_valid(json)



json_quote(value)





There are two aggregate SQL functions:



json_group_array(value)



json_group_object(name,value)





The two table-valued functions are:



json_each(json)json_each(json,path)



json_tree(json)json_tree(json,path)












2. Compiling in JSON Support


The JSON functions and operators are built into SQLite by default,
as of SQLite version 3.38.0 (2022-02-22).  They can be omitted
by adding the -DSQLITE_OMIT_JSON compile-time option.  Prior to
version 3.38.0, the JSON functions were an extension that would only
be included in builds if the -DSQLITE_ENABLE_JSON1 compile-time option
was included.  In other words, the JSON functions went from being
opt-in with SQLite version 3.37.2 and earlier to opt-out with
SQLite version 3.38.0 and later.

3. Interface Overview


SQLite stores JSON as ordinary text.
Backwards compatibility constraints mean that SQLite is only able to
store values that are NULL, integers, floating-point numbers, text,
and BLOBs.  It is not possible to add a sixth "JSON" type.


SQLite does not (currently) support a binary encoding
of JSON.  Experiments have been unable to find a binary encoding
that is significantly smaller or faster than a plain text encoding.
(The present implementation parses JSON text at over 1 GB/s.)
All JSON functions currently throw an error if any of their
arguments are BLOBs because BLOBs are reserved
for a future enhancement in which BLOBs will store the binary encoding
for JSON.

3.1. JSON arguments


For functions that accept JSON as their first argument, that argument
can be a JSON object, array, number, string, or null.  SQLite numeric
values and NULL values are interpreted as JSON numbers and nulls, respectively.
SQLite text values can be understood as JSON objects, arrays, or strings.
If an SQLite text value that is not a well-formed JSON objeeam_id         INTEGER REFERENCES team,
  is_team_leader  BOOLEAN,
  -- other fields elided
);


The team_id field cannot be unique because there are usually multiple people
on the same team.  One cannot make the combination of team_id and is_team_leader
unique since there are usually multiple non-leaders on each team.  The
solution to enforcing one leader per team is to create a unique index
on team_id but restricted to those entries for which is_team_leader is
true:

CREATE UNIQUE INDEX team_leader ON person(team_id) WHERE is_team_leader;


Coincidentally, that same index is useful for locating the team leader
of a particular team:

SELECT person_id FROM person WHERE is_team_leader AND team_id=?1;


3. Queries Using Partial Indexes

Let X be the expression in the WHERE clause of a partial
index, and let W be the WHERE clause of a query that uses the
table that is indexed.  Then, the query is permitted to use 
the partial index if W&#x21d2;X, where the &#x21d2; operator
(usually pronounced "implies") is the logic operator 
equivalent to "X or not W".
Hence, determining whether or not a partial index
is usable in a particular query reduces to proving a theorem in
first-order logic.

SQLite does not have a sophisticated theorem
prover with which to determine W&#x21d2;X.  Instead, SQLite uses 
two simple rules to find the common cases where W&#x21d2;X is true, and
it assumes all the other cases are false.  The rules used by SQLite
are these:


If W is AND-connected terms and X is
OR-connected terms and if any term of W
appears as a term of X, then the partial index is usable.

For example, let the index be
CREATE INDEX ex1 ON tab1(a,b) WHERE a=5 OR b=6;

And let the query be:
SELECT * FROM tab1 WHERE b=6 AND a=7; -- uses partial index

Then the index is usable by the query because the "b=6" term appears
in both the index definition and in the query.  Remember: terms in the
index should be OR-connected and terms in the query should be AND-connected.

The terms in W and X must match exactly.  SQLite does not
do algebra to try to get them to look the same.
The term "b=6" does not match "b=3+3" or "b-6=0" or "b BETWEEN 6 AND 6".
"b=6" will match to "6=b" as long as "b=6" is on the index and "6=b" is
in the query.  If a term of the form "6=b" appears in the index, it will
never match anything.

If a term in X is of the form "z IS NOT NULL" and if a term in
       W is a comparison operator on "z" other than "IS", then those
       terms match.

Example:  Let the index be
CREATE INDEX ex2 ON tab2(b,c) WHERE c IS NOT NULL;

Then any query that uses operators =, &lt;, &gt;, &lt;=, &gt;=, &lt;&gt;,
IN, LIKE, or GLOB on column "c" 
would be usable with the partial index because those
comparison operators are only true if "c" is not NULL.  So the following
query could use the partial index:
SELECT * FROM tab2 WHERE b=456 AND c&lt;&gt;0;  -- uses partial index

But the next query can not use the partial index:
SELECT * FROM tab2 WHERE b=456;  -- cannot use partial index

The latter query can not use the partial index because there might be
rows in the table with b=456 and where c is NULL.  But those rows would
not be in the partial index.


These two rules describe how the query planner for SQLite works as of
this writing (2013-08-01).  And the rules above will always be honored.
However, future versions of SQLite might incorporate a better theorem prover
that can find other cases where W&#x21d2;X is true and thus may
find more instances where partial indexes are useful.

4. Supported Versions


Partial indexes have been supported in SQLite since version 3.8.0
(2013-08-26).


Database files that contain partial indices are not readable or writable
by versions of SQLite prior to 3.8.0.  However, a database file created
by SQLite 3.8.0 is still readable and writable by prior versions as long
as its schema contains no partial indexes.  A database that is unreadable
by legacy versions of SQLite can be made readable simply by running
DROP INDEX on the partial indexes.
This page last modified on  2022-01-20 21:38:08 UTCpartialindex.html
½\  +ús/Partial Indexes1. Introduction


A partial index is an index over a subset of the rows of a table.



In ordinary indexes, there is exactly one entry in the index for every
row in the table.  In partial indexes, only some subset of the rows in the
table have corresponding index entries.  For example, a partial index might
omit entries for which the column being indexed is NULL.  When used 
judiciously, partial indexes can result in smaller database files and
improvements in both query and write performance.


2. Creating Partial Indexes


Create a partial index by adding a WHERE clause to the end of an 
ordinary CREATE INDEX statement.


create-index-stmt:
hide
 
 

expr:
show
 
 

filter-clause:
show
 
 


literal-value:
show
 
 


over-clause:
show
 
 

frame-spec:
show
 
 


ordering-term:
show
 
 



raise-function:
show
 
 


select-stmt:
show
 
 

common-table-expression:
show
 
 


compound-operator:
show
 
 


join-clause:
show
 
 

join-constraint:
show
 
 


join-operator:
show
 
 



ordering-term:
show
 
 


result-column:
show
 
 


table-or-subquery:
show
 
 


window-defn:
show
 
 

frame-spec:
show
 
 




type-name:
show
 
 

signed-number:
show
 
 




indexed-column:
show
 
 






Any index that includes the WHERE clause at the end is considered to be
a partial index.  Indexes that omit the WHERE clause (or indexes that
are created by UNIQUE or PRIMARY KEY constraints inside of CREATE TABLE
statements) are ordinary full indexes.



The expression following the WHERE clause may contain operators,
literal values, and names of columns in the table being indexed.
The WHERE clause may not contain subqueries, references to other
tables, non-deterministic functions, or bound parameters.


Only rows of the table for which the WHERE clause evaluates to true
are included in the index.  If the WHERE clause expression evaluates 
to NULL or to false for some rows of the table, then those rows are omitted 
from the index.



The columns referenced in the WHERE clause of a partial index can be
any of the columns in the table, not just columns that happen to be
indexed.  However, it is very common for the WHERE clause
expression of a partial index to be a simple expression on the column
being indexed.  The following is a typical example:

CREATE INDEX po_parent ON purchaseorder(parent_po) WHERE parent_po IS NOT NULL;


In the example above, if most purchase orders do not have a "parent"
purchase order, then most parent_po values will be NULL.  That means only
a small subset of the rows in the purchaseorder table will be indexed.
Hence the index will take up much less space.  And changes to the original
purchaseorder table will run faster since the po_parent index only needs
to be updated for those exceptional rows where parent_po is not NULL.
But the index is still useful for querying.  In particular, if one wants
to know all "children" of a particular purchase order "?1", the query
would be:

SELECT po_num FROM purchaseorder WHERE parent_po=?1;


The query above will use the po_parent index to help find the answer,
since the po_parent index contains entries for all rows of interest.
Note that since po_parent is smaller than a full index, the query will
likely run faster too.

2.1. Unique Partial Indexes

A partial index definition may include the UNIQUE keyword.  If it
does, then SQLite requires every entry in the index to be unique.
This provides a mechanism for enforcing uniqueness across some subset of
the rows in a table.

For example, suppose you have a database of the members of a large
organization where each person is assigned to a particular "team".  
Each team has a "leader" who is also a member of that team.  The
table might look something like this:

CREATE TABLE person(
  person_id       INTEGER PRIMARY KEY,
  t”—ite3_backup *pBackup;  /* Backup object used to copy data */
  sqlite3 *pTo;             /* Database to copy to (pFile or pInMemory) */
  sqlite3 *pFrom;           /* Database to copy from (pFile or pInMemory) */

  /* Open the database file identified by zFilename. Exit early if this fails
  ** for any reason. */
  rc = sqlite3_open(zFilename, &pFile);
  if( rc==SQLITE_OK ){

    /* If this is a 'load' operation (isSave==0), then data is copied
    ** from the database file just opened to database pInMemory. 
    ** Otherwise, if this is a 'save' operation (isSave==1), then data
    ** is copied from pInMemory to pFile.  Set the variables pFrom and
    ** pTo accordingly. */
    pFrom = (isSave ? pInMemory : pFile);
    pTo   = (isSave ? pFile     : pInMemory);

    /* Set up the backup procedure to copy from the "main" database of 
    ** connection pFile to the main database of connection pInMemory.
    ** If something goes wrong, pBackup will be set to NULL and an error
    ** code and message left in connection pTo.
    **
    ** If the backup object is successfully created, call backup_step()
    ** to copy data from pFile to pInMemory. Then call backup_finish()
    ** to release resources associated with the pBackup object.  If an
    ** error occurred, then an error code and message will be left in
    ** connection pTo. If no error occurred, then the error code belonging
    ** to pTo is set to SQLITE_OK.
    */
    pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main");
    if( pBackup ){
      (void)sqlite3_backup_step(pBackup, -1);
      (void)sqlite3_backup_finish(pBackup);
    }
    rc = sqlite3_errcode(pTo);
  }

  /* Close the database connection opened on database file zFilename
  ** and return the result of this function. */
  (void)sqlite3_close(pFile);
  return rc;
}




  The C function to the right demonstrates one of the simplest,
  and most common, uses of the backup API: loading and saving the contents
  of an in-memory database to a file on disk. The backup API is used as
  follows in this example:

  
    Function sqlite3_backup_init() is called to create an sqlite3_backup
        object to copy data between the two databases (either from a file and
        into the in-memory database, or vice-versa).
    Function sqlite3_backup_step() is called with a parameter of 
        -1 to copy the entire source database to the destination.
    Function sqlite3_backup_finish() is called to clean up resources
        allocated by sqlite3_backup_init().
  

Error handling


  If an error occurs in any of the three main backup API routines
  then the error code and message are attached to
  the destination database connection.
  Additionally, if
  sqlite3_backup_step() encounters an error, then the error code is returned
  by both the sqlite3_backup_step() call itself, and by the subsequent call
  to sqlite3_backup_finish(). So a call to sqlite3_backup_finish()
  does not overwrite an error code stored in the destination
  database connection by sqlite3_backup_step().  This feature
  is used in the example code to reduce amount of error handling required.
  The return values of the sqlite3_backup_step() and sqlite3_backup_finish()
  calls are ignored and the error code indicating the success or failure of
  the copy operation collected from the destination database connection
  afterward.

Possible Enhancements


  The implementation of this function could be enhanced in at least two ways:

  
     Failing to obtain the lock on database file zFilename (an SQLITE_BUSY
         error) could be handled, and
     Cases where the page-sizes of database pInMemory and zFilename are
         different could be handled better.
  


  Since database zFilename is a file on disk, then it may be accessed 
  externally by another process. This means that when the call to
  sqlite3_backup_step() attempts to read from or write data to it, it may
  fail to obtain the required file lock. If this happens, this implementation
  will fail, returning SQLITE_BUSY immediately. The solution would be to
  register a busy-hand˜ler callback or 
  timeout with database connection pFile 
  using sqlite3_busy_handler() or sqlite3_busy_timeout()
  as soon as it is opened. If it fails to obtain a required lock immediately,
  sqlite3_backup_step() uses any registered busy-handler callback or timeout
  in the same way as sqlite3_step() or sqlite3_exec() does.


  Usually, it does not matter if the page-sizes of the source database and the
  destination database are different before the contents of the destination
  are overwritten. The page-size of the destination database is simply changed
  as part of the backup operation. The exception is if the destination database
  happens to be an in-memory database. In this case, if the page sizes
  are not the same at the start of the backup operation, then the operation
  fails with an SQLITE_READONLY error. Unfortunately, this could occur when
  loading a database image from a file into an in-memory database using
  function loadOrSaveDb().


  However, if in-memory database pInMemory has just been opened (and is 
  therefore completely empty) before being passed to function loadOrSaveDb(), 
  then it is still possible to change its page size using an SQLite "PRAGMA
  page_size" command. Function loadOrSaveDb() could detect this case, and
  attempt to set the page-size of the in-memory database to the page-size
  of database zFilename before invoking the online backup API functions.
  
Example 2: Online Backup of a Running Database


/*
** Perform an online backup of database pDb to the database file named
** by zFilename. This function copies 5 database pages from pDb to
** zFilename, then unlocks pDb and sleeps for 250 ms, then repeats the
** process until the entire database is backed up.
** 
** The third argument passed to this function must be a pointer to a progress
** function. After each set of 5 pages is backed up, the progress function
** is invoked with two integer parameters: the number of pages left to
** copy, and the total number of pages in the source file. This information
** may be used, for example, to update a GUI progress bar.
**
** While this function is running, another thread may use the database pDb, or
** another process may access the underlying database file via a separate 
** connection.
**
** If the backup process is successfully completed, SQLITE_OK is returned.
** Otherwise, if an error occurs, an SQLite error code is returned.
*/
int backupDb(
  sqlite3 *pDb,               /* Database to back up */
  const char *zFilename,      /* Name of file to back up to */
  void(*xProgress)(int, int)  /* Progress function to invoke */     
){
  int rc;                     /* Function return code */
  sqlite3 *pFile;             /* Database connection opened on zFilename */
  sqlite3_backup *pBackup;    /* Backup handle used to copy data */

  /* Open the database file identified by zFilename. */
  rc = sqlite3_open(zFilename, &pFile);
  if( rc==SQLITE_OK ){

    /* Open the sqlite3_backup object used to accomplish the transfer */
    pBackup = sqlite3_backup_init(pFile, "main", pDb, "main");
    if( pBackup ){

      /* Each iteration of this loop copies 5 database pages from database
      ** pDb to the backup database. If the return value of backup_step()
      ** indicates that there are still further pages to copy, sleep for
      ** 250 ms before repeating. */
      do {
        rc = sqlite3_backup_step(pBackup, 5);
        xProgress(
            sqlite3_backup_remaining(pBackup),
            sqlite3_backup_pagecount(pBackup)
        );
        if( rc==SQLITE_OK || rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
          sqlite3_sleep(250);
        }
      } while( rc==SQLITE_OK || rc==SQLITE_BUSY || rc==SQLITE_LOCKED );

      /* Release resources allocated by backup_init(). */
      (void)sqlite3_backup_finish(pBackup);
    }
    rc = sqlite3_errcode(pFile);
  }
  
  /* Close the database connection opened on database file zFilename
  ** and return the result of this function. */
  (void)sqlite3_close(pFile);
  return rc;
}




  The function presented in the previous example copies the entire source
  database in one call to sqlite3_backup_step(). This requires holding a 
  read-lock on the source database file for the duration of the operation,
  preventing any other database user from writing to the database. It also
  holds the mutex associated with database pInMemory throughout the copy,
  preventing any other thread from using it. The C function in this section,
  designed to be called by a background thread or process for creating a 
  backup of an online database, avoids these problems using the following 
  approach:

  
    Function sqlite3_backup_init() is called to create an sqlite3_backup
        object to copy data from database pDb to the backup database file 
        identified by zFilename.
    Function sqlite3_backup_step() is called with a parameter of 5 to
        copy 5 pages of database pDb to the backup database (file zFilename).
    If there are still more pages to copy from database pDb, then the
        function sleeps for 250 milliseconds (using the sqlite3_sleep()
        utility) and then returns to step 2.
    Function sqlite3_backup_finish() is called to clean up resources
        allocated by sqlite3_backup_init().
  

File and Database Connection Locking


  During the 250 ms sleep in step 3 above, no read-lock is held on the database
  file and the mutex associated with pDb is not held. This allows other threads
  to use database connection pDb and other connections to write to the
  underlying database file. 


  If another thread or process writes to the source database while this 
  function is sleeping, then SQLite detects this and usually restarts the 
  backup process when sqlite3_backup_step() is next called. There is one 
  exception to this rule: If the source database is not an in-memory database,
  and the write is performed from within the same process as the backup
  operation and uses the same database handle (pDb), then the destination
  database (the one opened using connection pFile) is automatically updated
  along with the source. The backup process may then be continued after the 
  sqlite3_sleep() call returns as if nothing had happened. 


  Whether or not the backup process is restarted as a result of writes to
  the source database mid-backup, the user can be sure that when the backup
  operation is completed the backup database contains a consistent and 
  up-to-date snapshot of the original. However:

  
     Writes to an in-memory source database, or writes to a file-based 
         source database by an external process or thread using a 
         database connection other than pDb are significantly more expensive 
         than writes made to a file-based source database using pDb (as the
         entire backup operation must be restarted in the former two cases).

     If the backup process is restarted frequently enough it may never
         run to completion and the backupDb() function may never return.
  
 
backup_remaining() and backup_pagecount()


  The backupDb() function uses the sqlite3_backup_remaining() and
  sqlite3_backup_pagecount() functions to report its progress via the
  user-supplied xProgress() callback. Function sqlite3_backup_remaining()
  returns the number of pages left to copy and sqlite3_backup_pagecount()
  returns the total number of pages in the source database (in this case 
  the database opened by pDb). So the percentage completion of the process
  may be calculated as:


  Completion = 100% * (pagecount() - remaining()) / pagecount()


  The sqlite3_backup_remaining() and sqlite3_backup_pagecount() APIs report
  values stored by the previous call to sqlite3_backup_step(), they do not
  actually inspect the source database file. This means that if the source
  database is written to by another thread or process after the call to
  sqlite3_backup_step() returns but before the values returned by
  sqlite3_backup_remaining() and sqlite3_backup_pagecount() are used, the 
  values may be technically incorrect. This is not usually a problem.



This page last modified on  2021-12-10 14:23:30 UTCbackup.html
ùh‚  
/ó#SQLite Backup APIUsing the SQLite Online Backup API


  Historically, backups (copies) of SQLite databases have been created
  using the following method:


   Establish a shared lock on the database file using the SQLite API (i.e.
       the shell tool).
   Copy the database file using an external tool (for example the unix 'cp'
       utility or the DOS 'copy' command).
   Relinquish the shared lock on the database file obtained in step 1.



  This procedure works well in many scenarios and is usually very
  fast. However, this technique has the following shortcomings:


   Any database clients wishing to write to the database file while a
       backup is being created must wait until the shared lock is
       relinquished.

   It cannot be used to copy data to or from in-memory databases.

   If a power failure or operating system failure occurs while copying
       the database file the backup database may be corrupted following
       system recovery.



  The Online Backup API was created to 
  address these concerns. The online backup API allows the contents of
  one database to be copied into another database file, replacing any 
  original contents of the target database. The copy operation may be 
  done incrementally, in which case the source database does not need
  to be locked for the duration of the copy, only for the brief periods
  of time when it is actually being read from. This allows other database
  users to continue without excessive delays while a backup of an online
  database is made.

  The effect of completing the backup call sequence is to make the
  destination a bit-wise identical copy of the source database as it
  was when the copying commenced. (The destination becomes a "snapshot.")


  The online backup API is documented here.
  The remainder of this page contains two C language examples illustrating 
  common uses of the API and discussions thereof. Reading these examples
  is no substitute for reading the API documentation!


  Update: The VACUUM INTO command introduced in 
  SQLite version 3.27.0 (2019-02-07) can serve as an
  alternative to the backup API.

Example 1: Loading and Saving In-Memory Databases


/*
** This function is used to load the contents of a database file on disk 
** into the "main" database of open database connection pInMemory, or
** to save the current contents of the database opened by pInMemory into
** a database file on disk. pInMemory is probably an in-memory database, 
** but this function will also work fine if it is not.
**
** Parameter zFilename points to a nul-terminated string containing the
** name of the database file on disk to load from or save to. If parameter
** isSave is non-zero, then the contents of the file zFilename are 
** overwritten with the contents of the database opened by pInMemory. If
** parameter isSave is zero, then the contents of the database opened by
** pInMemory are replaced by data loaded from the file zFilename.
**
** If the operation is successful, SQLITE_OK is returned. Otherwise, if
** an error occurs, an SQLite error code is returned.
*/
int loadOrSaveDb(sqlite3 *pInMemory, const char *zFilename, int isSave){
  int rc;                   /* Function return code */
  sqlite3 *pFile;           /* Database connection opened on zFilename */
  sql–›ry hierarchy.  If SQLite can read
  the disk file then it can read anything in the database.  If the disk
  file and its directory are writable, then SQLite can change anything
  in the database.   Database files can easily be copied onto a USB
  memory stick or emailed for sharing.
  
  Other SQL database engines tend to store data as a large collection of
  files.  Often these files are in a standard location that only the
  database engine itself can access.  This makes the data more secure,
  but also makes it harder to access.  Some SQL database engines provide
  the option of writing directly to disk and bypassing the filesystem
  altogether.  This provides added performance, but at the cost of
  considerable setup and maintenance complexity.


Stable Cross-Platform Database File

  The SQLite file format is cross-platform.  A database file written
  on one machine can be copied to and used on a different machine with
  a different architecture.  Big-endian or little-endian, 32-bit or
  64-bit does not matter.  All machines use the same file format.
  Furthermore, the developers have pledged to keep the file format
  stable and backwards compatible, so newer versions of SQLite can
  read and write older database files.
  
  Most other SQL database engines require you to dump and restore
  the database when moving from one platform to another and often
  when upgrading to a newer version of the software.


Compact

  When optimized for size, the whole SQLite library with everything enabled
  is less than 500KiB in size
  (as measured on an ix86 using the "size"
  utility from the GNU compiler suite.)  Unneeded features can be disabled
  at compile-time to further reduce the size of the library to under
  300KiB if desired.
  
  Most other SQL database engines are much larger than this.  IBM boasts
  that its recently released CloudScape database engine is "only" a 2MiB
  jar file - an order of magnitude larger than SQLite even after it is
  compressed!
  Firebird boasts that its client-side library is only 350KiB.  That's
  as big as SQLite and does not even contain the database engine.
  The Berkeley DB library from Oracle is 450KiB and it omits SQL
  support, providing the programmer with only simple key/value pairs.


Manifest typing

  Most SQL database engines use static typing.  A datatype is associated
  with each column in a table and only values of that particular datatype
  are allowed to be stored in that column.  SQLite relaxes this restriction
  by using manifest typing.
  In manifest typing, the datatype is a property of the value itself, not 
  of the column in which the value is stored.
  SQLite thus allows the user to store
  any value of any datatype into any column regardless of the declared type
  of that column.  (There are some exceptions to this rule: An INTEGER
  PRIMARY KEY column may only store integers.  And SQLite attempts to coerce
  values into the declared datatype of the column when it can.)
  
  As far as we can tell, the SQL language specification allows the use
  of manifest typing.   Nevertheless, most other SQL database engines are
  statically typed and so some people
  feel that the use of manifest typing is a bug in SQLite.  But the authors
  of SQLite feel very strongly that this is a feature.  The use of manifest
  typing in SQLite is a deliberate design decision which has proven in practice
  to make SQLite more reliable and easier to use, especially when used in
  combination with dynamically typed programming languages such as Tcl and
  Python.


Variable-length records

  Most other SQL database engines allocated a fixed amount of disk space
  for each row in most tables.  They play special tricks for handling
  BLOBs and CLOBs which can be of wildly varying length.  But for most
  tables, if you declare a column to be a VARCHAR(100) then the database
  engine will allocate
  100 bytes of disk space regardless of how much information you actually
  store in that column.
  
  SQLite, in contrast, use only the amount of disk space actually
  needed to store the information in a row.  If you store a single
  character in a VARCHAR(100) column, then only a single byte of disk
  space is consumed.  (Actually two bytes - there is some overhead at
  the beginning of each column to record its datatype and length.)
  
  The use of variable-length records by SQLite has a number of advantages.
  It results in smaller database files, obviously.  It also makes the
  database run faster, since there is less information to move to and from
  disk.  And, the use of variable-length records makes it possible for
  SQLite to employ manifest typing instead of static typing.


Readable source code

  The source code to SQLite is designed to be readable and accessible to
  the average programmer.  All procedures and data structures and many
  automatic variables are carefully commented with useful information about
  what they do.  Boilerplate commenting is omitted.


SQL statements compile into virtual machine code

  Every SQL database engine compiles each SQL statement into some kind of
  internal data structure which is then used to carry out the work of the
  statement.  But in most SQL engines that internal data structure is a
  complex web of interlinked structures and objects.  In SQLite, the compiled
  form of statements is a short program in a machine-language like
  representation.  Users of the database can view this 
  virtual machine language
  by prepending the EXPLAIN keyword
  to a query.
  
  The use of a virtual machine in SQLite has been a great benefit to the
  library's development.  The virtual machine provides a crisp, well-defined
  junction between the front-end of SQLite (the part that parses SQL
  statements and generates virtual machine code) and the back-end (the
  part that executes the virtual machine code and computes a result.)
  The virtual machine allows the developers to see clearly and in an
  easily readable form what SQLite is trying to do with each statement
  it compiles, which is a tremendous help in debugging.
  Depending on how it is compiled, SQLite also has the capability of
  tracing the execution of the virtual machine - printing each
  virtual machine instruction and its result as it executes.


Public domain

  The source code for SQLite is in the public domain.  No claim of copyright
  is made on any part of the core source code.  (The documentation and test
  code is a different matter - some sections of documentation and test logic
  are governed by open-source licenses.)  All contributors to the
  SQLite core software have signed affidavits specifically disavowing any
  copyright interest in the code.  This means that anybody is able to legally
  do anything they want with the SQLite source code.
  
  There are other SQL database engines with liberal licenses that allow
  the code to be broadly and freely used.  But those other engines are
  still governed by copyright law.  SQLite is different in that copyright
  law simply does not apply.  
  
  The source code files for other SQL database engines typically begin
  with a comment describing your legal rights to view and copy that file.
  The SQLite source code contains no license since it is not governed by
  copyright.  Instead of a license, the SQLite source code offers 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.
  


SQL language extensions

  SQLite provides a number of enhancements to the SQL language 
  not normally found in other database engines.
  The EXPLAIN keyword and manifest typing have already been mentioned
  above.  SQLite also provides statements such as 
  REPLACE and the
  ON CONFLICT clause that allow for
  added control over the resolution of constraint conflicts.
  SQLite supports ATTACH and
  DETACH commands that allow multiple
  independent databases to be used together in the same query.
  And SQLite defines APIs which allow the user to add new
  SQL functions
  and collating sequences.


This page last modified on  2022-01-20 21:38:08 UTCdifferent.html
††Ôj‚

I¨u)Distinctive Features Of SQLiteDistinctive Features Of SQLite


This page highlights some of the characteristics of SQLite that are
unusual and which make SQLite different from many other SQL
database engines.



Zero-Configuration

  SQLite does not need to be "installed" before it is used. 
  There is no "setup" procedure.  There is no
  server process that needs to be started, stopped, or configured.
  There is
  no need for an administrator to create a new database instance or assign
  access permissions to users.
  SQLite uses no configuration files.
  Nothing needs to be done to tell the system that SQLite is running.
  No actions are required to recover after a system crash or power failure.
  There is nothing to troubleshoot.
  
  SQLite just works.
  
  Other more familiar database engines run great once you get them going.
  But doing the initial installation and configuration can be
  intimidatingly complex.


Serverless

  
  (See also the serverless documentation page.)
  
  Most SQL database engines are implemented as a separate server
  process.  Programs that want to access the database communicate
  with the server using some kind of interprocess communication
  (typically TCP/IP) to send requests to the server and to receive
  back results.  SQLite does not work this way.  With SQLite, the
  process that wants to access the database reads and writes
  directly from the database files on disk.  There is no intermediary
  server process.
  
  There are advantages and disadvantages to being serverless.  The
  main advantage is that there is no separate server process
  to install, setup, configure, initialize, manage, and troubleshoot.
  This is one reason why SQLite is a "zero-configuration" database
  engine.  Programs that use SQLite require no administrative support
  for setting up the database engine before they are run.  Any program
  that is able to access the disk is able to use an SQLite database.
  
  On the other hand, a database engine that uses a server can provide
  better protection from bugs in the client application - stray pointers
  in a client cannot corrupt memory on the server.  And because a server
  is a single persistent process, it is able control database access with
  more precision, allowing for finer grain locking and better concurrency.
  
  Most SQL database engines are client/server based.  Of those that are
  serverless, SQLite is the only one that this author knows of that
  allows multiple applications to access the same database at the same time.


Single Database File

  An SQLite database is a single ordinary disk file that can be located
  anywhere in the directošžset of queries.  Wiki pages need a
different query.  And so forth.  By implementing these queries on-demand
and in the part of the code dealing with the various entities, there is
further separation of responsibility and simplification of the overall 
code base.


So, SQLite is able to do one or two large and complex queries, or it can
do many smaller and simpler queries.  Both are efficient.  An application
can use either or both techniques, depending on what works best for the
situation at hand.


The following is a log of all SQL used to generate one particular
timeline (captured on 2016-09-16):

-- sqlite3_open: /home/drh/sqlite/sqlite/.fslckout
PRAGMA foreign_keys=OFF;
SELECT sql FROM localdb.sqlite_schema WHERE name=='vfile';
-- sqlite3_open: /home/drh/.fossil
PRAGMA foreign_keys=OFF;
SELECT value FROM vvar WHERE name='repository';
ATTACH DATABASE '/home/drh/www/repos/sqlite.fossil' AS 'repository' KEY '';
SELECT value FROM config WHERE name='allow-symlinks';
SELECT value FROM global_config WHERE name='allow-symlinks';
SELECT value FROM config WHERE name='aux-schema';
SELECT 1 FROM config WHERE name='baseurl:http://';
SELECT value FROM config WHERE name='ip-prefix-terms';
SELECT value FROM global_config WHERE name='ip-prefix-terms';
SELECT value FROM config WHERE name='localauth';
SELECT value FROM vvar WHERE name='default-user';
SELECT uid FROM user WHERE cap LIKE '%s%';
SELECT login FROM user WHERE uid=1;
SELECT cap FROM user WHERE login = 'nobody';
SELECT cap FROM user WHERE login = 'anonymous';
SELECT value FROM config WHERE name='public-pages';
SELECT value FROM global_config WHERE name='public-pages';
SELECT value FROM config WHERE name='header';
SELECT value FROM config WHERE name='project-name';
SELECT value FROM config WHERE name='th1-setup';
SELECT value FROM global_config WHERE name='th1-setup';
SELECT value FROM config WHERE name='redirect-to-https';
SELECT value FROM global_config WHERE name='redirect-to-https';
SELECT value FROM config WHERE name='index-page';
SELECT mtime FROM config WHERE name='css';
SELECT mtime FROM config WHERE name='logo-image';
SELECT mtime FROM config WHERE name='background-image';
CREATE TEMP TABLE IF NOT EXISTS timeline(
  rid INTEGER PRIMARY KEY,
  uuid TEXT,
  timestamp TEXT,
  comment TEXT,
  user TEXT,
  isleaf BOOLEAN,
  bgcolor TEXT,
  etype TEXT,
  taglist TEXT,
  tagid INTEGER,
  short TEXT,
  sortby REAL
)
;
INSERT OR IGNORE INTO timeline SELECT
  blob.rid AS blobRid,
  uuid AS uuid,
  datetime(event.mtime,toLocal()) AS timestamp,
  coalesce(ecomment, comment) AS comment,
  coalesce(euser, user) AS user,
  blob.rid IN leaf AS leaf,
  bgcolor AS bgColor,
  event.type AS eventType,
  (SELECT group_concat(substr(tagname,5), ', ') FROM tag, tagxref
    WHERE tagname GLOB 'sym-*' AND tag.tagid=tagxref.tagid
      AND tagxref.rid=blob.rid AND tagxref.tagtype&gt;0) AS tags,
  tagid AS tagid,
  brief AS brief,
  event.mtime AS mtime
 FROM event CROSS JOIN blob
WHERE blob.rid=event.objid
 AND NOT EXISTS(SELECT 1 FROM tagxref WHERE tagid=5 AND tagtype&gt;0 AND rid=blob.rid)
 ORDER BY event.mtime DESC LIMIT 50;
-- SELECT value FROM config WHERE name='timeline-utc';
SELECT count(*) FROM timeline WHERE etype!='div';
SELECT min(timestamp) FROM timeline;
SELECT julianday('2016-09-15 14:54:51',fromLocal());
SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob WHERE blob.rid=event.objid AND mtime&lt;=2457647.121412037);
SELECT max(timestamp) FROM timeline;
SELECT julianday('2016-09-24 17:42:43',fromLocal());
SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob WHERE blob.rid=event.objid AND mtime&gt;=2457656.238009259);
SELECT value FROM config WHERE name='search-ci';
SELECT value FROM vvar WHERE name='checkout';
SELECT value FROM config WHERE name='timeline-max-comment';
SELECT value FROM global_config WHERE name='timeline-max-comment';
SELECT value FROM config WHERE name='timeline-date-format';
SELECT value FROM config WHERE name='timeline-truncate-at-blank';
SELECT value FROM global_config WHERE name='timeline-truncate-at-blank';
SELECT * FROM timeline ORDER BY sortby DESC;
SELECŸT value FROM config WHERE name='hash-digits';
SELECT value FROM global_config WHERE name='hash-digits';
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68028;
SELECT pid FROM plink WHERE cid=68028 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM tagxref WHERE rid=68028 AND tagid=9 AND tagtype&gt;0;
SELECT value FROM config WHERE name='timeline-block-markup';
SELECT value FROM config WHERE name='timeline-plaintext';
SELECT value FROM config WHERE name='wiki-use-html';
SELECT value FROM global_config WHERE name='wiki-use-html';
SELECT 1 FROM private WHERE rid=68028;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68026;
SELECT pid FROM plink WHERE cid=68026 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68026;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68024;
SELECT pid FROM plink WHERE cid=68024 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68024;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68018;
SELECT pid FROM plink WHERE cid=68018 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68018;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68012;
SELECT pid FROM plink WHERE cid=68012 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68012;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68011;
SELECT value FROM config WHERE name='details';
SELECT pid FROM plink WHERE cid=68011 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM tagxref WHERE rid=68011 AND tagid=9 AND tagtype&gt;0;
SELECT 1 FROM private WHERE rid=68011;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68008;
SELECT pid FROM plink WHERE cid=68008 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68008;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68006;
SELECT pid FROM plink WHERE cid=68006 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68006;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68000;
SELECT pid FROM plink WHERE cid=68000 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68000;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67997;
SELECT pid FROM plink WHERE cid=67997 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67997;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67992;
SELECT pid FROM plink WHERE cid=67992 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67992;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67990;
SELECT pid FROM plink WHERE cid=67990 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67990;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67989;
SELECT pid FROM plink WHERE cid=67989 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67989;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67984;
SELECT pid FROM plink WHERE cid=67984 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67984;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67983;
SELECT pid FROM plink WHERE cid=67983 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67983;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67979;
SELECT pid FROM plink WHERE cid=67979 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67979;
SELECT value FROM config WHERE name='ticket-closed-expr';
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='1ec41379c9c1e400' AND tkt_uuid&lt;'1ec41379c9c1e401';
SELECT 1 FROM private WHERE rid=67980;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67977;
SELECT pid FROM plink WHERE cid=67977 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='1ec41379c9c1e40 0' AND tkt_uuid&lt;'1ec41379c9c1e401';
SELECT 1 FROM private WHERE rid=67977;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='1ec41379c9c1e400' AND tkt_uuid&lt;'1ec41379c9c1e401';
SELECT 1 FROM private WHERE rid=67974;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67971;
SELECT pid FROM plink WHERE cid=67971 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67971;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67972;
SELECT pid FROM plink WHERE cid=67972 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67972;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67969;
SELECT pid FROM plink WHERE cid=67969 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67969;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67966;
SELECT pid FROM plink WHERE cid=67966 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67966;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67962;
SELECT pid FROM plink WHERE cid=67962 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67962;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67960;
SELECT pid FROM plink WHERE cid=67960 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67960;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67957;
SELECT pid FROM plink WHERE cid=67957 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67957;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67955;
SELECT pid FROM plink WHERE cid=67955 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67955;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67953;
SELECT pid FROM plink WHERE cid=67953 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='5990a1bdb4a073' AND tkt_uuid&lt;'5990a1bdb4a074';
SELECT 1 FROM blob WHERE uuid&gt;='5990a1bdb4a073' AND uuid&lt;'5990a1bdb4a074';
SELECT 1 FROM private WHERE rid=67953;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67941;
SELECT pid FROM plink WHERE cid=67941 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67941;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67940;
SELECT pid FROM plink WHERE cid=67940 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67940;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67938;
SELECT pid FROM plink WHERE cid=67938 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67938;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67935;
SELECT pid FROM plink WHERE cid=67935 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67935;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67934;
SELECT pid FROM plink WHERE cid=67934 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67934;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67932;
SELECT pid FROM plink WHERE cid=67932 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67932;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67930;
SELECT pid FROM plink WHERE cid=67930 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67930;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67928;
SELECT pid FROM plink WHERE cid=67928 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM tagxref WHERE rid=67928 AND tagid=9 AND tagtype&gt;0;
SELECT 1 FROM private WHERE rid=67928;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='0eab1ac7591f511d' AND tkt_uuid&lt;'0eab1ac7591f511e';
SELECT 1 FROM private WHERE rid=67919;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='01874d252ac44861' AND tkt_uuid&lt;'01874d252ac44862';
SELECT 1 FROM blob WHERE uuid&gt;='01874d252ac44861' AND uuid&lt;'01874d252ac44862';
SELECT 1 FROM private WHERE rid=67918;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67916;
SELECT pid FROM plink WHERE cid=67916 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='0eab1ac759' AND tkt_uuid&lt;'0eab1ac75:';
SELECT 1 FROM private WHERE rid=67916;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='a49bc0a8244feb08' AND tkt_uuid&lt;'a49bc0a8244feb09';
SELECT 1 FROM blob WHERE uuid&gt;='a49bc0a8244feb08' AND uuid&lt;'a49bc0a8244feb09';
SELECT 1 FROM private WHERE rid=67914;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67913;
SELECT pid FROM plink WHERE cid=67913 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='0eab1ac7591f' AND tkt_uuid&lt;'0eab1ac7591g';
SELECT 1 FROM private WHERE rid=67913;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67911;
SELECT pid FROM plink WHERE cid=67911 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67911;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='0eab1ac7591f511d' AND tkt_uuid&lt;'0eab1ac7591f511e';
SELECT 1 FROM private WHERE rid=67909;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67907;
SELECT pid FROM plink WHERE cid=67907 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67907;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67899;
SELECT pid FROM plink WHERE cid=67899 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67899;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67897;
SELECT pid FROM plink WHERE cid=67897 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67897;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67895;
SELECT pid FROM plink WHERE cid=67895 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67895;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67893;
SELECT pid FROM plink WHERE cid=67893 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67893;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67891;
SELECT pid FROM plink WHERE cid=67891 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67891;
SELECT count(*) FROM plink
 WHERE pid=67928 AND isprim
   AND coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.pid), 'trunk')
      =coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.cid), 'trunk')
;
SELECT count(*) FROM plink
 WHERE pid=68011 AND isprim
   AND coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.pid), 'trunk')
      =coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.cid), 'trunk')
;
SELECT count(*) FROM plink
 WHERE pid=68028 AND isprim
   AND coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.pid), 'trunk')
      =coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.cid), 'trunk')
;
SELECT value FROM config WHERE name='show-version-diffs';
SELECT value FROM config WHERE name='adunit-omit-if-admin';
SELECT value FROM global_config WHERE name='adunit-omit-if-admin';
SELECT value FROM config WHERE name='adunit-omit-if-user';
SELECT value FROM global_config WHERE name='adunit-omit-if-user';
SELECT value FROM config WHERE name='adunit';
SELECT value FROM global_config WHERE name='adunit';
SELECT value FROM config WHERE name='auto-hyperlink-delay';
SELECT value FROM global_config WHERE name='auto-hyperlink-delay';
SELECT value FROM config WHERE name='footer';
PRAGMA database_list;
PRAGMA database_list;
PRAGMA localdb.freelist_count;
PRAGMA localdb.page_count;

This page last modified on  2020-06-18 21:18:56 UTCnp1queryprob.html
ªªœ=‚
a‚·}/Many Small Queries Are Efficient In SQLite1. Executive Summary



200 SQL statements per webpage is excessive for client/server database
engines like MySQL, PostgreSQL, or SQL Server.


But with SQLite, 200 or more SQL statement per webpage is not a problem.


SQLite can also do large and complex queries efficiently, just like
client/server databases.  But SQLite can do many smaller queries
efficiently too.  Application developers can use whichever technique
works best for the task at hand.
     


2. The Perceived Problem


The Appropriate Uses For SQLite page says that
dynamic pages on the SQLite website typically do about 200 SQL
statements each.
This has provoked criticism from readers.  Examples:



"200 SQL statements is a ridiculously high number for a single page"

"For most sites, 200 queries is way, way, way too much."

"&#91;This is&#93; bad design"



Such criticism would be well-founded for a traditional client/server
database engine, such as MySQL, PostgreSQL, or SQL Server.  In
a client/server database, each SQL statement requires a message
round-trip from the application to the database server and back to
the application.  Doing over 200 round-trip messages, sequentially,
can be a serious performance drag.  This is sometimes called the
"N+1 Query Problem" or the "N+1 Select Problem" and it is an anti-pattern.

3. N+1 Queries Are Not A Problem With SQLite


SQLite is not client/server, however.  The SQLite database runs
in the same process address space as the application.  Queries do not
involve message round-trips, only a function call.  The latency
of a single SQL query is far less in SQLite.  Hence, using a large number
of queries with SQLite is not the problem.

4. The Need For Over 200 SQL Statements Per Webpage


The dynamic webpages on the SQLite website are mostly generated by
the Fossil version control system.
A typical dynamic
page would be a timeline such as https://www.sqlite.org/src/timeline.
A log of all SQL used by the timeline is shown below.


The first group of queries in the log are extracting display options
from the "config" and "global_config" tables of the Fossil database.
Then there is a single complex query that extracts a list of all elements
to be displayed on the timeline.
This "timeline" query demonstrates that SQLite can easily process complex
relational database queries involving multiple tables, subqueries, and
complex WHERE clause constraints, and it can make effective use of indexes
to solve the queries with minimal disk I/O.


Following the single big "timeline" query, 
there are additional queries for each timeline element.
Fossil is using the "N+1 Query" pattern rather than trying
to grab all the information in as few queries as possible.
But that is ok because there is no unnecessary IPC overhead.
At the bottom of
each timeline page, Fossil shows approximately how long it took to generate
the page.  For a 50-entry timeline, the latency is usually less than
25 milliseconds.  Profiling shows that few of those milliseconds
were spent inside the database engine.


Using the N+1 Query pattern in Fossil does not harm the application.  
But the N+1 Query pattern does have benefits.  For one, the
section of the code that creates the timeline query can be
completely separate from the section that prepares each timeline
entry for display.
This provides a separation of responsibility that helps keep the code
simple and easy to maintain.  Secondly, the information
needed for display, and the queries needed to extract that information,
vary according to what type of objects to be shown.  Check-ins need one
set of queries.  Tickets need another £well before that
point.  In security-sensitive applications it is best not to
try to increase the maximum string and blob length.  In fact,
you might do well to lower the maximum string and blob length
to something more in the range of a few million if that is
possible.



During part of SQLite's INSERT and SELECT processing, the complete
content of each row in the database is encoded as a single BLOB.
So the SQLITE_MAX_LENGTH parameter also determines the maximum
number of bytes in a row.



The maximum string or BLOB length can be lowered at run-time using
the sqlite3_limit(db,SQLITE_LIMIT_LENGTH,size) interface.


Maximum Number Of Columns


The SQLITE_MAX_COLUMN compile-time parameter is used to set an upper
bound on:



The number of columns in a table
The number of columns in an index
The number of columns in a view
The number of terms in the SET clause of an UPDATE statement
The number of columns in the result set of a SELECT statement
The number of terms in a GROUP BY or ORDER BY clause
The number of values in an INSERT statement



The default setting for SQLITE_MAX_COLUMN is 2000.  You can change it
at compile time to values as large as 32767. On the other hand, many
experienced database designers will argue that a well-normalized database
will never need more than 100 columns in a table.



In most applications, the number of columns is small - a few dozen.
There are places in the SQLite code generator that use algorithms
that are O(N&sup2;) where N is the number of columns.  
So if you redefine SQLITE_MAX_COLUMN to be a
really huge number and you generate SQL that uses a large number of
columns, you may find that sqlite3_prepare_v2()
runs slowly.



The maximum number of columns can be lowered at run-time using
the sqlite3_limit(db,SQLITE_LIMIT_COLUMN,size) interface.



Maximum Length Of An SQL Statement


The maximum number of bytes in the text of an SQL statement is 
limited to SQLITE_MAX_SQL_LENGTH which defaults to 1,000,000,000.



If an SQL statement is limited to be a million bytes in length, then
obviously you will not be able to insert multi-million byte strings
by embedding them as literals inside of INSERT statements.  But
you should not do that anyway.  Use host parameters 
for your data.  Prepare short SQL statements like this:



INSERT INTO tab1 VALUES(?,?,?);



Then use the sqlite3_bind_XXXX() functions
to bind your large string values to the SQL statement.  The use of binding
obviates the need to escape quote characters in the string, reducing the
risk of SQL injection attacks.  It also runs faster since the large
string does not need to be parsed or copied as much.



The maximum length of an SQL statement can be lowered at run-time using
the sqlite3_limit(db,SQLITE_LIMIT_SQL_LENGTH,size) interface.

Maximum Number Of Tables In A Join


SQLite does not support joins containing more than 64 tables.
This limit arises from the fact that the SQLite code generator
uses bitmaps with one bit per join-table in the query optimizer.



SQLite uses an efficient query planner algorithm
and so even a large join can be prepared quickly.
Hence, there is no mechanism to raise or lower the limit on the
number of tables in a join.


Maximum Depth Of An Expression Tree


SQLite parses expressions into a tree for processing.  During
code generation, SQLite walks this tree recursively.  The depth
of expression trees is therefore limited in order to avoid
using too much stack space.



The SQLITE_MAX_EXPR_DEPTH parameter determines the maximum expression
tree depth.  If the value is 0, then no limit is enforced.  The
current implementation has a default value of 1000.



The maximum depth of an expression tree can be lowered at run-time using
the sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size) interface if the
SQLITE_MAX_EXPR_DEPTH is initially positive.  In other words, the maximum
expression depth can be lowered at run-time if there is already a 
compile-time limit on the expression depth.  If SQLITE_MAX_EXPR_DEPTH is
set to 0 at compile time (if the depth of expressions is unlimited) then
the sqlite3_limi¤t(db,SQLITE_LIMIT_EXPR_DEPTH,size) is a no-op.




Maximum Number Of Arguments On A Function


The SQLITE_MAX_FUNCTION_ARG parameter determines the maximum number
of parameters that can be passed to an SQL function.  The default value
of this limit is 100.  SQLite should work with functions that have 
thousands of parameters.  However, we suspect that anybody who tries
to invoke a function with more than a few parameters is really
trying to find security exploits in systems that use SQLite, 
not do useful work, 
and so for that reason we have set this parameter relatively low.

The number of arguments to a function is sometimes stored in a signed
character.  So there is a hard upper bound on SQLITE_MAX_FUNCTION_ARG
of 127.


The maximum number of arguments in a function can be lowered at run-time using
the sqlite3_limit(db,SQLITE_LIMIT_FUNCTION_ARG,size) interface.


Maximum Number Of Terms In A Compound SELECT Statement


A compound SELECT statement is two or more SELECT statements connected
by operators UNION, UNION ALL, EXCEPT, or INTERSECT.  We call each
individual SELECT statement within a compound SELECT a "term".



The code generator in SQLite processes compound SELECT statements using
a recursive algorithm.  In order to limit the size of the stack, we
therefore limit the number of terms in a compound SELECT.  The maximum
number of terms is SQLITE_MAX_COMPOUND_SELECT which defaults to 500.
We think this is a generous allotment since in practice we almost
never see the number of terms in a compound select exceed single digits.



The maximum number of compound SELECT terms can be lowered at run-time using
the sqlite3_limit(db,SQLITE_LIMIT_COMPOUND_SELECT,size) interface.




Maximum Length Of A LIKE Or GLOB Pattern


The pattern matching algorithm used in the default LIKE and GLOB
implementation of SQLite can exhibit O(N&sup2;) performance (where
N is the number of characters in the pattern) for certain pathological
cases.  To avoid denial-of-service attacks from miscreants who are able
to specify their own LIKE or GLOB patterns, the length of the LIKE
or GLOB pattern is limited to SQLITE_MAX_LIKE_PATTERN_LENGTH bytes.
The default value of this limit is 50000.  A modern workstation can
evaluate even a pathological LIKE or GLOB pattern of 50000 bytes
relatively quickly.  The denial of service problem only comes into
play when the pattern length gets into millions of bytes.  Nevertheless,
since most useful LIKE or GLOB patterns are at most a few dozen bytes
in length, paranoid application developers may want to reduce this
parameter to something in the range of a few hundred if they know that
external users are able to generate arbitrary patterns.



The maximum length of a LIKE or GLOB pattern can be lowered at run-time using
the sqlite3_limit(db,SQLITE_LIMIT_LIKE_PATTERN_LENGTH,size) interface.


Maximum Number Of Host Parameters In A Single SQL Statement


A host parameter is a place-holder in an SQL statement that is filled
in using one of the
sqlite3_bind_XXXX() interfaces.
Many SQL programmers are familiar with using a question mark ("?") as a
host parameter.  SQLite also supports named host parameters prefaced
by ":", "$", or "@" and numbered host parameters of the form "?123".



Each host parameter in an SQLite statement is assigned a number.  The
numbers normally begin with 1 and increase by one with each new
parameter.  However, when the "?123" form is used, the host parameter
number is the number that follows the question mark.



SQLite allocates space to hold all host parameters between 1 and the
largest host parameter number used.  Hence, an SQL statement that contains
a host parameter like ?1000000000 would require gigabytes of storage.
This could easily overwhelm the resources of the host machine.
To prevent excessive memory allocations, 
the maximum value of a host parameter number is SQLITE_MAX_VARIABLE_NUMBER,
which defaults to 999 for SQLite versions prior to 3.32.0 (2020-05-22)
or 32766 for SQLite versions after 3.32.0.



The maximum host parameter number can be lowered at run-time using
the sqlite3_limit(db,SQLITE_LIMIT_VARIABLE_NUMBER,size) interface.


Maximum Depth Of Trigger Recursion


SQLite limits the depth of recursion of triggers in order to prevent
a statement involving recursive triggers from using an unbounded amount
of memory.  


Prior to SQLite version 3.6.18 (2009-09-11), 
triggers were not recursive and so
this limit was meaningless.  Beginning with version 3.6.18, recursive triggers
were supported but had to be explicitly enabled using the
PRAGMA recursive_triggers statement.  
Beginning with version 3.7.0 (2009-09-11), 
recursive triggers are enabled by default but can be manually disabled
using PRAGMA recursive_triggers.  The SQLITE_MAX_TRIGGER_DEPTH is
only meaningful if recursive triggers are enabled.

The default maximum trigger recursion depth is 1000.

Maximum Number Of Attached Databases


The ATTACH statement is an SQLite extension
that allows two or more databases to be associated to the same database
connection and to operate as if they were a single database.  The number
of simultaneously attached databases is limited to SQLITE_MAX_ATTACHED
which is set to 10 by default.
The maximum number of attached databases cannot be increased above 125.


The maximum number of attached databases can be lowered at run-time using
the sqlite3_limit(db,SQLITE_LIMIT_ATTACHED,size) interface.


Maximum Number Of Pages In A Database File


SQLite is able to limit the size of a database file to prevent
the database file from growing too large and consuming too much
disk space.
The SQLITE_MAX_PAGE_COUNT parameter, which is normally set to
1073741823, is the maximum number of pages allowed in a single
database file.  An attempt to insert new data that would cause
the database file to grow larger than this will return
SQLITE_FULL.



The largest possible setting for SQLITE_MAX_PAGE_COUNT is 4294967294.
When used with the maximum page size of 65536, this gives a maximum
SQLite database size of about 281 terabytes.


The 
max_page_count PRAGMA can be used to raise or lower this
limit at run-time.

Maximum Number Of Rows In A Table


The theoretical maximum number of rows in a table is
264 (18446744073709551616 or about 1.8e+19).
This limit is unreachable since the maximum database size of 281 terabytes
will be reached first.  A 281 terabytes database can hold no more than
approximately 2e+13 rows, and then only if there are no indices and if
each row contains very little data.
Maximum Database Size


Every database consists of one or more "pages".  Within a single database,
every page is the same size, but different databases can have page sizes
that are powers of two between 512 and 65536, inclusive.  The maximum
size of a database file is 4294967294 pages.  At the maximum page size
of 65536 bytes, this translates into a maximum database size of 
approximately 1.4e+14 bytes (281 terabytes, or 256 tebibytes, or
281474 gigabytes or 256,000 gibibytes).

This particular upper bound is untested since the developers do not 
have access to hardware capable of reaching this limit.  However, tests
do verify that SQLite behaves correctly and sanely when a database 
reaches the maximum file size of the underlying filesystem (which is
usually much less than the maximum theoretical database size) and when
a database is unable to grow due to disk space exhaustion.
Maximum Number Of Tables In A Schema


Each table and index requires at least one page in the database file.
An "index" in the previous sentence means an index created explicitly
using a CREATE INDEX statement or implicit indices created by UNIQUE
and PRIMARY KEY constraints.  Since the maximum number of pages in a
database file is 2147483646 (a little over 2 billion) this is also then
an upper bound on the number of tables and indices in a schema.

Whenever a database is opened, the entire schema is scanned and parsed
and a parse tree for the schema is held in memory.  That means that
database connection startup time and initial memory usage
is proportional to the size of the schema.


This page last modified on  2022-01-20 21:38:08 UTClimits.html
ƒƒöi‚
Mìu#Implementation Limits For SQLiteLimits In SQLite


"Limits" in the context of this article means sizes or
quantities that can not be exceeded.  We are concerned
with things like the maximum number of bytes in a
BLOB or the maximum number of columns in a table.



SQLite was originally designed with a policy of avoiding
arbitrary limits.
Of course, every program that runs on a machine with finite
memory and disk space has limits of some kind.  But in SQLite, 
those limits
were not well defined.  The policy was that if it would fit
in memory and you could count it with a 32-bit integer, then
it should work.



Unfortunately, the no-limits policy has been shown to create
problems.  Because the upper bounds were not well
defined, they were not tested, and bugs were often found
when pushing SQLite to extremes.  For this reason, versions
of SQLite since about release 3.5.8 (2008-04-16)
have well-defined limits, and those limits are tested as part of
the test suite.



This article defines what the limits of SQLite are and how they
can be customized for specific applications.  The default settings
for limits are normally quite large and adequate for almost every
application.  Some applications may want to increase a limit here
or there, but we expect such needs to be rare.  More commonly,
an application might want to recompile SQLite with much lower
limits to avoid excess resource utilization in the event of
bug in higher-level SQL statement generators or to help thwart 
attackers who inject malicious SQL statements.



Some limits can be changed at run-time on a per-connection basis
using the sqlite3_limit() interface with one of the
limit categories defined for that interface.
Run-time limits are designed for applications that have multiple
databases, some of which are for internal use only and others which
can be influenced or controlled by potentially hostile external agents.
For example, a web browser application might use an internal database
to track historical page views but have one or more separate databases
that are created and controlled by javascript applications that are
downloaded from the internet.
The sqlite3_limit() interface allows internal databases managed by
trusted code to be unconstrained while simultaneously  placing tight
limitations on databases created or controlled by untrusted external
code in order to help prevent a denial of service attack.





Maximum length of a string or BLOB


The maximum number of bytes in a string or BLOB in SQLite is defined
by the preprocessor macro SQLITE_MAX_LENGTH.  The default value
of this macro is 1 billion (1 thousand million or 1,000,000,000).
You can raise or lower this value at compile-time using a command-line 
option like this:


-DSQLITE_MAX_LENGTH=123456789


The current implementation will only support a string or BLOB
length up to 231-1 or 2147483647.  And
some built-in functions such as hex() might fail ¢
||“‚
        ]¥'Constraint Conflict Resolution in SQLiteConstraint Conflict Resolution in SQLite


In most SQL databases, if you have a UNIQUE, NOT NULL, or
CHECK constraint on
a table and you try to do an UPDATE or INSERT that violates
the constraint, the database will abort the operation in
progress, back out any prior changes associated with the same
UPDATE or INSERT statement, and return an error.
This is the default behavior of SQLite, though SQLite also allows one to
define alternative ways for dealing with constraint violations.
This article describes those alternatives and how to use them.


Conflict Resolution Algorithms


SQLite defines five constraint conflict resolution algorithms
as follows:



ROLLBACK
When a constraint violation occurs, an immediate ROLLBACK
occurs, thus ending the current transaction, and the command aborts
with a return code of SQLITE_CONSTRAINT.  If no transaction is
active (other than the implied transaction that is created on every
command) then this algorithm works the same as ABORT.

ABORT
When a constraint violation occurs, the command backs out
any prior changes it might have made and aborts with a return code
of SQLITE_CONSTRAINT.  But no ROLLBACK is executed so changes
from prior commands within the same transaction
are preserved.  This is the default behavior for SQLite.

FAIL
When a constraint violation occurs, the command aborts with a
return code SQLITE_CONSTRAINT.  But any changes to the database that
the command made prior to encountering the constraint violation
are preserved and are not backed out.  For example, if an UPDATE
statement encountered a constraint violation on the 100th row that
it attempts to update, then the first 99 row changes are preserved
but change to rows 100 and beyond never occur.

IGNORE
When a constraint violation occurs, the one row that contains
the constraint violation is not inserted or changed.  But the command
continues executing normally.  Other rows before and after the row that
contained the constraint violation continue to be inserted or updated
normally.  No error is returned.

REPLACE
When a UNIQUE constraint violation occurs, the pre-existing row
that caused the constraint violation is removed prior to inserting
or updating the current row.  Thus the insert or update always occurs.
The command continues executing normally.  No error is returned.

This page last modified on  2014-08-15 14:59:54 UTCconflict.html¨cess
SQLite from multiple threads.  For single-threaded applications, or
applications which only call SQLite from a single thread, the mutex
subsystem can be completely disabled by recompiling with the following
option:


-DSQLITE_THREADSAFE=0


Mutexes are cheap but they are not free, so performance will be better
when mutexes are completely disabled.  The resulting library footprint
will also be a little smaller.  Disabling the mutexes at compile-time
is a recommended optimization for applications where it makes sense.

When using SQLite as a shared library, an application can test to see
whether or not mutexes have been disabled using the
sqlite3_threadsafe() API.  Applications that link against SQLite at
run-time and use SQLite from multiple threads should probably check this
API to make sure they did not accidentally get linked against a version of
the SQLite library that has its mutexes disabled.  Single-threaded
applications will, of course, work correctly regardless of whether or
not SQLite is configured to be threadsafe, though they will be a little
bit faster when using versions of SQLite with mutexes disabled.

SQLite mutexes can also be disabled at run-time using the
sqlite3_config() interface.  To completely disable all mutexing,
the application can invoke:


sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);


Disabling mutexes at run-time is not as effective as disabling them
at compile-time since SQLite still must do a test of a boolean variable
to see if mutexes are enabled or disabled at each point where a mutex
might be required.  But there is still a performance advantage for
disabling mutexes at run-time.

For multi-threaded applications that are careful about how they
manage threads, SQLite supports an alternative run-time configuration
that is half way between not using any mutexes and the default situation
of mutexing everything in sight.  This in-the-middle mutex alignment can
be established as follows:


sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
sqlite3_config(SQLITE_CONFIG_MEMSTATUS, 0);


There are two separate configuration changes here which can
be used either together or separately. The
SQLITE_CONFIG_MULTITHREAD setting disables the mutexes that
serialize access to database connection objects and 
prepared statement objects.  With this setting, the application
is free to use SQLite from multiple threads, but it must make sure
than no two threads try to access the same database connection
or any prepared statements associated with the same 
database connection at the same time.  Two threads can use SQLite
at the same time, but they must use separate database connections.
The second SQLITE_CONFIG_MEMSTATUS setting disables the mechanism
in SQLite that tracks the total size of all outstanding memory
allocation requests.  This omits the need to mutex each call
to sqlite3_malloc() and sqlite3_free(), which saves a huge
number of mutex operations.  But a consequence of disabling the
memory statistics mechanism is that the 
sqlite3_memory_used(), sqlite3_memory_highwater(), and
sqlite3_soft_heap_limit64() interfaces cease to work.


SQLite uses pthreads for its mutex implementation on Unix and
SQLite requires a recursive mutex.  Most modern pthread implementations
support recursive mutexes, but not all do.  For systems that do not
support recursive mutexes, it is recommended that applications operate
in single-threaded mode only.  If this is not possible, SQLite provides
an alternative recursive mutex implementation built on top of the
standard "fast" mutexes of pthreads.  This alternative
implementation should work correctly as long as pthread_equal() is
atomic and the processor has a coherent data cache.  The alternative
recursive mutex implementation is enabled by the following
compiler command-line switch:


-DSQLITE_HOMEGROWN_RECURSIVE_MUTEX=1


When porting SQLite to a new operating system, it is usually necessary
to completely replace the built-in mutex subsystem with an alternative
built around the mutex primitives of the new operating system.  This
is accomplished by compiling SQLite with the following option:


-DSQLITE_MUTEX_APPDEF=1


When SQLite is compiled with the SQLITE_MUTEX_APPDEF=1 option, it
completely omits the implementation of its 
mutex primitive functions.  But the SQLite
library still attempts to call these functions where necessary, so the
application must itself implement the
mutex primitive functions and link them together
with SQLite.

3.0 Configuring Or Replacing The Memory Allocation Subsystem

By default, SQLite obtains the memory it needs for objects and
cache from the malloc()/free() implementation of the standard library.
There is also on-going work with experimental memory allocators that
satisfy all memory requests from a single fixed memory buffer handed
to SQLite at application start.  Additional information on these
experimental memory allocators will be provided in a future revision
of this document.

SQLite supports the ability of an application to specify an alternative
memory allocator at run-time by filling in an instance of the
sqlite3_mem_methods object with pointers to the routines of the
alternative implementation then registering the new alternative
implementation using the sqlite3_config() interface.
For example:


sqlite3_config(SQLITE_CONFIG_MALLOC, &my_malloc_implementation);


SQLite makes a copy of the content of the sqlite3_mem_methods object
so the object can be modified after the sqlite3_config() call returns.

4.0 Adding New Virtual File Systems

Since version 3.5.0 (2007-09-04), 
SQLite has supported an interface called the
virtual file system or "VFS".
This object is somewhat misnamed since it
is really an interface to the whole underlying operating system, not
just the filesystem.

 One of the interesting features
of the VFS interface is that SQLite can support multiple VFSes at the
same time.  Each database connection has to choose a single VFS for its
use when the connection is first opened using sqlite3_open_v2().
But if a process contains multiple database connections each can choose
a different VFS.  VFSes can be added at run-time using the
sqlite3_vfs_register() interface.

The default builds for SQLite on Unix, Windows, and OS/2 include 
a VFS appropriate for the target platform.  SQLite builds for other
operating systems do not contain a VFS by default, but the application
can register one or more at run-time.

5.0 Porting SQLite To A New Operating System

In order to port SQLite to a new operating system - an operating
system not supported by default - the application
must provide...


 a working mutex subsystem (but only if it is multithreaded), 
 a working memory allocation subsystem (assuming it lacks malloc()
in its standard library), and
 a working VFS implementation.


All of these things can be provided in a single auxiliary C code file
and then linked with the stock "sqlite3.c" code file to generate a working
SQLite build for the target operating system.  In addition to the
alternative mutex and memory allocation subsystems and the new VFS,
the auxiliary C code file should contain implementations for the
following two routines:


 sqlite3_os_init() 
 sqlite3_os_end() 


The "sqlite3.c" code file contains default implementations of a VFS
and of the sqlite3_initialize() and sqlite3_shutdown() functions that
are appropriate for Unix, Windows, and OS/2.
To prevent one of these default components from being loaded when sqlite3.c
is compiled, it is necessary to add the following compile-time
option:


-DSQLITE_OS_OTHER=1



The SQLite core will call sqlite3_initialize() early.  The auxiliary
C code file can contain an implementation of sqlite3_initialize() that
registers an appropriate VFS and also perhaps initializes an alternative
mutex system (if mutexes are required) or does any memory allocation
subsystem initialization that is required.
The SQLite core never calls sqlite3_shutdown() but it is part of the
official SQLite API and is not otherwise provided when compiled with
-DSQLITE_OS_OTHER=1, so the auxiliary C code file should probably provide
it for completeness.
This page last modified on  2021-11-17 15:30:21 UTCcustombuild.html
˜˜ÜX‚
;¸[-Custom Builds Of SQLiteCustom Builds Of SQLite
or
Porting SQLite To New Operating Systems


1.0 Introduction

For most applications, the recommended method for building
SQLite is to use the amalgamation code
file, sqlite3.c, and its corresponding header file
sqlite3.h.  The sqlite3.c code file should compile and
run on any Unix, Windows system without any changes
or special compiler options.  Most applications can simply include
the sqlite3.c file together with the other C code files that make
up the application, compile them all together, and have working
and well configured version of SQLite.

Most applications work great with SQLite in its
default configuration and with no special compile-time configuration.
Most developers should be able to completely ignore this document
and simply build SQLite from
the amalgamation without any
special knowledge and without taking any special actions.

However, highly tuned and specialized
applications may want or need to replace some of
SQLite's built-in system interfaces with alternative implementations
more suitable for the needs of the application.  SQLite is designed
to be easily reconfigured at compile-time to meet the specific
needs of individual projects.  Among the compile-time configuration
options for SQLite are these:


 Replace the built-in mutex subsystem with an alternative
        implementation.  

 Completely disable all mutexing for use in single-threaded
        applications. 

 Reconfigure the memory allocation subsystem to use a memory
        allocator other the malloc() implementation from the standard
        library. 

 Realign the memory allocation subsystem so that it never calls
        malloc() at all but instead satisfies all memory requests using
        a fixed-size memory buffer assigned to SQLite at startup. 

 Replace the interface to the file system with an alternative
        design.  In other words, override all of the system calls that
        SQLite makes in order to talk to the disk with a completely different
        set of system calls. 

 Override other operating system interfaces such as calls to obtain
        Zulu or local time. 


Generally speaking, there are three separate subsystems within
SQLite that can be modified or overridden at compile-time.  The
mutex subsystem is used to serialize access to SQLite resources that
are shared among threads.  The memory allocation subsystem is used
to allocate memory required by SQLite objects and for the database
cache.  Finally, the Virtual File System subsystem is
used to provide a portable interface between SQLite and the underlying
operating system and especially the file system.  We call these three
subsystems the "interface" subsystems of SQLite.

We emphasis that most applications are well-served by the 
built-in default implementations of the SQLite interface subsystems.
Developers are encouraged to use the
default built-in implementations whenever possible
and to build SQLite without any special compile-time options or parameters.
However, some highly specialized applications may benefit from
substituting or modifying one or more of these built-in SQLite
interface subsystems.
Or, if SQLite is used on an operating system other than
Unix (Linux or Mac OS X), Windows (Win32 or WinCE), or OS/2 then none
of the interface subsystems that come built into SQLite will work
and the application will need to provide alternative implementations
suitable for the target platform.

2.0 Configuring Or Replacing The Mutex Subsystem

In a multithreaded environment, SQLite uses mutexes to serialize
access to shared resources.
The mutex subsystem is only required for applications that ac§«ttp://www.sqlite.org/
("SQLite"); and

WHEREAS, Company wishes to support the independent development of 
the SQLite database engine to insure the continuing reliability, 
vitality, and independence of SQLite, and in connection therewith,
Company wishes to provide funds for ongoing research, development, 
and maintenance of the SQLite code base, operation of the SQLite 
website, protection and maintenance of the SQLite
trademark, as well as for promotion of SQLite at conferences and
trade shows; and

WHEREAS, Company wishes to receive benefits in the form of
services from Hwaci in consideration for their support of SQLite; and

WHEREAS, Company and Hwaci each wish SQLite to be supported and 
maintained as an independent, community-driven project, and to 
ensure the SQLite development team remains independent.

NOW, THEREFORE, in consideration of the mutual promises contained 
herein, the parties agree as follows:

1.0 Definitions

1.1 SQLite Developers
The "SQLite Developers" are the employees or contractors of Hwaci engaged 
in the development of SQLite, including without limitation the 
SQLite Architect.

1.2 SQLite Architect
The "SQLite Architect" is the SQLite Developer with ultimate 
responsibility and authority over changes and maintenance of the 
SQLite code.  The current SQLite Architect is the original designer
and developer of SQLite, D. Richard Hipp.   Hwaci may change the 
SQLite Architect from time to time upon approval by Company.

1.3 Consortium Member
A "Consortium Member" is a company or organization, including
but not limited to Company, which has entered into an agreement
with Hwaci which is substantially similar to this Agreement.


2.0 Agreement

2.1 Responsibilities And Obligations Of SQLite Developers

2.1.1 General Support
The SQLite Developers shall provide, without limit,
timely and accurate answers, advice, and instruction
in response to questions and comments from Company about SQLite
submitted by email or by telephone at any time day or night.


2.1.2 Debugging Support
The SQLite Developers shall at Company's request provide
Company with direct assistance
in debugging applications that are built upon or use SQLite.
The combined time for Debugging Support and Custom
Development for Company is limited to 330 hours per year.


2.1.3 Custom Development
The SQLite Developers shall at the request of Company
write new extensions or enhancements
to SQLite according to Company's specifications.  These extensions
and enhancements may be proprietary to Company or open source or
with the consent of both Company and the SQLite Architect may
be folded into the public domain SQLite source tree.
The time devoted to Custom Development for Company is limited 220 hours
per year.


2.1.4 Custom Builds
The SQLite Developers shall at Company's request provide Company
with specialized builds of SQLite according to Company's specifications.


2.1.5 Legacy Support
The SQLite Developers shall at Company's request provide support
and bug-fix patches for any historical version of SQLite.


2.1.6 Custom Testing
The SQLite Developers shall at Company's request set up and run
acceptance tests according Company's specifications that are specifically 
designed to exercise SQLite as configured and used by Company.
These acceptance tests shall be run and shall pass prior to any release
of SQLite.


2.1.7 Priority Bug Fixes
The SQLite Developers shall assign highest priority to fixing bugs
in SQLite that are reported by Company or in which Company has
expressed a specific interest.


2.1.8 Code Quality
The SQLite Developers shall at all times keep the SQLite source 
code well commented and documented and clearly structured and 
organized so that an experienced and competent programmer can
understand it and support it after no more than a few months of study.


2.1.9 Backwards Compatibility
The SQLite Developers recognize that Company uses SQLite 
in mission-critical applications and therefore shall work diligently 
to ensure continuing bug-free correct operation and backwards 
compatibility with prior releases.


2.1.10 Tes¬t Coverage
The SQLite Developers shall maintain the SQLite test suite such
that no less than 95% source code coverage is provided.


2.1.11 Website
The SQLite Developers shall maintain the SQLite website at
http://www.sqlite.org/
in good working order and all SQLite source code shall 
be made freely available at such website. 



2.2 Responsibilities And Obligations Of The SQLite Architect

2.2.1 Private Briefings
The SQLite Architect shall, at the request of Company, 
provide Company with private notification and briefings
of any new bugs or new features in SQLite that might 
effect Company's products.


2.2.2 Direction
The SQLite Architect shall coordinate the activities of SQLite
Developers and shall publish from time to time a roadmap of
proposed future changes and enhancements to SQLite.


2.2.3 Oversight
The SQLite Architect shall personally review all changes to 
the SQLite Source Code and take responsibility for the quality 
and correctness of those changes.


2.2.4 Continuity
The initial SQLite Architect shall be the original developer
of SQLite, D. Richard Hipp.  The role of SQLite Architect shall
not be assigned to another during the term of this Agreement except 
due to the disability of Dr. Hipp and with approval of Company.


2.3 Responsibilities And Obligations Of Hwaci

2.3.1 Employer
Hwaci shall act as the employer of the SQLite Developers and
SQLite Architect and shall make all tax and legal filings
and tax withholding required by employers.  Hwaci shall provide
Company with W-9 information upon request.


2.3.2 Responsible Party
All obligations of the SQLite Developers set forth in this
agreement are deemed obligations of Hwaci.  Hwaci shall recruit, 
employ, and supervise SQLite Developers in such a way that the
responsibilities and obligations of the SQLite Developers set 
forth in this agreement are upheld.

2.3.3 Multiple Developers
Hwaci shall recruit and employ as many SQLite Developers for as
many hours as can be reasonably achieved using the funds received 
from Consortium Members under this agreement.
So that support for SQLite will not be interrupted by the
disability or withdrawal of any one SQLite Developer, Hwaci will
keep at least two knowledgeable and competent SQLite Developers
on staff.

2.3.4 Mentorship
Hwaci shall work to encourage independent 
programmers from around the world
to become familiar with SQLite internals so that there will be a
pool of talent able to support SQLite in the future.


2.3.5 Audits
Hwaci shall keep and maintain complete and accurate records
of the use of development funds provided by Company
and shall allow Company, or its representative, a certified 
public accountant mutually acceptable to Hwaci and Company, 
during office hours and at reasonable intervals, no more than 
once every 12 months, to inspect and make extracts or copies
of such records solely for the purpose of ascertaining Hwaci's 
compliance with the objectives and requirements of this agreement.


2.3.6 Disaster Planning
Hwaci shall maintain backup copies of all
SQLite source files and documentation, current and historical,
at at least two separate locations separated from each
other and from the primary on-line SQLite repository
by at least 400 kilometers.


2.3.7 Trademark
Hwaci shall maintain ownership of the SQLite trademark and
the sqlite.org domain name and shall purchase bandwidth and
server space for the 
http://www.sqlite.org/ website.


2.3.8 No Take-overs or Buy-outs
Neither Hwaci nor the SQLite Architect shall relinquish development
control of SQLite during the term of this Agreement, by acquisition or merger 
or by any other means,
except with the consent of Company.


2.3.9 New Consortium Members
New Consortium Members may be accepted into the consortium from
time to time under identical terms as this agreement, or under
substantially similar terms that have been approved by existing
Consortium Members.

2.3.10 Adequate Staff
Hwaci shall recruit and employ a sufficient number of qualified
SQLite Developers to easily cover all custom development,
debugging, and general suppo-rt service obligations for all
Consortium Members while still providing ample time for
the SQLite Developers to engage in general maintenance
and extension of SQLite.


2.3.11 Use Of Funds
Hwaci shall use the funds provided hereunder
solely for the development and maintenance of SQLite as set forth in
this Agreement.
Interest on funds received in advance and held in trust will
be reinvested and used for the same purposes as the principal.


2.4 Responsibilities And Obligations Of Company

2.4.1 Funding
Company shall provide funding for the ongoing support and
maintenance of SQLite as set forth in section 3.0 "Fees".


2.4.2 Copyright Disclaimer
Company acknowledges that SQLite source code and documentation
published on the SQLite website
is in the public domain and that nothing in this agreement shall change
that fact.


3.0 Fees

In consideration of the performance
by Hwaci, the SQLite Developers, and the SQLite Architect
of the obligations described herein,
Company shall pay Hwaci at least US $75,000 per year in advance
either annually, quarterly, or monthly, at Company's discretion.

4.0 Confidentiality

4.1 Definition of Confidential Information

"Confidential Information" means any Company proprietary information, 
technical data, trade secrets or know-how, including, but not limited to, 
research, product plans, products, services, customers, customer lists, 
markets, software, developments, inventions, processes, formulas, 
technology, designs, drawings, engineering, hardware configuration 
information, marketing, finances or other business information 
disclosed by Company either directly or indirectly in writing, 
orally or by drawings or inspection of parts or equipment.

4.2 Non-Use and Non-Disclosure.

Hwaci shall not, during or subsequent to the term of this Agreement,
use Company's Confidential Information for any purpose whatsoever
other than the performance of the Services or disclose 
Company's Confidential Information to any third party.  The parties 
acknowledge that Confidential Information will remain the sole
property of Company.  Hwaci shall take all reasonable precautions 
to prevent any unauthorized disclosure of Confidential Information 
including, but not limited to, having each employee or 
consultant of Hwaci, if any, with access to any 
Confidential Information, execute a nondisclosure agreement
containing provisions in Company's favor substantially similar 
to this Agreement.  Confidential Information does not include
information that: (i) is known to Hwaci at the time of 
disclosure to Hwaci by Company as evidenced by written 
records of Hwaci; (ii) has become publicly known and made 
generally available through no wrongful act of Hwaci; or 
(iii) has been received by Hwaci from a third party who is 
authorized to make such disclosure.

4.2.1 Disclosure Required by Law
In the event any Confidential Information is required to be disclosed 
by Hwaci under the terms of a valid and effective subpoena or order 
issued by a court of competent jurisdiction, or by a demand or 
information request from an executive or administrative agency 
or other governmental authority, Hwaci shall, unless prohibited
by the terms of a subpoena, order, or demand, promptly notify 
Company of the existence, terms and circumstances surrounding 
such demand or request, shall consult with Company on the 
advisability of taking legally available steps to resist 
or narrow such demand or request, and, if disclosure of 
such Confidential Information is required, shall exercise 
its reasonable best efforts to narrow the scope of disclosure 
and obtain an order or other reliable assurance that 
confidential treatment will be accorded to such 
Confidential Information.  To the extent that Hwaci
is prohibited from notifying Company of a subpoena, 
order or demand, by the terms of same, Hwaci shall exercise 
its reasonable efforts to narrow the scope of disclosure.

4.3 Return of Materials.

Upon the termination of this Agreement, or upon Company's 
earlier request, Hwaci shall deliver to Company all of
Company's property® or Confidential Information that Hwaci 
may have in Hwaci's possession or control.

5.0 Intellectual Property

5.1 No Assignment

Company acknowledges that all copyrightable material, notes, 
records, drawings, designs, inventions, improvements, developments, 
discoveries and trade secrets made, generated, conceived, or
reduced to practice by Hwaci related to SQLite
will remain the property of Hwaci.  Nothing in this Agreement
will be construed to transfer any intellectual property right 
of Hwaci to Company.

5.2 Availability and Public Domain Dedication

The SQLite Developers and Hwaci shall, 
subject to their discretion as to the quality
and suitability of the SQLite source code and documentation
for public release, make 
the SQLite source code and documentation
publicly available as downloadable files
and make a public statement ceding all intellectual 
property rights, including but not limited to copyright
and patent rights, in the SQLite source code and documentation
to the public domain.  
To the extent that the SQLite Developers and Hwaci 
elect not to release the SQLite
source code and documentation
publicly, they shall provide copies thereof to 
Company and hereby grants to Company, under all of the 
SQLite Developers' and Hwaci's 
rights
including but not limited to copyright and patent rights,
in and to the SQLite source code and documentation, 
perpetual, irrevocable, 
worldwide, non-exclusive, sublicenseable license to use, 
copy, prepare derivative works of, publicly perform and 
display the SQLite source code and documentation 
and derivative works thereof.

5.3 Trademark

Hwaci shall use the name "SQLite" only to apply to the 
publicly available project known by such name as of the 
Effective Date.  Hwaci may in its discretion file such 
trademark applications or registrations as it deems 
appropriate to protect or record its rights therein, 
and may set such policies as it deems appropriate for 
licensing the use of the trademark.

6.0 Representations And Warranties

6.1 Intellectual Property Clearances.

Hwaci hereby represents and warrants that Hwaci shall 
enter into agreements with the SQLite Developers sufficient 
to enable Hwaci to undertake the obligations of Section 5.

6.2 Disclaimer.

THE WORK PRODUCT AND ALL MATERIAL PROVIDED BY HWACI AND 
COMPANY ARE PROVIDED "AS IS."  NEITHER PARTY MAKES ANY 
REPRESENTATIONS OR WARRANTIES OF ANY KIND, WHETHER ORAL
OR WRITTEN, WHETHER EXPRESS, IMPLIED, OR ARISING BY STATUTE, 
CUSTOM, COURSE OF DEALING OR TRADE USAGE, WITH RESPECT TO 
THE SUBJECT MATTER HEREOF, IN CONNECTION WITH THIS AGREEMENT.  
EACH PARTY SPECIFICALLY DISCLAIMS ANY AND ALL IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, MERCHANTABILITY, 
FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.

7.0 Term And Termination

7.1 Term.

This Agreement will commence on the Effective Date and 
will continue until 12 months after the Effective Date.
Thereafter, the parties may by mutual consent renew 
this Agreement subject to agreement on fees to be paid by 
Company for sponsorship for additional periods.

7.2 Termination.

If either party materially defaults in the performance 
of any of its material obligations hereunder and if any 
such default is not corrected within 30 days after notice 
in writing, then the non-defaulting party, at its option, 
may, in addition to any other remedies it may have, thereupon 
terminate this Agreement by giving written notice of 
termination to the defaulting party.

7.3 Survival.

Upon such termination all rights and duties of the
parties toward each other will cease except:  
Sections 4 (Confidentiality), 5 (Intellectual Property), 
and 8 (Miscellaneous) will survive termination of this Agreement.

8. Miscellaneous

8.1 Nonassignment/Binding Agreement.

The parties acknowledge that the unique nature of 
Hwaci's services are substantial consideration for the 
parties' entering into this Agreement.  Neither this 
Agreement nor any rights under this Agreement may be 
assigned or otherwise transferred by Hwaci, in whole 
or in part, whether voluntarily or by operation of law, 
without the prior written consent of Company, which 
consent will not be unreasonably withheld.  
Subject to the foregoing, this Agreement will be binding
upon and will inure to the benefit of the parties and
their respective successors and assigns. Any assignment 
in violation of the foregoing will be null and void.

8.2 Notices.

Any notice required or permitted under the terms of 
this Agreement or required by law must be in writing 
and must be:  (a) delivered in person; (b) sent by first 
class registered mail, or air mail, as appropriate; or 
(c) sent by overnight air courier, in each case properly 
posted and fully prepaid to the appropriate address set 
forth in the preamble to this Agreement.  Either party 
may change its address for notice by notice to the other 
party given in accordance with this Section.  Notices 
will be considered to have been given at the time of
actual delivery in person, three business days after 
deposit in the mail as set forth above, or one day after 
delivery to an overnight air courier service.

8.3 Waiver.

Any waiver of the provisions of this Agreement or 
of a party's rights or remedies under this Agreement 
must be in writing to be effective.  Failure, neglect, 
or delay by a party to enforce the provisions of this 
Agreement or its rights or remedies at any time, will
not be construed as a waiver of such party's rights 
under this Agreement and will not in any way affect 
the validity of the whole or any part of this Agreement 
or prejudice such party's right to take subsequent action. 
No exercise or enforcement by either party of any right
or remedy under this Agreement will preclude the 
enforcement by such party of any other right or remedy 
under this Agreement or that such party is entitled by 
law to enforce.

8.4 Severability.

If any term, condition, or provision in this Agreement 
is found to be invalid, unlawful or unenforceable to 
any extent, the parties shall endeavor in good faith 
to agree to such amendments that will preserve, as far
as possible, the intentions expressed in this Agreement. 
If the parties fail to agree on such an amendment, 
such invalid term, condition or provision will be 
severed from the remaining terms, conditions and
provisions, which will continue to be valid and 
enforceable to the fullest extent permitted by law.

8.5 Integration.

This Agreement contains the entire agreement of the 
parties with respect to the subject matter of this 
Agreement and supersedes all previous communications, 
representations, understandings and agreements, 
either oral or written, between the parties with 
respect to said subject matter.  This Agreement 
may not be amended, except by a writing signed by both parties.

8.6 Counterparts.

This Agreement may be executed in counterparts, 
each of which so executed will be deemed to be an 
original and such counterparts together will constitute 
one and the same agreement.

8.7 Governing Law.

This Agreement will be interpreted and construed in 
accordance with the laws of the State of North Carolina
and the United States of America, without regard to
conflict of law principles.  All disputes arising out 
of this Agreement will be subject to the exclusive 
jurisdiction of the state and federal courts located in 
North Carolina, and each party hereby consents to the 
personal jurisdiction thereof.

8.8 Independent Contractors.

It is the intention of the parties that Hwaci is an 
independent contractor.  Nothing in this Agreement will 
in any way be construed to constitute Hwaci or any of 
its employees as an agent, employee or representative 
of Company.

9.0 Signatures

The parties have executed this Agreement below to 
indicate their acceptance of its terms.



HWACI
By:
&nbsp;
Print Name:
&nbsp;
Title:
&nbsp;


COMPANY
By:
&nbsp;
Print Name:
&nbsp;
Title:
&nbsp;consortium_agreement-20071201.html
h&h„æi‚
]‰Ì]+The sqlite3_analyzer.exe Utility Program1. The sqlite3_analyzer.exe Utility Program


The sqlite3_analyzer.exe binary is a command-line utility program
that measures and displays how much and how efficiently space is used by 
individual tables and indexes with an SQLite database file.
Example usage:


sqlite3_analyzer database.sqlite



The output is a human-readable ASCII text report that provides information
on the space utilization of the database file.  The report is intended to
be self-explanatory, though there is some 
additional explanation of the
various parameters reported toward the end of the report.


The output is also valid SQL.  Most of the report text is contained within
a header comment, with various SQL statements that create and initialize
a database at the
end of the report.  The constructed database contains
the raw data from which the report was extracted.  Hence the original
report can be read into an i°‹d‚    E–s%SQLite: Single File DatabaseSingle-file Cross-platform Database


A database in SQLite is a single disk file&sup1;.
Furthermore, the file format is cross-platform.
A database that is created on one machine can be
copied and used on a different machine with
a different architecture.  SQLite databases
are portable across 32-bit and 64-bit machines
and between 
big-endian and 
little-endian
architectures.



The SQLite database file format is also stable.
All releases of SQLite version 3 can read and write database
files created by the very first SQLite 3 release (version 3.0.0)
going back to 2004-06-18.  This is "backwards compatibility".
The developers promise to maintain backwards compatibility of
the database file format for all future releases of SQLite 3.
"Forwards compatibility" means that older releases
of SQLite can also read and write databases created by newer
releases.  SQLite is usually, but not completely forwards
compatible. 



The stability of the SQLite database file format and the fact
that the file format is cross-platform combine to make SQLite
database files an excellent choice as an 
Application File Format.
The US Library Of Congress acknowledges this by listing SQLite
as a recommended storage format for long-term preservation of
digital content.





Notes:

Temporary journal files are created as part of transaction control,
but those extra files are not part of the steady-state database.


This page last modified on  2020-04-06 18:59:20 UTConefile.html¢‚
C‚ÃQSQLite Consortium AgreementSQLite Consortium Agreement


This SQLite Consortium Agreement ("Agreement") is made and
entered into as of the _____ day of ______________, 2007 ("Effective Date")
by and between ___________________ (the "Company"), and
Hipp, Wyrick & Company, Inc., a Georgia Corporation with
headquarters at 6200 Maple Cove Lane, Charlotte, NC ("Hwaci").

WHEREAS, Hwaci is the developer of a serverless, embeddable, public
domain SQL database engine available at 
hª±nstance of the command-line shell and then
the raw data can be queried to dig deeper into the space utilization of
a particular database file.

1.1. Implementation


The sqlite3_analyzer.exe program is a
TCL program that uses the dbstat virtual table
to gather information about the database file and then format that
information neatly.



1.2. Example Output

The following is sqlite3_analyzer output for an example
places.sqlite database used by Firefox.


/** Disk-Space Utilization Report For &#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;/places.sqlite

Page size in bytes................................ 32768     
Pages in the whole file (measured)................ 221       
Pages in the whole file (calculated).............. 221       
Pages that store data............................. 221        100.0% 
Pages on the freelist (per header)................ 0            0.0% 
Pages on the freelist (calculated)................ 0            0.0% 
Pages of auto-vacuum overhead..................... 0            0.0% 
Number of tables in the database.................. 14        
Number of indices................................. 23        
Number of defined indices......................... 17        
Number of implied indices......................... 6         
Size of the file in bytes......................... 7241728   
Bytes of user payload stored...................... 2503069     34.6% 

*** Page counts for all tables with their indices *****************************

MOZ_PLACES........................................ 142         64.3% 
MOZ_HISTORYVISITS................................. 41          18.6% 
MOZ_FAVICONS...................................... 15           6.8% 
MOZ_BOOKMARKS..................................... 5            2.3% 
MOZ_KEYWORDS...................................... 3            1.4% 
MOZ_ANNO_ATTRIBUTES............................... 2            0.90% 
MOZ_ANNOS......................................... 2            0.90% 
MOZ_BOOKMARKS_ROOTS............................... 2            0.90% 
MOZ_HOSTS......................................... 2            0.90% 
MOZ_INPUTHISTORY.................................. 2            0.90% 
MOZ_ITEMS_ANNOS................................... 2            0.90% 
SQLITE_SCHEMA..................................... 1            0.45% 
SQLITE_SEQUENCE................................... 1            0.45% 
SQLITE_STAT1...................................... 1            0.45% 

*** Page counts for all tables and indices separately *************************

MOZ_PLACES........................................ 63          28.5% 
MOZ_PLACES_URL_UNIQUEINDEX........................ 37          16.7% 
MOZ_HISTORYVISITS................................. 13           5.9% 
MOZ_FAVICONS...................................... 12           5.4% 
MOZ_HISTORYVISITS_PLACEDATEINDEX.................. 12           5.4% 
MOZ_PLACES_HOSTINDEX.............................. 11           5.0% 
MOZ_HISTORYVISITS_DATEINDEX....................... 10           4.5% 
MOZ_PLACES_GUID_UNIQUEINDEX....................... 9            4.1% 
MOZ_PLACES_LASTVISITDATEINDEX..................... 7            3.2% 
MOZ_HISTORYVISITS_FROMINDEX....................... 6            2.7% 
MOZ_PLACES_FAVICONINDEX........................... 5            2.3% 
MOZ_PLACES_FRECENCYINDEX.......................... 5            2.3% 
MOZ_PLACES_VISITCOUNT............................. 5            2.3% 
SQLITE_AUTOINDEX_MOZ_FAVICONS_1................... 3            1.4% 
MOZ_ANNO_ATTRIBUTES............................... 1            0.45% 
MOZ_ANNOS......................................... 1            0.45% 
MOZ_ANNOS_PLACEATTRIBUTEINDEX..................... 1            0.45% 
MOZ_BOOKMARKS..................................... 1            0.45% 
MOZ_BOOKMARKS_GUID_UNIQUEINDEX.................... 1            0.45% 
MOZ_BOOKMARKS_ITEMINDEX........................... 1            0.45% 
MOZ_BOOKMARKS_ITEMLASTMODIFIEDINDEX............²... 1            0.45% 
MOZ_BOOKMARKS_PARENTINDEX......................... 1            0.45% 
MOZ_BOOKMARKS_ROOTS............................... 1            0.45% 
MOZ_HOSTS......................................... 1            0.45% 
MOZ_INPUTHISTORY.................................. 1            0.45% 
MOZ_ITEMS_ANNOS................................... 1            0.45% 
MOZ_ITEMS_ANNOS_ITEMATTRIBUTEINDEX................ 1            0.45% 
MOZ_KEYWORDS...................................... 1            0.45% 
MOZ_KEYWORDS_PLACEPOSTDATA_UNIQUEINDEX............ 1            0.45% 
SQLITE_AUTOINDEX_MOZ_ANNO_ATTRIBUTES_1............ 1            0.45% 
SQLITE_AUTOINDEX_MOZ_BOOKMARKS_ROOTS_1............ 1            0.45% 
SQLITE_AUTOINDEX_MOZ_HOSTS_1...................... 1            0.45% 
SQLITE_AUTOINDEX_MOZ_INPUTHISTORY_1............... 1            0.45% 
SQLITE_AUTOINDEX_MOZ_KEYWORDS_1................... 1            0.45% 
SQLITE_SCHEMA..................................... 1            0.45% 
SQLITE_SEQUENCE................................... 1            0.45% 
SQLITE_STAT1...................................... 1            0.45% 

*** All tables and indices ****************************************************

Percentage of total database...................... 100.0%    
Number of entries................................. 154969    
Bytes of storage consumed......................... 7241728   
Bytes of payload.................................. 4969404     68.6% 
Average payload per entry......................... 32.07     
Average unused bytes per entry.................... 11.15     
Average fanout.................................... 14.00     
Maximum payload per entry......................... 7640      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 14        
Primary pages used................................ 207       
Overflow pages used............................... 0         
Total pages used.................................. 221       
Unused bytes on index pages....................... 448010      97.7% 
Unused bytes on primary pages..................... 1280642     18.9% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 1728652     23.9% 

*** All tables ****************************************************************

Percentage of total database......................  44.8%    
Number of entries................................. 28530     
Bytes of storage consumed......................... 3244032   
Bytes of payload.................................. 2508257     77.3% 
Average payload per entry......................... 87.92     
Average unused bytes per entry.................... 20.13     
Average fanout.................................... 28.00     
Maximum payload per entry......................... 7640      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 3         
Primary pages used................................ 96        
Overflow pages used............................... 0         
Total pages used.................................. 99        
Unused bytes on index pages....................... 97551       99.23% 
Unused bytes on primary pages..................... 476741      15.2% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 574292      17.7% 

*** All indices ***************************************************************

Percentage of total database......................  55.2%    
Number of entries................................. 126439    
Bytes of storage consumed......................... 3997696   
Bytes of payload.................................. 2461147     61.6% 
Average payload per entry......................... 19.47     
Average unused bytes per entry.................... 9.13      
Average fanout.................................... 11.00     
Maximum payload per entry......................... 7259³      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 11        
Primary pages used................................ 111       
Overflow pages used............................... 0         
Total pages used.................................. 122       
Unused bytes on index pages....................... 350459      97.2% 
Unused bytes on primary pages..................... 803901      22.1% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 1154360     28.9% 

*** Table MOZ_ANNO_ATTRIBUTES and all its indices *****************************

Percentage of total database......................   0.90%   
Number of entries................................. 24        
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 721          1.1% 
Average payload per entry......................... 30.04     
Average unused bytes per entry.................... 2696.46   
Maximum payload per entry......................... 43        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 64715       98.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 64715       98.7% 

*** Table MOZ_ANNO_ATTRIBUTES w/o any indices *********************************

Percentage of total database......................   0.45%   
Number of entries................................. 12        
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 355          1.1% 
B-tree depth...................................... 1         
Average payload per entry......................... 29.58     
Average unused bytes per entry.................... 2696.42   
Maximum payload per entry......................... 42        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32357       98.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32357       98.7% 

*** Index SQLITE_AUTOINDEX_MOZ_ANNO_ATTRIBUTES_1 of table MOZ_ANNO_ATTRIBUTES *

Percentage of total database......................   0.45%   
Number of entries................................. 12        
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 366          1.1% 
B-tree depth...................................... 1         
Average payload per entry......................... 30.50     
Average unused bytes per entry.................... 2696.50   
Maximum payload per entry......................... 43        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32358       98.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32358       98.7% 

*** Table MOZ_ANNOS and all its indices ***************************************

Percentage of total database......................   0.90%   
Number of entries................................. 390       
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 13986       21.3% 
Average payload per entry......................... 35.86     
Average unused bytes per ´entry.................... 128.22    
Maximum payload per entry......................... 127       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 50006       76.3% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 50006       76.3% 

*** Table MOZ_ANNOS w/o any indices *******************************************

Percentage of total database......................   0.45%   
Number of entries................................. 195       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 12115       37.0% 
B-tree depth...................................... 1         
Average payload per entry......................... 62.13     
Average unused bytes per entry.................... 101.04    
Maximum payload per entry......................... 127       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 19702       60.1% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 19702       60.1% 

*** Index MOZ_ANNOS_PLACEATTRIBUTEINDEX of table MOZ_ANNOS ********************

Percentage of total database......................   0.45%   
Number of entries................................. 195       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 1871         5.7% 
B-tree depth...................................... 1         
Average payload per entry......................... 9.59      
Average unused bytes per entry.................... 155.41    
Maximum payload per entry......................... 10        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 30304       92.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 30304       92.5% 

*** Table MOZ_BOOKMARKS and all its indices ***********************************

Percentage of total database......................   2.3%    
Number of entries................................. 1565      
Bytes of storage consumed......................... 163840    
Bytes of payload.................................. 37104       22.6% 
Average payload per entry......................... 23.71     
Average unused bytes per entry.................... 77.62     
Maximum payload per entry......................... 518       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 5         
Overflow pages used............................... 0         
Total pages used.................................. 5         
Unused bytes on primary pages..................... 121475      74.1% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 121475      74.1% 

*** Table MOZ_BOOKMARKS w/o any indices ***************************************

Percentage of total database......................   0.45%   
Number of entries................................. 313       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 21937       66.9% 
B-tree depth...................................... 1         
Average payload per entry......................... 70.09     
Aveµrage unused bytes per entry.................... 29.90     
Maximum payload per entry......................... 518       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 9358        28.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 9358        28.6% 

*** Indices of table MOZ_BOOKMARKS ********************************************

Percentage of total database......................   1.8%    
Number of entries................................. 1252      
Bytes of storage consumed......................... 131072    
Bytes of payload.................................. 15167       11.6% 
Average payload per entry......................... 12.11     
Average unused bytes per entry.................... 89.55     
Maximum payload per entry......................... 17        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 4         
Overflow pages used............................... 0         
Total pages used.................................. 4         
Unused bytes on primary pages..................... 112117      85.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 112117      85.5% 

*** Index MOZ_BOOKMARKS_GUID_UNIQUEINDEX of table MOZ_BOOKMARKS ***************

Percentage of total database......................   0.45%   
Number of entries................................. 313       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 5207        15.9% 
B-tree depth...................................... 1         
Average payload per entry......................... 16.64     
Average unused bytes per entry.................... 85.03     
Maximum payload per entry......................... 17        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 26614       81.2% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 26614       81.2% 

*** Index MOZ_BOOKMARKS_ITEMINDEX of table MOZ_BOOKMARKS **********************

Percentage of total database......................   0.45%   
Number of entries................................. 313       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 2547         7.8% 
B-tree depth...................................... 1         
Average payload per entry......................... 8.14      
Average unused bytes per entry.................... 93.53     
Maximum payload per entry......................... 9         
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 29274       89.3% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 29274       89.3% 

*** Index MOZ_BOOKMARKS_ITEMLASTMODIFIEDINDEX of table MOZ_BOOKMARKS **********

Percentage of total database......................   0.45%   
Number of entries................................. 313       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 5020        15.3% 
B-tree depth...................................... 1         
Average payload per entry..................¶....... 16.04     
Average unused bytes per entry.................... 85.63     
Maximum payload per entry......................... 17        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 26801       81.8% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 26801       81.8% 

*** Index MOZ_BOOKMARKS_PARENTINDEX of table MOZ_BOOKMARKS ********************

Percentage of total database......................   0.45%   
Number of entries................................. 313       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 2393         7.3% 
B-tree depth...................................... 1         
Average payload per entry......................... 7.65      
Average unused bytes per entry.................... 94.02     
Maximum payload per entry......................... 9         
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 29428       89.8% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 29428       89.8% 

*** Table MOZ_BOOKMARKS_ROOTS and all its indices *****************************

Percentage of total database......................   0.90%   
Number of entries................................. 10        
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 94           0.14% 
Average payload per entry......................... 9.40      
Average unused bytes per entry.................... 6539.10   
Maximum payload per entry......................... 11        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 65391       99.78% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 65391       99.78% 

*** Table MOZ_BOOKMARKS_ROOTS w/o any indices *********************************

Percentage of total database......................   0.45%   
Number of entries................................. 5         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 47           0.14% 
B-tree depth...................................... 1         
Average payload per entry......................... 9.40      
Average unused bytes per entry.................... 6538.60   
Maximum payload per entry......................... 11        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32693       99.77% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32693       99.77% 

*** Index SQLITE_AUTOINDEX_MOZ_BOOKMARKS_ROOTS_1 of table MOZ_BOOKMARKS_ROOTS *

Percentage of total database......................   0.45%   
Number of entries................................. 5         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 47           0.14% 
B-tree depth...................................... 1         
Average payloa·d per entry......................... 9.40      
Average unused bytes per entry.................... 6539.60   
Maximum payload per entry......................... 11        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32698       99.79% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32698       99.79% 

*** Table MOZ_FAVICONS and all its indices ************************************

Percentage of total database......................   6.8%    
Number of entries................................. 941       
Bytes of storage consumed......................... 491520    
Bytes of payload.................................. 332765      67.7% 
Average payload per entry......................... 353.63    
Average unused bytes per entry.................... 164.00    
Average fanout.................................... 7.00      
Maximum payload per entry......................... 7640      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 2         
Primary pages used................................ 13        
Overflow pages used............................... 0         
Total pages used.................................. 15        
Unused bytes on index pages....................... 65340       99.70% 
Unused bytes on primary pages..................... 88980       20.9% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 154320      31.4% 

*** Table MOZ_FAVICONS w/o any indices ****************************************

Percentage of total database......................   5.4%    
Number of entries................................. 471       
Bytes of storage consumed......................... 393216    
Bytes of payload.................................. 297630      75.7% 
B-tree depth...................................... 2         
Average payload per entry......................... 631.91    
Average unused bytes per entry.................... 196.60    
Average fanout.................................... 11.00     
Non-sequential pages.............................. 6           54.5% 
Maximum payload per entry......................... 7640      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 11        
Overflow pages used............................... 0         
Total pages used.................................. 12        
Unused bytes on index pages....................... 32676       99.72% 
Unused bytes on primary pages..................... 59923       16.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 92599       23.5% 

*** Index SQLITE_AUTOINDEX_MOZ_FAVICONS_1 of table MOZ_FAVICONS ***************

Percentage of total database......................   1.4%    
Number of entries................................. 470       
Bytes of storage consumed......................... 98304     
Bytes of payload.................................. 35135       35.7% 
B-tree depth...................................... 2         
Average payload per entry......................... 74.76     
Average unused bytes per entry.................... 131.32    
Average fanout.................................... 3.00      
Non-sequential pages.............................. 1           50.0% 
Maximum payload per entry......................... 7259      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 2         
Overflow pages used............................... 0         
¸Total pages used.................................. 3         
Unused bytes on index pages....................... 32664       99.68% 
Unused bytes on primary pages..................... 29057       44.3% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 61721       62.8% 

*** Table MOZ_HISTORYVISITS and all its indices *******************************

Percentage of total database......................  18.6%    
Number of entries................................. 63470     
Bytes of storage consumed......................... 1343488   
Bytes of payload.................................. 882233      65.7% 
Average payload per entry......................... 13.90     
Average unused bytes per entry.................... 3.76      
Average fanout.................................... 10.00     
Maximum payload per entry......................... 21        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 4         
Primary pages used................................ 37        
Overflow pages used............................... 0         
Total pages used.................................. 41        
Unused bytes on index pages....................... 130482      99.55% 
Unused bytes on primary pages..................... 108158       8.9% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 238640      17.8% 

*** Table MOZ_HISTORYVISITS w/o any indices ***********************************

Percentage of total database......................   5.9%    
Number of entries................................. 15873     
Bytes of storage consumed......................... 425984    
Bytes of payload.................................. 308447      72.4% 
B-tree depth...................................... 2         
Average payload per entry......................... 19.43     
Average unused bytes per entry.................... 2.40      
Average fanout.................................... 12.00     
Non-sequential pages.............................. 8           66.7% 
Maximum payload per entry......................... 21        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 12        
Overflow pages used............................... 0         
Total pages used.................................. 13        
Unused bytes on index pages....................... 32668       99.69% 
Unused bytes on primary pages..................... 5435         1.4% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 38103        8.9% 

*** Indices of table MOZ_HISTORYVISITS ****************************************

Percentage of total database......................  12.7%    
Number of entries................................. 47597     
Bytes of storage consumed......................... 917504    
Bytes of payload.................................. 573786      62.5% 
Average payload per entry......................... 12.06     
Average unused bytes per entry.................... 4.21      
Average fanout.................................... 9.00      
Maximum payload per entry......................... 17        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 3         
Primary pages used................................ 25        
Overflow pages used............................... 0         
Total pages used.................................. 28        
Unused bytes on index pages....................... 97814       99.50% 
Unused bytes on primary pages..................... 102723      12.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 200537      21.9% 

*** Index MOZ_HISTORYVISITS_DATEINDEX of table MOZ_HISTORYVISITS **************

Percentage o¹f total database......................   4.5%    
Number of entries................................. 15865     
Bytes of storage consumed......................... 327680    
Bytes of payload.................................. 206221      62.9% 
B-tree depth...................................... 2         
Average payload per entry......................... 13.00     
Average unused bytes per entry.................... 4.65      
Average fanout.................................... 10.00     
Non-sequential pages.............................. 6           66.7% 
Maximum payload per entry......................... 13        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 9         
Overflow pages used............................... 0         
Total pages used.................................. 10        
Unused bytes on index pages....................... 32596       99.48% 
Unused bytes on primary pages..................... 41128       13.9% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 73724       22.5% 

*** Index MOZ_HISTORYVISITS_FROMINDEX of table MOZ_HISTORYVISITS **************

Percentage of total database......................   2.7%    
Number of entries................................. 15869     
Bytes of storage consumed......................... 196608    
Bytes of payload.................................. 100292      51.0% 
B-tree depth...................................... 2         
Average payload per entry......................... 6.32      
Average unused bytes per entry.................... 3.06      
Average fanout.................................... 6.00      
Non-sequential pages.............................. 4           80.0% 
Maximum payload per entry......................... 7         
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 5         
Overflow pages used............................... 0         
Total pages used.................................. 6         
Unused bytes on index pages....................... 32702       99.80% 
Unused bytes on primary pages..................... 15927        9.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 48629       24.7% 

*** Index MOZ_HISTORYVISITS_PLACEDATEINDEX of table MOZ_HISTORYVISITS *********

Percentage of total database......................   5.4%    
Number of entries................................. 15863     
Bytes of storage consumed......................... 393216    
Bytes of payload.................................. 267273      68.0% 
B-tree depth...................................... 2         
Average payload per entry......................... 16.85     
Average unused bytes per entry.................... 4.93      
Average fanout.................................... 12.00     
Non-sequential pages.............................. 8           72.7% 
Maximum payload per entry......................... 17        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 11        
Overflow pages used............................... 0         
Total pages used.................................. 12        
Unused bytes on index pages....................... 32516       99.23% 
Unused bytes on primary pages..................... 45668       12.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 78184       19.9% 

*** Table MOZ_HOSTS and all its indices ***************************************

Percentage of total database......................   0.90%   
Number of entries................................. 1256      
Bytes of storage consumed......................... 65º536     
Bytes of payload.................................. 27640       42.2% 
Average payload per entry......................... 22.01     
Average unused bytes per entry.................... 26.18     
Maximum payload per entry......................... 49        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 32888       50.2% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32888       50.2% 

*** Table MOZ_HOSTS w/o any indices *******************************************

Percentage of total database......................   0.45%   
Number of entries................................. 628       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 14640       44.7% 
B-tree depth...................................... 1         
Average payload per entry......................... 23.31     
Average unused bytes per entry.................... 23.90     
Maximum payload per entry......................... 49        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 15012       45.8% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 15012       45.8% 

*** Index SQLITE_AUTOINDEX_MOZ_HOSTS_1 of table MOZ_HOSTS *********************

Percentage of total database......................   0.45%   
Number of entries................................. 628       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 13000       39.7% 
B-tree depth...................................... 1         
Average payload per entry......................... 20.70     
Average unused bytes per entry.................... 28.46     
Maximum payload per entry......................... 47        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 17876       54.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 17876       54.6% 

*** Table MOZ_INPUTHISTORY and all its indices ********************************

Percentage of total database......................   0.90%   
Number of entries................................. 16        
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 642          0.98% 
Average payload per entry......................... 40.12     
Average unused bytes per entry.................... 4050.88   
Maximum payload per entry......................... 71        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 64814       98.9% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 64814       98.9% 

*** Table MOZ_INPUTHISTORY w/o any indices ************************************

Percentage of total database......................   0.45%   
Number of entries................................. 8         
Bytes of storage consumed......................... 32768     
Bytes of payload..............».................... 341          1.0% 
B-tree depth...................................... 1         
Average payload per entry......................... 42.62     
Average unused bytes per entry.................... 4047.38   
Maximum payload per entry......................... 71        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32379       98.8% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32379       98.8% 

*** Index SQLITE_AUTOINDEX_MOZ_INPUTHISTORY_1 of table MOZ_INPUTHISTORY *******

Percentage of total database......................   0.45%   
Number of entries................................. 8         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 301          0.92% 
B-tree depth...................................... 1         
Average payload per entry......................... 37.62     
Average unused bytes per entry.................... 4054.38   
Maximum payload per entry......................... 65        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32435       99.0% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32435       99.0% 

*** Table MOZ_ITEMS_ANNOS and all its indices *********************************

Percentage of total database......................   0.90%   
Number of entries................................. 158       
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 9211        14.1% 
Average payload per entry......................... 58.30     
Average unused bytes per entry.................... 352.56    
Maximum payload per entry......................... 384       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 55704       85.0% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 55704       85.0% 

*** Table MOZ_ITEMS_ANNOS w/o any indices *************************************

Percentage of total database......................   0.45%   
Number of entries................................. 79        
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 8649        26.4% 
B-tree depth...................................... 1         
Average payload per entry......................... 109.48    
Average unused bytes per entry.................... 300.54    
Maximum payload per entry......................... 384       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 23743       72.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 23743       72.5% 

*** Index MOZ_ITEMS_ANNOS_ITEMATTRIBUTEINDEX of table MOZ_ITEMS_ANNOS *********

Percentage of total database......................   0.45%   
Number of entries................................. 79        
Bytes of storage consumed......................... 32768     
Bytes o¼f payload.................................. 562          1.7% 
B-tree depth...................................... 1         
Average payload per entry......................... 7.11      
Average unused bytes per entry.................... 404.57    
Maximum payload per entry......................... 9         
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 31961       97.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 31961       97.5% 

*** Table MOZ_KEYWORDS and all its indices ************************************

Percentage of total database......................   1.4%    
Number of entries................................. 0         
Bytes of storage consumed......................... 98304     
Bytes of payload.................................. 0            0.0% 
Average payload per entry......................... 0.0       
Average unused bytes per entry.................... 0.0       
Maximum payload per entry......................... 0         
Entries that use overflow......................... 0         
Primary pages used................................ 3         
Overflow pages used............................... 0         
Total pages used.................................. 3         
Unused bytes on primary pages..................... 98280       99.976% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 98280       99.976% 

*** Table MOZ_KEYWORDS w/o any indices ****************************************

Percentage of total database......................   0.45%   
Number of entries................................. 0         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 0            0.0% 
B-tree depth...................................... 1         
Average payload per entry......................... 0.0       
Average unused bytes per entry.................... 0.0       
Maximum payload per entry......................... 0         
Entries that use overflow......................... 0         
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32760       99.976% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32760       99.976% 

*** Indices of table MOZ_KEYWORDS *********************************************

Percentage of total database......................   0.90%   
Number of entries................................. 0         
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 0            0.0% 
Average payload per entry......................... 0.0       
Average unused bytes per entry.................... 0.0       
Maximum payload per entry......................... 0         
Entries that use overflow......................... 0         
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 65520       99.976% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 65520       99.976% 

*** Index MOZ_KEYWORDS_PLACEPOSTDATA_UNIQUEINDEX of table MOZ_KEYWORDS ********

Percentage of total database......................   0.45%   
Number of entries................................. 0         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 0       ½     0.0% 
B-tree depth...................................... 1         
Average payload per entry......................... 0.0       
Average unused bytes per entry.................... 0.0       
Maximum payload per entry......................... 0         
Entries that use overflow......................... 0         
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32760       99.976% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32760       99.976% 

*** Index SQLITE_AUTOINDEX_MOZ_KEYWORDS_1 of table MOZ_KEYWORDS ***************

Percentage of total database......................   0.45%   
Number of entries................................. 0         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 0            0.0% 
B-tree depth...................................... 1         
Average payload per entry......................... 0.0       
Average unused bytes per entry.................... 0.0       
Maximum payload per entry......................... 0         
Entries that use overflow......................... 0         
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32760       99.976% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32760       99.976% 

*** Table MOZ_PLACES and all its indices **************************************

Percentage of total database......................  64.3%    
Number of entries................................. 87087     
Bytes of storage consumed......................... 4653056   
Bytes of payload.................................. 3659043     78.6% 
Average payload per entry......................... 42.02     
Average unused bytes per entry.................... 7.93      
Average fanout.................................... 17.00     
Maximum payload per entry......................... 1867      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 8         
Primary pages used................................ 134       
Overflow pages used............................... 0         
Total pages used.................................. 142       
Unused bytes on index pages....................... 252188      96.2% 
Unused bytes on primary pages..................... 438258      10.0% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 690446      14.8% 

*** Table MOZ_PLACES w/o any indices ******************************************

Percentage of total database......................  28.5%    
Number of entries................................. 10894     
Bytes of storage consumed......................... 2064384   
Bytes of payload.................................. 1838131     89.0% 
B-tree depth...................................... 2         
Average payload per entry......................... 168.73    
Average unused bytes per entry.................... 14.10     
Average fanout.................................... 62.00     
Non-sequential pages.............................. 30          48.4% 
Maximum payload per entry......................... 1867      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 62        
Overflow pages used............................... 0         
Total pages used.................................. 63        
Unused bytes on index pages....................... 32207       98.3% 
Unused bytes on primary pages..................... 121406¾       6.0% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 153613       7.4% 

*** Indices of table MOZ_PLACES ***********************************************

Percentage of total database......................  35.7%    
Number of entries................................. 76193     
Bytes of storage consumed......................... 2588672   
Bytes of payload.................................. 1820912     70.3% 
Average payload per entry......................... 23.90     
Average unused bytes per entry.................... 7.05      
Average fanout.................................... 11.00     
Maximum payload per entry......................... 1823      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 7         
Primary pages used................................ 72        
Overflow pages used............................... 0         
Total pages used.................................. 79        
Unused bytes on index pages....................... 219981      95.9% 
Unused bytes on primary pages..................... 316852      13.4% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 536833      20.7% 

*** Index MOZ_PLACES_FAVICONINDEX of table MOZ_PLACES *************************

Percentage of total database......................   2.3%    
Number of entries................................. 10891     
Bytes of storage consumed......................... 163840    
Bytes of payload.................................. 83178       50.8% 
B-tree depth...................................... 2         
Average payload per entry......................... 7.64      
Average unused bytes per entry.................... 4.40      
Average fanout.................................... 5.00      
Non-sequential pages.............................. 3           75.0% 
Maximum payload per entry......................... 8         
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 4         
Overflow pages used............................... 0         
Total pages used.................................. 5         
Unused bytes on index pages....................... 32711       99.83% 
Unused bytes on primary pages..................... 15213       11.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 47924       29.3% 

*** Index MOZ_PLACES_FRECENCYINDEX of table MOZ_PLACES ************************

Percentage of total database......................   2.3%    
Number of entries................................. 10891     
Bytes of storage consumed......................... 163840    
Bytes of payload.................................. 76772       46.9% 
B-tree depth...................................... 2         
Average payload per entry......................... 7.05      
Average unused bytes per entry.................... 4.99      
Average fanout.................................... 5.00      
Non-sequential pages.............................. 3           75.0% 
Maximum payload per entry......................... 9         
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 4         
Overflow pages used............................... 0         
Total pages used.................................. 5         
Unused bytes on index pages....................... 32714       99.84% 
Unused bytes on primary pages..................... 21616       16.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 54330       33.2% 

*** Index MOZ_PLACES_GUID_UNIQUEINDEX of table MOZ_PLACES *********************

Percentage of total database......................   4.1%    
Number of¿ entries................................. 10887     
Bytes of storage consumed......................... 294912    
Bytes of payload.................................. 196000      66.5% 
B-tree depth...................................... 2         
Average payload per entry......................... 18.00     
Average unused bytes per entry.................... 6.07      
Average fanout.................................... 9.00      
Non-sequential pages.............................. 5           62.5% 
Maximum payload per entry......................... 18        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 8         
Overflow pages used............................... 0         
Total pages used.................................. 9         
Unused bytes on index pages....................... 32581       99.43% 
Unused bytes on primary pages..................... 33545       12.8% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 66126       22.4% 

*** Index MOZ_PLACES_HOSTINDEX of table MOZ_PLACES ****************************

Percentage of total database......................   5.0%    
Number of entries................................. 10885     
Bytes of storage consumed......................... 360448    
Bytes of payload.................................. 237383      65.9% 
B-tree depth...................................... 2         
Average payload per entry......................... 21.81     
Average unused bytes per entry.................... 8.29      
Average fanout.................................... 11.00     
Non-sequential pages.............................. 7           70.0% 
Maximum payload per entry......................... 49        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 10        
Overflow pages used............................... 0         
Total pages used.................................. 11        
Unused bytes on index pages....................... 32473       99.10% 
Unused bytes on primary pages..................... 57782       17.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 90255       25.0% 

*** Index MOZ_PLACES_LASTVISITDATEINDEX of table MOZ_PLACES *******************

Percentage of total database......................   3.2%    
Number of entries................................. 10889     
Bytes of storage consumed......................... 229376    
Bytes of payload.................................. 150784      65.7% 
B-tree depth...................................... 2         
Average payload per entry......................... 13.85     
Average unused bytes per entry.................... 4.21      
Average fanout.................................... 7.00      
Non-sequential pages.............................. 4           66.7% 
Maximum payload per entry......................... 14        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 6         
Overflow pages used............................... 0         
Total pages used.................................. 7         
Unused bytes on index pages....................... 32651       99.64% 
Unused bytes on primary pages..................... 13179        6.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 45830       20.0% 

*** Index MOZ_PLACES_URL_UNIQUEINDEX of table MOZ_PLACES **********************

Percentage of total database......................  16.7%    
Number of entries................................. 10859     
Bytes of storage consumed......................... 1212416   
Bytes of payload..................................À 1010666     83.4% 
B-tree depth...................................... 2         
Average payload per entry......................... 93.07     
Average unused bytes per entry.................... 15.42     
Average fanout.................................... 37.00     
Non-sequential pages.............................. 16          44.4% 
Maximum payload per entry......................... 1823      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 36        
Overflow pages used............................... 0         
Total pages used.................................. 37        
Unused bytes on index pages....................... 24134       73.7% 
Unused bytes on primary pages..................... 143261      12.1% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 167395      13.8% 

*** Index MOZ_PLACES_VISITCOUNT of table MOZ_PLACES ***************************

Percentage of total database......................   2.3%    
Number of entries................................. 10891     
Bytes of storage consumed......................... 163840    
Bytes of payload.................................. 66129       40.4% 
B-tree depth...................................... 2         
Average payload per entry......................... 6.07      
Average unused bytes per entry.................... 5.97      
Average fanout.................................... 5.00      
Non-sequential pages.............................. 3           75.0% 
Maximum payload per entry......................... 8         
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 4         
Overflow pages used............................... 0         
Total pages used.................................. 5         
Unused bytes on index pages....................... 32717       99.84% 
Unused bytes on primary pages..................... 32256       24.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 64973       39.7% 

*** Table SQLITE_SCHEMA *******************************************************

Percentage of total database......................   0.45%   
Number of entries................................. 36        
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 5188        15.8% 
B-tree depth...................................... 1         
Average payload per entry......................... 144.11    
Average unused bytes per entry.................... 758.58    
Maximum payload per entry......................... 379       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 27309       83.3% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 27309       83.3% 

*** Table SQLITE_SEQUENCE *****************************************************

Percentage of total database......................   0.45%   
Number of entries................................. 1         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 15           0.046% 
B-tree depth...................................... 1         
Average payload per entry......................... 15.00     
Average unused bytes per entry.................... 32741.00  
Maximum payload per entry......................... 15        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used..........Á..................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32741       99.918% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32741       99.918% 

*** Table SQLITE_STAT1 ********************************************************

Percentage of total database......................   0.45%   
Number of entries................................. 15        
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 762          2.3% 
B-tree depth...................................... 1         
Average payload per entry......................... 50.80     
Average unused bytes per entry.................... 2128.20   
Maximum payload per entry......................... 62        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 31923       97.4% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 31923       97.4% 

*** Definitions ***************************************************************

Page size in bytes

    The number of bytes in a single page of the database file.  
    Usually 1024.

Number of pages in the whole file

    The number of 32768-byte pages that go into forming the complete
    database

Pages that store data

    The number of pages that store data, either as primary B*Tree pages or
    as overflow pages.  The number at the right is the data pages divided by
    the total number of pages in the file.

Pages on the freelist

    The number of pages that are not currently in use but are reserved for
    future use.  The percentage at the right is the number of freelist pages
    divided by the total number of pages in the file.

Pages of auto-vacuum overhead

    The number of pages that store data used by the database to facilitate
    auto-vacuum. This is zero for databases that do not support auto-vacuum.

Number of tables in the database

    The number of tables in the database, including the SQLITE_SCHEMA table
    used to store schema information.

Number of indices

    The total number of indices in the database.

Number of defined indices

    The number of indices created using an explicit CREATE INDEX statement.

Number of implied indices

    The number of indices used to implement PRIMARY KEY or UNIQUE constraints
    on tables.

Size of the file in bytes

    The total amount of disk space used by the entire database files.

Bytes of user payload stored

    The total number of bytes of user payload stored in the database. The
    schema information in the SQLITE_SCHEMA table is not counted when
    computing this number.  The percentage at the right shows the payload
    divided by the total file size.

Percentage of total database

    The amount of the complete database file that is devoted to storing
    information described by this category.

Number of entries

    The total number of B-Tree key/value pairs stored under this category.

Bytes of storage consumed

    The total amount of disk space required to store all B-Tree entries
    under this category.  The is the total number of pages used times
    the pages size.

Bytes of payload

    The amount of payload stored under this category.  Payload is the data
    part of table entries and the key part of index entries.  The percentage
    at the right is the bytes of payload divided by the bytes of storage 
    consumed.

Average payload per entry

    The average amount of payload on each entry.  This is just the bytes of
    payload divided by the number of entries.

Average unused bytes per entry

    The average amount of free space remaining on all pages under this
    category on a per-entry basis.  This is the number of unused bytes on
    all pages divided by the number of entries.

Non-sequential pages

    The number of pages in the table or index that are out of sequence.
    Many filesystems are optimized for sequential file access so a small
    number of non-sequential pages might result in faster queries,
    especially for larger database files that do not fit in the disk cache.
    Note that after running VACUUM, the root page of each table or index is
    at the beginning of the database file and all other pages are in a
    separate part of the database file, resulting in a single non-
    sequential page.

Maximum payload per entry

    The largest payload size of any entry.

Entries that use overflow

    The number of entries that user one or more overflow pages.

Total pages used

    This is the number of pages used to hold all information in the current
    category.  This is the sum of index, primary, and overflow pages.

Index pages used

    This is the number of pages in a table B-tree that hold only key (rowid)
    information and no data.

Primary pages used

    This is the number of B-tree pages that hold both key and data.

Overflow pages used

    The total number of overflow pages used for this category.

Unused bytes on index pages

    The total number of bytes of unused space on all index pages.  The
    percentage at the right is the number of unused bytes divided by the
    total number of bytes on index pages.

Unused bytes on primary pages

    The total number of bytes of unused space on all primary pages.  The
    percentage at the right is the number of unused bytes divided by the
    total number of bytes on primary pages.

Unused bytes on overflow pages

    The total number of bytes of unused space on all overflow pages.  The
    percentage at the right is the number of unused bytes divided by the
    total number of bytes on overflow pages.

Unused bytes on all pages

    The total number of bytes of unused space on all primary and overflow 
    pages.  The percentage at the right is the number of unused bytes 
    divided by the total number of bytes.

*******************************************************************************
The entire text of this report can be sourced into any SQL database
engine for further analysis.  All of the text above is an SQL comment.
The data used to generate this report follows:
*/
BEGIN;
CREATE TABLE space_used(
   name clob,        -- Name of a table or index in the database file
   tblname clob,     -- Name of associated table
   is_index boolean, -- TRUE if it is an index, false for a table
   nentry int,       -- Number of entries in the BTree
   leaf_entries int, -- Number of leaf entries
   depth int,        -- Depth of the b-tree
   payload int,      -- Total amount of data stored in this table or index
   ovfl_payload int, -- Total amount of data stored on overflow pages
   ovfl_cnt int,     -- Number of entries that use overflow
   mx_payload int,   -- Maximum payload size
   int_pages int,    -- Number of interior pages used
   leaf_pages int,   -- Number of leaf pages used
   ovfl_pages int,   -- Number of overflow pages used
   int_unused int,   -- Number of unused bytes on interior pages
   leaf_unused int,  -- Number of unused bytes on primary pages
   ovfl_unused int,  -- Number of unused bytes on overflow pages
   gap_cnt int,      -- Number of gaps in the page layout
   compressed_size int  -- Total bytes stored on disk
);
INSERT INTO space_used VALUES('sqlite_schema','sqlite_schema',0,36,36,1,5188,0,0,379,0,1,0,0,27309,0,0,32768);
INSERT INTO space_used VALUES('moz_places','moz_places',0,10955,10894,2,1838131,0,0,1867,1,62,0,32207,121406,0,30,2064384);
INSERT INTO space_used VALUES('moz_historyvisits','moz_historyvisits',0,15884,15873,2,308447,0,0,21,1,12,0,32668,5435,0,8,425984);
INSERT INTO space_used VALUES('moz_inputhistory','moz_inputhistory',0,8,8,1,341,0,0,71,0,1,0,0,32379,0,0,32768);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_inputhistory_1','moz_inputhistory',1,8,8,1,301,0,0,65,0,1,0,0,32435,0,0,32768);
INSERT INTO space_used VALUES('moz_hosts','moz_hosts',0,628,628,1,14640,0,0,49,0,1,0,0,15012,0,0,32768);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_hosts_1','moz_hosts',1,628,628,1,13000,0,0,47,0,1,0,0,17876,0,0,32768);
INSERT INTO space_used VALUES('moz_bookmarks','moz_bookmarks',0,313,313,1,21937,0,0,518,0,1,0,0,9358,0,0,32768);
INSERT INTO space_used VALUES('moz_bookmarks_roots','moz_bookmarks_roots',0,5,5,1,47,0,0,11,0,1,0,0,32693,0,0,32768);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_bookmarks_roots_1','moz_bookmarks_roots',1,5,5,1,47,0,0,11,0,1,0,0,32698,0,0,32768);
INSERT INTO space_used VALUES('moz_keywords','moz_keywords',0,0,0,1,0,0,0,0,0,1,0,0,32760,0,0,32768);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_keywords_1','moz_keywords',1,0,0,1,0,0,0,0,0,1,0,0,32760,0,0,32768);
INSERT INTO space_used VALUES('sqlite_sequence','sqlite_sequence',0,1,1,1,15,0,0,15,0,1,0,0,32741,0,0,32768);
INSERT INTO space_used VALUES('moz_favicons','moz_favicons',0,481,471,2,297630,0,0,7640,1,11,0,32676,59923,0,6,393216);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_favicons_1','moz_favicons',1,471,470,2,35135,0,0,7259,1,2,0,32664,29057,0,1,98304);
INSERT INTO space_used VALUES('moz_anno_attributes','moz_anno_attributes',0,12,12,1,355,0,0,42,0,1,0,0,32357,0,0,32768);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_anno_attributes_1','moz_anno_attributes',1,12,12,1,366,0,0,43,0,1,0,0,32358,0,0,32768);
INSERT INTO space_used VALUES('moz_annos','moz_annos',0,195,195,1,12115,0,0,127,0,1,0,0,19702,0,0,32768);
INSERT INTO space_used VALUES('moz_items_annos','moz_items_annos',0,79,79,1,8649,0,0,384,0,1,0,0,23743,0,0,32768);
INSERT INTO space_used VALUES('sqlite_stat1','sqlite_stat1',0,15,15,1,762,0,0,62,0,1,0,0,31923,0,0,32768);
INSERT INTO space_used VALUES('moz_places_faviconindex','moz_places',1,10894,10891,2,83178,0,0,8,1,4,0,32711,15213,0,3,163840);
INSERT INTO space_used VALUES('moz_places_hostindex','moz_places',1,10894,10885,2,237383,0,0,49,1,10,0,32473,57782,0,7,360448);
INSERT INTO space_used VALUES('moz_places_visitcount','moz_places',1,10894,10891,2,66129,0,0,8,1,4,0,32717,32256,0,3,163840);
INSERT INTO space_used VALUES('moz_places_frecencyindex','moz_places',1,10894,10891,2,76772,0,0,9,1,4,0,32714,21616,0,3,163840);
INSERT INTO space_used VALUES('moz_places_lastvisitdateindex','moz_places',1,10894,10889,2,150784,0,0,14,1,6,0,32651,13179,0,4,229376);
INSERT INTO space_used VALUES('moz_historyvisits_placedateindex','moz_historyvisits',1,15873,15863,2,267273,0,0,17,1,11,0,32516,45668,0,8,393216);
INSERT INTO space_used VALUES('moz_historyvisits_fromindex','moz_historyvisits',1,15873,15869,2,100292,0,0,7,1,5,0,32702,15927,0,4,196608);
INSERT INTO space_used VALUES('moz_historyvisits_dateindex','moz_historyvisits',1,15873,15865,2,206221,0,0,13,1,9,0,32596,41128,0,6,327680);
INSERT INTO space_used VALUES('moz_bookmarks_itemindex','moz_bookmarks',1,313,313,1,2547,0,0,9,0,1,0,0,29274,0,0,32768);
INSERT INTO space_used VALUES('moz_bookmarks_parentindex','moz_bookmarks',1,313,313,1,2393,0,0,9,0,1,0,0,29428,0,0,32768);
INSERT INTO space_used VALUES('moz_bookmarks_itemlastmodifiedindex','moz_bookmarks',1,313,313,1,5020,0,0,17,0,1,0,0,26801,0,0,32768);
INSERT INTO space_used VALUES('moz_places_url_uniqueindex','moz_places',1,10894,10859,2,1010666,0,0,1823,1,36,0,24134,143261,0,16,1212416);
INSERT INTO space_used VALUES('moz_places_guid_uniqueindex','moz_places',1,10894,10887,2,196000,0,0,18,1,8,0,32581,33545,0,5,294912);
INSERT INTO space_used VALUES('moz_bookmarks_guid_uniqueindex','moz_bookmarks',1,313,313,1,5207,0,0,17,0,1,0,0,26614,0,0,32768);
INSERT INTO space_used VALUES('moz_annos_placeattributeindex','moz_annos',1,195,195,1,1871,0,0,10,0,1,0,0,30304,0,0,32768);
INSERT INTO space_used VALUES('moz_items_annos_itemattributeindex','moz_items_annos',1,79,79,1,562,0,0,9,0,1,0,0,31961,0,0,32768);
INSERT INTO space_used VALUES('moz_keywords_placepostdata_uniqueindex','moz_keywords',1,0,0,1,0,0,0,0,0,1,0,0,32760,0,0,32768);
COMMIT;

This page last modified on  2020-06-18 21:18:56 UTCsqlanalyze.htmlÄ  Instead,
SQLite stores the actual string value in the column.


Similarly, SQLite allows you to store a 2000-character string into a
column of type VARCHAR(50).  Other SQL implementations would either throw
an error or truncate the string.  SQLite stores the entire 2000-character
string with no loss of information and without complaint.


Where this ends up causing problems is when developers do some initial
coding work using SQLite and get their application working, but then try
to convert to another database like PostgreSQL or SQL Server for deployment.
If the application is initially taking advantage of SQLite's flexible typing,
then it will fail when moved to another database that uses a more rigid
and unforgiving type enforcement policy.


Flexible typing is a feature of SQLite, not a bug.  Flexible typing
is about freedom.
Nevertheless, we recognize that this feature does sometimes cause
confusion for developers who are accustomed to working with
other databases that are more strict with regard to data type rules.
In retrospect, perhaps it would have been less confusing if SQLite had merely
implemented an ANY datatype so that developers could explicitly state
when they wanted to use flexible typing, rather than making flexible
typing the default.
As an accommodation for those who expect rigid typing, SQLite version 3.37.0
(2021-11-27) introduced the option of STRICT tables.
These either impose
the mandatory datatype constraints found in other SQL database engines,
or allow the explicit ANY datatype to retain SQLite's flexible typing.

3.1. No Separate BOOLEAN Datatype


Unlike most other SQL implementations,
SQLite does not have a separate BOOLEAN data type.
Instead, TRUE and FALSE are (normally) represented as integers 1 and 0,
respectively.
This does not seem to cause many problems, as we seldom get complaints
about it.  But it is important to recognize.


Beginning with SQLite version 3.23.0 (2018-04-02), SQLite also
recognizes TRUE and FALSE keywords as aliases for integer values 1 and 0,
respectively.
This provides better compatibility with other SQL implementations.
But for backwards compatibility, if there are columns named TRUE or
FALSE, then the keywords are treated as identifiers referencing those
columns, rather than BOOLEAN literals.

3.2. No Separate DATETIME Datatype


SQLite has no DATETIME datatype.
Instead, dates and times can be stored in any of these ways:


 As a TEXT string in the ISO-8601 format.  Example: '2018-04-02 12:13:46'.
 As an INTEGER number of seconds since 1970 (also known as "unix time").
 As a REAL value that is the fractional 
     Julian day number.



The built-in date and time functions of SQLite understand date/times in
all of the formats above, and can freely change between them.
Which format you use, is entirely up to your application.

3.3. The datatype is optional


Because SQLite is flexible and forgiving with regard to datatypes,
table columns can be created that have no specified datatype at all.
For example:
CREATE TABLE t1(a,b,c,d);

The table "t1" has four columns "a", "b", "c", and "d" that have
no particular datatype assigned.  You can store anything you want in
any of those columns.

4. Foreign Key Enforcement Is Off By Default

SQLite has parsed foreign key constraints for time out of mind,
but added the ability to actually enforce those constraints much later,
with version 3.6.19 (2009-10-14).  By the time foreign key constraint
enforcement was added, there were already countless millions of databases
in circulation that contained foreign key constraints, some of which
were not correct.  To avoid breaking those legacy databases, foreign key
constraint enforcement is turned off by default in SQLite.

Applications can activate foreign key enforcement at run-time using
the PRAGMA foreign_keys statement.  Or, foreign key enforcement can
be activated at compile-time using the
-DSQLITE_DEFAULT_FOREIGN_KEYS=1 compile-time option.

5. PRIMARY KEYs Can Sometimes Contain NULLs


Usually (the exceptions are INTEGER PRIMARY KEY tables and
WITHOUT ROWID tables) a PRIMÅARY KEY in an SQLite table is really
the same as a UNIQUE constraint.  Due to an historical oversight,
the column values of such a PRIMARY KEY are allowed to be NULL.
This is a bug, but by the time the problem was discovered there
where so many databases in circulation that depended on the bug that
the decision was made to support the buggy behavior moving forward.

The value of an INTEGER PRIMARY KEY column must always be a 
non-NULL integer.  The PRIMARY KEY columns of a WITHOUT ROWID
table are also required to be non-NULL.

6. Aggregate Queries Can Contain Non-Aggregate Result Columns
That Are Not In The GROUP BY Clause


In most SQL implementations, output columns of an aggregate query
may only reference aggregate functions or columns named in the
GROUP BY clause.  It does not make good sense to reference an ordinary
column in an aggregate query because each output row might be composed
from two or more rows in the input table(s).


SQLite does not enforce this restriction.
The output columns from an aggregate query can be arbitrary expressions
that include columns not found in GROUP BY clause.
This feature has two uses:



With SQLite (but not any other SQL implementation that we know of) if
an aggregate query contains a single min() or max() function, then the
values of columns used in the output are taken from the row where
the min() or max() value was achieved.  If two or more rows have the
same min() or max() value, then the columns values will be chosen arbitrarily
from one of those rows.

For example to find the highest paid employee:
SELECT max(salary), first_name, last_name FROM employee;


In the query above, the values for the first_name and last_name columns
will correspond to the row that satisfied the max(salary) condition.


If a query contains no aggregate functions at all, then a GROUP BY
clause can be added as a substitute for the DISTINCT ON clause.  In other words,
output rows are filtered so that only one row is shown for each distinct
set of values in the GROUP BY clause.  If two or more output rows would
have otherwise had the same set of values for the GROUP BY columns, then
one of the rows is chosen arbitrarily.  (SQLite supports DISTINCT but not
DISTINCT ON, whose functionality is provided instead by GROUP BY.)


7. Does Not Do Full Unicode Case Folding By Default


SQLite does not know about the upper-case/lower-case distinction
for all unicode characters.  SQL functions like
upper() and lower() only work on ASCII characters.  There are two
reasons for this:

 Though stable now, when SQLite was first designed, the rules for
     unicode case folding were still in flux.  That means that the
     behavior might have changed with each new unicode release, disrupting
     applications and corrupting indexes in the process.
 The tables necessary to do full and proper unicode case folding are
     larger than the whole SQLite library.


Full unicode case folding is supported in SQLite if it is compiled
with the -DSQLITE_ENABLE_ICU option and linked against the
International Components for Unicode
library.



8. Double-quoted String Literals Are Accepted


The SQL standard requires double-quotes around identifiers
and single-quotes around string literals.  For example:

 "this is a legal SQL column name"
 'this is an SQL string literal'


SQLite accepts both of the above.  But, in an effort to be compatible
with MySQL 3.x (which was one of the most widely used RDBMSes
when SQLite was first being designed) SQLite will also interpret
a double-quotes string as
string literal if it does not match any valid identifier.

This misfeature means that a misspelled double-quoted
identifier will be interpreted as a string literal, rather than generating
an error.
It also lures developers who are new to the SQL language into the
bad habit of using double-quoted string literals when they
really need to learn to use the correct single-quoted string literal form.

In hindsight, we should not have tried to make SQLite accept MySQL 3.x
syntax, and should have never allowed double-quoted string literals.
However, there are countless applications that make use of
double-quoted string literals and so we continue to support
that capability to avoid breaking legacy.

As of SQLite 3.27.0 (2019-02-07) the use of a double-quoted
string literal causes a warning message to be sent to the error log.

As of SQLite 3.29.0 (2019-07-10) the use of double-quoted
string literals can be disabled at run-time using the
SQLITE_DBCONFIG_DQS_DDL and SQLITE_DBCONFIG_DQS_DML actions
to sqlite3_db_config().  The default settings can be altered
at compile-time using the -DSQLITE_DQS=N compile-time
option.  Application developers are encouraged to compile using
-DSQLITE_DQS=0 in order to disable the double-quoted string literal
misfeature by default.  If that is not possible, then disable
double-quoted string literals for individual database connections
using C-code like this:

sqlite3_db_config(db, SQLITE_DBCONFIG_DQS_DDL, 0, (void*)0);
sqlite3_db_config(db, SQLITE_DBCONFIG_DQS_DML, 0, (void*)0);

Or, if double-quoted string literals are disabled by default, but need
to be selectively enabled for some historical database connections,
that can be done using the same C-code as shown above except with the
third parameter changed from 0 to 1.

9. Keywords Can Often Be Used As Identifiers


The SQL language is rich in keywords.
Most SQL implementations do not allow keywords to be used as identifiers
(names of tables or columns) unless they are enclosed in double-quotes.
But SQLite is more flexible.  Many keywords can be used as identifiers without
needing to be quoted, as long as those keywords are used in a context where
it is clear that they are intended to be an identifier.

For example, the following statement is valid in SQLite:
CREATE TABLE union(true INT, with BOOLEAN);


The same SQL statement will fail on every other SQL implementation that
we know of due to the use of keywords "union", "true", and "with" as
identifiers.

The ability to use keywords as identifiers promotes backwards compatibility.
As new keywords are added, legacy schemas that just happen to use those
keywords as table or column names continue to work.  However, the ability
to use a keyword as an identifier sometimes leads to surprising outcomes.
For example:
CREATE TRIGGER AFTER INSERT ON tableX BEGIN
  INSERT INTO tableY(b) VALUES(new.a);
END;

The trigger created by the previous statement is named "AFTER"
and it is a "BEFORE" trigger.  The "AFTER" token is used as an identifier
instead of as a keyword, as that is the only way to parse the statement.
Another example:
CREATE TABLE tableZ(INTEGER PRIMARY KEY);

The tableZ table has a single column named "INTEGER".  That column
has no datatype specified, but it is the PRIMARY KEY.
The column is not the INTEGER PRIMARY KEY for the table because
it has no datatype.  The "INTEGER" token is used as an identifier for the
column name, not as a datatype keyword.

10. Dubious SQL Is Allowed Without Any Error Or Warning


The original implementation of SQLite sought to follow
Postel's Law which
states in part "Be liberal in what you accept".
This used to be considered good design - that a system would accept
dodgy inputs and try to do the best it could without complaining too much.
But lately, people have come to realize that it is sometimes better to
be strict in what you accept, so as to more easily find errors in the
input.


11. AUTOINCREMENT Does Not Work The Same As MySQL

The AUTOINCREMENT feature in SQLite works differently than
it does in MySQL.  This often causes confusion for people who
initially learned SQL on MySQL and then start using SQLite, and
expect the two systems to work identically.

See the SQLite AUTOINCREMENT documentation for
detailed instructions on what AUTOINCREMENT does and does not do
in SQLite.

12. NUL Characters Are Allowed In Text Strings

NUL characters (ASCII code 0x00 and Unicode \u0000) may appear in
the middle of strings in SQLite.  This can lead to unexpected behavior.
See the "NUL characters in strings" document for further information.
This page last modified on  2022-11-16 22:21:04 UTCquirks.html


õ_‚
YêU#Quirks, Caveats, and Gotchas In SQLite1. Overview


The SQL language is a "standard".
Even so, no two SQL database engines work exactly alike.
Every SQL implementation has it own peculiarities and oddities,
and SQLite is no exception to this rule.


This document strives to highlight the principal differences
between SQLite and other SQL implementations, as an aid to developers
that are porting to or from SQLite or who are trying to build a
system that works across multiple database engines.


If you are an SQLite user whose has stumbled over some quirk of
SQLite that is not mentioned here, please let the developers know
by posting a brief message on the
SQLite Forum.

2. SQLite Is Embedded, Not Client-Server


Whenever comparing SQLite to other SQL database engines like
SQL Server, PostgreSQL, MySQL, or Oracle, it is important first of all
to realize that SQLite is not intended as a replacement or competitor to
any of those systems.  SQLite is serverless.  There is no separate
server process that manages the database.  An application interacts
with the database engine using function calls, not by sending messages
to a separate process or thread.


The fact that SQLite is embedded and serverless instead of being
client/server is a feature, not a bug.


Client/server databases like MySQL, PostgreSQL, SQL Server, Oracle, and
others are an important component of modern systems.  
These systems solve an important problem.  
But SQLite solves a different problem.
Both SQLite and client/server databases have their role.
Developers who are comparing SQLite against other SQL database engines need
to clearly understand this distinction.


See the Appropriate Uses For SQLite document for additional information.

3. Flexible Typing


SQLite is flexible with regard to datatypes.  Datatypes are advisory
rather than mandatory.


Some commentators say that SQLite is "weakly typed" and that other
SQL databases are "strongly typed".  We consider these terms to be
inaccurate and even pejorative.  We prefer to say that SQLite is 
"flexibly typed" and that other SQL database engines are
"rigidly typed".


See the Datatypes in SQLite document for a detailed
discussion of the type system in SQLite.


The key point is that SQLite is very forgiving of the type of data that
you put into the database.  For example, if a column has a datatype of
"INTEGER" and the application inserts a text string into that column,
SQLite will first try to convert the text string into an integer, just like
every other SQL database engine.  Thus, if one inserts '1234' into
an INTEGER column, that value is converted into an integer 1234 and stored.
But, if you insert a non-numeric string like 'wxyz' into an INTEGER
column, unlike other SQL databases, SQLite does not throw an error.ÃÈan being converted into ASCII as in SQLite version 2.8.
These changes taken together result in database files that are typically
25% to 35% smaller than the equivalent files in SQLite version 2.8.



Details of the low-level B-tree format used in SQLite version 3.0 can
be found in header comments to the 
btreeInt.h
source file and in the file format documentation.


Manifest Typing and BLOB Support


SQLite version 2.8 will deal with data in various formats internally,
but when writing to the disk or interacting through its API, SQLite 2.8
always converts data into ASCII text.  SQLite 3.0, in contrast, exposes 
its internal data representations to the user and stores binary representations
to disk when appropriate.  The exposing of non-ASCII representations was
added in order to support BLOBs.



SQLite version 2.8 had the feature that any type of data could be stored
in any table column regardless of the declared type of that column.  This
feature is retained in version 3.0, though in a slightly modified form.
Each table column will store any type of data, though columns have an
affinity for the format of data defined by their declared datatype.
When data is inserted into a column, that column will make an attempt
to convert the data format into the column's declared type.   All SQL
database engines do this.  The difference is that SQLite 3.0 will 
still store the data even if a format conversion is not possible.



For example, if you have a table column declared to be of type "INTEGER"
and you try to insert a string, the column will look at the text string
and see if it looks like a number.  If the string does look like a number
it is converted into a number and into an integer if the number does not
have a fractional part, and stored that way.  But if the string is not
a well-formed number it is still stored as a string.  A column with a
type of "TEXT" tries to convert numbers into an ASCII-Text representation
before storing them.  But BLOBs are stored in TEXT columns as BLOBs because
you cannot in general convert a BLOB into text.



In most other SQL database engines the datatype is associated with
the table column that holds the data - with the data container.
In SQLite 3.0, the datatype is associated with the data itself, not
with its container.
Paul Graham in his book 
ANSI Common Lisp
calls this property "Manifest Typing".
Other writers have other definitions for the term "manifest typing",
so beware of confusion.  But by whatever name, that is the datatype
model supported by SQLite 3.0.



Additional information about datatypes in SQLite version 3.0 is
available
separately.


Support for UTF-8 and UTF-16


The new API for SQLite 3.0 contains routines that accept text as
both UTF-8 and UTF-16 in the native byte order of the host machine.
Each database file manages text as either UTF-8, UTF-16BE (big-endian),
or UTF-16LE (little-endian).  Internally and in the disk file, the
same text representation is used everywhere.  If the text representation
specified by the database file (in the file header) does not match
the text representation required by the interface routines, then text
is converted on-the-fly.
Constantly converting text from one representation to another can be
computationally expensive, so it is suggested that programmers choose a
single representation and stick with it throughout their application.



In the current implementation of SQLite, the SQL parser only works
with UTF-8 text.  So if you supply UTF-16 text it will be converted.
This is just an implementation issue and there is nothing to prevent
future versions of SQLite from parsing UTF-16 encoded SQL natively.



When creating new user-defined SQL functions and collating sequences,
each function or collating sequence can specify if it works with
UTF-8, UTF-16be, or UTF-16le.  Separate implementations can be registered
for each encoding.   If an SQL function or collating sequence is required
but a version for the current text encoding is not available, then 
the text is automatically converted.  As before, this conversion takes
computation time, so programmers are advised to pick a single
encoding and stick with it in order to minimize the amount of unnecessary
format juggling.



SQLite is not particular about the text it receives and is more than
happy to process text strings that are not normalized or even
well-formed UTF-8 or UTF-16.  Thus, programmers who want to store
ISO8859 data can do so using the UTF-8 interfaces.  As long as no
attempts are made to use a UTF-16 collating sequence or SQL function,
the byte sequence of the text will not be modified in any way.


User-defined Collating Sequences


A collating sequence is just a defined order for text.  When SQLite 3.0
sorts (or uses a comparison operator like "&lt;" or "&gt;=") the sort
order is first determined by the data type.



NULLs sort first
Numeric values sort next in numerical order
Text values come after numerics
BLOBs sort last



Collating sequences are used for comparing two text strings.
The collating sequence does not change the ordering of NULLs, numbers,
or BLOBs, only text.



A collating sequence is implemented as a function that takes the
two strings being compared as inputs and returns negative, zero, or
positive if the first string is less than, equal to, or greater than
the second.
SQLite 3.0 comes with a single built-in collating sequence named "BINARY"
which is implemented using the memcmp() routine from the standard C library.
The BINARY collating sequence works well for English text.  For other
languages or locales, alternative collating sequences may be preferred.



The decision of which collating sequence to use is controlled by the
COLLATE clause in SQL.  A COLLATE clause can occur on a table definition,
to define a default collating sequence to a table column, or on field
of an index, or in the ORDER BY clause of a SELECT statement.
Planned enhancements to SQLite are to include standard CAST() syntax
to allow the collating sequence of an expression to be defined.


64-bit ROWIDs


Every row of a table has a unique rowid.
If the table defines a column with the type "INTEGER PRIMARY KEY" then that
column becomes an alias for the rowid.  But with or without an INTEGER PRIMARY
KEY column, every row still has a rowid.



In SQLite version 3.0, the rowid is a 64-bit signed integer.
This is an expansion of SQLite version 2.8 which only permitted
rowids of 32-bits.



To minimize storage space, the 64-bit rowid is stored as a variable length
integer.  Rowids between 0 and 127 use only a single byte.  
Rowids between 0 and 16383 use just 2 bytes.  Up to 2097152 uses three
bytes.  And so forth.  Negative rowids are allowed but they always use
nine bytes of storage and so their use is discouraged.  When rowids
are generated automatically by SQLite, they will always be non-negative.


Improved Concurrency


SQLite version 2.8 allowed multiple simultaneous readers or a single
writer but not both.  SQLite version 3.0 allows one process to begin
writing the database while other processes continue to read.  The
writer must still obtain an exclusive lock on the database for a brief
interval in order to commit its changes, but the exclusive lock is no
longer required for the entire write operation.
A more detailed report on the locking
behavior of SQLite version 3.0 is available separately.



A limited form of table-level locking is now also available in SQLite.
If each table is stored in a separate database file, those separate
files can be attached to the main database (using the ATTACH command)
and the combined databases will function as one.  But locks will only
be acquired on individual files as needed.  So if you redefine "database"
to mean two or more database files, then it is entirely possible for
two processes to be writing to the same database at the same time.
To further support this capability, commits of transactions involving
two or more ATTACHed database are now atomic.


Credits


SQLite version 3.0 is made possible in part by AOL developers
supporting and embracing great Open-Source Software.

This page last modified on  2020-04-28 13:12:41 UTCversion3.html
üVü¤N‚        ]È/%sqldiff.exe: Database Difference Utility1. Usage


The sqldiff.exe binary is a command-line utility program that
displays content differences between SQLite databases.  Example
usage:

sqldiff &#91;options&#93; database1.sqlite database2.sqlite



The usual output is an SQL script that will transform
database1.sqlite (the "source" database) into database2.sqlite
(the "destination" database).  This behavior can be
altered using command-line switches:


--changeset FILE
Do not write changes to standard output.  Instead, write a (binary)
       changeset file into FILE.  The changeÊÙ‚
?±a'SQLite Version 3 OverviewEditorial Note:
This document was written in 2004 as a guide to programmers who were
transitioning from SQLite2 to SQLite3.
It is retained as part of the historical record of SQLite.
Modern programmers should refer to
more up-to-date documentation on SQLite available elsewhere
on this website.


SQLite Version 3 Overview


SQLite version 3.0 introduces important changes to the library, including:



A more compact format for database files.
Manifest typing and BLOB support.
Support for both UTF-8 and UTF-16 text.
User-defined text collating sequences.
64-bit ROWIDs.
Improved Concurrency.



This document is a quick introduction to the changes for SQLite 3.0
for users who are already familiar with SQLite version 2.8.


Naming Changes


SQLite version 2.8 will continue to be supported with bug fixes
for the foreseeable future.  In order to allow SQLite version 2.8
and SQLite version 3.0 to peacefully coexist, the names of key files
and APIs in SQLite version 3.0 have been changed to include the
character "3".  For example, the include file used by C programs
has been changed from "sqlite.h" to "sqlite3.h".  And the name of
the shell program used to interact with databases has been changed
from "sqlite.exe" to "sqlite3.exe".  With these changes, it is possible
to have both SQLite 2.8 and SQLite 3.0 installed on the same system at
the same time.  And it is possible for the same C program to link
against both SQLite 2.8 and SQLite 3.0 at the same time and to use
both libraries at the same time.


New File Format


The format used by SQLite database files has been completely revised.
The old version 2.1 format and the new 3.0 format are incompatible with
one another.  Version 2.8 of SQLite will not read a version 3.0 database
files and version 3.0 of SQLite will not read a version 2.8 database file.



To convert an SQLite 2.8 database into an SQLite 3.0 database, have
ready the command-line shells for both version 2.8 and 3.0.  Then
enter a command like the following:



sqlite OLD.DB .dump | sqlite3 NEW.DB



The new database file format uses B+trees for tables.  In a B+tree, all
data is stored in the leaves of the tree instead of in both the leaves and
the intermediate branch nodes.  The use of B+trees for tables allows for
better scalability and the storage of larger data fields without the use of
overflow pages.  Traditional B-trees are still used for indices.


The new file format also supports variable pages sizes between 512 and
65536 bytes.  The size of a page is stored in the file header so the
same library can read databases with different pages sizes, in theory,
though this feature has not yet been implemented in practice.



The new file format omits unused fields from its disk images.  For example,
indices use only the key part of a B-tree record and not the data.  So
for indices, the field that records the length of the data is omitted.
Integer values such as the length of key and data are stored using
a variable-length encoding so that only one or two bytes are required to
store the most common cases but up to 64-bits of information can be encoded
if needed. 
Integer and floating point data is stored on the disk in binary rather
thÇset can be interpreted using
       the session extension to SQLite.
--lib LIBRARY
-L LIBRARY
Load the shared library or DLL file LIBRARY into SQLite prior to
       computing the differences.  This can be used to add application-defined
       collating sequences that are required by the schema.
--primarykey
Use the schema-defined PRIMARY KEY instead of the rowid to
       pair rows in the source and destination database.  (See additional
       explanation below.)
--schema
Show only column name and table differences in the schema,
       not the table content
--summary
Show how many rows have changed on each table, but do not show
       the actual changes
--table TABLE
Show only the differences in content for TABLE, not for the
       entire database
--transaction
Wrap SQL output in a single large transaction
--vtab
Add support for handling FTS3, FTS5 and rtree virtual tables. 
       See below for details. 



2. How It Works

The sqldiff.exe utility works by finding rows in the source and
destination that are logical "pairs".  The default behavior is to
treat two rows as pairs if they are in tables with the same name
and they have the same rowid, or in the case of a WITHOUT ROWID
table if they have the same PRIMARY KEY.  Any differences in the
content of paired rows are output as UPDATEs.  Rows in the source
database that could not be paired are output as DELETEs.  Rows in
the destination database that could not be paired are output as
INSERTs.

The --primarykey flag changes the pairing algorithm slightly so
that the schema-declared PRIMARY KEY is always used for pairing,
even on tables that have a rowid.  This is often a better choice
for finding differences, however it can lead to missed differences in
the case of rows that have one or more PRIMARY KEY columns set to
NULL.

3. Limitations



The sqldiff.exe utility does not compute changesets for
either: rowid tables for which the rowid is inaccessible;
or tables which have no explicit primary key.
Given the --changeset option, sqldiff omits them from the comparison.
Examples of such tables are:

CREATE TABLE NilChangeset (
   -- inaccessible rowid due to hiding its aliases
   "rowid" TEXT,
   "oid" TEXT,
   "_rowid_" TEXT
);


and

CREATE TABLE NilChangeset (
   -- no explicit primary key
   "authorId" TEXT,
   "bookId" TEXT
);



When sqldiff is made to compare only such tables, no error occurs.
However, the result may be unexpected.
For example, the effect of this invocation:

sqldiff --changeset CHANGESET_OUT --table NilChangeset db1.sdb db2.sdb


will be to produce an empty file named "CHANGESET_OUT". See  session limitations for details.

The sqldiff.exe utility does not (currently) display differences in
TRIGGERs or VIEWs.


The sqldiff utility is not designed to support schema migrations
and is forgiving with respect to differing column definitions.
Normally, only the column names and their order are compared
for like-named tables before content comparison proceeds.

However, the single-table comparison option, with "sqlite_schema"
named, can be used to show or detect detailed schema differences
between a pair of databases.
When doing this, the output should not be used directly to modify a database.


By default, differences in the schema or content of virtual tables are
not reported on. 

However, if a virtual table implementation creates real tables (sometimes
referred to as "shadow" tables) within the database to store its data in, then
sqldiff.exe does calculate the difference between these. This can have
surprising effects if the resulting SQL script is then run on a database that
is not exactly the same as the source database. For several of SQLite's
bundled virtual tables (FTS3, FTS5, rtree and others), the surprising effects
may include corruption of the virtual table content.

 If the --vtab option is passed to sqldiff.exe, then it ignores all 
underlying shadow tables belonging to an FTS3, FTS5 or rtree virtual table
and instead includes the virtual table differences directly.


This page last modified on  2021-09-07 19:28:01 UTCsqldiff.htmlÌ release is added to
the public branch and then the changes are merged into the private branch.

This document proposes to use
fossil,
but any other distributed software configuration management system such as
monotone or
mercurial (a.k.a. "hg"), or
git could serve just as well.
The concept will be the same, 
though the specifics of the procedure will vary.

The diagram at the right illustrates the concept.
One begins with a standard SQLite release.  For the
sake of example, suppose that one intends to create a
private branch off of SQLite version 3.6.15.  In the
diagram this is version (1).  The
maintainer makes an exact copy of the baseline
SQLite into the branch space, shown as version (2).
Note that (1) and (2) are exactly the same.  Then
the maintainer applies the private changes to 
version (2) resulting in version (3).  In other words,
version (3) is SQLite version 3.6.15 plus edits.

Later, SQLite version 3.6.16 is released, as shown 
by circle (4) in the diagram.  At the point, the private
branch maintainer does a merge which takes all of the
changes going from (1) to (4) and applies those changes to
(3).  The result is version (5), which is SQLite 3.6.16
plus edits.

There might be merge conflicts.  In other words, it might
be that the changes from (2) to (3) are incompatible with the
changes from (1) to (4).  In that case, the maintainer will
have to manually resolve the conflicts.  Hopefully conflicts
will not come up that often.  Conflicts are less likely to
occur when the private edits are kept to a minimum.

The cycle above can be repeated many times.  The
diagram shows a third SQLite release, 3.6.17 in
circle (6).  The private branch maintainer can do
another merge in order to incorporate the changes
moving from (4) to (6) into the private branch, resulting
in version (7).

3.  The Procedure

The remainder of this document will guide the reader through
the steps needed to maintain a private branch.  The general idea
is the same as outlined above.  This section merely provides more
detail.

We emphasize again that these steps are not intended to be the only
acceptable method for maintaining private branch.  This approach
is one of many.  Use this document as a baseline for preparing
project-specific procedures.  Do not be afraid to experiment.

3.1.  Obtain The Software

Fossil is a computer program
that must be installed on your machine before you use it.
Fortunately, installing fossil is very easy.  Fossil is a single
"*.exe" file that you simply download and run.  To uninstall fossil,
simply delete the exe file.  
Detailed instructions for installing and getting started with
fossil are available on the 
fossil website.

3.2.  Create A Project Repository

Create a fossil repository to host the private branch using the
following command:


fossil new private-project.fossil


You can call your project anything you like.  The ".fossil"
suffix is optional.  For this document, we will continue to call the
project "private-project.fossil".  Note that
private-project.fossil is an ordinary disk file (actually an
SQLite database) that will contain your complete project history.
You can make a backup of the project simply by making a copy of that
one file.

If you want to configure the new project, type:


fossil ui private-project.fossil


The "ui" command will cause fossil to run a miniature built-in webserver
and to launch your web-browser pointing
at that webserver.  You can use your web-browser to configure your project
in various ways.  See the instructions on the fossil website for additional
information.

Once the project repository is created, create an open checkout of the
project by moving to the directory where you want to keep all of the
project source code and typing:


fossil open private-project.fossil


You can have multiple checkouts of the same project if you want. 
And you can "clone" the repository to different machines so that multiple
developers can use it.  See the fossil website for further information.

3.3.  Installing The SQLite Baseline In Fossil

The repository created in the prevÍious step is initially empty.  The
next step is to load the baseline SQLite release - circle (1) in the diagram
above.

Begin by obtaining a copy of SQLite in whatever form you use it.
The public SQLite you obtain should be as close to your private edited
copy as possible.  If your project uses the SQLite amalgamation, then
get a copy of the amalgamation.  If you use the preprocessed separate
source files, get those instead.  Put all the source files in the
checkout directory created in the previous step.

The source code in public SQLite releases uses unix line endings
(ASCII code 10: "newline" only, NL) and spaces instead of tabs.  If you will
be changing the line ending to windows-style line endings
(ASCII codes 13, 10: "carriage-return" and "newline"; CR-NL) or if you will be
changing space indents into tab indents, make that change now
before you check in the baseline.  The merging process will only work
well if the differences between the public and the private branches are
minimal.  If every single line of the source file is changed in the
private branch because you changed from NL to CR-NL line endings, then
the merge steps will not work correctly.

Let us assume that you are using the amalgamation source code.
Add the baseline to your project as follows:


fossil add sqlite3.c sqlite3.h


If you are using separate source files, name all of the source files instead
of just the two amalgamation source files.  Once this is done, commit your
changes as follows:


fossil commit


You will be prompted for a check-in comment.  Say whatever you like.
After the commit completes, your baseline will be part of the repository.
The following command, if you like, to see this on the "timeline":



fossil ui


That last command is the same "ui" command that we ran before.  It
starts a mini-webserver running and points your web browser at it.  But
this time we didn't have to specify the repository file because we are
located inside a checkout and so fossil can figure out the repository for
itself.  If you want to type in the repository filename as the second
argument, you can.  But it is optional.

If you do not want to use your web browser to view the new check-in,
you can get some information from the command-line using commands like
these:


fossil timeline
fossil info
fossil status


3.4.  Creating The Private Branch

The previous step created circle (1) in the diagram above.
This step will create circle (2).  Run the following command:

 
fossil branch new private trunk -bgcolor "#add8e8"


This command will create a new branch named "private" (you can use
a different name if you like) and assign it a background color
of light blue ("#add8e8").  You can omit the background color if you want,
though having a distinct background does make it easier to tell the
branch from the "trunk" (the public branch) on timeline displays.  You
can change the background color of the private branch or of the public
branch (the "trunk") using the web interface if you like.

The command above created the new branch.  But your checkout is
still on the trunk - a fact you can see by running the command:


fossil info


To change your check-out to the private branch, type:


fossil update private


You can run the "info" command again to verify that you are on the
private branch.  To go back to the public branch, type:


fossil update trunk


Normally, fossil will modify all the files in your checkout when switching
between the private and the public branches.  But at this point, the files
are identical in both branches so no modifications need to be made.

3.5.  Adding Customizations To The Code In The Private Branch

Now it is time to make the private, custom modifications to SQLite
which are the whole point of this exercise.  Switch to the private branch
(if you are not already there) using the "fossil update private"
command, then bring up the source files in your text editor and make
whatever changes you want to make.  Once you have finished making
changes, commit those changes using this command:


fossil commit


You will be prompted once again to enter a commit describing your
changes.  Then the commit will occur.  The commit creates a new checkin
in the repository that corresponds to circle (3) in the diagram above.

Now that the public and private branches are different, you can run
the "fossil update trunk" and "fossil update private"
commands and see that fossil really does change the files in the checkout
as you switch back and forth between branches.

Note that in the diagram above, we showed the private edits as a single
commit.  This was for clarity of presentation only.  There is nothing to stop
you from doing dozens or hundreds of separate tiny changes and committing
each separately.  In fact, making many small changes is the preferred way
to work.  The only reason for doing all the changes in a single commit
is that it makes the diagram easier to draw.

3.6.  Incorporating New Public SQLite Releases

Suppose that after a while (about a month, usually) a new version of
SQLite is released: 3.6.16.  You will want to incorporate this new
public version of SQLite into your repository in the public branch (the
trunk).  To do this, first change your repository over to the trunk:


fossil update trunk


Then download the new version of the SQLite sources and overwrite the
files that are in the checkout.

If you made NL to CR-NL line ending changes or space to tab
indentation changes in the original baseline, make the same changes
to the new source file.

Once everything is ready, run the "fossil commit" command to
check in the changes.  This creates circle (4) in the diagram above.

3.7.  Merging Public SQLite Updates Into The Private Branch

The next step is to move the changes in the public branch over into
the private branch.  In other words, we want to create circle (5) in the
diagram above.  Begin by changing to the private branch using
"fossil update private".  Then type this command:


fossil merge trunk


The "merge" command attempts to apply all the changes between
circles (1) and (4) to the files in the local checkout.  Note that
circle (5) has not been created yet.  You will need to run the
"commit" to create circle (5).

It might be that there are conflicts in the merge.  Conflicts
occur when the same line of code was changed in different ways between
circles (1) and (4) versus circles (2) and (3).  The merge command will
announce any conflicts and will include both versions of the conflicting
lines in the output.  You will need to bring up the files that contain
conflicts and manually resolve the conflicts.

After resolving conflicts, many users like to compile and test the
new version before committing it to the repository.  Or you can commit
first and test later.  Either way, run the "fossil commit"
command to check-in the circle (5) version.

3.8.  Further Updates

As new versions of SQLite are released, repeat steps 3.6 and 3.7 to
add changes in the new release to the private branch.
Additional private changes can be
made on the private branch in between releases if desired.

4.  Variations

Since this document was first written, the canonical SQLite source code
has been moved from the venerable CVS system into a Fossil repository at
http://www.sqlite.org/src.  This means that if you are working with
canonical SQLite source code (as opposed to the amalgamation source code
files, sqlite3.c and sqlite3.h) then you can create a private repository
simply by cloning the official repository:


fossil clone http://www.sqlite.org/src private-project.fossil


This command both creates the new repository and populates it with
all the latest SQLite code.  You can then create a private branch as
described in section 3.4.

When the private repository is created by cloning, incorporating new
public SQLite releases becomes much easier too.  To pull in all of the
latest changes from the public SQLite repository, simply move into
the open check-out and do:


fossil update


Then continue to merge the changes in "trunk" with your "private"
changes as described in section 3.7.
This page last modified on  2021-04-07 11:02:17 UTCprivatebranch.html
qqî{‚
YÜ1Maintaining Private Branches Of SQLite1.  Introduction

SQLite is designed to meet most developer's needs without any 
changes or customization.  When changes are needed, they can normally
be accomplished using start-time (1)
or runtime
(2)
(3)
(4) configuration methods
or via compile-time options.  It is very rare that an application 
developer will need to edit the SQLite source code in order to 
incorporate SQLite into a product.

We call custom modifications to the SQLite source code that are held
for the use of a single application a "private branch".  When a private
branch becomes necessary, the application developer must take on the
task of keeping the private branch in synchronization with the public
SQLite sources.  This is tedious.  It can also be tricky, since while
the SQLite file format and published interfaces are very stable, the
internal implementation of SQLite changes quite rapidly.  Hundreds or
thousands of lines of code might change for any given SQLite point release.


This article outlines one possible method for keeping a private branch
of SQLite in sync with the public SQLite source code.
There are many ways of maintaining a private branch, of course.
Nobody is compelled to use the method describe here.
This article is not trying to impose a particular procedure on 
maintainers of private branches.  The point of this article is to offer
an example of one process for maintaining a private branch which can
be used as a template for designing processes best suited for the
circumstances of each individual project.


2.  The Basic Idea


We propose to use the
fossil software configuration management
system to set up two branches.  One branch (the "public branch" or "trunk")
contains the published SQLite sources and the other branch is the 
private branch which contains the code that is customized for the project.
Whenever a new public release of SQLite is made, thatËÐc() internally, this helps to make the
entire library faster.

SQLITE_DEFAULT_WAL_SYNCHRONOUS=1.
For maximum database safety following a power loss, the setting of
PRAGMA synchronous=FULL is recommended.  However, in WAL mode, complete
database integrity is guaranteed with PRAGMA synchronous=NORMAL.  With
PRAGMA synchronous=NORMAL in WAL mode, recent changes to the database might
be rolled back by a power loss, but the database will not be corrupted.
Furthermore, transaction commit is much faster in WAL mode using
synchronous=NORMAL than with the default synchronous=FULL.  For these
reasons, it is recommended that the synchronous setting be changed from
FULL to NORMAL when switching to WAL mode.  This compile-time option will
accomplish that.

SQLITE_LIKE_DOESNT_MATCH_BLOBS.
Historically, SQLite has allowed BLOB operands to the LIKE and GLOB
operators.  But having a BLOB as an operand of LIKE or GLOB complicates
and slows the LIKE optimization.  When this option is set, it means that
the LIKE and GLOB operators always return FALSE if either operand is a BLOB.
That simplifies the implementation of the LIKE optimization and allows
queries that use the LIKE optimization to run faster.

SQLITE_MAX_EXPR_DEPTH=0.
Setting the maximum expression parse-tree depth to zero disables all checking
of the expression parse-tree depth, which simplifies the code resulting in
faster execution, and helps the parse tree to use less memory.

SQLITE_OMIT_DECLTYPE.
By omitting the (seldom-needed) ability to return the declared type of
columns from the result set of query, prepared statements can be made
to consume less memory.

SQLITE_OMIT_DEPRECATED.
Omitting deprecated interfaces and features will not help SQLite to
run any faster.  It will reduce the library footprint, however.  And
it is the right thing to do.

SQLITE_OMIT_PROGRESS_CALLBACK.
The progress handler callback counter must be checked in the inner loop
of the bytecode engine.  By omitting this interface, a single conditional
is removed from the inner loop of the bytecode engine, helping SQL statements
to run slightly faster.

SQLITE_OMIT_SHARED_CACHE.
Omitting the possibility of using shared cache allows many conditionals
in performance-critical sections of the code to be eliminated.  This can
give a noticeable improvement in performance.

SQLITE_USE_ALLOCA.
Make use of alloca() for dynamically allocating temporary stack space for 
use within a single function, on systems that support alloca().  Without
this option, temporary space is allocated from the heap.

SQLITE_OMIT_AUTOINIT.
The SQLite library needs to be initialized using a call to
sqlite3_initialize() before certain interfaces are used.  
This initialization normally happens automatically the first time
it is needed.  However, with the SQLITE_OMIT_AUTOINIT option, the automatic
initialization is omitted.  This helps many API calls to run a little faster
(since they do not have to check to see if initialization has already occurred
and then run initialization if it has not previously been invoked) but it
also means that the application must call sqlite3_initialize() manually.
If SQLite is compiled with -DSQLITE_OMIT_AUTOINIT and a routine like
sqlite3_malloc() or sqlite3_vfs_find() or sqlite3_open() is invoked
without first calling sqlite3_initialize(), the likely result will be
a segfault.


When all of the recommended compile-time options above are used,
the SQLite library will be approximately 3% smaller and use about 5% fewer
CPU cycles.  So these options do not make a huge difference.  But in 
some design situations, every little bit helps.


3.  Platform Configuration


_HAVE_SQLITE_CONFIG_H
  If the _HAVE_SQLITE_CONFIG_H macro is defined
  then the SQLite source code will attempt to #include a file named "config.h".
  The "config.h" file usually contains other configuration options, especially
  "HAVE_INTERFACE" type options generated by autoconf scripts.

HAVE_FDATASYNC
  If the HAVE_FDATASYNC compile-time option is true, then the default VFS
  for unix systems will attempt to use fdatasync() instead of fsync()Ñ where
  appropriate.  If this flag is missing or false, then fsync() is always used.

HAVE_GMTIME_R
  If the HAVE_GMTIME_R option is true and if SQLITE_OMIT_DATETIME_FUNCS is true,
  then the CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP keywords will use
  the threadsafe "gmtime_r()" interface rather than "gmtime()".  In the usual case
  where SQLITE_OMIT_DATETIME_FUNCS is not defined or is false, then the
  built-in date and time functions are used to implement the CURRENT_TIME,
  CURRENT_DATE, and CURRENT_TIMESTAMP keywords and neither gmtime_r() nor
  gmtime() is ever called.

HAVE_ISNAN
  If the HAVE_ISNAN option is true, then SQLite invokes the system library isnan()
  function to determine if a double-precision floating point value is a NaN.
  If HAVE_ISNAN is undefined or false, then SQLite substitutes its own home-grown
  implementation of isnan().

HAVE_LOCALTIME_R
  If the HAVE_LOCALTIME_R option is true, then SQLite uses the threadsafe
  localtime_r() library routine instead of localtime()
  to help implement the localtime modifier
  to the built-in date and time functions.

HAVE_LOCALTIME_S
  If the HAVE_LOCALTIME_S option is true, then SQLite uses the threadsafe
  localtime_s() library routine instead of localtime()
  to help implement the localtime modifier
  to the built-in date and time functions.

HAVE_MALLOC_USABLE_SIZE
  If the HAVE_MALLOC_USABLE_SIZE option is true, then SQLite tries uses the
  malloc_usable_size() interface to find the size of a memory allocation obtained
  from the standard-library malloc() or realloc() routines.  This option is only
  applicable if the standard-library malloc() is used.  On Apple systems,
  "zone malloc" is used instead, and so this option is not applicable.  And, of
  course, if the application supplies its own malloc implementation using
  SQLITE_CONFIG_MALLOC then this option has no effect.
  
  If the HAVE_MALLOC_USABLE_SIZE option is omitted or is false, then SQLite 
  uses a wrapper around system malloc() and realloc() that enlarges each allocation
  by 8 bytes and writes the size of the allocation in the initial 8 bytes, and
  then SQLite also implements its own home-grown version of malloc_usable_size()
  that consults that 8-byte prefix to find the allocation size.  This approach
  works but it is suboptimal.  Applications are encouraged to use
  HAVE_MALLOC_USABLE_SIZE whenever possible.

HAVE_STRCHRNUL
  If the HAVE_STRCHRNUL option is true, then SQLite uses the strchrnul() library
  function.  If this option is missing or false, then SQLite substitutes its own
  home-grown implementation of strchrnul().

HAVE_USLEEP
  If the HAVE_USLEEP option is true, then the default unix VFS uses the
  usleep() system call to implement the xSleep method.  If this option is
  undefined or false, then xSleep on unix is implemented using sleep() which
  means that sqlite3_sleep() will have a minimum wait interval of 1000
  milliseconds regardless of its argument.  

HAVE_UTIME
  If the HAVE_UTIME option is true, then the built-in but non-standard
  "unix-dotfile" VFS will use the utime() system call, instead of utimes(),
  to set the last access time on the lock file.

SQLITE_BYTEORDER=(0|1234|4321)
  SQLite needs to know if the native byte order of the target CPU is
  big-endian or little-ending.  The SQLITE_BYTEORDER preprocessor is set
  to 4321 for big-endian machines and 1234 for little-endian machines, or
  it can be 0 to mean that the byte order must be determined at run-time.
  There are #ifdefs in the code that set SQLITE_BYTEORDER automatically
  for all common platforms and compilers.  However, it may be advantageous
  to set SQLITE_BYTEORDER appropriately when compiling SQLite for obscure
  targets.  If the target byte order cannot be determined at compile-time,
  then SQLite falls back to doing run-time checks, which always work, though
  with a small performance penalty.



4.  Options To Set Default Parameter Values


SQLITE_DEFAULT_AUTOMATIC_INDEX=&lt;0 or 1&gt;
  This macro determines the initial setting for PRAGMA automatic_index
  for newly Òopened database connections.
  For all versions of SQLite through 3.7.17,
  automatic indices are normally enabled for new database connections if
  this compile-time option is omitted.
  However, that might change in future releases of SQLite.
  See also: SQLITE_OMIT_AUTOMATIC_INDEX

SQLITE_DEFAULT_AUTOVACUUM=&lt;0 or 1 or 2&gt;
  This macro determines if SQLite creates databases with the 
  auto_vacuum flag set by default to OFF (0), FULL (1), or
  INCREMENTAL (2). The default value is 0 meaning that databases
  are created with auto-vacuum turned off.
  In any case the compile-time default may be overridden by the 
  PRAGMA auto_vacuum command.

SQLITE_DEFAULT_CACHE_SIZE=&lt;N&gt;
  This macro sets the default maximum size of the page-cache for each attached
  database.  A positive value means that the limit is N page.  If N is negative
  that means to limit the cache size to -N*1024 bytes.
  The suggested maximum cache size can be overridden by the 
  PRAGMA cache_size command. The default value is -2000, which translates
  into a maximum of 2048000 bytes per cache.

SQLITE_DEFAULT_FILE_FORMAT=&lt;1 or 4&gt;
  The default schema format number used by SQLite when creating
  new database files is set by this macro.  The schema formats are all
  very similar.  The difference between formats 1 and 4 is that format
  4 understands descending indices and has a tighter encoding for
  boolean values.

  All versions of SQLite since 3.3.0 (2006-01-10)
  can read and write any schema format
  between 1 and 4.  But older versions of SQLite might not be able to
  read formats greater than 1.  So that older versions of SQLite will
  be able to read and write database files created by newer versions
  of SQLite, the default schema format was set to 1 for SQLite versions
  through 3.7.9 (2011-11-01).  Beginning with 
  version 3.7.10 (2012-01-16), the default
  schema format is 4.

  The schema format number for a new database can be set at runtime using
  the PRAGMA legacy_file_format command.

SQLITE_DEFAULT_FILE_PERMISSIONS=N
  The default numeric file permissions for newly created database files
  under unix.  If not specified, the default is 0644 which means that
  the files is globally readable but only writable by the creator.

SQLITE_DEFAULT_FOREIGN_KEYS=&lt;0 or 1&gt;
  This macro determines whether enforcement of 
  foreign key constraints is enabled or disabled by default for
  new database connections.  Each database connection can always turn
  enforcement of foreign key constraints on and off and run-time using
  the foreign_keys pragma.  Enforcement of foreign key constraints
  is normally off by default, but if this compile-time parameter is
  set to 1, enforcement of foreign key constraints will be on by default.

SQLITE_DEFAULT_MMAP_SIZE=N
  This macro sets the default limit on the amount of memory that
  will be used for memory-mapped I/O
  for each open database file.  If the N
  is zero, then memory mapped I/O is disabled by default.  This
  compile-time limit and the SQLITE_MAX_MMAP_SIZE can be modified 
  at start-time using the
  sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) call, or at run-time
  using the mmap_size pragma.

SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=&lt;bytes&gt;
  This option sets the size limit on rollback journal files in
  persistent journal mode and
  exclusive locking mode and on the size of the
  write-ahead log file in WAL mode. When this 
  compile-time option is omitted there is no upper bound on the
  size of the rollback journals or write-ahead logs.  
  The journal file size limit
  can be changed at run-time using the journal_size_limit pragma.

SQLITE_DEFAULT_LOCKING_MODE=&lt;1 or 0&gt;
  If set to 1, then the default locking_mode is set to EXCLUSIVE.
  If omitted or set to 0 then the default locking_mode is NORMAL.

SQLITE_DEFAULT_LOOKASIDE=SZ,N
  Sets the default size of the lookaside memory allocator memory pool
  to N entries of SZ bytes each.  This setting can be modified at
  start-time using sqlite3_config(SQLITE_CONFIG_LOOKASIDE) and/or
  as each database connection is opened uÓsing
  sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE).

SQLITE_DEFAULT_MEMSTATUS=&lt;1 or 0&gt;
  This macro is used to determine whether or not the features enabled and
  disabled using the SQLITE_CONFIG_MEMSTATUS argument to sqlite3_config()
  are available by default. The default value is 1 (SQLITE_CONFIG_MEMSTATUS
  related features enabled).
  
  The sqlite3_memory_used() and sqlite3_memory_highwater() interfaces,
  the sqlite3_status64(SQLITE_STATUS_MEMORY_USED) interface,
  and the SQLITE_MAX_MEMORY compile-time option are all non-functional
  when memory usage tracking is disabled.

SQLITE_DEFAULT_PCACHE_INITSZ=N
  This macro determines the number of pages initially allocated by the 
  page cache module when SQLITE_CONFIG_PAGECACHE configuration option is
  not use and memory for the page cache is obtained from sqlite3_malloc()
  instead.  The number of pages set by this macro are allocated in a single
  allocation, which reduces the load on the memory allocator.

SQLITE_DEFAULT_PAGE_SIZE=&lt;bytes&gt;
  This macro is used to set the default page-size used when a
  database is created. The value assigned must be a power of 2. The
  default value is 4096. The compile-time default may be overridden at 
  runtime by the PRAGMA page_size command.

SQLITE_DEFAULT_SYNCHRONOUS=&lt;0-3&gt;
  This macro determines the default value of the
  PRAGMA synchronous setting.  If not overridden at compile-time,
  the default setting is 2 (FULL).

SQLITE_DEFAULT_WAL_SYNCHRONOUS=&lt;0-3&gt;
  This macro determines the default value of the
  PRAGMA synchronous setting for database files that open in
  WAL mode.  If not overridden at compile-time, this value is the
  same as SQLITE_DEFAULT_SYNCHRONOUS.
  
  If SQLITE_DEFAULT_WAL_SYNCHRONOUS differs from SQLITE_DEFAULT_SYNCHRONOUS,
  and if the application has not modified the synchronous setting for
  the database file using the PRAGMA synchronous statement, then
  the synchronous setting is changed to value defined by
  SQLITE_DEFAULT_WAL_SYNCHRONOUS when the database connection switches
  into WAL mode for the first time.
  If the SQLITE_DEFAULT_WAL_SYNCHRONOUS value is not overridden at
  compile-time, then it will always be the same as
  SQLITE_DEFAULT_SYNCHRONOUS and so no automatic synchronous setting
  changes will ever occur.

SQLITE_DEFAULT_WAL_AUTOCHECKPOINT=&lt;pages&gt;
  This macro sets the default page count for the WAL
  automatic checkpointing feature.  If unspecified,
  the default page count is 1000.

SQLITE_DEFAULT_WORKER_THREADS=N
  This macro sets the default value for
  the SQLITE_LIMIT_WORKER_THREADS parameter.  The SQLITE_LIMIT_WORKER_THREADS
  parameter sets the maximum number of auxiliary threads that a single
  prepared statement will launch to assist it with a query.  If not specified,
  the default maximum is 0.
  The value set here cannot be more than SQLITE_MAX_WORKER_THREADS.

SQLITE_DQS=N
  This macro determines the default values for
  SQLITE_DBCONFIG_DQS_DDL and SQLITE_DBCONFIG_DQS_DML, which
  in turn how SQLite handles each double-quoted string literal.
  The "DQS" name stands for 
  "Double-Quoted String".
  The N argument should be an integer 0, 1, 2, or 3.
  
  SQLITE_DQSDouble-Quoted Strings Allowed
      Remarks
  In DDLIn DML
  3yesyesdefault
  2yesno&nbsp;
  1noyes&nbsp;
  0nonorecommended
  
  The recommended setting is 0, meaning that double-quoted
  strings are disallowed in all contexts.  However, the default
  setting is 3 for maximum compatibility with legacy applications.

SQLITE_EXTRA_DURABLE
  The SQLITE_EXTRA_DURABLE compile-time option that used to cause the default
  PRAGMA synchronous setting to be EXTRA, rather than FULL.  This option
  is no longer supported.  Use
  SQLITE_DEFAULT_SYNCHRONOUS=3 instead.

SQLITE_FTS3_MAX_EXPR_DEPTH=N
  This macro sets the maximum depth of the search tree that corresponds to
  the right-hand side of the MATCH operator in an FTS3 or FTS4 full-text
  index.  The full-text search uses a recursive algorithm, so the depth of
  the tree is limited to prevent using too much stack space.  The defÔault
  limit is 12.  This limit is sufficient for up to 4095 search terms on the
  right-hand side of the MATCH operator and it holds stack space usage to 
  less than 2000 bytes.
  
  For ordinary FTS3/FTS4 queries, the search tree depth is approximately
  the base-2 logarithm of the number of terms in the right-hand side of the
  MATCH operator.  However, for phrase queries and NEAR queries the
  search tree depth is linear in the number of right-hand side terms.
  So the default depth limit of 12 is sufficient for up to 4095 ordinary
  terms on a MATCH, it is only sufficient for 11 or 12 phrase or NEAR
  terms.  Even so, the default is more than enough for most application.

SQLITE_LIKE_DOESNT_MATCH_BLOBS
  This compile-time option causes the LIKE operator to always return 
  False if either operand is a BLOB.  The default behavior of LIKE 
  is that BLOB operands are cast to TEXT before the comparison is done.
  
  This compile-time option makes SQLite run more efficiently when processing
  queries that use the LIKE operator, at the expense of breaking backwards
  compatibility.  However, the backwards compatibility break may be only
  a technicality.  There was a long-standing bug in the LIKE processing logic
  (see https://www.sqlite.org/src/info/05f43be8fdda9f) that caused it to
  misbehavior for BLOB operands and nobody observed that bug in nearly
  10 years of active use.  So for more users, it is probably safe to
  enable this compile-time option and thereby save a little CPU time
  on LIKE queries.
  
  This compile-time option affects the SQL LIKE operator only and has
  no impact on the sqlite3_strlike() C-language interface.

SQLITE_MAX_MEMORY=N
  This option limits the total amount of memory that SQLite will request
  from malloc() to N bytes.  Any attempt by SQLite to allocate
  new memory that would cause the sum of all allocations held by SQLite to exceed
  N bytes will result in an out-of-memory error.
  This is a hard upper limit.  See also the sqlite3_soft_heap_limit()
  interface.
  
  This limit is only functional if memory usage statistics are available via
  the sqlite3_memory_used() and sqlite3_status64(SQLITE_STATUS_MEMORY_USED)
  interfaces.  Without that memory usage information, SQLite has no way of
  knowing when it is about to go over the limit, and thus is unable to prevent
  the excess memory allocation.  Memory usage tracking is turned on by default,
  but can be disabled at compile-time using the SQLITE_DEFAULT_MEMSTATUS option,
  or at start-time using sqlite3_config(SQLITE_CONFIG_MEMSTATUS).

SQLITE_MAX_MMAP_SIZE=N
  This macro sets a hard upper bound on the amount of address space that
  can be used by any single database for memory-mapped I/O.
  Setting this value to 0 completely disables memory-mapped I/O and
  causes logic associated with memory-mapped I/O to be omitted from the
  build.  This option does change the default memory-mapped I/O address
  space size (set by SQLITE_DEFAULT_MMAP_SIZE or
  sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) or the
  run-time memory-mapped I/O address space size (set by
  sqlite3_file_control(SQLITE_FCNTL_MMAP_SIZE) or
  PRAGMA mmap_size) as long as those other settings are less than the
  maximum value defined here.

SQLITE_MAX_SCHEMA_RETRY=N
  Whenever the database schema changes, prepared statements are automatically
  reprepared to accommodate the new schema.  There is a race condition here
  in that if one thread is constantly changing the schema, another thread
  might spin on reparses and repreparations of a prepared statement and
  never get any real work done.  This parameter prevents an infinite loop
  by forcing the spinning thread to give up after a fixed number of attempts
  at recompiling the prepared statement.  The default setting is 50 which is
  more than adequate for most applications.

SQLITE_MAX_WORKER_THREADS=N
  Set an upper bound on the sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,N)
  setting that determines the maximum number of auxiliary threads that a single
  prepared statement will use to aid with CPU-intensive compÕutations
  (mostly sorting).  See also the SQLITE_DEFAULT_WORKER_THREADS options.

SQLITE_MEMDB_DEFAULT_MAXSIZE=N
  Set the default size limit (in bytes) for in-memory databases created using
  sqlite3_deserialize().  This is just the default.  The limit can be
  changed at start-time using
  sqlite3_config(SQLITE_CONFIG_MEMDB_MAXSIZE,N)
  or at run-time for individual databases using the
  SQLITE_FCNTL_SIZE_LIMIT file-control.
  If no default is specified, 1073741824 is used.

SQLITE_MINIMUM_FILE_DESCRIPTOR=N
  The unix VFS will never use a file descriptor less than N.  The
  default value of N is 3.
  
  Avoiding the use of low-numbered file descriptors is a defense against
  accidental database corruption.  If a database file was opened using
  file descriptor 2, for example, and then an assert() failed and invoked
  write(2,...), that would likely cause database corruption by overwriting
  part of the database file with the assertion error message.  Using only
  higher-valued file descriptors avoids this potential problem.  The 
  protection against
  using low-numbered file descriptors can be disabled by setting this
  compile-time option to 0.

SQLITE_POWERSAFE_OVERWRITE=&lt;0 or 1&gt;
  This option changes the default assumption about powersafe overwrite
  for the underlying filesystems for the unix and windows VFSes.
  Setting SQLITE_POWERSAFE_OVERWRITE to 1 causes SQLite to assume that
  application-level writes cannot changes bytes outside the range of
  bytes written even if the write occurs just before a power loss.
  With SQLITE_POWERSAFE_OVERWRITE set to 0, SQLite assumes that other
  bytes in the same sector with a written byte might be changed or 
  damaged by a power loss.

SQLITE_PRINTF_PRECISION_LIMIT=N
  This option limits the maximum width and precision of substitutions
  for the printf() SQL function and the other C-language string
  formatting functions such as sqlite3_mprintf() and
  sqlite3_str_appendf().  This is turn can prevent a hostile or
  malfunctioning script from using excessive memory by invoking
  a format such as: "printf('%*s',2147483647,'hi')".
  A value for N of around 100000 is normally sufficient.
  
  The printf() SQL function is subject to the SQLITE_LIMIT_LENGTH
  limit of sqlite3_limit().  Hence any printf() result with a
  width or precision more than the SQLITE_LIMIT_LENGTH will cause
  an SQLITE_TOOBIG error.  However, the low-level formatting
  for the printf() function is done by a subroutine that does not
  have access to SQLITE_LIMIT_LENGTH.  So the low-level formatting
  is done into a memory allocation that might be considerably larger
  than SQLITE_LIMIT_LENGTH and the SQLITE_LIMIT_LENGTH check is only
  performed after all formatting is complete.  Thus there might be a
  transient buffer that exceeds SQLITE_LIMIT_LENGTH.  The
  SQLITE_PRINTF_PRECISION_LIMIT option is an additional check
  that prevents excess sizes for the transient buffer used inside
  the low-level formatting subroutine, prior to the
  SQLITE_LIMIT_LENGTH check.
  
  Be careful not to set SQLITE_PRINTF_PRECISION_LIMIT too low.
  SQLite uses its built-in printf() functionality to format the text
  of CREATE statements stored in the sqlite_schema table.  So
  SQLITE_PRINTF_PRECISION_LIMIT should be at least as big as the largest
  table, index, view, or trigger definition that you are likely to
  encounter.
  
  No error is raised if a width or precision exceeds
  SQLITE_PRINTF_PRECISION_LIMIT.  Instead, the large width or
  precision is silently truncated.
  
  The default value for SQLITE_PRINTF_PRECISION_LIMIT is 2147483647
  (0x7fffffff).


SQLITE_QUERY_PLANNER_LIMIT=N
  As part of the query planning process, SQLite enumerates all usable
  combinations of indexes and WHERE-clause constraints.  For certain
  pathological queries, the number of these index-and-constraint combinations
  can be very large, resulting in slow performance by the query planner.
  The SQLITE_QUERY_PLANNER_LIMIT value (in conjunction with the
  related SQLITE_QUERY_PLANNER_LIMIT_INCR setting) limits the number 
  of Öindex-and-constraint combinations that the query planner will 
  consider, in order to prevent the query planner from using excess
  CPU time.  The default value for SQLITE_QUERY_PLANNER_LIMIT is set
  high enough so that is never reached for real-world queries.  The
  query planner search limit only applies to queries that are deliberately
  crafted to use excess planning time.

SQLITE_QUERY_PLANNER_LIMIT_INCR=N
  The SQLITE_QUERY_PLANNER_LIMIT option sets an initial baseline value
  for the maximum number of index-and-constraint combinations that the
  query planner consider.  The baseline query planner limit is increased
  by SQLITE_QUERY_PLANNER_LIMIT_INCR prior to processing each table of a
  join so that each table is guaranteed to be able to propose at least
  some index-and-constraint combinations to the optimizer even if prior
  tables of the join have exhausted the baseline limit.  The default
  value for both this compile-time option and the
  SQLITE_QUERY_PLANNER_LIMIT option are set high enough so that they should
  never be reached for real-world queries.

SQLITE_REVERSE_UNORDERED_SELECTS
  This option causes the PRAGMA reverse_unordered_selects setting to be
  enabled by default.  When enabled, SELECT statements that lack an
  ORDER BY clause will run in reverse order.
  This option is useful for detecting when applications (incorrectly)
  assume that the order of rows in a SELECT without an ORDER BY clause
  will always be the same.

SQLITE_SORTER_PMASZ=N
  If multi-threaded processing is enabled via the
  PRAGMA threads setting, then sort operations will
  attempt to start helper threads when the amount of content
  to be sorted exceeds the minimum of the cache_size and PMA Size
  determined by the SQLITE_CONFIG_PMASZ start-time option.
  This compile-time option sets the default value for the
  SQLITE_CONFIG_PMASZ start-time option.
  The default value is 250.

SQLITE_STMTJRNL_SPILL=N
  The SQLITE_STMTJRNL_SPILL compile-time option determines the
  default setting of the SQLITE_CONFIG_STMTJRNL_SPILL start-time
  setting.  That setting determines the size threshold above which
  statement journals are moved from memory to disk.

SQLITE_WIN32_MALLOC
  This option enables the use of the Windows Heap API functions for memory
  allocation instead of the standard library malloc() and free() routines.

YYSTACKDEPTH=&lt;max_depth&gt;
  This macro sets the maximum depth of the LALR(1) stack used by
  the SQL parser within SQLite.  The default value is 100.  A typical
  application will use less than about 20 levels of the stack.
  Developers whose applications contain SQL statements that 
  need more than 100 LALR(1) stack entries should seriously
  consider refactoring their SQL as it is likely to be well beyond
  the ability of any human to comprehend.


5.  Options To Set Size Limits

There are compile-time options that will set upper bounds
on the sizes of various structures in SQLite.  The compile-time
options normally set a hard upper bound that can be changed
at run-time on individual database connections using the
sqlite3_limit() interface.

The compile-time options for setting upper bounds are
documented separately.  The following is a list of
the available settings:


 SQLITE_MAX_ATTACHED  
 SQLITE_MAX_COLUMN  
 SQLITE_MAX_COMPOUND_SELECT  
 SQLITE_MAX_EXPR_DEPTH  
 SQLITE_MAX_FUNCTION_ARG  
 SQLITE_MAX_LENGTH  
 SQLITE_MAX_LIKE_PATTERN_LENGTH  
 SQLITE_MAX_PAGE_COUNT  
 SQLITE_MAX_SQL_LENGTH  
 SQLITE_MAX_VARIABLE_NUMBER  



6.  Options To Control Operating Characteristics


SQLITE_4_BYTE_ALIGNED_MALLOC
  On most systems, the malloc() system call returns a buffer that is
  aligned to an 8-byte boundary.  But on some systems (ex: windows) malloc()
  returns 4-byte aligned pointer.  This compile-time option must be used
  on systems that return 4-byte aligned pointers from malloc().

SQLITE_CASE_SENSITIVE_LIKE
  If this option is present, then the built-in LIKE operator will be
  case sensitive.  This same effect can be achieved at run-time using
  the case_sensitive_like pragma.

SQLITE_DIRECT_OVE×RFLOW_READ
  When this option is present, content contained in
  overflow pages of the database file is read directly from disk,
  bypassing the page cache, during read transactions.  In applications
  that do a lot of reads of large BLOBs, this option might improve read
  performance.

SQLITE_HAVE_ISNAN
  If this option is present, then SQLite will use the isnan() function from
  the system math library.  This is an alias for the HAVE_ISNAN configuration
  option.

SQLITE_MAX_ALLOCATION_SIZE=N
  This compile-time option sets an upper bound on the size of memory
  allocations that can be requested using sqlite3_malloc64(),
  sqlite3_realloc64(), and similar.  The default value is
  2,147,483,391 (0x7ffffeff) and this should be considered an
  upper bound.  Most applications can get by with an maximum allocation
  size of a few million bytes.
  
  This is a limit on the maximum size of any single memory allocation.
  It is not a limit on the total amount of memory allocated.
  
  Reducing the maximum size of individual memory allocations provides
  extra defense against denial-of-service attacks that attempt to exhaust
  system memory by doing many large allocations.  It is also an extra layer
  of defense against application bugs where the size of a memory allocation
  is computed using a signed 32-bit integer that could overflow &rarr;
  with a small maximum allocation size, such buggy memory allocation size
  computations are likely to be spotted sooner due to out-of-memory errors
  and before the integer actually overflows.

SQLITE_OS_OTHER=&lt;0 or 1&gt;
  The option causes SQLite to omit its built-in operating system interfaces
  for Unix, Windows, and OS/2.  The resulting library will have no default
  operating system interface.  Applications must use
  sqlite3_vfs_register() to register an appropriate interface before
  using SQLite.  Applications must also supply implementations for the
  sqlite3_os_init() and sqlite3_os_end() interfaces.  The usual practice
  is for the supplied sqlite3_os_init() to invoke sqlite3_vfs_register().
  SQLite will automatically invoke sqlite3_os_init() when it initializes.

  This option is typically used when building SQLite for an embedded
  platform with a custom operating system.

SQLITE_SECURE_DELETE
  This compile-time option changes the default setting of the
  secure_delete pragma.  When this option is not used, secure_delete defaults
  to off.  When this option is present, secure_delete defaults to on.

  The secure_delete setting causes deleted content to be overwritten with
  zeros.  There is a small performance penalty since additional I/O
  must occur.  On the other hand, secure_delete can prevent fragments of 
  sensitive information from lingering in unused parts of the database file 
  after it has been deleted.  See the documentation on the
  secure_delete pragma for additional information.

SQLITE_THREADSAFE=&lt;0 or 1 or 2&gt;
  This option controls whether or not code is included in SQLite to
  enable it to operate safely in a multithreaded environment.  The
  default is SQLITE_THREADSAFE=1 which is safe for use in a multithreaded
  environment.  When compiled with SQLITE_THREADSAFE=0 all mutexing code
  is omitted and it is unsafe to use SQLite in a multithreaded program.
  When compiled with SQLITE_THREADSAFE=2, SQLite can be used in a multithreaded
  program so long as no two threads attempt to use the same
  database connection (or any prepared statements derived from
  that database connection) at the same time.

  To put it another way, SQLITE_THREADSAFE=1 sets the default
  threading mode to Serialized.  SQLITE_THREADSAFE=2 sets the default
  threading mode to Multi-threaded.  And SQLITE_THREADSAFE=0 sets the
  threading mode to Single-threaded.

  The value of SQLITE_THREADSAFE can be determined at run-time
  using the sqlite3_threadsafe() interface.

  When SQLite has been compiled with SQLITE_THREADSAFE=1 or
  SQLITE_THREADSAFE=2 then the threading mode
  can be altered at run-time using the sqlite3_config() interface together
  with one of these vØerbs:

  
  SQLITE_CONFIG_SINGLETHREAD
  SQLITE_CONFIG_MULTITHREAD
  SQLITE_CONFIG_SERIALIZED
  

  The SQLITE_OPEN_NOMUTEX and
  SQLITE_OPEN_FULLMUTEX flags to sqlite3_open_v2() can also be used
  to adjust the threading mode of individual database connections
  at run-time.

  Note that when SQLite is compiled with SQLITE_THREADSAFE=0, the code
  to make SQLite threadsafe is omitted from the build.  When this occurs,
  it is impossible to change the threading mode at start-time or run-time.

  See the threading mode documentation for additional information
  on aspects of using SQLite in a multithreaded environment.

SQLITE_TEMP_STORE=&lt;0 through 3&gt;
  This option controls whether temporary files are stored on disk or
  in memory.  The meanings for various settings of this compile-time
  option are as follows:

  
  SQLITE_TEMP_STOREMeaning
  0Always use temporary files
  1Use files by default but allow the
  PRAGMA temp_store command to override
  2Use memory by default but allow the
  PRAGMA temp_store command to override
  3Always use memory
  

  The default setting is 1.  
  Additional information can be found in tempfiles.html.

SQLITE_TRACE_SIZE_LIMIT=N
  If this macro is defined to a positive integer N, then the length of
  strings and BLOB that are expanded into parameters in the output of
  sqlite3_trace() is limited to N bytes.  

SQLITE_TRUSTED_SCHEMA=&lt;0 or 1&gt;
  This macro determines the default value for the
  SQLITE_DBCONFIG_TRUSTED_SCHEMA and PRAGMA trusted_schema setting.
  If no alternative is specified, the trusted-schema setting defaults
  to ON (a value of 1) for legacy compatibility.  However, for best
  security, systems that implement
  application-defined SQL functions and/or virtual tables should
  consider changing the default to OFF.

SQLITE_USE_URI
  This option causes the URI filename process logic to be enabled by 
  default.  



7.  Options To Enable Features Normally Turned Off


SQLITE_ALLOW_URI_AUTHORITY
  URI filenames normally throws an error if the authority section is
  not either empty or "localhost".  However, if SQLite is compiled with
  the SQLITE_ALLOW_URI_AUTHORITY compile-time option, then the URI is
  converted into a Uniform Naming Convention (UNC) filename and passed
  down to the underlying operating system that way.  
  
  Some future versions of SQLite may change to enable this feature
  by default.

SQLITE_ALLOW_COVERING_INDEX_SCAN=&lt;0 or 1&gt;
  This C-preprocess macro determines the default setting of the
  SQLITE_CONFIG_COVERING_INDEX_SCAN configuration setting.  It defaults
  to 1 (on) which means that covering indices are used for full table
  scans where possible, in order to reduce I/O and improve performance.
  However, the use of a covering index for a full scan will cause results
  to appear in a different order from legacy, which could cause some
  (incorrectly-coded) legacy applications to break.  Hence, the covering
  index scan option can be disabled at compile-time on systems that what
  to minimize their risk of exposing errors in legacy applications.

SQLITE_ENABLE_8_3_NAMES=&lt;1 or 2&gt;
  If this C-preprocessor macro is defined, then extra code is
  included that allows SQLite to function on a filesystem that
  only support 8+3 filenames.  If the value of this macro is 1,
  then the default behavior is to continue to use long filenames and
  to only use 8+3 filenames if the 
  database connection is opened using URI filenames with
  the "8_3_names=1" query parameter.  If the value of
  this macro is 2, then the use of 8+3 filenames becomes the default
  but may be disabled on using the 8_3_names=0 query parameter.

SQLITE_ENABLE_API_ARMOR
  When defined, this C-preprocessor macro activates extra code that
  attempts to detect misuse of the SQLite API, such as passing in NULL
  pointers to required parameters or using objects after they have been
  destroyed.

SQLITE_ENABLE_ATOMIC_WRITE
  If this C-preprocessor macro is defined and if the
  xDeviceCharacteristics method of sqlite3_io_methods object for
  a database file reports (viaÙ one of the SQLITE_IOCAP_ATOMIC bits)
  that the filesystem supports atomic writes and if a transaction
  involves a change to only a single page of the database file,
  then the transaction commits with just a single write request of
  a single page of the database and no rollback journal is created
  or written.  On filesystems that support atomic writes, this
  optimization can result in significant speed improvements for
  small updates.  However, few filesystems support this capability
  and the code paths that check for this capability slow down write
  performance on systems that lack atomic write capability, so this
  feature is disabled by default.

SQLITE_ENABLE_BATCH_ATOMIC_WRITE
  This compile-time option enables SQLite to take advantage batch
  atomic write capabilities in the underlying filesystem.  As of
  SQLite version 3.21.0 (2017-10-24) this is only supported on
  F2FS.  However, the interface
  is implemented generically, using sqlite3_file_control() with
  SQLITE_FCNTL_BEGIN_ATOMIC_WRITE and SQLITE_FCNTL_COMMIT_ATOMIC_WRITE
  so the capability can be added to other filesystem times in the
  future.  When this option is enabled, SQLite automatically detects
  that the underlying filesystem supports batch atomic writes, and
  when it does so it avoids writing the rollback journal for transaction
  control.  This can make transactions over twice as fast, while
  simultaneously reducing wear on SSD storage devices.

  Future versions of SQLite might enable the batch-atomic-write
  capability by default, at which point this compile-time option
  will become superfluous.

SQLITE_ENABLE_BYTECODE_VTAB
  This option enables the bytecode and tables_used virtual tables.

SQLITE_ENABLE_COLUMN_METADATA
  When this C-preprocessor macro is defined, SQLite includes some
  additional APIs that provide convenient access to meta-data about
  tables and queries.  The APIs that are enabled by this option are:

  
   sqlite3_column_database_name() 
   sqlite3_column_database_name16() 
   sqlite3_column_table_name() 
   sqlite3_column_table_name16() 
   sqlite3_column_origin_name() 
   sqlite3_column_origin_name16() 
  

SQLITE_ENABLE_DBPAGE_VTAB
  This option enables the SQLITE_DBPAGE virtual table.

SQLITE_ENABLE_DBSTAT_VTAB
  This option enables the dbstat virtual table.

SQLITE_ENABLE_DESERIALIZE
  This option was formerly used to enable
  the sqlite3_serialize() and sqlite3_deserialize()
  interfaces.  However, as of SQLite 3.36.0 (2021-06-18)
  those interfaces are enabled by default and a new
  compile-time option SQLITE_OMIT_DESERIALIZE is added
  to omit them.

SQLITE_ENABLE_EXPLAIN_COMMENTS
  This option adds extra logic to SQLite that inserts comment text into the
  output of EXPLAIN.  These extra comments use extra memory, thus
  making prepared statements larger and very slightly slower, and so they are
  turned off by default and in most application.  But some applications, such
  as the command-line shell for SQLite, value clarity of EXPLAIN output
  over raw performance and so this compile-time option is available to them.
  The SQLITE_ENABLE_EXPLAIN_COMMENTS compile-time option is also enabled
  automatically if SQLITE_DEBUG is enabled.

SQLITE_ENABLE_FTS3
  When this option is defined in the amalgamation, version 3
  of the full-text search engine is added to the build automatically.

SQLITE_ENABLE_FTS3_PARENTHESIS
  This option modifies the query pattern parser in FTS3 such that it
  supports operators AND and NOT (in addition to the usual OR and NEAR)
  and also allows query expressions to contain nested parenthesis.

SQLITE_ENABLE_FTS3_TOKENIZER
  This option enables the two-argument version of the fts3_tokenizer()
  interface.  The second argument to fts3_tokenizer() is suppose to be a
  pointer to a function (encoded as a BLOB) that implements an
  application defined tokenizer.  If hostile actors are able to run
  the two-argument version of fts3_tokenizer() with an arbitrary second
  argument, they could use crash or take control of the process. 
  
  Because of security concerns, the two-argumÚent fts3_tokenizer() feature 
  was disabled beginning with Version 3.11.0 (2016-02-15)
  unless this compile-time option is used.
  Version 3.12.0 (2016-03-29) added the 
  sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,1,0) interface
  that activates the two-argument version of fts3_tokenizer()
  for a specific database connection at run-time.

SQLITE_ENABLE_FTS4
  When this option is defined in the amalgamation, versions 3 and 4
  of the full-text search engine is added to the build automatically.

SQLITE_ENABLE_FTS5
  When this option is defined in the amalgamation, versions 5
  of the full-text search engine (fts5) is added to the build automatically.

SQLITE_ENABLE_GEOPOLY
  When this option is defined in the amalgamation, the Geopoly extension
  is included in the build.

SQLITE_ENABLE_ICU
  This option causes the 
  International Components for Unicode
  or "ICU" extension to SQLite to be added to the build.  

SQLITE_ENABLE_IOTRACE
  When both the SQLite core and the Command Line Interface (CLI) are both 
  compiled with this option, then the CLI provides an extra command
  named ".iotrace" that provides a low-level log of I/O activity.
  This option is experimental and may be discontinued in a future release.

SQLITE_ENABLE_MATH_FUNCTIONS
  This macro enables the built-in SQL math functions.  This option
  is automatically added to the Makefile by the configure script on unix platforms,
  unless the --disable-math option is used.
  This option is also included on Windows builds using the
  "Makefile.msc" makefile for nmake.

SQLITE_ENABLE_JSON1
  This compile-time option is a no-op.  Prior to SQLite version 3.38.0
  (2022-02-22), it was necessary to compile with this option in order
  to include the JSON SQL functions in the build.  However, beginning
  with SQLite version 3.38.0, those functions are included by default.
  Use the -DSQLITE_OMIT_JSON option to omit them.

SQLITE_ENABLE_LOCKING_STYLE
  This option enables additional logic in the OS interface layer for
  Mac OS X. The additional logic attempts to determine the type of the
  underlying filesystem and choose and alternative locking strategy
  that works correctly for that filesystem type. Five locking strategies 
  are available:

  
     POSIX locking style. This is the default locking style and the
         style used by other (non Mac OS X) Unixes. Locks are obtained and 
         released using the fcntl() system call.

     AFP locking style. This locking style is used for network file 
         systems that use the AFP (Apple Filing Protocol) protocol. Locks
         are obtained by calling the library function _AFPFSSetLock().

     Flock locking style. This is used for file-systems that do not
         support POSIX locking style. Locks are obtained and released using
         the flock() system call.

     Dot-file locking style. This locking style is used when neither
         flock nor POSIX locking styles are supported by the file system.
         Database locks are obtained by creating and entry in the file-system
         at a well-known location relative to the database file (a "dot-file")
         and relinquished by deleting the same file.

     No locking style. If none of the above can be supported, this 
         locking style is used. No database locking mechanism is used. When
         this system is used it is not safe for a single database to be
         accessed by multiple clients.
  

  Additionally, five extra VFS implementations are provided as well as the
  default. By specifying one of the extra VFS implementations 
  when calling sqlite3_open_v2(), an application may bypass the file-system
  detection logic and explicitly select one of the above locking styles. The
  five extra VFS implementations are called "unix-posix", "unix-afp",
  "unix-flock", "unix-dotfile" and "unix-none".

SQLITE_ENABLE_MEMORY_MANAGEMENT
  This option adds extra logic to SQLite that allows it to release unused
  memory upon request.  This option must be enabled in order for the
  sqlite3_release_memory() interface to work.  IfÛ this compile-time
  option is not used, the sqlite3_release_memory() interface is a 
  no-op.

SQLITE_ENABLE_MEMSYS3
  This option includes code in SQLite that implements an alternative
  memory allocator.  This alternative memory allocator is only engaged
  when the SQLITE_CONFIG_HEAP option to sqlite3_config() is used to
  supply a large chunk of memory from which all memory allocations are
  taken.
  The MEMSYS3 memory allocator uses a hybrid allocation algorithm 
  patterned after dlmalloc().   Only one of SQLITE_ENABLE_MEMSYS3 and 
  SQLITE_ENABLE_MEMSYS5 may be enabled at once.

SQLITE_ENABLE_MEMSYS5
  This option includes code in SQLite that implements an alternative
  memory allocator.  This alternative memory allocator is only engaged
  when the SQLITE_CONFIG_HEAP option to sqlite3_config() is used to
  supply a large chunk of memory from which all memory allocations are
  taken.
  The MEMSYS5 module rounds all allocations up to the next power
  of two and uses a first-fit, buddy-allocator algorithm
  that provides strong guarantees against fragmentation and breakdown
  subject to certain operating constraints.

SQLITE_ENABLE_NORMALIZE
  This option includes the sqlite3_normalized_sql() API.

SQLITE_ENABLE_NULL_TRIM
  This option enables an optimization that omits NULL columns at
  the ends of rows, for a space savings on disk.
  
  Databases generated with this option enabled are not readable
  by SQLite version 3.1.6 (2005-03-17) and earlier.  Also,
  databases generated with this option enabled are prone to
  triggering the
  e6e962d6b0f06f46
  bug in the sqlite3_blob_reopen() interface.  For those reasons,
  this optimization is disabled by default.  However, this optimization
  may be enabled by default in a future release of SQLite.

SQLITE_ENABLE_OFFSET_SQL_FUNC
  This option enables support for the sqlite_offset(X) SQL function.
  
  The sqlite_offset(X) SQL function requires a new interface on the
  B-tree storage engine, a new opcode in the virtual machine that
  runs SQL statements, and a new conditional in a critical path of the
  code generator.  To avoid that overhead in applications that do not
  need the utility of sqlite_offset(X), the function is disabled by
  default.

SQLITE_ENABLE_PREUPDATE_HOOK
  This option enables 
  several new APIs that provide callbacks
  prior to any change to a rowid table.  The callbacks can be used
  to record the state of the row before the change occurs.
  The action of the preupdate hook is similar to the
  update hook except that the callback is
  invoked before the change, not afterwards, and the preupdate
  hook interfaces are omitted unless this compile-time option is
  used.
  The preupdate hook interfaces were originally added to
  support the session extension.

SQLITE_ENABLE_QPSG
  This option causes the query planner stability guarantee (QPSG) to
  be on by default.  Normally the QPSG is off and must be activated
  at run-time using the SQLITE_DBCONFIG_ENABLE_QPSG option to the
  sqlite3_db_config() interface.

SQLITE_ENABLE_RBU
  Enable the code the implements the RBU extension.

SQLITE_ENABLE_RTREE
  This option causes SQLite to include support for the
  R*Tree index extension.

SQLITE_ENABLE_SESSION
  This option enables the session extension.

SQLITE_ENABLE_SNAPSHOT
  This option enables the code to support the sqlite3_snapshot object
  and its related interfaces:
  
   sqlite3_snapshot_get() (constructor)
   sqlite3_snapshot_free() (destructor)
   sqlite3_snapshot_open()
   sqlite3_snapshot_cmp()
   sqlite3_snapshot_recover()
  

SQLITE_ENABLE_SORTER_REFERENCES
  This option activates an optimization that reduces the memory required
  by the sorter at the cost of doing additional B-tree lookups after
  the sort has occurred.
  
  The default sorting procedure is to gather all information that will
  ultimately be output into a "record" and pass that complete record
  to the sorter.  But in some cases, for example if some of the output
  columns consists of large BLOB values, the size of the each record
  can be large, which means that the sortÜer has to either use more memory,
  and/or write more content to temporary storage.
  
  When SQLITE_ENABLE_SORTER_REFERENCES is enabled, the records passed to
  the sorter often contain only a ROWID value.  Such records are much
  smaller.  This means the sorter has much less "payload" to deal with and
  can run faster.  After sorting has occurred, the ROWID is used to look up 
  the output column values in the original table.  That requires another
  search into the table, and could potentially result in a slowdown.  Or,
  it might be a performance win, depending on how large the values are.
  
  Even when the SQLITE_ENABLE_SORTER_REFERENCES compile-time option is on,
  sorter references are still disabled by default.  To use sorter references,
  the application must set a sorter reference size threshold using the
  sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE) interface at start-time.
  
  Because the SQLite developers do not know whether the 
  SQLITE_ENABLE_SORTER_REFERENCES option will help or hurt performance,
  it is disabled by default at this time (2018-05-04).  It might be enabled
  by default in some future release, depending on what is learned about its
  impact on performance.

SQLITE_ENABLE_STMT_SCANSTATUS
  This option enables the sqlite3_stmt_scanstatus() interface.  The
  sqlite3_stmt_scanstatus() interface is normally omitted from the build
  because it imposes a small performance penalty, even on statements that
  do not use the feature.

SQLITE_ENABLE_STMTVTAB
  This compile-time option enables the SQLITE_STMT virtual table logic.

SQLITE_RTREE_INT_ONLY
  This compile-time option is deprecated and untested.

SQLITE_ENABLE_SQLLOG
  This option enables extra code (especially the SQLITE_CONFIG_SQLLOG
  option to sqlite3_config()) that can be used to create logs of all
  SQLite processing performed by an application.  These logs can be useful
  in doing off-line analysis of the behavior of an application, and especially
  for performance analysis.  In order for the SQLITE_ENABLE_SQLLOG option to 
  be useful, some extra code is required.  The 
  "test_sqllog.c"
  source code
  file in the SQLite source tree is a working example of the required extra
  code.  On unix and windows systems, a developer can append the text of the
  "test_sqllog.c" source code file to the end of an "sqlite3.c" amalgamation,
  recompile the application using the -DSQLITE_ENABLE_SQLLOG option, then 
  control logging using environment variables.  See the header comment on 
  the "test_sqllog.c" source file for additional detail.  

SQLITE_ENABLE_STAT2
  This option used to cause the ANALYZE command to collect
  index histogram data in the sqlite_stat2 table.  But that
  functionality was superceded by SQLITE_ENABLE_STAT3 as of
  SQLite version 3.7.9 (2011-11-01).  
  The SQLITE_ENABLE_STAT2 compile-time option
  is now a no-op.

SQLITE_ENABLE_STAT3
  This option used to cause the ANALYZE command to collect
  index histogram data in the sqlite_stat3 table.  But that
  functionality was superceded by SQLITE_ENABLE_STAT4 as of
  SQLite version 3.8.1 (2013-10-17).  
  The SQLITE_ENABLE_STAT3 compile-time option
  continued to be supported through version 3.29.0 (2019-07-10)
  but has now become a no-op.
  

SQLITE_ENABLE_STAT4
  This option adds additional logic to the ANALYZE command and to
  the query planner that can help SQLite to chose a better query plan
  under certain situations.  The ANALYZE command is enhanced to collect
  histogram data from all columns of every index and store that data
  in the sqlite_stat4 table.  The query planner will then use the
  histogram data to help it make better index choices.  The downside of
  this compile-time option is that it violates the
  query planner stability guarantee making it more difficult to ensure
  consistent performance in mass-produced applications.
  
  SQLITE_ENABLE_STAT4 is an enhancement of SQLITE_ENABLE_STAT3.  STAT3
  only recorded histogram data for the left-most column of each index
  whereas the STAT4 enhancement records histogram data from all columns
  of eachÝ index.
  The SQLITE_ENABLE_STAT3 compile-time option has become a no-op.

SQLITE_ENABLE_TREE_EXPLAIN
  This compile-time option is no longer used.

SQLITE_ENABLE_UPDATE_DELETE_LIMIT
  This option enables an optional ORDER BY and LIMIT clause on 
  UPDATE and DELETE statements.

  If this option is defined, then it must also be 
  defined when using the Lemon parser generator tool to generate a parse.c
  file. Because of this, this option may only be used when the library is built
  from source, not from the amalgamation or from the collection of
  pre-packaged C files provided for non-Unix like platforms on the website.
  

SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
  When the SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION compile-time option is
  activated, SQLite will suppress "unknown function" errors when running
  an EXPLAIN or EXPLAIN QUERY PLAN.  Instead of throwing an error,
  SQLite will insert a substitute no-op function named "unknown()".
  The substitution of "unknown()" in place of unrecognized functions
  only occurs on EXPLAIN and EXPLAIN QUERY PLAN, not on ordinary
  statements.
  
  When used in the command-line shell, the
  SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION feature allows SQL text that contains
  application-defined functions to be pasted into the shell for 
  analysis and debugging without having to create and load an
  extension that implements the application-defined functions.

SQLITE_ENABLE_UNLOCK_NOTIFY
  This option enables the sqlite3_unlock_notify() interface and
  its associated functionality.  See the documentation titled
  Using the SQLite Unlock Notification Feature for additional
  information.

SQLITE_INTROSPECTION_PRAGMAS
  This option is obsolete.  It used to enable some extra
  some extra PRAGMA statements such as
  PRAGMA function_list, PRAGMA module_list, and
  PRAGMA pragma_list, but those pragmas are now all
  enabled by default.  See SQLITE_OMIT_INTROSPECTION_PRAGMAS.

SQLITE_SOUNDEX
  This option enables the soundex() SQL function.

SQLITE_USE_ALLOCA
  If this option is enabled, then the alloca() memory allocator will be
  used in a few situations where it is appropriate.  This results in a slightly
  smaller and faster binary.  The SQLITE_USE_ALLOCA compile-time only
  works, of course, on systems that support alloca().

SQLITE_USE_FCNTL_TRACE
  This option causes SQLite to issue extra SQLITE_FCNTL_TRACE file controls
  to provide supplementary information to the VFS.  The "vfslog.c" extension
  makes use of this to provide enhanced logs of VFS activity.

SQLITE_HAVE_ZLIB
  This option causes some extensions to link against the 
  zlib compression library.
  
  This option has no effect on the SQLite core.  It is only used by extensions.
  This is option is necessary for the compression and decompression
  functions that are part of SQL Archive support in the
  command-line shell.
  
  When compiling with this option, it will normally
  be necessary to add a linker option to include the zlib library in the
  build.  Normal this option is "-lz" but might be different on different
  systems.
  
  When building with MSVC on Windows systems, one can put the zlib source
  code in the compat/zlib subdirectory of the source tree and then add
  the USE_ZLIB=1 option to the nmake command to cause the The Makefile.msc
  to automatically build and use an appropriate zlib library implementation.

YYTRACKMAXSTACKDEPTH
  This option causes the LALR(1) parser stack depth to be tracked
  and reported using the sqlite3_status(SQLITE_STATUS_PARSER_STACK,...)
  interface.  SQLite's LALR(1) parser has a fixed stack depth
  (determined at compile-time using the YYSTACKDEPTH options).
  This option can be used to help determine if an application is
  getting close to exceeding the maximum LALR(1) stack depth.



8.  Options To Disable Features Normally Turned On


SQLITE_DISABLE_LFS
  If this C-preprocessor macro is defined, large file support
  is disabled.

SQLITE_DISABLE_DIRSYNC
  If this C-preprocessor macro is defined, directory syncs
  are disabled.  SQLite typically attempts to sync the parent
  directory wÞhen a file is deleted to ensure the directory
  entries are updated immediately on disk.

SQLITE_DISABLE_FTS3_UNICODE
  If this C-preprocessor macro is defined, the unicode61 tokenizer
  in FTS3 is omitted from the build and is unavailable to 
  applications.

SQLITE_DISABLE_FTS4_DEFERRED
  If this C-preprocessor macro disables the "deferred token" optimization
  in FTS4.  The "deferred token" optimization avoids loading massive
  posting lists for terms that are in most documents of the collection
  and instead simply scans for those tokens in the document source.  FTS4
  should get exactly the same answer both with and without this optimization.

SQLITE_DISABLE_INTRINSIC
  This option disables the use of compiler-specific built-in functions
  such as __builtin_bswap32() and __builtin_add_overflow() in GCC and Clang, 
  or _byteswap_ulong() and _ReadWriteBarrier() with MSVC.  




9.  Options To Omit Features

The following options can be used to 
reduce the size of the compiled library
by omitting unused features. This is probably only useful
in embedded systems where space is especially tight, as even with all
features included the SQLite library is relatively small. Don't forget
to tell your compiler to optimize for binary size! (the -Os option if
using GCC).  Telling your compiler to optimize for size usually has
a much larger impact on library footprint than employing any of these
compile-time options.  You should also verify that 
debugging options are disabled.

The macros in this section do not require values. The following 
compilation switches all have the same effect:
-DSQLITE_OMIT_ALTERTABLE
-DSQLITE_OMIT_ALTERTABLE=1
-DSQLITE_OMIT_ALTERTABLE=0


If any of these options are defined, then the same set of SQLITE_OMIT_*
options must also be defined when using the Lemon parser generator
tool to generate the
parse.c file and when compiling the 'mkkeywordhash' tool which generates 
the keywordhash.h file.
Because of this, these options may only be used when the library is built
from canonical source, not from the amalgamation.
Some SQLITE_OMIT_* options might work, or appear to work, when used with
the amalgamation.  But this is not guaranteed.  In general, always compile
from canonical sources in order to take advantage of SQLITE_OMIT_* options.



Important Note: The SQLITE_OMIT_* options may not work with the
amalgamation.  SQLITE_OMIT_* compile-time
options usually work correctly only when SQLite is built from canonical 
source files.




Special versions of the SQLite amalgamation that do work with a
predetermined set of SQLITE_OMIT_* options can be generated.  To do so,
make a copy of the Makefile.linux-gcc makefile template in the canonical
source code distribution.  Change the name of your copy to simply "Makefile".
Then edit "Makefile" to set up appropriate compile-time options.  Then
type:
make clean; make sqlite3.c

The resulting "sqlite3.c" amalgamation code file (and its associated
header file "sqlite3.h") can then be moved to a non-unix platform
for final compilation using a native compiler.

The SQLITE_OMIT_* options are unsupported.  By this we mean that
an SQLITE_OMIT_* option that omits code from the build in the current
release might become a no-op in the next release.  Or the other way around:
an SQLITE_OMIT_* that is a no-op in the current release might cause code
to be excluded in the next release.  Also, not all SQLITE_OMIT_* options
are tested.  Some SQLITE_OMIT_* options might cause SQLite to malfunction
and/or provide incorrect answers.


Important Note:
The SQLITE_OMIT_* compile-time options are mostly unsupported.


The following are the available OMIT options:


SQLITE_OMIT_ALTERTABLE
  When this option is defined, the 
  ALTER TABLE command is not included in the 
  library. Executing an ALTER TABLE statement causes a parse error.

SQLITE_OMIT_ANALYZE
  When this option is defined, the ANALYZE command is omitted from
  the build.

SQLITE_OMIT_ATTACH
  When this option is defined, the ATTACH and DETACH commands are
  omitted from the build.

SQLITE_OMIT_AUTHORIZATION
  Defining thißs option omits the authorization callback feature from the
  library. The sqlite3_set_authorizer() API function is not present
  in the library.

SQLITE_OMIT_AUTOINCREMENT
  This option is omits the AUTOINCREMENT feature. 
  When this is macro is defined, columns declared as 
  "INTEGER PRIMARY KEY AUTOINCREMENT"
  behave in the same way as columns declared as "INTEGER PRIMARY KEY" when a 
  NULL is inserted. The sqlite_sequence system table is neither created, nor
  respected if it already exists.

SQLITE_OMIT_AUTOINIT
  For backwards compatibility with older versions of SQLite that lack
  the sqlite3_initialize() interface, the sqlite3_initialize() interface
  is called automatically upon entry to certain key interfaces such as
  sqlite3_open(), sqlite3_vfs_register(), and sqlite3_mprintf().
  The overhead of invoking sqlite3_initialize() automatically in this
  way may be omitted by building SQLite with the SQLITE_OMIT_AUTOINIT
  C-preprocessor macro.  When built using SQLITE_OMIT_AUTOINIT, SQLite
  will not automatically initialize itself and the application is required
  to invoke sqlite3_initialize() directly prior to beginning use of the
  SQLite library.

SQLITE_OMIT_AUTOMATIC_INDEX
  This option is used to omit the 
  automatic indexing functionality.
  See also: SQLITE_DEFAULT_AUTOMATIC_INDEX.

SQLITE_OMIT_AUTORESET
  By default, the sqlite3_step() interface will automatically invoke
  sqlite3_reset() to reset the prepared statement if necessary.  This
  compile-time option changes that behavior so that sqlite3_step() will
  return SQLITE_MISUSE if it called again after returning anything other
  than SQLITE_ROW, SQLITE_BUSY, or SQLITE_LOCKED unless there was an
  intervening call to sqlite3_reset().

  In SQLite version 3.6.23.1 (2010-03-26)
  and earlier, sqlite3_step() used to always
  return SQLITE_MISUSE if it was invoked again after returning anything
  other than SQLITE_ROW without an intervening call to sqlite3_reset().
  This caused problems on some poorly written smartphone applications which
  did not correctly handle the SQLITE_LOCKED and SQLITE_BUSY error 
  returns.  Rather than fix the many defective smartphone applications, 
  the behavior of SQLite was changed in 3.6.23.2 to automatically reset
  the prepared statement.  But that changed caused issues in other 
  improperly implemented applications that were actually looking
  for an SQLITE_MISUSE return to terminate their query loops.  (Anytime
  an application gets an SQLITE_MISUSE error code from SQLite, that means the
  application is misusing the SQLite interface and is thus incorrectly
  implemented.)  The SQLITE_OMIT_AUTORESET interface was added to SQLite
  version 3.7.5 (2011-02-01) in an effort to get all of the (broken)
  applications to work again without having to actually fix the applications.

SQLITE_OMIT_AUTOVACUUM
  If this option is defined, the library cannot create or write to 
  databases that support auto_vacuum.
  Executing a PRAGMA auto_vacuum statement is not an error
  (since unknown PRAGMAs are silently ignored), but does not return a value
  or modify the auto-vacuum flag in the database file. If a database that
  supports auto-vacuum is opened by a library compiled with this option, it
  is automatically opened in read-only mode.

SQLITE_OMIT_BETWEEN_OPTIMIZATION
  This option disables the use of indices with WHERE clause terms
  that employ the BETWEEN operator.

SQLITE_OMIT_BLOB_LITERAL
  When this option is defined, it is not possible to specify a blob in
  an SQL statement using the X'ABCD' syntax.

SQLITE_OMIT_BTREECOUNT
  This option is no longer used for anything.  It is a no-op.

SQLITE_OMIT_BUILTIN_TEST
  This compile-time option has been renamed to SQLITE_UNTESTABLE.

SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA
  This compile-time option disables the PRAGMA case_sensitive_like
  command.

SQLITE_OMIT_CAST
  This option causes SQLite to omit support for the CAST operator.

SQLITE_OMIT_CHECK
  This option causes SQLite to omit support for CHECK constraints.
  The parser will still accept CHECK constraints in àSQL statements,
  they will just not be enforced.

SQLITE_OMIT_COMPILEOPTION_DIAGS
  This option is used to omit the compile-time option diagnostics available
  in SQLite, including the sqlite3_compileoption_used() and
  sqlite3_compileoption_get() C/C++ functions, the
  sqlite_compileoption_used() and sqlite_compileoption_get() SQL functions,
  and the compile_options pragma.

SQLITE_OMIT_COMPLETE
  This option causes the sqlite3_complete() and sqlite3_complete16()
  interfaces to be omitted.

SQLITE_OMIT_COMPOUND_SELECT
  This option is used to omit the compound SELECT functionality. 
  SELECT statements that use the 
  UNION, UNION ALL, INTERSECT or EXCEPT compound SELECT operators will 
  cause a parse error.

  An INSERT statement with multiple values in the VALUES clause is
  implemented internally as a compound SELECT.  Hence, this option also
  disables the ability to insert more than a single row using an
  INSERT INTO ... VALUES ... statement.

SQLITE_OMIT_CTE
  This option causes support for common table expressions to be omitted.

SQLITE_OMIT_DATETIME_FUNCS
  If this option is defined, SQLite's built-in date and time manipulation
  functions are omitted. Specifically, the SQL functions julianday(), date(),
  time(), datetime() and strftime() are not available. The default column
  values CURRENT_TIME, CURRENT_DATE and CURRENT_TIMESTAMP are still available.

SQLITE_OMIT_DECLTYPE
  This option causes SQLite to omit support for the
  sqlite3_column_decltype() and sqlite3_column_decltype16()
  interfaces.

SQLITE_OMIT_DEPRECATED
  This option causes SQLite to omit support for interfaces
  marked as deprecated.  This includes 
  sqlite3_aggregate_count(),
  sqlite3_expired(),
  sqlite3_transfer_bindings(),
  sqlite3_global_recover(),
  sqlite3_thread_cleanup() and
  sqlite3_memory_alarm() interfaces and
  PRAGMA statements PRAGMA count_changes,
  PRAGMA data_store_directory,
  PRAGMA default_cache_size,
  PRAGMA empty_result_callbacks,
  PRAGMA full_column_names,
  PRAGMA short_column_names, and
  PRAGMA temp_store_directory.

SQLITE_OMIT_DESERIALIZE
  This option causes the
  sqlite3_serialize() and sqlite3_deserialize()
  interfaces to be omitted from the build.

SQLITE_OMIT_DISKIO
  This option omits all support for writing to the disk and forces
  databases to exist in memory only.  This option has not been 
  maintained and probably does not work with newer versions of SQLite.

SQLITE_OMIT_EXPLAIN
  Defining this option causes the EXPLAIN command to be omitted from the
  library. Attempting to execute an EXPLAIN statement will cause a parse
  error.

SQLITE_OMIT_FLAG_PRAGMAS
  This option omits support for a subset of PRAGMA commands that
  query and set boolean properties.

SQLITE_OMIT_FLOATING_POINT
  This option is used to omit floating-point number support from the SQLite
  library. When specified, specifying a floating point number as a literal 
  (i.e. "1.01") results in a parse error.

  In the future, this option may also disable other floating point 
  functionality, for example the sqlite3_result_double(), 
  sqlite3_bind_double(), sqlite3_value_double() and
  sqlite3_column_double() API functions.
  

SQLITE_OMIT_FOREIGN_KEY
  If this option is defined, then foreign key constraint syntax is
  not recognized.

SQLITE_OMIT_GENERATED_COLUMNS
  If this option is defined, then generated column syntax is
  not recognized.

SQLITE_OMIT_GET_TABLE
  This option causes support for sqlite3_get_table() and
  sqlite3_free_table() to be omitted.

SQLITE_OMIT_HEX_INTEGER
  This option omits support for hexadecimal integer literals.

SQLITE_OMIT_INCRBLOB
  This option causes support for incremental BLOB I/O
  to be omitted.

SQLITE_OMIT_INTEGRITY_CHECK
  This option omits support for the integrity_check pragma.

SQLITE_OMIT_INTROSPECTION_PRAGMAS
  This option omits support for
  PRAGMA function_list, PRAGMA module_list, and
  PRAGMA pragma_list.

SQLITE_OMIT_JSON
  This option omits the JSON SQL functions from the build.

SQLITE_OMIT_LIKE_OPTIMIZATION
  This option disables the ability of SQLite to use indicesá to help
  resolve LIKE and GLOB operators in a WHERE clause.

SQLITE_OMIT_LOAD_EXTENSION
  This option omits the entire extension loading mechanism from
  SQLite, including sqlite3_enable_load_extension() and
  sqlite3_load_extension() interfaces.

SQLITE_OMIT_LOCALTIME
  This option omits the "localtime" modifier from the date and time
  functions.  This option is sometimes useful when trying to compile
  the date and time functions on a platform that does not support the
  concept of local time.

SQLITE_OMIT_LOOKASIDE
  This option omits the lookaside memory allocator.

SQLITE_OMIT_MEMORYDB
  When this is defined, the library does not respect the special database
  name ":memory:" (normally used to create an in-memory database). If 
  ":memory:" is passed to sqlite3_open(), sqlite3_open16(), or
  sqlite3_open_v2(), a file with this name will be 
  opened or created.

SQLITE_OMIT_OR_OPTIMIZATION
  This option disables the ability of SQLite to use an index together
  with terms of a WHERE clause connected by the OR operator.

SQLITE_OMIT_PAGER_PRAGMAS
  Defining this option omits pragmas related to the pager subsystem from 
  the build.

SQLITE_OMIT_PRAGMA
  This option is used to omit the PRAGMA command
  from the library. Note that it is useful to define the macros that omit
  specific pragmas in addition to this, as they may also remove supporting code
  in other sub-systems. This macro removes the PRAGMA command only.

SQLITE_OMIT_PROGRESS_CALLBACK
  This option may be defined to omit the capability to issue "progress" 
  callbacks during long-running SQL statements. The 
  sqlite3_progress_handler()
  API function is not present in the library.

SQLITE_OMIT_QUICKBALANCE
  This option omits an alternative, faster B-Tree balancing routine.
  Using this option makes SQLite slightly smaller at the expense of
  making it run slightly slower.

SQLITE_OMIT_REINDEX
  When this option is defined, the REINDEX
  command is not included in the library.
  Executing a REINDEX statement causes 
  a parse error.

SQLITE_OMIT_SCHEMA_PRAGMAS
  Defining this option omits pragmas for querying the database schema from 
  the build.

SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
  Defining this option omits pragmas for querying and modifying the 
  database schema version and user version from the build. Specifically, the 
  schema_version and user_version PRAGMAs are omitted.

SQLITE_OMIT_SHARED_CACHE
  This option builds SQLite without support for shared cache mode.
  The sqlite3_enable_shared_cache() is omitted along with a fair
  amount of logic within the B-Tree subsystem associated with shared
  cache management.

  This compile-time option is recommended most applications as it
  results in improved performance and reduced library footprint.

SQLITE_OMIT_SUBQUERY
  If defined, support for sub-selects and the IN() operator are omitted.

SQLITE_OMIT_TCL_VARIABLE
  If this macro is defined, then the special "$" syntax
  used to automatically bind SQL variables to TCL variables is omitted.

SQLITE_OMIT_TEMPDB
  This option omits support for TEMP or TEMPORARY tables.

SQLITE_OMIT_TRACE
  This option omits support for the sqlite3_profile() and
  sqlite3_trace() interfaces and their associated logic.

SQLITE_OMIT_TRIGGER
  Defining this option omits support for TRIGGER objects. Neither the 
  CREATE TRIGGER or DROP TRIGGER
  commands are available in this case, and attempting to execute
  either will result in a parse error.
  This option also disables enforcement of foreign key constraints,
  since the code that implements triggers and which is omitted by this
  option is also used to implement foreign key actions.

SQLITE_OMIT_TRUNCATE_OPTIMIZATION
  A default build of SQLite, if a DELETE statement has no WHERE clause
  and operates on a table with no triggers, an optimization occurs that
  causes the DELETE to occur by dropping and recreating the table.  
  Dropping and recreating a table is usually much faster than deleting
  the table content row by row.  This is the "truncate optimization".

SQLITE_OMIT_UTF16
  This macro is used to omitâ support for UTF16 text encoding. When this is
  defined all API functions that return or accept UTF16 encoded text are
  unavailable. These functions can be identified by the fact that they end
  with '16', for example sqlite3_prepare16(), sqlite3_column_text16() and
  sqlite3_bind_text16().

SQLITE_OMIT_VACUUM
  When this option is defined, the VACUUM
  command is not included in the library.
  Executing a VACUUM statement causes 
  a parse error.

SQLITE_OMIT_VIEW
  Defining this option omits support for VIEW objects. Neither the 
  CREATE VIEW nor the DROP VIEW
  commands are available in this case, and
  attempting to execute either will result in a parse error.

  WARNING: If this macro is defined, it will not be possible to open a database
  for which the schema contains VIEW objects. 

SQLITE_OMIT_VIRTUALTABLE
  This option omits support for the Virtual Table
  mechanism in SQLite.

SQLITE_OMIT_WAL
  This option omits the "write-ahead log" (a.k.a. "WAL") capability.

SQLITE_OMIT_WINDOWFUNC
  This option omits window functions from the build.

SQLITE_OMIT_WSD
  This option builds a version of the SQLite library that contains no
  Writable Static Data (WSD).  WSD is global variables and/or static
  variables.  Some platforms do not support WSD, and this option is necessary
  in order for SQLite to work those platforms.  

  Unlike other OMIT options which make the SQLite library smaller,
  this option actually increases the size of SQLite and makes it run
  a little slower.  Only use this option if SQLite is being built for an
  embedded target that does not support WSD.

SQLITE_OMIT_XFER_OPT
  This option omits support for optimizations that help statements
  of the form "INSERT INTO ... SELECT ..." run faster.

SQLITE_UNTESTABLE
  A standard SQLite build includes a small amount of logic associated
  with sqlite3_test_control() to exercise
  parts of the SQLite core that are otherwise difficult to validate.
  This compile-time option omits that extra testing logic.  This
  compile-time option was called "SQLITE_OMIT_BUILTIN_TEST" prior
  to SQLite version 3.16.0 (2017-01-02).  The name was changed
  to better describe the implications of using it.
  
  Setting this compile-time option prevents SQLite from being fully
  testable.  Branch test coverage drops from 100% down to about 95%.
  
  SQLite developers follow the NASA principle of
  "fly what you test and test what you fly".  This principle is violated
  if this option is enabled for delivery but disabled for testing.
  But if this option is enabled during testing, not all branches are 
  reachable.  Therefore, the use of this compile-time option is discouraged.

SQLITE_ZERO_MALLOC
  This option omits both the default memory allocator and the
  debugging memory allocator from the build and substitutes a stub
  memory allocator that always fails.  SQLite will not run with this
  stub memory allocator since it will be unable to allocate memory.  But
  this stub can be replaced at start-time using
  sqlite3_config(SQLITE_CONFIG_MALLOC,...) or
  sqlite3_config(SQLITE_CONFIG_HEAP,...).
  So the net effect of this compile-time option is that it allows SQLite
  to be compiled and linked against a system library that does not support
  malloc(), free(), and/or realloc().


10.  Analysis and Debugging Options

SQLITE_DEBUG
  The SQLite source code contains literally thousands of assert() statements
  used to verify internal assumptions and subroutine preconditions and
  postconditions.  These assert() statements are normally turned off
  (they generate no code) since turning them on makes SQLite run approximately
  three times slower.  But for testing and analysis, it is useful to turn
  the assert() statements on.  The SQLITE_DEBUG compile-time option does this.
  SQLITE_DEBUG also enables some other debugging features, such as
  special PRAGMA statements that turn on tracing and listing features
  used for troubleshooting and analysis of the VDBE and code generator.

SQLITE_MEMDEBUG
  The SQLITE_MEMDEBUG option causes an instrumented 
  debugging memory allocator
  to be used as the default memory allocator within SQLite.  The
  instrumented memory allocator checks for misuse of dynamically allocated
  memory.  Examples of misuse include using memory after it is freed,
  writing off the ends of a memory allocation, freeing memory not previously
  obtained from the memory allocator, or failing to initialize newly
  allocated memory.


11.  Windows-Specific Options

SQLITE_WIN32_HEAP_CREATE
  This option forces the Win32 native memory allocator, when enabled, to
  create a private heap to hold all memory allocations.

SQLITE_WIN32_MALLOC_VALIDATE
  This option forces the Win32 native memory allocator, when enabled, to
  make strategic calls into the HeapValidate() function if assert() is also
  enabled.


12. Compiler Linkage and Calling Convention Control

The following macros specify interface details
for certain kinds of SQLite builds.  The Makefiles will normally
handle setting these macros automatically.  Application developers should
not need to worry with these macros.  The following documentation about these 
macros is included for completeness.


SQLITE_API
  This macro identifies an externally visible interface for SQLite.
  This macro is sometimes set to "extern".  But the definition is
  compiler-specific.

SQLITE_APICALL
  This macro identifies the calling convention used by public interface
  routines in SQLite which accept a fixed number of arguments.
  This macro is normally defined to be nothing,
  though on Windows builds it can sometimes be set to "__cdecl" or "__stdcall".
  The "__cdecl" setting is the default, but "__stdcall" is used when SQLite
  is intended to be compiled as a Windows system library.
  
  A single function declaration should contain no more than one of
  the following:  SQLITE_APICALL, SQLITE_CDECL, or SQLITE_SYSAPI.

SQLITE_CALLBACK
  This macro specifies the calling convention used with callback pointers
  in SQLite.  This macro is normally defined to be nothing, though on Windows
  builds it can sometimes be set to "__cdecl" or "__stdcall".  The
  "__cdecl" setting is the default, but "__stdcall" is used when SQLite
  is intended to be compiled as a Windows system library.

SQLITE_CDECL
  This macro specifies the calling convention used by varargs interface
  routines in SQLite.  This macro is normally defined to be nothing,
  though on Windows builds it can sometimes be set to "__cdecl".  This
  macro is used on varargs routines and so cannot be set to "__stdcall"
  since the __stdcall calling convention does not support varargs functions.
  
  A single function declaration should contain no more than one of
  the following:  SQLITE_APICALL, SQLITE_CDECL, or SQLITE_SYSAPI.

SQLITE_EXTERN
  This macro specifies linkage for public interface variables in SQLite.
  It should normally be allowed to default to "extern".

SQLITE_STDCALL
  This macro is no longer used and is now deprecated.

SQLITE_SYSAPI
  This macro identifies the calling convention used by operating system
  interfaces for the target platform for an SQLite build.
  This macro is normally defined to be nothing,
  though on Windows builds it can sometimes be set to "__stdcall".
  
  A single function declaration should contain no more than one of
  the following:  SQLITE_APICALL, SQLITE_CDECL, or SQLITE_SYSAPI.

SQLITE_TCLAPI
  This macro specifies the calling convention used by the 
  TCL library interface routines.
  This macro is not used by the SQLite core, but only by the TCL Interface
  and TCL test suite.
  This macro is normally defined to be nothing,
  though on Windows builds it can sometimes be set to "__cdecl".  This
  macro is used on TCL library interface routines which are always compiled
  as __cdecl, even on platforms that prefer to use __stdcall, so this
  macro should not be set to __stdcall unless the platform has a custom
  TCL library build that supports __stdcall.
  
  This macro may not be used in combination with any of SQLITE_APICALL,
  SQLITE_CALLBACK, SQLITE_CDECL or SQLITE_SYSAPI.

This page last modified on  2022-11-07 14:28:05 UTCcompile.html
™‹™Ã‚
Aƒ…#3Syntax Diagrams For SQLiteSyntax Diagrams For SQLite

aggregate-function-invocation:



References:&nbsp;&nbsp; expr&nbsp;&nbsp; filter-clause
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_expr.html#booleanexpr


alter-table-stmt:



Used by:&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; column-def
See also:&nbsp;&nbsp; lang_altertable.html


analyze-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_analyze.html


attach-stmt:



Used by:&nbsp;&nbspä…‚
5ŠŸq%Compile-time Options1. Overview


For most purposes, SQLite can be built just fine using the default
compilation options. However, if required, the compile-time options
documented below can be used to 
omit SQLite features (resulting in
a smaller compiled library size) or to change the
default values of some parameters.



Every effort has been made to ensure that the various combinations
of compilation options work harmoniously and produce a working library.
Nevertheless, it is strongly recommended that the SQLite test-suite
be executed to check for errors before using an SQLite library built
with non-standard compilation options.





2. Recommended Compile-time Options

The following compile-time options are recommended for applications that
are able to use them, in order to minimized the number of CPU cycles and
the bytes of memory used by SQLite.
Not all of these compile-time options are usable by every application.
For example, the SQLITE_THREADSAFE=0 option is only usable by applications
that never access SQLite from more than one thread at a time.  And the
SQLITE_OMIT_PROGRESS_CALLBACK option is only usable by applications that
do not use the sqlite3_progress_handler() interface.  And so forth.

It is impossible to test every possible combination of compile-time
options for SQLite.  But the following set of compile-time options is
one configuration that is always fully tested.


SQLITE_DQS=0.
This setting disables the double-quoted string literal misfeature.

SQLITE_THREADSAFE=0.
Setting -DSQLITE_THREADSAFE=0 causes all of the mutex and thread-safety logic
in SQLite to be omitted.  This is the single compile-time option causes SQLite
to run about 2% faster and also reduces the size of the library by about 2%.
But the downside is that using the compile-time option means that SQLite can never
be used by more than a single thread at a time, even if each thread has its own
database connection.

SQLITE_DEFAULT_MEMSTATUS=0.
This setting causes the sqlite3_status() interfaces that track memory usage
to be disabled.  This helps the sqlite3_malloc() routines run much faster,
and since SQLite uses sqlite3_malloÏå; sql-stmt
References:&nbsp;&nbsp; expr
See also:&nbsp;&nbsp; lang_attach.html


begin-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_transaction.html


column-constraint:



Used by:&nbsp;&nbsp; column-def
References:&nbsp;&nbsp; conflict-clause&nbsp;&nbsp; expr&nbsp;&nbsp; foreign-key-clause&nbsp;&nbsp; literal-value&nbsp;&nbsp; signed-number
See also:&nbsp;&nbsp; gencol.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtable.html#tablecoldef


column-def:



Used by:&nbsp;&nbsp; alter-table-stmt&nbsp;&nbsp; create-table-stmt
References:&nbsp;&nbsp; column-constraint&nbsp;&nbsp; type-name
See also:&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_altertable.html#altertabaddcol&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtable.html#tablecoldef


column-name-list:



Used by:&nbsp;&nbsp; update-stmt&nbsp;&nbsp; update-stmt-limited&nbsp;&nbsp; upsert-clause
See also:&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html


comment-syntax:



See also:&nbsp;&nbsp; lang_comment.html


commit-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_transaction.html


common-table-expression:



Used by:&nbsp;&nbsp; compound-select-stmt&nbsp;&nbsp; delete-stmt&nbsp;&nbsp; delete-stmt-limited&nbsp;&nbsp; factored-select-stmt&nbsp;&nbsp; insert-stmt&nbsp;&nbsp; select-stmt&nbsp;&nbsp; simple-select-stmt&nbsp;&nbsp; update-stmt&nbsp;&nbsp; update-stmt-limited
References:&nbsp;&nbsp; select-stmt
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


compound-operator:



Used by:&nbsp;&nbsp; factored-select-stmt&nbsp;&nbsp; select-stmt
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


compound-select-stmt:



References:&nbsp;&nbsp; common-table-expression&nbsp;&nbsp; expr&nbsp;&nbsp; ordering-term&nbsp;&nbsp; select-core
See also:&nbsp;&nbsp; lang_select.html#compound


conflict-clause:



Used by:&nbsp;&nbsp; column-constraint&nbsp;&nbsp; table-constraint
See also:&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_conflict.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtable.html#notnullconst


create-index-stmt:



Used by:&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; expr&nbsp;&nbsp; indexed-column
See also:&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; partialindex.html


create-table-stmt:



Used by:&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; column-def&nbsp;&nbsp; select-stmt&nbsp;&nbsp; table-constraint&nbsp;&nbsp; table-options
See also:&nbsp;&nbsp; lang_createtable.html


create-trigger-stmt:



Used by:&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; delete-stmt&nbsp;&nbsp; expr&nbsp;&nbsp; insert-stmt&nbsp;&nbsp; select-stmt&nbsp;&nbsp; update-stmt
See also:&nbsp;&nbsp; lang_createtrigger.html


create-view-stmt:



Used by:&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; select-stmt
See also:&nbsp;&nbsp; lang_createview.html


create-virtual-table-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lanæg_createvtab.html


cte-table-name:



Used by:&nbsp;&nbsp; recursive-cte&nbsp;&nbsp; with-clause
See also:&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; lang_with.html#recursivecte


delete-stmt:



Used by:&nbsp;&nbsp; create-trigger-stmt&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; common-table-expression&nbsp;&nbsp; expr&nbsp;&nbsp; qualified-table-name&nbsp;&nbsp; returning-clause
See also:&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_delete.html


delete-stmt-limited:



Used by:&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; common-table-expression&nbsp;&nbsp; expr&nbsp;&nbsp; ordering-term&nbsp;&nbsp; qualified-table-name&nbsp;&nbsp; returning-clause
See also:&nbsp;&nbsp; lang_delete.html


detach-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_detach.html


drop-index-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_dropindex.html


drop-table-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_droptable.html


drop-trigger-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_droptrigger.html


drop-view-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_dropview.html


expr:



Used by:&nbsp;&nbsp; aggregate-function-invocation&nbsp;&nbsp; attach-stmt&nbsp;&nbsp; column-constraint&nbsp;&nbsp; compound-select-stmt&nbsp;&nbsp; create-index-stmt&nbsp;&nbsp; create-trigger-stmt&nbsp;&nbsp; delete-stmt&nbsp;&nbsp; delete-stmt-limited&nbsp;&nbsp; factored-select-stmt&nbsp;&nbsp; filter-clause&nbsp;&nbsp; frame-spec&nbsp;&nbsp; indexed-column&nbsp;&nbsp; insert-stmt&nbsp;&nbsp; join-constraint&nbsp;&nbsp; ordering-term&nbsp;&nbsp; over-clause&nbsp;&nbsp; result-column&nbsp;&nbsp; returning-clause&nbsp;&nbsp; select-core&nbsp;&nbsp; select-stmt&nbsp;&nbsp; simple-function-invocation&nbsp;&nbsp; simple-select-stmt&nbsp;&nbsp; table-constraint&nbsp;&nbsp; table-or-subquery&nbsp;&nbsp; update-stmt&nbsp;&nbsp; update-stmt-limited&nbsp;&nbsp; upsert-clause&nbsp;&nbsp; window-defn&nbsp;&nbsp; window-function-invocation
References:&nbsp;&nbsp; filter-clause&nbsp;&nbsp; literal-value&nbsp;&nbsp; over-clause&nbsp;&nbsp; raise-function&nbsp;&nbsp; select-stmt&nbsp;&nbsp; type-name
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


factored-select-stmt:



References:&nbsp;&nbsp; common-table-expression&nbsp;&nbsp; compound-operator&nbsp;&nbsp; expr&nbsp;&nbsp; ordering-term&nbsp;&nbsp; select-core
See also:&nbsp;&nbsp; lang_select.html


filter-clause:



Used by:&nbsp;&nbsp; aggregate-function-invocation&nbsp;&nbsp; expr&nbsp;&nbsp; window-function-invocation
References:&nbsp;&nbsp; expr
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


foreign-key-clause:



Used by:&nbsp;&nbsp; column-constraint&nbsp;&nbsp; table-constraint
See also:&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_altertable.html#altertabaddcol&nbsp;&nbsp; lang_createtable.html


frame-spec:



Used by:&nbsp;&nbsp; over-clause&nbsp;&nbsp; window-defn
References:&nbsp;&nbsp; expr
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_açltertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


indexed-column:



Used by:&nbsp;&nbsp; create-index-stmt&nbsp;&nbsp; table-constraint&nbsp;&nbsp; upsert-clause
References:&nbsp;&nbsp; expr
See also:&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtable.html#primkeyconst&nbsp;&nbsp; lang_createtable.html#uniqueconst&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; partialindex.html


insert-stmt:



Used by:&nbsp;&nbsp; create-trigger-stmt&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; common-table-expression&nbsp;&nbsp; expr&nbsp;&nbsp; returning-clause&nbsp;&nbsp; select-stmt&nbsp;&nbsp; upsert-clause
See also:&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_insert.html


join-clause:



Used by:&nbsp;&nbsp; select-core&nbsp;&nbsp; select-stmt&nbsp;&nbsp; table-or-subquery&nbsp;&nbsp; update-stmt&nbsp;&nbsp; update-stmt-limited
References:&nbsp;&nbsp; join-constraint&nbsp;&nbsp; join-operator&nbsp;&nbsp; table-or-subquery
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


join-constraint:



Used by:&nbsp;&nbsp; join-clause
References:&nbsp;&nbsp; expr
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#fromclause&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


join-operator:



Used by:&nbsp;&nbsp; join-clause
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#fromclause&nbsp;&nbsp; lang_select.html#nonstd&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


literal-value:



Used by:&nbsp;&nbsp; column-constraint&nbsp;&nbsp; expr
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; èlang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


numeric-literal:



See also:&nbsp;&nbsp; lang_expr.html#litvalue


ordering-term:



Used by:&nbsp;&nbsp; compound-select-stmt&nbsp;&nbsp; delete-stmt-limited&nbsp;&nbsp; factored-select-stmt&nbsp;&nbsp; over-clause&nbsp;&nbsp; select-stmt&nbsp;&nbsp; simple-select-stmt&nbsp;&nbsp; update-stmt-limited&nbsp;&nbsp; window-defn
References:&nbsp;&nbsp; expr
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


over-clause:



Used by:&nbsp;&nbsp; expr
References:&nbsp;&nbsp; expr&nbsp;&nbsp; frame-spec&nbsp;&nbsp; ordering-term
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


pragma-stmt:



Used by:&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; pragma-value
See also:&nbsp;&nbsp; pragma.html#syntax


pragma-value:



Used by:&nbsp;&nbsp; pragma-stmt
References:&nbsp;&nbsp; signed-number
See also:&nbsp;&nbsp; pragma.html#syntax


qualified-table-name:



Used by:&nbsp;&nbsp; delete-stmt&nbsp;&nbsp; delete-stmt-limited&nbsp;&nbsp; update-stmt&nbsp;&nbsp; update-stmt-limited
See also:&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_indexedby.html&nbsp;&nbsp; lang_update.html


raise-function:



Used by:&nbsp;&nbsp; expr
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createtrigger.html#raise&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


recursive-cte:



References:&nbsp;&nbsp; cte-table-name
See also:&nbsp;&nbsp; lang_with.html#recursivecte


reindex-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_reindex.html


release-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_savepoint.html


result-column:



Used by:&nbsp;&nbsp; select-core&nbsp;&nbsp; select-stmt
References:&nbsp;&nbsp; expr
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


returning-clause:



Used by:&nbsp;&nbsp; delete-stmt&nbsp;&nbsp; delete-stmt-limited&nbsp;&nbsp; insert-stmt&nbsp;&nbsp; update-stmt&nbsp;&nbsp; update-stmt-limited
References:&nbsp;&nbsp; éexpr
See also:&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_update.html


rollback-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_savepoint.html&nbsp;&nbsp; lang_transaction.html


savepoint-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_savepoint.html


select-core:



Used by:&nbsp;&nbsp; compound-select-stmt&nbsp;&nbsp; factored-select-stmt&nbsp;&nbsp; simple-select-stmt
References:&nbsp;&nbsp; expr&nbsp;&nbsp; join-clause&nbsp;&nbsp; result-column&nbsp;&nbsp; table-or-subquery&nbsp;&nbsp; window-defn
See also:&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect


select-stmt:



Used by:&nbsp;&nbsp; common-table-expression&nbsp;&nbsp; create-table-stmt&nbsp;&nbsp; create-trigger-stmt&nbsp;&nbsp; create-view-stmt&nbsp;&nbsp; expr&nbsp;&nbsp; insert-stmt&nbsp;&nbsp; sql-stmt&nbsp;&nbsp; table-or-subquery&nbsp;&nbsp; with-clause
References:&nbsp;&nbsp; common-table-expression&nbsp;&nbsp; compound-operator&nbsp;&nbsp; expr&nbsp;&nbsp; join-clause&nbsp;&nbsp; ordering-term&nbsp;&nbsp; result-column&nbsp;&nbsp; table-or-subquery&nbsp;&nbsp; window-defn
See also:&nbsp;&nbsp; changes.html#version_3_35_3&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; lang_with.html#recursivecte&nbsp;&nbsp; partialindex.html&nbsp;&nbsp; releaselog/3_35_3.html&nbsp;&nbsp; releaselog/3_35_4.html&nbsp;&nbsp; releaselog/3_35_5.html


signed-number:



Used by:&nbsp;&nbsp; column-constraint&nbsp;&nbsp; pragma-value&nbsp;&nbsp; type-name
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html&nbsp;&nbsp; pragma.html#syntax


simple-function-invocation:



References:&nbsp;&nbsp; expr
See also:&nbsp;&nbsp; lang_expr.html#booleanexpr


simple-select-stmt:



References:&nbsp;&nbsp; common-table-expression&nbsp;&nbsp; expr&nbsp;&nbsp; ordering-term&nbsp;&nbsp; select-core
See also:&nbsp;&nbsp; lang_select.html#simpleselect


sql-stmt:



Used by:&nbsp;&nbsp; sql-stmt-list
References:&nbsp;&nbsp; alter-table-stmt&nbsp;&nbsp; analyze-stmt&nbsp;&nbsp; attach-stmt&nbsp;&nbsp; begin-stmt&nbsp;&nbsp; commit-stmt&nbsp;&nbsp; create-index-stmt&nbsp;&nbsp; create-table-stmt&nbsp;&nbsp; create-trigger-stmt&nbsp;&nbsp; create-view-stmt&nbsp;&nbsp; create-virtual-table-stmt&nbsp;&nbsp; delete-stmt&nbsp;&nbsp; delete-stmt-limited&nbsp;&nbsp; detach-stmt&nbsp;&nbsp; drop-index-stmt&nbsp;&nbsp; drop-table-stmt&nbsp;&nbsp; drop-trigger-stmt&nbsp;&nbsp; drop-view-stmt&nbsp;&nbsp; insert-stmt&nbsp;&nbsp; pragma-stmt&nbsp;&nbsp; reindex-stmt&nbsp;&nbsp; release-stmt&nbsp;&nbsp; rollback-stmt&nbsp;&nbsp; savepoint-stmt&nbsp;&nbsp; select-stmt&nbsp;&nbsp; update-stmt&nbsp;&nbsp; update-stmt-limited&nbsp;&nbsp; vacuum-stmt
See also:&nbsp;&nbsp; lang.html&nbsp;&nbsp; lang_explain.html


sql-stmt-list:



References:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang.html


table-constraint:



Used by:&nbsp;&nbsp; create-table-stmt
References:&nbsp;&nbsp; conflict-clause&nbsp;&nbsp; expr&nbsp;&nbsp; foreign-key-clause&nbsp;&nbsp; indexed-column
See also:&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtable.html#primkeyconst&nbsp;&nbsp; lang_createtable.html#tablecoldef&nbsp;&nbsp; lang_createtable.html#uniqueconst


table-options:



Used by:&nbsp;&nbsp; create-table-stmt
See also:&nbsp;&nbsp; lang_createtable.html


table-or-subquery:



Used by:&nbsp;&nbsp; join-clause&nbsp;&nbsp; select-core&nbsp;&nbsp; select-stmt&nbsp;&nbsp; update-stmt&nbsp;&nbsp; update-stmt-limited
References:&nbsp;&nbsp; expr&nbsp;&nbsp; join-clause&nbsp;&nbsp; select-stmt
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


type-name:



Used by:&nbsp;&nbsp; column-def&nbsp;&nbsp; expr
References:&nbsp;&nbsp; signed-number
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


update-stmt:



Used by:&nbsp;&nbsp; create-trigger-stmt&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; column-name-list&nbsp;&nbsp; common-table-expression&nbsp;&nbsp; expr&nbsp;&nbsp; join-clause&nbsp;&nbsp; qualified-table-name&nbsp;&nbsp; returning-clause&nbsp;&nbsp; table-or-subquery
See also:&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_update.html


update-stmt-limited:



Used by:&nbsp;&nbsp; sql-stmt
References:&nbsp;&nbsp; column-name-list&nbsp;&nbsp; common-table-expression&nbsp;&nbsp; expr&nbsp;&nbsp; join-clause&nbsp;&nbsp; ordering-term&nbsp;&nbsp; qualified-table-name&nbsp;&nbsp; returning-clause&nbsp;&nbsp; table-or-subquery
See also:&nbsp;&nbsp; lang_update.html#upfrom


upsert-clause:



Used by:&nbsp;&nbsp; insert-stmt
References:&nbsp;&nbsp; column-name-list&nbsp;&nbsp; expr&nbsp;&nbsp; indexed-column
See also:&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_upsert.html


vacuum-stmt:



Used by:&nbsp;&nbsp; sql-stmt
See also:&nbsp;&nbsp; lang_vacuum.html


window-defn:



Used by:&nbsp;&nbsp; select-core&nbsp;&nbsp; select-stmt&nbsp;&nbsp; window-function-invocation
References:&nbsp;&nbsp; expr&nbsp;&nbsp; frame-spec&nbsp;&nbsp; ordering-term
See also:&nbsp;&nbsp; lang_aggfunc.html&nbsp;&nbsp; lang_altertable.html&nbsp;&nbsp; lang_attach.html&nbsp;&nbsp; lang_createindex.html&nbsp;&nbsp; lang_createtable.html&nbsp;&nbsp; lang_createtrigger.html&nbsp;&nbsp; lang_createview.html&nbsp;&nbsp; lang_delete.html&nbsp;&nbsp; lang_expr.html&nbsp;&nbsp; lang_insert.html&nbsp;&nbsp; lang_returning.html&nbsp;&nbsp; lang_select.html&nbsp;&nbsp; lang_select.html#compound&nbsp;&nbsp; lang_select.html#simpleselect&nbsp;&nbsp; lang_update.html&nbsp;&nbsp; lang_upsert.html&nbsp;&nbsp; lang_with.html&nbsp;&nbsp; partialindex.html


window-function-invocation:



References:&nbsp;&nbsp; expr&nbsp;&nbsp; filter-clause&nbsp;&nbsp; window-defn
See also:&nbsp;&nbsp; lang_expr.html#booleanexpr


with-clause:



References:&nbsp;&nbsp; cte-table-name&nbsp;&nbsp; select-stmt
See also:&nbsp;&nbsp; lang_with.html


This page last modified on  2020-10-01 18:23:33 UTCsyntaxdiagrams.htmlëthe performance of SQLite under a typical workload.  
The "mptester.c" program is a stress test for multiple processes 
concurrently reading and writing a single database.
The "threadtest3.c" program is a stress test for multiple threads using
SQLite simultaneously.  
The "fuzzershell.c" program is used to
run some fuzz tests.



All of the tests above must run successfully, on multiple platforms
and under multiple compile-time configurations,
before each release of SQLite.

Prior to each check-in to the SQLite source tree, developers
typically run a subset (called "veryquick") of the Tcl tests
consisting of about 
300.2 thousand test cases.
The veryquick tests include most tests other than the anomaly, fuzz, and 
soak tests.  The idea behind the veryquick tests are that they are
sufficient to catch most errors, but also run in only a few minutes
instead of a few hours.



3. Anomaly Testing

Anomaly tests are tests designed to verify the correct behavior
of SQLite when something goes wrong.  It is (relatively) easy to build
an SQL database engine that behaves correctly on well-formed inputs
on a fully functional computer.  It is more difficult to build a system
that responds sanely to invalid inputs and continues to function following
system malfunctions.  The anomaly tests are designed to verify the latter
behavior.



3.1. Out-Of-Memory Testing

SQLite, like all SQL database engines, makes extensive use of
malloc()  (See the separate report on
dynamic memory allocation in SQLite for
additional detail.)
On servers and workstations, malloc() never fails in practice and so correct
handling of out-of-memory (OOM) errors is not particularly important.
But on embedded devices, OOM errors are frighteningly common and since
SQLite is frequently used on embedded devices, it is important that
SQLite be able to gracefully handle OOM errors.

OOM testing is accomplished by simulating OOM errors.
SQLite allows an application to substitute an alternative malloc()
implementation using the sqlite3_config(SQLITE_CONFIG_MALLOC,...)
interface.  The TCL and TH3 test harnesses are both capable of
inserting a modified version of malloc() that can be rigged to fail 
after a certain number of allocations.  These instrumented mallocs
can be set to fail only once and then start working again, or to
continue failing after the first failure.  OOM tests are done in a
loop.  On the first iteration of the loop, the instrumented malloc
is rigged to fail on the first allocation.  Then some SQLite operation
is carried out and checks are done to make sure SQLite handled the
OOM error correctly.  Then the time-to-failure counter
on the instrumented malloc is increased by one and the test is
repeated.  The loop continues until the entire operation runs to
completion without ever encountering a simulated OOM failure.
Tests like this are run twice, once with the instrumented malloc
set to fail only once, and again with the instrumented malloc set
to fail continuously after the first failure.



3.2. I/O Error Testing

I/O error testing seeks to verify that SQLite responds sanely
to failed I/O operations.  I/O errors might result from a full disk drive,
malfunctioning disk hardware, network outages when using a network
file system, system configuration or permission changes that occur in the 
middle of an SQL operation, or other hardware or operating system 
malfunctions.  Whatever the cause, it is important that SQLite be able
to respond correctly to these errors and I/O error testing seeks to
verify that it does.

I/O error testing is similar in concept to OOM testing; I/O errors
are simulated and checks are made to verify that SQLite responds
correctly to the simulated errors.  I/O errors are simulated in both
the TCL and TH3 test harnesses by inserting a new
Virtual File System object that is specially rigged
to simulate an I/O error after a set number of I/O operations.
As with OOM error testing, the I/O error simulators can be set to
fail just once, or to fail continuously after the first failure.
Tests are run in a loop, slowly increasing the poiìnt of failure until
the test case runs to completion without error.  The loop is run twice,
once with the I/O error simulator set to simulate only a single failure
and a second time with it set to fail all I/O operations after the first
failure.

In I/O error tests, after the I/O error simulation failure mechanism
is disabled, the database is examined using
PRAGMA integrity_check to make sure that the I/O error has not
introduced database corruption.



3.3. Crash Testing

Crash testing seeks to demonstrate that an SQLite database will not
go corrupt if the application or operating system crashes or if there
is a power failure in the middle of a database update.  A separate
white-paper titled
Atomic Commit in SQLite describes the
defensive measure SQLite takes to prevent database corruption following
a crash.  Crash tests strive to verify that those defensive measures
are working correctly.

It is impractical to do crash testing using real power failures, of
course, and so crash testing is done in simulation.  An alternative
Virtual File System is inserted that allows the test
harness to simulate the state of the database file following a crash.

In the TCL test harness, the crash simulation is done in a separate
process.  The main testing process spawns a child process which runs
some SQLite operation and randomly crashes somewhere in the middle of
a write operation.  A special VFS randomly reorders and corrupts
the unsynchronized
write operations to simulate the effect of buffered filesystems.  After
the child dies, the original test process opens and reads the test
database and verifies that the changes attempted by the child either
completed successfully or else were completely rolled back.  The
integrity_check PRAGMA is used to make sure no database corruption
occurs.

The TH3 test harness needs to run on embedded systems that do not
necessarily have the ability to spawn child processes, so it uses
an in-memory VFS to simulate crashes.  The in-memory VFS can be rigged
to make a snapshot of the entire filesystem after a set number of I/O
operations.  Crash tests run in a loop.  On each iteration of the loop,
the point at which a snapshot is made is advanced until the SQLite
operations being tested run to completion without ever hitting a
snapshot.  Within the loop, after the SQLite operation under test has
completed, the filesystem is reverted to the snapshot and random file
damage is introduced that is characteristic of the kinds of damage
one expects to see following a power loss.  Then the database is opened
and checks are made to ensure that it is well-formed and that the
transaction either ran to completion or was completely rolled back.
The interior of the loop is repeated multiple times for each
snapshot with different random damage each time.



3.4. Compound failure tests

The test suites for SQLite also explore the result of stacking
multiple failures.  For example, tests are run to ensure correct behavior
when an I/O error or OOM fault occurs while trying to recover from a
prior crash.



4. Fuzz Testing

Fuzz testing
seeks to establish that SQLite responds correctly to invalid, out-of-range,
or malformed inputs.

4.1. SQL Fuzz

SQL fuzz testing consists of creating syntactically correct yet
wildly nonsensical SQL statements and feeding them to SQLite to see
what it will do with them.  Usually some kind of error is returned
(such as "no such table").  Sometimes, purely by chance, the SQL
statement also happens to be semantically correct.  In that case, the
resulting prepared statement is run to make sure it gives a reasonable
result.



4.1.1. SQL Fuzz Using The American Fuzzy Lop Fuzzer

The concept of fuzz testing has been around for decades, but fuzz
testing was not an effective way to find bugs until 2014 when
Michal Zalewski invented the first practical profile-guided fuzzer,
American Fuzzy Lop or "AFL".
Unlike prior fuzzers that blindly generate random inputs, AFL
instruments the program being tested (by modifying the assembly-language
output from the C compiler) and uses that instrumentation to ídetect when
an input causes the program to do something different - to follow
a new control path or loop a different number of times.  Inputs that provoke
new behavior are retained and further mutated.  In this way, AFL is able
to "discover" new behaviors of the program under test, including behaviors
that were never envisioned by the designers.

AFL proved adept at finding arcane bugs in SQLite.
Most of the findings have been assert() statements where the conditional
was false under obscure circumstances.  But AFL has also found
a fair number of crash bugs in SQLite, and even a few cases where SQLite 
computed incorrect results.

Because of its past success, AFL became a standard part of the testing
strategy for SQLite beginning with version 3.8.10 (2015-05-07) until
it was superseded by better fuzzers in version 3.29.0 (2019-07-10).



4.1.2. Google OSS Fuzz

Beginning in 2016, a team of engineers at Google started the
OSS Fuzz project.  
OSS Fuzz uses a AFL-style guided fuzzer running on Google's infrastructure.
The Fuzzer automatically downloads the latest check-ins for participating
projects, fuzzes them, and sends email to the developers reporting any
problems.  When a fix is checked in, the fuzzer automatically detects this
and emails a confirmation to the developers.

SQLite is one of many open-source projects that OSS Fuzz tests. The
test/ossfuzz.c source file
in the SQLite repository is SQLite's interface to OSS fuzz.

OSS Fuzz no longer finds historical bugs in SQLite.  But it is still
running and does occasionally find issues in new development check-ins.
Examples:
&#91;1&#93;
&#91;2&#93;
&#91;3&#93;.



4.1.3. The dbsqlfuzz fuzzer

Beginning in late 2018, SQLite has been fuzzed using a proprietary
fuzzer called "dbsqlfuzz".  Dbsqlfuzz is built using the 
libFuzzer framework of LLVM.

The dbsqlfuzz fuzzer mutates both the SQL input and the database file
at the same time.  Dbsqlfuzz uses a custom
Structure-Aware Mutator
on a specialized input file that defines both an input database and SQL
text to be run against that database. Because it mutates both the input
database and the input SQL at the same time, dbsqlfuzz has been able to
find some obscure faults in SQLite that were missed by prior fuzzers that
mutated only SQL inputs or only the database file.
The SQLite developers keep dbsqlfuzz running against trunk in about
16 cores at all times.  Each instance of dbsqlfuzz program is able to 
evalutes about 400 test cases per second, meaning that about 500 million
cases are checked every day.

The dbsqlfuzz fuzzer has been very successful at hardening the
SQLite code base against malicious attack.  Since dbsqlfuzz has been
added to the SQLite internal test suite, bug reports from external
fuzzers such as OSSFuzz have all but stopped.

Note that dbsqlfuzz is not the Protobuf-based structure-aware
fuzzer for SQLite that is used by Chromium and described in the
Structure-Aware Mutator article.
There is no connection between these two fuzzers, other than the fact that they
are both based on libFuzzer
The Protobuf fuzzer for SQLite is written and maintained by the Chromium
team at Google, whereas dbsqlfuzz is written and maintained by the original
SQLite developers.  Having multiple independently-developed fuzzers for SQLite
is good, as it means that obscure issues are more likely to be uncovered.



4.1.4. Other third-party fuzzers

SQLite seems to be a popular target for third-parties to fuzz.
The developers hear about many attempts to fuzz SQLite
and they do occasionally get bug reports found by independent
fuzzers.  All such reports are promptly fixed, so the product is
improved and that the entire SQLite user community benefits.
This mechanism of having many independent testers is similar to
Linus's law:
"given enough eyeballs, all bugs are shallow".

One fuzzing researcher of particular note is 
Manuel Rigger, currently
(as this paragraph is written on 2019-12-21)
at ETH Zurich.
Most fuzzers only look for assertion faults, crashes, undefined behavior (UB),
or other easily detected anomalies.  Dr. Rigger's fîuzzers, on the other hand,
are able to find cases where SQLite computes an incorrect answer.
Rigger has found
many such cases.
Most of these finds are obscure corner cases involving type
conversions and affinity transformations, and a good number of the finds
are against unreleased features.  Nevertheless, his finds are still important
as they are real bugs,
and the SQLite developers are grateful to be able to identify and fix
the underlying problems.  Rigger's work is currently unpublished.  When it
is released, it could be as influential as Zalewski's invention of AFL
and profile-guided fuzzing.



4.1.5. The fuzzcheck test harness

Historical test cases from AFL, OSS Fuzz, and dbsqlfuzz are
collected in a set of database files in the main SQLite source tree
and then rerun by the "fuzzcheck" utility program whenever one runs
"make test".  Fuzzcheck only runs a few thousand "interesting" cases
out of the billions of cases that the various fuzzers have
examined over the years.  "Interesting" cases are cases that exhibit
previously unseen behavior.  Actual bugs found by fuzzers are always
included among the interesting test cases, but most of the cases run
by fuzzcheck were never actual bugs. 



4.1.6. Tension Between Fuzz Testing And 100% MC/DC Testing

Fuzz testing and 100% MC/DC testing are in tension with
one another.
That is to say, code tested to 100% MC/DC will tend to be
more vulnerable to problems found by fuzzing and code that performs
well during fuzz testing will tend to have (much) less than 
100% MC/DC.
This is because MC/DC testing discourages defensive code with
unreachable branches, but without defensive code, a fuzzer is
more likely to find a path that causes problems.  MC/DC testing
seems to work well for building code that is robust during
normal use, whereas fuzz testing is good for building code that is
robust against malicious attack.

Of course, users would prefer code that is both robust in normal
use and resistant to malicious attack.  The SQLite developers are
dedicated to providing that.  The purpose of this section is merely
to point out that doing both at the same time is difficult.

For much of its history SQLite has been focused on 100% MC/DC testing.
Resistance to fuzzing attacks only became a concern with the introduction
of AFL in 2014.  For a while there, fuzzers were finding many problems
in SQLite.  In more recent years, the testing strategy of SQLite has
evolved to place more emphasis on fuzz testing.  We still maintain
100% MC/DC of the core SQLite code, but most testing CPU cycles are 
now devoted to fuzzing.

While fuzz testing and 100% MC/DC testing are in tension, they
are not completely at cross-purposes.  The fact that the SQlite test
suite does test to 100% MC/DC means that when fuzzers do find problems,
those problems can be fixed quickly and with little risk of introducing
new errors.

4.2. Malformed Database Files

There are numerous test cases that verify that SQLite is able to
deal with malformed database files.
These tests first build a well-formed database file, then add
corruption by changing one or more bytes in the file by some means
other than SQLite.  Then SQLite is used to read the database.
In some cases, the bytes changes are in the middle of data.
This causes the content of the database to change while keeping the
database well-formed.
In other cases, unused bytes of the file are modified, which has
no effect on the integrity of the database.
The interesting cases are when bytes of the file that
define database structure get changed.  The malformed database tests
verify that SQLite finds the file format errors and reports them
using the SQLITE_CORRUPT return code without overflowing
buffers, dereferencing NULL pointers, or performing other
unwholesome actions.

The dbsqlfuzz fuzzer also does an excellent job of verifying
that SQLite responds sanely to malformed database files.

4.3. Boundary Value Tests

SQLite defines certain limits on its operation, such as the
maximum number of columns in a table, the maximum length of an 
SQL statement, or the maximumï value of an integer.  The TCL and TH3 test
suites both contains numerous tests that push SQLite right to the edge
of its defined limits and verify that it performs correctly for
all allowed values.  Additional tests go beyond the defined limits
and verify that SQLite correctly returns errors.  The source code
contains testcase macros to verify that both sides of each boundary
have been tested.



5. Regression Testing

Whenever a bug is reported against SQLite, that bug is not considered
fixed until new test cases that would exhibit the bug have been added 
to either the TCL or TH3 test suites.
Over the years,
this has resulted in thousands and thousands of new tests.
These regression tests ensure that bugs that have
been fixed in the past are not reintroduced into future versions of
SQLite.



6. Automatic Resource Leak Detection

Resource leak occurs when system resources
are allocated and never freed.  The most troublesome resource leaks
in many applications are memory leaks - when memory is allocated using
malloc() but never released using free().  But other kinds of resources
can also be leaked:  file descriptors, threads, mutexes, etc.

Both the TCL and TH3 test harnesses automatically track system
resources and report resource leaks on every test run.
No special configuration or setup is required.   The test harnesses
are especially vigilant with regard to memory leaks.  If a change
causes a memory leak, the test harnesses will recognize this
quickly.  SQLite is designed to never leak memory, even after
an exception such as an OOM error or disk I/O error.  The test
harnesses are zealous to enforce this.



7. Test Coverage

The SQLite core, including the unix VFS,
has 100% branch test coverage under TH3 in
its default configuration as measured by
gcov.
Extensions such as FTS3 and RTree are excluded from this
analysis.



7.1. Statement versus branch coverage

There are many ways to measure test coverage.  The most popular
metric is "statement coverage".  When you hear someone say that their
program as "XX% test coverage" without further explanation, they usually
mean statement coverage.  Statement coverage measures what percentage
of lines of code are executed at least once by the test suite.

Branch coverage is more rigorous than statement coverage.  Branch
coverage measures the number of machine-code branch instructions that
are evaluated at least once on both directions.

To illustrate the difference between statement coverage and
branch coverage, consider the following hypothetical
line of C code:

if( a>b && c!=25 ){ d++; }


Such a line of C code might generate a dozen separate machine code
instructions.  If any one of those instructions is ever evaluated, then
we say that the statement has been tested.  So, for example, it might
be the case that the conditional expression is
always false and the "d" variable is
never incremented.  Even so, statement coverage counts this line of
code as having been tested.

Branch coverage is more strict.  With branch coverage, each test and
each subblock within the statement is considered separately.  In order
to achieve 100% branch coverage in the example above, there must be at
least three test cases:


 a&lt;=b
 a&gt;b && c==25
 a&gt;b && c!=25


Any one of the above test cases would provide 100% statement coverage
but all three are required for 100% branch coverage.  Generally speaking,
100% branch coverage implies 100% statement coverage, but the converse is
not true.  To reemphasize, the
TH3 test harness for SQLite provides the stronger form of
test coverage - 100% branch test coverage.



7.2. Coverage testing of defensive code

A well-written C program will typically contain some defensive
conditionals which in practice are always true or always false.
This leads to a 
programming dilemma:  Does one remove defensive code in order to obtain
100% branch coverage?

In SQLite, the answer to the previous question is "no".
For testing purposes, the SQLite source code defines
macros called ALWAYS() and NEVER().   The ALWAYS() macro
surrounds conditions
which are expecðted to always evaluate as true and NEVER() surrounds
conditions that are always evaluated to false.  These macros serve as
comments to indicate that the conditions are defensive code.
In release builds, these macros are pass-throughs:

#define ALWAYS(X)  (X)
#define NEVER(X)   (X)


During most testing, however, these macros will throw an assertion
fault if their argument does not have the expected truth value.  This
alerts the developers quickly to incorrect design assumptions.

#define ALWAYS(X)  ((X)?1:assert(0),0)
#define NEVER(X)   ((X)?assert(0),1:0)


When measuring test coverage, these macros are defined to be constant
truth values so that they do not generate assembly language branch
instructions, and hence do not come into play when calculating the
branch coverage:

#define ALWAYS(X)  (1)
#define NEVER(X)   (0)


The test suite is designed to be run three times, once for each of
the ALWAYS() and NEVER() definitions shown above.  All three test runs
should yield exactly the same result.  There is a run-time test using
the sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, ...) interface that
can be used to verify that the macros are correctly set to the first
form (the pass-through form) for deployment.



7.3. Forcing coverage of boundary values and boolean vector tests

Another macro used in conjunction with test coverage measurement is
the testcase() macro.  The argument is a condition for which
we want test cases that evaluate to both true and false.
In non-coverage builds (that is to say, in release builds) the
testcase() macro is a no-op:

#define testcase(X)


But in a coverage measuring build, the testcase() macro
generates code that evaluates the conditional expression in its argument.  
Then during analysis, a check
is made to ensure tests exist that evaluate the conditional to both true
and false.  Testcase() macros are used, for example, to help verify
that boundary values are tested.  For example:

testcase( a==b );
testcase( a==b+1 );
if( a>b && c!=25 ){ d++; }


Testcase macros are also used when two or more cases of a switch
statement go to the same block of code, to make sure that the code was
reached for all cases:

switch( op ){
  case OP_Add:
  case OP_Subtract: {
    testcase( op==OP_Add );
    testcase( op==OP_Subtract );
    /* ... */
    break;
  }
  /* ... */
}


For bitmask tests, testcase() macros are used to verify that every
bit of the bitmask affects the outcome.  For example, in the following block
of code, the condition is true if the mask contains either of two bits
indicating either a MAIN_DB or a TEMP_DB is being opened.  
The testcase()
macros that precede the if statement verify that both cases are tested:

testcase( mask & SQLITE_OPEN_MAIN_DB );
testcase( mask & SQLITE_OPEN_TEMP_DB );
if( (mask & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB))!=0 ){ ... }


The SQLite source code contains 1143
uses of the testcase() macro.



7.4. Branch coverage versus MC/DC

Two methods of measuring test coverage were described above:
"statement" and "branch" coverage.  There are many other test coverage
metrics besides these two.  Another popular metric is "Modified
Condition/Decision Coverage" or MC/DC.  
Wikipedia
defines MC/DC as follows:


 Each decision tries every possible outcome.
 Each condition in a decision takes on every possible outcome.
 Each entry and exit point is invoked.
 Each condition in a decision is shown to independently
     affect the outcome of the decision.


In the C programming language 
where &amp;&amp; and ||
are "short-circuit" operators, MC/DC and branch coverage are very nearly
the same thing.  The primary difference is in boolean vector tests.
One can test for any of several bits in bit-vector and still obtain
100% branch test coverage even though the second element of MC/DC - the
requirement that each condition in a decision take on every possible outcome -
might not be satisfied.

SQLite uses testcase() macros as described in the previous
subsection to make sure that every condition in a bit-vector decision takes
on every possible outcome.  In this way, SQLiteñ also achieves 100% MC/DC
in addition to 100% branch coverage.

7.5. Measuring branch coverage

Branch coverage in SQLite is currently measured
using gcov with the "-b"
option.  First the test program is compiled using options
"-g -fprofile-arcs -ftest-coverage" and then the test program is run.
Then "gcov -b" is run to generate a coverage report.
The coverage report is verbose and inconvenient to read, 
so the gcov-generated report is processed using
some simple scripts to put it into a more human-friendly format.
This entire process is automated using scripts, of course.

Note that running SQLite with gcov is not a test of SQLite &mdash;
it is a test of the test suite.  The gcov run does not test SQLite because
the -fprofile-args and -ftest-coverage options cause the compiler to 
generate different code.  
The gcov run merely verifies that the test suite provides 100% branch test
coverage.  The gcov run is a test of the test - a meta-test.

After gcov has been run to verify 100% branch test coverage,
then the test program is recompiled using delivery compiler options
(without the special -fprofile-arcs and -ftest-coverage options)
and the test program is rerun.
This second run is the actual test of SQLite.

It is important to verify that the gcov test run 
and the second real test run both give the same output.  Any
differences in output indicate either the use of undefined or
indeterminate behavior in the SQLite code (and hence a bug), 
or a bug in the compiler.
Note that SQLite has, over the previous decade, encountered bugs
in each of GCC, Clang, and MSVC.  Compiler bugs, while rare, do happen,
which is why it is so important to test the code in an as-delivered
configuration.



7.6. Mutation testing

Using gcov (or similar) to show that every branch instruction is taken
at least once in both directions is good measure of test suite quality.
But even better is showing that every branch instruction makes
a difference in the output.  In other words, we want to show 
not only that every branch instruction both jumps and falls through but also
that every branch is doing useful work and that the test suite is able
to detect and verify that work.  When a branch is found that does not
make a difference in the output, that suggests that the code associated 
the branch can be removed (reducing the size of the library and perhaps
making it run faster) or that the test suite is inadequately testing the
feature that the branch implements.

SQLite strives to verify that every branch instruction makes a difference
using mutation testing.
A script
first compiles the SQLite source code into assembly language
(using, for example, the -S option to gcc).  Then the script steps through
the generated assembly language and, one by one, changes each branch 
instruction into either an unconditional jump or a no-op, compiles the 
result, and verifies that the test suite catches the mutation.


Unfortunately, SQLite contains many branch instructions that
help the code run faster without changing the output.
Such branches generate false-positives during mutation testing.
As an example, consider the following 
hash function
used to accelerate table-name lookup:

55  static unsigned int strHash(const char *z){
56    unsigned int h = 0;
57    unsigned char c;
58    while( (c = (unsigned char)*z++)!=0 ){     /*OPTIMIZATION-IF-TRUE*/
59      h = (h&lt;&lt;3) &#94; h &#94; sqlite3UpperToLower&#91;c&#93;;
60    }
61    return h;
62  }



If the branch instruction that implements the "c!=0" test on line 58
is changed into a no-op, then the while-loop will loop forever and the
test suite will fail with a time-out.  But if that branch is changed
into an unconditional jump, then the hash function will always return 0.
The problem is that 0 is a valid hash.  A hash function that always
returns 0 still works in the sense that SQLite still always gets the correct
answer.  The table-name hash table degenerates into a linked-list
and so the table-name lookups that occur while parsing SQL statements 
might be a little slower, but the end result will be thòe same.


To work around this problem, comments of the form
"/*OPTIMIZATION-IF-TRUE*/" and
"/*OPTIMIZATION-IF-FALSE*/" are inserted into the SQLite
source code to tell the mutation testing script to ignore some branch
instructions.



7.7. Experience with full test coverage

The developers of SQLite have found that full coverage testing is an
extremely effective method for locating and preventing bugs.
Because every single branch
instruction in SQLite core code is covered by test cases, the developers
can be confident that changes made in one part of the code
do not have unintended consequences in other parts of the code.
The many new features and performance improvements that have been
added to SQLite in recent years would not have been possible without
the availability of full-coverage testing.

Maintaining 100% MC/DC is laborious and time-consuming.
The level of effort needed to maintain full-coverage testing
is probably not cost effective for a typical application.
However, we think that full-coverage testing is justified for a
very widely deployed infrastructure library
like SQLite, and especially for a database library which by its very
nature "remembers" past mistakes.




8. Dynamic Analysis

Dynamic analysis refers to internal and external checks on the
SQLite code which are performed while the code is live and running.
Dynamic analysis has proven to be a great help in maintaining the
quality of SQLite.



8.1. Assert

The SQLite core contains 6548 assert()
statements that verify function preconditions and postconditions and
loop invariants.  Assert() is a macro which is a standard part of
ANSI-C.  The argument is a boolean value that is assumed to always be
true.  If the assertion is false, the program prints an error message
and halts.

Assert() macros are disabled by compiling with the NDEBUG macro defined.
In most systems, asserts are enabled by default.  But in SQLite, the
asserts are so numerous and are in such performance critical places, that
the database engine runs about three times slower when asserts are enabled.
Hence, the default (production) build of SQLite disables asserts.  
Assert statements are only enabled when SQLite is compiled with the
SQLITE_DEBUG preprocessor macro defined.

See the Use Of assert in SQLite document
for additional information about how SQLite uses assert().



8.2. Valgrind

Valgrind is perhaps the most amazing
and useful developer tool in the world.  Valgrind is a simulator - it simulates
an x86 running a Linux binary.  (Ports of Valgrind for platforms other
than Linux are in development, but as of this writing, Valgrind only
works reliably on Linux, which in the opinion of the SQLite developers 
means that Linux should be the preferred platform for all software development.)
As Valgrind runs a Linux binary, it looks for all kinds of interesting
errors such as array overruns, reading from uninitialized memory,
stack overflows, memory leaks, and so forth.  Valgrind finds problems
that can easily slip through all of the other tests run against SQLite.
And, when Valgrind does find an error, it can dump the developer directly
into a symbolic debugger at the exact point where the error occur, to
facilitate a quick fix.

Because it is a simulator, running a binary in Valgrind is slower than 
running it on native hardware.  (To a first approximation, an application
running in Valgrind on a workstation will perform about the same as it
would running natively on a smartphone.)  So it is impractical to run the full
SQLite test suite through Valgrind.  However, the veryquick tests and
the coverage of the TH3 tests are run through Valgrind prior to every
release.



8.3. Memsys2

SQLite contains a pluggable
memory allocation subsystem.
The default implementation uses system malloc() and free(). 
However, if SQLite is compiled with SQLITE_MEMDEBUG, an alternative
memory allocation wrapper (memsys2)
is inserted that looks for memory allocation
errors at run-time.  The memsys2 wrapper checks for memory leaks, of
course, but also looks for buffer overruns, uses of uninitialized memoóry,
and attempts to use memory after it has been freed.  These same checks
are also done by valgrind (and, indeed, Valgrind does them better)
but memsys2 has the advantage of being much faster than Valgrind, which
means the checks can be done more often and for longer tests.



8.4. Mutex Asserts

SQLite contains a pluggable mutex subsystem.  Depending on 
compile-time options, the default mutex system contains interfaces
sqlite3_mutex_held() and sqlite3_mutex_notheld() that detect
whether or not a particular mutex is held by the calling thread.
These two interfaces are used extensively within assert() statements
in SQLite to verify mutexes are held and released at all the right
moments, in order to double-check that SQLite does work correctly
in multi-threaded applications.



8.5. Journal Tests

One of the things that SQLite does to ensure that transactions
are atomic across system crashes and power failures is to write
all changes into the rollback journal file prior to changing the
database.  The TCL test harness contains an alternative
OS backend implementation that helps to
verify this is occurring correctly.  The "journal-test VFS" monitors
all disk I/O traffic between the database file and rollback journal,
checking to make sure that nothing is written into the database
file which has not first been written and synced to the rollback journal.
If any discrepancies are found, an assertion fault is raised.

The journal tests are an additional double-check over and above
the crash tests to make sure that SQLite transactions will be atomic
across system crashes and power failures.



8.6. Undefined Behavior Checks

In the C programming language, it is very easy to write code that
has "undefined" or "implementation defined" behavior.
That means that the code might work during development, but then give
a different answer on a different system, or when recompiled using different
compiler options.  
Examples of undefined and implementation-defined behavior in
ANSI C include:

Signed integer overflow.  (Signed integer overflow does not
necessarily wrap around, as most people expect.)
Shifting an N-bit integer by more than N bits.
Shifting by a negative amount.
Shifting a negative number.
Using the memcpy() function on overlapping buffers.
The order of evaluation of function arguments.
Whether or not "char" variables are signed or unsigned.
And so forth....


Since undefined and implementation-defined behavior is non-portable
and can easily lead to incorrect answers, SQLite works very hard to avoid it.
For example,
when adding two integer column values together as part of an SQL statement,
SQLite does not simply add them together using the C-language "+" operator.
Instead, it first checks to make sure the
addition will not overflow, and if it will, it does the addition using
floating point instead.

To help ensure that SQLite does not make use of undefined or
implementation defined behavior, the test suites are rerun using
instrumented builds that try to detect undefined behavior.  For example,
test suites are run using the "-ftrapv" option of GCC.  And they
are run again using the "-fsanitize=undefined" option on Clang.  And
again using the "/RTC1" option in MSVC.  Then the test suites are rerun
using options like "-funsigned-char" and "-fsigned-char" to make sure
that implementation differences do not matter either.  Tests are then repeated
on 32-bit and 64-bit systems and on big-endian and little-endian systems,
using a variety of CPU architectures.
Furthermore, the test suites are augmented with many test cases that are
deliberately designed to provoke undefined behavior.  For example:
"SELECT -1*(-9223372036854775808);".



9. Disabled Optimization Tests

The sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, ...) interface
allows selected SQL statement optimizations to be disabled at run-time.
SQLite should always generate exactly the same answer with optimizations
enabled and with optimizations disabled; the answer simply arrives quicker
with the optimizations turned on.  So in a production environment, one always
leaves the optimizations turned on (the default setting).

One verification technique used on SQLite is to run an entire test suite
twice, once with optimizations left on and a second time with optimizations
turned off, and verify that the same output is obtained both times.  This
shows that the optimizations do not introduce errors.

Not all test cases can be handled this way.  Some test cases check
to verify that the optimizations really are reducing the amount of
computation by counting the number of disk accesses, sort operations, 
full-scan steps, or other processing steps that occur during queries.
Those test cases will appear to fail when optimizations are disabled.
But the majority of test cases simply check that the correct answer
was obtained, and all of those cases can be run successfully with and
without the optimizations, in order to show that the optimizations do not
cause malfunctions.




10. Checklists

The SQLite developers use an on-line checklist to coordinate testing
activity and to verify that all tests pass prior each SQLite release.
Past checklists
are retained for historical reference.
(The checklists are read-only for anonymous internet viewers, but
developers can log in and update checklist items in their web
browsers.)
The use of checklists for SQLite testing and other development activities
is inspired by 
The Checklist Manifesto
.

The latest checklists contain approximately 200 items that are
individually verified for each release.  Some checklist items only take
a few seconds to verify and mark off.  Others involve test suites
that run for many hours.

The release checklist is not automated: developers run each item on
the checklist manually.  We find that it is important to keep a human in
the loop.  Sometimes problems are found while running a checklist item
even though the test itself passed.  It is important to have a human
reviewing the test output at the highest level, and constantly asking
"Is this really right?"

The release checklist is continuously evolving.  As new problems or
potential problems are discovered, new checklist items are added to
make sure those problems do not appear in subsequent releases.  The
release checklist has proven to be an invaluable tool in helping to
ensure that nothing is overlooked during the release process.




11. Static Analysis

Static analysis means analyzing source code at compile-time to
check for correctness.  Static analysis includes compiler
warning messages and more in-depth analysis engines such as the
Clang Static Analyzer.
SQLite compiles without warnings on GCC and Clang using 
the -Wall and -Wextra flags on Linux and Mac and on MSVC on Windows.
No valid warnings are generated by the Clang Static Analyzer tool "scan-build"
either (though recent versions of clang seem to generate many false-positives.)
Nevertheless, some warnings might be generated by other
static analyzers.  Users are encouraged not to stress over these
warnings and to instead take solace in the intense testing of SQLite
described above. 


Static analysis has not been helpful in finding
bugs in SQLite.  Static analysis has found a few bugs in SQLite, but
those are the exceptions.  More bugs have been
introduced into SQLite while trying to get it to compile without 
warnings than have been found by static analysis.



12. Summary

SQLite is open source.  This gives many people the idea that
it is not well tested as commercial software and is perhaps unreliable.
But that impression is false.  
SQLite has exhibited very high reliability in the field and
a very low defect rate, especially considering how rapidly it is evolving.
The quality of SQLite is achieved in part by careful code design and
implementation.  But extensive testing also plays a vital role in
maintaining and improving the quality of SQLite.  This document has
summarized the testing procedures that every release of SQLite undergoes
with the hope of inspiring confidence that SQLite is
suitable for use in mission-critical applications.
This page last modified on  2022-05-31 20:17:58 UTCtesting.html
ùù‚ÛV‚
5…¶e%How SQLite Is Tested1. Introduction

The reliability and robustness of SQLite is achieved in part
by thorough and careful testing.

As of version 3.39.0 (2022-06-25),
the SQLite library consists of approximately
151.3 KSLOC of C code.
(KSLOC means thousands of "Source Lines Of Code" or, in other words,
lines of code excluding blank lines and comments.)
By comparison, the project has
608 times as much
test code and test scripts - 
92038.3 KSLOC.

1.1. Executive Summary


 Four independently developed test harnesses
 100% branch test coverage in an as-deployed configuration
 Millions and millions of test cases
 Out-of-memory tests
 I/O error tests
 Crash and power loss tests
 Fuzz tests
 Boundary value tests
 Disabled optimization tests
 Regression tests
 Malformed database tests
 Extensive use of assert() and run-time checks
 Valgrind analysis
 Undefined behavior checks
 Checklists




2. Test Harnesses

There are four independent test harnesses used for testing the 
core SQLite library.
Each test harness is designed, maintained, and managed separately
from the others.






The TCL Tests are the original tests for SQLite.  
They are contained in the same source tree as the
SQLite core and like the SQLite core are in the public domain.  The
TCL tests are the primary tests used during development.
The TCL tests are written using the 
TCL scripting language.
The TCL test harness itself consists of 27.7 KSLOC 
of C code used to create the TCL interface.  The test scripts are contained
in 1343 files totaling 
23.5MB in size.  There are
50240 distinct test cases, but many of the test
cases are parameterized and run multiple times (with different parameters)
so that on a full test run millions of
separate tests are performed.




The TH3 test harness is a set of proprietary tests, written in
C that provide 100% branch test coverage 
(and 100% MC/DC test coverage) to
the core SQLite library.  The TH3 tests are designed to run
on embedded and specialized platforms that would not easily support
TCL or other workstation services.  TH3 tests use only the published 
SQLite interfaces. TH3 consists of about
75.7 MB or 1038.0 KSLOC
of C code implementing 49116 distinct test cases.
TH3 tests are heavily parameterized, though, so a full-coverage test runs
about 2.3 million different test
instances.  The cases that provide 100% branch test coverage constitute
a subset of the total TH3 test suite.  A soak test
prior to release does hundreds of millions of tests.
Additional information on TH3 is available separately.




The SQL Logic Test
or SLT test harness is used to run huge numbers
of SQL statements against both SQLite and several other SQL database engines
and verify that they all get the same answers.  SLT currently compares
SQLite against PostgreSQL, MySQL, Microsoft SQL Server, and Oracle 10g.
SLT runs 7.2 million queries comprising
1.12GB of test data.



The dbsqlfuzz engine is a
proprietary fuzz tester.  Other fuzzers for SQLite 
mutate either the SQL inputs or the database file.  Dbsqlfuzz mutates
both the SQL and the database file at the same time, and is thus able
to reach new error states.  Dbsqlfuzz is built using the
libFuzzer framework of LLVM
with a custom mutator.  There are
303 seed files. The dbsqlfuzz fuzzer
runs about one billion test mutations per day.
Dbsqlfuzz helps ensure
that SQLite is robust against attack via malicious SQL or database
inputs.


In addition to the four main test harnesses, there several other
small programs that implement specialized tests.

The "speedtest1.c" program 
estimates ê
ii™‚    ?±I3Version Numbers in SQLite1. SQLite Version Numbers


Beginning with version 3.9.0 (2015-10-14) SQLite uses 
semantic versioning.
Prior to that time, SQLite employed a version identifier that
contained between two and four numbers.

1.1. The New Version Numbering System (After 2015-10-14)


All SQLite releases starting with 3.9.0 use a three-number
"semantic version" of the form X.Y.Z.
The first number X is only increased when there is a change that
breaks backward compatibility.  The
current value for X is 3, and the SQLite developers plan to support
the current SQLite database file format, SQL syntax, and C interface
through at least the year 2050.  Hence, one
can expect that all future versions of SQLite for the next several
decades will begin with "3.".


The second number Y is incremented for any change that breaks forward
compatibility by adding new features.
Most future SQLite releases are expected
to increment the second number Y.  The Z is reset to zero whenever Y
is increased.


The third number Z is incremented for releases consisting of only
small changes that implement performance enhancements and/or bug fixes.


The rate of enhancement for SQLite over the previous five years
(2010-2015) is approximately 6 increments of Y per year.  The
numbering format used by for SQLITE_VERSION_NUMBER and
sqlite3_libversion_number() allows versions up to 3.999.999, which is
more than enough for the planned end-of-support date for SQLite
in 2050.  However, the current tarball naming conventions only
reserve two digits for the Y and so the naming format for downloads
will need to be revised in about 2030.

1.2. The Historical Numbering System (Before 2015-10-14)

This historical version numbering system used a two-, three-,
or four-number version:  W.X, W.X.Y, or W.X.Y.Z.
W was the file format: 1 or 2 or 3.
X was the major version.
Y was the minor version.
Z was used only for patch releases to fix bugs.


There have been three historical file formats for SQLite.
SQLite 1.0 through 1.0.32 used the
gdbm library as its storage
engine.
SQLite 2.0.0 through 2.8.17 used a custom b-tree storage engine that
supported only text keys and data.
All modern versions of SQLite (3.0.0 to present) use a b-tree storage
engine that has full support for binary data and Unicode.


This major version number X was historically incremented only for
large and important changes to the code.  What constituted "large
and important" was subjective.  The 3.6.23 to 3.7.0 change
was a result of adding support for WAL mode.
The 3.7.17 to 3.8.0 change was a result of rewrite known as the
next generation query planner.


The minor version number Y was historically incremented for new
features and/or new interfaces that did not significantly change
the structure of the code.  The addition of common table expressions,
partial indexes, and indexes on expressions are all examples of
"minor" changes.  Again, the distinction between "major" and "minor"
is subjective.


The patch level Z was historically only used for bug-fix releases
that changed only a small number of code lines.

1.3. Version History


Chronology
Change log

This page last modified on  2018-05-31 17:37:17 UTCversionnumbers.html÷esults in a proliferation of CVEs that
have minor impact, or no impact at all, but which make
exaggerated impact claims.


Very few CVEs written about SQLite are real vulnerabilities in the 
sense that they do not give any new capabilities to an attacker.
Consider:


    Almost all CVEs written against SQLite require the ability to
    inject and run arbitrary SQL.

    The advertised consequence of most CVEs is "denial of service",
    typically by causing a crash through a NULL pointer dereference or
    a division by zero, or similar.

    But if an attacker can already run
    arbitrary SQL, they do not need a bug to cause a denial of service.
    There are plenty of perfectly legal and valid SQL statements
    that will consume unlimited CPU, memory, and disk I/O in order
    to create a denial-of-service without requiring help from bugs.

    Hence, the mere fact that an attacker has a way to inject and run
    arbitrary SQL is in and of itself a denial-of-service attack.  That
    the arbitrary SQL might also tickle a bug in SQLite and cause a
    crash is not a new vulnerability.



The SQLite developers do not write CVEs.  Any CVEs you find on
SQLite are generated by third-parties, often without any input from the
core developers.  A common scenario is that someone will report a bug in
SQLite, which will promptly be fixed, then weeks later a CVE for that bug will
appear, unbeknownst to the developers.


You should not assume that a CVE about
SQLite contains authoritative information.
CVEs often contain inaccuracies.
The SQLite developers have attempted to add clarifications and
corrections to CVEs about SQLite.  



2. About CVEs

CVEs ("Common Vulnerabilities and Exposures") are reports of software
bugs that might allow a system to be hacked.  The idea
behind CVEs is sound.  They provide a common naming scheme whereby 
software bugs that might compromise information security can be easily
tracked.

While the original idea being CVEs is sound, the current processes for
creating and managing CVEs are inadequate.  There are countless grey-hat
hackers running fuzzers against a wide-variety of open-source software
products (SQLite as well as many others) and writing up CVEs against
any problems they find.  The grey-hats are rewarded, sometimes with
prestige and sometimes financially, by the number and severity of
the CVEs they write.  This incentive results in a proliferation
of CVEs which are often not well-vetted and which can have exaggerated
impact claims.  The quality-control procedures for CVEs are unable
to cope with this flood of inputs, making it difficult to correct
exaggerated, misleading, omitted, or inaccurate claims.

This is not to say that CVEs are useless.  CVEs do still (mostly)
report actual bugs.  But in most cases the bugs are not true vulnerabilities,
in the sense that they do not contribute to data loss or compromise
in and of themselves.
It is good that bugs are reported and fixed.  But not every bug is
accessible from every application.  In the case of SQLite, most of the
bugs reported by CVEs are inaccessible in most applications.  Upgrading
to the latest version of SQLite is always a good plan, but it need not
be an emergency just because an anonymous grey-hat on the internet
wrote up a CVE.

2.1. A separate SQL injection vulnerability is usually required


Other C-libraries that process complex structured inputs will
routinely be asked to deal with unvetted inputs from untrusted
sources.  Libraries like libjpeg, or libzip, or OpenSSL are
handed input streams that come directly from potentially hostile
agents.


But database engines like SQLite are usually not this way.
The SQL scripts that are passed into SQLite come from the
(trusted) application itself, not from an attacker.  Sometimes
applications contain bugs by which an external attacker can
trick the application into sending SQL of the attackers design
into the database engine.  This is a separate bug in the
application called an
SQL Injection
vulnerability.  Since SQL text is executable code, an
SQL Injection vulnerability is aøctually a special case of a
Remote
Code Execution (RCE) vulnerability.  An SQL Injection is perhaps not
quite as bad as other kinds of RCEs because,
while SQL is a powerful language, it is not as convenient
for crafting an exploit as Python or shell script or raw machine code.
Nevertheless, an SQL Injection is a serious problem.


Most CVEs written about SQLite assume that the attacker is
able to run arbitrary SQL scripts in SQLite.  In most applications,
this means that there must first be an SQL Injection vulnerability
that allows the attacker to inject the malicious SQL.


A few applications do allow untrusted SQL scripts received from
potentially hostile agents to be run direct in SQLite.  The main
example of this is the Chrome and Safari web browsers, which allow
an anonymous web page to run SQL using the WebSQL feature of Javascript.
This is done inside a sandbox with tightly controlled constraints on
resources, lest the SQL script try to soak up all available memory
or CPU cycles in a denial-of-service attack.  Chrome and Safari
have the infrastructure in place to allow a hostile agent to run
code which does not harm or compromise the rest of the machine.
They have to, as they also run Javascript which could, if not
tightly controlled, do even more damage than unrestrained SQL.
Apart from Chrome and Safari, no applications known to the
SQLite developers deliberately allows an anonymous remote agent
to run arbitrary SQL text.

However, most CVEs written against SQLite flippantly assume
that an attacker is free to run any arbitrary SQL in the database
engine.  So to a good approximation, this means most CVEs
written against SQLite really only apply to SQLite as it is
used in Chrome and Safari.  Or, in other words, most CVEs
for SQLite do not apply to you unless you are one of the
developers of Chrome or Safari.

2.2. Defense Against Dark Arts


Most applications can use SQLite without having to worry about
bugs in obscure SQL inputs.  If the application controls
the SQL, and the application is not deliberately trying to break
SQLite, then everything should just work.
It is not necessary to have the latest patched version of SQLite.
Any older version should work just fine.


However, there are some occasions where an application does need
to be able to safely run untrusted SQL. The SQLite developers work hard
to make SQLite safe for this purpose, though there are occasional
slip-ups.  It is good to keep up-to-date with the latest patches
in this case.  The separate defense against dark arts document
contains additional suggestions that can help prevent zero-day
attacks in cases where SQLite is given inputs that come directly
from untrusted sources. 

2.3. The SQLite Developer Policy Toward CVEs

SQLite developers fix all bugs in SQLite as soon as they are reported,
usually within a few hours.  The fixes are immediately available on the
public SQLite source tree.
If a bug seems like it might cause problems for existing applications,
a new patch release for SQLite will be issued.

However, the SQLite developers do not track CVEs.  There are 
various reasons for this:



The developers often do not find out about CVEs until long after the
bug is fixed.  You can see this by the fact that many CVEs reference the
bug fix in their initial report.


CVEs are a low-quality source of information about bugs in SQLite
that are likely to affect most applications.


Almost all bugs reported by CVEs are just bugs and not
true vulnerabilities.  Claiming that they are vulnerabilities is
stretching the meaning of the word "vulnerability" and the SQLite
developers do not wish to participate in that deception.


The developers have no editorial influence on the content of CVEs,
and they do not like to be controlled by groups in which they have
no voice.





3. Status Of Recent SQLite CVEs

Though the SQLite developers do not consider CVEs to be a reliable
source of information about bugs in SQLite, they recognize that many
groups, and especially small teams working at the bottom of tall
bureaucracies, sometimes need to track CVEs, ùwhether they are useful
or not.  To aid in this chore, the following table of recent CVEs
affecting SQLite is provided.

If you notice new CVEs associated with SQLite that are not in
the table below, please bring them to the attention of the developers
on the SQLite Forum so they can
be added.




CVE Number
Fix
Comments





CVE-2022-46908

Bug not in the SQLite library
This is a bug in the --safe command-line option of the command-line shell
  program that is available for accessing SQLite database files.  The bug does
  not exist in the SQLite library.  Nor is it an issue for the CLI as long as
  the user does not depend on the --safe option.  It is not serious.  It is
  debatable whether or not this is a security issue.



CVE-2022-35737

3.39.2(2022-07-21)
This bug is an array-bounds overflow.  The bug is only accessible when using some
  of the C-language APIs provided by SQLite.  The bug cannot be reached using SQL
  nor can it be reached by providing SQLite with a corrupt database file.
  The bug only comes up when very long string inputs (greater than 2 billion bytes
  in length) are provided as arguments to a few specific C-language interfaces,
  and even then only under special circumstances.



CVE-2022-24854

Not a bug
This CVE describes a bug in an application that uses SQLite, not in SQLite itself.
  SQLite is doing everything correctly.  The application grants users the ability to
  run SQL statements, using SQLite, that can leak or change information that those users
  should not normally have access to.  This is purely an application bug.  It does not
  describe a malfunction or vulnerability in SQLite.



CVE-2022-21227

Not a bug
This CVE describes a bug in a third-party packages that provides a binding
  for SQLite to Node.js.  The bug reported is in the third-party Node.js binding,
  not in SQLite itself.  Do not be confused by the use of the word "SQLite" in the
  ambiguously-worded CVE description.



CVE-2021-45346

Not a bug
This CVE is misinformation.  See the discussion around
  SQLite forum post 53de8864ba114bf.



CVE-2021-42169

Not a bug
This CVE has nothing whatsoever to do with SQLite.  It is about a bug in
  application that happens to use SQLite.  Since SQLite is mentioned in the 
  CVE description, the CVE is included here to emphasize that
  this is not an SQLite bug.



CVE-2021-36690

Bug not in the SQLite library
This bug is not in the SQLite core library, but rather in an
  
  experimental extension that is used to implement the
  .expert command in the CLI.  The code that contains the bug
  does not appear in standard SQLite builds, though it
  is included in the sqlite3.exe command-line tool.
  Applications must link against the extra source code files that
  implement the extension and take other deliberate actions to
  activate the extension before the troublesome code can be run.
  For the rare application that uses the troublesome extension,
  the consequence of this bug is that malicious SQL can cause a
  NULL pointer deference and denial of service.
(details)



CVE-2021-28305

Not a bug
This is not a bug in SQLite.  The bug is in a third-party application that
  uses SQLite.  SQLite is mentioned by name in the CVE description,
  however, so we have included the CVE in the list.



CVE-2021-23404

Not a bug
This is not a bug in SQLite.  The bug is in a third-party application that
  uses SQLite and includes "sqlite" in its name.  This CVE is included on the
  list because it mentions SQLite even though the bug has nothing to do
  with SQLite.



CVE-2021-20227

3.34.1(2021-01-20)
Malicious SQL statement causes read-after-free.  No harm can come of this
  particular read-after-free instance, as far as anyone knows.  The bug is
  undetectable without a memory sanitizer. The CVE
  claims that this bug is an RCE - a Remote Code Execution
  vulnerability, but that claim is incorrect.
  The RCE claim is misinformation.
(details)



CVE-2021-20223

3.34.0(2020-12-01)
The problem identified by this CVE is not a vulnerability. 
  It is a malfunction. A coding error causes FTS5
  to sometimes return inconsistent and incorrect results under obscure circumstances,
  but no memory errors occur.
(details)



CVE-2020-15358

3.32.3(2020-06-18)
Malicious SQL statement causes an read past the end of a heap buffer.
(details)



CVE-2020-13871

3.32.3(2020-06-18)
Malicious SQL statement causes a read-only use-after-free memory error.
(details)



CVE-2020-13632

3.32.0(2020-05-22)
Malicious SQL statement causes a read of a NULL pointer in the
  matchinfo() SQL function of the FTS3 extension, resulting in
  denial of service.
(details)



CVE-2020-13631

3.32.0(2020-05-22)
Malicious SQL statement (an ALTER TABLE that tries to rename a
  virtual table into one of its own shadow tables)
  causes an infinite loop and denial of service.
(details)



CVE-2020-13630

3.32.0(2020-05-22)
Malicious SQL statement causes a read-only use-after-free,
  possibly resulting in a incorrect output from the snippet()
  SQL function of the FTS3 extension.  There is no known
  way to exfiltrate data or crash the application using this bug.
(details)



CVE-2020-13435

3.32.1(2020-05-25)
Malicious SQL statement causes a read access to a NULL pointer and
  denial of service.
(details)



CVE-2020-13434

3.32.1(2020-05-25)
Malicious SQL statement involving the printf() SQL function results
  in an integer overflow which can overwrite the stack with over 2
  billion bytes of 0x30 or 0x20 (ASCII '0' or ' ').
  Even though this is a stack overwrite, there is no known way to
  redirect control or otherwise escalate the level of harm.
  This is a denial-of-service attack only.
(details)



CVE-2020-11656

3.32.0(2020-05-22)
Malicious SQL statement causes read-only use-after-free of memory allocation
  if SQLite is compile with -DSQLITE_DEBUG.  Does not affect release
  builds.
(details)



CVE-2020-11655

3.32.0(2020-05-22)
Malicious SQL statement causes a read using an uninitialized pointer
  and denial-of-service.
(details)



CVE-2020-9327

3.32.0(2020-05-22)
Malicious SQL statement causes a read using an uninitialized pointer
  and denial-of-service
(details)



CVE-2020-6405

3.31.0(2020-01-22)
Malicious SQL statement causes a NULL pointer dereference and
  denial-of-service
(details)



CVE-2019-20218

3.31.0(2020-01-22)
Malicious SQL statement causes an uninitialized pointer read and
  denial-of-service.
(details)



CVE-2019-19959

3.31.0(2020-01-22)
Malicious SQL statement causes a NULL pointer dereference
  in the Zipfile virtual table extension and
  denial-of-service.  This is only possible when the optional
  Zipfile virtual table extension is deployed, which is not
  the case in default builds.
(details)



CVE-2019-19926

3.31.0(2020-01-22)
Malicious SQL statement causes an uninitialized pointer read and
  denial-of-service.
(details)



CVE-2019-19925

3.31.0(2020-01-22)
Malicious SQL statement causes a NULL pointer dereference and
  in the Zipfile virtual table extension and
  denial-of-service.  This is only possible when the optional
  Zipfile virtual table extension is deployed, which is not
  the case in default builds.
(details)



CVE-2019-19924

3.31.0(2020-01-22)
Malicious SQL statement causes a uninitialized pointer reference and
  denial-of-service.
(details)



CVE-2019-19923

3.31.0(2020-01-22)
Malicious SQL statement causes a NULL pointer dereference and
  denial-of-service.
(details)



CVE-2019-19646

3.31.0(2020-01-22)
The PRAGMA integrity_check command might cause the byte-code for a prepared
  statement to loop indefinitely.  This might enable a denial-of-service, if the 
  application has not taken appropriate and prudent steps
  to limit the run-time of SQL statements.  This is not a vulnerability, as there
  are countless perfectly valid SQL queries, especially queries involving
  recursive common table expressions, that also run essentially forever.
(details)



CVE-2019-19317

3.31.0(2020-01-22)
This CVE identifies a bug in a development check-in of
  SQLite.  The bug never appeared in any official SQLite release.
(details)





This page last modified on  2022-12-14 16:29:06 UTCcves.html
ÍžÍ‘M‚ I¢C#LoC Recommended Storage Format1. Overview








SQLite is a
Recommended Storage Format
for datasets according to the
US Library of Congress.
Further information:




https://www.loc.gov/preservation/digital/formats/fdd/fdd000461.shtml#local

https://www.loc.gov/preservation/resources/rfs/data.html



As of this writing (2018-05-29) the only other recommended storage formats
for datasets are XML, JSON, and CSV.

1.1. What Is A Recommended Storage Format?


Recommended storage formats are formats which, in the opinion of the
preservationists at the Library of Congress, maximizes the chance of
survival and continued accessibility of digital content.
When selecting recommended storage formats, the following criteria are
considered (quoting from the LOC website):


Disclosure.
Degree to which complete specifications and tools for validating 
technical integrity exist and are accessible to those creating and
sustaining digital content.
A spectrum of disclosure levels can be observed for digital formats.
What is most significant is not approval by a recognized standards body,
but the existence of complete documentation.
Adoption.
Degree to which the format is already used by the primary creators,
disseminators, or users of information resources. 
This includes use as a master format, for delivery to end users, 
and as a means of interchange between systems.
Transparency.
Degree to which the digital representation is open to direct analysis 
with basic tools, such as human readability using a text-only editor.
Self-documentation.
Self-documenting digital objects contain basic descriptive, 
technical, and other administrative metadata.
External Dependencies.
Degree to which a particular format depends on particular hardware,
operating system, or software for rendering or use and the predicted
complexity of dealing with those dependencies in future technical 
environments.
Impact of Patents.
Degree to which the ability of archival institutions to sustain content 
in a format will be inhibited by patents.
Technical Protection Mechanisms.
Implementation of mechanisms such as encryption that prevent the 
preservation of content by a trusted repository. 

This page last modified on  2018-12-10 12:34:08 UTClocrsf.html†I‚
+‚Œ[Vulnerabilities1. Executive Summary



CVEs about SQLite probably do not apply to your use of SQLite.


All historical vulnerabilities reported against SQLite require at least
one of these preconditions:


The attacker can submit and run arbitrary SQL statements.

The attacker can submit a maliciously crafted database file to the
application that the application will then open and query.



Few real-world applications meet either of these preconditions, and hence
few real-world applications are vulnerable, even if they use older
and unpatched versions of SQLite.


The SQLite development team fixes bugs promptly,
usually within hours of discovery.  New releases of SQLite
are issued if the bug seems likely to impact real-world
applications.


Grey-hat hackers are rewarded based on the number and severity of 
CVEs that they write.  This röeentrant through
the error logger callback.  In particular, the error logger callback
is invoked when a memory allocation fails, so it is generally a bad idea
to try to allocate memory inside the error logger.  Do not even think
about trying to store the error message in another SQLite database.

Applications can use the sqlite3_log(E,F,..) API to send new messages
to the log, if desired, but this is discouraged.  The sqlite3_log()
interface is intended for use by extensions only, not by applications.

3. Variety of Error Messages

The error messages that might be sent to the error logger and their
exact format is subject to changes from one release to the next.  So
applications should not depend on any particular error message text formats or
error codes.  Things do not change capriciously, but they do sometimes
changes.

The following is a partial list of the kinds of messages that might
appear in the error logger callback.



Any time there is an error either compiling an SQL statement 
(using sqlite3_prepare_v2() or its siblings) or running an SQL
statement (using sqlite3_step()) that error is logged.



When a schema change occurs that requires a prepared statement to be reparsed
and reprepared, that event is logged with the error code SQLITE_SCHEMA.
The reparse and reprepare is normally automatic (assuming that
sqlite3_prepare_v2() has been used to prepare the statements originally,
which is recommended) and so these logging events are normally the only
way to know that reprepares are taking place.


SQLITE_NOTICE messages are logged whenever a database has to be recovered
because the previous writer crashed without completing its transaction.
The error code is SQLITE_NOTICE_RECOVER_ROLLBACK when recovering a
rollback journal and SQLITE_NOTICE_RECOVER_WAL when recovering a 
write-ahead log.



SQLITE_WARNING messages are logged when database files are renamed or
aliased in ways that can lead to database corruption.
(See 1 and 2 for
additional information.)



Out of memory (OOM) error conditions generate error logging events
with the SQLITE_NOMEM error code and a message that says how many bytes
of memory were requested by the failed allocation.


I/O errors in the OS-interface generate error logging events.
The message to these events gives the line number in the source code where
the error originated and the filename associated with the event when
there is a corresponding file. 

When database corruption is detected, an SQLITE_CORRUPT error
logger callback is invoked.  As with I/O errors, the error message text
contains the line number in the original source code where the error
was first detected.


An error logger callback is invoked on SQLITE_MISUSE errors.
This is useful in detecting application design issues when return codes
are not consistently checked in the application code.


SQLite strives to keep error logger traffic low and only send messages
to the error logger when there really is something wrong.  Applications
might further cull the error message traffic 
by deliberately ignoring certain classes of error
messages that they do not care about.  For example, an application that
makes frequent database schema changes might want to ignore all
SQLITE_SCHEMA errors.

4. Summary

The use of the error logger callback is highly recommended.
The debugging information that the error logger provides has proven
very useful in tracking down obscure problems that occur with applications
after they get into the field.  The error logger callback has also 
proven useful in catching occasional errors that the application
misses because of inconsistent checking of API return codes.
Developers are encouraged to implement an error logger callback early
in the development cycle in order to spot unexpected behavior quickly,
and to leave the error logger callback turned on through deployment.
If the error logger never finds a problem, then no harm is done.  
But failure to set up an appropriate error logger might compromise
diagnostic capabilities later on.
This page last modified on  2022-01-20 21:38:08 UTCerrlog.html
dd·‚        ?íS#The Error And Warning LogOverview 

SQLite can be configured to invoke a callback function containing
an error code and a terse error message whenever anomalies occur.
This mechanism is very helpful in tracking obscure problems that
occur rarely and in the field.  Application developers are encouraged
to take advantage of the error logging facility of SQLite in their
products, as it is very low CPU and memory cost but can be a
huge aid for debugging.

1. Setting Up The Error Logging Callback

There can only be a single error logging callback per process.
The error logging callback is registered at start-time using C-code
similar to the following:


sqlite3_config(SQLITE_CONFIG_LOG, errorLogCallback, pData);


The error logger callback function might look something like this:


void errorLogCallback(void *pArg, int iErrCode, const char *zMsg){
  fprintf(stderr, "(%d) %s\n", iErrCode, zMsg);
}


The example above illustrates the signature of the error logger callback.
However, in an embedded application, one usually does not print
messages on stderr.  Instead, one might store the messages in a
preallocated circular buffer where they can be accessed when diagnostic
information is needed during debugging.  Or perhaps the messages can be
sent to Syslog.  Somehow, the
messages need to be stored where they are accessible to developers,
not displayed to end users.

Do not misunderstand: There is nothing technically wrong with displaying 
the error logger messages to end users.  The messages do not contain
sensitive or private information that must be protected from unauthorized
viewing.  Rather the messages are technical in nature and are not useful
or meaningful to the typical end user.  The messages coming from the
error logger are intended for database geeks.  Display them accordingly.

2. Interface Details

The third argument to the sqlite3_config(SQLITE_CONFIG_LOG,...) 
interface (the "pData" argument in the example above) is a pointer to arbitrary
data.  SQLite passes this pointer through to the first argument of the
error logger callback.  The pointer can be used to pass application-specific 
setup or state information, if desired.  Or it can simply be a NULL 
pointer which is ignored by the callback.

The second argument to the error logger callback is an integer
extended error code.  The third argument to the error logger is the
text of the error message.  The error message text is stored in a fixed-length
stack buffer in the calling function and so will only be valid for the
duration of the error logger callback function.  The error logger should
make a copy of this message into persistent storage if retention of the
message is needed.

The error logger callback should be treated like a signal handler.
The application should save off or otherwise process the error, then return
as soon as possible.  No other SQLite APIs should be invoked, directly or
indirectly, from the error logger.  SQLite is not rû
QQ™+‚   c±]+Using SQLite In Multi-Threaded Applications1. Overview

SQLite supports three different threading modes:


Single-thread.
In this mode, all mutexes are disabled and SQLite is unsafe to use in
more than a single thread at once.

Multi-thread.
In this mode, SQLite can be safely used by multiple threads provided that
no single database connection is used simultaneously in two or more threads.


Serialized.
In serialized mode, SQLite can be safely used by multiple threads with no
restriction.



The threading mode can be selected at compile-time (when the SQLite
library is being compiled from source code) or at start-time (when the
application that intends to use SQLite is initializing) or at
run-time (when a new SQLite database connection is being created).
Generally speaking, run-time overrides start-time and start-time
overrides compile-time.  Except, single-thread mode cannot be 
overridden once selected.



The default mode is serialized.


2. Compile-time selection of threading mode


Use the SQLITE_THREADSAFE compile-time parameter to select the
threading mode.  If no SQLITE_THREADSAFE compile-time parameter is
present, then serialized mode is used.
This can be made explicit with 
-DSQLITE_THREADSAFE=1.
With
-DSQLITE_THREADSAFE=0 the threading mode is
single-thread.  With
-DSQLITE_THREADSAFE=2 the threading mode is
multi-thread.



The return value of the sqlite3_threadsafe() interface is the value
of SQLITE_THREADSAFE set at compile-time. It does not reflect changes
to the threading mode made at runtime via the sqlite3_config()
interface or by flags given as the third argument to sqlite3_open_v2().



If single-thread mode is selected at compile-time, then critical
mutexing logic is omitted from the build and it is impossible to
enable either multi-thread or serialized modes at start-time or
run-time.


3. Start-time selection of threading mode


Assuming that the compile-time threading mode is not single-thread, then
the threading mode can be changed during initialization using the
sqlite3_config() interface.  The SQLITE_CONFIG_SINGLETHREAD verb
puts SQLite into single-thread mode, the SQLITE_CONFIG_MULTITHREAD
verb sets multi-thread mode, and the SQLITE_CONFIG_SERIALIZED verb
sets serialized mode.


4. Run-time selection of threading mode

If single-thread mode has not been selected at compile-time or start-time,
then individual database connections can be created as either multi-thread
or serialized.  It is not possible to downgrade an individual database
connection to single-thread mode.  Nor is it possible to escalate an
individual database connection if the compile-time or start-time mode
is single-thread.

The threading mode for an individual database connection is determined
by flags given as the third argument to sqlite3_open_v2().  The
SQLITE_OPEN_NOMUTEX flag causes the database connection to be in the
multi-thread mode and the SQLITE_OPEN_FULLMUTEX flag causes the connection
to be in serialized mode.  If neither flag is specified or if
sqlite3_open() or sqlite3_open16() are used instead of 
sqlite3_open_v2(), then the default
mode determined by the compile-time and start-time settings is used.

This page last modified on  2022-01-20 21:38:08 UTCthreadsafe.htmlÿresents a range of values between -1074 and +972, inclusive.

(NB:  The usual description of IEEE 754 is more complex, and it is important
to understand the added complexity if you really want to appreciate the details,
merits, and limitations of IEEE 754.  However, the integer description shown
here, while not exactly right, is easier to understand and is sufficient for
the purposes of this article.)

1.2.1. Unrepresentable numbers

Not every decimal number with fewer than 16 significant digits can be
represented exactly as a binary64 number.  In fact, most decimal numbers
with digits to the right of the decimal point lack an exact binary64
equivalent.  For example, if you have a database column that is intended
to hold an item price in dollars and cents, the only cents value that
can be exactly represented are 0.00, 0.25, 0.50, and 0.75.  Any other
numbers to the right of the decimal point result in an approximation.
If you provide a "price" value of 47.49, that number will be represented
in binary64 as:


6683623321994527 &times; 2-47


Which works out to be:


47.49000000000000198951966012828052043914794921875


That number is very close to 47.49, but it is not exact.  It is a little
too big.  If we reduce M by one to 6683623321994526 so that we have the
next smaller possible binary64 value, we get:


47.4899999999999948840923025272786617279052734375




This second number is too small.
The first number is closer to the desired value of 47.49, so that is the
one that gets used.  But it is not exact.  Most decimal values work this
way in IEEE 754.  Remember the key point we made above:


Floating point values are approximate.


If you remember nothing else about floating-point values, 
please don't forget this one key idea.

1.2.2. Is it close enough?

The precision provided by IEEE 754 Binary64 is sufficient for most computations.
For example, if "47.49" represents a price and inflation is running
at 2% per year, then the price is going up by about 0.0000000301 dollars per
second.  The error in the recorded value of 47.49 represents about 66 nanoseconds
worth of inflation.  So if the 47.49 price is exact
when you enter it, then the effects of inflation will cause the true value to
exactly equal the value actually stored
(47.4900000000000019895196601282805204391479492187) in less than 
one ten-millionth of a second.
Surely that level of precision is sufficient for most purposes?

2. Extensions For Dealing With Floating Point Numbers



2.1. The ieee754.c Extension

The ieee754 extension converts a floating point number between its
binary64 representation and the M&times;2E format.
In other words in the expression:


F = M &times 2E


The ieee754 extension converts between F and (M,E) and back again.

The ieee754 extension is not part of the amalgamation, but it is included
by default in the CLI.  If you want to include the ieee754 extension in your
application, you will need to compile and load it separately.



2.1.1. The ieee754() function

The ieee754(F) SQL function takes a single floating-point argument
as its input and returns a string that looks like this:


'ieee754(M,E)'


Except that the M and E are replaced by the mantissa and exponent of the
floating point number.  For example:

sqlite> .mode box
sqlite> SELECT ieee754(47.49) AS x;
┌───────────────────────────────â”
│               x               │
├───────────────────────────────┤
│ ieee754(6683623321994527,-47) │
└───────────────────────────────┘



Going in the other direction, the 2-argument version of ieee754() takes
the M and E values and converts them into the corresponding F value:

sqlite> select ieee754(6683623321994527,-47) as x;
┌───────â”
│   x   │
├───────┤
│ 47.49 │
└───────┘




2.1.2. The ieee754_mantissa() and ieee754_exponent() functions

The text output of the one-argument form of ieee754() is great for human
readability, but it is awkward to use as part of a larger expression.  Hence
the ieee754_mantissa() and ieee754_exponent() routines were added to return
the M and E values corresponding to their single argument F
value.
For example:

sqlite> .mode box
sqlite> SELECT ieee754_mantissa(47.49) AS M, ieee754_exponent(47.49) AS E;
┌──────────────────┬─────â”
│        M         │  E  │
├──────────────────┼─────┤
│ 6683623321994527 │ -47 │
└──────────────────┴─────┘




2.1.3. The ieee754_from_blob() and ieee754_to_blob() functions

The ieee754_to_blob(F) SQL function converts the floating point number F
into an 8-byte BLOB that is the big-endian binary64 encoding of that number.
The ieee754_from_blob(B) function goes the other way, converting an 8-byte
blob into the floating-point value that the binary64 encoding represents.

So, for example, if you read
on
Wikipedia that the encoding for the minimum positive binary64 value is
0x0000000000000001, then you can find the corresponding floating point value
like this:

sqlite> .mode box
sqlite> SELECT ieee754_from_blob(x'0000000000000001') AS F;
┌───────────────────────â”
│           F           │
├───────────────────────┤
│ 4.94065645841247e-324 │
└───────────────────────┘


Or go the other way:

sqlite> .mode box
sqlite> SELECT quote(ieee754_to_blob(4.94065645841247e-324)) AS binary64;
┌─────────────────────â”
│      binary64       │
├─────────────────────┤
│ X'0000000000000001' │
└─────────────────────┘




2.2. The decimal.c Extension

The decimal extension provides arbitrary-precision decimal arithmetic on
numbers stored as text strings.  Because the numbers are stored to arbitrary
precision and as text, no approximations are needed.  Computations can be
done exactly.

The decimal extension is not (currently) part of the SQLite amalgamation.
However, it is included in the CLI.

There are three math functions available:



 decimal_add(A,B)
 decimal_sub(A,B)
 decimal_mul(A,B)



These functions respectively add, subtract, and multiply their arguments
and return a new text string that is the decimal representation of the result.
There is no division operator at this time.

Use the decimal_cmp(A,B) to compare two decimal values.  The result will
be negative, zero, or positive if A is less than, equal to, or greater than B,
respectively.

The decimal_sum(X) function is an aggregate, like the built-in
sum() aggregate function, except that decimal_sum() computes its result
to arbitrary precision and is therefore precise.

Finally, the decimal extension provides the "decimal" collating sequences
that compares decimal text strings in numeric order.

3. Techniques


The following SQL illustrates how to use the ieee754 and decimal
extensions to compute the exact decimal equivalent
for a binary64 floating-point number.

-- The pow2 table will hold all the necessary powers of two.
CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
WITH RECURSIVE c(x,v) AS (
  VALUES(0,'1')
  UNION ALL
  SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1&lt;=971
) INSERT INTO pow2(x,v) SELECT x, v FROM c;
WITH RECURSIVE c(x,v) AS (
  VALUES(-1,'0.5')
  UNION ALL
  SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1&gt;=-1075
) INSERT INTO pow2(x,v) SELECT x, v FROM c;

-- This query finds the decimal representation of each value in the "c" table.
WITH c(n) AS (VALUES(47.49))
                 ----XXXXX----------- Replace with whatever you want
SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
  FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);

This page last modified on  2022-11-21 14:37:06 UTCfloatingpoint.html
ÕZ‚
9ª]1Floating Point Numbers1. How SQLite Stores Numbers


SQLite stores integer values in the 64-bit 
twos-complement
format&sup1.
This gives a storage range of -9223372036854775808 to +9223372036854775807,
inclusive.  Integers within this range are exact.


So-called "REAL" or floating point values are stored in the
IEEE 754
Binary-64
format&sup1.
This gives a range of positive values between approximately
1.7976931348623157e+308 and 4.9406564584124654e-324 with an equivalent
range of negative values.  A binary64 can also be 0.0 (and -0.0), positive
and negative infinity and "NaN" or "Not-a-Number".  Floating point
values are approximate.


Pay close attention to the last sentence in the previous paragraph:

Floating point values are approximate.



If you need an exact answer, you should not use binary64 floating-point
values, in SQLite or in any other product.  This is not an SQLite limitation.
It is a mathematical limitation inherent in the design of floating-point numbers.

&mdash;&sup1;
Exception:  The R-Tree extension stores information as 32-bit floating
point or integer values.

1.1. Floating-Point Accuracy


SQLite promises to preserve the 15 most significant digits of a floating
point value.  However, it makes no guarantees about the accuracy of
computations on floating point values, as no such guarantees are possible.
Performing math on floating-point values introduces error.
For example, consider what happens if you attempt to subtract two floating-point
numbers of similar magnitude:



1152693165.1106291898
-1152693165.1106280772

0.0000011126



The result shown above (0.0000011126) is the correct answer.  But if you
do this computation using binary64 floating-point, the answer you get is
0.00000095367431640625 - an error of about 14%.  If you do many similar
computations as part of your program, the errors add up so that your final
result might be completely meaningless.

The error arises because only about the first 15 significant digits of
each number are stored accurately, and the first difference between the two numbers
being subtracted is in the 16th digit.  

1.2. Floating Point Numbers


The binary64 floating-point format uses 64 bits per number.  Hence there
are 1.845e+19 different possible floating point values.  On the other hand
there are infinitely many real numbers in the range of 
1.7977e+308 and 4.9407e-324.  It follows then that binary64 cannot possibly
represent all possible real numbers within that range.  Approximations are
required.


An IEEE 754 floating-point value is an integer multiplied by a power
of two:


M &times 2E


The M value is the "mantissa" and E is the "exponent".  Both
M and E are integers.

For Binary64, M is a 53-bit integer and E is an 11-bit integer that is
offset so that repþ
QQ—+‚   =®)SQLite Library FootprintSize Of The SQLite Library


The code space used by the SQLite library depends on the target
platform, the compiler, and optimization settings.  These variables
also affect performance.



The chart below shows the relative size and performance for SQLite
as of 2017-10-08 for various compilers and optimization settings
as tested on Ubuntu 16.04.3 on x86_64.  General observations:



The Clang/LLVM compiler is not competitive with GCC.  Clang-generated
binaries are consistently larger and slower than GCC-generated binaries.


Profile guided optimization (PGO) is not helpful with SQLite.  PGO results
in binaries that are about 1% larger and about 0.33% slower.


GCC-7 generates binaries that are smaller and faster than GCC-5, though
the difference is not that great.


Compiling with GCC and -Os results in a binary that is slightly less 
than 500KB in size. (Update 2018-07-07: Due to the addition of new
features such as UPSERT and window functions, the library footprint
is now slightly larger than 500KB.)


The only significant design decision that developers need to make is
whether to use -Os (optimize for size) or -O6 (optimize for speed).
The -O6 setting makes binaries that run about 2% or 3% faster, but which
are also 66% larger.  The performance here is measured by counting CPU
cycles using cachegrind.  I-cache misses are not considered in the
analysis.  If I-cache misses are considered, builds with -O6 might not
be any faster than builds with -Os.


Taking into consideration all of the above, the SQLite developers recommend
compiling SQLite using GCC-7 with the -Os optimization setting.








Details



Measurements above were conducted using SQLite version 
5594a121bf132a98 from
2017-10-08.


The only SQLite compile-time option used was -DSQLITE_ENABLE_MEMSYS5.
The optional memsys5 memory allocator is used for performance testing
because it gives results that are more repeatable than the library-supplied
malloc()/free() on Ubuntu.


Performance can be improved and the size reduced by
enabling -DSQLITE_THREADSAFE=0,
-DSQLITE_DEFAULT_MEMSTATUS=0,
-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1,
-DSQLITE_LIKE_DOESNT_MATCH_BLOBS,
-DSQLITE_MAX_EXPR_DEPTH=0,
-DSQLITE_OMIT_DECLTYPE,
-DSQLITE_OMIT_DEPRECATED,
-DSQLITE_OMIT_PROGRESS_CALLBACK,
-DSQLITE_OMIT_SHARED_CACHE, and
-DSQLITE_USE_ALLOCA.
All these options together result in about a 3.5% performance increase and
a 3.0% size reduction.


Adding optional features like -DSQLITE_ENABLE_JSON1,
-DSQLITE_ENABLE_FTS5, or -DSQLITE_ENABLE_RTREE will increase the
size of the library, obviously.


Performance was measured using the
speedtest1.c utility program,
which attempts to mimic a typical workload for SQLite.  Options to
the test runs are:

--shrink-memory --reprepare --stats --heap 10000000 64 --size 5

Performance was measured by running speedtest1 using cachegrind and
observing the "I refs" output.

This page last modified on  2018-07-07 17:44:20 UTCfootprint.html
’       ¦’Ïs‚!
OƒŸ
SQLite Frequently Asked QuestionsFrequently Asked QuestionsHow do I create an AUTOINCREMENT field?What datatypes does SQLite support?SQLite lets me insert a string into a database column of type integer!Why doesn't SQLite allow me to use '0' and '0.0' as the primary
  key on two different rows of the same table?Can multiple applications or multiple instances of the same
  application access a single database file at the same time?Is SQLite threadsafe?How do I list all tables/indices contained in an SQLite databaseAre there any known size limits to SQLite databases?What is the maximum size of a VARCHAR in SQLite?Does SQLite support a BLOB type?How do I add, delete or rename columns from an existing table in SQLite?I deleted a lot of data but the database file did not get any
  smaller.  Is this a bug?Can I use SQLite in my commercial product without paying royalties?How do I use a string literal that contains an embedded single-quote (')
  character?What is an SQLITE_SCHEMA error, and why am I getting one?I get some compiler warnings when I compile SQLite.
  Isn't this a problem?  Doesn't it indicate poor code quality?Case-insensitive matching of Unicode characters does not work.INSERT is really slow - I can only do few dozen INSERTs per secondI accidentally deleted some important information from my SQLite database.
  How can I recover it?What is an SQLITE_CORRUPT error?  What does it mean for the database
  to be "malformed"? Why am I getting this error?Does SQLite support foreign keys?I get a compiler error if I use the SQLITE_OMIT_... 
  compile-time options when building SQLite.My WHERE clause expression column1="column1" does not work.
  It causes every row of the table to be returned, not just the rows
  where column1 has the value "column1".How are the syntax diagrams (a.k.a. "railroad" diagrams) for
  SQLite generated?The SQL standard requires that a UNIQUE constraint be enforced even if
  one or more of the columns in the constraint are NULL, but SQLite does
  not do this.  Isn't that a bug?What is the ExŒV‚  9˜c%SQLite Support OptionsPublic Forum

Connect with SQLite developers and other SQLite users on the
SQLite Forum.  This is the preferred
way to get free help with SQLite.




There was formerly a mailing list devoted to discussions
about SQLite, but as of 2020-03-12, the mailing list is deprecated.
Please use the 
SQLite Forum instead.
Historical mailing lists posts are preserved at

www.mail-archive.com



Paid Professional Support


If you would like professional support for SQLite
or if you want custom modifications performed by the
original author of SQLite, these services are available for a modest fee.
For additional information contact:



D. Richard Hipp 
Hwaci - Applied Software Research 
704.948.4565 
drh@hwaci.com

More Info



Proprietary SQLite Extensions

The core SQLite library found on this website is in the
public domain.  But there also exist
proprietary, licensed extensions to SQLite.



The SQLite Encryption Extension (SEE)
will read and write database files encrypted using
128-bit or 256-bit AES.


The SQLite Compressed and Encrypted Read-Only Database (CEROD)
extension will read a database file that is both compressed
and encrypted.


The ZIPVFS
extension will both read and write database files that are both compressed and optionally
encrypted using application-supplied compression and encryption routines.


The Test Harness #3 (TH3) is an alternative set of test
vectors for SQLite that verify the operation of SQLite in an
as-deployed configuration on embedded platforms with
100% branch test coverage.




This page last modified on  2021-01-16 12:18:53 UTCsupport.htmlport Control Classification Number (ECCN) for SQLite?My query does not return the column name that I expect.  Is this a bug?
(1) How do I create an AUTOINCREMENT field?
Short answer: A column declared INTEGER PRIMARY KEY will
  autoincrement.

  Longer answer:
  If you declare a column of a table to be INTEGER PRIMARY KEY, then
  whenever you insert a NULL
  into that column of the table, the NULL is automatically converted
  into an integer which is one greater than the largest value of that
  column over all other rows in the table, or 1 if the table is empty.
  Or, if the largest existing integer key 9223372036854775807 is in use then an
  unused key value is chosen at random.
  For example, suppose you have a table like this:

CREATE TABLE t1(
  a INTEGER PRIMARY KEY,
  b INTEGER
);

  With this table, the statement

INSERT INTO t1 VALUES(NULL,123);

  is logically equivalent to saying:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);


  There is a function named
  sqlite3_last_insert_rowid() which will return the integer key
  for the most recent insert operation.

  Note that the integer key is one greater than the largest
  key that was in the table just prior to the insert.  The new key
  will be unique over all keys currently in the table, but it might
  overlap with keys that have been previously deleted from the
  table.  To create keys that are unique over the lifetime of the
  table, add the AUTOINCREMENT keyword to the INTEGER PRIMARY KEY
  declaration.  Then the key chosen will be one more than the
  largest key that has ever existed in that table.  If the largest
  possible key has previously existed in that table, then the INSERT
  will fail with an SQLITE_FULL error code.

(2) What datatypes does SQLite support?
SQLite uses dynamic typing.  Content can be stored as INTEGER,
  REAL, TEXT, BLOB, or as NULL.

(3) SQLite lets me insert a string into a database column of type integer!
This is a feature, not a bug.  SQLite uses dynamic typing. 
  It does not enforce data type  constraints.  Data of any type can
  (usually) be inserted into any column.  You can put arbitrary length
  strings into integer columns, floating point numbers in boolean columns,
  or dates in character columns.  The datatype you assign to a column in the
  CREATE TABLE command does not restrict what data can be put into
  that column.  Every column is able to hold
  an arbitrary length string.  (There is one exception: Columns of
  type INTEGER PRIMARY KEY may only hold a 64-bit signed integer.
  An error will result
  if you try to put anything other than an integer into an
  INTEGER PRIMARY KEY column.)

  But SQLite does use the declared type of a column as a hint
  that you prefer values in that format.  So, for example, if a
  column is of type INTEGER and you try to insert a string into
  that column, SQLite will attempt to convert the string into an
  integer.  If it can, it inserts the integer instead.  If not,
  it inserts the string.  This feature is called type affinity.
  

(4) Why doesn't SQLite allow me to use '0' and '0.0' as the primary
  key on two different rows of the same table?
This problem occurs when your primary key is a numeric type.  Change the
  datatype of your primary key to TEXT and it should work.

  Every row must have a unique primary key.  For a column with a
  numeric type, SQLite thinks that '0' and '0.0' are the
  same value because they compare equal to one another numerically.
  (See the previous question.)  Hence the values are not unique.

(5) Can multiple applications or multiple instances of the same
  application access a single database file at the same time?
Multiple processes can have the same database open at the same
  time.  Multiple processes can be doing a SELECT
  at the same time.  But only one process can be making changes to
  the database at any moment in time, however.

  SQLite uses reader/writer locks to control access to the database.
  (Under Win95/98/ME which lacks support for reader/writer locks, a
  probabilistic simulation is used instead.)
  But use caution: this locking mechanism might
  not work correctly if the database file is kept on an NFS filesystem.
  This is because fcntl() file locking is broken on many NFS implementations.
  You should avoid putting SQLite database files on NFS if multiple
  processes might try to access the file at the same time.  On Windows,
  Microsoft's documentation says that locking may not work under FAT
  filesystems if you are not running the Share.exe daemon.  People who
  have a lot of experience with Windows tell me that file locking of
  network files is very buggy and is not dependable.  If what they
  say is true, sharing an SQLite database between two or more Windows
  machines might cause unexpected problems.

  We are aware of no other embedded SQL database engine that
  supports as much concurrency as SQLite.  SQLite allows multiple processes
  to have the database file open at once, and for multiple processes to
  read the database at once.  When any process wants to write, it must
  lock the entire database file for the duration of its update.  But that
  normally only takes a few milliseconds.  Other processes just wait on
  the writer to finish then continue about their business.  Other embedded
  SQL database engines typically only allow a single process to connect to
  the database at once.

  However, client/server database engines (such as PostgreSQL, MySQL,
  or Oracle) usually support a higher level of concurrency and allow
  multiple processes to be writing to the same database at the same time.
  This is possible in a client/server database because there is always a
  single well-controlled server process available to coordinate access.
  If your application has a need for a lot of concurrency, then you should
  consider using a client/server database.  But experience suggests that
  most applications need much less concurrency than their designers imagine.
  

  When SQLite tries to access a file that is locked by another
  process, the default behavior is to return SQLITE_BUSY.  You can
  adjust this behavior from C code using the 
  sqlite3_busy_handler() or sqlite3_busy_timeout()
  API functions.

(6) Is SQLite threadsafe?
Threads are evil.
  Avoid them.

  SQLite is threadsafe.  We make this concession since many users choose
  to ignore the advice given in the previous paragraph.
  But in order to be thread-safe, SQLite must be compiled
  with the SQLITE_THREADSAFE preprocessor macro set to 1.  Both the Windows
  and Linux precompiled binaries in the distribution are compiled this way.
  If you are unsure if the SQLite library you are linking against is compiled
  to be threadsafe you can call the sqlite3_threadsafe()
  interface to find out.
  

  SQLite is threadsafe because it uses mutexes to serialize
  access to common data structures.  However, the work of acquiring and
  releasing these mutexes will slow SQLite down slightly.  Hence, if you
  do not need SQLite to be threadsafe, you should disable the mutexes
  for maximum performance.  See the threading mode documentation for
  additional information.

  Under Unix, you should not carry an open SQLite database across
  a fork() system call into the child process.

(7) How do I list all tables/indices contained in an SQLite database
If you are running the sqlite3 command-line access program
  you can type ".tables" to get a list of all tables.  Or you
  can type ".schema" to see the complete database schema including
  all tables and indices.  Either of these commands can be followed by
  a LIKE pattern that will restrict the tables that are displayed.

  From within a C/C++ program (or a script using Tcl/Ruby/Perl/Python
  bindings) you can get access to table and index names by doing a SELECT
  on a special table named "SQLITE_SCHEMA".  Every SQLite database
  has an SQLITE_SCHEMA table that defines the schema for the database.
  The SQLITE_SCHEMA table looks like this:

CREATE TABLE sqlite_schema (
  type TEXT,
  name TEXT,
  tbl_name TEXT,
  rootpage INTEGER,
  sql TEXT
);

  For tables, the type field will always be 'table' and the
  name field will be the name of the table.  So to get a list of
  all tables in the database, use the following SELECT command:

SELECT name FROM sqlite_schema
WHERE type='table'
ORDER BY name;

  For indices, type is equal to 'index', name is the
  name of the index and tbl_name is the name of the table to which
  the index belongs.  For both tables and indices, the sql field is
  the text of the original CREATE TABLE or CREATE INDEX statement that
  created the table or index.  For automatically created indices (used
  to implement the PRIMARY KEY or UNIQUE constraints) the sql field
  is NULL.

  The SQLITE_SCHEMA table cannot be modified using UPDATE, INSERT, 
  or DELETE (except under
  extraordinary conditions).  
  The SQLITE_SCHEMA table is automatically updated by commands like
  CREATE TABLE, CREATE INDEX, DROP TABLE, and DROP INDEX.

  Temporary tables do not appear in the SQLITE_SCHEMA table.  Temporary
  tables and their indices and triggers occur in another special table
  named SQLITE_TEMP_SCHEMA.  SQLITE_TEMP_SCHEMA works just like SQLITE_SCHEMA
  except that it is only visible to the application that created the 
  temporary tables.  To get a list of all tables, both permanent and
  temporary, one can use a command similar to the following:

SELECT name FROM 
   (SELECT * FROM sqlite_schema UNION ALL
    SELECT * FROM sqlite_temp_schema)
WHERE type='table'
ORDER BY name


(8) Are there any known size limits to SQLite databases?
See limits.html for a full discussion of
  the limits of SQLite.

(9) What is the maximum size of a VARCHAR in SQLite?
SQLite does not enforce the length of a VARCHAR.  You can declare
  a VARCHAR(10) and SQLite will be happy to store a 500-million character
  string there.  And it will keep all 500-million characters intact.
  Your content is never truncated.  SQLite understands the column type
  of "VARCHAR(N)" to be the same as "TEXT", regardless of the value
  of N.
  

(10) Does SQLite support a BLOB type?
SQLite allows you to store BLOB data in any 
  column, even columns that are declared to hold some other type.
  BLOBs can even be used as PRIMARY KEYs.

(11) How do I add, delete or rename columns from an existing table in SQLite?
SQLite has limited ALTER TABLE support that you can use to
  add, rename or drop columns or to change the name of a table
  as detailed at ALTER TABLE.

  If you want to make more complex changes in the structure or
  constraints of a table or its columns, you will have to recreate it.
  You can save existing data to a temporary table, drop the
  old table, create the new table, then copy the data back in from
  the temporary table. See 
  Making Other Kinds Of Table Schema Changes for procedure.

(12) I deleted a lot of data but the database file did not get any
  smaller.  Is this a bug?
No.  When you delete information from an SQLite database, the
  unused disk space is added to an internal "free-list" and is reused
  the next time you insert data.  The disk space is not lost.  But
  neither is it returned to the operating system.

  If you delete a lot of data and want to shrink the database file,
  run the VACUUM command.
  VACUUM will reconstruct
  the database from scratch.  This will leave the database with an empty
  free-list and a file that is minimal in size.  Note, however, that the
  VACUUM can take some time to run and it can use up to twice
  as much temporary disk space as the original file while it is running.
  

  An alternative to using the VACUUM command
  is auto-vacuum mode, enabled using the 
  auto_vacuum pragma.

(13) Can I use SQLite in my commercial product without paying royalties?
Yes.  SQLite is in the 
  public domain.  No claim of ownership is made
  to any part of the code.  You can do anything you want with it.

(14) How do I use a string literal that contains an embedded single-quote (')
  character?
The SQL standard specifies that single-quotes in strings are escaped
  by putting two single quotes in a row.  SQL works like the Pascal programming
  language in this regard. Example:
  

  
    INSERT INTO xyz VALUES('5 O''clock');
  

(15) What is an SQLITE_SCHEMA error, and why am I getting one?
An SQLITE_SCHEMA error is returned when a 
  prepared SQL statement is no longer valid and cannot be executed.
  When this occurs, the statement must be recompiled from SQL using 
  the sqlite3_prepare() API.
  An SQLITE_SCHEMA error can only occur when using the sqlite3_prepare(),
  and sqlite3_step() interfaces to run SQL.
  You will never receive an SQLITE_SCHEMA error from
  sqlite3_exec().  Nor will you receive an error if you
  prepare statements using sqlite3_prepare_v2() instead of
  sqlite3_prepare().

  The sqlite3_prepare_v2() interface creates a
  prepared statement that will automatically recompile itself if
  the schema changes.  The easiest way to deal with
  SQLITE_SCHEMA errors is to always use sqlite3_prepare_v2()
  instead of sqlite3_prepare().

(17) I get some compiler warnings when I compile SQLite.
  Isn't this a problem?  Doesn't it indicate poor code quality?
Quality assurance in SQLite is done using 
  full-coverage testing,
  not by compiler warnings or other static code analysis tools.
  In other words, we verify that SQLite actually gets the
  correct answer, not that it merely satisfies stylistic constraints.
  Most of the SQLite code base is devoted purely to testing.
  The SQLite test suite runs tens of thousands of separate test cases and
  many of those test cases are parameterized so that hundreds of millions
  of tests involving billions of SQL statements are run and evaluated
  for correctness prior to every release.  The developers use code
  coverage tools to verify that all paths through the code are tested.
  Whenever a bug is found in SQLite, new test cases are written to
  exhibit the bug so that the bug cannot recur undetected in the future.

  During testing, the SQLite library is compiled with special
  instrumentation that allows the test scripts to simulate a wide
  variety of failures in order to verify that SQLite recovers
  correctly.  Memory allocation is carefully tracked and no memory
  leaks occur, even following memory allocation failures.  A custom
  VFS layer is used to simulate operating system crashes and power
  failures in order to ensure that transactions are atomic across
  these events.  A mechanism for deliberately injecting I/O errors
  shows that SQLite is resilient to such malfunctions.  (As an
  experiment, try inducing these kinds of errors on other SQL database
  engines and see what happens!)

  We also run SQLite using Valgrind
  on Linux and verify that it detects no problems.

  Some people say that we should eliminate all warnings because
  benign warnings mask real warnings that might arise in future changes.
  This is true enough.  But in reply, the developers observe that all
  warnings have already been fixed in the builds
  used for SQLite development (various versions of GCC, MSVC,
  and clang).
  Compiler warnings usually only arise from compilers or compile-time 
  options that the SQLite developers do not use themselves.

(18) Case-insensitive matching of Unicode characters does not work.
The default configuration of SQLite only supports case-insensitive
  comparisons of ASCII characters.  The reason for this is that doing
  full Unicode case-insensitive comparisons and case conversions 
  requires tables and logic that would nearly double the size of
  the SQLite library.  The
  SQLite developers reason that any application that needs full
  Unicode case support probably already has the necessary tables and
  functions and so SQLite should not take up space to 
  duplicate this ability.

  Instead of providing full Unicode case support by default, 
  SQLite provides the ability to link against external
  Unicode comparison and conversion routines.
  The application can overload the built-in NOCASE collating
  sequence (using sqlite3_create_collation()) and the built-in
  like(), upper(), and lower() functions
  (using sqlite3_create_function()).  
  The SQLite source code includes an "ICU" extension that does 
  these overloads.  Or, developers can write their own overloads
  based on their own Unicode-aware comparison routines already
  contained within their project.

(19) INSERT is really slow - I can only do few dozen INSERTs per second
Actually, SQLite will easily do 50,000 or more INSERT statements per second
  on an average desktop computer.  But it will only do a few dozen transactions
  per second.  Transaction speed is limited by the rotational speed of
  your disk drive.  A transaction normally requires two complete rotations
  of the disk platter, which on a 7200RPM disk drive limits you to about
  60 transactions per second.

  Transaction speed is limited by disk drive speed because (by default)
  SQLite actually waits until the data really is safely stored on the disk
  surface before the transaction is complete.  That way, if you suddenly lose
  power or if your OS crashes, your data is still safe.  For details, 
  read about atomic commit in SQLite..

  By default, each INSERT statement is its own transaction.  But if you
  surround multiple INSERT statements with BEGIN...COMMIT then all the
  inserts are grouped into a single transaction.  The time needed to commit
  the transaction is amortized over all the enclosed insert statements and
  so the time per insert statement is greatly reduced.

  Another option is to run PRAGMA synchronous=OFF.  This command will
  cause SQLite to not wait on data to reach the disk surface, which will make
  write operations appear to be much faster.  But if you lose power in the
  middle of a transaction, your database file might go corrupt.

(20) I accidentally deleted some important information from my SQLite database.
  How can I recover it?
If you have a backup copy of your database file, recover the information
  from your backup.

  If you do not have a backup, recovery is very difficult.  You might
  be able to find partial string data in a binary dump of the raw database
  file.  Recovering numeric data might also be possible given special tools,
  though to our knowledge no such tools exist.  SQLite is sometimes compiled
  with the SQLITE_SECURE_DELETE option which overwrites all deleted content
  with zeros.  If that is the case then recovery is clearly impossible.
  Recovery is also impossible if you have run VACUUM since the data was
  deleted.  If SQLITE_SECURE_DELETE is not used and VACUUM has not been run,
  then some of the deleted content might still be in the database file, in
  areas marked for reuse.  But, again, there exist no procedures or tools
  that we know of to help you recover that data.

(21) What is an SQLITE_CORRUPT error?  What does it mean for the database
  to be "malformed"? Why am I getting this error?
An SQLITE_CORRUPT error is returned when SQLite detects an error
  in the structure, format, or other control elements of the
  database file.

  SQLite does not corrupt database files without external help.
  If your application crashes in the middle of an
  update, your data is safe.  The database is safe even if your OS
  crashes or takes a power loss.  The crash-resistance of SQLite has
  been extensively studied and tested and is attested by years of real-world 
  experience by billions of users.

  That said, there are a number of things that external programs or bugs
  in your hardware or OS can do to corrupt a database file.  See
  How To Corrupt An SQLite Database File for
  further information.

  You can use PRAGMA integrity_check 
  to do a thorough but time intensive test of the database integrity.

  You can use PRAGMA quick_check to do a faster 
  but less thorough test of the database integrity.

  Depending how badly your database is corrupted, you may be able to 
  recover some of the data by using the CLI to dump the schema and contents
  to a file and then recreate.  Unfortunately, once humpty-dumpty falls off 
  the wall, it is generally not possible to put him back together again.

(22) Does SQLite support foreign keys?

  As of version 3.6.19 (2009-10-14), 
  SQLite supports foreign key constraints.  But enforcement
  of foreign key constraints is turned off by default (for backwards compatibility).
  To enable foreign key constraint enforcement, run 
  PRAGMA foreign_keys=ON or compile with
  -DSQLITE_DEFAULT_FOREIGN_KEYS=1.

(23) I get a compiler error if I use the SQLITE_OMIT_... 
  compile-time options when building SQLite.
The SQLITE_OMIT_... compile-time options only work
  when building from canonical source files.  They do not work
  when you build from the SQLite amalgamation or from the pre-processed
  source files.

  It is possible to build a special amalgamation that will work with
  a predetermined set of SQLITE_OMIT_... options.  Instructions for doing
  so can be found with the SQLITE_OMIT_... documentation.

(24) My WHERE clause expression column1="column1" does not work.
  It causes every row of the table to be returned, not just the rows
  where column1 has the value "column1".
Use single-quotes, not double-quotes, around string literals in SQL.
  This is what the SQL standard requires.  Your WHERE clause expression
  should read: column1='column1'

  SQL uses double-quotes around identifiers (column or table names) that
  contains special characters or which are keywords.  So double-quotes are
  a way of escaping identifier names.  Hence, when you say
  column1="column1" that is equivalent to 
  column1=column1 which is obviously always true.

(25) How are the syntax diagrams (a.k.a. "railroad" diagrams) for
  SQLite generated?
Each diagram is hand-written using the Pikchr
  diagramming language.  These hand-written specifications are converted into
  SVG and inserted inline in the HTML files as part of the documentation build process.
  
  Many historical versions of the SQLite documentation used a different process for
  generating the syntax diagrams.  The historical process was based on Tcl/Tk and is
  described  at http://wiki.tcl-lang.org/21708.  The newer Pikchr-based syntax diagrams
  first landed on trunk on 2020-09-26.

(26) The SQL standard requires that a UNIQUE constraint be enforced even if
  one or more of the columns in the constraint are NULL, but SQLite does
  not do this.  Isn't that a bug?
Perhaps you are referring to the following statement from SQL92:

  
  A unique constraint is satisfied if and only if no two rows in a
  table have the same non-null values in the unique columns. 
  

  That statement is ambiguous, having at least two possible interpretations:

  
  A unique constraint is satisfied if and only if no two rows in a
  table have the same values and have non-null values in the unique columns.
  A unique constraint is satisfied if and only if no two rows in a 
  table have the same values in the subset of unique columns that are not null.
  

  SQLite follows interpretation (1), as does PostgreSQL, MySQL, Oracle,
  and Firebird.  It is true that Informix and Microsoft SQL Server use
  interpretation (2), however we the SQLite developers hold that 
  interpretation (1) is the most natural reading 
  of the requirement and we also want to maximize compatibility with other
  SQL database engines, and most other database engines also go with (1),
  so that is what SQLite does.

(27) What is the Export Control Classification Number (ECCN) for SQLite?
After careful review of the Commerce Control List (CCL), we are convinced
  that the core public-domain SQLite source code is not described by any ECCN,
  hence the ECCN should be reported as EAR99.

  The above is true for the core public-domain SQLite.  If you extend
  SQLite by adding new code, or if you statically link SQLite with your
  application, that might change the ECCN in your particular case.

(28) My query does not return the column name that I expect.  Is this a bug?
If the columns of your result set are named by AS clauses, then SQLite
  is guaranteed to use the identifier to the right of the AS keyword as the
  column name.  If the result set does not use an AS clause, then SQLite
  is free to name the column anything it wants.
  See the sqlite3_column_name() documentation for further information.

This page last modified on  2021-07-27 23:51:29 UTCfaq.htmlgnitude ON account_change(acct_no, abs(amt));



Each entry in the account_change table records a deposit or a withdrawal
into an account.  Deposits have a positive "amt" and withdrawals have
a negative "amt".


The acctchng_magnitude index is over the account number ("acct_no") and
on the absolute value of the amount.  This index allows one to do 
efficient queries over the magnitude of a change to the account.
For example, to list all changes to account number $xyz that are
more than $100.00, one can say:


SELECT * FROM account_change WHERE acct_no=$xyz AND abs(amt)>=10000;



Or, to list all changes to one particular account ($xyz) in order of
decreasing magnitude, one can write:

SELECT * FROM account_change WHERE acct_no=$xyz
 ORDER BY abs(amt) DESC;



Both of the above example queries would work fine without the
acctchng_magnitude index.
The acctchng_magnitude index merely helps the queries to run
faster, especially on databases where there are many entries in
the table for each account.

1. How To Use Indexes On Expressions


Use a CREATE INDEX statement to create a new index on one or more
expressions just like you would to create an index on columns.  The only
difference is that expressions are listed as the elements to be indexed
rather than column names.


The SQLite query planner will consider using an index on an expression
when the expression that is indexed appears in the WHERE clause or in
the ORDER BY clause of a query, exactly as it is written in the
CREATE INDEX statement.  The query planner does not do algebra.  In order
to match WHERE clause constraints and ORDER BY terms to indexes, SQLite
requires that the expressions be the same, except for minor syntactic
differences such as white-space changes.  So if you have:

CREATE TABLE t2(x,y,z);
CREATE INDEX t2xy ON t2(x+y);



And then you run the query:

SELECT * FROM t2 WHERE y+x=22;



Then the index will not be used because 
the expression on the CREATE INDEX
statement (x+y) is not the same as the expression as it appears in the 
query (y+x).  The two expressions might be mathematically equivalent, but
the SQLite query planner insists that they be the same, not merely
equivalent.  Consider rewriting the query thusly:

SELECT * FROM t2 WHERE x+y=22;



This second query will likely use the index because now the expression
in the WHERE clause (x+y) matches the expression in the index exactly.


2. Restrictions


There are certain reasonable restrictions on expressions that appear in
CREATE INDEX statements:



Expressions in CREATE INDEX statements
may only refer to columns of the table being indexed, not to
columns in other tables.


Expressions in CREATE INDEX statements
may contain function calls, but only to functions whose output
is always determined completely by its input parameters (a.k.a.:
deterministic functions).  Obviously, functions like random() will not
work well in an index.  But also functions like sqlite_version(), though
they are constant across any one database connection, are not constant
across the life of the underlying database file, and hence may not be
used in a CREATE INDEX statement.


Note that application-defined SQL functions are by default considered
non-deterministic and may not be used in a CREATE INDEX statement unless
the SQLITE_DETERMINISTIC flag is used when the function is registered.


Expressions in CREATE INDEX statements may not use subqueries.


Expressions may only be used in CREATE INDEX statements, not within
UNIQUE or PRIMARY KEY constraints within the CREATE TABLE statement.



3. Compatibility


The ability to index expressions was added to SQLite with 
version 3.9.0 (2015-10-14).  A database that uses an index on
expressions will not be usable by earlier versions of SQLite.
This page last modified on  2022-01-20 21:38:08 UTCexpridx.html
â”â‹.‚$  c•i%SQL Features That SQLite Does Not ImplementSQL Features That SQLite Does Not Implement


SQLite implements most of the common features of SQL.
Rather than try to list all the features of SQL that SQLite does
support, it is much easier to list those that it does not.
Unsupported features of SQL are shown below.


See also the
Quirks, Caveats, and Gotchas of SQLite.



Complete ALTER TABLE support&nbsp;
  Only the RENAME TABLE, ADD COLUMN, RENAME COLUMN, and DROP COLUMN
  variants of the ALTER TABLE command are supported.  Other kinds of
  ALTER TABLE operations such as
  ALTER COLUMN, ADD CONSTRAINT, and so forth are omitted.
Complete trigger support&nbsp;
  FOR EACH ROW triggers are supported but not FOR EACH STATEMENT
  triggers.
Writing to VIEWs&nbsp;
  VIEWs in SQLite are read-only.  You may not execute a DELETE, INSERT, or
  UPDATE statement on a view. But you can create a trigger
  that fires on an attempt to DELETE, INSERT, or UPDATE a view and do
  what you need in the body of the trigger.
GRANT and REVOKE&nbsp;
  Since SQLite reads and writes an ordinary disk file, the
  only access permissions that can be applied are the normal
  file access permissions of the underlying operating system.
  The GRANT and REVOKE commands commonly found on client/server
  RDBMSes are not implemented because they would be meaningless
  for an embedded database engine.


This page last modified on  2022-04-13 13:11:44 UTComitted.htmlŠw‚#     S•Query Language Understood by SQLiteSQL As Understood By SQLite

SQLite understands most of the standard SQL
language.  But it does omit some features
while at the same time
adding a few features of its own.  This document attempts to
describe precisely what parts of the SQL language SQLite does
and does not support.  A list of SQL keywords is 
also provided.  The SQL language syntax is described by
syntax diagrams.

The following syntax documentation topics are available:






aggregate functions
ALTER TABLE
ANALYZE
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
core functions
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
CREATE VIRTUAL TABLE
date and time functions
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INDEXED BY
INSERT
keywords
ON CONFLICT clause
PRAGMA
REINDEX
RELEASE SAVEPOINT
REPLACE
RETURNING clause
ROLLBACK TRANSACTION
SAVEPOINT
SELECT
UPDATE
UPSERT
VACUUM
WITH clause





The routines sqlite3_prepare_v2(), sqlite3_prepare(),
sqlite3_prepare16(), sqlite3_prepare16_v2(), 
sqlite3_exec(), and sqlite3_get_table() accept
an SQL statement list (sql-stmt-list) which is a semicolon-separated
list of statements.

sql-stmt-list:
 

 


Each SQL statement in the statement list is an instance of the
following:

sql-stmt:
 

 

This page last modified on  2021-02-02 12:11:09 UTClang.html¡\‚"        9Âo%Indexes On ExpressionsNormally, an SQL index references columns of a table.  But an index
can also be formed on expressions involving table columns.


As an example, consider the following table that tracks
dollar-amount changes on various "accounts":

CREATE TABLE account_change(
  chng_id INTEGER PRIMARY KEY,
  acct_no INTEGER REFERENCES account,
  location INTEGER REFERENCES locations,
  amt INTEGER,  -- in cents
  authority TEXT,
  comment TEXT
);
CREATE INDEX acctchng_ma     changegroup is an object used to combine two or more 
changesets or patchsets
Constructor: sqlite3changegroup_new()
Destructor: sqlite3changegroup_delete()
Methods:
 sqlite3changegroup_add(),
sqlite3changegroup_output()

Changeset Iterator Handletypedef struct sqlite3_changeset_iter sqlite3_changeset_iter;

An instance of this object acts as a cursor for iterating
over the elements of a changeset or patchset.
Constructors:
 sqlite3changeset_start(),
sqlite3changeset_start_v2()


sqlite3changeset_conflict
sqlite3changeset_finalize
sqlite3changeset_fk_conflicts
sqlite3changeset_new
sqlite3changeset_next
sqlite3changeset_old
sqlite3changeset_op
sqlite3changeset_pk




Rebasing changesetstypedef struct sqlite3_rebaser sqlite3_rebaser;
Important: This interface is experimental and is subject to change without notice.
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 re
based 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:


   An sqlite3_rebaser object is created by calling 
       sqlite3rebaser_create().
   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.
   Each local changeset is rebased by calling sqlite3rebaser_rebase().
   The sqlite3_rebaser object is deleted by calling
       sqlite3rebaser_delete().


Session Object Handletypedef struct sqlite3_session sqlite3_session;

An instance of this object is a session that can be used to
record changes to a database.
Constructor: sqlite3session_create()
Destructor: sqlite3session_delete()


sqlite3session_attach
sqlite3session_changeset
sqlite3session_changeset_size
sqlite3session_diff
sqlite3session_enable
sqlite3session_indirect
sqlite3session_patchset
sqlite3session_table_filter




Add A Changeset To A Changegroupint sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData);

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.

Delete A Changegroup Objectvoid sqlite3changegroup_delete(sqlite3_changegroup*);

Create A New Changegroup Objectint sqlite3changegroup_new(sqlite3_changegroup **pp);

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().

Obtain A Composite Changeset From A Changegroupint sqlite3changegroup_output(
  sqlite3_changegroup*,
  int *pnData,                    /* OUT: Size of output buffer in bytes */
  void **ppData                   /* OUT: Pointer to output buffer */
);

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().

Concatenate Two Changeset Objectsint 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 */
);

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.

Obtain Conflicting Row Values From A Changeset Iteratorint sqlite3changeset_conflict(
  sqlite3_changeset_iter *pIter,  /* Changeset iterator */
  int iVal,                       /* Column number */
  sqlite3_value **ppValue         /* OUT: Value from conflicting row */
);

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.

Finalize A Changeset Iteratorint sqlite3changeset_finalize(sqlite3_changeset_iter *pIter);

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 
  }


Determine The Number Of Foreign Key Constraint Violationsint sqlite3changeset_fk_conflicts(
  sqlite3_changeset_iter *pIter,  /* Changeset iterator */
  int *pnOut                      /* OUT: Number of FK violations */
);

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.

Invert A Changesetint sqlite3changeset_invert(
  int nIn, const void *pIn,       /* Input changeset */
  int *pnOut, void **ppOut        /* OUT: Inverse of input */
);

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.

Obtain new.* Values From A Changeset Iteratorint sqlite3changeset_new(
  sqlite3_changeset_iter *pIter,  /* Changeset iterator */
  int iVal,                       /* Column number */
  sqlite3_value **ppValue         /* OUT: New value (or NULL pointer) */
);

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.

Advance A Changeset Iteratorint sqlite3changeset_next(sqlite3_changeset_iter *pIter);

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.

Obtain old.* Values From A Changeset Iteratorint sqlite3changeset_old(
  sqlite3_changeset_iter *pIter,  /* Changeset iterator */
  int iVal,                       /* Column number */
  sqlite3_value **ppValue         /* OUT: Old value (or NULL pointer) */
);

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.

Obtain The Current Operation From A Changeset Iteratorint 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 */
);

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.

Arguments pOp, pnCol and pzTab may not be NULL. Upon return, three
outputs are set through these pointers: 

*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;

*pnCol is set to the number of columns in the table affected by the change; and

*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 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.

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.

Obtain The Primary Key Definition Of A Tableint 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 */
);

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.

Configure a changeset rebaser object.int sqlite3rebaser_configure(
  sqlite3_rebaser*, 
  int nRebase, const void *pRebase
); 
Important: This interface is experimental and is subject to change without notice.
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().

Create a changeset rebaser object.int sqlite3rebaser_create(sqlite3_rebaser **ppNew);
Important: This interface is experimental and is subject to change without notice.
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. 

Delete a changeset rebaser object.void sqlite3rebaser_delete(sqlite3_rebaser *p); 
Important: This interface is experimental and is subject to change without notice.
Delete the changeset rebaser object and all associated resources. There
should be one call to this function for each successful invocation
of sqlite3rebaser_create().

Rebase a changesetint sqlite3rebaser_rebase(
  sqlite3_rebaser*,
  int nIn, const void *pIn, 
  int *pnOut, void **ppOut 
);
Important: This interface is experimental and is subject to change without notice.
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.

Attach A Table To A Session Objectint sqlite3session_attach(
  sqlite3_session *pSession,      /* Session object */
  const char *zTab                /* Table name */
);

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:
 
 &nbsp;     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.

Generate A Changeset From A Session Objectint sqlite3session_changeset(
  sqlite3_session *pSession,      /* Session object */
  int *pnChangeset,               /* OUT: Size of buffer at *ppChangeset */
  void **ppChangeset              /* OUT: Buffer containing changeset */
);

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.

Return An Upper-limit For The Size Of The Changesetsqlite3_int64 sqlite3session_changeset_size(sqlite3_session *pSession);

By default, this function always returns 0. For it to return
a useful result, the sqlite3_session object must have been configured
to enable this API using sqlite3session_object_config() with the
SQLITE_SESSION_OBJCONFIG_SIZE verb.

When enabled, this function returns an upper limit, in bytes, for the size 
of the changeset that might be produced if sqlite3session_changeset() were
called. The final changeset size might be equal to or smaller than the
size in bytes returned by this function.

Configure global parametersint sqlite3session_config(int op, void *pArg);

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.

Create A New Session Objectint sqlite3session_create(
  sqlite3 *db,                    /* Database handle */
  const char *zDb,                /* Name of db (e.g. "main") */
  sqlite3_session **ppSession     /* OUT: New session object */
);

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.

Delete A Session Objectvoid sqlite3session_delete(sqlite3_session *pSession);

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.

Load The Difference Between Tables Into A Sessionint sqlite3session_diff(
  sqlite3_session *pSession,
  const char *zFromDb,
  const char *zTbl,
  char **pzErrMsg
);

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().

Enable Or Disable A Session Objectint sqlite3session_enable(sqlite3_session *pSession, int bEnable);

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.

Set Or Clear the Indirect Change Flagint sqlite3session_indirect(sqlite3_session *pSession, int bIndirect);

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.

Test if a changeset has recorded any changes.int sqlite3session_isempty(sqlite3_session *pSession);

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.

Query for the amount of heap memory used by a session object.sqlite3_int64 sqlite3session_memory_used(sqlite3_session *pSession);

This API returns the total amount of heap memory in bytes currently 
used by the session object passed as the only argument.

Generate A Patchset From A Session Objectint sqlite3session_patchset(
  sqlite3_session *pSession,      /* Session object */
  int *pnPatchset,                /* OUT: Size of buffer at *ppPatchset */
  void **ppPatchset               /* OUT: Buffer containing patchset */
);

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).

Set a table filter on a Session Object.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 */
);

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.

Flags for sqlite3changeset_apply_v2#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT   0x0001
#define SQLITE_CHANGESETAPPLY_INVERT        0x0002

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.

Constants Returned By The Conflict Handler#define SQLITE_CHANGESET_OMIT       0
#define SQLITE_CHANGESET_REPLACE    1
#define SQLITE_CHANGESET_ABORT      2

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.


Constants Passed To The Conflict Handler#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

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.



Streaming Versions of API functions.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 */
);
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
);
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
);
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
);
int sqlite3changeset_start_strm(
  sqlite3_changeset_iter **pp,
  int (*xInput)(void *pIn, void *pData, int *pnData),
  void *pIn
);
int sqlite3changeset_start_v2_strm(
  sqlite3_changeset_iter **pp,
  int (*xInput)(void *pIn, void *pData, int *pnData),
  void *pIn,
  int flags
);
int sqlite3session_changeset_strm(
  sqlite3_session *pSession,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);
int sqlite3session_patchset_strm(
  sqlite3_session *pSession,
  int (*xOutput)(void *pOut, const void *pData, int nData),
  void *pOut
);
int sqlite3changegroup_add_strm(sqlite3_changegroup*, 
    int (*xInput)(void *pIn, void *pData, int *pnData),
    void *pIn
);
int sqlite3changegroup_output_strm(sqlite3_changegroup*,
    int (*xOutput)(void *pOut, const void *pData, int nData), 
    void *pOut
);
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
);

The six streaming API xxx_strm() functions serve similar purposes to the 
corresponding non-streaming API functions:


  Streaming functionNon-streaming equivalent
  sqlite3changeset_apply_strmsqlite3changeset_apply 
  sqlite3changeset_apply_strm_v2sqlite3changeset_apply_v2 
  sqlite3changeset_concat_strmsqlite3changeset_concat 
  sqlite3changeset_invert_strmsqlite3changeset_invert 
  sqlite3changeset_start_strmsqlite3changeset_start 
  sqlite3session_changeset_strmsqlite3session_changeset 
  sqlite3session_patchset_strmsqlite3session_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

 
 &nbsp;     int nChangeset,
 &nbsp;     void *pChangeset,
 

Is replaced by:

 
 &nbsp;     int (*xInput)(void *pIn, void *pData, int *pnData),
 &nbsp;     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:

 
 &nbsp;     int *pnChangeset,
 &nbsp;     void **ppChangeset,
 

Is replaced by:

 
 &nbsp;     int (*xOutput)(void *pOut, const void *pData, int nData),
 &nbsp;     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.

Apply A Changeset To A Databaseint 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 */
);
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 */
);

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 
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
supported flags as the 9th parameter.

Note that the sqlite3changeset_apply_v2() API is still experimental
and therefore subject to change.

Create An Iterator To Traverse A Changeset 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 */
);
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 */
);

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
supported flags as the 4th parameter.

Note that the sqlite3changeset_start_v2() API is still experimental
and therefore subject to change.session.html
%û%‡R‚&   /ŽkSQLite DevelopersD. Richard Hipp
 began the SQLite project on 2000-05-29
and continues to serve as the project architect.  Richard was born,
lives, and works in 
Charlotte, North Carolina.  He holds degrees from
Georgia Tech (MSEE, 1984) and
Duke University (PhD, 1992) and is
the founder of the consulting firm
Hwaci.








Dan Kennedy is an Australian currently based in South-East Asia.
He holds a degree in Computer System Engineering from the University of
Queensland and has worked in a variety of fields, including industrial
automation, computer graphics and embedded software development.
Dan has been a key contributor to SQLite since 2002.







Joe Mistachkin
(pronounced "miss-tash-kin") is a software engineer and one
of the maintainers of Tcl/Tk.  He is also the author of the TclBridge
component and the Eagle scripting language.  He has been working in the
software industry since 1994.


This page last modified on  2018-05-31 17:37:17 UTCcrew.html„µ8‚%
Wˆê%SQLite Session Module C/C++ InterfaceSQLite Session Module C/C++ Interface



This page defines the C-language interface to the SQLite 
   session extension.
   This is not a tutorial. These pages are designed to be precise, not easy 
   to read.  A tutorial is available separately.

This page contains all C-language interface information
in a single HTML file.  The same information is also
available broken out into lots of small pages
for easier viewing, if you prefer.

This document is created by a script which scans comments in the source 
code file sqlite3session.h.




Objects:


sqlite3_changegroup
sqlite3_changeset_iter
sqlite3_rebaser(exp)
sqlite3_session




Constants:


SQLITE_CHANGESETAPPLY_INVERT
SQLITE_CHANGESETAPPLY_NOSAVEPOINT
SQLITE_CHANGESETSTART_INVERT
SQLITE_CHANGESET_ABORT
SQLITE_CHANGESET_CONFLICT
SQLITE_CHANGESET_CONSTRAINT
SQLITE_CHANGESET_DATA
SQLITE_CHANGESET_FOREIGN_KEY
SQLITE_CHANGESET_NOTFOUND
SQLITE_CHANGESET_OMIT
SQLITE_CHANGESET_REPLACE
SQLITE_SESSION_CONFIG_STRMSIZE




Functions:


sqlite3changegroup_add
sqlite3changegroup_add_strm
sqlite3changegroup_delete
sqlite3changegroup_new
sqlite3changegroup_output
sqlite3changegroup_output_strm
sqlite3changeset_apply
sqlite3changeset_apply_strm
sqlite3changeset_apply_v2
sqlite3changeset_apply_v2_strm
sqlite3changeset_concat
sqlite3changeset_concat_strm
sqlite3changeset_conflict
sqlite3changeset_finalize
sqlite3changeset_fk_conflicts
sqlite3changeset_invert
sqlite3changeset_invert_strm
sqlite3changeset_new
sqlite3changeset_next
sqlite3changeset_old
sqlite3changeset_op
sqlite3changeset_pk
sqlite3changeset_start
sqlite3changeset_start_strm
sqlite3changeset_start_v2
sqlite3changeset_start_v2_strm
sqlite3rebaser_configure(exp)
sqlite3rebaser_create(exp)
sqlite3rebaser_delete(exp)
sqlite3rebaser_rebase(exp)
sqlite3rebaser_rebase_strm
sqlite3session_attach
sqlite3session_changeset
sqlite3session_changeset_size
sqlite3session_changeset_strm
sqlite3session_config
sqlite3session_create
sqlite3session_delete
sqlite3session_diff
sqlite3session_enable
sqlite3session_indirect
sqlite3session_isempty
sqlite3session_memory_used
sqlite3session_patchset
sqlite3session_patchset_strm
sqlite3session_table_filter




Flags for sqlite3changeset_start_v2#define SQLITE_CHANGESETSTART_INVERT        0x0002

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.

Values for sqlite3session_config().#define SQLITE_SESSION_CONFIG_STRMSIZE 1

Changegroup Handletypedef struct sqlite3_changegroup sqlite3_changegroup;

A to and say
"this is the database".  It behaves as an object.
An SQLite database file can be copied, renamed, sent as an
email attachment, passed as the argument a POST HTTP request,
or otherwise treated as other data object such as an image,
document, or media file.


Studies show that many applications already use
SQLite as a container object.  For example,
Kennedy
(no relation to the SQLite developer) reports that 14% of
Android applications never write to their SQLite databases.  It is
believed that these applications are downloading entire databases
from the cloud and then using the information locally as needed.  In other
words, the applications are using SQLite not so much as a database but as
a queryable wire-transfer format.

1.2. Applications Using SQLite Archives


The Fossil Distributed Version Control system
provides users with the option to download check-ins as either Tarballs,
ZIP Archives, or SQLite Archives.
2. Advantages Of SQLite Archives



An SQLite Archive is flexible.
ZIP Archives and Tarballs are limited to storing only files.  An
SQLite Archive stores files plus whatever other tabular
and/or relational data seems useful to the application.


An SQLite Archive is transactional.
Updates are atomic and durable, even if there are crashes
or power losses in the middle of the update.
Readers see a consistent and unchanging version of the content even
is some other process is simultaneously updating the archive.


An SQLite Archive can be updated incrementally.
Individual files can be added or removed or replaced without having
to rewrite the entire archive.


An SQLite Archive can be queried using a high-level query language (SQL).
Some examples:

 What is the total size of all files in the archive whose names
     end in ".h" or ".cpp"?
 What percentage of the files are compressed by less than 25%?
 How many executable files are in the archive?

Questions like these (and countless others) can be answered without
having to uncompress or extract any content.


Applications that already use SQLite for other purposes can easily
add support for SQLite Archives using a small extension
(https://sqlite.org/src/file/ext/misc/sqlar.c) to handle the compression
and decompression of content.  Even this tiny extension can be omitted
if the files in the archive are uncompressed.  In contrast, supporting
ZIP Archives and/or Tarballs requires either separate libraries or
lots of extra custom code, or sometimes both.


An SQLite Archive can work around firewall-imposed censorship.
For example, certain file types that are considered "dangerous" 
(examples: DLLs) will be
blocked by Gmail
and probably many other email services and firewalls, even if the
files are wrapped inside a ZIP Archive or Tarball.
But these firewalls usually do not (yet) know about SQLite Archives and
so content can be put inside an SQLite Archive to evade censorship.


3. Disadvantages Of SQLite Archives



The SQLite Archive is a relatively new format.  It was first described in
in 2014.  ZIP Archives and Tarballs, on the other hand, have been around
for decades and are well-entrenched as standard formats.  Most programmers
know what a ZIP Archive or Tarball is, but if you say "SQLite Archive" you
are more likely to get a reply of "What?"  Tooling to process ZIP Archives
and Tarballs is more likely to be installed on stock computers.


Since an SQLite database is a more general format (it is designed to do
much more than simply store a bunch of files) it is not as compact as either
the ZIP Archive or Tarball formats.  An SQLite Archive is usually about 1%
larger than the equivalent ZIP Archive.  Tarballs are compressed as a single
unit rather than compressing each file separately as is done by both
SQLite and ZIP Archives.  For these reason, Tarballs tend to be smaller
than either ZIP or SQLite Archives.

As an example, the following table show the relative sizes for an
SQLite Archive, a ZIP Archive, and a Tarball of the 1,743 files
in the SQLite 3.22.0 source tree:

  SQLite Archive10,754,048
  ZIP Archive (using Info-ZIP 3.0)10,662,365
  ZIP Archive (using zipfile)10,390,215
  Tarball&#x2007;9,781,109



An SQLite Archive supports only the Deflate compression
method.  Tarballs and ZIP Archive support a wider assortment of
compression methods.




4. Managing An SQLite Archive From The Command-Line


The recommended way of creating, updating, listing, and extracting
an SQLite Archive is to use the sqlite3.exe command-line shell 
for SQLite version 3.23.0 (2018-04-02) or later.  This CLI
supports the -A command-line option that allows easy management
of SQLite Archives.
The CLI for SQLite version 3.22.0 (2018-01-22) has the
.archive command for managing SQLite Archives, but that requires
interacting with the shell.


To list all of the files in an SQLite Archive named "example.sqlar"
using one of these commands:

sqlite3 example.sqlar -At
sqlite3 example.sqlar -Atv



To extract all files from an SQLite Archive named "example.sqlar":

sqlite3 example.sqlar -Ax



To create a new SQLite Archive named "alltxt.sqlar" containing all *.txt
files in the current directory:

sqlite3 alltxt.sqlar -Ac *.txt



To add or update files in an existing SQLite Archive:

sqlite3 example.sqlar -Au *.md



For usage hints and a summary of all options, simply give the CLI
the -A option with no additional arguments:

sqlite3 -A



All of these commands work the same way if the filename argument is
is a ZIP Archive instead of an SQLite database.

4.1. Other command-line tools


Just as there is the "zip" program to manage ZIP Archives, and the
"tar" program to manage Tarballs, the 
"sqlar" program exists to manage SQL Archives.
The "sqlar" program is able to create a new SQLite Archive, list the
content of an existing archive, add or remove files from the archive,
and/or extract files from the archive.
A separate "sqlarfs" program is able to mount the SQLite Archive as
a Fuse Filesystem.

5. Managing SQLite Archives From Application Code


Applications can easily read or write SQLite Archives by linking against
SQLite and including the 
ext/misc/sqlar.c extension
to handle the compression and decompression.  The sqlar.c extension
creates two new SQL functions.


sqlar_compress(X)

The sqlar_compress(X) function attempts to compress a copy of the
string or blob X using the Default algorithm and
returns the result as a blob.  If the input X is incompressible, then
a copy of X is returned.  This routine is used when inserting content
into an SQLite Archive.
sqlar_uncompress(Y,SZ)

The sqlar_uncompress(Y,SZ) function will undo the compression accomplished
by sqlar_compress(X).  The Y parameter is the compressed content (the output
from a prior call to sqlar_compress()) and SZ is the original uncompressed
size of the input X that generated Y.  If SZ is less than or equal to the
size of Y, that indicates that no compression occurred, and so
sqlar_uncompress(Y,SZ) returns a copy of Y.  Otherwise, sqlar_uncompress(Y,SZ)
runs the Inflate algorithm on Y to uncompress it and restore it to its
original form and returns the uncompressed content.
This routine is used when extracting content from an SQLite Archive.



Using the two routines above, it is simple for applications to insert
new records into or extract existing records from an SQLite Archive.
Insert a new into an SQLite Archive using code like this:

INSERT INTO sqlar(name,mode,mtime,sz,data)
 VALUES ($name,$mode,strftime('%s',$mtime),
         length($content),sqlar_compress($content));



Extract an entry from the SQLite Archive using code like this:

SELECT name, mode, datetime(mtime,'unixepoch'), sqlar_uncompress(data,sz)
  FROM sqlar
 WHERE ...;



The code above is for the general case.  For the special case of an
SQLite Archive that only stores uncompressed or uncompressible content
(this might come up, for example, in an SQLite Archive that stores only
JPEG, GIF, and/or PNG images) then the content can be inserted into
and extracted from the database without using the sqlar_compress()
and sqlar_uncompress() functions, and the sqlar.c extension is not
required.
This page last modified on  2020-12-02 18:42:06 UTCsqlar.html
*Û*¯%‚(       QÝm!The Lemon LALR(1) Parser Generator1. Overview

The SQL language parser for SQLite is generated using a code-generator
program called "Lemon".  The Lemon program reads a grammar of the input
language and emits C-code to implement a parser for that language.


1.1. Lemon Source Files And Documentation

Lemon does not have its own source repository.  Rather, Lemon consists
of a few files in the SQLite source tree:



     lemon.html &rarr;
     The original detailed usage documentation and programmers reference
     for Lemon.

     lemon.c &rarr; The source code
     for the utility program that reads a grammar file and generates 
     corresponding parser C-code.

     lempar.c &rarr; A template
     for the generated parser C-code.  The "lemon" utility program reads this
     template and inserts additional code in order to generate a parser.


2. Advantages of Lemon

Lemon generates an LALR(1) parser.  Its operation is similar to the
more familiar tools Yacc and
Bison, but Lemon adds important
improvements, including:



     The grammar syntax is less error prone - using symbolic names for
     semantic values rather that the "$1"-style positional notation
     of Yacc.

     In Lemon, the tokenizer calls the parser.  Yacc operates the other
     way around, with the parser calling the tokenizer.  The Lemon
     approach is reentrant and threadsafe, whereas Yacc uses global 
     variables and is therefore neither.  Reentrancy is especially
     important for SQLite since some SQL statements make recursive calls
     to the parser.  For example, when parsing a CREATE TABLE statement,
     SQLite invokes the parser recursively to generate an INSERT statement
     to make a new entry in the sqlite_schema table.

     Lemon has the concept of a non-terminal destructor that can be
     used to reclaim memory or other resources following a syntax error
     or other aborted parse.


2.1. Use of Lemon Within SQLite

Lemon  ΂'
5›g!SQLite Archive Files1. Introduction


An "SQLite Archive" is a file container similar to a 
ZIP archive or
Tarball but
based on an SQLite database.


An SQLite Archive is an ordinary SQLite database file that contains the
following table as part of its schema:

CREATE TABLE sqlar(
  name TEXT PRIMARY KEY,  -- name of the file
  mode INT,               -- access permissions
  mtime INT,              -- last modification time
  sz INT,                 -- original file size
  data BLOB               -- compressed content
);



Each row of the SQLAR table holds the content of a single file.
The filename (the full pathname relative to the root of the archive)
is in the "name" field.
The "mode" field is an integer which is the unix-style access permissions
for the file.  "mtime" is the modification time of the file in seconds
since 1970.  "sz" is the original uncompressed size of the file.
The "data" field contains the file content.  The content is usually
compressed using Deflate, though not always.  If the
"sz" field is equal to the size of the "data" field, then the content
is stored uncompressed.



1.1. Database As Container Object


An SQLite Archive is one example of a more general
idea that an SQLite database can behave as a container object holding
lots of smaller data components.


With client/server databases like PostgreSQL or Oracle, users and
developers tend to think of the database as a service or a "node", not
as an object.  This is because the database content is spread out across
multiple files on the server, or possibly across multiple servers in a
service cluster.  One cannot point to a single file or even a single
directory and say "this is the database".


SQLite, in contrast, stores all content in a single file on disk.
That single file is something you can point is used in two places in SQLite.

The primary use of Lemon is to create the SQL language parser.
A grammar file (parse.y) is
compiled by Lemon into parse.c and parse.h.  The parse.c file is
incorporated into the amalgamation without further modification.

Lemon is also used to generate the parser for the query pattern
expressions in the FTS5 extension.  In this case, the input grammar
file is fts5parse.y.

2.2. Lemon Customizations Especially For SQLite

One of the advantages of hosting code generator tools as part of
the project is that the tools can be optimized to serve specific needs of
the overall project.  Lemon has benefited from this effect. Over the years,
the Lemon parser generator has been extended and enhanced to provide
new capabilities and improved performance to SQLite.  A few of the
specific enhancements to Lemon that are specifically designed for use
by SQLite include:



Lemon has the concept of a "fallback" token.
The SQL language contains a large number of keywords and these keywords
have the potential to collide with identifier names.
Lemon has the ability to designate some keywords as being able to
"fallback" to an identifier.  If the keyword appears in the input token
stream in a context that would otherwise be a syntax error, the token
is automatically transformed into its fallback before the syntax error
is raised.  This feature allows the parser to be very forgiving of
reserved words used as identifiers, which is a problem that comes up
frequently in the SQL language.


In support of the 100% MC/DC testing goal for SQLite, 
the parser code generated by Lemon has no unreachable branches,
and contains extra (compile-time selected) instrumentation useful
for measuring test coverage.


Lemon supports conditional compilation of grammar file rules, so that
a different parser can be generated depending on compile-time options.


As a performance optimization, reduce actions in the Lemon input grammar
are allowed to contain comments of the form "/*A-overwrites-Z*/" to indicate
that the semantic value "A" on the right-hand side of the rule is allowed
to directly overwrite the semantic value "Z" on the left-hand side.
This simple optimization reduces the number of stack operations in the
push-down automaton used to parse the input grammar, and thus improve
performance of the parser.  It also makes the generated code a little smaller.


The parsing of SQL statements is a significant consumer of CPU cycles 
in any SQL database engine.  On-going efforts to optimize SQLite have caused
the developers to spend a lot of time tweaking Lemon to generate faster
parsers.  These efforts have benefited all users of the Lemon parser generator,
not just SQLite.  But if Lemon had been a separately maintained tool, it
would have been more difficult to make coordinated changes to both SQLite
and Lemon, and as a result not as much optimization would have been
accomplished.  Hence, the fact that the parser generator tool is included
in the source tree for SQLite has turned out to be a net benefit for both
the tool itself and for SQLite.

3. History Of Lemon

Lemon was originally written by D. Richard Hipp (also the creator of SQLite)
while he was in graduate school at Duke University between 1987 and 1992.
The original creation date of Lemon has been lost, but was probably sometime
around 1990.  Lemon generates an LALR(1) parser.  There was a companion 
LL(1) parser generator tool named "Lime", but the source code for Lime
has been lost.

The Lemon source code was originally written as separate source files,
and only later merged into a single "lemon.c" source file.

The author of Lemon and SQLite (Hipp) reports that his C programming
skills were greatly enhanced by studying John Ousterhout's original
source code to Tcl.  Hipp discovered and studied Tcl in 1993.  Lemon
was written before then, and SQLite afterwards.  There is a clear
difference in the coding styles of these two products, with SQLite seeming
to be cleaner, more readable, and easier to maintain.
This page last modified on  2021-08-21 20:50:48 UTClemon.htmlhe string ":memory:".  For
example:


rc = sqlite3_open(":memory:", &amp;db);


When this is done, no disk file is opened.  
Instead, a new database is created
purely in memory.  The database ceases to exist as soon as the database
connection is closed.  Every :memory: database is distinct from every
other.  So, opening two database connections each with the filename
":memory:" will create two independent in-memory databases.

The special filename ":memory:" can be used anywhere that a database
filename is permitted.  For example, it can be used as the
filename in an ATTACH command:


ATTACH DATABASE ':memory:' AS aux1;


Note that in order for the special ":memory:" name to apply and to
create a pure in-memory database, there must be no additional text in the
filename.  Thus, a disk-based database can be created in a file by prepending
a pathname, like this:  "./:memory:".

The special ":memory:" filename also works when using URI filenames.
For example:


rc = sqlite3_open("file::memory:", &amp;db);


Or,


ATTACH DATABASE 'file::memory:' AS aux1;




In-memory Databases And Shared Cache

In-memory databases are allowed to use shared cache if they are
opened using a URI filename.  If the unadorned ":memory:" name is used
to specify the in-memory database, then that database always has a private
cache and is only visible to the database connection that originally
opened it.  However, the same in-memory database can be opened by two or
more database connections as follows:


rc = sqlite3_open("file::memory:?cache=shared", &amp;db);


Or,


ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;


This allows separate database connections to share the same
in-memory database.  Of course, all database connections sharing the
in-memory database need to be in the same process.  The database is
automatically deleted and memory is reclaimed when the last connection
to the database closes.

If two or more distinct but shareable in-memory databases are needed
in a single process, then the mode=memory query parameter can
be used with a URI filename to create a named in-memory database:


rc = sqlite3_open("file:memdb1?mode=memory&amp;cache=shared", &amp;db);


Or,


ATTACH DATABASE 'file:memdb1?mode=memory&amp;cache=shared' AS aux1;


When an in-memory database is named in this way, it will only share its
cache with another connection that uses exactly the same name.





Temporary Databases

When the name of the database file handed to sqlite3_open() or to
ATTACH is an empty string, then a new temporary file is created to hold
the database.


rc = sqlite3_open("", &amp;db);



ATTACH DATABASE '' AS aux2;


A different temporary file is created each time so that, just as
with the special ":memory:" string, two database connections to temporary
databases each have their own private database.  Temporary databases are
automatically deleted when the connection that created them closes.

Even though a disk file is allocated for each temporary database, in
practice the temporary database usually resides in the in-memory pager cache
and hence there is very little difference between a pure in-memory database
created by ":memory:" and a temporary database created by an empty filename.
The sole difference is that a ":memory:" database must remain in memory
at all times whereas parts of a temporary database might be flushed to disk
if the database becomes large or if SQLite comes under memory pressure.

The previous paragraphs describe the behavior of temporary databases
under the default SQLite configuration.  An application can use the
temp_store pragma and the SQLITE_TEMP_STORE compile-time parameter to
force temporary databases to behave as pure in-memory databases, if desired.

This page last modified on  2022-01-20 21:38:08 UTCinmemorydb.html
KKÅ4‚*
1Š+SQLite Pro SupportProfessional Support &amp; Extension Products




Support
(details below)



1.Public Forum. 
  Help and advice from a world-wide community of experts.

Free
More Info
Recent Posts

2.Annual Maintenance Subscription. 
  Private, expert email advice from the developers of SQLite.

$1500/year
More Info
Purchase

3.Technical Support. 
  High-priority email and phone support directly from the SQLite developers.
  Guaranteed response time available as an option.

$8K-85K/year
More Info
Request A Quote

4.SQLite Consortium Membership. 
  Premium enterprise support including on-site visits and
  access to all proprietary extensions and test suites.

$120K/year
More Info
#¡=‚)        3Â1+In-Memory DatabasesIn-Memory Databases

An SQLite database is normally stored in a single ordinary disk
file. However, in certain circumstances, the database might be stored in
memory.

The most common way to force an SQLite database to exist purely 
in memory is to open the database using the special filename
":memory:".  In other words, instead of passing the name of
a real disk file into one of the sqlite3_open(), sqlite3_open16(), or
sqlite3_open_v2() functions, pass in t!$Request A Quote





Public Forum. 
  Help and advice from a world-wide community of experts.

Cost: Free
More Info
Recent Posts


Annual Maintenance Subscription. 
  Private, expert email advice from the developers of SQLite.

Cost: $1500/year
More Info
Purchase


Technical Support. 
  High-priority email and phone support directly from the SQLite developers.
  Guaranteed response time available as an option.

Cost: $8K-85K/year
More Info
Request A Quote


SQLite Consortium Membership. 
  Premium enterprise support including on-site visits and
  access to all proprietary extensions and test suites.

Cost: $120K/year
More Info
Request A Quote




Licenses
(details below)



5.SQLite License. 
  Warranty of title and perpetual right-to-use for the SQLite source code. 

$6000 one time fee
More Info
Purchase

6.SQLite Encryption Extension (SEE). 
   A drop-in replacement for public-domain SQLite source code that has 
   the added ability to read/write AES-encrypted databases. 

$2000 one time fee
More Info
Purchase

7.Compressed And Encrypted Read-Only Database (CEROD). 
   A drop-in replacement for public-domain SQLite source code
   that has the added ability to read database that has been both 
   compressed and encrypted. 

$2000 one time fee
More Info
Buy Now!

8.The ZIPVFS Read/Write Compressed Database Extension. 
   The ZIPVFS extension automatically compresses and encrypts
   your data as it is written to disk, and decompressed and decrypts
   it while reading.

$4000 one time fee
More Info
Buy Now!





SQLite License. 
  Warranty of title and perpetual right-to-use for the SQLite source code. 

Cost: $6000 one time fee
More Info
Purchase


SQLite Encryption Extension (SEE). 
   A drop-in replacement for public-domain SQLite source code that has 
   the added ability to read/write AES-encrypted databases. 

Cost: $2000 one time fee
More Info
Purchase


Compressed And Encrypted Read-Only Database (CEROD). 
   A drop-in replacement for public-domain SQLite source code
   that has the added ability to read database that has been both 
   compressed and encrypted. 

Cost: $2000 one time fee
More Info
Buy Now!


The ZIPVFS Read/Write Compressed Database Extension. 
   The ZIPVFS extension automatically compresses and encrypts
   your data as it is written to disk, and decompressed and decrypts
   it while reading.

Cost: $4000 one time fee
More Info
Buy Now!




Special Services
(details below)



9.TH3 Testing Support. 
  The TH3 test harness
  is an aviation-grade test suite for SQLite. SQLite developers 
  can run TH3 on specialized hardware and/or using specialized
  compile-time options, according to customer specification, 
  either remotely or on customer premises. Pricing for this 
  services is on a case-by-case basis depending on requirements.

call
More Info
Request A Quote





TH3 Testing Support. 
  The TH3 test harness
  is an aviation-grade test suite for SQLite. SQLite developers 
  can run TH3 on specialized hardware and/or using specialized
  compile-time options, according to customer specification, 
  either remotely or on customer premises. Pricing for this 
  services is on a case-by-case basis depending on requirements.

Cost: call
More Info
Request A Quote





Further Information

SQLite is free and works great.
Most people use SQLite without
any kind of license or support.

Free support for SQLite is available on the public
SQLite Forum.
The forum is monitored by a large
community of experts, including the core SQLite development team,
who are able to resolve just about
any problems with SQLite that you are likely to have.

If you do not want to discuss your issues on a public and open forum, an
Annual Maintenance 
Subscription or "AMS" might
serve your needs better.
An AMS entitles you to private email support directly from the developers of
SQLite.  The level of support with an AMS is similar to the support one
gets from the public forum except that an AMS includes a unilateral 
promise of non-disclosure, so with an AMS you can discuss your issues
with the SQLite developers in private, without the whole world watching.
An AMS costs $1500 per year.

Users with more advanced support needs can opt for a
Technical Support
Agreement.
Technical support agreements are customized to the needs of each
individual client, but generally include direct telephone support
and priority handling of issues and bugs.  Guaranteed response time
is available as an option.  The cost of
technical support varies but is generally
in the range of $8000 to $35000 per year.

If SQLite is "mission critical" to your company, then you may
want to become an 
SQLite Consortium 
Member.  The SQLite
Consortium is a collaboration of companies who sponsor ongoing development
of SQLite in exchange for enterprise-level technical support, on-site
visits from the SQLite developers, unlimited access to all licensed
products, and strong guarantees that SQLite will remain in the public
domain, free and independent, and will not come under the control of
a competitor.


Software Licenses

The SQLite source code is in the 
public domain,
and is free for use
by anyone and for any purpose.  No license is required.  However, some
users desire a license so that they can have warranty of title, or just
because their company lawyers say they need one.  A
perpetual license
and warranty of title
for the core SQLite source code is available for this purpose.

The 
SQLite Encryption
Extension (SEE),
the ZIPVFS Extension,
and the Compressed and
Encrypted ReadOnly Database (CEROD) extension are enhanced versions 
of SQLite that handle encrypted
and/or compressed databases.  SEE can read and write encrypted databases.
SEE encrypts all database content, including metadata, so that the database
file appears as white noise.  ZIPVFS 
compresses the database on-the-fly using application-supplied 
compression and decompression functions.
CEROD reads a compressed database that is
also optionally encrypted.  All of SEE, ZIPVFS, and CEROD are 
supplied in source code form only; the licensee is responsible for 
compiling the products for their chosen platform.  It is not difficult 
to compile any of these extension.  All products come in the form of an
amalgamated source file
named "sqlite3.c".  So compiling SEE, ZIPVFS, or CEROD into an application 
is simply a matter of substituting the SEE-, ZIPVFS-, or CEROD-enabled sqlite3.c 
source file in place of the public-domain sqlite3.c source file and recompiling.
Licenses for SEE, ZIPVFS, and CEROD are perpetual.
All three extension can read and write ordinary,
uncompressed and unencrypted database files.


Testing Services

The Test Harness #3 (TH3) is 
a suite of test cases for SQLite that provide 100% branch test coverage
(and 100% modified condition/decision coverage) for the core SQLite in
an as-deployed configuration using only published and documented interfaces.
TH3 is designed for use with embedded devices, and is compatible with
DO-178B.  Every release of the public-domain SQLite is tested using TH3,
and so all users benefit from the TH3 tests.  But the TH3 tests are not
themselves public.  Hardware or system manufactures who want to have
TH3 test run on their systems can negotiate a service agreement to have
the SQLite Developers run those tests.

About The SQLite Team

Paid support options and products are provided by
Hipp, Wyrick &amp; Company, Inc., (Hwaci), a 
Georgia
corporation 
with headquarters in

Charlotte, North Carolina and has been in business since
1992.
Hwaci has an international team of
employees and associates representing the best available talent.  
We are a 100% engineering company.  There is
no sales staff.
Our goal is to provide outstanding service and honest advice
without spin or sales-talk.

Hwaci is a small company but it is
also closely held and debt-free and has low
fixed costs, which means that it is largely immune to buy-outs,
take-overs, and market down-turns.  Hwaci intends to 
continue operating in its current form, and at roughly its current 
size until at least the year 2050.
We expect to be here when you need us,
even if that need is many years in the future.prosupport.html&elf,
of course, and as of this writing (2015) it handles about 400K to 500K
HTTP requests per day, about 15-20% of which are dynamic pages touching
the database.  Dynamic content uses about 200 SQL statements per webpage.
This setup runs on a single VM that shares a physical server with 23 others
and yet still keeps the load average below 0.1 most of the time.

See also: Hacker New discussion from 2022-12-13.


Data analysis


People who understand SQL can employ the 
sqlite3 command-line shell (or various third-party
SQLite access programs) to analyze large
datasets. Raw data can be imported from CSV files, then that
data can be sliced and diced to generate a myriad of summary
reports.  More complex analysis can be done using simple scripts written
in Tcl or Python (both of which come with SQLite built-in) or in R or
other languages using readily available adaptors.
Possible uses include website log analysis, sports
statistics analysis, compilation of programming metrics, and
analysis of experimental results.  Many bioinformatics researchers
use SQLite in this way.



The same thing can be done with an enterprise client/server
database, of course.  The advantage of SQLite is
that it is easier to install and use and the resulting database 
is a single file that can be written to a USB memory stick
or emailed to a colleague.



Cache for enterprise data


Many applications use SQLite as a cache of relevant content from
an enterprise RDBMS.
This reduces latency, since most queries now occur against the local
cache and avoid a network round-trip.  It also reduces the load 
on the network and on the central database server.  And in many cases, 
it means that the client-side application can continue operating during
network outages.





Server-side database


Systems designers
report success using SQLite as a data store on server applications
running in the datacenter, or in other words, using SQLite as the underlying
storage engine for an application-specific database server.

With this pattern, the overall system is still client/server:
clients send requests to the server and get back replies over the network.
But instead of sending generic SQL and getting back raw table content, 
the client requests and server responses are high-level and 
application-specific.
The server translates requests into multiple SQL queries, gathers the
results, does post-processing, filtering, and analysis, then constructs
a high-level reply containing only the essential information.

Developers report that SQLite is often faster than a client/server
SQL database engine in this scenario.
Database requests are serialized by the server, so concurrency is not
an issue.  Concurrency is also improved by "database sharding":
using separate database files for different subdomains.  For
example, the server might have a separate SQLite database for each
user, so that the server can handle hundreds or thousands of simultaneous
connections, but each SQLite database is only used by one connection.




Data transfer format

Because an SQLite database is a single compact file in a
well-defined cross-platform format, it is often used
as a container for transferring content from one system to another.
The sender gathers content into an SQLite database file, transfers
that one file to the receiver, then the receiver uses SQL to extract
the content as needed.

An SQLite database facilitates data transfer between systems even
when the endpoints have different word sizes and/or byte orders.
The data can be a complex mix of large binary blobs, text, and small
numeric or boolean values.  The data format can be easily extended
by adding new tables and/or columns, without breaking legacy receivers.
The SQL query language means that receivers are not required to parse
the entire transfer all at once, but can instead query the
received content as needed.  The data format is "transparent" in the
sense that it is easily decoded for human viewing using 
a variety of universally available, open-source tools, from multiple
vendors.




File archive and/or data container
'

The SQLite Archive idea shows how
SQLite can be used as a substitute for ZIP archives or Tarballs.
An archive of files stored in SQLite is only very slightly larger, and
in some cases actually smaller, than the equivalent ZIP archive.
And an SQLite archive features incremental and atomic updating
and the ability to store much richer metadata.


Fossil version 2.5 and later offers
SQLite Archive files as a download format, in addition
to traditional tarball and ZIP archive.
The sqlite3.exe command-line shell version 3.22.0 and later will create,
list, or unpack an SQL archiving using the 
.archive command.


SQLite is a good solution for any situation that requires bundling
diverse content into a self-contained and self-describing package 
for shipment across a network.
Content is encoded in a 
well-defined, cross-platform, and stable file format.
The encoding is efficient, and receivers can extract small subsets
of the content without having to read and parse the entire file.


SQL archives are useful as the distribution format for software
or content updates that are broadcast to many clients.  Variations
on this idea are used, for example, to transmit TV programming guides
to set-top boxes and to send over-the-air updates to vehicle navigation
systems.


Replacement for ad hoc disk files

Many programs use 
fopen(),
fread(), and 
fwrite() to create and
manage files of data in home-grown formats.  SQLite works 
particularly well as a
replacement for these ad hoc data files.
Contrary to intuition, SQLite can be faster than the filesystem
for reading and writing content to disk.


Internal or temporary databases


For programs that have a lot of data that must be sifted and sorted
in diverse ways, it is often easier and quicker to load the data into
an in-memory SQLite database and use queries with joins and ORDER BY
clauses to extract the data in the form and order needed rather than
to try to code the same operations manually.
Using an SQL database internally in this way also gives the program
greater flexibility since new columns and indices can be added without
having to recode every query.



Stand-in for an enterprise database during demos or testing


Client applications typically use a generic database interface that allows
connections to various SQL database engines.  It makes good sense to 
include SQLite in the mix of supported databases and to statically
link the SQLite engine in with the client.  That way the client program
can be used standalone with an SQLite data file for testing or for
demonstrations.



Education and Training


Because it is simple to setup and use (installation is trivial: just
copy the sqlite3 or sqlite3.exe executable to the target machine
and run it) SQLite makes a good database engine for use in teaching SQL.
Students can easily create as many databases as they like and can
email databases to the instructor for comments or grading.  For more
advanced students who are interested in studying how an RDBMS is
implemented, the modular and well-commented and documented SQLite code
can serve as a good basis.



Experimental SQL language extensions

The simple, modular design of SQLite makes it a good platform for
prototyping new, experimental database language features or ideas.






Situations Where A Client/Server RDBMS May Work Better


Client/Server Applications

If there are many client programs sending SQL to the same 
database over a network, then use a client/server database
engine instead of SQLite.  SQLite will work over a network filesystem,
but because of the latency associated with most network filesystems,
performance will not be great.  Also, file locking logic is buggy in
many network filesystem implementations (on both Unix and Windows).
If file locking does not work correctly,
two or more clients might try to modify the
same part of the same database at the same time, resulting in 
corruption.  Because this problem results from bugs in
the underlying filesystem implementation, there is nothing SQLite
can do to prevent it.

A good rule of thumb is to avoid using SQLite
in situations where the same database will be accessed directly
(without an intervening application server) and simultaneously
from many computers over a network.


High-volume Websites

SQLite will normally work fine as the database backend to a website.
But if the website is write-intensive or is so busy that it requires
multiple servers, then consider using an enterprise-class client/server 
database engine instead of SQLite.


Very large datasets

An SQLite database is limited in size to 281 terabytes 
(248 bytes, 256 tibibytes).
And even if it could handle larger databases, SQLite stores the entire
database in a single disk file and many filesystems limit the maximum
size of files to something less than this.  So if you are contemplating
databases of this magnitude, you would do well to consider using a
client/server database engine that spreads its content across multiple
disk files, and perhaps across multiple volumes.



High Concurrency


SQLite supports an unlimited number of simultaneous readers, but it 
will only allow one writer at any instant in time.
For many situations, this is not a problem.  Writers queue up. Each application
does its database work quickly and moves on, and no lock lasts for more
than a few dozen milliseconds. But there are some applications that require
more concurrency, and those applications may need to seek a different
solution.







Checklist For Choosing The Right Database Engine


Is the data separated from the application by a network?
       &rarr; choose client/server

Relational database engines act as bandwidth-reducing data filters.
So it is best to keep the database engine and the data on
the same physical device so that the high-bandwidth engine-to-disk
link does not have to traverse the network, only the lower-bandwidth
application-to-engine link.

But SQLite is built into the application.  So if the data is on a
separate device from the application, it is required that the higher
bandwidth engine-to-disk link be across the network.  This works, but
it is suboptimal.  Hence, it is usually better to select a client/server
database engine when the data is on a separate device from the
application.

Nota Bene:
In this rule, "application" means the code that issues SQL statements.
If the "application" is an application server and
if the content resides on the same physical machine as the application server,
then SQLite might still be appropriate even though the end user is
another network hop away.


Many concurrent writers? &rarr; choose client/server

If many threads and/or processes need to write the
database at the same instant (and they cannot queue up and take turns)
then it is best to select a database engine that supports that
capability, which always means a client/server database engine.

SQLite only supports one writer at a time per database file.
But in most cases, a write transaction only takes milliseconds and
so multiple writers can simply take turns.  SQLite will handle
more write concurrency than many people suspect.  Nevertheless,
client/server database systems, because they have a long-running
server process at hand to coordinate access, can usually handle 
far more write concurrency than SQLite ever will.


Big data? &rarr; choose client/server

If your data will grow to a size that you are uncomfortable
or unable to fit into a single disk file, then you should select
a solution other than SQLite.  SQLite supports databases up to
281 terabytes in size, assuming you can find a disk drive and filesystem
that will support 281-terabyte files.  Even so, when the size of the
content looks like it might creep into the terabyte range, it would
be good to consider a centralized client/server database.


Otherwise &rarr; choose SQLite!

For device-local storage with low writer concurrency and less than a
terabyte of content, SQLite is almost always a better solution.  SQLite
is fast and reliable and it requires no configuration or maintenance.
It keeps things simple.  SQLite "just works".


This page last modified on  2022-12-14 16:04:04 UTCwhentouse.html
ÂÂö*‚+
Cë{)Appropriate Uses For SQLiteAppropriate Uses For SQLite


SQLite is not directly comparable to client/server SQL database engines such
as MySQL, Oracle, PostgreSQL, or SQL Server since SQLite is trying to
solve a different problem.



Client/server SQL database engines strive to implement a shared repository
of enterprise data.  They emphasize scalability, concurrency, centralization,
and control.
SQLite strives to provide local data storage for
individual applications and devices.  SQLite emphasizes economy,
efficiency, reliability, independence, and simplicity.




SQLite does not compete with client/server databases.
SQLite competes with fopen().


Situations Where SQLite Works Well





Embedded devices and the internet of things

Because an SQLite database requires no administration,
it works well in devices that must operate without expert human support.
SQLite is a good fit for use in 
cellphones, set-top boxes, televisions, game consoles,
cameras, watches, kitchen appliances, thermostats, automobiles, 
machine tools, airplanes, remote sensors, drones, medical devices,
and robots:  the "internet of things".


Client/server database engines are designed to live inside a
lovingly-attended datacenter at the core of the network.
SQLite works there too, but SQLite also thrives at the edge of the network,
fending for itself while providing fast and
reliable data services to applications that would otherwise
have dodgy connectivity.


Application file format


SQLite is often used as the on-disk file format
for desktop applications such as version control systems,
financial analysis tools, media cataloging and editing suites, CAD
packages, record keeping programs, and so forth.  The traditional
File/Open operation calls sqlite3_open() to attach to the database
file.  Updates happen automatically as application content is revised
so the File/Save menu option becomes superfluous.  The File/Save_As
menu option can be implemented using the backup API.


There are many benefits to this approach, including improved
performance, reduced cost and complexity, and
improved reliability.  See technical notes
"aff_short.html" and 
"appfileformat.html" and
"fasterthanfs.html" for more information.
This use case is closely related to the
data transfer format and
data container use cases below.




Websites

SQLite works great as the database engine for most low to
medium traffic websites (which is to say, most websites).
The amount of web traffic that SQLite can handle depends
on how heavily the website uses its database.  Generally
speaking, any site that gets fewer than 100K hits/day should work
fine with SQLite.
The 100K hits/day figure is a conservative estimate, not a
hard upper bound.
SQLite has been demonstrated to work with 10 times that amount
of traffic.

The SQLite website (https://www.sqlite.org/) uses SQLite its%*connection at the same
      time.
  There is now a compile-time option that allows an application to
      define alternative malloc()/free() implementations without having
      to modify any core SQLite code.
  There is now a compile-time option that allows an application to
      define alternative mutex implementations without having
      to modify any core SQLite code.
  


  Of these changes, only 1a and 2a through 2c are incompatibilities
  in any formal sense.
  But users who have previously made custom modifications to the
  SQLite source (for example to add a custom OS layer for embedded
  hardware) might find that these changes have a larger impact.
  On the other hand, an important goal of these changes is to make
  it much easier to customize SQLite for use on different operating
  systems. 

2.0 The OS Interface Layer
  If your system defines a custom OS interface for SQLite or if you
  were using the undocumented sqlite3_os_switch()
  interface, then you will need to make modifications in order to
  upgrade to SQLite version 3.5.0.  This may seem painful at first
  glance.  But as you look more closely, you will probably discover
  that your changes are made smaller and easier to understand and manage
  by the new SQLite interface.  It is likely that your changes will
  now also work seamlessly with the SQLite amalgamation.  You will
  no longer need to make any changes to the code SQLite source code.
  All of your changes can be effected by application code and you can
  link against a standard, unmodified version of the SQLite amalgamation.
  Furthermore, the OS interface layer, which was formerly undocumented,
  is now an officially support interface for SQLite.  So you have
  some assurance that this will be a one-time change and that your
  new backend will continue to work in future versions of SQLite.

2.1 The Virtual File System Object
  The new OS interface for SQLite is built around an object named
  sqlite3_vfs.  The "vfs" stands for "Virtual File System".
  The sqlite3_vfs object is basically a structure containing pointers
  to functions that implement the primitive disk I/O operations that
  SQLite needs to perform in order to read and write databases.  
  In this article, we will often refer to an sqlite3_vfs objects as a "VFS".


  SQLite is able to use multiple VFSes at the same time.  Each
  individual database connection is associated with just one VFS.
  But if you have multiple database connections, each connection
  can be associated with a different VFS.


  There is always a default VFS.
  The legacy interfaces sqlite3_open() and sqlite3_open16() always
  use the default VFS.
  The new interface for creating database connections,
  sqlite3_open_v2(), allows you to specify which VFS you want to
  use by name.

2.1.1 Registering New VFS Objects
  Standard builds of SQLite for Unix or Windows come with a single
  VFS named "unix" or "win32", as appropriate.  This one VFS is also 
  the default.  So if you are using the legacy open functions, everything
  will continue to operate as it has before.  The change is that an application
  now has the flexibility of adding new VFS modules to implement a
  customized OS layer.  The sqlite3_vfs_register() API can be used
  to tell SQLite about one or more application-defined VFS modules:


int sqlite3_vfs_register(sqlite3_vfs*, int makeDflt);

  Applications can call sqlite3_vfs_register() at any time, though of course
  a VFS needs to be registered before it can be used.  The first argument
  is a pointer to a customized VFS object that the application has prepared.
  The second argument is true to make the new VFS the default VFS so that
  it will be used by the legacy sqlite3_open() and sqlite3_open16() APIs.
  If the new VFS is not the default, then you will probably have to use
  the new sqlite3_open_v2() API to use it.  Note, however, that if
  a new VFS is the only VFS known to SQLite (if SQLite was compiled without
  its usual default VFS or if the precompiled default VFS was removed
  using sqlite3_vfs_unregister()) then the new +VFS automatically becomes the
  default VFS regardless of the makeDflt argument to sqlite3_vfs_register().


  Standard builds include the default "unix" or "win32" VFSes.
  But if you use the -DOS_OTHER=1 compile-time option, then SQLite is
  built without a default VFS.  In that case, the application must
  register at least one VFS prior to calling sqlite3_open().
  This is the approach that embedded applications should use.
  Rather than modifying the SQLite source to insert an alternative
  OS layer as was done in prior releases of SQLite, instead compile
  an unmodified SQLite source file (preferably the amalgamation)
  with the -DOS_OTHER=1 option, then invoke sqlite3_vfs_register()
  to define the interface to the underlying filesystem prior to
  creating any database connections.

2.1.2 Additional Control Over VFS Objects
  The sqlite3_vfs_unregister() API is used to remove an existing
  VFS from the system.


int sqlite3_vfs_unregister(sqlite3_vfs*);

  The sqlite3_vfs_find() API is used to locate a particular VFS
  by name.  Its prototype is as follows:


sqlite3_vfs *sqlite3_vfs_find(const char *zVfsName);

  The argument is the symbolic name for the desired VFS.  If the
  argument is a NULL pointer, then the default VFS is returned.
  The function returns a pointer to the sqlite3_vfs object that
  implements the VFS.  Or it returns a NULL pointer if no object
  could be found that matched the search criteria.

2.1.3 Modifications Of Existing VFSes
  Once a VFS has been registered, it should never be modified.  If
  a change in behavior is required, a new VFS should be registered.
  The application could, perhaps, use sqlite3_vfs_find() to locate
  the old VFS, make a copy of the old VFS into a new sqlite3_vfs
  object, make the desired modifications to the new VFS, unregister
  the old VFS, then register the new VFS in its place.  Existing
  database connections would continue to use the old VFS even after
  it is unregistered, but new database connections would use the
  new VFS.

2.1.4 The VFS Object
  A VFS object is an instance of the following structure:


typedef struct sqlite3_vfs sqlite3_vfs;
struct sqlite3_vfs {
  int iVersion;            /* Structure version number */
  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 (*xGetTempName)(sqlite3_vfs*, char *zOut);
  int (*xFullPathname)(sqlite3_vfs*, const char *zName, 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 (*xDlClose)(sqlite3_vfs*, void*);
  int (*xRandomness)(sqlite3_vfs*, int nByte, char *zOut);
  int (*xSleep)(sqlite3_vfs*, int microseconds);
  int (*xCurrentTime)(sqlite3_vfs*, double*);
  /* New fields may be appended in figure versions.  The iVersion
  ** value will increment whenever this happens. */
};

  To create a new VFS, an application fills in an instance of this
  structure with appropriate values and then calls sqlite3_vfs_register().


  The iVersion field of sqlite3_vfs should be 1 for SQLite version 3.5.0.
  This number may increase in future versions of SQLite if we have to
  modify the VFS object in some way.  We hope that this never happens,
  but the provision is made in case it does.


  The szOsFile field is the size in bytes of the structure that defines
  an open file: the sqlite3_file object.  This object will be described
  more fully below.  The point here is that each VFS implementation can
  define its own sqlite3_file object containing whatever information
  the VFS i,mplementation needs to store about an open file.  SQLite needs
  to know how big this object is, however, in order to preallocate enough
  space to hold it.


  The mxPathname field is the maximum length of a file pathname that
  this VFS can use.  SQLite sometimes has to preallocate buffers of
  this size, so it should be as small as reasonably possible.  Some
  filesystems permit huge pathnames, but in practice pathnames rarely
  extend beyond 100 bytes or so.  You do not have to put the longest
  pathname that the underlying filesystem can handle here.  You only
  have to put the longest pathname that you want SQLite to be able to
  handle.  A few hundred is a good value in most cases.


  The pNext field is used internally by SQLite.  Specifically, SQLite
  uses this field to form a linked list of registered VFSes.


  The zName field is the symbolic name of the VFS.  This is the name 
  that the sqlite3_vfs_find() compares against when it is looking for
  a VFS.


  The pAppData pointer is unused by the SQLite core.  The pointer is
  available to store auxiliary information that a VFS information might
  want to carry around.


  The remaining fields of the sqlite3_vfs object all store pointers
  to functions that implement primitive operations.  We call these
  "methods".  The first method, xOpen, is used to open files on
  the underlying storage media.  The result is an sqlite3_file
  object.  There are additional methods, defined by the sqlite3_file
  object itself that are used to read and write and close the file.
  The additional methods are detailed below.  The filename is in UTF-8.
  SQLite will guarantee that the zFilename string passed to
  xOpen() is a full pathname as generated by xFullPathname() and
  that the string will be valid and unchanged until xClose() is
  called.  So the sqlite3_file can store a pointer to the
   filename if it needs to remember the filename for some reason.
   The flags argument to xOpen() is a copy of the flags argument
   to sqlite3_open_v2().  If sqlite3_open() or sqlite3_open16()
   is used, then flags is 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_SUPER_JOURNAL
   
   The file I/O implementation can use the object type flags to
   changes 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 are
   also a no-op.  Any attempt to read the journal returns SQLITE_IOERR.
   Or the implementation might recognize the 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.  This will always be set for TEMP 
   databases and journals and for subjournals.  The 
   SQLITE_OPEN_EXCLUSIVE flag means the file should be opened
   for exclusive access.  This flag is set for all files except
   for the main database file.
   The sqlite3_file structure passed as the third argument to
   xOpen is allocated by the caller.  xOpen just fills it in.  The
   caller allocates a minimum of szOsFile bytes for the sqlite3_file
   structure.


  The differences between an SQLITE_OPEN_TEMP_DB database and an
  SQLITE_OPEN_TRANSIENT_DB database is this:  The SQLITE_OPEN_TEMP_DB
  is used for explicitly declared and named TEMP tables (using the
  CREATE TEMP TABLE syntax) or for named tables in a temporary database
  that is created- by opening a database with a filename that is an empty
  string.  An SQLITE_OPEN_TRANSIENT_DB holds a database table that
  SQLite creates automatically in order to evaluate a subquery or
  ORDER BY or GROUP BY clause.  Both TEMP_DB and TRANSIENT_DB databases
  are private and are deleted automatically.  TEMP_DB databases last
  for the duration of the database connection.  TRANSIENT_DB databases
  last only for the duration of a single SQL statement.


  The xDelete method is used to delete a file.  The name of the file is
  given in the second parameter.  The filename will be in UTF-8.
  The VFS must convert the filename into whatever character representation
  the underlying operating system expects.  If the syncDir parameter is
  true, then the xDelete method should not return until the change
  to the directory contents for the directory containing the
  deleted file have been synced to disk in order to ensure that the
  file does not "reappear" if a power failure occurs soon after.


  The xAccess method is used to check for access permissions on a file.
  The filename will be UTF-8 encoded.  The flags argument will be
  SQLITE_ACCESS_EXISTS to check for the existence of the file,
  SQLITE_ACCESS_READWRITE to check to see if the file is both readable
  and writable, or SQLITE_ACCESS_READ to check to see if the file is
  at least readable.  The "file" named by the second parameter might
  be a directory or folder name.


  The xGetTempName method computes the name of a temporary file that
  SQLite can use.  The name should be written into the buffer given
  by the second parameter.  SQLite will size that buffer to hold
  at least mxPathname bytes.  The generated filename should be in UTF-8.
  To avoid security problems, the generated temporary filename should
  contain enough randomness to prevent an attacker from guessing the
  temporary filename in advance.


  The xFullPathname method is used to convert a relative pathname
  into a full pathname.  The resulting full pathname is written into
  the buffer provided by the third parameter.  SQLite will size the
  output buffer to at least mxPathname bytes.  Both the input and
  output names should be in UTF-8.


  The xDlOpen, xDlError, xDlSym, and xDlClose methods are all used for
  accessing shared libraries at run-time.  These methods may be omitted
  (and their pointers set to zero) if the library is compiled with
  SQLITE_OMIT_LOAD_EXTENSION or if the sqlite3_enable_load_extension()
  interface is never used to enable dynamic extension loading.  The
  xDlOpen method opens a shared library or DLL and returns a pointer to
  a handle.  NULL is returned if the open fails.  If the open fails,
  the xDlError method can be used to obtain a text error message.
  The message is written into the zErrMsg buffer of the third parameter
  which is at least nByte bytes in length.  The xDlSym returns a pointer
  to a symbol in the shared library.  The name of the symbol is given
  by the second parameter.  UTF-8 encoding is assumed.  If the symbol
  is not found a NULL pointer is returned.  The xDlClose routine closes
  the shared library.


  The xRandomness method is used exactly once to initialize the 
  pseudo-random number generator (PRNG) inside of SQLite.  Only
  the xRandomness method on the default VFS is used.  The xRandomness
  methods on other VFSes are never accessed by SQLite.
  The xRandomness routine requests that nByte bytes of randomness
  be written into zOut.  The routine returns the actual number of
  bytes of randomness obtained.  The quality of the randomness so obtained
  will determine the quality of the randomness generated by built-in 
  SQLite functions such as random() and randomblob().  SQLite also
  uses its PRNG to generate temporary file names.  On some platforms
  (ex: Windows) SQLite assumes that temporary file names are unique
  without actually testing for collisions, so it is important to have
  good-quality randomness even if the random() and randomblob() 
  functions are never used.


  The xSleep method is used to suspend the callin.g thread for at
  least the number of microseconds given.  This method is used to
  implement the sqlite3_sleep() and sqlite3_busy_timeout() APIs.
  In the case of sqlite3_sleep() the xSleep method of the default
  VFS is always used.  If the underlying system does not have a
  microsecond resolution sleep capability, then the sleep time should
  be rounded up.  xSleep returns this rounded-up value.


  The xCurrentTime method finds the current time and date and writes
  the result as a double-precision floating point value into pointer
  provided by the second parameter.  The time and date is in
  coordinated universal time (UTC) and is a fractional Julian day number.

2.1.5 The Open File Object
  The result of opening a file is an instance of an sqlite3_file object.
  The sqlite3_file object is an abstract base class defined as follows:


typedef struct sqlite3_file sqlite3_file;
struct sqlite3_file {
  const struct sqlite3_io_methods *pMethods;
};

  Each VFS implementation will subclass the sqlite3_file by adding
  additional fields at the end to hold whatever information the VFS
  needs to know about an open file.  It does not matter what information
  is stored as long as the total size of the structure does not exceed
  the szOsFile value recorded in the sqlite3_vfs object.


  The sqlite3_io_methods object is a structure that contains pointers
  to methods for reading, writing, and otherwise dealing with files.
  This object is defined as follows:


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 (*xFileControl)(sqlite3_file*, int op, void *pArg);
  int (*xSectorSize)(sqlite3_file*);
  int (*xDeviceCharacteristics)(sqlite3_file*);
  /* Additional methods may be added in future releases */
};

  The iVersion field of sqlite3_io_methods is provided as insurance
  against future enhancements.  The iVersion value should always be
  1 for SQLite version 3.5.


  The xClose method closes the file.  The space for the sqlite3_file
  structure is deallocated by the caller.  But if the sqlite3_file
  contains pointers to other allocated memory or resources, those
  allocations should be released by the xClose method.


  The xRead method reads iAmt bytes from the file beginning at a byte
  offset to iOfst.  The data read is stored in the pointer of the
  second parameter.  xRead returns the SQLITE_OK on success,
  SQLITE_IOERR_SHORT_READ if it was not able to read the full number
  of bytes because it reached end-of-file, or SQLITE_IOERR_READ for
  any other error.


  The xWrite method writes iAmt bytes of data from the second parameter
  into the file beginning at an offset of iOfst bytes.  If the size of
  the file is less than iOfst bytes prior to the write, then xWrite should
  ensure that the file is extended with zeros up to iOfst bytes prior
  to beginning its write.  xWrite continues to extends the file as
  necessary so that the size of the file is at least iAmt+iOfst bytes 
  at the conclusion of the xWrite call.  The xWrite method returns
  SQLITE_OK on success.  If the write cannot complete because the
  underlying storage medium is full, then SQLITE_FULL is returned.
  SQLITE_IOERR_WRITE should be returned for any other error.


  The xTruncate method truncates a file to be nByte bytes in length.
  If the file is already nByte bytes or less in length then this
  method is a no-op.  The xTruncate method returns SQLITE_OK on
  success and SQLITE_IOERR_TRUNCATE if anything goes wrong.


  The xSync method is used to force previously written data out of
  operating system cache and into non-volatile memory.  The s/econd
  parameter is usually SQLITE_SYNC_NORMAL.  If the second parameter
  is SQLITE_SYNC_FULL then the xSync method should make sure that
  data has also been flushed through the disk controllers cache.
  The SQLITE_SYNC_FULL parameter is the equivalent of the F_FULLSYNC
  ioctl() on Mac OS X. The xSync method returns
  SQLITE_OK on success and SQLITE_IOERR_FSYNC if anything goes wrong.


  The xFileSize() method determines the current size of the file
  in bytes and writes that value into *pSize.  It returns SQLITE_OK
  on success and SQLITE_IOERR_FSTAT if something goes wrong.


  The xLock and xUnlock methods are used to set and clear file locks.
  SQLite supports five levels of file locks, in order:
  
   SQLITE_LOCK_NONE
   SQLITE_LOCK_SHARED
   SQLITE_LOCK_RESERVED
   SQLITE_LOCK_PENDING
   SQLITE_LOCK_EXCLUSIVE
  
  The underlying implementation can support some subset of these locking
  levels as long as it meets the other requirements of this paragraph.
  The locking level is specified as the second argument to both xLock
  and xUnlock.  The xLock method increases the locking level to the
  specified locking level or higher.  The xUnlock method decreases the
  locking level to no lower than the level specified.  
  SQLITE_LOCK_NONE means that the file is unlocked.  SQLITE_LOCK_SHARED
  gives permission to read the file.  Multiple database connections can
  hold SQLITE_LOCK_SHARED at the same time.
  SQLITE_LOCK_RESERVED is like SQLITE_LOCK_SHARED in that it is permission
  to read the file.  But only a single connection can hold a reserved lock
  at any point in time.  The SQLITE_LOCK_PENDING is also permission to
  read the file.  Other connections can continue to read the file as well,
  but no other connection is allowed to escalate a lock from none to shared.
  SQLITE_LOCK_EXCLUSIVE is permission to write on the file.  Only a single
  connection can hold an exclusive lock and no other connection can hold
  any lock (other than "none") while one connection holds an exclusive
  lock.  The xLock returns SQLITE_OK on success, SQLITE_BUSY if it
  is unable to obtain the lock, or SQLITE_IOERR_RDLOCK if something else
  goes wrong.  The xUnlock method returns SQLITE_OK on success and
  SQLITE_IOERR_UNLOCK for problems.


  The xCheckReservedLock() method checks to see if another connection or
  another process is currently holding a reserved, pending, or exclusive
  lock on the file.  It returns true or false.


  The xFileControl() method is a generic interface that allows custom
  VFS implementations to directly control an open file using the
  (new and experimental)
  sqlite3_file_control() interface.  The second "op" argument
  is an integer opcode.  The third
  argument is a generic pointer which is intended to be a pointer
  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 opcodes less than 100 for its own use. 
  A list of opcodes less than 100 is available.
  Applications that define a custom xFileControl method should use opcodes 
  greater than 100 to avoid conflicts.


  The xSectorSize returns the "sector size" of the underlying
  non-volatile media.  A "sector" is defined as the smallest unit of
  storage that can be written without disturbing adjacent storage.
  On a disk drive the "sector size" has until recently been 512 bytes,
  though there is a push to increase this value to 4KiB.  SQLite needs
  to know the sector size so that it can write a full sector at a
  time, and thus avoid corrupting adjacent storage space if a power
  loss occurs in the middle of a write.


  The xDeviceCharacteristics method returns an integer bit vector that
  defines any special properties that the underlying storage medium might
  have that SQLite can use to increase performance.  The allowed return
  is the bit-wise O0R of the following values:
  
   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
  
  The SQLITE_IOCAP_ATOMIC bit means that all writes to this device are
  atomic in the sense that either the entire write occurs or none of it
  occurs.  The other 
  SQLITE_IOCAP_ATOMICnnn values indicate that
  writes of aligned blocks of the indicated size are atomic.
  SQLITE_IOCAP_SAFE_APPEND means that when extending a file with new
  data, the new data is written first and then the file size is updated.
  So if a power failure occurs, there is no chance that the file might have
  been extended with randomness.  The SQLITE_IOCAP_SEQUENTIAL bit means
  that all writes occur in the order that they are issued and are not
  reordered by the underlying file system.

2.1.6 Checklist For Constructing A New VFS
  The preceding paragraphs contain a lot of information.
  To ease the task of constructing
  a new VFS for SQLite we offer the following implementation checklist:


  
   Define an appropriate subclass of the sqlite3_file object.
   Implement the methods required by the sqlite3_io_methods object.
   Create a static and 
       constant sqlite3_io_methods object containing pointers
       to the methods from the previous step.
   Implement the xOpen method that opens a file and populates an
       sqlite3_file object, including setting pMethods to
       point to the sqlite3_io_methods object from the previous step.
   Implement the other methods required by sqlite3_vfs.
   Define a static (but not constant) sqlite3_vfs structure that
       contains pointers to the xOpen method and the other methods and
       which contains the appropriate values for iVersion, szOsFile,
       mxPathname, zName, and pAppData.
   Implement a procedure that calls sqlite3_vfs_register() and
       passes it a pointer to the sqlite3_vfs structure from the previous
       step.  This procedure is probably the only exported symbol in the
       source file that implements your VFS.
  


  Within your application, call the procedure implemented in the last
  step above as part of your initialization process before any
  database connections are opened.  

3.0 The Memory Allocation Subsystem
  Beginning with version 3.5, SQLite obtains all of the heap memory it
  needs using the routines sqlite3_malloc(), sqlite3_free(), and
  sqlite3_realloc().  These routines have existed in prior versions
  of SQLite, but SQLite has previously bypassed these routines and used
  its own memory allocator.  This all changes in version 3.5.0.


  The SQLite source tree actually contains multiple versions of the
  memory allocator.  The default high-speed version found in the
  "mem1.c" source file is used for most builds.  But if the SQLITE_MEMDEBUG
  flag is enabled, a separate memory allocator the "mem2.c" source file
  is used instead.  The mem2.c allocator implements lots of hooks to
  do error checking and to simulate memory allocation failures for testing
  purposes.  Both of these allocators use the malloc()/free() implementation
  in the standard C library.


  Applications are not required to use either of these standard memory
  allocators.  If SQLite is compiled with SQLITE_OMIT_MEMORY_ALLOCATION
  then no implementation for the sqlite3_malloc(), sqlite3_realloc(),
  and sqlite3_free() functions is provided.  Instead, the application
  that links against SQLite must provide its own implementation of these
  functions.  The application provided memory allocator is not required
  to use the malloc()/free() implementation in the standard C library.
  An embedded application might provide an alternative memory allocator
  that uses memory for a fixed memory pool set aside for the exclusive
  use of SQLite, for example.


  Applications that implement their own memory allocator must provide
  implementation for the usual three allocation1 functions 
  sqlite3_malloc(), sqlite3_realloc(), and sqlite3_free().
  And they must also implement a fourth function:


int sqlite3_memory_alarm(
  void(*xCallback)(void *pArg, sqlite3_int64 used, int N),
  void *pArg,
  sqlite3_int64 iThreshold
);

 The sqlite3_memory_alarm routine is used to register
 a callback on memory allocation events.
 This routine registers or clears a callback that fires when
 the amount of memory allocated exceeds iThreshold.  Only
 a single callback can be registered at a time.  Each call
 to sqlite3_memory_alarm() overwrites the previous callback.
 The callback is disabled by setting xCallback to a NULL
 pointer.


 The parameters to the callback are the pArg value, the 
 amount of memory currently in use, and the size of the
 allocation that provoked the callback.  The callback will
 presumably invoke sqlite3_free() to free up memory space.
 The callback may invoke sqlite3_malloc() or sqlite3_realloc()
 but if it does, no additional callbacks will be invoked by
 the recursive calls.


 The sqlite3_soft_heap_limit() interface works by registering
 a memory alarm at the soft heap limit and invoking 
 sqlite3_release_memory() in the alarm callback.  Application
 programs should not attempt to use the sqlite3_memory_alarm()
 interface because doing so will interfere with the
 sqlite3_soft_heap_limit() module.  This interface is exposed
 only so that applications can provide their own
 alternative implementation when the SQLite core is
 compiled with SQLITE_OMIT_MEMORY_ALLOCATION.


  The built-in memory allocators in SQLite also provide the following
  additional interfaces:


sqlite3_int64 sqlite3_memory_used(void);
sqlite3_int64 sqlite3_memory_highwater(int resetFlag);

  These interfaces can be used by an application to monitor how
  much memory SQLite is using.  The sqlite3_memory_used() routine
  returns the number of bytes of memory currently in use and the
  sqlite3_memory_highwater() returns the maximum instantaneous
  memory usage.  Neither routine includes the overhead associated
  with the memory allocator.  These routines are provided for use
  by the application.  SQLite never invokes them itself.  So if
  the application is providing its own memory allocation subsystem,
  it can omit these interfaces if desired.

4.0 The Mutex Subsystem
  SQLite has always been threadsafe in the sense that it is safe to
  use different SQLite database connections in different threads at the
  same time.  The constraint was that the same database connection
  could not be used in two separate threads at once.  SQLite version 3.5.0
  relaxes this constraint. 


  In order to allow multiple threads to use the same database connection
  at the same time, SQLite must make extensive use of mutexes.  And for
  this reason a new mutex subsystem as been added.  The mutex subsystem
  as the following interface:


sqlite3_mutex *sqlite3_mutex_alloc(int);
void sqlite3_mutex_free(sqlite3_mutex*);
void sqlite3_mutex_enter(sqlite3_mutex*);
int sqlite3_mutex_try(sqlite3_mutex*);
void sqlite3_mutex_leave(sqlite3_mutex*);

  Though these routines exist for the use of the SQLite core, 
  application code is free to use these routines as well, if desired.
  A mutex is an sqlite3_mutex object.  The sqlite3_mutex_alloc()
  routine allocates a new mutex object and returns a pointer to it.
  The argument to sqlite3_mutex_alloc() should be 
  SQLITE_MUTEX_FAST or SQLITE_MUTEX_RECURSIVE for non-recursive
  and recursive mutexes, respectively.  If the underlying system does
  not provide non-recursive mutexes, then a recursive mutex can be
  substituted in that case.  The argument to sqlite3_mutex_alloc()
  can also be a constant designating one of several static mutexes:
  
    SQLITE_MUTEX_STATIC_MAIN
    SQLITE_MUTEX_STATIC_MEM
    SQLITE_MUTEX_STATIC_MEM2
    SQLITE_MUTEX_STATIC_PRNG
    SQLITE_MUTEX_STATIC_LRU
  
  These static mutexes are reserved for use internally by SQLite
  and should not be used by the application.  The static mutexes
  are all non-recursive.


  The sqlite3_mutex_free() routine should be used to deallocate
  a non-static mutex.  If a static mutex is passed to this routine
  then the behavior is undefined.


  The sqlite3_mutex_enter() attempts to enter the mutex and blocks
  if another threads is already there.  sqlite3_mutex_try() attempts
  to enter and returns SQLITE_OK on success or SQLITE_BUSY if another
  thread is already there.  sqlite3_mutex_leave() exits a mutex.
  The mutex is held until the number of exits matches the number of
  entrances.  If sqlite3_mutex_leave() is called on a mutex that 
  the thread is not currently holding, then the behavior is undefined.
  If any routine is called for a deallocated mutex, then the behavior
  is undefined.


  The SQLite source code provides multiple implementations of these
  APIs, suitable for varying environments.  If SQLite is compiled with
  the SQLITE_THREADSAFE=0 flag then a no-op mutex implementation that 
  is fast but does no real mutual exclusion is provided.  That 
  implementation is suitable for use in single-threaded applications
  or applications that only use SQLite in a single thread.  Other
  real mutex implementations are provided based on the underlying
  operating system.


  Embedded applications may wish to provide their own mutex implementation.
  If SQLite is compiled with the -DSQLITE_MUTEX_APPDEF=1 compile-time flag
  then the SQLite core provides no mutex subsystem and a mutex subsystem
  that matches the interface described above must be provided by the
  application that links against SQLite.

5.0 Other Interface Changes
  Version 3.5.0 of SQLite changes the behavior of a few APIs in ways
  that are technically incompatible.  However, these APIs are seldom
  used and even when they are used it is difficult to imagine a
  scenario where the change might break something.  The changes
  actually makes these interface much more useful and powerful.


  Prior to version 3.5.0, the sqlite3_enable_shared_cache() API
  would enable and disable the shared cache feature for all connections
  within a single thread - the same thread from which the 
  sqlite3_enable_shared_cache() routine was called.  Database connections
  that used the shared cache were restricted to running in the same
  thread in which they were opened.  Beginning with version 3.5.0,
  the sqlite3_enable_shared_cache() applies to all database connections
  in all threads within the process.  Now database connections running
  in separate threads can share a cache.  And database connections that
  use shared cache can migrate from one thread to another.


  Prior to version 3.5.0 the sqlite3_soft_heap_limit() set an upper
  bound on heap memory usage for all database connections within a
  single thread.  Each thread could have its own heap limit.  Beginning
  in version 3.5.0, there is a single heap limit for the entire process.
  This seems more restrictive (one limit as opposed to many) but in
  practice it is what most users want.


  Prior to version 3.5.0 the sqlite3_release_memory() function would
  try to reclaim memory from all database connections in the same thread
  as the sqlite3_release_memory() call.  Beginning with version 3.5.0,
  the sqlite3_release_memory() function will attempt to reclaim memory
  from all database connections in all threads.

6.0 Summary
  The transition from SQLite version 3.4.2 to 3.5.0 is a major change.
  Every source code file in the SQLite core had to be modified, some
  extensively.  And the change introduced some minor incompatibilities
  in the C interface.  But we feel that the benefits of the transition
  from 3.4.2 to 3.5.0 far outweigh the pain of porting.  The new
  VFS layer is now well-defined and stable and should simplify future
  customizations.  The VFS layer, and the separable memory allocator
  and mutex subsystems allow a standard SQLite source code amalgamation
  to be used in an embedded project without change, greatly simplifying
  configuration management.  And the resulting system is much more
  tolerant of highly threaded designs.


This page last modified on  2020-06-18 21:18:56 UTC34to35.html
îe‚,
a„æY#SQLite Changes From Version 3.4.2 To 3.5.0Moving From SQLite 3.4.2 to 3.5.0
  SQLite version 3.5.0 (2007-09-04) introduces a new OS interface layer that
  is incompatible with all prior versions of SQLite.  In addition,
  a few existing interfaces have been generalized to work across all
  database connections within a process rather than just all
  connections within a thread.  The purpose of this article
  is to describe the changes to 3.5.0 in detail so that users
  of prior versions of SQLite can judge what, if any, effort will
  be required to upgrade to newer versions.

1.0 Overview Of Changes
  A quick enumeration of the changes in SQLite version 3.5.0
  is provided here.  Subsequent sections will describe these
  changes in more detail.


  
  The OS interface layer has been completely reworked:
  
  The undocumented sqlite3_os_switch() interface has
      been removed.
  The SQLITE_ENABLE_REDEF_IO compile-time flag no longer functions.
      I/O procedures are now always redefinable.
  Three new objects are defined for specifying I/O procedures:
      sqlite3_vfs, sqlite3_file, and sqlite3_io_methods.
  Three new interfaces are used to create alternative OS interfaces:
      sqlite3_vfs_register(), sqlite3_vfs_unregister(), and
      sqlite3_vfs_find().
  A new interface has been added to provided additional control over
      the creation of new database connections: sqlite3_open_v2().
      The legacy interfaces of sqlite3_open() and
      sqlite3_open16() continue to be fully supported.
  
  The optional shared cache and memory management features that
      were introduced in version 3.3.0 can now be used across multiple
      threads within the same process.  Formerly, these extensions only
      applied to database connections operating within a single thread.
   
   The sqlite3_enable_shared_cache() interface now applies to all
       threads within a process, not to just the one thread in which it
       was run.
   The sqlite3_soft_heap_limit() interface now applies to all threads
       within a process, not to just the one thread in which it was run.
   The sqlite3_release_memory() interface will now attempt to reduce
       the memory usages across all database connections in all threads, not
       just connections in the thread where the interface is called.
   The sqlite3_thread_cleanup() interface has become a no-op.
   
  Restrictions on the use of the same database connection by multiple
      threads have been dropped.  It is now safe for
      multiple threads to use the same database )
•l‚-      1«'Features Of SQLiteFeatures Of SQLite


Transactions
    are atomic, consistent, isolated, and durable (ACID)
    even after system crashes and power failures.
Zero-configuration
     - no setup or administration needed.
Full-featured SQL implementation
    with advanced capabilities like partial indexes,
    indexes on expressions, JSON,
    common table expressions, and window functions.
    (Omitted features)
A complete database is stored in a 
    single cross-platform disk file.
    Great for use as an application file format.
Supports terabyte-sized databases and gigabyte-sized strings
    and blobs.  (See limits.html.)
Small code footprint: 
    less than 750KiB fully configured or much less
    with optional features omitted.
Simple, easy to use API.
Fast:  In some cases, SQLite is 
    faster than direct filesystem I/O
Written in ANSI-C.  TCL bindings included.
    Bindings for dozens of other languages available separately.
Well-commented source code with
    100% branch test coverage.
Available as a 
    single ANSI-C source-code file 
    that is easy to compile and hence is easy
    to add into a larger project.
Self-contained:
    no external dependencies.
Cross-platform: Android, *BSD, iOS, Linux, Mac, Solaris, VxWorks, 
    and Windows (Win32, WinCE, WinRT)
    are supported out of the box.  Easy to port to other systems.
Sources are in the public domain.
    Use for any purpose.
Comes with a standalone command-line interface
    (CLI) client that can be used to administer SQLite databases.



Suggested Uses For SQLite:


Database For The Internet Of Things.
SQLite is popular choice for the database engine in cellphones,
PDAs, MP3 players, set-top boxes, and other electronic gadgets.
SQLite has a small code footprint, makes efficient use of memory,
disk space, and disk bandwidth, is highly reliable, and requires
no maintenance from a Database Administrator.

Application File Format.
Rather than using fopen() to write XML, JSON, CSV,
or some proprietary format into
disk files used by your application, use an SQLite database.
You'll avoid having to write and troubleshoot a parser, your data
will be more easily accessible and cross-platform, and your updates
will be transactional.  (more...)

Website Database.
Because it requires no configuration and stores information in ordinary
disk files, SQLite is a popular choice as the database to back small
to medium-sized websites.

Stand-in For An Enterprise RDBMS.
SQLite is often used as a surrogate for an enterprise RDBMS for
demonstration purposes or for testing.  SQLite is fast and requires
no setup, which takes a lot of the hassle out of testing and which
makes demos perky and easy to launch.

More suggestions...

This page last modified on  2022-02-21 19:15:54 UTCfeatures.htmlservation of digital content.






  McAfee uses SQLite in its antivirus 
  programs.  
  Mentioned here and implied 
  here.






  Microsoft uses SQLite as a core component
  of Windows 10, and in other products.






  SQLite is the primary meta-data storage format for
  the Firefox Web Browser and the
  Thunderbird Email Reader from
  Mozilla.






  The Navigation Data Standard uses 
  SQLite as its application file format.






  The popular PHP
  programming language comes with both SQLite2 and SQLite3 built in.






  All Python
  distributions since Python 2.5 include SQLite.






  The RedHat Package Manager (RPM)
  uses SQLite to track its state.






  There are 
  multiple
  sightings
  of SQLite in the Skype client for Mac OS X and Windows.






  The Tcl/Tk programming language now comes with SQLite built-in.  SQLite works
  particularly well with Tcl since SQLite was originally a Tcl extension that
  subsequently "escaped" into the wild.






  SQLite comes bundled with the Xojo
  programming environment
  (formerly REALbasic)










  Adobe uses SQLite as the 
  application 
  file format for their 
  Photoshop Lightroom
  product.
  SQLite is also a standard part of the
  Adobe Integrated Runtime (AIR).
  It is reported that 
  Acrobat Reader
  also uses SQLite.






  Airbus confirms that SQLite is being
  used in the flight software for the 
  A350 XWB family
  of aircraft.






  Apple uses SQLite in many (most?) of the
  native applications running on Mac OS-X desktops and servers and
  on iOS devices such as iPhones and iPods.  SQLite is also used in
  iTunes, even on non-Apple hardware.






  Bentley Systems uses SQLite as the
  application file format for their
  Microstation
  CAD/CAM product.






  Bosch uses SQLite in the multimedia
  systems install on GM, Nissan, and Suzuki automobiles.
  (link)






  The increasingly popular Dropbox file
  archiving and synchronization service is reported to use SQLite as
  the primary data store on the client side.






  Expensify uses SQLite as a server-side
  database engine for their enterprise-scale expense reporting software.






  Facebook uses SQLite as the SQL database
  engine in their 
  osquery product.






  We believe that General Electric
  uses SQLite in some product or 
  another because they have written to the SQLite developers at 
  least four separate times requesting 
  the US Export Control Number for SQLite. So presumably GE is using
  SQLite in something that they are exporting. But nobody
  (outside of GE) seems to know what that might be.






  uses SQLite in their 
  Android cell-phone 
  operating system, and in the 
  Chrome Web Browser.






  Intuit apparently uses SQLite in 
  QuickBooks and in
  TurboTax to judge from some error
  reports from users seen 
  here and
  here.






  The United States Library of Congress recognizes SQLite as a
  recommended storage format for preservation of digital content.






  McAfee uses SQLite in its antivirus 
  programs.  
  Mentioned here and implied 
  here.






  Microsoft uses SQLite as a core component
  of Windows 10, and in other products.






  SQLite is the primary meta-data storage format for
  the Firefox Web Browser and the
  Thunderbird Email Reader from
  Mozilla.






  The Navigation Data Standard uses 
  SQLite as its application file format.






  The popular PHP
  programming language comes with both SQLite2 and SQLite3 built in.






  All Python
  distributions since Python 2.5 include SQLite.






  The RedHat Package Manager (RPM)
  uses SQLite to track its state.






  There are 
  multiple
  sightings
  of SQLite in the Skype client for Mac OS X and Windows.






  The Tcl/Tk programming language now comes with SQLite built-in.  SQLite works
  particularly well with Tcl since SQLite was originally a Tcl extension that
  subsequently "escaped" into the wild.






  SQLite comes bundled with the Xojo
  programming environment
  (formerly REALbasic)




This page last modified on  2022-06-18 09:43:52 UTCfamous.html
ÑѲ#‚.  Aãw#Well-Known Users Of SQLiteWell-Known Users of SQLite


SQLite is used by literally millions of applications
with literally billions and billions of deployments.
SQLite is the most widely deployed database engine in the
world today.


A few of the better-known users of SQLite are shown below
in alphabetical order.
This is not a complete list.
SQLite is in the 
public domain and so most
developers use it in their projects without ever telling us.







  Adobe uses SQLite as the 
  application 
  file format for their 
  Photoshop Lightroom
  product.
  SQLite is also a standard part of the
  Adobe Integrated Runtime (AIR).
  It is reported that 
  Acrobat Reader
  also uses SQLite.






  Airbus confirms that SQLite is being
  used in the flight software for the 
  A350 XWB family
  of aircraft.






  Apple uses SQLite in many (most?) of the
  native applications running on Mac OS-X desktops and servers and
  on iOS devices such as iPhones and iPods.  SQLite is also used in
  iTunes, even on non-Apple hardware.






  Bentley Systems uses SQLite as the
  application file format for their
  Microstation
  CAD/CAM product.






  Bosch uses SQLite in the multimedia
  systems install on GM, Nissan, and Suzuki automobiles.
  (link)






  The increasingly popular Dropbox file
  archiving and synchronization service is reported to use SQLite as
  the primary data store on the client side.






  Expensify uses SQLite as a server-side
  database engine for their enterprise-scale expense reporting software.






  Facebook uses SQLite as the SQL database
  engine in their 
  osquery product.






  We believe that General Electric
  uses SQLite in some product or 
  another because they have written to the SQLite developers at 
  least four separate times requesting 
  the US Export Control Number for SQLite. So presumably GE is using
  SQLite in something that they are exporting. But nobody
  (outside of GE) seems to know what that might be.






  uses SQLite in their 
  Android cell-phone 
  operating system, and in the 
  Chrome Web Browser.






  Intuit apparently uses SQLite in 
  QuickBooks and in
  TurboTax to judge from some error
  reports from users seen 
  here and
  here.






  The United States Library of Congress recognizes SQLite as a
  recommended storage format for pre4
««”Q‚/       ?¨Q'NUL Characters In Strings1. Introduction


SQLite allows NUL characters (ASCII 0x00, Unicode \u0000) in the middle
of string values stored in the database.  However, the use of NUL within
strings can lead to surprising behaviors:



The length() SQL function only counts characters up to and excluding
the first NUL.



The quote() SQL function only shows characters up to and excluding
the first NUL.


The .dump command in the CLI omits the first NUL character and all
subsequent text in the SQL output that it generates.  In fact, the
CLI omits everything past the first NUL character in all contexts.



The use of NUL characters in SQL text strings is not recommended.

2. Unexpected Behavior


Consider the following SQL:

CREATE TABLE t1(
  a INTEGER PRIMARY KEY,
  b TEXT
);
INSERT INTO t1(a,b) VALUES(1, 'abc'||char(0)||'xyz');

SELECT a, b, length(b) FROM t1;



The SELECT statement above shows output of:

1,'abc',3



(Through this document, we assume that the CLI has ".mode quote" set.)
But if you run:

SELECT * FROM t1 WHERE b='abc';



Then no rows are returned.  SQLite knows that the t1.b column actually
holds a 7-character string, and the 7-character string 'abc'||char(0)||'xyz'
is not equal to the 3-character string 'abc', and so no rows are returned.
But a user might be easily confused by this because the CLI output
seems to show that the string has only 3 characters.  This seems like
a bug.  But it is how SQLite works.

3. How To Tell If You Have NUL Characters In Your Strings


If you CAST a string into a BLOB, then the entire length of the
string is shown.  For example:

SELECT a, CAST(b AS BLOB) FROM t1;



Gives this result:

1,X'6162630078797a'



In the BLOB output, you can clearly see the NUL character as the 4th
character in the 7-character string.


Another, more automated, way
to tell if a string value X contains embedded NUL characters is to
use an expression like this:

instr(X,char(0))



If this expression returns a non-zero value N, then there exists an 
embedded NUL at the N-th character position.  Thus to count the number
of rows that contain embedded NUL characters:

SELECT count(*) FROM t1 WHERE instr(b,char(0))>0;


4. Removing NUL Characters From A Text Field


The following example shows how to remove NUL character, and all text
that follows, from a column of a table.  So if you have a database file
that contains embedded NULs and you would like to remove them, running
UPDATE statements similar to the following might help:

UPDATE t1 SET b=substr(b,1,instr(b,char(0)))
 WHERE instr(b,char(0));

This page last modified on  2022-05-23 22:21:54 UTCnulinstr.html2013-10-17
3.8.1
2013-09-03
3.8.0.2
2013-08-29
3.8.0.1
2013-08-26
3.8.0
2013-05-20
3.7.17
2013-04-12
3.7.16.2
2013-03-29
3.7.16.1
2013-03-18
3.7.16
2013-01-09
3.7.15.2
2012-12-19
3.7.15.1
2012-12-12
3.7.15
2012-10-04
3.7.14.1
2012-09-03
3.7.14
2012-06-11
3.7.13
2012-05-22
3.7.12.1
2012-05-14
3.7.12
2012-05-14
3.7.12
2012-05-14
3.7.12
2012-03-20
3.7.11
2012-01-16
3.7.10
2011-11-01
3.7.9
2011-09-19
3.7.8
2011-06-28
3.7.7.1
2011-06-23
3.7.7
2011-05-19
3.7.6.3
2011-04-17
3.7.6.2
2011-04-13
3.7.6.1
2011-04-12
3.7.6
2011-02-01
3.7.5
2010-12-07
3.7.4
2010-10-08
3.7.3
2010-08-24
3.7.2
2010-08-23
3.7.1
2010-08-04
3.7.0.1
2010-07-21
3.7.0
2010-03-26
3.6.23.1
2010-03-09
3.6.23
2010-01-06
3.6.22
2009-12-07
3.6.21
2009-11-04
3.6.20
2009-10-30
3.6.16.1
2009-10-14
3.6.19
2009-09-11
3.6.18
2009-08-10
3.6.17
2009-06-27
3.6.16
2009-06-15
3.6.15
2009-05-25
3.6.14.2
2009-05-19
3.6.14.1
2009-05-07
3.6.14
2009-04-13
3.6.13
2009-03-31
3.6.12
2009-02-18
3.6.11
2009-01-15
3.6.10
2009-01-14
3.6.9
2009-01-12
3.6.8
2008-12-16
3.6.7
2008-11-26
3.6.6.2
2008-11-22
3.6.6.1
2008-11-19
3.6.6
2008-11-12
3.6.5
2008-10-15
3.6.4
2008-09-22
3.6.3
2008-08-30
3.6.2
2008-08-06
3.6.1
2008-07-16
3.6.0
2008-05-14
3.5.9
2008-04-16
3.5.8
2008-03-17
3.5.7
2008-02-06
3.5.6
2008-01-31
3.5.5
2007-12-14
3.5.4
2007-11-27
3.5.3
2007-11-05
3.5.2
2007-10-04
3.5.1
2007-09-04
3.5.0
2007-08-13
3.4.2
2007-07-20
3.4.1
2007-06-18
3.4.0
2007-04-25
3.3.17
2007-04-18
3.3.16
2007-04-09
3.3.15
2007-04-02
3.3.14
2007-02-13
3.3.13
2007-01-27
3.3.12
2007-01-22
3.3.11
2007-01-10
3.3.10
2007-01-04
3.3.9
2006-10-09
3.3.8
2006-08-12
3.3.7
2006-06-06
3.3.6
2006-04-05
3.3.5
2006-02-11
3.3.4
2006-01-31
3.3.3
2006-01-24
3.3.2
2006-01-16
3.3.1
2006-01-11
3.3.0
2005-12-19
2.8.17
2005-12-19
3.2.8
2005-09-24
3.2.7
2005-09-17
3.2.6
2005-08-27
3.2.5
2005-08-24
3.2.4
2005-08-21
3.2.3
2005-06-12
3.2.2
2005-03-29
3.2.1
2005-03-21
3.2.0
2005-03-17
3.1.6
2005-03-11
3.1.5
2005-03-11
3.1.4
2005-02-28
3.1.3.1
2005-02-20
3.1.3
2005-02-15
3.1.2
2005-02-15
2.8.16
2005-02-01
3.1.1
2005-01-21
3.1.0
2004-10-12
3.0.8
2004-09-18
3.0.7
2004-09-02
3.0.6
2004-08-29
3.0.5
2004-08-09
3.0.4
2004-07-22
3.0.3
2004-07-22
2.8.15
2004-06-30
3.0.2
2004-06-22
3.0.1
2004-06-18
3.0.0
2004-06-09
2.8.14
2004-03-08
2.8.13
2004-02-08
2.8.12
2004-01-14
2.8.11
2004-01-14
2.8.10
2004-01-06
2.8.9
2003-12-18
2.8.8
2003-12-04
2.8.7
2003-08-22
2.8.6
2003-07-22
2.8.5
2003-06-29
2.8.4
2003-06-04
2.8.3
2003-05-17
2.8.2
2003-05-17
2.8.1
2003-02-16
2.8.0
2003-01-25
2.7.6
2002-12-28
2.7.5
2002-12-17
2.7.4
2002-10-31
2.7.3
2002-09-25
2.7.2
2002-08-31
2.7.1
2002-08-25
2.7.0
2002-08-13
2.6.3
2002-07-31
2.6.2
2002-07-19
2.6.1
2002-07-18
2.6.0
2002-07-07
2.5.6
2002-07-06
2.5.5
2002-07-01
2.5.4
2002-06-25
2.5.3
2002-06-25
2.5.2
2002-06-19
2.5.1
2002-06-17
2.5.0
2002-05-10
2.4.12
2002-05-08
2.4.11
2002-05-03
2.4.10
2002-04-22
2.4.9
2002-04-20
2.4.8
2002-04-12
2.4.7
2002-04-02
2.4.6
2002-04-02
2.4.5
2002-03-30
2.4.4
2002-03-23
2.4.3
2002-03-20
2.4.2
2002-03-13
2.4.1
2002-03-13
2.4.1
2002-03-11
2.4.0
2002-02-19
2.3.3
2002-02-14
2.3.2
2002-02-13
2.3.1
2002-02-03
2.3.0
2002-01-28
2.2.5
2002-01-22
2.2.4
2002-01-16
2.2.3
2002-01-14
2.2.2
2002-01-09
2.2.1
2001-12-22
2.2.0
2001-12-15
2.1.7
2001-12-14
2.1.6
2001-12-06
2.1.5
2001-12-05
2.1.4
2001-11-24
2.1.3
2001-11-23
2.1.2
2001-11-13
2.1.1
2001-11-12
2.1.0
2001-11-04
2.0.8
2001-10-22
2.0.7
2001-10-19
2.0.6
2001-10-15
2.0.5
2001-10-13
2.0.4
2001-10-13
2.0.3
2001-10-09
2.0.2
2001-10-02
2.0.1
2001-09-28
2.0.0
2001-07-23
1.0.32
2001-04-15
1.0.31
2001-04-06
1.0.30
2001-04-05
1.0.29
2001-04-04
1.0.28
2001-03-20
1.0.27
2001-03-20
1.0.26
2001-03-15
1.0.25
2001-03-14
1.0.24
2001-02-20
1.0.23
2001-02-19
1.0.22
2001-02-19
1.0.21
2001-02-11
1.0.20
2001-02-06
1.0.19
2001-01-04
1.0.18
2000-12-10
1.0.17
2000-11-28
1.0.16
2000-10-23
1.0.15
2000-10-19
1.0.14
2000-10-19
1.0.13
2000-10-17
1.0.12
2000-10-11
1.0.10
2000-10-09
1.0.9
2000-09-30
1.0.8
2000-09-14
1.0.5
2000-08-28
1.0.4
2000-08-22
1.0.3
2000-08-18
1.0.1
2000-08-17
1.0






334 releases
over 22.4 years.

This page last modified on  2022-12-28 14:21:19 UTCchronology.html
ë0ë¦9‚1       GÌ!The SQLITE_STMT Virtual Table1. Overview


The SQLITE_STMT extension implements an eponymous-only virtual table that
provides information about all prepared statements associated with
the database connection.



The SQLITE_STMT extension is included in the amalgamation though 
it is disabled
by default.  Use the SQLITE_ENABLE_STMTVTAB compile-time option to enable
the SQLITE_STMT extension.  The SQLITE_STMT extension can also be 
loaded at run-time
by compiling the extension into a shared library or DLL using the source
code at https://sqlite.org/src/file/ext/misc/stmt.c and following the
instructions for how to compile loadable extensions.



The SQLITE_STMT extension is enabled in default builds
of the command-line shell.

2. Usage


The SQLITE_STMT virtual table is a read-only table that can be directly
qu9¯D‚0      AÞ1+History Of SQLite ReleasesHistory Of SQLite Releases




DateVersion


2022-12-28
3.40.1
2022-11-16
3.40.0
2022-09-29
3.39.4
2022-09-05
3.39.3
2022-07-21
3.39.2
2022-07-13
3.39.1
2022-06-25
3.39.0
2022-05-06
3.38.5
2022-05-04
3.38.4
2022-04-27
3.38.3
2022-03-26
3.38.2
2022-03-12
3.38.1
2022-02-22
3.38.0
2022-01-06
3.37.2
2021-12-30
3.37.1
2021-11-27
3.37.0
2021-06-18
3.36.0
2021-04-19
3.35.5
2021-04-02
3.35.4
2021-03-26
3.35.3
2021-03-17
3.35.2
2021-03-15
3.35.1
2021-03-12
3.35.0
2021-01-20
3.34.1
2020-12-01
3.34.0
2020-08-14
3.33.0
2020-06-18
3.32.3
2020-06-04
3.32.2
2020-05-25
3.32.1
2020-05-22
3.32.0
2020-01-27
3.31.1
2020-01-22
3.31.0
2019-10-10
3.30.1
2019-10-04
3.30.0
2019-07-10
3.29.0
2019-04-16
3.28.0
2019-02-25
3.27.2
2019-02-08
3.27.1
2019-02-07
3.27.0
2018-12-01
3.26.0
2018-11-05
3.25.3
2018-09-25
3.25.2
2018-09-18
3.25.1
2018-09-15
3.25.0
2018-06-04
3.24.0
2018-04-10
3.23.1
2018-04-02
3.23.0
2018-01-22
3.22.0
2017-10-24
3.21.0
2017-08-24
3.20.1
2017-08-01
3.20.0
2017-06-17
3.18.2
2017-06-16
3.18.1
2017-06-08
3.19.3
2017-05-25
3.19.2
2017-05-24
3.19.1
2017-05-22
3.19.0
2017-03-28
3.18.0
2017-02-13
3.17.0
2017-01-06
3.16.2
2017-01-03
3.16.1
2017-01-02
3.16.0
2016-11-28
3.15.2
2016-11-04
3.15.1
2016-10-14
3.15.0
2016-09-12
3.14.2
2016-08-11
3.14.1
2016-08-08
3.14
2016-05-18
3.13.0
2016-04-18
3.12.2
2016-04-08
3.12.1
2016-03-31
3.9.3
2016-03-29
3.12.0
2016-03-03
3.11.1
2016-02-15
3.11.0
2016-01-20
3.10.2
2016-01-14
3.10.1
2016-01-06
3.10.0
2015-11-02
3.9.2
2015-10-16
3.9.1
2015-10-14
3.9.0
2015-07-29
3.8.11.1
2015-07-27
3.8.11
2015-05-20
3.8.10.2
2015-05-09
3.8.10.1
2015-05-07
3.8.10
2015-04-08
3.8.9
2015-02-25
3.8.8.3
2015-01-30
3.8.8.2
2015-01-20
3.8.8.1
2015-01-16
3.8.8
2014-12-09
3.8.7.4
2014-12-05
3.8.7.3
2014-11-18
3.8.7.2
2014-10-29
3.8.7.1
2014-10-22
3.8.6.1
2014-10-17
3.8.7
2014-08-15
3.8.6
2014-06-04
3.8.5
2014-04-03
3.8.4.3
2014-03-26
3.8.4.2
2014-03-11
3.8.4.1
2014-03-10
3.8.4
2014-02-11
3.8.3.1
2014-02-03
3.8.3
2013-12-06
3.8.2
7eried to access information about all prepared statements on the 
current database connection.  For example:

SELECT * FROM sqlite_stmt;



A statement such as the above can be run immediately prior to invoking
sqlite3_close() to confirm that all prepared statements have been 
finalized and to help identify and track down prepared
statements that have "leaked" and missed finalization.


The SQLITE_STMT virtual table can also be used to access performance
information about prepared statements, to aid in optimization an application.
For example,
to find out how much memory is being used by prepared statements that have
never been used, one could run:

SELECT sum(mem) FROM sqlite_stmt WHERE run=0;


2.1. Columns


The columns are provided by the SQLITE_STMT virtual table are summarized by
the hypothetical CREATE TABLE statement show here:

CREATE TABLE sqlite_stmt(
  sql    TEXT,    -- Original SQL text
  ncol   INT,     -- Number of output columns
  ro     BOOLEAN, -- True for "read only" statements
  busy   BOOLEAN, -- True if the statement is current running
  nscan  INT,     -- Number of full-scan steps
  nsort  INT,     -- Number of sort operations
  naidx  INT,     -- Number of automatic index inserts
  nstep  INT,     -- Number of byte-code engine steps
  reprep INT,     -- Number of reprepare operations
  run    INT,     -- Number of times this statement has been run
  mem    INT      -- Heap memory used by this statement
);


Future releases may add new output columns and may change the order
of legacy columns.
Further detail about the meaning of each column in the SQLITE_STMT virtual
table is provided below:


sql:
The original SQL text of the prepared statement.  If the prepared
statement is compiled using the sqlite3_prepare() interface, then
the SQL text might not have been saved, in which case this column
will be NULL.

ncol:
The number of columns in the result set of a query.
For DML statements, this column has a value of 0.

ro:
The "read only" column.  This column is true (non-zero) if the
SQL statement is a query and false (zero) if it is a DML statement.

busy:
This field is true if the prepared statement is currently running.
In other words, this field is true if sqlite3_step() has been called
on the prepared statement at least once but sqlite3_reset() has
not yet been called to reset it.

nscan:
This field is the number of times that the bytecode engine has stepped
through a table as part of a full-table scan.  A large number if this
field may indicate an opportunity to improve performance by adding an
index.  This field is equivalent to the SQLITE_STMTSTATUS_FULLSCAN_STEP
value.

nsort:
This field is the number of times that the bytecode engine had to sort.
A positive value in this field may indicate an opportunity to improve
performance by adding an index that will cause the query results to
appear naturally in the desired order.  
This field is equivalent to the SQLITE_STMTSTATUS_SORT value.

naidx:
This field is the number of rows that have been inserted into
automatic indexes.  A positive value in this field may indicate 
an opportunity to improve performance by adding a named index that
take the place of the automatic index.
This field is equivalent to the SQLITE_STMTSTATUS_AUTOINDEX value.

nstep:
This field is the number of bytecode engine operations that have
been performed for the prepared statement.  This field can be used
as a proxy for how much CPU time a statement has used.
This field is equivalent to the SQLITE_STMTSTATUS_VM_STEP value.

reprep:
This field is the number of times that the statement has had to be
reprepared due to schema changes or changes to parameter bindings.
This field is equivalent to the SQLITE_STMTSTATUS_REPREPARE value.

run:
This field is the number of times that the statement has been run.
This field is equivalent to the SQLITE_STMTSTATUS_RUN value.

mem:
This field is the number of bytes of heap storage used by the
prepared statement.
This field is equivalent to the SQLITE_STMTSTATUS_MEMUSED value.

This page last modified on  2017-07-14 15:38:02 UTCstmt.html
ï‰M‚3  O’/1SQLite is a Self Contained SystemSQLite is "stand-alone" or "self-contained" in the sense that it
has very few dependencies.  It runs on any operating system, even
stripped-down bare-bones embedded operating systems.  SQLite uses
no external libraries or interfaces (other than a few standard C-library 
calls described below).  The entire SQLite library is
encapsulated in a single source code file that requires
no special facilities or tools to build.


A minimal build of SQLite requires just these routines from the
standard C library:

memcmp()
memcpy()
memmove()
memset()
strcmp()
strlen()
strncmp()



Most builds also use the system memory allocation routines:

malloc()
realloc()
free()

But those routines are optional and can be omitted
using a compile-time option.


Default builds of SQLite contain appropriate VFS objects for talking
to underlying operating system, and those VFS objects will contain
operating system calls such as open(), read(), write(), fsync(), and
so forth.  All of these interfaces are readily available on most platforms,
and custom VFSes can be designed to run SQLite on even the most
austere embedded devices.
This page last modified on  2022-08-10 18:45:48 UTCselfcontained.html”
‚2       Y§++The COMPLETION() Table-Valued Function1. Overview

The COMPLETION extension implements a table-valued function named
"completion" that can be used to suggest completions of partially entered
words during interactive SQL input.  The completion table can be
used to help implement tab-completion, for example.

2. Details

The designed query interface is:

SELECT DISTINCT candidate COLLATE nocase
  FROM completion($prefix, $wholeline)
 ORDER BY 1;


The query above will return suggestions for the whole input word that
begins with $prefix.  The $wholeline parameter is all text from the beginning
of the line up to the insertion point.  The $wholeline parameter is used
for context.

The $prefix parameter may be NULL, in which case the prefix is deduced
from $wholeline.  Or, the $wholeline parameter may be NULL or omitted if 
context information is unavailable or if context-aware completion is not
desired.

The completion table might return the same candidate more than once, and
it will return candidates in an arbitrary order.  The DISTINCT keyword and
the ORDER BY in the sample query above are added to make the answers unique
and in lexicographical order.

2.1. Example Usage

The completion table is used to implement tab-completion in the
command-line shell in conjunction with either the readline or linenoise
input line editing packages for unix.  See the
https://sqlite.org/src/file/src/shell.c.in source file for example
code.  Search for "FROM completion" to find the relevant code sections.

Because the completion table is built into the command-line shell in order
to provide for tab-completions, you can run test queries against the
completion table directly in the command-line shell.  Simply type a
query such as the example shown above, filling in appropriate values
for $prefix and $wholeline, and observe the output.

3. Limitations

The completion table is designed for interactive use.  It will return
answers at a speed appropriate for human typing.  No effort is made to
be unusually efficient, so long as the response time is nearly instantaneous
in a user interface.

As of this writing (2017-07-13), the completion virtual table only
looks for SQL keywords, and schema, table, and column names.  The
context contained in $wholeline is completely ignored.  Future enhancements
will try to return new completions taken from function and pragma names
and other sources, as well as consider more context.  The completion
table should be considered a work-in-progress.
This page last modified on  2017-07-14 03:53:46 UTCcompletion.html<ign principles, engineering trade-offs, implementation issues,
and operations of SQLite. 





Android SQLite Essentials (2014)


Authors: Sunny Kumar Aditya and Vikash Kumar Karn
Publisher: 
Packt Publishing


Android SQLite Essentials focuses on the core concepts behind building
database-driven applications. This book covers the basic and advanced
topics with equivalent simplicity and detail, in order to enable
readers to quickly grasp and implement the concepts to build an
application database.

This book takes a hands-on, example-based approach to help readers
understand the core topics of SQLite and Android database-driven
applications. This book focuses on providing you with latent as well
as widespread knowledge about practices and approaches towards
development in an easily understandable manner.





SQLite for Mobile Apps Simplified (2014)


Author: Sribatsa Das
Publisher: Amazon
Amazon


SQLite for Mobile Apps Simplified is devoted to presenting approach
and implementation methodology for using SQLite database in mobile apps.
It presents step-by-step examples to create schema, execute transactions
and access data from Android, BlackBerry and iOS applications.
In addition, it presents ADB Shell and SQLite command-line shell from
ADB Shell to access the SQLite Database created by the Android apps.
For BlackBerry and iOS application, the book presents ways to access
the data using the command line shell. 





The Definitive Guide to SQLite (2nd edition, 2010)


Authors: Mike Owens and Grant Allen
Publisher: Apress
Amazon


Outside of the world of enterprise computing, there is one database 
that enables a huge range of software and hardware to flex relational 
database capabilities, without the baggage and cost of traditional 
database management systems. That database is SQLite - an embeddable
database with an amazingly small footprint, yet able to handle databases 
of enormous size. SQLite comes equipped with an array of powerful 
features available through a host of programming and development 
environments. It is supported by languages such as C, Java, Perl,
PHP, Python, Ruby, TCL, and more.

The Definitive Guide to SQLite, Second Edition 
is devoted to complete coverage of the latest version of this powerful 
database. It offers a thorough overview of SQLite's capabilities 
and APIs. The book also uses SQLite as the basis for helping newcomers
make their first foray into database development. In only a short time 
you can be writing programs as diverse as a server-side browser plug-in 
or the next great iPhone or Android application! 






Using SQLite (2010)


Author: Jay A. Kreibich
Publisher: O'Reilly Media
O'Reilly

Developers, take note: databases aren't just for the IS group any more.
You can build database-backed applications for the desktop, Web,
embedded systems, or operating systems without linking to heavy-duty
client-server databases such as Oracle and MySQL. 
This book shows how you to use SQLite, a small and lightweight 
database that you can build right into your application during development.
Applications that handle data have an enormous advantage today, and
with SQLite, you'll discover how to develop a database-backed application
that remains manageable in size and complexity. This book guides
you every step of the way. You'll get a crash course in data modeling, 
become familiar with SQLite's dialect of the SQL database language, 
and learn how you to work with SQLite using either a scripting 
language or a C-based language, such as C# or Objective C.Now, 
even relatively small and nimble applications can be a part of 
the data revolution. Using SQLite shows you how.






SQLite 3 - Einstieg in die Datenbankwelt (2010)


Author: Key Droessler
Publisher: Lulu.com
Amazon

Die Datenbanksprache SQL ( Structured Query Language ) wird in Datenbanken
zur Definition, Manipulation, Sicherung, aber hauptsaechlich zur Abfrage 
von Daten aus der Datenbank eingesetzt. Unabhaengig vom Betriebssystem oder 
aufwendigen, benutzerfreundlichen, graphischen Oberflaechen bleibt die 
Logik aber immer gleich.SQLite ist eine freie Desktop-Datenbank, 
sie kostet nichts, ist fuer viele Betriebssysteme verfuegbar, 
schnell heruntergeladen und installiert und auf das Notwendigste 
reduziert. Fuer den Einsteiger sind das die besten Voraussetzungen, 
ohne viel Aufwand schnell in die Welt der Datenbanken und Datenbanksprache 
reinzuschnuppern.Wer nach den Uebungen aber auf den Geschmack gekommen ist,
hat schon den groessten Teil an Datenbanken und SQL gelernt, denn alles 
Besprochene ist Wissen, welches auch auf jedes andere der vielen 
Datenbanken grundlegend anwendbar ist. Nun koennen Sie auf die richtig 
Grossen zugehen, vom grossen Fachbuch bis zum riesigen Datenbanksystem.






Inside Symbian SQL (2010)

Authors: Ivan Litovski &amp; Richard Maynard
Publisher: Wiley
wiley.com


This is the definitive reference book on the Symbian SQL database
which is based on SQLite. The authors (both members of the Symbian
engineering team responsible for the implementation of the code)
show you how to design code
and ease migration from an internal and external point of view, 
plus they reveal the dos and don'ts of writing high-performance 
database applications. Packed with resources and sample code, 
this timely book reveals how to design and tune applications 
that use the Symbian SQL framework to ultimately improve performance.

With its sample code and insider expertise, this text has everything 
you need to keep you ahead of the curve. 






The SQL Guide to SQLite (2009)

Author: Rick F. van der Lans
Publisher: Lulu.com
Amazon

SQLite is a small, fast, embeddable, SQL-based database server.
It is easy to install, needs no management, and is open source.
This book describes SQLite in detail. With hundreds of examples, plus a
proven approach and structure, the book teaches you how to use SQLite
efficiently and effectively. It contains a complete description of the 
SQL dialect as implemented in SQLite version 3.6. The book can be seen 
as a tutorial and a reference book. Source code for the numerous SQL 
examples and exercises included in this book can be downloaded from www.r20.nl.






An Introduction to SQLite - 2nd Edition (2009)

Author: Naoki Nishizawa
Publisher: Shoeisha
Amazon.jp

This text is written in fluent Japanese specifically for a Japanese
audience.  This is the second edition of the book - the first edition
was published in 2005.  






Inside SQLite (2007)


Author: Sibsankar Haldar
Publisher: O'Reilly Media
O'Reilly

SQLite is a small, zero-configuration, custom-tailored, embeddable, 
thread-safe, easily maintainable, transaction-oriented, SQL-based,
relational database management system. There is no separate install or 
setup procedure to initialize SQLite before using it. 
There is no configuration file. 
SQLite is open source, and is available in the public domain 
(for more information on open source, visit http://opensource.org). 
You can download SQLite source code from its homepage http://www.sqlite.org, 
compile it using your favorite C compiler, and start using the compiled
library. SQLite runs on Linux, Windows, Mac OS X, and a few other operating systems. It has been widely used in low-to-medium tier database applications. 
This Short Cut discusses design principles, engineering trade-offs, 
implementation issues, and operations of SQLite. It presents a 
comprehensive description of all important components of the SQLite engine.






SQLite (2004)

Author: Chris Newman
Publisher: Sams
Amazon


SQLite is a small, fast, embeddable database. What makes it popular is 
the combination of the database engine and interface into a single library 
as well as the ability to store all the data in a single file.
Its functionality lies between MySQL and PostgreSQL, however it is faster 
than both databases.

In SQLite, 
author Chris Newman provides a thorough, practical guide to 
using, administering and programming this up-and-coming database. 
If you want to learn about SQLite or about its use in conjunction with 
PHP this is the book for you.

This page last modified on  2019-09-28 19:02:24 UTCbooks.html
´´Ô<‚4
1¨9!Books About SQLiteBooks About SQLite




SQLite Forensics (2018)


Author: Paul Sanderson
Publisher: Amazon


This text by noted digital forensics expert, Paul Sanderson, provides
investigators with low-level technical details useful in analysing
SQLite database files.


Every computer and phone uses hundreds of SQLite databases and there are
over one trillion SQLite databases in active use. Hence, the importance
of examining the data held in these databases in an
investigation, including deleted data when possible, is paramount. This
book fully explains the format of the SQLite database file. It shows how
records are encoded, how to decode them manually and how to decode
records that are partially overwritten. It also describe how the
workings of SQLite, and in particular the journal and WAL, can be used
to ascertain what has happened in a manner that cannot be determined
from the data alone. The book covers basic SQL queries and how they can
be used to create a custom report that includes data from different
tables, and shows how one can use SQL queries to test hypotheses about
the relationships of data in different tables. 

This book is aimed mainly at
forensic practitioners, and it is assumed that the reader has some basic
knowledge of computer forensics; it will also be of interest to computer
professionals in general particularly those who have an interest in the
SQLite file format.






Learning SQLite for iOS (2016)


Author: Gene Da Rocha
Publisher: Packt Publishing


This book starts with the architecture of SQLite database and introduces
you to concepts in SQL. You will find yourself equipped to design your
own database system, administer it, and maintain it. Further, you will
learn how to operate your SQLite databases smoothly using SQL commands. 


You will be able to extend the functionality of SQLite by using its vast
arsenal of C API calls to build some interesting, exciting, new, and
intelligent data-driven applications. Understand how Xcode, HTML5, and
Phonegap can be used to build a cross-platform modern app which can
benefit from all these technologies - all through creating a complete,
customizable application skeleton that you can build on for your own
apps. This book provides a comprehensive description of SQLite database
system. It describes design principles, engineering trade-offs,
implementation issues, and operations of SQLite.





SQLite Database System Design and Implementation (2015)


Author: Sibsankar Haldar
Publisher: https://books.google.com/


This book provides a comprehensive description of SQLite database system. 
It describes des; "t1bc" index out of synchronization with its
parent table "t1".  An out-of-sync index can result in incorrect query
results.



Since the "t2" imposter table is a form of database corruption, the
manual approach to creating imposter tables is not recommended.
Actually, any use of imposter tables is discouraged for all but
expert developers, but manually created imposter tables are
especially discouraged because they are permanent.


2.2. Transient Imposter Tables


Another (safer) approach to creating an imposter table is to add an
entry for the imposter table to SQLite's internal symbol table without
updating the "sqlite_schema" table on disk.
That way, the imposter table exists in only a single database connection
and is automatically removed whenever the schema is reloaded.



Creation of a transient imposter table involves a special
sqlite3_test_control() call.  Unlike all other SQLite APIs,
sqlite3_test_control() interface is subject to incompatible changes
from one release to the next, and so the mechanism described below
is not guaranteed to work in future releases of SQLite.  The
SQLite developers do not consider this a problem because imposter
tables should not be used in applications.  Imposter tables are for
analysis and testing use only.



To create a transient imposter table, first call sqlite3_test_control()
as follows:


sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, "main", 1, tnum);



The "db" parameter is a pointer to the database connection.
The "main" argument is the name of the schema in which the imposter
table is to be created.  The "1" argument enables the imposter table
mechanism.  "tnum" is the root page of the index that the imposter
table should mirror.



After the sqlite3_test_control() call above, then run a CREATE TABLE
statement the defines the imposter table.
With the imposter mechanism enabled, this CREATE TABLE statement does
not create a real table but instead merely adds an entry in SQLite's
internal symbol table.  Note that the CREATE TABLE statement must
be in the correct format for the index.  If the imposter table has the
wrong number of columns or is not a WITHOUT ROWID table or is otherwise
incompatible with the index b-tree, then SQLITE_CORRUPT errors will result
when the imposter table is used.



After running the CREATE TABLE statement, disable the imposter mechanism
as follows:


sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, "main", 0, 0);



In other words, make the same sqlite3_test_control() call except change
the last two parameters to zero.



After the imposter table is loaded into SQLite's internal schema as
described above, the imposter table can be used as any other table.
But the imposter table will only be visible to the one database
connection that created it.  No changes are made to the database file
on disk.  And the imposter table will disappear the next time the schema 
is loaded.




2.3. The .imposter Shell Command


As of SQLite 3.16.0 (2017-01-02), the command-line shell contains
a dot-command ".imposter" that does all of the work of setting up a
transient imposter table.
Instead of making multiple calls to sqlite3_test_control() and figuring
out and invoking a compatible CREATE TABLE statement, a transient
imposter table can be constructed as follows:


.imposter t1bc t2



Of course, substitute the desired index and imposter table names in
place of the "t1bc" and "t2" shown in the example.
The ".imposter" command reads the schema of the "t1bc" index, uses
that information to construct a compatible CREATE TABLE statement for
the imposter table, then makes all the necessary calls to create the
transient imposter table automatically.


3. Summary And Final Warning


The imposter table mechanism is a power analysis and debugging tool
for SQLite.  But as with all sharp tools, it can also be dangerous and
can result in corrupt database files if misused.  Do not attempt to
use imposter tables in an application.  Imposter tables are intended
for use in the laboratory by experts.

This page last modified on  2020-06-18 21:18:56 UTCimposter.html
 `‚6       7ÁThe CSV Virtual Table1. Overview


The CSV virtual table reads
RFC 4180 formatted comma-separated
values, and returns that content as if it were rows and columns of an SQL
table.



The CSV virtual table is useful to applications that need to bulk-load
large amounts of comma-separated value content.
The CSV virtual table is also useful as a template source file for
implementing other virtual tables.




The CSV virtual table is not built into the SQLite amalgamation.
It is av@¹f‚5        +ó'Imposter Tables1. Introduction


An imposter table is a table that is attached to the same b-tree
as an index.
An imposter table allows the content of an index to be queried or
modified as if the index were an ordinary table.



Imposter tables are intended for analysis and debugging only.
This is not a feature that most application developers should understand
or even know about.
Imposter tables are for experts only.



Improper use of imposter tables can cause index corruption, though
any corruption created this way can be fixed by running REINDEX.


2. Details


Each table and each index in SQLite is stored in a separate b-tree
in the database file.  Each b-tree is identified by its root page
number.  The root page number for any index or table can be found
by querying the "rootpage" column of the sqlite_schema table.
See the indexing tutorial and the file format documentation
for further background on this design.



Usually the b-trees for tables and indexes are slightly different.
A table b-tree contains a 64-bit integer key and arbitrary data.
The 64-bit integer key is the ROWID.  Index b-trees contain
an arbitrary binary key and no data.  So table b-trees and index
b-trees are not directly compatible.



However, the b-tree for a WITHOUT ROWID table is in the same format
as an index b-tree.  Thus, an index b-tree can be accessed as if it
were a WITHOUT ROWID table.


2.1. Manually Created Imposter Tables


One way to create an imposter table is to directly edit the sqlite_schema
table to insert a new row that describes the table.
For example, suppose the schema is like this:


CREATE TABLE t1(a INTEGER PRIMARY KEY,b TEXT,c INT, d INT);
CREATE INDEX t1bc ON t1(b,c);



The WITHOUT ROWID table that has the same structure as the t1bc index
would look like this:


CREATE TABLE t2(b TEXT,c INT,a INT, PRIMARY KEY(b,c,a)) WITHOUT ROWID;



To create a permanent imposter table "t2" against index "t1bc" one
should first enable editing of the sqlite_schema table by running
"PRAGMA writable_schema=ON".
(Be careful to observe the warnings that accompany this PRAGMA.
A mistake can cause severe database corruption.)
Then insert a new entry into the sqlite_schema table like this:


INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)
 SELECT 'table','t2','t2',rootpage,
   'CREATE TABLE t2(b,c,a,PRIMARY KEY(b,c,a))WITHOUT ROWID'
   FROM sqlite_schema
  WHERE name='t1bc';



The INSERT statement above adds a new row to the sqlite_schema table that
defines a table "t2" having the same on-disk format as index "t1bc" and 
pointing to the same b-tree.
After adding this sqlite_schema table entry, it is necessary to close and
reopen the database in order to get SQLite to reread the schema.
Then the "t2" table can be queried to see the content of the "t1bc" index.


2.1.1. Corrupted Database


A serious problem with the manual imposter table approach described above
is that after adding the new "t2" entry to the "sqlite_schema" table, the
database file will technically be corrupt.  Both the "t1bc" index and the
"t2" table will point to the same b-tree.  This will not cause
any immediate problems, though one should avoid running VACUUM.



It is possible to write into the "t2" table, thus changing the content
of the index.
But doing so will get the>ailable as a
separate source file
that can be compiled into a loadable extension.
Typical usage of the CSV virtual table from the
command-line shell would be something like this:

.load ./csv
CREATE VIRTUAL TABLE temp.t1 USING csv(filename='thefile.csv');
SELECT * FROM t1;



The first line of the script above causes the command-line shell to
read and activate the run-time loadable extension for CSV.  For an
application, the equivalent C-language API is
sqlite3_load_extension().
Observe that the filename extension (ex: ".dll" or ".so" or ".dylib") is
omitted from the extension filename.  Omitting the filename extension is
not required, but it helps in making the script cross-platform.  SQLite
will automatically append the appropriate extension.


The second line above creates a virtual table named "t1" that reads
the content of the file named in the argument.  The number and names of
the columns is determined automatically by reading the first line of
content.  Other options to the CSV virtual table provide the ability to
take the CSV content from a string rather than a separate file, and give 
the programmer more control over the number and names of the columns.
The options are detailed below.  The CSV virtual table is usually
created as a TEMP table so that it exists only for the current database
connection and does not become a permanent part of the database schema.
Note that there is no "CREATE TEMP VIRTUAL TABLE" command in SQLite.
Instead, prepend the "temp." schema prefix to the name of the virtual
table.


The third line of the example shows the virtual table being used, to read
all content of the CSV file.  This is perhaps the simplest possible use
of the virtual table.  The CSV virtual table can be used anywhere an ordinary
virtual table can be used.  One can use the CSV virtual table inside subqueries,
or common table expressions or add WHERE, GROUP BY, HAVING, ORDER BY,
and LIMIT clauses as required.

2. Arguments


The example above showed a single filename='thefile.csv' argument
for the CSV virtual table.  But other arguments are also possible.


filename=FILENAME
The filename= argument specifies an external file from which
CSV content is read.  Every CSV virtual table must have either a 
filename= argument or a data= argument and not both.

data=TEXT
The data= argument specifies that TEXT is the literal
content of the CSV file.

schema=SCHEMA
 The schema= argument specifies a CREATE TABLE statement that
the CSV virtual table passes to the sqlite3_declare_vtab() interface in
order to define the names of the columns in the virtual table.

columns=N
The columns=N argument specifies the number of columns
in the CSV file.
If the input data contains more columns than this,
then the excess columns are ignored.  If the input data contains fewer columns,
then extra columns are filled with NULL.
If the columns=N argument is omitted, the first line of the
CSV file is read to determine the number of columns.

header=BOOLEAN
or just
header
If the header argument is true then the first row of the CSV file
to be treated as a header rather than as data.  The second line of the CSV
file becomes the first row of content.
If the schema= options is omitted, then the first line of the CSV
file determines the names of the columns.


3. Column Names


The column names of the virtual table are determined primarily by the
schema= argument.
If the schema= argument is omitted, but header is true, then
the values found in the first line of the CSV file become the column names.
If the schema= argument is omitted and header is false, then
the columns are named "c0", "c1", "c2", and so forth.
This page last modified on  2018-11-16 01:45:15 UTCcsv.htmlurning the
recovered database to service.

2. Recovery Using The ".recover" Command In The CLI


The easiest way to manually recover a corrupt database is using
the Command Line Interface or "CLI" for SQLite.  The CLI is a program
named "sqlite3".  Use it to recover a corrupt database file using
a command similar to the following:

sqlite3 corrupt.db .recover &gt;data.sql



This will generate SQL text in the file named "data.sql" that can be used
to reconstruct the original database:

sqlite3 recovered.db &lt;data.sql



The ".recover" option is actually a command that is issued to the
CLI.  That command can accept arguments.  For example, by running:

sqlite3 corruptdb ".recover --ignore-freelist" &gt;data.sql



Notice that the ".recover" command and its arguments must be contained
in quotes.  The following options are supported:



--ignore-freelist

Ignore pages of the database that appear to be part of the
freelist.  Normally the freelist is scanned, and if it contains
pages that look like they have content, that content is output.
But if the page really is on the freelist, that can mean that
previously deleted information is reintroduced into the database.


--lost-and-found TABLE

If content is found during recovery that cannot be associated
with a particular table, it is put into the "lost_and_found"
table.  Use this option to change the name of the
"lost_and_found" table to "TABLE".


--no-rowids

If this option is provided, then rowid values that are not also
INTEGER PRIMARY KEY values are not extracted from the
corrupt database.




3. Building The Recovery API Into An Application

3.1. Source Code Files

If you want to build the recovery API into your application, you will
need to add some source files to your build, above and beyond the usual
"sqlite3.c" and "sqlite3.h" source files.  You will need:






sqlite3recover.c

This is the main source file that implements the recovery API.





sqlite3recover.h

This is the header file that goes with sqlite3recover.h.





dbdata.c

This file implements two virtual tables name "sqlite_dbdata" and
"sqlite_dbptr" that required by sqlite3recover.c.






The two C source file above need to be linked into your application in the
same way as "sqlite3.c" is linked in.  And the header file needs to be
accessible to the compiler when the C files are being compiled.

3.2. How To Implement Recovery

These are the basic steps needed to recover content from a corrupt
Database:



Creates an sqlite3_recover handle by calling either
sqlite3_recover_init() or sqlite3_recover_init_sql().
Use sqlite3_recover_init() to store the recovered content
in a separate database and use sqlite3_recover_init_sql()
to generate SQL text that will reconstruct the database.


Make zero or more calls to sqlite3_recover_config() to set
options on the new sqlite3_recovery handle.


Invoke sqlite3_recover_step() repeatedly
until it returns something other than SQLITE_OK. If it
returns SQLITE_DONE, then the recovery operation completed without 
error. If it returns some other non-SQLITE_OK value, then an error 
has occurred.  The sqlite3_recover_run() interface is also
available as a convenience wrapper that simply invokes
sqlite3_recover_step() repeatedly until it returns something other
than SQLITE_DONE.


Retrieves any error code and English language error message using the
sqlite3_recover_errcode() and sqlite3_recover_errmsg() interfaces,
respectively.


Invoke sqlite3_recover_finish() to destroy the sqlite3_recover object.



Details of the interface are described in comments in the
sqlite3_recover.h header file.

3.3. Example Implementations



Examples of how the recovery extension is used by SQLite itself
can be seen at the following links:


https://sqlite.org/src/info/30475c820dc5ab8a8?ln=999,1026

An example of the recovery extension found in the 
"fuzzcheck" testing utility in the SQLite tree.

https://sqlite.org/src/info/84bb08d8762920285f08f1c0?ln=7299,7361

The code that implements the ".recover" command in the CLI.

This page last modified on  2022-11-04 15:23:18 UTCrecovery.html
êê¶
‚7      ië'Recovering Data From A Corrupt SQLite Database1. Recovering (Some) Data From A Corrupt SQLite Database


SQLite databases are remarkably rebust.  Application faults and
power failures typically leave the content of the database intact.
However, it is possible to corrupt an SQLite database.
For example, hardware malfunctions can damage the database file, or a
rogue process can open the database and overwrite parts of it.


Given a corrupt database file, it is sometimes desirable to try to
salvage as much data from the file as possible.  The recovery API
is designed to facilitate this.

1.1. Limitations


It is sometimes possible to perfectly restore a database that has
gone corrupt, but that is the exception.  Usually
the recovered database will be defective in a number of ways:



Some content might be permanently deleted and unrecoverable.
This can happen, for example, if a rogue process overwrites part
of the database file.


Previously deleted content might reappear.  Normally when SQLite
does a DELETE operation, it does not actually overwrite the old content
but instead remembers that space is available for reuse during the next
INSERT.  If such deleted content is still in the file when a recovery
is attempted, it might be extracted and "resurrected".


Recovered content might be altered.
For example, the value stored in a particular row
might change from 48 to 49.  Or it might change from an integer into
a string or blob.  A value that was NULL might become an integer.
A string value might become a BLOB.  And so forth.


Constraints may not be valid after recovery.  CHECK constraints, 
FOREIGN KEY constraints, UNIQUE constraints, type constraints on
STRICT tables - any of these might be violated in the recovered
database.


Content might be moved from one table into another.



The recovery API does as good of a job as it can at restoring a database,
but the results will always be suspect.  Sometimes (for example if the
corruption is restricted to indexes) the recovery will perfectly restore
the database content.  However in other cases, the recovery will be imperfect.
The impact of this imperfection depends on the application.  A database that
holds a list of bookmarks is still a list of bookmarks after recovery.
A few bookmarks might be missing or added or altered after recovery, but
the list is "fuzzy" and imperfect to begin with so adding a bit more
uncertainty will not be fatal to the application.  But if an accounting
database goes corrupt and is subsequently recovered, the books might be
out of balance.


It is best to think of the recovery API as a salvage undertaking.
Recovery will extract as much usable data as it can from the wreck
of the old database, but some parts may be damaged beyond repair and
some rework and testing should be performed prior to retADas integer affinity.


AUTOINCREMENT does not work on WITHOUT ROWID tables.
The AUTOINCREMENT mechanism assumes the presence of a rowid and so it
does not work on a WITHOUT ROWID table.  An error is raised if the
 "AUTOINCREMENT" keyword is used in the CREATE TABLE statement for
a WITHOUT ROWID table.


NOT NULL is enforced on every column of the PRIMARY KEY in a WITHOUT
ROWID table.
This is in accordance with the SQL standard.  Each column of a PRIMARY KEY
is supposed to be individually NOT NULL.  However, NOT NULL was not enforced
on PRIMARY KEY columns by early versions of SQLite due to a bug.  By the
time that this bug was discovered, so many SQLite databases were already
in circulation that the decision was made not to fix this bug for fear of
breaking compatibility.  So, ordinary rowid tables in SQLite violate the
SQL standard and allow NULL values in PRIMARY KEY fields.  But WITHOUT ROWID
tables do follow the standard and will throw an error on any attempt to
insert a NULL into a PRIMARY KEY column.


The sqlite3_last_insert_rowid() function
does not work for WITHOUT ROWID tables.
Inserts into a WITHOUT ROWID do not change the value returned by the
sqlite3_last_insert_rowid() function.  The last_insert_rowid() SQL
function is also unaffected since it is just a wrapper around
sqlite3_last_insert_rowid().


The incremental blob I/O mechanism does not work
for WITHOUT ROWID tables.
Incremental BLOB I/O uses the rowid to create an sqlite3_blob object for
doing the direct I/O.  However, WITHOUT ROWID tables do not have a rowid,
and so there is no way to create an sqlite3_blob object for a WITHOUT
ROWID table.


The sqlite3_update_hook() interface does not fire callbacks for changes
to a WITHOUT ROWID table.
Part of the callback from sqlite3_update_hook() is the rowid of the table
row that has changed.  However, WITHOUT ROWID tables do not have a rowid.
Hence, the update hook is not invoked when a WITHOUT ROWID table changes.




3. Benefits Of WITHOUT ROWID Tables

A WITHOUT ROWID table is an optimization that can reduce storage and
processing requirements.

In an ordinary SQLite table, the PRIMARY KEY is really just a 
UNIQUE index.  The key used to look up records on disk
is the rowid.
The special "INTEGER PRIMARY KEY" column type in ordinary SQLite tables 
causes the column to be an alias for the rowid, and so an INTEGER PRIMARY
KEY is a true PRIMARY KEY.  But any other kind of PRIMARY KEYs, including
"INT PRIMARY KEY" are just unique indexes in an ordinary rowid table.

Consider a table (shown below) intended to store a
vocabulary of words together with a count of the number of occurrences of
each word in some text corpus:


CREATE TABLE IF NOT EXISTS wordcount(
  word TEXT PRIMARY KEY,
  cnt INTEGER
);


As an ordinary SQLite table, "wordcount" is implemented as two
separate B-Trees.  The main table uses the hidden rowid value as the key
and stores the "word" and "cnt" columns as data.  The "TEXT PRIMARY KEY"
phrase of the CREATE TABLE statement
causes the creation of an unique index on the "word" column.  This index is a
separate B-Tree that uses "word" and the "rowid" as the key and stores no
data at all.  Note that the complete text of every "word" is stored twice:
once in the main table and again in the index.

Consider querying this table to find the number of occurrences of the
word "xyzzy".:


SELECT cnt FROM wordcount WHERE word='xyzzy';


This query first has to search the index B-Tree looking for any entry
that contains the matching value for "word".  When an entry is found in
the index, the rowid is extracted and used to search the main table.
Then the "cnt" value is read out of the main table and returned.  Hence, two
separate binary searches are required to fulfill the request.

A WITHOUT ROWID table uses a different data design for the equivalent
table.


CREATE TABLE IF NOT EXISTS wordcount(
  word TEXT PRIMARY KEY,
  cnt INTEGER
) WITHOUT ROWID;


In this latter table, there is only a single B-Tree which uses the "word"
column as its key and the "cnt" column as its data.  (Technicality:  the
low-level implementation actually stores both "word" and "cnt" in the "key"
area of the B-Tree.  But unless you are looking at the low-level byte encoding
of the database file, that fact is unimportant.)  Because there is only
a single B-Tree, the text of the "word" column is only stored once in the
database.  Furthermore, querying the "cnt" value for a specific "word"
only involves a single binary search into the main B-Tree, since the "cnt"
value can be retrieved directly from the record found by that first search
and without the need to do a second binary search on the rowid.

Thus, in some cases, a WITHOUT ROWID table can use about half the amount
of disk space and can operate nearly twice as fast.  Of course, in a 
real-world schema, there will typically be secondary indices and/or
UNIQUE constraints, and the situation is more complicated.  But even then,
there can often be space and performance advantages to using WITHOUT ROWID
on tables that have non-integer or composite PRIMARY KEYs.



4. When To Use WITHOUT ROWID

The WITHOUT ROWID optimization is likely to be helpful for tables
that have non-integer or composite (multi-column) PRIMARY KEYs and that do
not store large strings or BLOBs.

WITHOUT ROWID tables will work correctly (that is to say, they
provide the correct answer) for tables with a single INTEGER PRIMARY KEY. 
However, ordinary rowid tables will run faster in that case.  
Hence, it is good design
to avoid creating WITHOUT ROWID tables with single-column PRIMARY KEYs 
of type INTEGER.

WITHOUT ROWID tables work best when individual rows are not too large.
A good rule-of-thumb is that the average size of a single row in a
WITHOUT ROWID table should be less than about 1/20th the size of 
a database page.  That means that rows should not contain more than about
50 bytes each for a 1KiB page size or about 200 bytes each for 4KiB
page size.  WITHOUT ROWID tables will work (in the sense that
they get the correct answer) for arbitrarily large rows - up to 2GB in size -
but traditional rowid tables tend to work faster for large row sizes.
This is because rowid tables are implemented as B*-Trees where
all content is stored in the leaves of the tree, whereas WITHOUT ROWID 
tables are implemented using ordinary B-Trees with content stored on both
leaves and intermediate nodes.  Storing content in 
intermediate nodes causes each intermediate node entry to take up more
space on the page and thus reduces the fan-out, increasing the search cost.

The "sqlite3_analyzer.exe" utility program, available as source code
in the SQLite source tree or as a precompiled binary on the
SQLite Download page, can be
used to measure the average sizes of table rows in an existing SQLite
database.

Note that except for a few corner-case differences detailed above,
WITHOUT ROWID tables and rowid tables work the same.  They both generate
the same answers given the same SQL statements.  So it is a simple matter
to run experiments on an application, late in the development cycle,
to test whether or not the use of WITHOUT ROWID tables will be helpful.
A good strategy is to simply not worry about WITHOUT ROWID until near
the end of product development, then go back and run tests to see
if adding WITHOUT ROWID to tables with non-integer PRIMARY KEYs helps
or hurts performance, and retaining the WITHOUT ROWID only in those cases
where it helps.

5. Determining If An Existing Table Is WITHOUT ROWID

A WITHOUT ROWID table returns the same content for
PRAGMA table_info and PRAGMA table_xinfo as does an ordinary
table.  But unlike an ordinary table, a WITHOUT ROWID also
responds to the PRAGMA index_info command.  The PRAGMA index_info
on a WITHOUT ROWID table returns information abou the PRIMARY KEY
for the table.  In this way, the PRAGMA index_info command can be
used to unabiguously determine whether a particular table is a 
WITHOUT ROWID table or an ordinary table - an ordinary table will
always return no rows but a WITHOUT ROWID table will always return
one or more rows.
This page last modified on  2022-01-20 21:38:08 UTCwithoutrowid.html
zzÚv‚8
u´[/Clustered Indexes and the WITHOUT ROWID Optimization1. Introduction

By default, every row in SQLite has a special column, usually called the
"rowid", that uniquely identifies that row within the table.  However
if the phrase "WITHOUT ROWID" is added to the end of a CREATE TABLE statement,
then the special "rowid" column is omitted.  There are sometimes
space and performance advantages to omitting the rowid.

A WITHOUT ROWID table is a table that uses a 
Clustered Index
as the primary key.

1.1. Syntax

To create a WITHOUT ROWID table, simply add the keywords "WITHOUT ROWID"
to the end of the CREATE TABLE statement.  For example:


CREATE TABLE IF NOT EXISTS wordcount(
  word TEXT PRIMARY KEY,
  cnt INTEGER
) WITHOUT ROWID;


As with all SQL syntax, the case of the keywords does not matter.  
One can write "WITHOUT rowid" or "without rowid" or "WiThOuT rOwId" and
it will mean the same thing.

Every WITHOUT ROWID table must have a PRIMARY KEY.  An error is raised
if a CREATE TABLE statement with the WITHOUT ROWID clause lacks a PRIMARY KEY.

In most contexts, the special "rowid" column of normal tables can 
also be called "oid" or "_rowid_".  However, only "rowid" works as 
the keyword in the CREATE TABLE statement.

1.2. Compatibility

SQLite version 3.8.2 (2013-12-06) or later 
is necessary in order to use a WITHOUT
ROWID table.  An attempt to open a database that contains one or more WITHOUT
ROWID tables using an earlier version of SQLite will result in a
"malformed database schema" error.

1.3. Quirks

WITHOUT ROWID is found only in SQLite and is not compatible
with any other SQL database engine, as far as we know.
In an elegant system, all tables would behave as WITHOUT ROWID
tables even without the WITHOUT ROWID keyword.  However, when SQLite was
first designed, it used only integer rowids for row keys 
to simplify the implementation.
This approach worked well for many years.  But as the demands on
SQLite grew, the need for tables in which the PRIMARY KEY really did
correspond to the underlying row key grew more acute.  The WITHOUT ROWID
concept was added
in order to meet that need without breaking backwards
compatibility with the billions of SQLite databases already in use at
the time (circa 2013).

2. Differences From Ordinary Rowid Tables

The WITHOUT ROWID syntax is an optimization.  It provides no new
capabilities.  Anything that can be done using a WITHOUT ROWID table
can also be done in exactly the same way, and exactly the same syntax,
using an ordinary rowid table.  The only advantage of a WITHOUT ROWID
table is that it can sometimes use less disk space and/or perform a little
faster than an ordinary rowid table.

For the most part, ordinary rowid tables and WITHOUT ROWID tables
are interchangeable.  But there are some additional restrictions on
WITHOUT ROWID tables that do not apply to ordinary rowid tables:



Every WITHOUT ROWID table must have a PRIMARY KEY.
An attempt to create a WITHOUT ROWID table without a PRIMARY KEY results
in an error.


The special behaviors associated "INTEGER PRIMARY KEY" do not apply
on WITHOUT ROWID tables.
In an ordinary table, "INTEGER PRIMARY KEY" means that the column is an
alias for the rowid.  But since there is no rowid in a WITHOUT ROWID
table, that special meaning no longer applies.  An "INTEGER PRIMARY KEY" 
column in a WITHOUT ROWID table works
like an "INT PRIMARY KEY" column in an ordinary table: It is a PRIMARY KEY
that hC
LLŸ0‚9      -¾)SQLite CopyrightSQLite Is Public Domain




SQLite is in the
Public Domain




All of the code and documentation in SQLite has been dedicated to the
public domain
by the authors.
All code authors, and representatives of the companies they work for,
have signed affidavits dedicating their contributions to
the public domain and originals of
those signed affidavits are stored in a firesafe at the main offices
of Hwaci.  All contributors are citizens
of countries that allow creative works to be dedicated into the public
domain.
Anyone is free to copy, modify, publish, use, compile, sell, or distribute
the original SQLite code, either in source code form or as a compiled binary,
for any purpose, commercial or non-commercial, and by any means.



The previous paragraph applies to the deliverable code and documentation
in SQLite - those parts of the SQLite library that you actually bundle and
ship with a larger application.  Some scripts used as part of the
build process (for example the "configure" scripts generated by autoconf)
might fall under other open-source licenses.  Nothing from these build 
scripts ever reaches the final deliverable SQLite library, however, and 
so the licenses associated with those scripts should not be 
a factor in assessing your rights to copy and use the SQLite library.



All of the deliverable code in SQLite has been written from scratch.
No code has been taken from other projects or from the open
internet.  Every line of code can be traced back to its original
author, and all of those authors have public domain dedications
on file.  So the SQLite code base is clean and is
uncontaminated with licensed code from other projects.




Open-Source, not Open-Contribution


SQLite is open-source, meaning that you can make as many copies of it as
you want and do whatever you want with those copies, without limitation.
But SQLite is not open-contribution.  In order to keep SQLite in the public
domain and ensure that the code does not become contaminated with proprietary
or licensed content, the project does not accept patches from people who
have not submitted an affidavit dedicating their contribution into the
public domain.


All of the code in SQLite is original, having been written
specifically for use by SQLite.  No code has been copied from unknown
sources on the internet.










Warranty of Title


SQLite is in the public domain and does not require a license.
Even so, some organizations want legal proof of their right to use
SQLite.  Circumstances where this might occurs include the following:



 Your company desires indemnity against claims of copyright infringement.
 You are using SQLite in a jurisdiction that does not recognize
     the public domain.  
 You are using SQLite in a jurisdiction that does not recognize
     the right of an author to dedicate their work to the public
     domain. 
 You want to hold a tangible legal document
     as evidence that you have the legal right to use and distribute
     SQLite. 
 Your legal department tells you that you must purchase a license.
     



If any of the above circumstances apply to you,
Hwaci, the company that employs 
all the developers of SQLite, will 
sell you
a Warranty of Title for SQLite.
A Warranty of Title is a legal document that asserts that the claimed
authors of SQLite are the true authors, and that the authors 
have the legal right to dedicate the SQLite to the public domain, and 
that Hwaci will vigorously defend against challenges to those claims.
All proceeds from the sale of SQLite Warranties of Title are used to fund
continuing improvement and support of SQLite.


Contributed Code


In order to keep SQLite completely free and unencumbered by copyright,
the project does not accept patches.  If you would like to suggest a
change and you include a patch as a proof-of-concept, that would
be great.  However, please do not be offended if we rewrite your patch
from scratch.
This page last modified on  2021-11-10 19:19:27 UTCcopyright.html
ÊÊž2‚: S»})Benefits of SQLite As A File FormatSQLite As An Application File Format


(Note:  The current page is a brief summary of why SQLite makes
a good application file format.  The topic is considered at greater
detail in a separate technical note.)


SQLite has been used with great success as the on-disk file format
for desktop applications such as version control systems,
financial analysis tools, media cataloging and editing suites, CAD
packages, record keeping programs, and so forth.  The traditional
File/Open operation calls sqlite3_open() to attach to the database
file.  Updates happen automatically as application content is revised
so the File/Save menu option becomes superfluous.  The File/Save_As
menu option can be implemented using the backup API.



There are many advantages to using SQLite as an application file format,
including:



Better performance

 Reading and writing from an SQLite database
     is often faster than reading and writing individual files from disk.
     See 35% Faster Than The Filesystem
     and Internal Versus External BLOBs.
 The application only has to load the data it needs, rather
     than reading the entire file and holding a complete parse
     in memory.
 Small edits only overwrite the parts of the file that change,
     reducing write time and wear on SSD drives.

Reduced application cost and complexity

 No application file I/O code to write and debug.
 Content can be accessed and updated using concise SQL queries instead
     of lengthy and error-prone procedural routines.
 The file format can be extended in future releases simply
     by adding new tables and/or column, preserving backwards compatibility.
 Applications can leverage the
     full-text search and RTREE indexes and use triggers to implement
     an automated undo/redo stack.
 Performance problems can often be resolved, even late in the
     development cycle, using CREATE INDEX, avoiding costly
     redesign, rewrite, and retest efforts.

Portability

 The application file is portable across all operating systems,
     32-bit and 64-bit and big- and little-endian architectures.
 A federation of programs, perhaps all written in different programming
     languages, can access the same application file with no
     compatibility concerns.
 Multiple processes can attach to the same application
     file and can read and write without interfering with each another.
 Diverse content which might otherwise be stored as a "pile-of-files"
     is encapsulated into a single disk file for simpler transport
     via scp/ftp, USB stick, and/or email attachment.

Reliability

 Content can be updated continuously and atomically so 
     that little or no work is lost in a power failure or crash.
 Bugs are far less likely in SQLite than in custom-written file I/O code.
 SQL queries are many times smaller than the equivalent procedural
     code, and since the number of bugs per line of code is roughly
     constant, this means fewer bugs overall.

Accessibility

 SQLite database content can be viewed using a wide variety
     third-party tools.
 Content stored in an SQLite database is more likely to be 
     recoverable decades in the future, long after all traces of
     the original application have been lost. Data lives longer than code.
 SQLite database files are recommended by the US Library of Congress
     as a storage format for long-term preservation of digital content.




SQLite allows database files to have any desired filename extension, so
an application can choose a custom filename extension for its own use, if
desired.  The application_id pragma can be used to set an "Application ID"
integer in the database file so that tools like
file(1) can determine that the file
is associated with your application and is not just a generic
SQL database.
This page last modified on  2018-05-29 18:35:58 UTCaff_short.htmlly only be used by
applications written in the same language. It is difficult to
get an application written in Haskell or Java to invoke a library
written in C++.  On the other hand, libraries written in C are
callable from any programming language.


Object-Oriented is a design pattern, not a programming language.
You can do object-oriented programming in any language you want,
including assembly language.  Some languages (ex: C++ or Java) make
object-oriented easier.  But you can still do object-oriented programming
in languages like C.


Object-oriented is not the only valid design pattern.
Many programmers have been taught to think purely in terms of
objects.  And, to be fair, objects are often a good way to
decompose a problem.  But objects are not the only way, and are
not always the best way to decompose a problem.  Sometimes good old
procedural code is easier to write, easier to maintain and understand,
and faster than object-oriented code.


When SQLite was first being developed, Java was a young and immature
language.  C++ was older, but was undergoing such growing pains that
it was difficult to find any two C++ compilers that worked the same
way.  So C was definitely a better choice back when SQLite was first
being developed.  The situation is less stark now, but there is little
to no benefit in recoding SQLite at this point.


3. Why Isn't SQLite Coded In A "Safe" Language?


There has lately been a lot of interest in "safe" programming languages
like Rust or Go in which it is impossible, or is at least difficult, to make
common programming errors like memory leaks or array overruns.  So the
question often arises as to why SQLite is not coded in a "safe" language.



None of the safe programming languages existed for the first 10 years
of SQLite's existence.  SQLite could be recoded in Go or Rust, but doing
so would probably introduce far more bugs than would be fixed, and it
seems also likely to result in slower code.


Safe languages insert additional machine branches to do things like
verify that array accesses are in-bounds.  In correct code, those
branches are never taken.  That means that the machine code cannot
be 100% branch tested, which is an important component of SQLite's
quality strategy.


Safe languages usually want to abort if they encounter an out-of-memory
(OOM) situation.  SQLite is designed to recover gracefully from an OOM.
It is unclear how this could be accomplished in the current crop of
safe languages.


All of the existing safe languages are new.  The developers of SQLite
applaud the efforts of computer language researchers in trying to
develop languages that are easier to program safely.  We encourage these
efforts to continue.  But we ourselves are more interested in old and
boring languages when it comes to implementing SQLite.



All that said, it is possible that SQLite might
one day be recoded in Rust.  Recoding SQLite in Go is unlikely
since Go hates assert().  But Rust is a possibility.  Some
preconditions that must occur before SQLite is recoded in Rust
include:



 Rust needs to mature a little more, stop changing so fast, and
     move further toward being old and boring.
 Rust needs to demonstrate that it can be used to create general-purpose
     libraries that are callable from all other programming languages.
 Rust needs to demonstrate that it can produce object code that
     works on obscure embedded devices, including devices that lack
     an operating system.
 Rust needs to pick up the necessary tooling that enables one to
     do 100% branch coverage testing of the compiled binaries.
 Rust needs a mechanism to recover gracefully from OOM errors.
 Rust needs to demonstrate that it can do the kinds of work that
     C does in SQLite without a significant speed penalty.



If you are a "rustacean" and feel that Rust already meets the
preconditions listed above, and that SQLite should be recoded in
Rust, then you are welcomed and encouraged
to contact the SQLite developers privately
and argue your case.
This page last modified on  2022-07-29 00:41:26 UTCwhyc.html
66·>‚;        =î5Why Is SQLite Coded In C1. C Is Best


Note: Sections 2.0 and 3.0 of this article were added in response
to comments on 
Hacker News and
Reddit.



Since its inception on 2000-05-29, SQLite has been implemented in generic C.
C was and continues to be the best language for implementing a software
library like SQLite.  There are no plans to recode SQLite in any other
programming language at this time.


The reasons why C is the best language to implement SQLite include:



 Performance
 Compatibility
 Low-dependency
 Stability


1.1. Performance

An intensively used low-level library like SQLite needs to be fast.
(And SQLite is fast, see Internal Versus External BLOBs and
35% Faster Than The Filesystem for example.)

C is a great language for writing fast code.  C is sometimes
described as "portable assembly language".  It enables to developers
to code as close to the underlying hardware as possible while still
remaining portable across platforms.

Other programming languages sometimes claim to be "as fast as C".
But no other language claims to be faster than C for general-purpose
programming, because none are.

1.2. Compatibility

Nearly all systems have the ability to call libraries
written in C.  This is not true of other implementation languages.

So, for example, Android applications written in Java are able to
invoke SQLite (through an adaptor).  Maybe it would have been more
convenient for Android if SQLite had been coded in Java as that would
make the interface simpler.  However, on iPhone applications are coded
in Objective-C or Swift, neither of which have the ability to call
libraries written in Java.  Thus, SQLite would be unusable on iPhones
had it been written in Java.

1.3. Low-Dependency

Libraries written in C do not have a huge run-time dependency.
In its minimum configuration, SQLite requires only the following
routines from the standard C library:






 memcmp()
 memcpy()
 memmove()
 memset()


&nbsp;&nbsp;&nbsp;


 strcmp()
 strlen()
 strncmp()







In a more complete build, SQLite also uses library routines like
malloc() and free() and operating system interfaces for opening, reading,
writing, and closing files.  But even then, the number of dependencies
is very small.  Other "modern" language, in contrast, often require
multi-megabyte runtimes loaded with thousands and thousands of interfaces.

1.4. Stability


The C language is old and boring.
It is a well-known and well-understood language.
This is exactly what one wants when developing a module like SQLite.
Writing a small, fast, and reliable database engine is hard enough as it
is without the implementation language changing out from under you with
each update to the implementation language specification.

2. Why Isn't SQLite Coded In An Object-Oriented Language?


Some programmers cannot imagine developing a complex system like
SQLite in a language that is not "object oriented".  So why is
SQLite not coded in C++ or Java?



Libraries written in C++ or Java can generalHimum)
a copy of the entire page.

But if SQLite wants to access a page of the database file and
memory mapped I/O is enabled, it first calls the xFetch() method.
The xFetch() method asks the operating system to return a pointer to
the requested page, if possible.  If the requested page has been or
can be mapped into the application address space, then xFetch returns
a pointer to that page for SQLite to use without having to copy anything.
Skipping the copy step is what makes memory mapped I/O faster.

SQLite does not assume that the xFetch() method will work.  If
a call to xFetch() returns a NULL pointer (indicating that the requested
page is not currently mapped into the applications address space) then
SQLite silently falls back to using xRead().  An error is only reported
if xRead() also fails.

When updating the database file, SQLite always makes a copy of the
page content into heap memory before modifying the page.  This is necessary
for two reasons.  First, changes to the database
are not supposed to be visible to other processes until
after the transaction commits and so the changes must occur in private memory.
Second, SQLite uses a read-only memory map to prevent stray pointers in the 
application from overwriting and corrupting the database file.


After all needed changes are completed, xWrite() is used to move the content
back into the database file.
Hence the use of memory mapped I/O does not significantly change the
performance of database changes.
Memory mapped I/O is mostly a benefit for queries.

Configuring Memory-Mapped I/O

The "mmap_size" is the maximum number of bytes of the database file that
SQLite will try to map into the process address space at one time.  The
mmap_size applies separately to each database file, so the total amount
of process address space that could potentially be used is the mmap_size
times the number of open database files.

To activate memory-mapped I/O, an application can set the mmap_size to some
large value.  For example:


PRAGMA mmap_size=268435456;


To disable memory-mapped I/O, simply set the mmap_size to zero:


PRAGMA mmap_size=0;


If mmap_size is set to N then all current implementations map the first
N bytes of the database file and use legacy xRead() calls for any content
beyond N bytes.  If the database file is smaller than N bytes, then the entire
file is mapped.  In the future, new OS interfaces could, in theory, map
regions of the file other than the first N bytes, but no such 
implementation currently exists.

The mmap_size is set separately for each database file using the
"PRAGMA mmap_size" statement.  The usual default mmap_size is zero,
meaning that memory mapped I/O is disabled by default.  However, the
default mmap_size can be increased either at compile-time using
the SQLITE_DEFAULT_MMAP_SIZE macro or at start-time using the
sqlite3_config(SQLITE_CONFIG_MMAP_SIZE,...) interface.

SQLite also maintains a hard upper bound on the mmap_size.  Attempts
to increase the mmap_size above this hard upper bound (using
PRAGMA mmap_size) will automatically cap the mmap_size at the hard
upper bound.  If the hard upper bound is zero, then memory mapped I/O
is impossible.  The hard upper bound can be set at compile-time using
the SQLITE_MAX_MMAP_SIZE macro.  If SQLITE_MAX_MMAP_SIZE is set to
zero, then the code used to implement memory mapped I/O is omitted from
the build.  The hard upper bound is automatically set to zero on certain
platforms (ex: OpenBSD) where memory mapped I/O does not work due to the
lack of a unified buffer cache.

If the hard upper bound on mmap_size is non-zero at compilation time,
it may still be reduced or zeroed at start-time using the
sqlite3_config(SQLITE_CONFIG_MMAP_SIZE,X,Y) interface.  The X and
Y parameters must both be 64-bit signed integers. The X parameter
is the default mmap_size of the process and the Y is the new hard upper bound.
The hard upper bound cannot be increased above its compile-time setting
using SQLITE_CONFIG_MMAP_SIZE but it can be reduced or zeroed.
This page last modified on  2022-01-20 21:38:08 UTCmmap.html
´´º@‚<   /ôGMemory-Mapped I/OMemory-Mapped I/O

The default mechanism by which SQLite accesses and updates database disk
files is the xRead() and xWrite() methods of the
sqlite3_io_methods VFS object.  These methods are typically implemented as
"read()" and "write()" system calls which cause the operating system
to copy disk content between the kernel buffer cache and user space.

Beginning with version 3.7.17 (2013-05-20), SQLite has the option of 
accessing disk content directly using memory-mapped I/O and the new
xFetch() and xUnfetch() methods on sqlite3_io_methods.

There are advantages and disadvantages to using memory-mapped I/O.
Advantages include:


Many operations, especially I/O intensive operations, can be
    faster since content need not be copied between kernel space
    and user space.

The SQLite library may need less RAM since it shares pages with
    the operating-system page cache and does not always need its own copy of
    working pages.


But there are also disadvantages:


An I/O error on a memory-mapped file cannot be caught and dealt with by
    SQLite.  Instead, the I/O error causes a signal which, if not caught
    by the application, results in a program crash.

The operating system must have a unified buffer cache in order for
    the memory-mapped I/O extension to work correctly, especially in
    situations where two processes are accessing the same database
    file and one process is using memory-mapped I/O while the other
    is not.  Not all operating systems have a unified buffer cache.
    In some operating systems that claim to have a unified buffer cache,
    the implementation is buggy and can lead to corrupt databases.

Performance does not always increase with memory-mapped I/O.  In fact,
    it is possible to construct test cases where performance is reduced
    by the use of memory-mapped I/O.

Windows is unable to truncate a memory-mapped file.  Hence, on Windows,
    if an operation such as VACUUM or auto_vacuum tries to reduce the
    size of a memory-mapped database file, the size reduction attempt will
    silently fail, leaving unused space at the end of the database file.
    No data is lost due to this problem, and the unused space will be
    reused again the next time the database grows.  However if a version 
    of SQLite prior to 3.7.0 runs PRAGMA integrity_check on such a 
    database, it will (incorrectly) report database corruption due to 
    the unused space at the end.  Or if a version of SQLite prior to 3.7.0
    writes to the database while it still has unused space at the end, it
    may make that unused space inaccessible and unavailable for reuse until
    after the next VACUUM.


Because of the potential disadvantages, memory-mapped I/O is disabled
by default.  To activate memory-mapped I/O, use the mmap_size pragma
and set the mmap_size to some large number, usually 256MB or larger, depending
on how much address space your application can spare.  The rest is
automatic.  The PRAGMA mmap_size statement will be a silent no-op on
systems that do not support memory-mapped I/O.

How Memory-Mapped I/O Works

To read a page of database content using the legacy xRead() method,
SQLite first allocates a page-size chunk of heap memory then invokes
the xRead() method which causes the database page content to be copied
into the newly allocated heap memory.  This involves (at a minJMt in
an SQLITE_MISUSE error.

The SQL function creation interfaces may be called multiple
times with the same function name.
If two calls have the same function number but a different number of
arguments, for example, then two variants of the SQL function will
be registered, each taking a different number of arguments.

nArg &rarr;
The 3rd parameter is always the number of arguments that the function
accepts.  The value must be an integer between -1 and 
SQLITE_MAX_FUNCTION_ARG (default value: 127).  A value of -1 means
that the SQL function is a variadic function that can take any number
of arguments between 0 and SQLITE_MAX_FUNCTION_ARG.

eTextRep &rarr;
The 4th parameter is a 32-bit integer flag whose bits convey various
properties about the new function.  The original purpose of this
parameter was to specify the preferred text encoding for the function,
using one of the following constants:

 SQLITE_UTF8
 SQLITE_UTF16BE
 SQLITE_UTF16LE

All custom SQL functions will accept text in any encoding.  Encoding
conversions will happen automatically.  The preferred encoding merely
specifies the encoding for which the function implementation is optimized.
It is possible to specify multiple functions with the same name and the
same number of arguments, but different preferred encodings and different
callbacks used to implement the function, and SQLite will chose the
set of callbacks for which the input encodings most closely match the
preferred encoding.

The 4th parameter as more recently be extended with additional flag bits
to convey additional information about the function.  The additional
bits include:

 SQLITE_DETERMINISTIC
 SQLITE_DIRECTONLY
 SQLITE_INNOCUOUS
 SQLITE_SUBTYPE


Additional bits may be added in future versions of SQLite.

pApp &rarr;
The 5th parameter is an arbitrary pointer that is passed through
into the callback routines.  SQLite itself does nothing with this
pointer, except to make it available to the callbacks, and to pass
it into the destructor when the function is unregistered.


2.2. Multiple Calls To sqlite3_create_function() For The Same Function


It is common for an application to invoke sqlite3_create_function() multiple
times for the same SQL function.  For example, if an SQL function can take
either 2 or 3 arguments, then sqlite3_create_function() would be invoked
once for the 2-argument version and a second time for the 3-argument version.
The underlying implementation (the callbacks) can be different for both
variants.


An application can also register multiple SQL functions with the same name
and same number of arguments, but a different preferred text encoding.
In that case, SQLite will invoke the function using the callbacks for
the version whose preferred text encoding most closely matches the database
text encoding.  In this way, multiple implementations of the same function
can be provided that are optimized for UTF8 or UTF16.


If multiple calls to sqlite3_create_function() specify the same function name,
and the same number of arguments, and the same preferred text encoding, then
the callbacks and other parameters of the second call overwrite the first,
and the destructor callback from the first call (if it exists) is invoked.


2.3. Callbacks


SQLite evaluates an SQL function by invoking callback routines.

2.3.1. The Scalar Function Callback

Scalar SQL functions are implemented by a single callback in the
xFunc parameter to sqlite3_create_function().
The following code demonstrations the implementation of a "noop(X)"
scalar SQL function that merely returns its argument:

static void noopfunc(
  sqlite3_context *context,
  int argc,
  sqlite3_value **argv
){
  assert( argc==1 );
  sqlite3_result_value(context, argv&#91;0&#93;);
}



The 1st parameter, context, is a pointer to an opaque object
that describes the content from which the SQL function was invoked.  This
context point becomes the first parameter to many other routines that
the function implement might to invoke, including:



sqlite3_aggregate_context
sqlite3_context_db_handle
sqlite3_get_auxdata
sqlite3_result_Nblob
sqlite3_result_blob64
sqlite3_result_double
sqlite3_result_error
sqlite3_result_error16
sqlite3_result_error_code
sqlite3_result_error_nomem
sqlite3_result_error_toobig
sqlite3_result_int
sqlite3_result_int64
sqlite3_result_null
sqlite3_result_pointer
sqlite3_result_subtype
sqlite3_result_text
sqlite3_result_text16
sqlite3_result_text16be
sqlite3_result_text16le
sqlite3_result_text64
sqlite3_result_value
sqlite3_result_zeroblob
sqlite3_result_zeroblob64
sqlite3_set_auxdata
sqlite3_user_data




The sqlite3_result() family of functions are
used to specify the result of the scalar SQL function.  One or more of
these should be invoked by the callback to set the function return value.
If none of these routines are invoked for a specific callback, then the
return value will be NULL.

The sqlite3_user_data() routine returns a copy of the pArg
pointer that was given to sqlite3_create_function() when the SQL
function was created.

The sqlite3_context_db_handle() routine returns a pointer to the
database connection object.

The sqlite3_aggregate_context() routine is used only in the
implementations of aggregate and window functions.  Scalar functions
may not use sqlite3_aggregate_context().  The sqlite3_aggregate_context()
function is included in the interface list only for completeness.


The 2nd and 3rd arguments to the scalar SQL function implemenetation,
argc and argv, are
the number of arguments to the SQL function itself and the values for
each argument of the SQL function.
Argument values can be of any datatype and are thus stored in
instances of the sqlite3_value object.
Specific C-language values can be extracted from this object using
the sqlite3_value() family of interfaces.

2.3.2. The Aggregate Function Callbacks

Aggregate SQL functions are implemented by using two callback
functions, xStep and xFinal.  The xStep() function 
is called for each row of the aggregate and the xFinal() function
is invoked to compute the final answer at the end.
The following (slightly simplified) version of the built-in
count() function illustrates:

typedef struct CountCtx CountCtx;
struct CountCtx {
  i64 n;
};
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&#91;0&#93;)) && p ){
    p->n++;
  }
}   
static void countFinalize(sqlite3_context *context){
  CountCtx *p;
  p = sqlite3_aggregate_context(context, 0);
  sqlite3_result_int64(context, p ? p->n : 0);
}


Recall that there are two versions of the count() aggregate.
With zero arguments, count() returns a count of the number of rows.
With one argument, count() returns the number of times that the
argument was non-NULL.

The countStep() callback is invoked once for each row in the aggregate.
As you can see, the count is incremented if either there are no arguments,
or if the one argument is not NULL.

The step function for an aggregate should always begin with a call
to the sqlite3_aggregate_context() routine to fetch the persistent
state of the aggregate function.  On the first invocation of the step()
function, the aggregate context is initialized to a block of memory
that is N bytes in size, where N is the second parameter to
sqlite3_aggregate_context() and that memory is zeroed.  On all subsequent
calls to the step() function, the same block of memory is returned.
Except, sqlite3_aggregate_context() might return NULL in the case of
an out-of-memory error, so aggregate functions should be prepared to
deal with that case.

After all rows are processed the countFinalize() routine is called
exactly once.  This routine computes the final result and invokes
one of the sqlite3_result() family of functions
to set the final result.  The aggregate context will be freed automatically
by SQLite, though the xFinalize() routine must clean up any substructure
associated with the aggregate context before it returns.  If the xStep()
method is called one or more times, then SQLite guarantees thta the
xFinal() method will be called at once, even if the query aborts.

2.3.3. The Window Function Callbacks

Window functions use the same xStep() and xFinal() callbacks that
aggregate functions use, plus two others: xValue and xInverse.
See the documentation on
application-defined window functions for further details.

2.3.4. Examples

There are dozens and dozens of SQL function implementations scattered
throughout the SQLite source code that can be used as example applications.
The built-in SQL functions use the same interface as application-defined
SQL functions, so built-in functions can be used as examples too.
Search for "sqlite3_context" in the SQLite source code to find examples.



3. Security Implications


Application-defined SQL functions can become security vulnerabilities if
not carefully managed.  Suppose, for example, an application defines
a new "system(X)" SQL function that runs its argument X as a command and
returns the integer result code.  Perhaps the implementation is like this:

static void systemFunc(
  sqlite3_context *context,
  int argc,
  sqlite3_value **argv
){
  const char *zCmd = (const char*)sqlite3_value_text(argv&#91;0&#93;);
  if( zCmd!=0 ){
    int rc = system(zCmd);
    sqlite3_result_int(context, rc);
  }
}



This is a function with powerful side-effects.  Most programmers would
be naturally cautious about using it, but probably would not see the
harm in merely having it available.  But there is great risk in merely
defining such a function, even if the application itself never invokes
it!


Suppose the application normally does a query against table TAB1
when it starts up.  If an attacker can gain access to the database
file and modify the schema like this:

ALTER TABLE tab1 RENAME TO tab1_real;
CREATE VIEW tab1 AS SELECT * FROM tab1 WHERE system('rm -rf *') IS NOT NULL;



Then, when the application attempts to open the database, register the
system() function, then run an innocent query against the "tab1" table,
it instead deletes all the files in its working directory.  Yikes!


To prevent this kind of mischief, applications that create their own
custom SQL functions should take one or more of the following safety
precautions.  The more precautions taken the better:



Invoke sqlite3_db_config(db,SQLITE_DBCONFIG_TRUSTED_SCHEMA,0,0)
on each database connection as soon as it is opened.
This prevents application-defined functions from being used in places
where an attacker might be able to surreptiously invoke them by modifying
a database schema:

 In in VIEWs.
 In in TRIGGERSs.
 In CHECK constraints of a table definition.
 In DEFAULT constraints of a table definition.
 In the definitions of generated columns.
 In the expression part of an index on an expression.
 In the WHERE clause of a partial index.


To put it another way, this setting requires that application-defined
functions only be run directly by top-level SQL invoked from the application
itself, not as a consequence of doing some other innocent-looking query.


Use the PRAGMA trusted_schema=OFF SQL statement to disable trusted
schema.  This has the same effect as the previous bullet, but does not
require the use of C-code and hence can be performed in programs written
in another programming language and that do not have access SQLite
C-language APIs.


Compile SQLite using the -DSQLITE_TRUSTED_SCHEMA=0 compile-time option.
This make SQLite distrust application-defined functions inside of
the schema by default.


If any application-defined SQL functions have potentially dangerous
side-effects, or if they could potentially leak sensitive information
to an attacker if misused, then tag those functions using the
SQLITE_DIRECTONLY option on the "enc" parameter.  This means
that the function can never be run from schema-code even if the
trusted-schema option is on.


Never tag an application-defined SQL function with SQLITE_INNOCUOUS
unless you really need to and you have checked the implementation closely
and are certain that it can do no harm even if it falls under the
control of an attacker.

This page last modified on  2020-09-20 12:35:50 UTCappfunc.html
íí÷‚=
Oï%Application-Defined SQL Functions1. Executive Summary

Applications that use SQLite can define custom SQL functions that call
back into application code to compute their results.  The custom SQL
function implementations can be embedded in the application code itself,
or can be loadable extensions.

Application-defined or custom SQL functions are created using the
sqlite3_create_function() family of interfaces.
Custom SQL functions can be scalar functions, aggregate functions,
or window functions.
Custom SQL functions can have any number of arguments from 0 up to
SQLITE_MAX_FUNCTION_ARG.
The sqlite3_create_function() interface specifies callbacks that are
invoked to carry out the processing for the new SQL function.

SQLite also supports custom table-valued functions, but they are
implemented by a different mechanism that is not covered in this document.

2. Defining New SQL Functions


The sqlite3_create_function() family of interfaces is used to create
new custom SQL functions.  Each member of this family is a wrapper around
a common core.  All family members accomplish the same thing; they merely
have different calling signatures.


sqlite3_create_function() &rarr;
The original version of sqlite3_create_function() allows the application
to create a single new SQL function that can be either a scalar or an
aggregate.  The name of the function is specified using UTF8.

sqlite3_create_function16() &rarr;
This variant works exactly like the sqlite3_create_function() original
except that the name of the function itself is specified as a UTF16
string rather than as a UTF8 string.

sqlite3_create_function_v2() &rarr;
This variant works like the original sqlite3_create_function() except
that it includes an additional parameter that is a pointer to a
destructor for the sqlite3_user_data() pointer that is passed in
as the 5th argument to all of the sqlite3_create_function() variants.
That destructor function (if it is non-NULL) is called when the
custom function is deleted - usually when the database connection is
closing.

sqlite3_create_window_function() &rarr;
This variant works like the original sqlite3_create_function() except
that it accepts a different set of callback pointers - the callback
pointers used by window function definitions.


2.1. Common Parameters

Many of the parameters passed to the sqlite3_create_function()
family of interfaces are common across the entire family.


db &rarr;
The 1st parameter is always a pointer to the database connection
on which the custom SQL function will work.  Custom SQL functions are
created separately for each database connection.  There is no short-hand
mechanism for creating SQL functions that work across all database
connections.

zFunctionName &rarr;
The 2nd parameter is the name of the SQL function that is being
created.  The name is usually in UTF8, except that the name should
be in UTF16 in the native byte order for sqlite3_create_function16().

The maximum length of a SQL function name is 255 bytes of UTF8.
Any attempt to create a function with a longer name will resulLreturn receive enterprise-level technical support. Technical control and direction
of SQLite remains entirely with the SQLite developers.

Mozilla, developer of the popular open-source Firefox web browser, and Symbian,
the market-leading open operating system for advanced data-enabled smartphones, 
both deploy the SQLite database engine in their products. As charter members of 
the Consortium, Mozilla and Symbian are ensuring the development and support of 
SQLite as a freely accessible and public domain software asset.

"SQLite has become a popular embedded database because it is lightweight, fast,
and open source," said Michael Schroepfer, Vice President of Engineering, Mozilla.
"As a charter member of the SQLite Consortium, Mozilla is excited to help ensure
SQLite remains a vibrant and open technology, in line with our mission to promote
choice and innovation on the Internet."

"The SQLite Consortium will help set the standards for database management 
which are essential in smartphone functionality and will also help create a pool
of developers, highly-skilled in SQLite for future mobile phone development, "
said Bruce Carney, Director, Developer Programmes & Services, Symbian. 
"Our involvement with the SQL Consortium not only demonstrates Symbian's commitment 
to open standards in the industry, but as mobile phones become increasingly powerful
and smartphones become increasingly popular, we are focused on ensuring that
desktop developers, who move to the mobile space, have the easiest and most
productive experience possible."

SQLite is a winner of the 2005 Google/O'Reilly Open Source Award. Additional
information regarding the SQLite Consortium is available at the SQLite website,
http://www.sqlite.org/.


# # #


About SQLite

SQLite is a software library that implements a self-contained, embeddable, 
serverless, zero-configuration, transactional SQL database engine. The code for 
SQLite is in the public domain and is free for any use, commercial or private. 
SQLite is currently found in countless software titles and electronic devices.

SQLite was originally developed and released 2000 by Dr. D. Richard Hipp.
The code continues to be maintained and enhanced by an international team 
of developers under Hipp's direction.



CONTACT INFORMATION:
SQLite Consortium
Dr. D. Richard Hipp
6200 Maple Cove Lane
Charlotte, NC 28269
Email: drh@sqlite.org
http://www.sqlite.org/
Tel: +1.704.948.4565



About Mozilla

Mozilla is a global community dedicated to building free, open source products 
and technologies that improve the online experience for people everywhere. 
Mozilla works in the open with a highly disciplined, transparent and cooperative 
development process, under the umbrella of the non-profit Mozilla Foundation. 
As a wholly owned subsidiary, the Mozilla Corporation organizes the development 
and marketing of Mozilla products. This unique structure has enabled Mozilla to 
financially support and cultivate competitive, viable community innovation. 
For more information, visit www.mozilla.com.

CONTACT INFORMATION:
Mozilla Corporation
Jessica Waight
Tel: +1.415.345.4754
Email: jwaight@outcastpr.com


About Symbian Limited

Symbian is a software licensing company that develops and licenses Symbian OS, 
the market-leading open operating system for advanced, data-enabled mobile phones 
known as smartphones.

Symbian licenses Symbian OS to the world's leading handset manufacturers 
and has built close co-operative business relationships with leading companies 
across the mobile industry. During Q3 2007, 20.4 million Symbian smartphones 
were sold worldwide to over 250 major network operators, bringing the total
number of Symbian smartphones shipped up to 30 September 2007 to 165 million.

Symbian has its headquarters in London, United Kingdom, with offices in the 
United States, United Kingdom, Asia (India, P.R. China, and Korea) and Japan.
For more information, please visit www.symbian.com.

CONTACT INFORMATION:
Symbian Global Press Office
Karen Hamblen
+44 207 154 1707
press@symbian.compressrelease-20071212.html
¸¸äp‚?
1ă#Recent SQLite NewsRecent News

2022-12-28 - Version 3.40.1
Version 3.40.1 is a patch release that fixes some obscure problems
in version 3.40.0.  The problems fixed have no impact on most applications.
Upgrading is only necessary if you encounter problems.

The two most important fixes are these:


Fix the --safe command-line option on the CLI so that it
correctly disallows functions with side-effects.  This is a bug
in the CLI &mdash; not a bug in the
SQLite library &mdash; and it only affects the --safe command-line
option, making that option less than fully "safe".  As the number
of systems that use the --safe command-line option iR©'‚>    AÑaApressrelease-20071212.htmlFOR IMMEDIATE RELEASE:

SQLite Consortium Launches With Mozilla And Symbian As Charter Members


Ensures independent technical direction for world's
most deployed SQL database engine

Charlotte, North Carolina - December 12, 2007 - The SQLite Consortium,
a new membership association dedicated to maintaining SQLite as a fully open 
and independent product, was formally announced today. Mozilla and Symbian Ltd. 
have joined the SQLite Consortium as charter members.

SQLite is a compact, high efficiency, high reliability, embeddable SQL database 
engine. The source code to SQLite is in the public domain and is available with 
no associated fees. SQLite is the most deployed SQL database engine in the world 
and is currently used in a wide range of commercial software products and electronic 
devices from leading manufacturers. SQLite is found today in many mobile phones, 
MP3 players, set-top boxes, and PCs.

The mission of the SQLite Consortium is to continue developing and enhancing
SQLite as a product that anyone may use without paying royalties or licensing fees. 
Members of the SQLite Consortium provide funding to enable this mission and in
PSn the CLI is
approximately zero, this is not considered an important bug.  However,
a third-party wrote a CVE against it which caused considerable angst
among maintainers, so it seems good to get the fix into circulation
sooner rather than wait on the next major release.

The optional memsys5 memory allocator picked up a bug that might
put it into an infinite loop for very large (500MiB) allocations.
Almost all systems use their native memory allocator, not memsys5.
Memsys5 is only used if SQLite is compiled using SQLITE_ENABLE_MEMSYS5
and then initialized using sqlite3_config(SQLITE_CONFIG_HEAP).
Very, very few systems do this, and so the problem is not considered
to be serious.


See the branch-3.40 timeline
for a complete listing of changes that have gone into this patch release.
2022-11-16 - Version 3.40.0
Version 3.40.0 is a new feature release of SQLite.  See the
change log for details.
Key enhancements in this release include:


Official support for compiling 
SQLite to WASM
and running it in a web browser.

New and improved recovery extension for extracting
data from corrupted database files.


This release also includes performance enhancements and
improvements to the query planner.

A psychological milestone:  The performance benchmark that
the SQLite developers have used for many years has for
the first time dropped below 1 billion CPU cycles
(measured using cachegrind) when run in WAL mode.
This is less than half the number of CPU cycles used as
recently as 8 years ago.  (The graph below shows SQLite using
a rollback journal which uses fewer CPU cycles at the expense
of extra I/O.  The benchmark passed through the 1 billion cycle
barrier for rollback journals for the previous release.)



2022-09-29 - Version 3.39.4
Version 3.39.4 is a security release that addresses a single
long-standing problem in the FTS3 extension.  An attacker
who is able to execute arbitrary SQL statements and who can create
a corrupt database that is 2GB or larger in size might be able to trick
FTS3 into overflowing an integer used to size a memory allocation,
causing the allocation to be too small and ultimately resulting in
a buffer overrun.  The release also includes fixes for other
obscure weaknesses, as described in the release notes.
2022-09-05 - Version 3.39.3
Version 3.39.3 is a patch release that fixes a few obscure problems
in the 3.39.0 release.  See the release notes for details.
2022-07-21 - Version 3.39.2
Version 3.39.2 is a security release that addresses multiple long-standing
issues in SQLite.  The most severe problem is identified by CVE-2022-35737.
That issue is associated with the auxiliary C-language APIs
of SQLite and cannot be reached using SQL or database inputs, and hence is
unlikely to affect your application.  Nevertheless, upgrading is recommended.
The other issues are comparatively minor.
This release also fixes a performance regression that appeared in version
3.39.0 that might affect some multi-way joins that use LEFT JOIN.
2022-07-13 - Version 3.39.1
Version 3.39.1 is a patch release that fixes a few minor problem in version
3.39.0.  Upgrading is optional.
2022-06-25 - Version 3.39.0
Version 3.39.0 is regular maintenance release of SQLite.  The key enhancement
in this release is added support for RIGHT and FULL JOIN.  There are other
language and performance enhancements as well &mdash; see the
release notes for details.
2022-05-06 - Version 3.38.5
The 3.38.4 patch release included a minor change to the CLI source code
that did not work.  The release manager only ran a subset of the normal
release tests, and hence did not catch the problem. As a result, the CLI
will segfault when using columnar output modes in version 3.38.4.  This
blunder did not affect the core SQLite library.  It only affected the CLI.

Take-away lesson:  Always run all of your tests prior to
a release - even a trival patch release.  Always.

The 3.38.5 patch release fixes the 3.38.4 blunder.
2022-05-04 - Version 3.38.4
Another user-discovered problem in the new Bloom filter optimization
is fixed in this patch release.  Without tThe fix, it is possible for
a multi-way join that uses a Bloom filters for two or more tables in
the join to enter an infinite loop if the key constraint on one of those
tables contains a NULL value.
2022-04-27 - Version 3.38.3
Version 3.38.3 fixes a bug in the automatic-index and Bloom filter
construction logic that might cause SQLite to be overly aggressive
in the use of ON clause constraints, resulting in a incorret
automatic-index or Bloom filter that excludes some valid rows from
output.  The bug was introduced in version 3.38.0.  Other minor
changes were tossed in to complete the patch.
2022-03-26 - Version 3.38.2
Version 3.38.2 fixes another bug in the new Bloom filter
optimization that might cause incorrect answers for a
LEFT JOIN that has an IS NULL constraint on the right-hand
table.
2022-03-12 - Version 3.38.1
Version 3.38.1 fixes a pair of bugs in the Bloom filter
optimization that was introduced in version 3.38.0.  These
bugs might cause incorrect answers for some obscure queries.
Various other minor problems and documentation typos were
fixed at the same time.
2022-02-22 - Version 3.38.0
Version 3.38.0 is a routine maintenance release of
SQLite.  There are various minor enhancements and
about a 0.5% reduction in the number of CPU cycles
used. See the
release notes for
more detail.
2022-01-06 - Version 3.37.2
Version 3.37.2 fixes a
database corruption bug.  You are
encouraged to upgrade, especially if you are using SAVEPOINT.

The problem first appeared in version 3.35.0 (2021-03-12) and
affects all subsequent releases through 3.37.1.
If temporary files are store in memory (which is not the default
behavior, but is sometimes selected by applications using either
-DSQLITE_TEMP_STORE or PRAGMA temp_store) and
if a SAVEPOINT is rolled back and then subsequent changes
within the same transaction are committed, the database file might
(with low but non-zero probability) go corrupt.
2021-12-30 - Version 3.37.1
Version 3.37.1 fixes a bug in the UPSERT logic, introduced by
the UPSERT enhancements of version 3.35.0, that can cause
incorrect byte-code to be generated in some cases, resulting
in an infinite loop in the byte code, or a NULL-pointer dereference.
This patch release also fixes some other minor problems with
assert() statements and in the CLI.
2021-11-27 - Version 3.37.0
Version 3.37.0 is a routine maintenance release of SQLite.
The biggest new feature in this release is support for
STRICT tables.  Other enhancements are described in
the release notes.
2021-06-18 - Version 3.36.0
Version 3.36.0 is a routine maintenance release of SQLite.
There are no new major features, only incremental improvements
to existing features and small performance improvements.
2021-04-19 - Patch release 3.35.5
The new ALTER TABLE DROP COLUMN capability that was added
in the 3.35.0 release contained a bug that might cause the
table content to go corrupt when the table was rewritten
to remove the dropped column.  Fixed by this patch.
2021-04-02 - Patch release 3.35.4
Version 3.35.4 is yet another patch release to fix
obscure problems in features associated with the 3.35.0.
2021-03-26 - Patch release 3.35.3
Version 3.35.3 contains patches for a handful of minor
problems discovered in prior releases.
2021-03-17 - Patch release 3.35.2
Version 3.35.2 is a small patch release to fix some minor problems
that were discovered shortly after the 3.35.1 release.
2021-03-15 - Patch release 3.35.1
A user discovered an issue with the new DROP COLUMN capability
in version 3.35.0, and so version 3.35.1 was created to fix it.
No need to upgrade if you are not using DROP COLUMN.
2021-03-12 - Release 3.35.0
SQLite version 3.35.0 is a routine maintenance release.  This
release adds a number of new language features, including
support for ALTER TABLE DROP COLUMN, built-in math functions,
generalized UPSERT, and the MATERIALIZED hint on common table
expressions.  There are also query planner optimizations and
incremental CLI improvements.
2020-01-20 - Release 3.34.1
SQLite version 3.34.1 is a patch releases that fixes a possible
use-after-free bug tUhat can be provoked by malicious SQL.  Other
minor issues in extensions and documentation are also fixed.
2020-12-01 - Release 3.34.0
SQLite version 3.34.0 is a routine maintenance release.  This
release adds incremental improvements to performance and features,
including enhancements to the query planner, multiple recursive
SELECTS in recursive common table expressions, and better error messages
from CHECK constraint failures.  See the change log for details.
2020-08-14 - Release 3.33.0
SQLite version 3.33.0 is a routine maintenance release.  This
release features added support for "UPDATE FROM" following the
PostgreSQL syntax, and a doubling of the maximum database size
to 281 TB, as well as many other improvements.  See the change
log for details.
2020-06-18 - Release 3.32.3
The 3.32.3 release is a patch release that contains fixes for
various issues discovered by fuzzers.  None of the issues fixed
are likely to be encountered by applications that use SQLite in
ordinary ways, though upgrading never hurts.

Map of all changes since the 3.32.0 release:
https://www.sqlite.org/src/timeline?p=version-3.32.3&bt=version-3.32.0
2020-06-04 - Release 3.32.2
The 3.32.2 release is a one-line change relative to 3.32.1
that fixes a long-standing bug in the COMMIT command.  Since
version 3.17.0, if you were to retry a COMMIT command over
and over after it returns SQLITE_BUSY, it might eventually
report success, even though it was still blocked.  This patch
fixes the problem.
2020-05-25 - Release 3.32.1
Grey-hats published
information about two SQLite bugs approximately 24 hours after
the release of version 3.32.0.  These bugs enable maliciously
crafted SQL to crash the process that is running SQLite.  Both
bugs are long-standing problems that affect releases prior to
3.32.0. The 3.32.1 release fixes both problems.
2020-05-22 - Release 3.32.0
Version 3.32.0 is an ordinary maintenance release of SQLite.
This release features the ability to run an
approximate ANALYZE to gather database statistics for
use by the query planner, without having to scan every row
of every index.
See the change log for additional enhancements
and improvements.
2020-01-27 - Release 3.31.1
Applications that use SQLite should only interface with SQLite
through the officially published APIs.  Applications should not
depend upon or use the internal data structures of SQLite as those
structures might change from one release to another.  However, there
is a popular application that does depend on the details of the
internal layout of data in an internal SQLite data structure, and
those details changed in version 3.31.0, breaking the application.
This is, technically, a bug in the application, not in SQLite.
But it is within the power of SQLite to fix it, by reverting the
internal data structure change, and so that is what we have done
for the 3.31.1 release.
2020-01-22 - Release 3.31.0
Version 3.31.0 is an ordinary maintenance release of SQLite.
This release features the ability to define
generated columns for tables as well as many other enhancements.
See the change log for additional information.
2019-10-11 - Release 3.30.1
Version 3.30.1 is a bug-fix release that addresses a problem
that can occur when an aggregate function in a nested query
makes use of the new FILTER clause capability.  Some addition
patches for various obscure issues are also included, for
completeness.
2019-10-04 - Release 3.30.0
Version 3.30.0 is a regularly scheduled maintenance release
of SQLite containing miscellaneous performance and feature
enhancements.  This release adds support fo the NULLS FIRST
and NULLS LAST clauses on ORDER BY statements and the 
addition of FILTER clauses on all aggregate functions.
See the change log for details.
2019-07-10 - Release 3.29.0
Version 3.29.0 is a regularly scheduled maintenance release
of SQLite containing miscellaneous performance and feature
enhancements.  See the change log for
details.

Beginning with this release, the
double-quoted string literal misfeature is deprecated.
The misfeature is still enabled by default, for legacy
compatibiliVty, however developers are encouraged to
disable it at compile-time using the
-DSQLITE_DQS=0 option, or at run-time using
the SQLITE_DBCONFIG_DQS_DML and SQLITE_DBCONFIG_DQS_DDL
actions to the sqlite3_db_config() interface.  This is
especially true for double-quoted string literals in
CREATE TABLE and CREATE INDEX statements, as those elements
can cause unexpected problems following an ALTER TABLE.
See ticket 9b78184be266fd70
for an example.
2019-04-16 - Release 3.28.0
Version 3.28.0 is a regularly scheduled maintenance release
of SQLite containing miscellaneous performance and feature
enhancements.  See the change log for
details.

This release fixes an obscure security issue. Applications
using older versions of SQLite may be vulnerable if

 SQLite is compiled with certain optional extensions
     enabled, and
 the attacker is able to inject arbitrary SQL.

We are not aware of any applications that are vulnerable to
this problem. On the other hand, we do not know about
every application that uses SQLite.  
If your application allows unauthenticated users on the internet
(and hence potential attackers) to run arbitrary SQL and if
you build SQLite with any of the optional extensions enabled,
then you should take this upgrade at your earliest opportunity.

For further information about improving SQLite's robustness
in internet-facing applications, see the our
security recommendations.
2019-02-25 - Release 3.27.2
Version 3.27.2 is a patch release that
fixes a two bugs and various documentation
errors found in the version 3.27.1.  The
changes from version 3.27.1 and 3.27.0 are
minimal.
2019-02-08 - Release 3.27.1
After release 3.27.0 was tagged, but before the build could
be completed and uploaded, a 
long-standing bug
in the query optimizer was reported via System.Data.SQLite.
Since people will be upgrading anyhow, we decided 
publish the fix for this newly discovered problems right
away.  Hence, 3.27.1 was released less than 24 hours after
3.27.0.

It would have been better if the query optimizer bug had come to
our attention one day earlier, so that we could have incorporated
a fix into 3.27.0, but sometimes that's the way things go.
2019-02-07 - Release 3.27.0
SQLite version 3.27.0 is a routine maintenance release with various
performance and feature enhancements.  See the
release notes for details.
2018-12-01 - Release 3.26.0
SQLite version 3.26.0 is a routine maintenance release with various
performance and feature enhancements.  See the
release notes for details.
2018-11-05 - Release 3.25.3
SQLite version 3.25.3 is a third patch against 3.25.0 that fixes various
problems that have come to light and which seem serious enough to 
justify a patch.
2018-09-25 - Release 3.25.2
SQLite version 3.25.2 is another patch against 3.25.0 that fixes still
more problems associated with the new window function feature and the
ALTER TABLE enhancements.  Of particular note is the new
PRAGMA legacy_alter_table=ON command, which causes the ALTER TABLE RENAME
command to behave in the same goofy way that it did before the enhancements
found in version 3.25.0 &rarr; references to renamed tables that are inside
the bodies of triggers and views are not updated.  The legacy behavior is
arguably a bug, but some programs depend on the older buggy behavior.  The
3.25.2 release also contains a fix to window function processing for
VIEWs.  There also a slew of other minor fixes that affect obscure
compile-time options.  See the
Fossil Timeline for
details.
2018-09-18 - Release 3.25.1
SQLite version 3.25.1 is a patch against version 3.25.0 that contains
two one-line fixes for bug that were introduced in version 3.25.0.
See the change log for details.  Upgrading from 3.25.0 is recommended.
2018-09-15 - Release 3.25.0
SQLite version 3.25.0 is a regularly scheduled maintenance release.
Two big enhancements in this release:


Support for window functions was added, using the PostgreSQL documentation
as the baseline.

The ALTER TABLE command was enhanced to support renaming of columns, and
so that column and table renames are propagated into triggerW bodies and views.

In addition, there are various performance enhancements and minor fixes.
One bug of note is 
ticket 9936b2fa443fec
which describes a hard-to-reach condition where the ORDER BY LIMIT
optimization might cause an infinite loop during query evaluation.  
This ticket raised a lot of
concern on 
HackerNews and
Reddit,
probably due to my choice of the ticket
title.  "Infinite Loop" sounds scary.  But I argue that the bug isn't really
all that bad in that it is very difficult to reach, will show up during
testing (rather than magically appearing after a product is
deployed), does not cause any data loss, and does not return an
incorrect result.  It was an important error, but not nearly as dire
as many people interpreted it to be.  And, in any event, it is fixed now.
2018-06-04 - Release 3.24.0
SQLite version 3.24.0 is a regularly scheduled maintenance release.
Highlights of this release include support for PostgreSQL-style
UPSERT and improved performance, especially for ORDER BY LIMIT queries.
2018-04-10 - Release 3.23.1
The version 3.23.1 release fixes a bug in the new
LEFT JOIN strength reduction optimization added to version 3.23.0.
A few other minor and obscure fixes were also inserted, as well as
a small performance optimization.  Code changes relative to
version 3.23.0 are minimal.
2018-04-02 - Release 3.23.0
The version 3.23.0 release is a regularly scheduled maintenance release.
See the change log for a list of enhancements and bug
fixes.
2018-01-22 - Release 3.22.0
The version 3.22.0 release is a regularly scheduled maintenance release.
There are many minor, though interesting, enhancements in this release.
See the change log for details.
2017-10-24 - Release 3.21.0
The version 3.21.0 release is a regularly scheduled maintenance release.
There are lots of enhancements in this release.
See the change log for details.
2017-08-24 - Release 3.20.1
The version 3.20.1 patch release changes two lines of code in
the sqlite3_result_pointer() interface in order to fix a rare
memory leak.  There are no other changes relative to version 3.20.0.
2017-08-01 - Release 3.20.0
SQLite version 3.20.0 is a regularly scheduled maintenance release
of SQLite.

This release contains many minor enhancements, including:

 Several new extensions
 Enhancements to the "sqlite3.exe" command-line shell
 Query planner enhancements
 Miscellaneous code optimizations for improved performance
 Fixes for some obscure bugs


See the release notes for more information.
2017-06-17 - Release 3.18.2
SQLite version 3.18.2 is another backport of a bug fix found
in SQLite version 3.19.0, specifically the fix for
ticket 61fe9745.  Changes
against version 3.18.0 are minimal.
2017-06-16 - Release 3.18.1
SQLite version 3.18.1 is a bug-fix release against version 3.18.0
that fixes the auto_vacuum corruption bug described in ticket
fda22108.  This release was
created for users who need that bug fix but do not yet want to upgrade 
to version 3.19.3.  
2017-06-08 - Release 3.19.3
Version 3.19.3 is an emergency patch release to fix a 
bug in 
auto_vacuum logic that can lead to database corruption.
The bug was introduced in version 3.16.0 
(2017-01-02).  Though the bug is obscure and rarely
encountered, upgrading is recommended for all users, and
especially for users who turn on auto_vacuum.
2017-05-25 - Release 3.19.2
Still more problems have been found in the LEFT JOIN
flattening optimization
that was added in the 3.19.0 release.  This patch release fixes all known
issues with that optimization and adds new test cases.  Hopefully this
will be the last patch.
2017-05-24 - Release 3.19.1
One of the new query planner optimizations in the 3.19.0 release contained
bugs.  The 3.19.1 patch release fixes them.

Beginning with 3.19.0, subqueries and views on the right-hand side of
a LEFT JOIN operator could sometimes be
flattened into the
main query.  The new optimization worked well for all of the test cases
that the developers devised, and for millions of legacy test cases, but
once 3.19.0 was released, users found some other cases where the optimizationX
failed.  Ticket
cad1ab4cb7b0fc344 contains
examples.

These problems exist only in 3.19.0.  Users of SQLite 3.19.0 should
upgrade, but users of all prior versions of SQLite are safe.
2017-05-22 - Release 3.19.0
SQLite version 3.19.0 is a regularly scheduled maintenance release.

The emphasis on this release is improvements to the query planner.
There are also some obscure bug fixes.  There is no reason to upgrade
unless you are having problems with a prior release.
2017-03-30 - Release 3.18.0
SQLite version 3.18.0 is a regularly scheduled maintenance release.

This release features an initial implementation the 
"PRAGMA optimize" command.  This command can now be used to cause
ANALYZE to be run on an as-needed basis.  Applications should invoke
"PRAGMA optimize" just before closing the database connection.
The "PRAGMA optimize" statement will likely be enhanced to do other
kinds of automated database maintenance in future releases.

The Fossil version control system that is
used to manage the SQLite project has been upgraded to use SHA3-256 hashes
instead of SHA1.  Therefore, the version identifications for SQLite now
show a 64-hex-digit SHA3-256 hash rather than the 40-hex-digit SHA1 hash.

See the change log for other enhancements and optimizations
in this release.
2017-02-13 - Release 3.17.0
SQLite version 3.17.0 is a regularly scheduled maintenance release.

Most of the changes in this release are performance optimizations.
Optimizations to the R-Tree extension are especially noticeable.

In this release, the default size of the 
lookaside buffer allocated for each database connection
is increased from 64,000 to 120,000 bytes.  This provides improved
performance on many common workloads in exchange for a small increase
in memory usage.
Applications that value a small memory footprint over raw speed
can change the lookaside buffer size back to its old value (or to zero)
using the SQLITE_DEFAULT_LOOKASIDE compile-time option, or the
sqlite3_config(SQLITE_CONFIG_LOOKASIDE)
start-time setting, or the
sqlite3_db_config(SQLITE_DBCONFIG_LOOKASIDE)
run-time setting.
2017-01-06 - Release 3.16.2
One of the performance optimizations added in 3.16.0 caused triggers
and foreign keys to malfunction for the REPLACE statement on
WITHOUT ROWID tables that lack secondary indexes.  This patch
release fixes the problem.  See ticket 
30027b613b4 for details.
2017-01-03 - Release 3.16.1
SQLite version 3.16.1 fixes a bug in the row-value logic for UPDATE
statements inside of triggers.  The bug has been there since row-values
were added by release 3.15.0, but was not discovered until just a few
minutes after the 3.16.0 release was published, and so it was not fixed
by 3.16.0.  This patch release is version 3.16.0 with the row-value bug fix.
2017-01-02 - Release 3.16.0
SQLite version 3.16.0 is a regularly schedule maintenance release.


This release includes many microoptimizations that collectively reduce
the CPU cycle count by about 9%,
add there have been important enhancements to the command-line shell.

Support for PRAGMA functions is added,
so that many pragma statements can be used as part of a larger SQL query.
This is considered an experimental feature.
We do not anticipate any changes to the PRAGMA function interface, but
will keep continue to call this interface "experimental" for a few release
cycles in case unforeseen issues arise.

See the change log for other enhancements.
2016-11-28 - Release 3.15.2
SQLite version 3.15.2 is a bug-fix patch release that fixes several minor
issues in the 3.15.0 and 3.15.1 releases.
2016-11-04 - Release 3.15.1
SQLite version 3.15.1 is a bug-fix patch release that fixes some minor
issues in the 3.15.0 release.
2016-10-14 - Release 3.15.0
SQLite version 3.15.0 is a regularly scheduled maintenance release.
The key feature in this release is the added support for
row values.  There are also other enhancements and
fixes for a number of obscure bugs.

The 3.15.0 release uses about 7% fewer CPU cycles than 3.14.2.
Most of the improvement in this release
is in the SQL parser, query planner, and
byte-code generator (the front-end) corresponding
to the sqlite3_prepare_v2() interface.  Overall,
version 3.15.0 uses about half as much CPU time as
version 3.8.1 (2013-10-17).  These
performance measurements are made using the "speedtest1.c"
workload on x64 compiled with gcc and -Os. Performance
improvements may vary with different platforms and
workloads.
2016-09-12 - Release 3.14.2
SQLite version 3.14.2 fixes several obscure bugs and adds 
improved support for building SQLite using the STDCALL calling
convention on 32-bit windows systems.  Upgrading from versions
3.14 and 3.14.1 is optional.
2016-08-11 - Release 3.14.1
SQLite version 3.14.1 adds a small patch to improve the performance
of the pcache1TruncateUnsafe() routine for cases when the only a few
pages on the end of the cache are being removed.  This causes COMMITs
to run faster when there is a very large page cache.  Upgrading from
version 3.14 is optional.
2016-08-08 - Release 3.14
SQLite version 3.14 (the "&#960;" release)
is a regularly scheduled maintenance
release containing performance enhancements, new features, and fixes for
obscure bugs.
2016-05-18 - Release 3.13.0
SQLite version 3.13.0 is a regularly schedule maintenance release containing
performance enhancements and fixes for obscure bugs.
2016-04-18 - Release 3.12.2
Yikes!  The 3.12.0 and 3.12.1 releases contain a backwards compatibility bug!
   Tables that declare a column with type "INTEGER" PRIMARY KEY
   (where the datatype name INTEGER is quoted) generate an incompatible
   database file.  The mistake came about because the developers have never
   thought to put a typename in quotes before, and so there was no documentation 
   of that capability nor any tests.  (There are tests now, though, of course.)
   Instances of quoting the datatype name are probably infrequent in the wild,
   so we do not expect the impact of this bug to be too severe.
   Upgrading is still strongly recommended.
Fixes for three other minor issues were included in this patch release.
   The other issues would have normally been deferred until the next scheduled
   release, but since a patch release is being issued anyhow, they might as
   well be included.
2016-04-08 - Release 3.12.1
SQLite version 3.12.1 is an emergency patch release to address a 
   crash bug that snuck
   into version 3.12.0.  Upgrading from version 3.12.0 is highly
   recommended.
Another minor problem involving datatypes on view columns, and
   a query planner deficiency are fixed at the same time.  These two
   issues did not justify a new release on their own, but since a release
   is being issued to deal with the crash bug, we included these other
   fixes for good measure.
2016-03-29 - Release 3.12.0
SQLite version 3.12.0 is a regularly scheduled maintenance release.
   A notable change in this release is an
   increase in the default page size for newly created database files.
   There are also various performance improvements.
   See the change log for details.
2016-03-03 - Release 3.11.1
SQLite version 3.11.1 is a patch release that fixes problems in the
   new FTS5 extension and increases a default setting in the spellfix1
   extension, and implements enhancements to some of the Windows makefiles.
   The SQLite core is unchanged from 3.11.0. Upgrading is optional.
2016-02-15 - Release 3.11.0
SQLite version 3.11.0 is a regularly scheduled maintenance release.
2016-01-20 - Release 3.10.2
Yikes!  An optimization attempt gone bad resulted in a 
bug in the LIKE operator
which is fixed by this patch release.
Three other minor but low-risk fixes are also included in the patch.
2016-01-14 - Release 3.10.1
SQLite version 3.10.1 is a bug-fix release primarily targeting the
fix for the query planner bug
cb3aa0641d9a4 discovered by
Mapscape.  Also included is a minor API enhancement requested by
the Firefox developers at Mozilla.  The differences from version 
3.10.0 are minimal.
2016-01-06 - Release 3.10.0
SQLite version 3.10.0 is a regularly scheduled maintenance release.


Old news...
This page last modified on  2022-12-27 17:04:09 UTCnews.htmlZTE_LOCKED.
**
** If this function returns SQLITE_LOCKED, the caller should rollback
** the current transaction (if any) and try again later. Otherwise, the
** system may become deadlocked.
*/
int sqlite3_blocking_step(sqlite3_stmt *pStmt){
  int rc;
  while( SQLITE_LOCKED==(rc = sqlite3_step(pStmt)) ){
    rc = wait_for_unlock_notify(sqlite3_db_handle(pStmt));
    if( rc!=SQLITE_OK ) break;
    sqlite3_reset(pStmt);
  }
  return rc;
}

/*
** This function is a wrapper around the SQLite function sqlite3_prepare_v2().
** It functions in the same way as prepare_v2(), except that if a required
** shared-cache lock cannot be obtained, this function may block waiting for
** the lock to become available. In this scenario the normal API prepare_v2()
** function always returns SQLITE_LOCKED.
**
** If this function returns SQLITE_LOCKED, the caller should rollback
** the current transaction (if any) and try again later. Otherwise, the
** system may become deadlocked.
*/
int sqlite3_blocking_prepare_v2(
  sqlite3 *db,              /* Database handle. */
  const char *zSql,         /* UTF-8 encoded SQL statement. */
  int nSql,                 /* Length of zSql in bytes. */
  sqlite3_stmt **ppStmt,    /* OUT: A pointer to the prepared statement */
  const char **pz           /* OUT: End of parsed string */
){
  int rc;
  while( SQLITE_LOCKED==(rc = sqlite3_prepare_v2(db, zSql, nSql, ppStmt, pz)) ){
    rc = wait_for_unlock_notify(db);
    if( rc!=SQLITE_OK ) break;
  }
  return rc;
}




  When two or more connections access the same database in shared-cache 
  mode, read and write (shared and exclusive) locks on individual tables
  are used to ensure that concurrently executing transactions are kept 
  isolated. Before writing to a table, a write (exclusive) lock must be 
  obtained on that table. Before reading, a read (shared) lock must be
  obtained. A connection releases all held table locks when it concludes
  its transaction. If a connection cannot obtain a required lock, then
  the call to sqlite3_step() returns SQLITE_LOCKED.


  Although it is less common, a call to sqlite3_prepare() or
  sqlite3_prepare_v2() may also return SQLITE_LOCKED if it cannot obtain
  a read-lock on the sqlite_schema table of each attached database. These
  APIs need to read the schema data contained in the sqlite_schema table
  in order to compile SQL statements to sqlite3_stmt* objects.


  This article presents a technique using the SQLite sqlite3_unlock_notify()
  interface such that calls to sqlite3_step() and sqlite3_prepare_v2()
  block until the required locks are available instead of returning 
  SQLITE_LOCKED immediately. If the
  sqlite3_blocking_step() or sqlite3_blocking_prepare_v2() functions presented 
  to the left return SQLITE_LOCKED, this indicates that to block would 
  deadlock the system.


  The sqlite3_unlock_notify() API, which is only available if the library is
  compiled with the pre-processor symbol SQLITE_ENABLE_UNLOCK_NOTIFY defined,
  is documented here. This article is not a
  substitute for reading the full API documentation!


  The sqlite3_unlock_notify() interface is designed for use in systems
  that have a separate thread assigned to each database connection.  There
  is nothing in the implementation that prevents a single thread from running
  multiple database connections.  However, the sqlite3_unlock_notify()
  interface only works on a single connection at a time, so the lock
  resolution logic presented here will only work for a single 
  database connection per thread.

The sqlite3_unlock_notify() API


  After a call to sqlite3_step() or sqlite3_prepare_v2() returns 
  SQLITE_LOCKED, the sqlite3_unlock_notify() API may be invoked to register 
  for an unlock-notify callback. The unlock-notify callback is invoked by 
  SQLite after the database connection holding the table-lock that prevented
  the call to sqlite3_step() or sqlite3_prepare_v2() from succeeding has
  finished its transaction and released all locks. For example, if a call to
  sqlite3_step() is an attempt to read from table X, and som[e other connection
  Y is holding a write-lock on table X, then sqlite3_step() will return
  SQLITE_LOCKED. If sqlite3_unlock_notify() is then called, the unlock-notify
  callback will be invoked after connection Y's transaction is concluded. The
  connection that the unlock-notify callback is waiting on, in this case
  connection Y, is known as the "blocking connection".


  If a call to sqlite3_step() that attempts to write to a database table
  returns SQLITE_LOCKED, then more than one other connection may be holding 
  a read-lock on the database table in question. In this case SQLite simply
  selects one of those other connections arbitrarily and issues the 
  unlock-notify callback when that connection's transaction is finished.
  Whether the call to sqlite3_step() was blocked by one or many connections, 
  when the corresponding unlock-notify callback is issued it is not 
  guaranteed that the required lock is available, only that it may be.


  When the unlock-notify callback is issued, it is issued from within a
  call to sqlite3_step() (or sqlite3_close()) associated with the blocking 
  connection. It is illegal to invoke any sqlite3_XXX() API functions from
  within an unlock-notify callback. The expected use is that the unlock-notify
  callback will signal some other waiting thread or schedule some action
  to take place later.


  The algorithm used by the sqlite3_blocking_step() function is as follows:


   Call sqlite3_step() on the supplied statement handle. If the call
       returns anything other than SQLITE_LOCKED, then return this value
       to the caller. Otherwise, continue.

   Invoke sqlite3_unlock_notify() on the database connection handle
       associated with the supplied statement handle to register for an
       unlock-notify callback. If the call to unlock_notify() returns
       SQLITE_LOCKED, then return this value to the caller.

   Block until the unlock-notify callback is invoked by another thread.

   Call sqlite3_reset() on the statement handle. Since an 
       SQLITE_LOCKED error may only occur on the first call to sqlite3_step()
       (it is not possible for one call to sqlite3_step() to return 
       SQLITE_ROW and then the next SQLITE_LOCKED), the statement handle may 
       be reset at this point without affecting the results of the query
       from the point of view of the caller. If sqlite3_reset() were not
       called at this point, the next call to sqlite3_step() would return
       SQLITE_MISUSE.

   Return to step 1.



  The algorithm used by the sqlite3_blocking_prepare_v2() function is similar,
  except that step 4 (resetting the statement handle) is omitted.


Writer Starvation


  Multiple connections may hold a read-lock simultaneously.  If many threads
  are acquiring overlapping read-locks, it might be the case that at least
  one thread is always holding a read lock.
  Then a table waiting for a write-lock will wait forever.
  This scenario is called "writer starvation."


  SQLite helps applications avoid writer starvation. After any attempt to
  obtain a write-lock on a table fails (because one or more other 
  connections are holding read-locks), all attempts to open new transactions
  on the shared-cache fail until one of the following is true:


   The current writer concludes its transaction, OR
   The number of open read-transactions on the shared-cache drops to zero.



  Failed attempts to open new read-transactions return SQLITE_LOCKED to the
  caller. If the caller then calls sqlite3_unlock_notify() to register for
  an unlock-notify callback, the blocking connection is the connection that
  currently has an open write-transaction on the shared-cache. This prevents
  writer-starvation since if no new read-transactions may be opened and 
  assuming all existing read-transactions are eventually concluded, the 
  writer will eventually have an opportunity to obtain the required
  write-lock.

The pthreads API

   By the time sqlite3_unlock_notify() is invoked by
      wait_for_unlock_notify(), it is possible that the blocking connection
      that prevented the sqlite3_step() or sqlite3_prepare_v2() call from 
      succeeding has already finished its transaction. In this case, the 
      unlock-notify callback is invoked immediately, before 
      sqlite3_unlock_notify() returns. Or, it is possible that the 
      unlock-notify callback is invoked by a second thread after 
      sqlite3_unlock_notify() is called but before the thread starts waiting 
      to be asynchronously signaled. 

   Exactly how such a potential race-condition is handled depends on the
      threads and synchronization primitives interface used by the application.
      This example uses pthreads, the interface provided by modern UNIX-like 
      systems, including Linux.

   The pthreads interface provides the pthread_cond_wait() function. 
      This function allows the caller to simultaneously release a mutex
      and start waiting for an asynchronous signal. Using this function,
      a "fired" flag and a mutex, the race-condition described above may
      be eliminated as follows:

   When the unlock-notify callback is invoked, which may be before the
      thread that called sqlite3_unlock_notify() begins waiting for the 
      asynchronous signal, it does the following:

    
       Obtains the mutex.
       Sets the "fired" flag to true.
       Attempts to signal a waiting thread.
       Releases the mutex.
    

   When the wait_for_unlock_notify() thread is ready to begin waiting for
      the unlock-notify callback to arrive, it:

    
       Obtains the mutex.
       Checks if the "fired" flag has been set. If so, the unlock-notify
           callback has already been invoked. Release the mutex and continue.
       Atomically releases the mutex and begins waiting for the
           asynchronous signal. When the signal arrives, continue.
    

   This way, it doesn't matter if the unlock-notify callback has already
      been invoked, or is being invoked, when the wait_for_unlock_notify() 
      thread begins blocking.

Possible Enhancements

   The code in this article could be improved in at least two ways:

  
     It could manage thread priorities.
     It could handle a special case of SQLITE_LOCKED that can occur
         when dropping a table or index.
  

  
    Even though the sqlite3_unlock_notify() function only allows the caller
    to specify a single user-context pointer, an unlock-notify callback 
    is passed an array of such context pointers. This is because if when
    a blocking connection concludes its transaction, if there is more
    than one unlock-notify registered to call the same C function, the
    context-pointers are marshaled into an array and a single callback
    issued. If each thread were assigned a priority, then instead of just
    signaling the threads in arbitrary order as this implementation does,
    higher priority threads could be signaled before lower priority threads.

  
    If a "DROP TABLE" or "DROP INDEX" SQL command is executed, and the
    same database connection currently has one or more actively
    executing SELECT statements, then SQLITE_LOCKED is returned. If
    sqlite3_unlock_notify() is called in this case, then the specified
    callback will be invoked immediately. Re-attempting the "DROP
    TABLE" or "DROP INDEX" statement will return another SQLITE_LOCKED 
    error. In the implementation of sqlite3_blocking_step() shown to the
    left, this could cause an infinite loop.

  
    The caller could distinguish between this special "DROP TABLE|INDEX" 
    case and other cases by using extended error codes. When it is appropriate
    to call sqlite3_unlock_notify(), the extended error code is
    SQLITE_LOCKED_SHAREDCACHE. Otherwise, in the "DROP TABLE|INDEX" case,
    it is just plain SQLITE_LOCKED. Another solution might be to limit
    the number of times that any single query could be reattempted (to say 
    100). Although this might be less efficient than one might wish, the 
    situation in question is not likely to occur often.


This page last modified on  2020-06-19 13:05:24 UTCunlock_notify.html
÷l‚@
=î}1SQLite Unlock-Notify APIUsing the sqlite3_unlock_notify() API


/* This example uses the pthreads API */
#include &lt;pthread.h&gt;

/*
** A pointer to an instance of this structure is passed as the user-context
** pointer when registering for an unlock-notify callback.
*/
typedef struct UnlockNotification UnlockNotification;
struct UnlockNotification {
  int fired;                         /* True after unlock event has occurred */
  pthread_cond_t cond;               /* Condition variable to wait on */
  pthread_mutex_t mutex;             /* Mutex to protect structure */
};

/*
** This function is an unlock-notify callback registered with SQLite.
*/
static void unlock_notify_cb(void **apArg, int nArg){
  int i;
  for(i=0; i&lt;nArg; i++){
    UnlockNotification *p = (UnlockNotification *)apArg[i];
    pthread_mutex_lock(&p-&gt;mutex);
    p-&gt;fired = 1;
    pthread_cond_signal(&p-&gt;cond);
    pthread_mutex_unlock(&p-&gt;mutex);
  }
}

/*
** This function assumes that an SQLite API call (either sqlite3_prepare_v2() 
** or sqlite3_step()) has just returned SQLITE_LOCKED. The argument is the
** associated database connection.
**
** This function calls sqlite3_unlock_notify() to register for an 
** unlock-notify callback, then blocks until that callback is delivered 
** and returns SQLITE_OK. The caller should then retry the failed operation.
**
** Or, if sqlite3_unlock_notify() indicates that to block would deadlock 
** the system, then this function returns SQLITE_LOCKED immediately. In 
** this case the caller should not retry the operation and should roll 
** back the current transaction (if any).
*/
static int wait_for_unlock_notify(sqlite3 *db){
  int rc;
  UnlockNotification un;

  /* Initialize the UnlockNotification structure. */
  un.fired = 0;
  pthread_mutex_init(&un.mutex, 0);
  pthread_cond_init(&un.cond, 0);

  /* Register for an unlock-notify callback. */
  rc = sqlite3_unlock_notify(db, unlock_notify_cb, (void *)&un);
  assert( rc==SQLITE_LOCKED || rc==SQLITE_OK );

  /* The call to sqlite3_unlock_notify() always returns either SQLITE_LOCKED 
  ** or SQLITE_OK. 
  **
  ** If SQLITE_LOCKED was returned, then the system is deadlocked. In this
  ** case this function needs to return SQLITE_LOCKED to the caller so 
  ** that the current transaction can be rolled back. Otherwise, block
  ** until the unlock-notify callback is invoked, then return SQLITE_OK.
  */
  if( rc==SQLITE_OK ){
    pthread_mutex_lock(&un.mutex);
    if( !un.fired ){
      pthread_cond_wait(&un.cond, &un.mutex);
    }
    pthread_mutex_unlock(&un.mutex);
  }

  /* Destroy the mutex and condition variables. */
  pthread_cond_destroy(&un.cond);
  pthread_mutex_destroy(&un.mutex);

  return rc;
}

/*
** This function is a wrapper around the SQLite function sqlite3_step().
** It functions in the same way as step(), except that if a required
** shared-cache lock cannot be obtained, this function may block waiting for
** the lock to become available. In this scenario the normal API step()
** function always returns SQLIYapplication.


For embedded systems, consider compiling SQLite with the
-DSQLITE_ENABLE_MEMSYS5 option and then providing SQLite with
a fixed chunk of memory to use as its heap via the
sqlite3_config(SQLITE_CONFIG_HEAP) interface. This will
prevent malicious SQL from executing a denial-of-service attack
by using an excessive amount of memory. If (say) 5 MB of memory
is provided for SQLite to use, once that much has been consumed,
SQLite will start returning SQLITE_NOMEM errors rather than
soaking up memory needed by other parts of the application.
This also sandboxes SQLite's memory so that a write-after-free
error in some other part of the application will not cause
problems for SQLite, or vice versa.



To control memory usage in the printf() SQL function, compile
with "-DSQLITE_PRINTF_PRECISION_LIMIT=100000" or some similarly
reasonable value.
This #define limits the width and precision for %-substitutions in the
printf() function, and thus prevents a hostile SQL statement from
consuming large amounts of RAM via constructs such as
"printf('%1000000000s','hi')".

Note that SQLite uses its built-in printf() internally to help it
format the sql column in the sqlite_schema table.  For that reason,
no table, index, view, or trigger definition can be much larger than the
precision limit.  You can set a precision limit of less than 100000,
but be careful that whatever precision limit you use is at least as
long as the longest CREATE statement in your schema.






1.2. Untrusted SQLite Database Files

Applications that read or write SQLite database files of uncertain
provenance should take precautions enumerated below.

Even if the application does not deliberately accept database files 
from untrusted sources, beware of attacks in which a local 
database file is altered.  For best security, any database file which 
might have ever been writable by an agent in a different security domain
should be treated as suspect.



If the application includes any custom SQL functions or 
custom virtual tables that have side effects or that might leak
privileged information, then the application should use one or more
of the techniques below to prevent a maliciously crafted database
schema from surreptitiously running those SQL functions and/or
virtual tables for nefarious purposes:

 Invoke sqlite3_db_config(db,SQLITE_DBCONFIG_TRUSTED_SCHEMA,0,0)
     on each database connection as soon as it is opened.
 Run the PRAGMA trusted_schema=OFF statement on each database connection
     as soon as it is opened.
 Compile SQLite using the -DSQLITE_TRUSTED_SCHEMA=0 compile-time option.
 Disable the surreptitious use of custom SQL functions and virtual tables
     by setting the SQLITE_DIRECTONLY flag on all custom SQL functions and
     the SQLITE_VTAB_DIRECTONLY flag on all custom virtual tables.



If the application does not use triggers or views, consider disabling the
unused capabilities with:

sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_TRIGGER,0,0);
sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_VIEW,0,0);





For reading database files that are unusually high-risk, such as database
files that are received from remote machines, and possibly from anonymous
contributors, the following extra precautions
might be justified.  These added defenses come with performance costs,
however, and so may not be appropriate in every situation:



Run PRAGMA integrity_check or PRAGMA quick_check on the database
as the first SQL statement after opening the database files and
prior to running any other SQL statements.  Reject and refuse to
process any database file containing errors.


Enable the PRAGMA cell_size_check=ON setting.



Do not enable memory-mapped I/O.
In other words, make sure that PRAGMA mmap_size=0.



2. Summary


The precautions above are not required in order to use SQLite safely
with potentially hostile inputs.
However, they do provide an extra layer of defense against zero-day
exploits and are encouraged for applications that pass data from
untrusted sources into SQLite.
This page last modified on  2022-11-07 14:28:05 UTCsecurity.html
½\‚A    Gú_'Defense Against The Dark Arts1. SQLite Always Validates Its Inputs


SQLite should never crash, overflow a buffer, leak memory,
or exhibit any other harmful behavior, even when presented with
maliciously malformed SQL inputs or database files.  SQLite should
always detect erroneous inputs and raise an error, not crash or
corrupt memory.
Any malfunction caused by an SQL input or database file
is considered a serious bug and will be promptly addressed when
brought to the attention of the SQLite developers.  SQLite is
extensively fuzz-tested to help ensure that it is resistant
to these kinds of errors.


Nevertheless, bugs happen.
If you are writing an application that sends untrusted SQL inputs
or database files to SQLite, there are additional steps you can take
to help reduce the attack surface and
prevent zero-day exploits caused by undetected bugs.

1.1. Untrusted SQL Inputs

Applications that accept untrusted SQL inputs should take the following
precautions:



Set the SQLITE_DBCONFIG_DEFENSIVE flag.
This prevents ordinary SQL statements from deliberately corrupting the 
database file.  SQLite should be proof against attacks that involve both
malicious SQL inputs and a maliciously corrupted database file at the
same time.  Nevertheless, denying a script-only attacker access to 
corrupt database inputs provides an extra layer of defense.


Reduce the limits that SQLite imposes on inputs.  This can help prevent
denial of service attacks and other kinds of mischief that can occur
as a result of unusually large inputs.  You can do this either at compile-time
using -DSQLITE_MAX_... options, or at run-time using the
sqlite3_limit() interface.  Most applications can reduce limits
dramatically without impacting functionality.  The table below
provides some suggestions, though exact values will vary depending
on the application:


Limit SettingDefault ValueHigh-security Value
LIMIT_LENGTH1,000,000,0001,000,000
LIMIT_SQL_LENGTH1,000,000,000100,000
LIMIT_COLUMN2,000100
LIMIT_EXPR_DEPTH1,00010
LIMIT_COMPOUND_SELECT5003
LIMIT_VDBE_OP250,000,00025,000
LIMIT_FUNCTION_ARG1278
LIMIT_ATTACH100
LIMIT_LIKE_PATTERN_LENGTH50,00050
LIMIT_VARIABLE_NUMBER99910
LIMIT_TRIGGER_DEPTH1,00010



Consider using the sqlite3_set_authorizer() interface to limit
the scope of SQL that will be processed.  For example, an application
that does not need to change the database schema might add an
sqlite3_set_authorizer() callback that causes any CREATE or DROP
statement to fail.


The SQL language is very powerful, and so it is always possible for
malicious SQL inputs (or erroneous SQL inputs caused by an application
bug) to submit SQL that runs for a very long time.  To prevent this
from becoming a denial-of-service attack, consider using the
sqlite3_progress_handler() interface to invoke a callback periodically
as each SQL statement runs, and have that callback return non-zero to
abort the statement if the statement runs for too long.  Alternatively,
set a timer in a separate thread and invoke sqlite3_interrupt() when
the timer goes off to prevent the SQL statement from running forever.


Limit the maximum amount of memory that SQLite will allocate using
the sqlite3_hard_heap_limit64() interface.  This helps prevent
denial-of-service attacks.  To find out how much heap space an
application actually needs, run the it against typical inputs and
then measure the maximum instantaneous memory usage with the 
sqlite3_memory_highwater() interface.  Set the hard heap limit
to the maximum observed instantaneous memory usage plus some margin.


Consider setting the SQLITE_MAX_ALLOCATION_SIZE compile-time option
to something smaller than its default value of 2147483391 (0x7ffffeff).
A value of 100000000 (100 million) or even smaller would not be unreasonable,
depending on the ]`hese indices must normally be added by programmers.
Rarely, the query planner AI will make a suboptimal algorithm
choice.
In those cases, programmers may want to provide additional
hints to help the query planner do a better job.



This document provides background information about how the
SQLite query planner and query engine work.
Programmers can use this information to help create better
indexes, and provide hints to help the query planner when
needed.



Additional information is provided in the
SQLite query planner and 
next generation query planner documents.




1.  Searching

1.1.  Tables Without Indices


Most tables in SQLite consist of zero or more rows with a unique integer
key (the rowid or INTEGER PRIMARY KEY) followed by content.  
(The exception is WITHOUT ROWID tables.)
The rows
are logically stored in order of increasing rowid.  As an example, this
article uses a table named "FruitsForSale" which relates various fruits 
to the state
where they are grown and their unit price at market.  The schema is this:



CREATE TABLE FruitsForSale(
  Fruit TEXT,
  State TEXT,
  Price REAL
);




With some (arbitrary) data, such a table might be logically stored on disk
as shown in figure 1:





Figure 1: Logical Layout Of Table "FruitsForSale"




In this example, the rowids are not
consecutive but they are ordered.  SQLite usually creates rowids beginning
with one and increasing by one with each added row.  But if rows are 
deleted, gaps can appear in the sequence.  And the application can control
the rowid assigned if desired, so that rows are not necessarily inserted 
at the bottom.  But regardless of what happens, the rowids are always 
unique and in strictly ascending order.



Suppose you want to look up the price of peaches.  The query would
be as follows:



SELECT price FROM fruitsforsale WHERE fruit='Peach';




To satisfy this query, SQLite reads every row out of the
table, checks to see if the "fruit" column has the value of "Peach" and if
so, outputs the "price" column from that row.  The process is illustrated
by figure 2 below.
This is algorithm is called a full table scan 
since the entire content of the
table must be read and examined in order to find the one row of interest.
With a table of only 7 rows, a full table scan is acceptable, 
but if the table contained 7 million rows, a full table scan might read 
megabytes of content in order to find a single 8-byte number.  
For that reason, one normally tries to avoid full table scans.





Figure 2: Full Table Scan



1.2.  Lookup By Rowid


One technique for avoiding a full table scan is to do lookups by
rowid (or by the equivalent INTEGER PRIMARY KEY).   To lookup the
price of peaches, one would query for the entry with a rowid of 4:



SELECT price FROM fruitsforsale WHERE rowid=4;




Since the information is stored in the table in rowid order, SQLite
can find the correct row using a binary search.
If the table contains N elements, the time required to look up the
desired row is proportional to logN rather than being proportional
to N as in a full table scan.  If the table contains 10 million elements,
that means the query will be on the order of N/logN or about 1 million
times faster.





Figure 3: Lookup By Rowid



1.3.  Lookup By Index

The problem with looking up information by rowid is that you probably
do not care what the price of "item 4" is - you want to know the price
of peaches.  And so a rowid lookup is not helpful.



To make the original query more efficient, we can add an index on the
"fruit" column of the "fruitsforsale" table like this:



CREATE INDEX Idx1 ON fruitsforsale(fruit);




An index is another table similar to the original "fruitsforsale" table
but with the content (the fruit column in this case) stored in front of the
rowid and with all rows in content order.
Figure 4 gives a logical view of the Idx1 index.
The "fruit" column is the primary key used to order the elements of the
table and the "rowid" is the secondary key used to break the tie when
two or more rows have the same "fruit".  In the example, the raowid
has to be used as a tie-breaker for the "Orange" rows.
Notice that since the rowid
is always unique over all elements of the original table, the composite key
of "fruit" followed by "rowid" will be unique over all elements of the index.





Figure 4: An Index On The Fruit Column




This new index can be used to implement a faster algorithm for the
original "Price of Peaches" query.



SELECT price FROM fruitsforsale WHERE fruit='Peach';




The query starts by doing a binary search on the Idx1 index for entries
that have fruit='Peach'.  SQLite can do this binary search on the Idx1 index
but not on the original FruitsForSale table because the rows in Idx1 are sorted
by the "fruit" column.  Having found a row in the Idx1 index that has
fruit='Peach', the database engine can extract the rowid for that row.
Then the database engines does a second binary search
on the original FruitsForSale table to find the
original row that contains fruit='Peach'.  
From the row in the FruitsForSale table,
SQLite can then extract the value of the price column.
This procedure is illustrated by figure 5.





Figure 5: Indexed Lookup For The Price Of Peaches




SQLite has to do two binary searches to find the price of peaches using
the method show above.  But for a table with a large number of rows, this
is still much faster than doing a full table scan.


1.4.  Multiple Result Rows


In the previous query the fruit='Peach' constraint narrowed the result
down to a single row.  But the same technique works even if multiple
rows are obtained.  Suppose we looked up the price of Oranges instead of
Peaches:



SELECT price FROM fruitsforsale WHERE fruit='Orange'




Figure 6: Indexed Lookup For The Price Of Oranges




In this case, SQLite still does a single binary search to find the first
entry of the index where fruit='Orange'.  Then it extracts the rowid from
the index and uses that rowid to lookup the original table entry via
binary search and output the price from the original table.  But instead
of quitting, the database engine then advances to the next row of index
to repeat the process for next fruit='Orange' entry.  Advancing to the
next row of an index (or table) is much less costly than doing a binary
search since the next row is often located on the same database page as
the current row.  In fact, the cost of advancing to the next row is so
cheap in comparison to a binary search that we usually ignore it.  So
our estimate for the total cost of this query is 3 binary searches.
If the number of rows of output is K and the number of rows in the table
is N, then in general the cost of doing the query is proportional
to (K+1)*logN.


1.5.  Multiple AND-Connected WHERE-Clause Terms


Next, suppose that you want to look up the price of not just any orange,
but specifically California-grown oranges.  The appropriate query would
be as follows:



SELECT price FROM fruitsforsale WHERE fruit='Orange' AND state='CA'




Figure 7: Indexed Lookup Of California Oranges




One approach to this query is to use the fruit='Orange' term of the WHERE
clause to find all rows dealing with oranges, then filter those rows
by rejecting any that are from states other than California.  This
process is shown by figure 7 above.  This is a perfectly
reasonable approach in most cases.  Yes, the database engine did have
to do an extra binary search for the Florida orange row that was
later rejected, so it was not as efficient as we might hope, though
for many applications it is efficient enough.  



Suppose that in addition to the index on "fruit" there was also
an index on "state".



CREATE INDEX Idx2 ON fruitsforsale(state);




Figure 8: Index On The State Column




The "state" index works just like the "fruit" index in that it is a
new table with an extra column in front of the rowid and sorted by
that extra column as the primary key.  The only difference is that
in Idx2, the first column is "state" instead of "fruit" as it is with
Idx1.  In our example data set, there is more redundancy in the "state"
column and so they are more duplicate entriesb.  The ties are still
resolved using the rowid.



Using the new Idx2 index on "state", SQLite has another option for
lookup up the price of California oranges:  it can look up every row
that contains fruit from California and filter out those rows that
are not oranges.





Figure 9: Indexed Lookup Of California Oranges




Using Idx2 instead of Idx1 causes SQLite to examine a different set of
rows, but it gets the same answer in the end (which is very important -
remember that indices should never change the answer, only help SQLite to
get to the answer more quickly) and it does the same amount of work.
So the Idx2 index did not help performance in this case.



The last two queries take the same amount of time, in our example.
So which index, Idx1 or Idx2, will SQLite choose?  If the
ANALYZE command has been run on the database, so that SQLite has
had an opportunity to gather statistics about the available indices,
then SQLite will know that the Idx1 index usually narrows the search
down to a single item (our example of fruit='Orange' is the exception
to this rule) whereas the Idx2 index will normally only narrow the 
search down to two rows.  So, if all else is equal, SQLite will
choose Idx1 with the hope of narrowing the search to as small
a number of rows as possible.  This choice is only possible because
of the statistics provided by ANALYZE.  If ANALYZE has not been
run then the choice of which index to use is arbitrary.


1.6.  Multi-Column Indices


To get the maximum performance out of a query with multiple AND-connected
terms in the WHERE clause, you really want a multi-column index with
columns for each of the AND terms.  In this case we create a new index
on the "fruit" and "state" columns of FruitsForSale:



CREATE INDEX Idx3 ON FruitsForSale(fruit, state);




Figure 1: A Two-Column Index




A multi-column index follows the same pattern as a single-column index;
the indexed columns are added in front of the rowid.  The only difference
is that now multiple columns are added.  The left-most column is the
primary key used for ordering the rows in the index.  The second column is
used to break ties in the left-most column.  If there were a third column,
it would be used to break ties for the first two columns.  And so forth for
all columns in the index.  Because rowid is guaranteed
to be unique, every row of the index will be unique even if all of the
content columns for two rows are the same.  That case does not happen
in our sample data, but there is one case (fruit='Orange') where there
is a tie on the first column which must be broken by the second column.



Given the new multi-column Idx3 index, it is now possible for SQLite
to find the price of California oranges using only 2 binary searches:



SELECT price FROM fruitsforsale WHERE fruit='Orange' AND state='CA'




Figure 11: Lookup Using A Two-Column Index




With the Idx3 index on both columns that are constrained by the WHERE clause,
SQLite can do a single binary search against Idx3 to find the one rowid
for California oranges, then do a single binary search to find the price
for that item in the original table.  There are no dead-ends and no
wasted binary searches.  This is a more efficient query.



Note that Idx3 contains all the same information as the original 
Idx1.  And so if we have Idx3, we do not really need Idx1
any more.  The "price of peaches" query can be satisfied using Idx3
by simply ignoring the "state" column of Idx3:



SELECT price FROM fruitsforsale WHERE fruit='Peach'




Figure 12: Single-Column Lookup On A Multi-Column Index




Hence, a good rule of thumb is that your database schema should never
contain two indices where one index is a prefix of the other.  Drop the
index with fewer columns.  SQLite will still be able to do efficient
lookups with the longer index.




1.7.  Covering Indexes


The "price of California oranges" query was made more efficient through
the use of a two-column index.  But SQLite can do even better with a
three-column index that also includes the "price" column:



CREATE INDEX Idx4 ON FruictsForSale(fruit, state, price);




Figure 13: A Covering Index




This new index contains all the columns of the original FruitsForSale table that
are used by the query - both the search terms and the output.  We call
this a "covering index".  Because all of the information needed is in
the covering index, SQLite never needs to consult the original table
in order to find the price.



SELECT price FROM fruitsforsale WHERE fruit='Orange' AND state='CA';




Figure 14: Query Using A Covering Index




Hence, by adding extra "output" columns onto the end of an index, one
can avoid having to reference the original table and thereby
cut the number of binary searches for a query in half.  This is a
constant-factor improvement in performance (roughly a doubling of
the speed).  But on the other hand, it is also just a refinement;
A two-fold performance increase is not nearly as dramatic as the
one-million-fold increase seen when the table was first indexed.
And for most queries, the difference between 1 microsecond and
2 microseconds is unlikely to be noticed.




1.8.  OR-Connected Terms In The WHERE Clause


Multi-column indices only work if the constraint terms in the WHERE
clause of the query are connected by AND.
So Idx3 and Idx4 are helpful when the search is for items that
are both Oranges and grown in California, but neither index would
be that useful if we wanted all items that were either oranges
or are grown in California.



SELECT price FROM FruitsForSale WHERE fruit='Orange' OR state='CA';




When confronted with OR-connected terms in a WHERE clause, SQLite 
examines each OR term separately and tries to use an index to
find the rowids associated with each term.
It then takes the union of the resulting rowid sets to find
the end result.  The following figure illustrates this process:





Figure 15: Query With OR Constraints




The diagram above implies that SQLite computes all of the rowids first
and then combines them with a union operation before starting to do
rowid lookups on the original table.  In reality, the rowid lookups
are interspersed with rowid computations.  SQLite uses one index at
a time to find rowids while remembering which rowids it has seen
before so as to avoid duplicates.  That is just an implementation
detail, though.  The diagram, while not 100% accurate, provides a good
overview of what is happening.



In order for the OR-by-UNION technique shown above to be useful, there
must be an index available that helps resolve every OR-connected term
in the WHERE clause.  If even a single OR-connected term is not indexed,
then a full table scan would have to be done in order to find the rowids
generated by the one term, and if SQLite has to do a full table scan, it
might as well do it on the original table and get all of the results in
a single pass without having to mess with union operations and follow-on
binary searches.



One can see how the OR-by-UNION technique could also be leveraged to
use multiple indices on queries where the WHERE clause has terms connected
by AND, by using an intersect operator in place of union.  Many SQL
database engines will do just that.  But the performance gain over using
just a single index is slight and so SQLite does not implement that technique
at this time.  However, a future version SQLite might be enhanced to support
AND-by-INTERSECT.




2.  Sorting


SQLite (like all other SQL database engines) can also use indices to
satisfy the ORDER BY clauses in a query, in addition to expediting
lookup.  In other words, indices can be used to speed up sorting as
well as searching.



When no appropriate indices are available, a query with an ORDER BY
clause must be sorted as a separate step.  Consider this query:



SELECT * FROM fruitsforsale ORDER BY fruit;




SQLite processes this by gathering all the output of query and then
running that output through a sorter.





Figure 16: Sorting Without An Index




If the number of output rows is K, then the time needed to sort is
proportional to KlogK.  If K is small, the sorting time is usually
not a factor, butd in a query such as the above where K==N, the time
needed to sort can be much greater than the time needed to do a
full table scan.  Furthermore, the entire output is accumulated in
temporary storage (which might be either in main memory or on disk,
depending on various compile-time and run-time settings)
which can mean that a lot of temporary storage is required to complete
the query.


2.1.  Sorting By Rowid


Because sorting can be expensive, SQLite works hard to convert ORDER BY
clauses into no-ops.  If SQLite determines that output will
naturally appear in the order specified, then no sorting is done.
So, for example, if you request the output in rowid order, no sorting
will be done:



SELECT * FROM fruitsforsale ORDER BY rowid;




Figure 17: Sorting By Rowid




You can also request a reverse-order sort like this:



SELECT * FROM fruitsforsale ORDER BY rowid DESC;




SQLite will still omit the sorting step.  But in order for output to
appear in the correct order, SQLite will do the table scan starting at
the end and working toward the beginning, rather than starting at the
beginning and working toward the end as shown in 
figure 17.


2.2.  Sorting By Index


Of course, ordering the output of a query by rowid is seldom useful.
Usually one wants to order the output by some other column.



If an index is available on the ORDER BY column, that index can be used
for sorting.  Consider the request for all items sorted by "fruit":



SELECT * FROM fruitsforsale ORDER BY fruit;






Figure 18: Sorting With An Index




The Idx1 index is scanned from top to bottom (or from bottom to top if
"ORDER BY fruit DESC" is used) in order to find the rowids for each item
in order by fruit.  Then for each rowid, a binary search is done to lookup
and output that row.  In this way, the output appears in the requested order
without the need to gather the entire output and sort it using a separate step.



But does this really save time?  The number of steps in the 
original indexless sort is proportional to NlogN since
that is how much time it takes to sort N rows.  But when we use Idx1 as
shown here, we have to do N rowid lookups which take logN time each, so
the total time of NlogN is the same!



SQLite uses a cost-based query planner.  When there are two or more ways
of solving the same query, SQLite tries to estimate the total amount of
time needed to run the query using each plan, and then uses the plan with
the lowest estimated cost.  A cost is computed mostly from the estimated
time, and so this case could go either way depending on the table size and
what WHERE clause constraints were available, and so forth.  But generally
speaking, the indexed sort would probably be chosen, if for no other
reason, because it does not need to accumulate the entire result set in
temporary storage before sorting and thus uses much less temporary storage.


2.3.  Sorting By Covering Index


If a covering index can be used for a query, then the multiple rowid lookups
can be avoided and the cost of the query drops dramatically.





Figure 19: Sorting With A Covering Index




With a covering index, SQLite can simply walk the index from one end to the
other and deliver the output in time proportional to N and without having
allocate a large buffer to hold the result set.


3.  Searching And Sorting At The Same Time


The previous discussion has treated searching and sorting as separate
topics.  But in practice, it is often the case that one wants to search
and sort at the same time.  Fortunately, it is possible to do this
using a single index.


3.1.  Searching And Sorting With A Multi-Column Index


Suppose we want to find the prices of all kinds of oranges sorted in
order of the state where they are grown.  The query is this:



SELECT price FROM fruitforsale WHERE fruit='Orange' ORDER BY state




The query contains both a search restriction in the WHERE clause
and a sort order in the ORDER BY clause.  Both the search and the sort
can be accomplished at the same time using the two-column index Idx3.





Figure 20: Search And Sort By Multi-Column Index




The query does a binary search on the index to find the subset of rows
that have fruit='Orange'.  (Because the fruit column is the left-most column
of the index and the rows of the index are in sorted order, all such 
rows will be adjacent.)  Then it scans the matching index rows from top to
bottom to get the rowids for the original table, and for each rowid does
a binary search on the original table to find the price.



You will notice that there is no "sort" box anywhere in the above diagram.
The ORDER BY clause of the query has become a no-op.  No sorting has to be
done here because the output order is by the state column and the state
column also happens to be the first column after the fruit column in the
index.  So, if we scan entries of the index that have the same value for
the fruit column from top to bottom, those index entries are guaranteed to
be ordered by the state column.




3.2.  Searching And Sorting With A Covering Index


A covering index can also be used to search and sort at the same time.
Consider the following:



SELECT * FROM fruitforsale WHERE fruit='Orange' ORDER BY state




Figure 21: Search And Sort By Covering Index




As before, SQLite does single binary search
for the range of rows in the covering
index that satisfy the WHERE clause, the scans that range from top to 
bottom to get the desired results.  
The rows that satisfy the WHERE clause are guaranteed to be adjacent
since the WHERE clause is an equality constraint on the left-most
column of the index.  And by scanning the matching index rows from
top to bottom, the output is guaranteed to be ordered by state since the
state column is the very next column to the right of the fruit column.
And so the resulting query is very efficient.



SQLite can pull a similar trick for a descending ORDER BY:



SELECT * FROM fruitforsale WHERE fruit='Orange' ORDER BY state DESC




The same basic algorithm is followed, except this time the matching rows
of the index are scanned from bottom to top instead of from top to bottom,
so that the states will appear in descending order.




3.3.  Partial Sorting Using An Index (a.k.a. Block Sorting)


Sometimes only part of an ORDER BY clause can be satisfied using indexes.
Consider, for example, the following query:



SELECT * FROM fruitforsale ORDER BY fruit, price




If the covering index is used for the scan, the "fruit" column will appear
naturally in the correct order, but when there are two or more rows with
the same fruit, the price might be out of order.  When this occurs, SQLite
does many small sorts, one sort for each distinct value of fruit, rather
than one large sort.  Figure 22 below illustrates the concept.





Figure 22: Partial Sort By Index




In the example, instead of a single sort of 7 elements, there
are 5 sorts of one-element each and 1 sort of 2 elements for the
case of fruit=='Orange'.


The advantages of doing many smaller sorts instead of a single large sort
are:

Multiple small sorts collectively use fewer CPU cycles than a single
    large sort.
Each small sort is run independently, meaning that much less information
    needs to be kept in temporary storage at any one time.
Those columns of the ORDER BY that are already in the correct order
    due to indexes can be omitted from the sort key, further reducing
    storage requirements and CPU time.
Output rows can be returned to the application as each small sort
    completes, and well before the table scan is complete.
If a LIMIT clause is present, it might be possible to avoid scanning
    the entire table.


Because of these advantages, SQLite always tries to do a partial sort using an
index even if a complete sort by index is not possible.

4.  WITHOUT ROWID tables


The basic principals described above apply to both ordinary rowid tables
and WITHOUT ROWID tables.
The only difference is that the rowid column that serves as the key for
tables and that appears as the right-most term in indexes is replaced by
the PRIMARY KEY.

This page last modified on  2022-10-26 13:30:36 UTCqueryplanner.html
ªªÆ5‚B
)ƒŒ%/Query PlanningOverview 


The best feature of SQL (in all its implementations, not just SQLite)
is that it is a declarative language, not a procedural
language.  When programming in SQL you tell the system what you
want to compute, not how to compute it.  The task of figuring out
the how is delegated to the query planner subsystem within 
the SQL database engine.

For any given SQL statement, there might be hundreds or thousands or
even millions of different algorithms of performing the operation.  All
of these algorithms will get the correct answer, though some will run
faster than others.
The query planner is an 
AI that 
tries to pick the fastest and most efficient algorithm for each SQL
statement.



Most of the time, the query planner in SQLite does a good job.
However, the query planner needs indices to
work with.  
T_gr
  Unix or Windows.  But the method is available for embedded device
  manufacturers to tweak according to their own needs.  And we have
  left open the possibility of filling in a more meaningful implementation
  on Unix and Windows in the future.

SQLite has traditionally assumed that a sector write is not atomic.
However, SQLite does always assume that a sector write is linear.  By "linear"
we mean that SQLite assumes that when writing a sector, the hardware begins
at one end of the data and writes byte by byte until it gets to
the other end.  The write might go from beginning to end or from
end to beginning.  If a power failure occurs in the middle of a
sector write it might be that part of the sector was modified
and another part was left unchanged.  The key assumption by SQLite
is that if any part of the sector gets changed, then either the
first or the last bytes will be changed.  So the hardware will
never start writing a sector in the middle and work towards the
ends.  We do not know if this assumption is always true but it
seems reasonable.

The previous paragraph states that SQLite does not assume that
sector writes are atomic.  This is true by default.  But as of
SQLite version 3.5.0, there is a new interface called the
Virtual File System (VFS) interface.  The VFS is the only means
by which SQLite communicates to the underlying filesystem.  The
code comes with default VFS implementations for Unix and Windows
and there is a mechanism for creating new custom VFS implementations
at runtime.  In this new VFS interface there is a method called
xDeviceCharacteristics.  This method interrogates the underlying
filesystem to discover various properties and behaviors that the
filesystem may or may not exhibit.  The xDeviceCharacteristics
method might indicate that sector writes are atomic, and if it does
so indicate, SQLite will try to take advantage of that fact.  But
the default xDeviceCharacteristics method for both Unix and Windows
does not indicate atomic sector writes and so these optimizations
are normally omitted.

SQLite assumes that the operating system will buffer writes and
that a write request will return before data has actually been stored
in the mass storage device.
SQLite further assumes that write operations will be reordered by
the operating system.
For this reason, SQLite does a "flush" or "fsync" operation at key
points.  SQLite assumes that the flush or fsync will not return until
all pending write operations for the file that is being flushed have
completed.  We are told that the flush and fsync primitives
are broken on some versions of Windows and Linux.  This is unfortunate.
It opens SQLite up to the possibility of database corruption following
a power loss in the middle of a commit.  However, there is nothing 
that SQLite can do to test for or remedy the situation.  SQLite
assumes that the operating system that it is running on works as
advertised.  If that is not quite the case, well then hopefully you
will not lose power too often.

SQLite assumes that when a file grows in length that the new
file space originally contains garbage and then later is filled in
with the data actually written.  In other words, SQLite assumes that
the file size is updated before the file content.  This is a 
pessimistic assumption and SQLite has to do some extra work to make
sure that it does not cause database corruption if power is lost
between the time when the file size is increased and when the
new content is written.  The xDeviceCharacteristics method of
the VFS might indicate that the filesystem will always write the
data before updating the file size.  (This is the 
SQLITE_IOCAP_SAFE_APPEND property for those readers who are looking
at the code.)  When the xDeviceCharacteristics method indicates
that files content is written before the file size is increased,
SQLite can forego some of its pedantic database protection steps
and thereby decrease the amount of disk I/O needed to perform a
commit.  The current implementation, however, makes no such assumptions
for the default VFSes for Windows and Unix.h

SQLite assumes that a file deletion is atomic from the
point of view of a user process.  By this we mean that if SQLite
requests that a file be deleted and the power is lost during the
delete operation, once power is restored either the file will
exist completely with all if its original content unaltered, or
else the file will not be seen in the filesystem at all.  If
after power is restored the file is only partially deleted,
if some of its data has been altered or erased,
or the file has been truncated but not completely removed, then
database corruption will likely result.

SQLite assumes that the detection and/or correction of 
bit errors caused by cosmic rays, thermal noise, quantum
fluctuations, device driver bugs, or other mechanisms, is the 
responsibility of the underlying hardware and operating system.  
SQLite does not add any redundancy to the database file for
the purpose of detecting corruption or I/O errors.
SQLite assumes that the data it reads is exactly the same data 
that it previously wrote.

By default, SQLite assumes that an operating system call to write
a range of bytes will not damage or alter any bytes outside of that range
even if a power loss or OS crash occurs during that write.  We
call this the "powersafe overwrite" property.  
Prior to version 3.7.9 (2011-11-01),
SQLite did not assume powersafe overwrite.  But with the standard
sector size increasing from 512 to 4096 bytes on most disk drives, it
has become necessary to assume powersafe overwrite in order to maintain
historical performance levels and so powersafe overwrite is assumed by
default in recent versions of SQLite.  The assumption of powersafe 
overwrite property can be disabled at compile-time or a run-time if
desired.  See the powersafe overwrite documentation for further
details.



3.  Single File Commit

We begin with an overview of the steps SQLite takes in order to
perform an atomic commit of a transaction against a single database
file.  The details of file formats used to guard against damage from
power failures and techniques for performing an atomic commit across
multiple databases are discussed in later sections.



3.1.  Initial State



The state of the computer when a database connection is
first opened is shown conceptually by the diagram at the
right.
The area of the diagram on the extreme right (labeled "Disk") represents
information stored on the mass storage device.  Each rectangle is
a sector.  The blue color represents that the sectors contain
original data.
The middle area is the operating systems disk cache.  At the
onset of our example, the cache is cold and this is represented
by leaving the rectangles of the disk cache empty.
The left area of the diagram shows the content of memory for
the process that is using SQLite.  The database connection has
just been opened and no information has been read yet, so the
user space is empty.





3.2.  Acquiring A Read Lock



Before SQLite can write to a database, it must first read
the database to see what is there already.  Even if it is just
appending new data, SQLite still has to read in the database
schema from the "sqlite_schema" table so that it can know
how to parse the INSERT statements and discover where in the
database file the new information should be stored.

The first step toward reading from the database file
is obtaining a shared lock on the database file.  A "shared"
lock allows two or more database connections to read from the
database file at the same time.  But a shared lock prevents
another database connection from writing to the database file
while we are reading it.  This is necessary because if another
database connection were writing to the database file at the
same time we are reading from the database file, we might read
some data before the change and other data after the change.
This would make it appear as if the change made by the other
process is not atomic.

Notice that the shared lock is on the operating system
disk cache, not on the disk itself.  File locks
really are just flags within the operating system kernel,
usually. i (The details depend on the specific OS layer
interface.)  Hence, the lock will instantly vanish if the
operating system crashes or if there is a power loss.  It
is usually also the case that the lock will vanish if the
process that created the lock exits.




3.3.  Reading Information Out Of The Database



After the shared lock is acquired, we can begin reading
information from the database file.  In this scenario, we
are assuming a cold cache, so information must first be
read from mass storage into the operating system cache then
transferred from operating system cache into user space.
On subsequent reads, some or all of the information might
already be found in the operating system cache and so only
the transfer to user space would be required.

Usually only a subset of the pages in the database file
are read.  In this example we are showing three
pages out of eight being read.  In a typical application, a
database will have thousands of pages and a query will normally
only touch a small percentage of those pages.





3.4.  Obtaining A Reserved Lock



Before making changes to the database, SQLite first
obtains a "reserved" lock on the database file.  A reserved
lock is similar to a shared lock in that both a reserved lock
and shared lock allow other processes to read from the database
file.  A single reserve lock can coexist with multiple shared
locks from other processes.  However, there can only be a
single reserved lock on the database file.  Hence only a
single process can be attempting to write to the database
at one time.

The idea behind a reserved lock is that it signals that
a process intends to modify the database file in the near
future but has not yet started to make the modifications.
And because the modifications have not yet started, other
processes can continue to read from the database.  However,
no other process should also begin trying to write to the
database.



3.5.  Creating A Rollback Journal File


Prior to making any changes to the database file, SQLite first
creates a separate rollback journal file and writes into the 
rollback journal the original
content of the database pages that are to be altered.
The idea behind the rollback journal is that it contains
all information needed to restore the database back to 
its original state.

The rollback journal contains a small header (shown in green
in the diagram) that records the original size of the database
file.  So if a change causes the database file to grow, we
will still know the original size of the database.  The page
number is stored together with each database page that is 
written into the rollback journal.


  When a new file is created, most desktop operating systems
  (Windows, Linux, Mac OS X) will not actually write anything to
  disk.  The new file is created in the operating systems disk
  cache only.  The file is not created on mass storage until sometime
  later, when the operating system has a spare moment.  This creates
  the impression to users that I/O is happening much faster than
  is possible when doing real disk I/O.  We illustrate this idea in
  the diagram to the right by showing that the new rollback journal
  appears in the operating system disk cache only and not on the
  disk itself.



3.6.  Changing Database Pages In User Space


After the original page content has been saved in the rollback
journal, the pages can be modified in user memory.  Each database
connection has its own private copy of user space, so the changes
that are made in user space are only visible to the database connection
that is making the changes.  Other database connections still see
the information in operating system disk cache buffers which have
not yet been changed.  And so even though one process is busy
modifying the database, other processes can continue to read their
own copies of the original database content.



3.7.  Flushing The Rollback Journal File To Mass Storage


The next step is to flush the content of the rollback journal
file to nonvolatile storage.
As we will see later, 
this is a critical step in insuring thjat the database can survive
an unexpected power loss.
This step also takes a lot of time, since writing to nonvolatile
storage is normally a slow operation.

This step is usually more complicated than simply flushing
the rollback journal to the disk.  On most platforms two separate
flush (or fsync()) operations are required.  The first flush writes
out the base rollback journal content.  Then the header of the
rollback journal is modified to show the number of pages in the 
rollback journal.  Then the header is flushed to disk.  The details
on why we do this header modification and extra flush are provided
in a later section of this paper.



3.8.  Obtaining An Exclusive Lock


Prior to making changes to the database file itself, we must
obtain an exclusive lock on the database file.  Obtaining an
exclusive lock is really a two-step process.  First SQLite obtains
a "pending" lock.  Then it escalates the pending lock to an
exclusive lock.

A pending lock allows other processes that already have a
shared lock to continue reading the database file.  But it
prevents new shared locks from being established.  The idea
behind a pending lock is to prevent writer starvation caused
by a large pool of readers.  There might be dozens, even hundreds,
of other processes trying to read the database file.  Each process
acquires a shared lock before it starts reading, reads what it
needs, then releases the shared lock.  If, however, there are
many different processes all reading from the same database, it
might happen that a new process always acquires its shared lock before
the previous process releases its shared lock.  And so there is
never an instant when there are no shared locks on the database
file and hence there is never an opportunity for the writer to
seize the exclusive lock.  A pending lock is designed to prevent
that cycle by allowing existing shared locks to proceed but
blocking new shared locks from being established.  Eventually
all shared locks will clear and the pending lock will then be
able to escalate into an exclusive lock.



3.9.  Writing Changes To The Database File


Once an exclusive lock is held, we know that no other
processes are reading from the database file and it is
safe to write changes into the database file.  Usually
those changes only go as far as the operating systems disk
cache and do not make it all the way to mass storage.



3.10. 0 Flushing Changes To Mass Storage


Another flush must occur to make sure that all the
database changes are written into nonvolatile storage.
This is a critical step to ensure that the database will
survive a power loss without damage.  However, because
of the inherent slowness of writing to disk or flash memory, 
this step together with the rollback journal file flush in section
3.7 above takes up most of the time required to complete a
transaction commit in SQLite.



3.11. 1 Deleting The Rollback Journal


After the database changes are all safely on the mass
storage device, the rollback journal file is deleted.
This is the instant where the transaction commits.
If a power failure or system crash occurs prior to this
point, then recovery processes to be described later make
it appear as if no changes were ever made to the database
file.  If a power failure or system crash occurs after
the rollback journal is deleted, then it appears as if
all changes have been written to disk.  Thus, SQLite gives
the appearance of having made no changes to the database
file or having made the complete set of changes to the
database file depending on whether or not the rollback
journal file exists.

Deleting a file is not really an atomic operation, but
it appears to be from the point of view of a user process.
A process is always able to ask the operating system "does
this file exist?" and the process will get back a yes or no
answer.  After a power failure that occurs during a 
transaction commit, SQLite will ask the operating system
whether or not the rollback journal file exists.  If the
answer is "yes" then the transaction is incomplete and is
rolled back.  If the answer iks "no" then it means the transaction
did commit.

The existence of a transaction depends on whether or
not the rollback journal file exists and the deletion
of a file appears to be an atomic operation from the point of
view of a user-space process.  Therefore, 
a transaction appears to be an atomic operation.

The act of deleting a file is expensive on many systems.
As an optimization, SQLite can be configured to truncate
the journal file to zero bytes in length
or overwrite the journal file header with zeros.  In either
case, the resulting journal file is no longer capable of rolling
back and so the transaction still commits.  Truncating a file
to zero length, like deleting a file, is assumed to be an atomic
operation from the point of view of a user process.  Overwriting
the header of the journal with zeros is not atomic, but if any
part of the header is malformed the journal will not roll back.
Hence, one can say that the commit occurs as soon as the header
is sufficiently changed to make it invalid.  Typically this happens
as soon as the first byte of the header is zeroed.



3.12. 2 Releasing The Lock


The last step in the commit process is to release the
exclusive lock so that other processes can once again
start accessing the database file.

In the diagram at the right, we show that the information
that was held in user space is cleared when the lock is released.
This used to be literally true for older versions of SQLite.  But
more recent versions of SQLite keep the user space information
in memory in case it might be needed again at the start of the
next transaction.  It is cheaper to reuse information that is
already in local memory than to transfer the information back
from the operating system disk cache or to read it off of the
disk drive again.  Prior to reusing the information in user space,
we must first reacquire the shared lock and then we have to check
to make sure that no other process modified the database file while
we were not holding a lock.  There is a counter in the first page
of the database that is incremented every time the database file
is modified.  We can find out if another process has modified the
database by checking that counter.  If the database was modified,
then the user space cache must be cleared and reread.  But it is
commonly the case that no changes have been made and the user
space cache can be reused for a significant performance savings.




4.  Rollback

An atomic commit is supposed to happen instantaneously.  But the processing
described above clearly takes a finite amount of time.
Suppose the power to the computer were cut
part way through the commit operation described above.  In order
to maintain the illusion that the changes were instantaneous, we
have to "rollback" any partial changes and restore the database to
the state it was in prior to the beginning of the transaction.



4.1.  When Something Goes Wrong...


Suppose the power loss occurred
during step 3.10 above,
while the database changes were being written to disk.
After power is restored, the situation might be something
like what is shown to the right.  We were trying to change
three pages of the database file but only one page was
successfully written.  Another page was partially written
and a third page was not written at all.

The rollback journal is complete and intact on disk when
the power is restored.  This is a key point.  The reason for
the flush operation in step 3.7
is to make absolutely sure that
all of the rollback journal is safely on nonvolatile storage
prior to making any changes to the database file itself.



4.2.  Hot Rollback Journals


The first time that any SQLite process attempts to access
the database file, it obtains a shared lock as described in
section 3.2 above.
But then it notices that there is a 
rollback journal file present.  SQLite then checks to see if
the rollback journal is a "hot journal".   A hot journal is
a rollback journal that needs to be played back in order to
restore the database to a sane state.  A hot journal only
exists when an earlier process was in the mliddle of committing
a transaction when it crashed or lost power.

A rollback journal is a "hot" journal if all of the following
are true:


The rollback journal exists.
The rollback journal is not an empty file.
There is no reserved lock on the main database file.
The header of the rollback journal is well-formed and in particular
    has not been zeroed out.
The rollback journal does not
contain the name of a super-journal file (see
section 5.5 below) or if does
contain the name of a super-journal, then that super-journal
file exists.


The presence of a hot journal is our indication
that a previous process was trying to commit a transaction but
it aborted for some reason prior to the completion of the
commit.  A hot journal means that
the database file is in an inconsistent state and needs to
be repaired (by rollback) prior to being used.




4.3.  Obtaining An Exclusive Lock On The Database


The first step toward dealing with a hot journal is to
obtain an exclusive lock on the database file.  This prevents two
or more processes from trying to rollback the same hot journal
at the same time.



4.4.  Rolling Back Incomplete Changes


Once a process obtains an exclusive lock, it is permitted
to write to the database file.  It then proceeds to read the
original content of pages out of the rollback journal and write
that content back to where it came from in the database file.
Recall that the header of the rollback journal records the original
size of the database file prior to the start of the aborted
transaction.  SQLite uses this information to truncate the
database file back to its original size in cases where the
incomplete transaction caused the database to grow.  At the
end of this step, the database should be the same size and
contain the same information as it did before the start of
the aborted transaction.




4.5.  Deleting The Hot Journal


After all information in the rollback journal has been
played back into the database file (and flushed to disk in case
we encounter yet another power failure), the hot rollback journal
can be deleted.

As in section 3.11, the journal
file might be truncated to zero length or its header might
be overwritten with zeros as an optimization on systems where
deleting a file is expensive.  Either way, the journal is no 
longer hot after this step.




4.6.  Continue As If The Uncompleted Writes Had Never Happened


The final recovery step is to reduce the exclusive lock back
to a shared lock.  Once this happens, the database is back in the
state that it would have been if the aborted transaction had never
started.  Since all of this recovery activity happens completely
automatically and transparently, it appears to the program using
SQLite as if the aborted transaction had never begun.




5.  Multi-file Commit

SQLite allows a single 
database connection to talk to
two or more database files simultaneously through the use of
the ATTACH DATABASE command.
When multiple database files are modified within a single
transaction, all files are updated atomically.  
In other words, either all of the database files are updated or
else none of them are.
Achieving an atomic commit across multiple database files is
more complex that doing so for a single file.  This section
describes how SQLite works that bit of magic.



5.1.  Separate Rollback Journals For Each Database


When multiple database files are involved in a transaction,
each database has its own rollback journal and each database
is locked separately.  The diagram at the right shows a scenario
where three different database files have been modified within
one transaction.  The situation at this step is analogous to 
the single-file transaction scenario at 
step 3.6.  Each database file has
a reserved lock.  For each database, the original content of pages 
that are being changed have been written into the rollback journal
for that database, but the content of the journals have not yet
been flushed to disk.  No changes have been made to the database
file itself yet, though presumably there are changes being held
in user memomry.

For brevity, the diagrams in this section are simplified from
those that came before.  Blue color still signifies original content
and pink still signifies new content.  But the individual pages
in the rollback journal and the database file are not shown and
we are not making the distinction between information in the
operating system cache and information that is on disk.  All of
these factors still apply in a multi-file commit scenario.  They
just take up a lot of space in the diagrams and they do not add
any new information, so they are omitted here.




5.2.  The Super-Journal File


The next step in a multi-file commit is the creation of a
"super-journal" file.  The name of the super-journal file is
the same name as the original database filename (the database
that was opened using the 
sqlite3_open() interface,
not one of the ATTACHed auxiliary
databases) with the text "-mjHHHHHHHH" appended where
HHHHHHHH is a random 32-bit hexadecimal number.  The
random HHHHHHHH suffix changes for every new super-journal.

(Nota bene: The formula for computing the super-journal filename
given in the previous paragraph corresponds to the implementation as
of SQLite version 3.5.0.  But this formula is not part of the SQLite
specification and is subject to change in future releases.)

Unlike the rollback journals, the super-journal does not contain
any original database page content.  Instead, the super-journal contains
the full pathnames for rollback journals for every database that is
participating in the transaction.

After the super-journal is constructed, its content is flushed
to disk before any further actions are taken.  On Unix, the directory
that contains the super-journal is also synced in order to make sure
the super-journal file will appear in the directory following a
power failure.

The purpose of the super-journal is to ensure that multi-file
transactions are atomic across a power-loss.  But if the database files
have other settings that compromise integrity across a power-loss event
(such as PRAGMA synchronous=OFF or PRAGMA journal_mode=MEMORY) then
the creation of the super-journal is omitted, as an optimization.




5.3.  Updating Rollback Journal Headers


The next step is to record the full pathname of the super-journal file
in the header of every rollback journal.  Space to hold the 
super-journal filename was reserved at the beginning of each rollback journal
as the rollback journals were created.

The content of each rollback journal is flushed to disk both before
and after the super-journal filename is written into the rollback
journal header.  It is important to do both of these flushes.  Fortunately,
the second flush is usually inexpensive since typically only a single
page of the journal file (the first page) has changed.

This step is analogous to 
step 3.7 in the single-file commit
scenario described above.




5.4.  Updating The Database Files


Once all rollback journal files have been flushed to disk, it
is safe to begin updating database files.  We have to obtain an
exclusive lock on all database files before writing the changes.
After all the changes are written, it is important to flush the
changes to disk so that they will be preserved in the event of
a power failure or operating system crash.

This step corresponds to steps
3.8,
3.9, and
3.10 in the single-file commit
scenario described previously.




5.5.  Delete The Super-Journal File


The next step is to delete the super-journal file.
This is the point where the multi-file transaction commits.
This step corresponds to 
step 3.11 in the single-file
commit scenario where the rollback journal is deleted.

If a power failure or operating system crash occurs at this
point, the transaction will not rollback when the system reboots
even though there are rollback journals present.  The
difference is the super-journal pathname in the header of the
rollback journal.  Upon restart, SQLite only considers a journal
to be hot and will only playback the journal if there is no
super-journal filename in the header (which is the case for
a single-fnile commit) or if the super-journal file still
exists on disk.




5.6.  Clean Up The Rollback Journals


The final step in a multi-file commit is to delete the
individual rollback journals and drop the exclusive locks on
the database files so that other processes can see the changes.
This corresponds to 
step 3.12 in the single-file
commit sequence.

The transaction has already committed at this point so timing
is not critical in the deletion of the rollback journals.
The current implementation deletes a single rollback journal
then unlocks the corresponding database file before proceeding
to the next rollback journal.  But in the future we might change
this so that all rollback journals are deleted before any database
files are unlocked.  As long as the rollback journal is deleted before
its corresponding database file is unlocked it does not matter in what
order the rollback journals are deleted or the database files are
unlocked.



6.  Additional Details Of The Commit Process

Section 3.0 above provides an overview of
how atomic commit works in SQLite.  But it glosses over a number of
important details.  The following subsections will attempt to fill
in the gaps.



6.1.  Always Journal Complete Sectors

When the original content of a database page is written into
the rollback journal (as shown in section 3.5),
SQLite always writes a complete sector of data, even if the
page size of the database is smaller than the sector size.  
Historically, the sector size in SQLite has been hard coded to 512
bytes and since the minimum page size is also 512 bytes, this has never
been an issue.  But beginning with SQLite version 3.3.14, it is possible
for SQLite to use mass storage devices with a sector size larger than 512
bytes.  So, beginning with version 3.3.14, whenever any page within a
sector is written into the journal file, all pages in that same sector
are stored with it.

It is important to store all pages of a sector in the rollback
journal in order to prevent database corruption following a power
loss while writing the sector.  Suppose that pages 1, 2, 3, and 4 are
all stored in sector 1 and that page 2 is modified.  In order to write
the changes to page 2, the underlying hardware must also rewrite the
content of pages 1, 3, and 4 since the hardware must write the complete
sector.  If this write operation is interrupted by a power outage,
one or more of the pages 1, 3, or 4 might be left with incorrect data.
Hence, to avoid lasting corruption to the database, the original content
of all of those pages must be contained in the rollback journal.



6.2.  Dealing With Garbage Written Into Journal Files

When data is appended to the end of the rollback journal,
SQLite normally makes the pessimistic assumption that the file
is first extended with invalid "garbage" data and that afterwards
the correct data replaces the garbage.  In other words, SQLite assumes
that the file size is increased first and then afterwards the content
is written into the file.  If a power failure occurs after the file
size has been increased but before the file content has been written,
the rollback journal can be left containing garbage data.  If after
power is restored, another SQLite process sees the rollback journal
containing the garbage data and tries to roll it back into the original
database file, it might copy some of the garbage into the database file
and thus corrupt the database file.

SQLite uses two defenses against this problem.  In the first place,
SQLite records the number of pages in the rollback journal in the header
of the rollback journal.  This number is initially zero.  So during an
attempt to rollback an incomplete (and possibly corrupt) rollback
journal, the process doing the rollback will see that the journal
contains zero pages and will thus make no changes to the database.  Prior
to a commit, the rollback journal is flushed to disk to ensure that
all content has been synced to disk and there is no "garbage" left
in the file, and only then is the page count in the header changed from
zero to true number of pages in othe rollback journal.  The rollback journal
header is always kept in a separate sector from any page data so that
it can be overwritten and flushed without risking damage to a data
page if a power outage occurs.  Notice that the rollback journal
is flushed to disk twice: once to write the page content and a second
time to write the page count in the header.

The previous paragraph describes what happens when the
synchronous pragma setting is "full".


PRAGMA synchronous=FULL;


The default synchronous setting is full so the above is what usually
happens.  However, if the synchronous setting is lowered to "normal",
SQLite only flushes the rollback journal once, after the page count has
been written.
This carries a risk of corruption because it might happen that the 
modified (non-zero) page count reaches the disk surface before all
of the data does.  The data will have been written first, but SQLite
assumes that the underlying filesystem can reorder write requests and
that the page count can be burned into oxide first even though its
write request occurred last.  So as a second line of defense, SQLite
also uses a 32-bit checksum on every page of data in the rollback
journal.  This checksum is evaluated for each page during rollback
while rolling back a journal as described in 
section 4.4.  If an incorrect checksum
is seen, the rollback is abandoned.  Note that the checksum does
not guarantee that the page data is correct since there is a small
but finite probability that the checksum might be right even if the data is
corrupt.  But the checksum does at least make such an error unlikely.


Note that the checksums in the rollback journal are not necessary
if the synchronous setting is FULL.  We only depend on the checksums
when synchronous is lowered to NORMAL.  Nevertheless, the checksums
never hurt and so they are included in the rollback journal regardless
of the synchronous setting.



6.3.  Cache Spill Prior To Commit

The commit process shown in section 3.0
assumes that all database changes fit in memory until it is time to
commit.  This is the common case.  But sometimes a larger change will
overflow the user-space cache prior to transaction commit.  In those
cases, the cache must spill to the database before the transaction
is complete.

At the beginning of a cache spill, the status of the database
connection is as shown in step 3.6.
Original page content has been saved in the rollback journal and
modifications of the pages exist in user memory.  To spill the cache,
SQLite executes steps 3.7 through
3.9.  In other words, the rollback journal
is flushed to disk, an exclusive lock is acquired, and changes are
written into the database.  But the remaining steps are deferred
until the transaction really commits.  A new journal header is
appended to the end of the rollback journal (in its own sector)
and the exclusive database lock is retained, but otherwise processing
returns to step 3.6.  When the transaction
commits, or if another cache spill occurs, steps
3.7 and 3.9 are
repeated.  (Step 3.8 is omitted on second
and subsequent passes since an exclusive database lock is already held
due to the first pass.)

A cache spill causes the lock on the database file to
escalate from reserved to exclusive.  This reduces concurrency.
A cache spill also causes extra disk flush or fsync operations to
occur and these operations are slow, hence a cache spill can
seriously reduce performance.
For these reasons a cache spill is avoided whenever possible.



7.  Optimizations

Profiling indicates that for most systems and in most circumstances
SQLite spends most of its time doing disk I/O.  It follows then that
anything we can do to reduce the amount of disk I/O will likely have a
large positive impact on the performance of SQLite.  This section
describes some of the techniques used by SQLite to try to reduce the
amount of disk I/O to a minimum while still preserving atomic commit.



7.1.  Cache Retained Between Transactions

Step 3.12 of the commit process shows
that once the shared lock has been released, all user-space cache
ipmages of database content must be discarded.  This is done because
without a shared lock, other processes are free to modify the database
file content and so any user-space image of that content might become
obsolete.  Consequently, each new transaction would begin by rereading
data which had previously been read.  This is not as bad as it sounds
at first since the data being read is still likely in the operating
systems file cache.  So the "read" is really just a copy of data
from kernel space into user space.  But even so, it still takes time.

Beginning with SQLite version 3.3.14 a mechanism has been added
to try to reduce the needless rereading of data.  In newer versions
of SQLite, the data in the user-space pager cache is retained when
the lock on the database file is released.  Later, after the
shared lock is acquired at the beginning of the next transaction,
SQLite checks to see if any other process has modified the database
file.  If the database has been changed in any way since the lock
was last released, the user-space cache is erased at that point.
But commonly the database file is unchanged and the user-space cache
can be retained, and some unnecessary read operations can be avoided.

In order to determine whether or not the database file has changed,
SQLite uses a counter in the database header (in bytes 24 through 27)
which is incremented during every change operation.  SQLite saves a copy
of this counter prior to releasing its database lock.  Then after
acquiring the next database lock it compares the saved counter value
against the current counter value and erases the cache if the values
are different, or reuses the cache if they are the same.


7.2.  Exclusive Access Mode

SQLite version 3.3.14 adds the concept of "Exclusive Access Mode".
In exclusive access mode, SQLite retains the exclusive
database lock at the conclusion of each transaction.  This prevents
other processes from accessing the database, but in many deployments
only a single process is using a database so this is not a
serious problem.  The advantage of exclusive access mode is that
disk I/O can be reduced in three ways:


It is not necessary to increment the change counter in the
database header for transactions after the first transaction.  This
will often save a write of page one to both the rollback
journal and the main database file.

No other processes can change the database so there is never
a need to check the change counter and clear the user-space cache
at the beginning of a transaction.

Each transaction can be committed by overwriting the rollback
journal header with zeros rather than deleting the journal file.
This avoids having to modify the directory entry for the journal file
and it avoids having to deallocate disk sectors associated with the 
journal.  Furthermore, the next transaction will overwrite existing
journal file content rather than append new content and on most systems
overwriting is much faster than appending.


The third optimization, zeroing the journal file header rather than
deleting the rollback journal file,
does not depend on holding an exclusive lock at all times.
This optimization can be set independently of exclusive lock mode
using the journal_mode pragma
as described in section 7.6 below.



7.3.  Do Not Journal Freelist Pages

When information is deleted from an SQLite database, the pages used
to hold the deleted information are added to a "freelist".  Subsequent
inserts will draw pages off of this freelist rather than expanding the
database file.

Some freelist pages contain critical data; specifically the locations
of other freelist pages.  But most freelist pages contain nothing useful.
These latter freelist pages are called "leaf" pages.  We are free to
modify the content of a leaf freelist page in the database without
changing the meaning of the database in any way.

Because the content of leaf freelist pages is unimportant, SQLite
avoids storing leaf freelist page content in the rollback journal
in step 3.5 of the commit process.
If a leaf freelist page is changed and that change doesq not get rolled back
during a transaction recovery, the database is not harmed by the omission.
Similarly, the content of a new freelist page is never written back
into the database at step 3.9 nor
read from the database at step 3.3.
These optimizations can greatly reduce the amount of I/O that occurs
when making changes to a database file that contains free space.



7.4.  Single Page Updates And Atomic Sector Writes

Beginning in SQLite version 3.5.0, the new Virtual File System (VFS)
interface contains a method named xDeviceCharacteristics which reports
on special properties that the underlying mass storage device
might have.  Among the special properties that
xDeviceCharacteristics might report is the ability of to do an
atomic sector write.

Recall that by default SQLite assumes that sector writes are
linear but not atomic.  A linear write starts at one end of the
sector and changes information byte by byte until it gets to the
other end of the sector.  If a power loss occurs in the middle of
a linear write then part of the sector might be modified while the
other end is unchanged.  In an atomic sector write, either the entire
sector is overwritten or else nothing in the sector is changed.

We believe that most modern disk drives implement atomic sector
writes.  When power is lost, the drive uses energy stored in capacitors
and/or the angular momentum of the disk platter to provide power to 
complete any operation in progress.  Nevertheless, there are so many
layers in between the write system call and the on-board disk drive
electronics that we take the safe approach in both Unix and w32 VFS
implementations and assume that sector writes are not atomic.  On the
other hand, device
manufacturers with more control over their filesystems might want
to consider enabling the atomic write property of xDeviceCharacteristics
if their hardware really does do atomic writes.

When sector writes are atomic and the page size of a database is
the same as a sector size, and when there is a database change that
only touches a single database page, then SQLite skips the whole
journaling and syncing process and simply writes the modified page
directly into the database file.  The change counter in the first
page of the database file is modified separately since no harm is
done if power is lost before the change counter can be updated.



7.5.  Filesystems With Safe Append Semantics

Another optimization introduced in SQLite version 3.5.0 makes
use of "safe append" behavior of the underlying disk.
Recall that SQLite assumes that when data is appended to a file
(specifically to the rollback journal) that the size of the file
is increased first and that the content is written second.  So
if power is lost after the file size is increased but before the
content is written, the file is left containing invalid "garbage"
data.  The xDeviceCharacteristics method of the VFS might, however,
indicate that the filesystem implements "safe append" semantics.
This means that the content is written before the file size is
increased so that it is impossible for garbage to be introduced
into the rollback journal by a power loss or system crash.

When safe append semantics are indicated for a filesystem,
SQLite always stores the special value of -1 for the page count
in the header of the rollback journal.  The -1 page count value
tells any process attempting to rollback the journal that the
number of pages in the journal should be computed from the journal
size.  This -1 value is never changed.  So that when a commit
occurs, we save a single flush operation and a sector write of
the first page of the journal file.  Furthermore, when a cache
spill occurs we no longer need to append a new journal header
to the end of the journal; we can simply continue appending
new pages to the end of the existing journal.


7.6.  Persistent Rollback Journals

Deleting a file is an expensive operation on many systems.
So as an optimization, SQLite can be configured to avoid the
delete operation of section 3.11.
Instead of deleting the journal file in order to commit ar transaction,
the file is either truncated to zero bytes in length or its
header is overwritten with zeros.  Truncating the file to zero
length saves having to make modifications to the directory containing
the file since the file is not removed from the directory. 
Overwriting the header has the additional savings of not having
to update the length of the file (in the "inode" on many systems)
and not having to deal with newly freed disk sectors.  Furthermore,
at the next transaction the journal will be created by overwriting
existing content rather than appending new content onto the end
of a file, and overwriting is often much faster than appending.

SQLite can be configured to commit transactions by overwriting
the journal header with zeros instead of deleting the journal file
by setting the "PERSIST" journaling mode using the 
journal_mode PRAGMA.
For example:


PRAGMA journal_mode=PERSIST;


The use of persistent journal mode provides a noticeable performance
improvement on many systems.  Of course, the drawback is that the 
journal files remain on the disk, using disk space and cluttering
directories, long after the transaction commits.  The only safe way
to delete a persistent journal file is to commit a transaction
with journaling mode set to DELETE:


PRAGMA journal_mode=DELETE;
BEGIN EXCLUSIVE;
COMMIT;


Beware of deleting persistent journal files by any other means
since the journal file might be hot, in which case deleting it will
corrupt the corresponding database file.

Beginning in SQLite version 3.6.4 (2008-10-15), 
the TRUNCATE journal mode is
also supported:


PRAGMA journal_mode=TRUNCATE;


In truncate journal mode, the transaction is committed by truncating
the journal file to zero length rather than deleting the journal file
(as in DELETE mode) or by zeroing the header (as in PERSIST mode).
TRUNCATE mode shares the advantage of PERSIST mode that the directory
that contains the journal file and database does not need to be updated.
Hence truncating a file is often faster than deleting it.  TRUNCATE has
the additional advantage that it is not followed by a
system call (ex: fsync()) to synchronize the change to disk.  It might
be safer if it did.
But on many modern filesystems, a truncate is an atomic and
synchronous operation and so we think that TRUNCATE will usually be safe
in the face of power failures.  If you are uncertain about whether or
not TRUNCATE will be synchronous and atomic on your filesystem and it is
important to you that your database survive a power loss or operating
system crash that occurs during the truncation operation, then you might
consider using a different journaling mode.

On embedded systems with synchronous filesystems, TRUNCATE results
in slower behavior than PERSIST.  The commit operation is the same speed.
But subsequent transactions are slower following a TRUNCATE because it is
faster to overwrite existing content than to append to the end of a file.
New journal file entries will always be appended following a TRUNCATE but
will usually overwrite with PERSIST.



8.  Testing Atomic Commit Behavior

The developers of SQLite are confident that it is robust
in the face of power failures and system crashes because the
automatic test procedures do extensive checks on
the ability of SQLite to recover from simulated power loss.
We call these the "crash tests".

Crash tests in SQLite use a modified VFS that can simulate
the kinds of filesystem damage that occur during a power
loss or operating system crash.  The crash-test VFS can simulate
incomplete sector writes, pages filled with garbage data because
a write has not completed, and out of order writes, all occurring
at varying points during a test scenario.  Crash tests execute
transactions over and over, varying the time at which a simulated
power loss occurs and the properties of the damage inflicted.
Each test then reopens the database after the simulated crash and
verifies that the transaction either occurred completely
or not at all and that the database is in a completely
consistent state.

The crash tests in SQLites have discovered a number of very
subtle bugs (now fixed) in the recovery mechanism.  Some of 
these bugs were very obscure and unlikely to have been found
using only code inspection and analysis techniques.  From this
experience, the developers of SQLite feel confident that any other
database system that does not use a similar crash test system
likely contains undetected bugs that will lead to database
corruption following a system crash or power failure.



9.  Things That Can Go Wrong

The atomic commit mechanism in SQLite has proven to be robust,
but it can be circumvented by a sufficiently creative
adversary or a sufficiently broken operating system implementation.
This section describes a few of the ways in which an SQLite database
might be corrupted by a power failure or system crash.
(See also: How To Corrupt Your Database Files.)



9.1.  Broken Locking Implementations

SQLite uses filesystem locks to make sure that only one
process and database connection is trying to modify the database
at a time.  The filesystem locking mechanism is implemented
in the VFS layer and is different for every operating system.
SQLite depends on this implementation being correct.  If something
goes wrong and two or more processes are able to write the same
database file at the same time, severe damage can result.

We have received reports of implementations of both
Windows network filesystems and NFS in which locking was
subtly broken.  We can not verify these reports, but as
locking is difficult to get right on a network filesystem
we have no reason to doubt them.  You are advised to 
avoid using SQLite on a network filesystem in the first place,
since performance will be slow.  But if you must use a 
network filesystem to store SQLite database files, consider
using a secondary locking mechanism to prevent simultaneous
writes to the same database even if the native filesystem
locking mechanism malfunctions.

The versions of SQLite that come preinstalled on Apple
Mac OS X computers contain a version of SQLite that has been
extended to use alternative locking strategies that work on
all network filesystems that Apple supports.  These extensions
used by Apple work great as long as all processes are accessing
the database file in the same way.  Unfortunately, the locking
mechanisms do not exclude one another, so if one process is
accessing a file using (for example) AFP locking and another
process (perhaps on a different machine) is using dot-file locks,
the two processes might collide because AFP locks do not exclude
dot-file locks or vice versa.



9.2.  Incomplete Disk Flushes

SQLite uses the fsync() system call on Unix and the FlushFileBuffers()
system call on w32 in order to sync the file system buffers onto disk
oxide as shown in step 3.7 and
step 3.10.  Unfortunately, we have received
reports that neither of these interfaces works as advertised on many
systems.  We hear that FlushFileBuffers() can be completely disabled
using registry settings on some Windows versions.  Some historical
versions of Linux contain versions of fsync() which are no-ops on
some filesystems, we are told.  Even on systems where 
FlushFileBuffers() and fsync() are said to be working, often
the IDE disk control lies and says that data has reached oxide
while it is still held only in the volatile control cache.

On the Mac, you can set this pragma:


PRAGMA fullfsync=ON;


Setting fullfsync on a Mac will guarantee that data really does
get pushed out to the disk platter on a flush.  But the implementation
of fullfsync involves resetting the disk controller.  And so not only
is it profoundly slow, it also slows down other unrelated disk I/O.
So its use is not recommended.



9.3.  Partial File Deletions

SQLite assumes that file deletion is an atomic operation from the
point of view of a user process.  If power fails in the middle of
a file deletion, then after power is restored SQLite expects to see
either the entire file with all of its original data intact, or it
expects not to find the file at all.  Transactions may not be atomic
on systems that do not work this way.



9.4.  Garbage Written Into Files

SQLite database files are ordinary disk files that can be
opened and written by ordinary user processes.  A rogue process
can open an SQLite database and fill it with corrupt data.  
Corrupt data might also be introduced into an SQLite database
by bugs in the operating system or disk controller; especially
bugs triggered by a power failure.  There is nothing SQLite can
do to defend against these kinds of problems.



9.5.  Deleting Or Renaming A Hot Journal

If a crash or power loss does occur and a hot journal is left on
the disk, it is essential that the original database file and the hot
journal remain on disk with their original names until the database
file is opened by another SQLite process and rolled back.  
During recovery at step 4.2 SQLite locates
the hot journal by looking for a file in the same directory as the
database being opened and whose name is derived from the name of the
file being opened.  If either the original database file or the
hot journal have been moved or renamed, then the hot journal will
not be seen and the database will not be rolled back.

We suspect that a common failure mode for SQLite recovery happens
like this:  A power failure occurs.  After power is restored, a well-meaning
user or system administrator begins looking around on the disk for
damage.  They see their database file named "important.data".  This file
is perhaps familiar to them.  But after the crash, there is also a
hot journal named "important.data-journal".  The user then deletes
the hot journal, thinking that they are helping to cleanup the system.
We know of no way to prevent this other than user education.

If there are multiple (hard or symbolic) links to a database file,
the journal will be created using the name of the link through which
the file was opened.  If a crash occurs and the database is opened again
using a different link, the hot journal will not be located and no
rollback will occur.

Sometimes a power failure will cause a filesystem to be corrupted
such that recently changed filenames are forgotten and the file is
moved into a "/lost+found" directory.  When that happens, the hot
journal will not be found and recovery will not occur.
SQLite tries to prevent this
by opening and syncing the directory containing the rollback journal
at the same time it syncs the journal file itself.  However, the
movement of files into /lost+found can be caused by unrelated processes
creating unrelated files in the same directory as the main database file.
And since this is out from under the control of SQLite, there is nothing
that SQLite can do to prevent it.  If you are running on a system that
is vulnerable to this kind of filesystem namespace corruption (most
modern journalling filesystems are immune, we believe) then you might
want to consider putting each SQLite database file in its own private
subdirectory.



10.  Future Directions And Conclusion

Every now and then someone discovers a new failure mode for
the atomic commit mechanism in SQLite and the developers have to
put in a patch.  This is happening less and less and the
failure modes are becoming more and more obscure.  But it would
still be foolish to suppose that the atomic commit logic of
SQLite is entirely bug-free.  The developers are committed to fixing
these bugs as quickly as they might be found.


The developers are also on the lookout for new ways to
optimize the commit mechanism.  The current VFS implementations
for Unix (Linux and Mac OS X) and Windows make pessimistic assumptions about
the behavior of those systems.  After consultation with experts
on how these systems work, we might be able to relax some of the
assumptions on these systems and allow them to run faster.  In
particular, we suspect that most modern filesystems exhibit the
safe append property and that many of them might support atomic
sector writes.  But until this is known for certain, SQLite will
take the conservative approach and assume the worst.
This page last modified on  2021-10-05 17:51:47 UTCatomiccommit.html
RRƒØm‚C
;‡±/Atomic Commit In SQLite1.  Introduction

An important feature of transactional databases like SQLite
is "atomic commit".  
Atomic commit means that either all database changes within a single 
transaction occur or none of them occur.  With atomic commit, it
is as if many different writes to different sections of the database
file occur instantaneously and simultaneously.
Real hardware serializes writes to mass storage, and writing
a single sector takes a finite amount of time.
So it is impossible to truly write many different sectors of a 
database file simultaneously and/or instantaneously.
But the atomic commit logic within
SQLite makes it appear as if the changes for a transaction
are all written instantaneously and simultaneously.

SQLite has the important property that transactions appear
to be atomic even if the transaction is interrupted by an
operating system crash or power failure.

This article describes the techniques used by SQLite to create the
illusion of atomic commit.

The information in this article applies only when SQLite is operating
in "rollback mode", or in other words when SQLite is not 
using a write-ahead log.  SQLite still supports atomic commit when
write-ahead logging is enabled, but it accomplishes atomic commit by
a different mechanism from the one described in this article.  See
the write-ahead log documentation for additional information on how
SQLite supports atomic commit in that context.



2.  Hardware Assumptions

Throughout this article, we will call the mass storage device "disk"
even though the mass storage device might really be flash memory.

We assume that disk is written in chunks which we call a "sector".
It is not possible to modify any part of the disk smaller than a sector.
To change a part of the disk smaller than a sector, you have to read in
the full sector that contains the part you want to change, make the
change, then write back out the complete sector.

On a traditional spinning disk, a sector is the minimum unit of transfer
in both directions, both reading and writing.  On flash memory, however,
the minimum size of a read is typically much smaller than a minimum write.
SQLite is only concerned with the minimum write amount and so for the
purposes of this article, when we say "sector" we mean the minimum amount
of data that can be written to mass storage in a single go.


  Prior to SQLite version 3.3.14, a sector size of 512 bytes was
  assumed in all cases.  There was a compile-time option to change
  this but the code had never been tested with a larger value.  The
  512 byte sector assumption seemed reasonable since until very recently
  all disk drives used a 512 byte sector internally.  However, there
  has recently been a push to increase the sector size of disks to
  4096 bytes.  Also the sector size
  for flash memory is usually larger than 512 bytes.  For these reasons,
  versions of SQLite beginning with 3.3.14 have a method in the OS
  interface layer that interrogates the underlying filesystem to find
  the true sector size.  As currently implemented (version 3.5.0) this
  method still returns a hard-coded value of 512 bytes, since there
  is no standard way of discovering the true sector size on eithef
++™Q‚D   C²I+SQLite In 5 Minutes Or LessHere is what you do to start experimenting with SQLite without having
to do a lot of tedious reading and configuration:

Download The Code


Get a copy of the prebuilt binaries for your machine, or get a copy
of the sources and compile them yourself.  Visit
the download page for more information.


Create A New Database


At a shell or DOS prompt, enter: "sqlite3 test.db".  This will
create a new database named "test.db".  (You can use a different name if
you like.)
Enter SQL commands at the prompt to create and populate the
new database.
Additional documentation is available here.


Write Programs That Use SQLite


Below is a simple 
TCL program that demonstrates how to use
the TCL interface to SQLite.  The program executes the SQL statements
given as the second argument on the database defined by the first
argument.  The commands to watch for are the sqlite3 command
on line 7 which opens an SQLite database and creates
a new object named "db" to access that database, the
use of the eval method on the db object on line 8 to run
SQL commands against the database, and the closing of the database connection
on the last line of the script.


01  #!/usr/bin/tclsh
02  if {$argc!=2} {
03    puts stderr "Usage: %s DATABASE SQL-STATEMENT"
04    exit 1
05  }
06  package require sqlite3
07  sqlite3 db &#91;lindex $argv 0]
08  db eval &#91;lindex $argv 1] x {
09    foreach v $x(*) {
10      puts "$v = $x($v)"
11    }
12    puts ""
13  }
14  db close



Below is a simple C program that demonstrates how to use
the C/C++ interface to SQLite.  The name of a database is given by
the first argument and the second argument is one or more SQL statements
to execute against the database.  The function calls to pay attention
to here are the call to sqlite3_open() on line 22 which opens
the database, sqlite3_exec() on line 28 that executes SQL
commands against the database, and sqlite3_close() on line 33
that closes the database connection.

See also the Introduction To The SQLite C/C++ Interface for
an introductory overview and roadmap to the dozens of SQLite interface
functions.


01  #include &lt;stdio.h&gt;
02  #include &lt;sqlite3.h&gt;
03  
04  static int callback(void *NotUsed, int argc, char **argv, char **azColName){
05    int i;
06    for(i=0; i&lt;argc; i++){
07      printf("%s = %s\n", azColName&#91;i], argv&#91;i] ? argv&#91;i] : "NULL");
08    }
09    printf("\n");
10    return 0;
11  }
12  
13  int main(int argc, char **argv){
14    sqlite3 *db;
15    char *zErrMsg = 0;
16    int rc;
17  
18    if( argc!=3 ){
19      fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv&#91;0]);
20      return(1);
21    }
22    rc = sqlite3_open(argv&#91;1], &db);
23    if( rc ){
24      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
25      sqlite3_close(db);
26      return(1);
27    }
28    rc = sqlite3_exec(db, argv&#91;2], callback, 0, &zErrMsg);
29    if( rc!=SQLITE_OK ){
30      fprintf(stderr, "SQL error: %s\n", zErrMsg);
31      sqlite3_free(zErrMsg);
32    }
33    sqlite3_close(db);
34    return 0;
35  }

See the How To Compile SQLite document for instructions and hints on
how to compile the program shown above.


This page last modified on  2016-04-04 12:21:30 UTCquickstart.html
çç’‚E        ]£3/Most Widely Deployed SQL Database EngineMost Widely Deployed and Used Database Engine

SQLite is likely used more than all other database engines
combined.  Billions and billions of copies
of SQLite exist in the wild.  SQLite is found in:


Every Android device
Every iPhone and iOS device
Every Mac
Every Windows10 machine
Every Firefox, Chrome, and Safari web browser
Every instance of Skype
Every instance of iTunes
Every Dropbox client
Every TurboTax and QuickBooks
PHP and Python
Most television sets and set-top cable boxes
Most automotive multimedia systems
Countless millions of other applications


Since SQLite is used extensively in every smartphone, and there are
more than 4.0 billion (4.0e9) smartphones in active use, each holding
hundreds of
SQLite database files, it is seems likely that there are over one trillion
(1e12) SQLite databases in active use.

Most Widely Deployed Software Module of Any Type?

SQLite is probably one of the top five most deployed
software modules of any description.  
Other libraries with similar reach include:



The original zlib implementation by
Jean-loup Gailly and Mark Adler.

The original reference implementation for
libpng

Libjpeg from the Independent JPEG Group



Libc is omitted from the above list even though
it is more common than SQLite because
libc is not a single software component but rather several
competing implementations (ex: BSD vs. GNU) with similar interfaces.
There are also independent implementations of libjpeg and libpng,
though in those cases the canonical implementations are very popular.



Precise numbers are difficult to obtain and so exact rankings
are impossible.  But our best guess is that SQLite is the second
mostly widely deployed software library, after libz.
Some commentators observe that SQLite tends
to be statically linked and thus have multiple instances on
each machine, whereas libz tends to have just
a single instance per machine in the form of a shared library or DLL.
So even though the number of devices containing libz
may be greater than the number of
devices that contain SQLite, the total number of instances per device
might be higher for SQLite and so SQLite might
be the single most widely deployed and used software component.

This page last modified on  2021-06-03 20:37:13 UTCmostdeployed.htmlxite3**);
   int sqlite3_close(sqlite3*);
   const char *sqlite3_errmsg(sqlite3*);
   const void *sqlite3_errmsg16(sqlite3*);
   int sqlite3_errcode(sqlite3*);



The sqlite3_open() routine returns an integer error code rather than
a pointer to the sqlite3 structure as the version 2 interface did.
The difference between sqlite3_open()
and sqlite3_open16() is that sqlite3_open16() takes UTF-16 (in host native
byte order) for the name of the database file.  If a new database file
needs to be created, then sqlite3_open16() sets the internal text
representation to UTF-16 whereas sqlite3_open() sets the text
representation to UTF-8.



The opening and/or creating of the database file is deferred until the
file is actually needed.  This allows options and parameters, such
as the native text representation and default page size, to be
set using PRAGMA statements.



The sqlite3_errcode() routine returns a result code for the most
recent major API call.  sqlite3_errmsg() returns an English-language
text error message for the most recent error.  The error message is
represented in UTF-8 and will be ephemeral - it could disappear on
the next call to any SQLite API function.  sqlite3_errmsg16() works like
sqlite3_errmsg() except that it returns the error message represented
as UTF-16 in host native byte order.



The error codes for SQLite version 3 are unchanged from version 2.
They are as follows:



#define SQLITE_OK           0   /* Successful result */
#define SQLITE_ERROR        1   /* SQL error or missing database */
#define SQLITE_INTERNAL     2   /* An 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 sqlite_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   /* (Internal Only) Table or record not found */
#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 Only) Database table is empty */
#define SQLITE_SCHEMA      17   /* The database schema changed */
#define SQLITE_TOOBIG      18   /* Too much data for one row of a table */
#define SQLITE_CONSTRAINT  19   /* Abort due to contraint 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_ROW         100  /* sqlite_step() has another row ready */
#define SQLITE_DONE        101  /* sqlite_step() has finished executing */


2.2 Executing SQL statements


   typedef int (*sqlite_callback)(void*,int,char**, char**);
   int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);



The sqlite3_exec() function works much as it did in SQLite version 2.
Zero or more SQL statements specified in the second parameter are compiled
and executed.  Query results are returned to a callback routine.



In SQLite version 3, the sqlite3_exec routine is just a wrapper around
calls to the prepared statement interface.



   typedef struct sqlite3_stmt sqlite3_stmt;
   int sqlite3_prepare(sqlite3*, const char*, int, sqlite3_stmt**, const char**);
   int sqlite3_prepare16(sqlite3*, const void*, int, sqlite3_stmt**, const void**);
   int sqlite3_finalize(sqlite3_stmt*);
   int sqlite3_reset(sqlite3_stmt*);



The sqlite3_prepare interface compiles a single SQL styatement into byte code
for later execution.  This interface is now the preferred way of accessing
the database.



The SQL statement is a UTF-8 string for sqlite3_prepare().
The sqlite3_prepare16() works the same way except
that it expects a UTF-16 string as SQL input.
Only the first SQL statement in the input string is compiled.
The fifth parameter is filled in with a pointer to the next (uncompiled)
SQLite statement in the input string, if any.
The sqlite3_finalize() routine deallocates a prepared SQL statement.
All prepared statements must be finalized before the database can be
closed.
The sqlite3_reset() routine resets a prepared SQL statement so that it
can be executed again.



The SQL statement may contain tokens of the form "?" or "?nnn" or ":aaa"
where "nnn" is an integer and "aaa" is an identifier.
Such tokens represent unspecified literal values (or "wildcards")
to be filled in later by the 
sqlite3_bind interface.
Each wildcard has an associated number which is its sequence in the
statement or the "nnn" in the case of a "?nnn" form. 
It is allowed for the same wildcard
to occur more than once in the same SQL statement, in which case
all instance of that wildcard will be filled in with the same value.
Unbound wildcards have a value of NULL.



   int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
   int sqlite3_bind_double(sqlite3_stmt*, int, double);
   int sqlite3_bind_int(sqlite3_stmt*, int, int);
   int sqlite3_bind_int64(sqlite3_stmt*, int, long long int);
   int sqlite3_bind_null(sqlite3_stmt*, int);
   int sqlite3_bind_text(sqlite3_stmt*, int, const char*, int n, void(*)(void*));
   int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
   int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);



There is an assortment of sqlite3_bind routines used to assign values
to wildcards in a prepared SQL statement.  Unbound wildcards
are interpreted as NULLs.  Bindings are not reset by sqlite3_reset().
But wildcards can be rebound to new values after an sqlite3_reset().



After an SQL statement has been prepared (and optionally bound), it
is executed using:



   int sqlite3_step(sqlite3_stmt*);



The sqlite3_step() routine return SQLITE_ROW if it is returning a single
row of the result set, or SQLITE_DONE if execution has completed, either
normally or due to an error.  It might also return SQLITE_BUSY if it is
unable to open the database file.  If the return value is SQLITE_ROW, then
the following routines can be used to extract information about that row
of the result set:



   const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
   int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
   int sqlite3_column_bytes16(sqlite3_stmt*, int iCol);
   int sqlite3_column_count(sqlite3_stmt*);
   const char *sqlite3_column_decltype(sqlite3_stmt *, int iCol);
   const void *sqlite3_column_decltype16(sqlite3_stmt *, int iCol);
   double sqlite3_column_double(sqlite3_stmt*, int iCol);
   int sqlite3_column_int(sqlite3_stmt*, int iCol);
   long long int sqlite3_column_int64(sqlite3_stmt*, int iCol);
   const char *sqlite3_column_name(sqlite3_stmt*, int iCol);
   const void *sqlite3_column_name16(sqlite3_stmt*, int iCol);
   const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
   const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
   int sqlite3_column_type(sqlite3_stmt*, int iCol);



The sqlite3_column_count()
function returns the number of columns in
the results set.  sqlite3_column_count() can be called at any time after
sqlite3_prepare_v2().  sqlite3_data_count() works similarly to
sqlite3_column_count() except that it only works following sqlite3_step().
If the previous call to sqlite3_step() returned SQLITE_DONE or an error code,
then sqlite3_data_count() will return 0 whereas sqlite3_column_count() will
continue to return the number of columns in the result set.


Returned data is examined using the other 
sqlite3_column_***() functions, 
all of which take a column number as their second parameter. Columns are
zero-indexezd from left to right. Note that this is different to parameters,
which are indexed starting at one.



The sqlite3_column_type() function returns the
datatype for the value in the Nth column.  The return value is one
of these:



   #define SQLITE_INTEGER  1
   #define SQLITE_FLOAT    2
   #define SQLITE_TEXT     3
   #define SQLITE_BLOB     4
   #define SQLITE_NULL     5



The sqlite3_column_decltype() routine returns text which is the
declared type of the column in the CREATE TABLE statement.  For an
expression, the return type is an empty string.  sqlite3_column_name()
returns the name of the Nth column.  sqlite3_column_bytes() returns
the number of bytes in a column that has type BLOB or the number of bytes
in a TEXT string with UTF-8 encoding.  sqlite3_column_bytes16() returns
the same value for BLOBs but for TEXT strings returns the number of bytes
in a UTF-16 encoding.
sqlite3_column_blob() return BLOB data.  
sqlite3_column_text() return TEXT data as UTF-8.
sqlite3_column_text16() return TEXT data as UTF-16.
sqlite3_column_int() return INTEGER data in the host machines native
integer format.
sqlite3_column_int64() returns 64-bit INTEGER data.
Finally, sqlite3_column_double() return floating point data.



It is not necessary to retrieve data in the format specify by
sqlite3_column_type().  If a different format is requested, the data
is converted automatically.



Data format conversions can invalidate the pointer returned by
prior calls to sqlite3_column_blob(), sqlite3_column_text(), and/or
sqlite3_column_text16().  Pointers might be invalided 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.



Note that 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 points to will have been modified.  Other kinds
of conversion are done in place when it is possible, but sometime it is
not possible and in those cases prior pointers are invalidated.  



The safest and easiest to remember policy is this: assume that any
result from

sqlite3_column_blob(),
sqlite3_column_text(), or
sqlite3_column_text16()

is invalided by subsequent calls to 

sqlite3_column_bytes(),
sqlite3_column_bytes16(),
sqlite3_column_text(), or
sqlite3_column_text16().

This means that you should always call sqlite3_column_bytes() or
sqlite3_column_bytes16() before calling sqlite3_column_blob(),
sqlite3_column_text(), or sqlite3_column_text16().


2.3 User-defined functions


User defined functions can be created using the following routine:



   typedef struct sqlite3_value sqlite3_value;
   int sqlite3_create_function(
     sqlite3 *,
     const char *zFunctionName,
     int nArg,
     int eTextRep,
     void*,
     void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
     void (*xStep)(sqlite3_context*,int,sqlite3_value**),
     void (*xFinal)(sqlite3_context*)
   );
   int sqlite3_create_function16(
     sqlite3*,
     const void *zFunctionName,
     int nArg,
     int eTextRep,
     void*,
     void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
     void (*xStep)(sqlite3_context*,int,sqlite3_value**),
     void (*xFinal)(sqlite3_context*)
   );
   #define SQLITE_UTF8     1
   #define SQLITE_UTF16    2
   #define SQLITE_UTF16BE  3
   #define SQLITE_UTF16LE  4
   #define SQLITE_ANY      5



The nArg parameter specifies the number of arguments to the function.
A value of 0 indicates that any number of arguments is allowed.  The
eTextRep parameter specifies what representation text values are expected
to be in for arguments to this function.  The value of this parameter should
be one of the parameters defined above.  SQLite version 3 allows multiple
implementations of the same function using different text representations.
The database engine chooses the function that minimization the number
of text conversions required.



Normal functions specify only xFunc and leave xStep and xFinal set to NULL.
Aggregate functions specify xStep and xFinal and leave xFunc set to NULL.
There is no separate sqlite3_create_aggregate() API.



The function name is specified in UTF-8.  A separate sqlite3_create_function16()
API works the same as sqlite_create_function()
except that the function name is specified in UTF-16 host byte order.



Notice that the parameters to functions are now pointers to sqlite3_value
structures instead of pointers to strings as in SQLite version 2.X.
The following routines are used to extract useful information from these
"values":



   const void *sqlite3_value_blob(sqlite3_value*);
   int sqlite3_value_bytes(sqlite3_value*);
   int sqlite3_value_bytes16(sqlite3_value*);
   double sqlite3_value_double(sqlite3_value*);
   int sqlite3_value_int(sqlite3_value*);
   long long int sqlite3_value_int64(sqlite3_value*);
   const unsigned char *sqlite3_value_text(sqlite3_value*);
   const void *sqlite3_value_text16(sqlite3_value*);
   int sqlite3_value_type(sqlite3_value*);



Function implementations use the following APIs to acquire context and
to report results:



   void *sqlite3_aggregate_context(sqlite3_context*, int nbyte);
   void *sqlite3_user_data(sqlite3_context*);
   void sqlite3_result_blob(sqlite3_context*, const void*, int n, void(*)(void*));
   void sqlite3_result_double(sqlite3_context*, double);
   void sqlite3_result_error(sqlite3_context*, const char*, int);
   void sqlite3_result_error16(sqlite3_context*, const void*, int);
   void sqlite3_result_int(sqlite3_context*, int);
   void sqlite3_result_int64(sqlite3_context*, long long int);
   void sqlite3_result_null(sqlite3_context*);
   void sqlite3_result_text(sqlite3_context*, const char*, int n, void(*)(void*));
   void sqlite3_result_text16(sqlite3_context*, const void*, int n, void(*)(void*));
   void sqlite3_result_value(sqlite3_context*, sqlite3_value*);
   void *sqlite3_get_auxdata(sqlite3_context*, int);
   void sqlite3_set_auxdata(sqlite3_context*, int, void*, void (*)(void*));


2.4 User-defined collating sequences


The following routines are used to implement user-defined
collating sequences:



   sqlite3_create_collation(sqlite3*, const char *zName, int eTextRep, void*,
      int(*xCompare)(void*,int,const void*,int,const void*));
   sqlite3_create_collation16(sqlite3*, const void *zName, int eTextRep, void*,
      int(*xCompare)(void*,int,const void*,int,const void*));
   sqlite3_collation_needed(sqlite3*, void*, 
      void(*)(void*,sqlite3*,int eTextRep,const char*));
   sqlite3_collation_needed16(sqlite3*, void*,
      void(*)(void*,sqlite3*,int eTextRep,const void*));



The sqlite3_create_collation() function specifies a collating sequence name
and a comparison function to implement that collating sequence.  The
comparison function is only used for comparing text values.  The eTextRep
parameter is one of SQLITE_UTF8, SQLITE_UTF16LE, SQLITE_UTF16BE, or
SQLITE_ANY to specify which text representation the comparison function works
with.  Separate comparison functions can exist for the same collating
sequence for each of the UTF-8, UTF-16LE and UTF-16BE text representations.
The sqlite3_create_collation16() works like sqlite3_create_collation() except
that the collation name is specified in UTF-16 host byte order instead of
in UTF-8.



The sqlite3_collation_needed() routine registers a callback which the
database engine will invoke if it encounters an unknown collating sequence.
The callback can lookup an appropriate comparison function and invoke
sqlite_3_create_collation() as needed.  The fourth parameter to the callback
is the name of the collating sequence in UTF-8.  For sqlite3_collation_need16()
the callback sends the collating sequence name in UTF-16 host byte order.

This page last modified on  2009-10-30 17:27:52 UTCcapi3.html
úú•m‚F
a‚ªk!C/C++ Interface For SQLite Version 3 (old)Note:
This document was written in 2004 as a guide to helping programmers
move from using SQLite version 2 to SQLite version 3.  The information
in this document is still essentially correct, however there have been
many changes and enhancements over the years.  We recommend that the
following documents be used instead:

An Introduction To The SQLite C/C++ Interface
SQLite C/C++ Reference Guide




C/C++ Interface For SQLite Version 3

1.0 Overview


SQLite version 3.0 is a new version of SQLite, derived from
the SQLite 2.8.13 code base, but with an incompatible file format
and API.
SQLite version 3.0 was created to answer demand for the following features:



Support for UTF-16.
User-definable text collating sequences.
The ability to store BLOBs in indexed columns.



It was necessary to move to version 3.0 to implement these features because
each requires incompatible changes to the database file format.  Other
incompatible changes, such as a cleanup of the API, were introduced at the
same time under the theory that it is best to get your incompatible changes
out of the way all at once.  



The API for version 3.0 is similar to the version 2.X API,
but with some important changes.  Most noticeably, the "sqlite_"
prefix that occurs on the beginning of all API functions and data
structures are changed to "sqlite3_".  
This avoids confusion between the two APIs and allows linking against both
SQLite 2.X and SQLite 3.0 at the same time.



There is no agreement on what the C datatype for a UTF-16
string should be.  Therefore, SQLite uses a generic type of void*
to refer to UTF-16 strings.  Client software can cast the void* 
to whatever datatype is appropriate for their system.


2.0 C/C++ Interface


The API for SQLite 3.0 includes 83 separate functions in addition
to several data structures and #defines.  (A complete
API reference is provided as a separate 
document.)
Fortunately, the interface is not nearly as complex as its size implies.
Simple programs can still make do with only 3 functions:
sqlite3_open(), sqlite3_exec(), and sqlite3_close().
More control over the execution of the database engine is provided
using sqlite3_prepare_v2()
to compile an SQLite statement into byte code and
sqlite3_step() to execute that bytecode.
A family of routines with names beginning with 
sqlite3_column_
is used to extract information about the result set of a query.
Many interface functions come in pairs, with both a UTF-8 and
UTF-16 version.  And there is a collection of routines
used to implement user-defined SQL functions and user-defined
text collating sequences.



2.1 Opening and closing a database


   typedef struct sqlite3 sqlite3;
   int sqlite3_open(const char*, sqlite3**);
   int sqlite3_open16(const void*, sqlw
ìÿìÌ‚H
;—5)Swarmvtab Virtual Table1. Overview

The "swarmvtab" virtual table allows the user to query a large number 
of tables (hereafter "component" tables) with similar schemas but distinct
ranges of rowid values as if they were a single database table. The tables may
be (and usually are) located in different databases. Swarmvtab tables are
read-only.

Component tables must not be declared WITHOUT ROWID, and must all have
the same schema, but may have different names within their databases. In
this context, "the same schema" means that:


  All component tables must have the same set of columns, in the same 
      order.
  The types and default collation sequences attached to each column
      must be the same for all component tables.
  All component tables must have the same PRIMARY KEY declaration (if any).


A swarmvtab table has the same schema as each of its component tables.

A swarmvtab virtual table is created as follows:

CREATE VIRTUAL TABLE temp.&lt;name&gt; USING swarmvtab(&lt;sql-statement&gt;);


Swarmvtab virtual tables must be created in the temp schema. Attempting
to create a swarmvtab in the main or an attached database is an error.

The SQL statement supplied as the argument to the CREATE VIRTUAL TABLE
statement is executed when the table is created. It must return either four
or five columns. Each row returned describes one of the component tables. The
first four columns are interpreted, from first to last, as:


   Database URI. A filename or URI that can be used to open the
  database containing t}}‚G _Ÿ
#The generate_series Table-Valued Function1. Overview

The generate_series(START,END,STEP) table-valued function is a
loadable extension included in the SQLite source tree, and compiled into
the command-line shell.  The generate_series() table has a single
result column named "value" holding integer values
and a number of rows determined by the
parameters START, END, and STEP.  The first row of the table has
a value of START.  Subsequent rows increase by STEP up to END.

Omitted parameters take on default values.  STEP defaults to 1.
END defaults to 9223372036854775807.  The START parameter is required
as of version 3.37.0 (2021-11-27) and later and an error will
be raised if START is omitted or has a self-referential or otherwise
uncomputable value.  Older versions used a default of 0 for START.
The legacy behavior can be obtained from recent code by compiling
with -DZERO_ARGUMENT_GENERATE_SERIES.

1.1. Equivalent Recursive Common Table Expression

The generate_series table can be simulated using a
recursive common table expression.  If the three parameters
are $start, $end, and $step, then the equivalent common table
expression is:

WITH RECURSIVE generate_series(value) AS (
  SELECT $start
  UNION ALL
  SELECT value+$step FROM generate_series
   WHERE value+$step&lt;=$end
) ...


The common table expression works without having to load an
extension.  On the other hand, the extension is easier to program
and faster.

2. Usage Examples

Generate all multiples of 5 less than or equal to 100:

SELECT value FROM generate_series(5,100,5);


Generate the 20 random integer values:

SELECT random() FROM generate_series(1,20);


Find the name of every customer whose account number
   is an even multiple of 100 between 10000 and 20000.

SELECT customer.name
  FROM customer, generate_series(10000,20000,100)
 WHERE customer.id=value;
/* or */
SELECT name FROM customer
 WHERE id IN (SELECT value
                FROM generate_series(10000,20000,200));

This page last modified on  2022-01-20 21:38:08 UTCseries.html~he component table.

   Table name. The name of the component table within its database.

   Minimum rowid. The smallest rowid value that the component
  table may contain.

   Maximum rowid. The smallest rowid value that the component
  table may contain.


The interpretation of the final column, if it is present, is 
described here.

For example, say the SQL statement returns the following data when 
executed:


Database URITable nameMinimum rowidMaximum rowid
test.db1 t1 0 10
test.db2 t2 11 20
test.db3 t1 21 30
test.db4 t1 31 40


and the user queries the swarmvtab table for the row with rowid value
25. The swarmvtab table will open database file "test.db3" and read the
data to return from table "t1" (as 25 falls within the range of rowids
assigned to table "t1" in "test.db3").

Swarmvtab efficiently handles range and equality constraints on the
rowid (or other INTEGER PRIMARY KEY) field only. If a query does not 
contain such a constraint, then swarmvtab finds the results by opening
each database in turn and linearly scanning the component table. Which 
generates a correct result, but is often slow.

There must be no overlapping rowid ranges in the rows returned by
the SQL statement. It is an error if there are.

The swarmvtab implementation may open or close databases at any 
point. By default, it attempts to limit the maximum number of 
simultaneously open database files to nine. This is not a hard limit -
it is possible to construct a scenario that will cause swarmvtab to 
exceed it.


2. Compiling and Using Swarmvtab

The code for the swarmvtab virtual table is found in the
ext/misc/unionvtab.c file of the main SQLite source tree. It may be compiled
into an SQLite loadable extension using a command like:

gcc -g -fPIC -shared unionvtab.c -o unionvtab.so


Alternatively, the unionvtab.c file may be compiled into the application. 
In this case, the following function should be invoked to register the
extension with each new database connection:

int sqlite3_unionvtab_init(sqlite3 *db, void*, void*);


 The first argument passed should be the database handle to register the
extension with. The second and third arguments should both be passed 0.

 The source file and entry point are named for "unionvtab" instead of
"swarmvtab". Unionvtab is a separately documented virtual table 
that is bundled with swarmvtab.


3. Advanced Usage

Most users of swarmvtab will only use the features described above. 
This section describes features designed for more esoteric use cases. These
features all involve specifying extra optional parameters following the SQL
statement as part of the CREATE VIRTUAL TABLE command. An optional parameter 
is specified using its name, followed by an "=" character, followed by an
optionally quoted value. Whitespace may separate the name, "=" character 
and value. For example:

CREATE VIRTUAL TABLE temp.sv USING swarmvtab (
  'SELECT ...',                -- the SELECT statement
  maxopen = 20,                -- An optional parameter
  missing='missing_udf'        -- Another optional parameter
);


The following sections describe the supported parameters. Specifying
an unrecognized parameter name is an error.


3.1. SQL Parameters

If a parameter name begins with a ":", then it is assumed to be a
value to bind to the SQL statement before executing it. The value is always
bound as text. It is an error if the specified SQL parameter does not
exist. For example:

CREATE VIRTUAL TABLE temp.x1 USING swarmvtab (
  "SELECT :dir || local_filename, tbl, min, max FROM components",
  :dir = '/home/user/app/databases/'
);


When the above CREATE VIRTUAL TABLE statement is executed, swarmvtab binds
the text value "/home/user/app/databases/" to the :dir parameter of the
SQL statement before executing it.

A single CREATE VIRTUAL TABLE statement may contain any number of SQL
parameters.


3.2. The "maxopen" Parameter

By default, swarmvtab attempts to limit the number of simultaneously
open databases to nine. This parameter allows that limit to be changed.
For example, to create a swarmvtab table that may hold up to 30 databases
open simultaneously:

CREATE VIRTUAL TABLE temp.x1 USING swarmvtab (
  "SELECT ...",
  maxopen=30
);


Raising the number of open databases may improve performance in some
scenarios.


3.3. The "openclose" Callback

The "openclose" parameter allows the user to specify the name of a
application-defined SQL function that will be invoked just before
swarmvtab opens a database, and again just after it closes one. The first
argument passed to the open close function is the filename or URI
identifying the database to be opened or just recently closed (the same
value returned in the leftmost column of the SQL statement provided to
the CREATE VIRTUAL TABLE command). The second argument is integer value
0 when the function is invoked before opening a database, and 1 when it
is invoked after one is closed. For example, if:

CREATE VIRTUAL TABLE temp.x1 USING swarmvtab (
  "SELECT ...",
  openclose = 'openclose_udf'
);


then before each database containing a component table is opened, 
swarmvtab effectively executes:

SELECT openclose_udf(&lt;database-name&gt;, 0);


After a database is closed, swarmvtab runs the equivalent of:

SELECT openclose_udf(&lt;database-name&gt;, 1);


Any value returned by the openclose function is ignored. If an invocation
made before opening a database returns an error, then the database file is
not opened and the error returned to the user. This is the only scenario
in which swarmvtab will issue an "open" invocation without also eventually
issuing a corresponding "close" call. If there are still databases open,
"close" calls may be issued from within the eventual sqlite3_close() call
on the applications database that deletes the temp schema in which the
swarmvtab table resides.

Errors returned by "close" invocations are always ignored.


3.4. The "missing" Callback

The "missing" parameter allows the user to specify the name of a
application-defined SQL function that will be invoked just before
swarmvtab opens a database if it finds that the required database file
is not present on disk. This provides the application with an opportunity
to retrieve the required database from a remote source before swarmvtab
attempts to open it. The only argument passed to the "missing" function
is the name or URI that identifies the database being opened. Assuming:

CREATE VIRTUAL TABLE temp.x1 USING swarmvtab (
  "SELECT ...",
  openclose = 'openclose_udf',
  missing='missing_udf'
);


then the missing function is invoked as follows:

SELECT missing_udf(&lt;database-name&gt;);


If the missing function returns an error, then the database is not 
opened and the error returned to the user. If an openclose function is
configured, then a "close" invocation is issued at this point to match
the earlier "open". The following pseudo-code illustrates the procedure used
by a swarmvtab instance with both missing and openclose functions configured
when a component database is opened.

SELECT openclose_udf(&lt;database-name&gt;, 0);
if( error ) return error;
if( db does not exist ){
  SELECT missing_udf(&lt;database-name&gt;);
  if( error ){
    SELECT openclose_udf(&lt;database-name&gt;, 1);
    return error;
  }
}
sqlite3_open_v2(&lt;database-name&gt;);
if( error ){
  SELECT openclose_udf(&lt;database-name&gt;, 1);
  return error;
}
// db successfully opened!



3.5. Component table "context" values

 If the SELECT statement specified as part of the CREATE VIRTUAL 
TABLE command returns five columns, then the final column is used
for application context only. Swarmvtab does not use this value at
all, except that it is passed after &lt;database-name&gt; to both
the openclose and missing functions, if specified. In other words,
instead of invoking the functions as described above, if the "context"
column is present swarmvtab instead invokes:

SELECT missing_udf(&lt;database-name&gt;, &lt;context&gt;);
SELECT openclose_udf(&lt;database-name&gt;, &lt;context&gt;, 0);
SELECT openclose_udf(&lt;database-name&gt;, &lt;context&gt;, 1);


as required.
This page last modified on  2018-01-22 17:51:55 UTCswarmvtab.html€e-of-files
format breaks the "document metaphor":
there is no one file that a user can point to
that is "the document".

Wrapped Pile-of-Files Formats.
Some applications use a Pile-of-Files that is then encapsulated into
some kind of single-file container, usually a ZIP archive.  
EPUB, ODT,and ODP are examples of this approach.
An EPUB book is really just a ZIP archive that contains various
XHTML files for the text of book chapters, GIF and JPEG images for
the artwork, and a specialized catalog file that tells the eBook
reader how all the XML and image files fit together.  OpenOffice
documents (ODT and ODP) are also ZIP archives containing XML and
images that represent their content as well as "catalog" files that
show the interrelationships between the component parts.

A wrapped pile-of-files format is a compromise between a full
custom file format and a pure pile-of-files format.
A wrapped pile-of-files format is not an opaque blob in the same sense
as a custom format, since the component parts can still be accessed
using any common ZIP archiver, but the format is not quite as accessible
as a pure pile-of-files format because one does still need the ZIP 
archiver, and one cannot normally use command-line tools like "find"
on the file hierarchy without first un-zipping it.  On the other
hand, a wrapped pile-of-files format does preserve the document
metaphor by putting all content into a single disk file.  And
because it is compressed, the wrapped pile-of-files format tends to
be more compact.

As with custom file formats, and unlike pure pile-of-file formats,
a wrapped pile-of-files format is not as easy to edit, since
usually the entire file must be rewritten in order to change any
component part.


The purpose of this document is to argue in favor of a fourth
new category of application file format: An SQLite database file.

SQLite As The Application File Format


Any application state that can be recorded in a pile-of-files can
also be recorded in an SQLite database with a simple key/value schema
like this:

CREATE TABLE files(filename TEXT PRIMARY KEY, content BLOB);

If the content is compressed, then such an SQLite Archive database is
the same size (&#177;1%)
as an equivalent ZIP archive, and it has the advantage
of being able to update individual "files" without rewriting
the entire document.


But an SQLite database is not limited to a simple key/value structure
like a pile-of-files database.  An SQLite database can have dozens
or hundreds or thousands of different tables, with dozens or
hundreds or thousands of fields per table, each with different datatypes
and constraints and particular meanings, all cross-referencing each other,
appropriately and automatically indexed for rapid retrieval,
and all stored efficiently and compactly in a single disk file.
And all of this structure is succinctly documented for humans
by the SQL schema.

In other words, an SQLite database can do everything that a 
pile-of-files or wrapped pile-of-files format can do, plus much more,
and with greater lucidity.
An SQLite database is a more versatile container than key/value
filesystem or a ZIP archive.  (For a detailed example, see the
OpenOffice case study essay.)

The power of an SQLite database could, in theory, be achieved using
a custom file format.  But any custom file format that is as expressive
as a relational database would likely require an enormous design specification 
and many tens or hundreds of thousands of lines of code to 
implement.  And the end result would be an "opaque blob" that is
inaccessible without specialized tools.


Hence, in comparison to other approaches, the use of
an SQLite database as an application file format has
compelling advantages.  Here are a few of these advantages,
enumerated and expounded:



Simplified Application Development.
No new code is needed for reading or writing the application file.
One has merely to link against the SQLite library, or include the 
single "sqlite3.c" source file with the rest of the
application C code, and SQLite will take care of all of the application
file I/O.  This can reduce application code size by many thousands of
lines, with corresponding saving in development and maintenance costs.

SQLite is one of the
most used software libraries in the world.
There are literally tens of billions of SQLite database files in use 
daily, on smartphones and gadgets and in desktop applications.
SQLite is carefully tested and proven reliable.  It is not
a component that needs much tuning or debugging, allowing developers
to stay focused on application logic.

Single-File Documents.
An SQLite database is contained in a single file, which is easily
copied or moved or attached.  The "document" metaphor is preserved.

SQLite does not have any file naming requirements
and so the application can use any custom file suffix that it wants
to help identify the file as "belonging" to the application.
SQLite database files contain a 4-byte Application ID in
their headers that can be set to an application-defined value
and then used to identify the "type" of the document for utility
programs such as file(1), further
enhancing the document metaphor.


High-Level Query Language.
SQLite is a complete relational database engine, which means that the
application can access content using high-level queries.  Application
developers need not spend time thinking about "how" to retrieve the
information they need from a document.  Developers write SQL that
expresses "what" information they want and let the database engine
to figure out how to best retrieve that content.  This helps developers
operate "heads up" and remain focused on solving the user's problem,
and avoid time spent "heads down" fiddling with low-level file
formatting details.

A pile-of-files format can be viewed as a key/value database.  
A key/value database is better than no database at all.
But without transactions or indices or a high-level query language or
a proper schema,
it is much harder and more error prone to use a key/value database than
a relational database.

Accessible Content.
Information held in an SQLite database file is accessible using 
commonly available open-source command-line tools - tools that 
are installed by default on Mac and Linux systems and that are 
freely available as a self-contained EXE file on Windows.
Unlike custom file formats, application-specific programs are
not required to read or write content in an SQLite database.
An SQLite database file is not an opaque blob.  It is true
that command-line tools such as text editors or "grep" or "awk" are
not useful on an SQLite database, but the SQL query language is a much
more powerful and convenient way for examining the content, so the
inability to use "grep" and "awk" and the like is not seen as a loss.

An SQLite database is a well-defined and well-documented
file format that is in widespread use by literally millions of applications
and is backwards compatible to its inception in 2004 and which promises
to continue to be compatible in decades to come.  The longevity of
SQLite database files is particularly important to bespoke applications,
since it allows the document content to be accessed far in the
future, long after all traces of the original application have been lost.
Data lives longer than code.
SQLite databases are recommended by the US Library of Congress
as a storage format for long-term preservation of digital content.


Cross-Platform.
SQLite database files are portable between 32-bit and 64-bit machines and
between big-endian and little-endian architectures and between any of the
various flavors of Windows and Unix-like operating systems.
The application using an SQLite application file format can store
binary numeric data without having to worry about the byte-order of
integers or floating point numbers.
Text content can be read or written as UTF-8, UTF-16LE, or UTF-16BE and 
SQLite will automatically perform any necessary translations on-the-fly.

Atomic Transactions.
Writes to an SQLite database are atomic.  
They either happen completely
or not at all, even during system crashes or power failures.  So
there is no danger of corru‚pting a document just because the power happened
to go out at the same instant that a change was being written to disk.

SQLite is transactional, meaning that multiple changes can be grouped
together such that either all or none of them occur, and so that the
changes can be rolled back if a problem is found prior to commit.
This allows an application to make a change incrementally, then run
various sanity and consistency checks on the resulting data prior to
committing the changes to disk.  The
Fossil DVCS 
uses this technique
to verify that no repository history has been lost prior to each change.

Incremental And Continuous Updates.
When writing to an SQLite database file, only those parts of the file that
actually change are written out to disk.  This makes the writing happen faster
and saves wear on SSDs.  This is an enormous advantage over custom
and wrapped pile-of-files formats, both of which usually require a
rewrite of the entire document in order to change a single byte.  
Pure pile-of-files formats can also
do incremental updates to some extent, though the granularity of writes is 
usually larger with pile-of-file formats (a single file) than with SQLite
(a single page).

SQLite also supports continuous update.
Instead of collecting changes in memory and then writing
them to disk only on a File/Save action, changes can be written back to
the disk as they occur.  This avoids loss of work on a system crash or
power failure.  An automated undo/redo stack, managed using triggers,
can be kept in the on-disk database, meaning that undo/redo can occur 
across session boundaries.

Easily Extensible.
As an application grows, new features can be added to an
SQLite application file format simply by adding new tables to the schema
or by adding new columns to existing tables.  Adding columns or tables
does not change the meaning of prior queries, so with a 
modicum of care to ensuring that the meaning of legacy columns and
tables are preserved, backwards compatibility is maintained.

It is possible to extend custom or pile-of-files formats too, of course,
but doing is often much harder.  If indices are added, then all application
code that changes the corresponding tables must be located and modified to
keep those indices up-to-date.  If columns are added, then all application
code that accesses the corresponding table must be located and modified to 
take into account the new columns.

Performance.
In many cases, an SQLite application file format will be 
faster than a pile-of-files format or
a custom format.  In addition to being faster for raw read and
writes, SQLite can often dramatically improves start-up times because 
instead of having to
read and parse the entire document into memory, the application can
do queries to extract only the information needed for the initial screen.
As the application progresses, it only needs to load as much material as
is needed to draw the next screen, and can discard information from
prior screens that is no longer in use.  This helps keep the memory
footprint of the application under control.

A pile-of-files format can be read incrementally just like SQLite.
But many developers are surprised to learn that SQLite can read and 
write smaller BLOBs (less than about 100KB in size) from its database 
faster than those same blobs can be read or written as separate files 
from the filesystem.  (See
35% Faster Than The Filesystem and
Internal Versus External BLOBs for further information.)
There is overhead associated with operating a relational
database engine, however one should not assume that direct file I/O
is faster than SQLite database I/O, as often it is not.

In either case, if performance problems do arise in an SQLite application 
those problems can often be resolved by adding one or two CREATE INDEX
statements to the schema or perhaps running ANALYZE one time
and without having to touch a single line of
application code.  But if a performance problem comes up in a custom or 
pile-of-files format, the fix will often require extensive changes
to application code to add and maintain new indices or to extract 
information using different algorithms.

Concurrent Use By Multiple Processes.
SQLite automatically coordinates concurrent access to the same
document from multiple threads and/or processes.  Two or more
applications can connect and read from the same document at the
same time.  Writes are serialized, but as writes normally only
take milliseconds, applications simply take turns writing.
SQLite automatically ensures that the low-level format of the
document is uncorrupted.  Accomplishing the same with a custom
or pile-of-files format, in contrast, requires extensive support
in the application.  And the application logic needed to support
concurrency is a notorious bug-magnet.

Multiple Programming Languages.
Though SQLite is itself written in ANSI-C, interfaces exist for
just about every other programming language you can think of:
C++, C#, Objective-C, Java, Tcl, Perl, Python, Ruby, Erlang,
JavaScript, and so forth.  So programmers can develop in whatever
language they are most comfortable with and which best matches
the needs of the project.

An SQLite application file format is a great 
choice in cases where there is a collection or "federation" of
separate programs, often written in different languages and by
different development teams.
This comes up commonly in research or laboratory
environments where one team is responsible for data acquisition
and other teams are responsible for various stages of analysis.
Each team can use whatever hardware, operating system,
programming language and development methodology that they are 
most comfortable with, and as long as all programs use an SQLite 
database with a common schema, they can all interoperate.


Better Applications.
If the application file format is an SQLite database, the complete
documentation for that file format consists of the database schema,
with perhaps a few extra words about what each table and column
represents.  The description of a custom file format,
on the other hand, typically runs on for hundreds of 
pages.  A pile-of-files format, while much simpler and easier to
describe than a fully custom format, still tends to be much larger
and more complex than an SQL schema dump, since the names and format
for the individual files must still be described.

This is not a trivial point.  A clear, concise, and easy to understand
file format is a crucial part of any application design.
Fred Brooks, in his all-time best-selling computer science text,
The Mythical Man-Month says:
Representation is the
essence of computer programming....
Show me your flowcharts and conceal your tables, and I shall 
continue to be mystified.  Show me your tables, and I won't usually
need your flowcharts; they'll be obvious.
Rob Pike, in his
Rules of Programming expresses the same idea this way:

Data dominates.  If you've chosen the right data structures
and organized things well, the algorithms will almost always
be self-evident.  Data structures, not algorithms, are central
to programming.
 Linus Torvalds used different words to say
much the same thing on the Git mailing list on 2006-06-27: 

Bad programmers worry about the code.  Good programmers worry
about data structures and their relationships.


The point is this: an SQL database schema almost always does 
a far better job of defining and organizing the tables and 
data structures and their relationships.
And having clear, concise, and well-defined representation
almost always results in an application that performs better,
has fewer problems, and is easier to develop and maintain.


Conclusion


SQLite is not the perfect application file format for every situation.
But in many cases, SQLite is a far better choice than either a custom
file format, a pile-of-files, or a wrapped pile-of-files.
SQLite is a high-level, stable, reliable, cross-platform, widely-deployed,
extensible, performant, accessible, concurrent file format.  It deserves
your consideration as the standard file format on your next application
design.
This page last modified on  2018-05-29 18:35:58 UTCappfileformat.html
\\Ÿ‚I
U‚½#1SQLite As An Application File FormatSQLite As An Application File Format


Executive Summary

An SQLite database file with a defined schema
often makes an excellent application file format.
Here are a dozen reasons why this is so:


 Simplified Application Development
 Single-File Documents
 High-Level Query Language
 Accessible Content
 Cross-Platform
 Atomic Transactions
 Incremental And Continuous Updates
 Easily Extensible
 Performance
 Concurrent Use By Multiple Processes
 Multiple Programming Languages
 Better Applications


Each of these points will be described in more detail below,
after first considering more closely the meaning of
"application file format".  See also the short version of this
whitepaper.

What Is An Application File Format?


An "application file format" is the file format
used to persist application state to disk or to exchange
information between programs.
There are thousands of application file formats in use today.
Here are just a few examples:


DOC - Word Perfect and Microsoft Office documents
DWG - AutoCAD drawings
PDF - Portable Document Format from Adobe
XLS - Microsoft Excel Spreadsheet
GIT - Git source code repository
EPUB - The Electronic Publication format used by non-Kindle eBooks
ODT - The Open Document format used by OpenOffice and others
PPT - Microsoft PowerPoint presentations
ODP - The Open Document presentation format used by OpenOffice and others


We make a distinction between a "file format" and an "application format".
A file format is used to store a single object.  So, for example, a GIF or
JPEG file stores a single image, and an XHTML file stores text,
so those are "file formats" and not "application formats".  An EPUB file, 
in contrast, stores both text and images (as contained XHTML and GIF/JPEG
files) and so it is considered an "application format".  This article is
about "application formats".

The boundary between a file format and an application format is fuzzy.
This article calls JPEG a file format, but for an image editor, JPEG 
might be considered the application format.  Much depends on context.
For this article, let us say that a file format stores a single object
and an application format stores many different objects and their relationships
to one another.

Most application formats fit into one of these three categories:


Fully Custom Formats.
Custom formats are specifically designed for a single application.
DOC, DWG, PDF, XLS, and PPT are examples of custom formats.  Custom
formats are usually contained within a single file, for ease of transport.
They are also usually binary, though the DWG format is a notable exception.
Custom file formats require specialized application code
to read and write and are not normally accessible from commonly
available tools such as unix command-line programs and text editors.
In other words, custom formats are usually "opaque blobs".
To access the content of a custom application file format, one needs
a tool specifically engineered to read and/or write that format.

Pile-of-Files Formats.
Sometimes the application state is stored as a hierarchy of
files.  Git is a prime example of this, though the phenomenon occurs
frequently in one-off and bespoke applications.  A pile-of-files format
essentially uses the filesystem as a key/value database, storing small
chunks of information into separate files.  This gives the
advantage of making the content more accessible to common utility
programs such as text editors or "awk" or "grep".  But even if many 
of the files in a pile-of-files format
are easily readable, there are usually some files that have their
own custom format (example: Git "Packfiles") and are hence
"opaque blobs" that are not readable
or writable without specialized tools.  It is also much less convenient
to move a pile-of-files from one place or machine to another, than
it is to move a single file.  And it is hard to make a pile-of-files
document into an email attachment, for example.  Finally, a pilnstant, but it can change when
SQLite is upgraded, and so even though it always returns the same answer
for any particular session, because it can change answers across sessions
it is still considered non-deterministic.


2. Restrictions on the use of non-deterministic functions


There are some contexts in SQLite that do not allow the use of
non-deterministic functions:


In the expression of a CHECK constraint.
In the WHERE clause of a partial index.
In an expression used as part of an expression index.
In the expression of a generated column.



In the cases above, the values returned by the function affects the
information stored in the database file.  The values of functions
in CHECK constraints determines which entries are valid for a table,
and functions in the WHERE clause of a partial index or in an index on
an expression compute values stored in the index b-tree.
If any of these functions later returns a different
value, then the database might no longer be well-formed.  
Hence, to avoid database corruption,
only deterministic functions can be used in the contexts
above.



3. Special-case Processing For Date/Time Functions


The built-in date and time functions of SQLite are a special case.
These functions are usually considered deterministic.  However, if
these functions use the string "now" as the date, or if they use
the localtime modifier or the utc modifier, then they are
considered non-deterministic.  Because the function inputs are
not necessarily known until run-time, the date/time functions will
throw an exception if they encounter any of the non-deterministic
features in a context where only deterministic functions are allowed.


Prior to SQLite 3.20.0 (2017-08-01) all date/time functions were
always considered non-deterministic.  The ability for date/time functions
to be deterministic sometimes and non-deterministic at other times,
depending on their arguments, was added for the 3.20.0 release.

3.1. Bug fix in version 3.35.2


When the enhancement was made to SQLite 3.20.0 such that date/time
functions would be considered deterministic as they do not depend
on the current time, one case was overlooked:
Many of the date/time functions can be called
with no arguments at all.  These no-argument date/time functions
behave as if they had a single "'now'" argument.
Thus "datetime()" and
"datetime('now')" both yield the current date and time.
However, only the second form was recognized as non-deterministic.
This meant that developers could sneak the non-deterministic
"datetime()" form into CHECK constraints, index
expressions, generated column expressions, and similar places
where non-deterministic functions make no sense.
This oversight was fixed in version 3.35.2 (2021-03-17).
However, there may be legacy databases in circulation that were created
by SQLite version 3.20.0 through 3.35.1 that have non-deterministic
date/time functions in their schemas.

4. Application-defined deterministic functions


By default, application-defined SQL functions are considered to
be non-deterministic.  However, if the 4th parameter to
sqlite3_create_function_v2() is OR-ed with 
SQLITE_DETERMINISTIC, then SQLite will treat that function as if it
were deterministic.


Note that if a non-deterministic function is tagged with
SQLITE_DETERMINISTIC and if that function ends up being used in
the WHERE clause of a partial index or in an
expression index, then when the function begins to return different
answers, the associated index may become corrupt.  If an SQL function
is nearly deterministic (which is to say, if it only rarely changes,
like sqlite_version()) and it is used in an index that becomes
corrupt, the corruption can be fixed by running REINDEX.


The interfaces necessary to construct a function that is sometimes
deterministic and sometimes non-deterministic depending on their
inputs, such as the built-in date/time functions, are not published.
Generic application-defined SQL functions must
be always deterministic or always non-deterministic.
This page last modified on  2021-06-17 16:11:09 UTCdeterministic.html
ær×æ¢g‚L       eÄS+How To Download Canonical SQLite Source Code1. Introduction

Most programmers compile SQLite into their applications using
the amalgamation.  The amalgamation is C-code but it is not
"source code".  The amalgamation is generated from source code
by scripts.

This document describes how to obtain the canonical source code
for SQLite - the raw source files from which the amalgamation is
built.  See the How To Compile SQLite page for additional information
on what to do with the‰ë‚K
oÕ
%The Geopoly Interface To The SQLite R*Tree Module1. Overview


The Geopoly module is an alternative interface to the R-Tree extension that uses
the GeoJSON notation
(RFC-7946) to describe two-dimensional
polygons.  Geopoly includes functions for detecting when one polygon is
contained within or overlaps with another, for computing the
area enclosed by a polygon, for doing linear transformations of polygons,
for rendering polygons as
SVG, and other
similar operations.


The source code for Geopoly is included in the amalgamation but is not
included in the library unless the -DSQLITE_ENABLE_GEOPOLY compile-time option
is used.


Geopoly operates on "simple" polygons - that is, polygons for which
the boundary does not intersect itself.  Geopoly thus extends the capabilities
of the R-Tree extension which can only deal with rectangular areas.
On the other hand, the R-Tree extension is
able to handle between 1 and 5 coordinate dimensions, whereas Geopoly is restricted
to 2-dimensional shapes only.


Each polygon in the Geopoly module can be associated with an arbitrary
number of auxiliary data fields.

1.1. GeoJSON

The GeoJSON standard is syntax for
exchanging geospatial information using JSON.  GeoJSON is a rich standard
that can describe nearly any kind of geospatial content.

The Geopoly module only understands
a small subset of GeoJSON, but a critical subset.  
In particular, GeoJSON understands†§‚J      CÍ%1Deterministic SQL Functions1. Overview


SQL functions in SQLite can be either "deterministic" or "non-deterministic".


A deterministic function always gives the same answer when it has
the same inputs.  Most built-in SQL functions in SQLite are
deterministic.  For example, the abs(X) function always returns
the same answer as long as its input X is the same.


Non-deterministic functions might give different answers on each
invocation, even if the arguments are always the same.  The following
are examples of non-deterministic functions:


 random()
 changes()
 last_insert_rowid()
 sqlite3_version()



The random() function is obviously non-deterministic because it gives
a different answer every time it is invoked.  The answers from changes()
and last_insert_rowid() depend on prior SQL statements, and so they
are also non-deterministic. The
sqlite3_version() function is mostly co„‡
the JSON array of vertexes that describes a simple polygon.

A polygon is defined by its vertexes.
Each vertex is a JSON array of two numeric values which are the
X and Y coordinates of the vertex.
A polygon is a JSON array of at least four of these vertexes, 
and hence is an array of arrays.
The first and last vertex in the array must be the same.
The polygon follows the right-hand rule:  When tracing a line from
one vertex to the next, the area to the right of the line is outside
of the polygon and the area to the left is inside the polygon.
In other words, the net rotation of the vertexes is counter-clockwise.


For example, the following JSON describes an isosceles triangle, sitting
on the X axis and with an area of 0.5:

&#91;&#91;0,0],&#91;1,0],&#91;0.5,1],&#91;0,0]]



A triangle has three vertexes, but the GeoJSON description of the triangle
has 4 vertexes because the first and last vertex are duplicates.

1.2. Binary storage format


Internally, Geopoly stores polygons in a binary format - an SQL BLOB.
Details of the binary format are given below.
All of the Geopoly interfaces are able to accept polygons in either the
GeoJSON format or in the binary format.

2. Using The Geopoly Extension


A geopoly table is created as follows:

CREATE VIRTUAL TABLE newtab USING geopoly(a,b,c);



The statement above creates a new geopoly table named "newtab".
Every geopoly table contains a built-in integer "rowid" column
and a "_shape" column that contains
the polygon associated with that row of the table.
The example above also defines three auxiliary data columns 
named "a", "b", and "c" that can store whatever additional
information the application needs to associate
with each polygon.  If there is no need to store auxiliary
information, the list of auxiliary columns can be omitted.


Store new polygons in the table using ordinary INSERT statements:

INSERT INTO newtab(_shape) VALUES('&#91;&#91;0,0],&#91;1,0],&#91;0.5,1],&#91;0,0]]');



UPDATE and DELETE statements work similarly.

2.1. Queries


To query the geopoly table using an indexed geospatial search, 
use one of the functions geopoly_overlap()
or geopoly_within() as a boolean function in the WHERE clause,
with the "_shape" column as the first argument to the function.
For example:

SELECT * FROM newtab WHERE geopoly_overlap(_shape, $query_polygon);



The previous example will return every row for which the _shape
overlaps the polygon in the $query_polygon parameter.  The
geopoly_within() function works similarly, but only returns rows for
which the _shape is completely contained within $query_polygon.


Queries (and also DELETE and UPDATE statements) in which the WHERE
clause contains a bare geopoly_overlap() or geopoly_within() function
make use of the underlying R*Tree data structures for a fast lookup that
only has to examine a subset of the rows in the table.  The number of
rows examines depends, of course, on the size of the $query_polygon.
Large $query_polygons will normally need to look at more rows than small
ones.


Queries against the rowid of a geopoly table are also very quick, even
for tables with a vast number of rows.
However, none of the auxiliary data columns are indexes, and so queries
against the auxiliary data columns will involve a full table scan.

3. Special Functions


The geopoly module defines several new SQL functions that are useful for
dealing with polygons.  All polygon arguments to these functions can be
either the GeoJSON format or the internal binary format.



3.1. The geopoly_overlap(P1,P2) Function


If P1 and P2 are both polygons, then the geopoly_overlap(P1,P2) function returns
a non-zero integer if there is any overlap between P1 and P2, or it returns
zero if P1 and P2 completely disjoint.
If either P1 or P2 is not a polygon, this routine returns NULL.


The geopoly_overlap(P1,P2) function is special in that the geopoly virtual
table knows how to use R*Tree indexes to optimize queries in which the 
WHERE clause uses geopoly_overlap() as a boolean function.  Only the
geopoly_overlap(P1,P2) and geopoly_within(P1,P2) functiˆons have this
capability.



3.2. The geopoly_within(P1,P2) Function


If P1 and P2 are both polygons, then the geopoly_within(P1,P2) function returns
a non-zero integer if P1 is completely contained within P2, or it returns zero
if any part of P1 is outside of P2.  If P1 and P2 are the same polygon, this routine
returns non-zero.
If either P1 or P2 is not a polygon, this routine returns NULL.


The geopoly_within(P1,P2) function is special in that the geopoly virtual
table knows how to use R*Tree indexes to optimize queries in which the 
WHERE clause uses geopoly_within() as a boolean function.  Only the
geopoly_within(P1,P2) and geopoly_overlap(P1,P2) functions have this
capability.



3.3. The geopoly_area(P) Function


If P is a polygon, then geopoly_area(P) returns the area enclosed by
that polygon.  If P is not a polygon, geopoly_area(P) returns NULL.



3.4. The geopoly_blob(P) Function


If P is a polygon, then geopoly_blob(P) returns the binary encoding
of that polygon as a BLOB.
If P is not a polygon, geopoly_blob(P) returns NULL.



3.5. The geopoly_json(P) Function


If P is a polygon, then geopoly_json(P) returns the GeoJSON representation
of that polygon as a TEXT string.
If P is not a polygon, geopoly_json(P) returns NULL.



3.6. The geopoly_svg(P,...) Function


If P is a polygon, then geopoly_svg(P,...) returns a text string which is a
Scalable Vector Graphics (SVG)
representation of that polygon.  If there is more one argument, then second
and subsequent arguments are added as attributes to each SVG glyph.  For example:

SELECT geopoly_svg($polygon,'class="poly"','style="fill:blue;"');



If P is not a polygon, geopoly_svg(P,...) returns NULL.


Note that geopoly uses a traditional right-handed cartesian coordinate system
with the origin at the lower left, whereas SVG uses a left-handed coordinate
system with the origin at the upper left.  The geopoly_svg() routine makes no
attempt to transform the coordinate system, so the displayed images are shown
in mirror image and rotated.  If that is undesirable, the geopoly_xform() routine
can be used to transform the output from cartesian to SVG coordinates prior to
passing the polygons into geopoly_svg().



3.7. The geopoly_bbox(P) and geopoly_group_bbox(P) Functions


If P is a polygon, then geopoly_bbox(P) returns a new polygon that is
the smallest (axis-aligned) rectangle completely enclosing P.
If P is not a polygon, geopoly_bbox(P) returns NULL.


The geopoly_group_bbox(P) function is an aggregate version of geopoly_bbox(P).
The geopoly_group_bbox(P) function returns the smallest rectangle that will
enclose all P values seen during aggregation.



3.8. The geopoly_contains_point(P,X,Y) Function


If P is a polygon, then geopoly_contains_point(P,X,Y) returns a 
non-zero integer if and only
if the coordinate X,Y is inside or on the boundary of the polygon P.
If P is not a polygon, geopoly_contains_point(P,X,Y) returns NULL.



3.9. The geopoly_xform(P,A,B,C,D,E,F) Function


The geopoly_xform(P,A,B,C,D,E,F) function returns a new polygon that is an
affine transformation of the polygon P and where the transformation
is defined by values A,B,C,D,E,F. If P is not a valid polygon, this
routine returns NULL.


The transformation converts each vertex of the polygon according to the
following formula:

x1 = A*x0 + B*y0 + E
y1 = C*x0 + D*y0 + F



So, for example, to move a polygon by some amount DX, DY without changing
its shape, use:

geopoly_xform($polygon, 1, 0, 0, 1, $DX, $DY)



To rotate a polygon by R radians around the point 0, 0:

geopoly_xform($polygon, cos($R), sin($R), -sin($R), cos($R), 0, 0)



Note that a transformation that flips the polygon might cause the
order of vertexes to be reversed.  In other words, the transformation
might cause the vertexes to circulate in clockwise order instead of
counter-clockwise.  This can be corrected by sending the result
through the geopoly_ccw() function after transformation.




3.10. The geopoly_regular(X,Y,R,N) Function


The geopoly_regular(X,Y,R,N) function returns a convex, simple, regular,
equilateral, equiangular polygon with N sides, centered at X,Y, and with
a circumradius of R.  Or, if R is negative or if N is less than 3, the
function returns NULL.  The N value is capped at 1000 so that the routine
will never render a polygon with more than 1000 sides even if the N value
is larger than 1000.


As an example, the following graphic:





Was generated by this script:

SELECT '&lt;svg width="600" height="300">';
WITH t1(x,y,n,color) AS (VALUES
   (100,100,3,'red'),
   (200,100,4,'orange'),
   (300,100,5,'green'),
   (400,100,6,'blue'),
   (500,100,7,'purple'),
   (100,200,8,'red'),
   (200,200,10,'orange'),
   (300,200,12,'green'),
   (400,200,16,'blue'),
   (500,200,20,'purple')
)
SELECT
   geopoly_svg(geopoly_regular(x,y,40,n),
        printf('style="fill:none;stroke:%s;stroke-width:2"',color))
   || printf(' &lt;text x="%d" y="%d" alignment-baseline="central" text-anchor="middle">%d&lt;/text>',x,y+6,n)
  FROM t1;
SELECT '&lt;/svg>';




3.11. The geopoly_ccw(J) Function

The geopoly_ccw(J) function returns the polygon J with counter-clockwise (CCW) rotation.


RFC-7946 requires that polygons use CCW rotation.
But the spec also observes that many legacy GeoJSON files do not following the spec and
contain polygons with clockwise (CW) rotation.  The geopoly_ccw() function is useful for
applications that are reading legacy GeoJSON scripts.  If the input to geopoly_ccw() is
a correctly-formatted polygon, then no changes are made.  However, if the circulation of
the input polygon is backwards, then geopoly_ccw() reverses the circulation order so that
it conforms to the spec and so that it will work correctly with the Geopoly module.



4. Implementation Details

The geopoly module is an extension to the R-Tree extension.  Geopoly
uses the same underlying logic and shadow tables as the R-Tree extension.
Geopoly merely presents a different interface, and provides some extra logic
to compute polygon decoding, overlap, and containment.

4.1. Binary Encoding of Polygons


Geopoly stores all polygons internally using a binary format.  A binary
polygon consists of a 4-byte header following by an array of coordinate
pairs in which each dimension of each coordinate is a 32-bit floating point
number.


The first byte of the header is a flag byte.  The least significant bit
of the flag byte determines whether the coordinate pairs that follow the
header are stored big-endian or little-endian.  A value of 0 for the least
significant bit means big-endian and a value of 1 means little endian.
Other bits of the first byte in the header are reserved for future expansion.


The next three bytes in the header record the number of vertexes in the polygon
as a big-endian integer.  Thus there is an upper bound of about 16 million
vertexes per polygon.


Following the header is the array of coordinate pairs.  Each coordinate is
a 32-bit floating point number.  The use of 32-bit floating point values for
coordinates means that any point on the earth's surface can be mapped with
a resolution of approximately 2.5 meters.  Higher resolutions are of course
possible if the map is restricted to a single continent or country.
Note that the resolution of coordinates in the geopoly module is similar
in magnitude to daily movement of points on the earth's surface due to
tidal forces.


The list of coordinates in the binary format contains no redundancy.  
The last coordinate is not a repeat of the first as it is with GeoJSON.  
Hence, there is always one fewer coordinate pair in the binary representation of
a polygon compared to the GeoJSON representation.

4.2. Shadow Tables


The geopoly module is built on top of the R-Tree extension and uses the
same underlying shadow tables and algorithms.  For indexing purposes, each
polygon is represented in the shadow tables as a rectangular bounding box.
The underlying R-Tree implementation uses bounding boxes to limit the search
space.  Then the geoploy_overlap() and/or geopoly_within() routines further
refine the search to the exact answer.
This page last modified on  2020-04-18 20:02:04 UTCgeopoly.html canonical source code once it is obtained.

2. Direct Downloads

Snapshots of official releases of SQLite source code can often
be obtained directly from the download page of the SQLite website.
Even if the specific version desired is not listed on the download page,
the naming conventions are fairly clear and so programmers can often
guess the name of an historical release and download it that way.

3. Obtaining Code Directly From the Version Control System

For any historical version of SQLite, the source tree can be obtained
from the Fossil version control system,
either downloading a tarball or ZIP archive for a specific version, or
by cloning the entire project history.

SQLite sources are maintained on three geographically dispersed
servers:


https://www.sqlite.org/src (Dallas)
https://www2.sqlite.org/src (Newark)
https://www3.sqlite.org/src (San Francisco)


The documentation is maintained in separate source repositories on
those same servers:


https://www.sqlite.org/docsrc (Dallas)
https://www2.sqlite.org/docsrc (Newark)
https://www3.sqlite.org/docsrc (San Francisco)


To download a specific historical version, first locate the specific
version desired by visiting the timeline page on one of these servers
(for example: https://www.sqlite.org/src/timeline).  If
you know the approximate date of the version you want to download, you
can add a query parameter like "c=YYYY-MM-DD" to the "timeline" URL to
see a timeline centered on that date.  For example, to see all the check-ins
that occurred around August 26, 2013, visit
https://www.sqlite.org/src/timeline?c=2013-08-26.
If you are looking for an official release, visit the
chronology page, click on the date to the left of the release
you are looking for, and that will take you immediately to the
check-in corresponding to the release.

Once you locate a specific version, click on the hyperlink for that
version to see the "Check-in Information Page".
Then click on either the "Tarball" link or the
"ZIP archive" link to download the complete source tree.



4. Cloning The Complete Development History

To clone the entire history of SQLite, first go to the
https://www.fossil-scm.org/download.html page and grab a precompiled binary
for the Fossil version control program.  Or get the source code on the
same page and compile it yourself.

As of 2017-03-12, you must use Fossil version
2.0 or later for the following instructions to work.  
The SQLite repository started using
artifacts named using SHA3 hashes instead of SHA1 hashes on that date,
and Fossil 2.0 or later is needed in order to understand the new SHA3
hashes.  To find out what version of Fossil you are running, 
type "fossil -v".

Fossil is a completely stand-alone
program, so install it simply by putting the "fossil" or "fossil.exe"
executable someplace on your $PATH or %PATH%.  After you have Fossil
installed, do this:

fossil clone https://www.sqlite.org/src sqlite.fossil


The command above
will make a copy of the complete development history of
SQLite into the "sqlite.fossil" file on your computer.  Making this copy
takes about a minute and uses about 32 megabytes of transfer.  After
making the copy, "open" the repository by typing:

fossil open sqlite.fossil


This second command will "checkout" the latest check-in from the SQLite
source tree into your current directory.  Subsequently, you can easily switch
to a different version by typing:

fossil update VERSION


Where VERSION can be a branch name (like "trunk" or "session") to get the
latest check-in on a specific branch, or VERSION can be a SHA1 hash or a
prefix of a SHA1 hash for a specific check-in, or VERSION can be a tag
such as "version-3.8.8".  Every time you run "fossil update" it will
automatically reach out to the original repository at
https://www.sqlite.org/src to obtain new check-ins that might have been
made by others since your previous update.
This page last modified on  2022-01-16 07:37:35 UTCgetthecode.html
cc•‚M      M©U%The SQLITE_MEMSTAT Virtual Table1. Overview


The SQLITE_MEMSTAT extension implements an eponymous-only virtual table that
provides SQL access to the sqlite3_status64() and
sqlite3_db_status() interfaces.



The SQLITE_STMT extension can also be loaded at run-time
by compiling the extension into a shared library or DLL using the source
code at https://sqlite.org/src/file/ext/misc/memstat.c and following the
instructions for how to compile loadable extensions.


2. Usage


The SQLITE_MEMSTAT virtual table is a read-only table that can be
queried to determine performance characteristics (primarily the
amount of memory being used) of the current instance of SQLite.
The SQLITE_MEMSTATE table is essentially a wrapper around the
C-language APIs sqlite3_status64() and sqlite3_db_status().
If the 
memstat.c source
file is compiled with the -DSQLITE_ENABLE_ZIPVFS option, then SQLITE_MEMSTAT
will also do some file-control calls to extract
memory usage information about the 
ZIPVFS subsystem, 
if that subsystem as been licensed, installed, and is in use.


The SQLITE_MEMSTAT table appears to have the following schema:

CREATE TABLE sqlite_memstat(
  name TEXT,
  schema TEXT,
  value INT,
  hiwtr INT
);



Each row of the SQLITE_MEMSTAT table corresponds to a single call to
one of the sqlite3_status64() or sqlite3_db_status() interfaces.
The NAME column of the row identifies which "verb" was passed to those
interfaces.  For example, if sqlite3_status64() is invoked with
SQLITE_STATUS_MEMORY_USED, then the NAME column is 'MEMORY_USED'.
Or if sqlite3_db_status() is invoked with SQLITE_DBSTATUS_CACHE_USED,
then the NAME column is "DB_CACHE_USED".


The SCHEMA column is NULL, except for cases when the sqlite3_file_control()
interface is used to interrogate the ZIPVFS backend.  As this only happens
when the memstat.c module is compiled with -DSQLITE_ENABLE_ZIPVFS and when
ZIPVFS is in use, 
SCHEMA is usually NULL.


The VALUE and HIWTR columns report the current value of the measure and
its "high-water mark".  The high-water mark is the highest value ever seen
for the measurement, at least since the last reset.  The SQLITE_MEMSTAT
virtual table does not provide a mechanism for resetting the high-water mark.


Depending on which parameter is being interrogated, one of the VALUE
or HIWTR mark measurements might be undefined.  For example, only the
high-water mark is meaningful for SQLITE_STATUS_MALLOC_SIZE, and
only the current value is meaningful for SQLITE_DBSTATUS_CACHE_USED.
For rows where one or the other of VALUE or HIWTR is not meaningful,
that value is returned as NULL.
the 

interfaces, with the initial
This page last modified on  2018-09-28 23:43:25 UTCmemstat.html
    †      †Œv‚N   /™-%Full-Featured SQLDo not be misled by the "Lite" in the name.  SQLite has a full-featured
SQL implementation, including:


Tables, indexes,
    triggers, and views
    in unlimited quantity
Up to 32K columns in a table and unlimited rows
Multi-column indexes
Indexes can use DESC and COLLATE
Partial indexes
Indexes On Expressions
Clustered indexes
Covering indexes
CHECK, UNIQUE, NOT NULL, and FOREIGN KEY constraints.
ACID transactions using BEGIN, COMMIT, and ROLLBACK
Nested transactions using SAVEPOINT, RELEASE, and 
    ROLLBACK TO
Subqueries, including correlated subqueries
Up to 64-way joins
LEFT, RIGHT, and FULL OUTER JOINs
DISTINCT, ORDER BY, GROUP BY, HAVING, LIMIT, and OFFSET
UNION, UNION ALL, INTERSECT, and EXCEPT
A rich library of standard SQL functions
Aggregate functions including DISTINCT aggregates
Window functions
UPDATE, DELETE, and INSERT (of course)
Common table expressions including
    recursive common table expressions
Row values
UPSERT
An advanced query planner
Full-text search
R-tree indexes
JSON support
The IS operator
Table-valued functions
REPLACE INTO
VACUUM
REINDEX
The GLOB operator
Hexadecimal integer literals
The ON CONFLICT clause
The INDEXED BY clause
Virtual tables
Multiple databases on the same database connection using
    ATTACH DATABASE
The ability to add application-defined SQL functions, including
    aggregate and table-valued functions.
Application-defined collating functions



There are many more features not listed above.
SQLite may be small in size and have "Lite" in its name, but it is
not lacking in capability.
This page last modified on  2022-05-10 17:29:14 UTCfullsql.html
#†‚P      1‹o'Zero-ConfigurationSQLite Is A Zero-Configuration Database


SQLite does not need to be "installed" before it is used. 
There is no "setup" procedure.  There is no
server process that needs to be started, stopped, or configured.
There is
no need for an administrator to create a new database instance or assign
access permissions to users.
SQLite uses no configuration files.
Nothing needs to be done to tell the system that SQLite is running.
No actions are required to recover after a system crash or power failure.
There is nothing to troubleshoot.




SQLite just works.



Other database engines may run great once you get them going.
But doing the initial installation and configuration can often
be intimidating.

This page last modified on  2016-08-31 17:00:38 UTCzeroconf.html“Y‚O    u¦#/Change in Default Page Size in SQLite Version 3.12.0The Default Page Size Change of SQLite 3.12.0

1.0 Introduction


An SQLite database file consists of one or more "pages".
For a single database file, all pages are the same size, though
for different database files, the page size can any power of
two between 512 and 65536, inclusive.



Since the SQLite database file format was designed (in 2003) the
default page size for new databases has been 1024 bytes.  
This was a reasonable choice in 2003.  But on modern hardware, 
a 4096 byte page is a faster and better choice.
So, beginning with SQLite version 3.12.0 (2016-03-29)) the default 
page size for new database files has been increased to 4096 bytes.



The upper bound on the database cache size has 
traditionally defaulted to 2000 pages.  SQLite version 3.12.0 also
changes this default setting to be "-2000" which means 2000*1024
bytes, regardless of page size.  So, the upper bound on the amount
of memory used for the page cache is unchanged.


2.0 Not a Compatibility Break


These changes in the default behavior of SQLite are not
a compatibility break.  All legacy database files continue to be
readable and writable by newer versions of SQLite, and all newly
created database files continue to be readable and writable by
legacy versions of the SQLite library.  The only thing that is changing
is some default settings.  This should result in a performance
increase for many applications.



Though most application should not notice any change (except that
they run a little faster), if problems arise then the
legacy behavior can be restored at compile-time by using the
following options to the C-compiler:


-DSQLITE_DEFAULT_PAGE_SIZE=1024 
-DSQLITE_DEFAULT_CACHE_SIZE=2000



The page size and cache size can also be set or changed at run-time using the
page_size pragma and cache_size pragma, respectively.

3.0 Possible Negative Consequences Of This Change


The minimum size of an SQLite database is one page for each table and
each index.  With a larger page size, the size of an empty database
for a given schema will grow by a factor of four, therefore.  However,
once the database begins to fill with content the size of the older
1024-byte page databases and the newer 4096-byte page databases will
quickly converge.  Due to relaxed bin-packing constraints, the 
4096-byte page size might actually result in a smaller file, once
substantial content is added.

This page last modified on  2016-09-14 18:40:10 UTCpgszchng2016.html
˜˜”d‚Q      %©
+Rowid TablesRowid Tables

1.0 Definition

A "rowid table" is any table in an SQLite schema that

is not a virtual table, and
is not a WITHOUT ROWID table.

Most tables in a typical SQLite database schema are rowid tables.

Rowid tables are distinguished by the fact that they all have
a unique, non-NULL, signed 64-bit integer rowid that is used as
the access key for the data in the underlying B-tree storage engine.

2.0 Quirks



The PRIMARY KEY of a rowid table (if there is one) is usually not the
true primary key for the table, in the sense that it is not the unique
key used by the underlying B-tree storage engine.  The exception to
this rule is when the rowid table declares an INTEGER PRIMARY KEY.
In the exception, the INTEGER PRIMARY KEY becomes an alias for the 
rowid.


The true primary key for a rowid table (the value that is used as the
key to look up rows in the underlying B-tree storage engine)
is the rowid.


The PRIMARY KEY constraint for a rowid table (as long as it is not
the true primary key or INTEGER PRIMARY KEY) is really the same thing
as a UNIQUE constraint.  Because it is not a true primary key,
columns of the PRIMARY KEY are allowed to be NULL, in violation of
all SQL standards.


The rowid of a rowid table can be accessed (or changed) by reading or
writing to any of the "rowid" or "oid" or "_rowid_" columns.  Except,
if there is a declared columns in the table that use those
special names, then those names refer to the declared columns, not to
the underlying rowid.


Access to records via rowid is highly optimized and very fast.


If the rowid is not aliased by INTEGER PRIMARY KEY then it is not
persistent and might change.  In particular the VACUUM command will
change rowids for tables that do not declare an INTEGER PRIMARY KEY.
Therefore, applications should not normally access the rowid directly,
but instead use an INTEGER PRIMARY KEY.


In the underlying file format, each rowid is stored as a
variable-length integer.  That means that small non-negative
rowid values take up less disk space than large or negative
rowid values.


All of the complications above (and others not mentioned here)
arise from the need to preserve backwards
compatibility for the hundreds of billions of SQLite database files in
circulation.  In a perfect world, there would be no such thing as a "rowid"
and all tables would following the standard semantics implemented as
WITHOUT ROWID tables, only without the extra "WITHOUT ROWID" keywords.
Unfortunately, life is messy.  The designer of SQLite offers his
sincere apology for the current mess.

This page last modified on  2018-04-12 15:31:42 UTCrowidtable.htmldistinct in a UNIQUE column.



The fact that NULLs are distinct for UNIQUE columns but are indistinct for
SELECT DISTINCT and UNION continues to be puzzling.  It seems that NULLs
should be either distinct everywhere or nowhere.  And the SQL standards
documents suggest that NULLs should be distinct everywhere.  Yet as of
this writing, no SQL engine tested treats NULLs as distinct in a SELECT
DISTINCT statement or in a UNION.





The following table shows the results of the NULL handling experiments.



&nbsp;&nbsp;
SQLite
PostgreSQL
Oracle
Informix
DB2
MS-SQL
OCELOT


Adding anything to null gives null
Yes
Yes
Yes
Yes
Yes
Yes
Yes

Multiplying null by zero gives null
Yes
Yes
Yes
Yes
Yes
Yes
Yes

nulls are distinct in a UNIQUE column
Yes
Yes
Yes
No
(Note 4)
No
Yes

nulls are distinct in SELECT DISTINCT
No
No
No
No
No
No
No

nulls are distinct in a UNION
No
No
No
No
No
No
No

"CASE WHEN null THEN 1 ELSE 0 END" is 0?
Yes
Yes
Yes
Yes
Yes
Yes
Yes

"null OR true" is true
Yes
Yes
Yes
Yes
Yes
Yes
Yes

"not (null AND false)" is true
Yes
Yes
Yes
Yes
Yes
Yes
Yes




&nbsp;&nbsp;
MySQL3.23.41
MySQL4.0.16
Firebird
SQLAnywhere
BorlandInterbase


Adding anything to null gives null
Yes
Yes
Yes
Yes
Yes

Multiplying null by zero gives null
Yes
Yes
Yes
Yes
Yes

nulls are distinct in a UNIQUE column
Yes
Yes
Yes
(Note 4)
(Note 4)

nulls are distinct in SELECT DISTINCT
No
No
No (Note 1)
No
No

nulls are distinct in a UNION
(Note 3)
No
No (Note 1)
No
No

"CASE WHEN null THEN 1 ELSE 0 END" is 0?
Yes
Yes
Yes
Yes
(Note 5)

"null OR true" is true
Yes
Yes
Yes
Yes
Yes

"not (null AND false)" is true
No
Yes
Yes
Yes
Yes





Notes:&nbsp;&nbsp;
1.&nbsp;
Older versions of firebird omit all NULLs from SELECT DISTINCT
and from UNION.

2.&nbsp;
Test data unavailable.

3.&nbsp;
MySQL version 3.23.41 does not support UNION.

4.&nbsp;
DB2, SQL Anywhere, and Borland Interbase 
do not allow NULLs in a UNIQUE column.

5.&nbsp;
Borland Interbase does not support CASE expressions.




&nbsp;

The following script was used to gather information for the table
above.



-- I have about decided that SQL's treatment of NULLs is capricious and cannot be
-- deduced by logic.  It must be discovered by experiment.  To that end, I have 
-- prepared the following script to test how various SQL databases deal with NULL.
-- My aim is to use the information gathered from this script to make SQLite as
-- much like other databases as possible.
--
-- If you could please run this script in your database engine and mail the results
-- to me at drh@hwaci.com, that will be a big help.  Please be sure to identify the
-- database engine you use for this test.  Thanks.
--
-- If you have to change anything to get this script to run with your database
-- engine, please send your revised script together with your results.
--

-- Create a test table with data
create table t1(a int, b int, c int);
insert into t1 values(1,0,0);
insert into t1 values(2,0,1);
insert into t1 values(3,1,0);
insert into t1 values(4,1,1);
insert into t1 values(5,null,0);
insert into t1 values(6,null,1);
insert into t1 values(7,null,null);

-- Check to see what CASE does with NULLs in its test expressions
select a, case when b0 then 1 else 0 end from t1;
select a+10, case when not b0 then 1 else 0 end from t1;
select a+20, case when b0 and c0 then 1 else 0 end from t1;
select a+30, case when not (b0 and c0) then 1 else 0 end from t1;
select a+40, case when b0 or c0 then 1 else 0 end from t1;
select a+50, case when not (b0 or c0) then 1 else 0 end from t1;
select a+60, case b when c then 1 else 0 end from t1;
select a+70, case c when b then 1 else 0 end from t1;

-- What happens when you multiply a NULL by zero?
select a+80, b*0 from t1;
select a+90, b*c from t1;

-- What happens to NULL for other operators?
select a+100, b+c from t1;

-- Test the treatment of aggregate operators
select count(*), count(b), sum(b), avg(b), min(b), max(b) from t1;

-- Check the behavior of NULLs in WHERE clauses
select a+110 from t1 where b10;
select a+130 from t1 where b
This page last modified on  2022-01-20 21:38:08 UTCnulls.html
¯W‚R  ;Þg!NULL Handling in SQLiteNULL Handling in SQLite Versus Other Database Engines


The goal is
to make SQLite handle NULLs in a standards-compliant way.
But the descriptions in the SQL standards on how to handle
NULLs seem ambiguous. 
It is not clear from the standards documents exactly how NULLs should
be handled in all circumstances.



So instead of going by the standards documents, various popular
SQL engines were tested to see how they handle NULLs.  The idea
was to make SQLite work like all the other engines.
An SQL test script was developed and run by volunteers on various
SQL RDBMSes and the results of those tests were used to deduce
how each engine processed NULL values.
The original tests were run in May of 2002.
A copy of the test script is found at the end of this document.



SQLite was originally coded in such a way that the answer to
all questions in the chart below would be "Yes".  But the
experiments run on other SQL engines showed that none of them
worked this way.  So SQLite was modified to work the same as
Oracle, PostgreSQL, and DB2.  This involved making NULLs
indistinct for the purposes of the SELECT DISTINCT statement and
for the UNION operator in a SELECT.  NULLs are still distinct
in a UNIQUE column.  This seems somewhat arbitrary, but the desire
to be compatible with other engines outweighed that objection.



It is possible to make SQLite treat NULLs as distinct for the
purposes of the SELECT DISTINCT and UNION.  To do so, one should
change the value of the NULL_ALWAYS_DISTINCT #define in the
sqliteInt.h source file and recompile.




Update 2003-07-13:
Since this document was originally written some of the database engines
tested have been updated and users have been kind enough to send in
corrections to the chart below.  The original data showed a wide variety
of behaviors, but over time the range of behaviors has converged toward
the PostgreSQL/Oracle model.  The only significant difference 
is that Informix and MS-SQL both treat NULLs as
inŽ‘&lt;column-names&gt; is a comma separated list
of between 3 and 11 columns.
The virtual &lt;name&gt; table creates three shadow tables to actually
store its content.  The names of these shadow tables are:


&lt;name&gt;_node
&lt;name&gt;_rowid
&lt;name&gt;_parent




The shadow tables are ordinary SQLite data tables.  You can query them 
directly if you like, though this unlikely to reveal anything particularly
useful. 
And you can UPDATE, DELETE, INSERT or even DROP 
the shadow tables, though doing so will corrupt your R*Tree index.
So it is best to simply ignore the shadow tables.  Recognize that they
hold your R*Tree index information and let it go as that.



As an example, consider creating a two-dimensional R*Tree index for use in 
spatial queries:


CREATE VIRTUAL TABLE demo_index USING rtree(
   id,              -- Integer primary key
   minX, maxX,      -- Minimum and maximum X coordinate
   minY, maxY       -- Minimum and maximum Y coordinate
);



3.1.1. Column naming details


In the argments to "rtree" in the CREATE VIRTUAL TABLE statement, the
names of the columns are taken from the first token of each argument.
All subsequent tokens within each argument are silently ignored.
This means, for example, that if you try to give a column a
type affinity or add a constraint such as UNIQUE or NOT NULL or DEFAULT to
a column, those extra tokens are accepted as valid, but they do not change
the behavior of the rtree.
In an RTREE virtual table, the first column always has a
type affinity of INTEGER and all other data columns have a
type affinity of REAL.
In an RTREE_I32 virtual table, all columns have type affinity of INTEGER.


Recommended practice is to omit any extra tokens in the rtree specification.
Let each argument to "rtree" be a single ordinary label that is the name of
the corresponding column, and omit all other tokens from the argument list.

3.2. Populating An R*Tree Index


The usual INSERT, UPDATE, and DELETE commands work on an R*Tree
index just like on regular tables.  So to insert some data into our sample
R*Tree index, we can do something like this:


INSERT INTO demo_index VALUES
  (28215, -80.781227, -80.604706, 35.208813, 35.297367),
  (28216, -80.957283, -80.840599, 35.235920, 35.367825),
  (28217, -80.960869, -80.869431, 35.133682, 35.208233),
  (28226, -80.878983, -80.778275, 35.060287, 35.154446),
  (28227, -80.745544, -80.555382, 35.130215, 35.236916),
  (28244, -80.844208, -80.841988, 35.223728, 35.225471),
  (28262, -80.809074, -80.682938, 35.276207, 35.377747),
  (28269, -80.851471, -80.735718, 35.272560, 35.407925),
  (28270, -80.794983, -80.728966, 35.059872, 35.161823),
  (28273, -80.994766, -80.875259, 35.074734, 35.172836),
  (28277, -80.876793, -80.767586, 35.001709, 35.101063),
  (28278, -81.058029, -80.956375, 35.044701, 35.223812),
  (28280, -80.844208, -80.841972, 35.225468, 35.227203),
  (28282, -80.846382, -80.844193, 35.223972, 35.225655);




The entries above are bounding boxes (longitude and latitude) for 14
zipcodes near Charlotte, NC.  A real database would have many thousands,
millions, or billions of such entries, but this small 14-row sample will
be sufficient to illustrate the ideas.


3.3. Querying An R*Tree Index


Any valid query will work against an R*Tree index.  The R*Tree
implementation just makes some kinds of queries especially
efficient.  Queries against the primary key are efficient:


SELECT * FROM demo_index WHERE id=28269;




Of course, an ordinary SQLite table will also do a query against its
integer primary key efficiently, so the previous is not important.
The big reason for using an R*Tree is so that
you can efficiently do range queries against the coordinate
ranges.  For example, the main office of the SQLite project is
located at 35.37785, -80.77470. 
To find which zipcodes might service that office, one could right:


SELECT id FROM demo_index
 WHERE minX&lt;=-80.77470 AND maxX&gt;=-80.77470
   AND minY&lt;=35.37785  AND maxY&gt;=35.37785;




The query above will quickly locate all zipcodes that contain
the SQLite main office in their boun’ding box, even if the
R*Tree contains many entries.  The previous is an example
of a "contained-within" query.  The R*Tree also supports "overlapping"
queries.  For example, to find all zipcode bounding boxes that overlap
with the 28269 zipcode:


SELECT A.id FROM demo_index AS A, demo_index AS B
 WHERE A.maxX&gt;=B.minX AND A.minX&lt;=B.maxX
   AND A.maxY&gt;=B.minY AND A.minY&lt;=B.maxY
   AND B.id=28269;




This second query will find both 28269 entry (since every bounding box
overlaps with itself) and also other zipcode that is close enough to
28269 that their bounding boxes overlap.



Note that it is not necessary for all coordinates in an R*Tree index
to be constrained in order for the index search to be efficient.
One might, for example, want to query all objects that overlap with
the 35th parallel:


SELECT id FROM demo_index
 WHERE maxY&gt;=35.0  AND minY&lt;=35.0;




But, generally speaking, the more constraints that the R*Tree module
has to work with, and the smaller the bounding box, the faster the
results will come back.


3.4. Roundoff Error


By default, coordinates are stored in an R*Tree using 32-bit floating
point values.  When a coordinate cannot be exactly represented by a
32-bit floating point number, the lower-bound coordinates are rounded down
and the upper-bound coordinates are rounded up.  Thus, bounding boxes might
be slightly larger than specified, but will never be any smaller.  This
is exactly what is desired for doing the more common "overlapping" queries
where the application wants to find every entry in the R*Tree that overlaps
a query bounding box.  Rounding the entry bounding boxes outward might cause a
few extra entries to appears in an overlapping query if the edge of the
entry bounding box corresponds to an edge of the query bounding box.  But
the overlapping query will never miss a valid table entry.  

However, for a "contained-within" style query, rounding the bounding
boxes outward might cause some entries to be excluded from the result set
if the edge of the entry bounding box corresponds to the edge of the query
bounding box.  To guard against this, applications should expand their
contained-within query boxes slightly (by 0.000012%) by rounding down the
lower coordinates and rounding up the top coordinates, in each dimension.



3.5. Reading And Writing At The Same Time


It is the nature of the Guttman R-Tree algorithm that any write might
radically restructure the tree, and in the process change the scan order
of the nodes.  For this reason, it is not generally possible to modify
the R-Tree in the middle of a query of the R-Tree.  Attempts to do so
will fail with a SQLITE_LOCKED "database table is locked" error.


So, for example, suppose an application runs one query against an R-Tree like
this:

SELECT id FROM demo_index
 WHERE maxY&gt;=35.0  AND minY&lt;=35.0;



Then for each "id" value returned, suppose the application creates an 
UPDATE statement like the following and binds the "id" value returned against
the "?1" parameter:

UPDATE demo_index SET maxY=maxY+0.5 WHERE id=?1;



Then the UPDATE might fail with an SQLITE_LOCKED error.  The reason is that
the initial query has not run to completion.  It is remembering its place
in the middle of a scan of the R-Tree.  So an update to the R-Tree cannot
be tolerated as this would disrupt the scan.


This is a limitation of the R-Tree extension only.  Ordinary tables in
SQLite are able to read and write at the same time.  Other virtual tables
might (or might not) also that capability.  And R-Tree can appear to read
and write at the same time in some circumstances, if it can figure out how
to reliably run the query to completion before starting the update.  But
you shouldn't count on that for every query.  Generally speaking, it is
best to avoid running queries and updates to the same R-Tree at the same
time.


If you really need to update an R-Tree based on complex queries against
the same R-Tree, it is best to run the complex queries first and store
the results in a temporary table, then update the R-Tree based on the “values
stored in the temporary table.

4. Using R*Trees Effectively


For SQLite versions prior to 3.24.0 (2018-06-04),
the only information that an R*Tree index stores about an object is
its integer ID and its bounding box.  Additional information needs to
be stored in separate tables and related to the R*Tree index using
the primary key.  For the example above, one might create an auxiliary
table as follows:


CREATE TABLE demo_data(
  id INTEGER PRIMARY KEY,  -- primary key
  objname TEXT,            -- name of the object
  objtype TEXT,            -- object type
  boundary BLOB            -- detailed boundary of object
);



In this example, the demo_data.boundary field is intended to hold some
kind of binary representation of the precise boundaries of the object.
The R*Tree index only holds an axis-aligned rectangular boundary for the
object.  The R*Tree boundary is just an approximation of the true object
boundary.  So what typically happens is that the R*Tree index is used to
narrow a search down to a list of candidate objects and then more detailed
and expensive computations are done on each candidate to find if the
candidate truly meets the search criteria.



Key Point:
An R*Tree index does not normally provide the exact answer but merely
reduces the set of potential answers from millions to dozens.



Suppose the demo_data.boundary field holds some proprietary data description
of a complex two-dimensional boundary for a zipcode and suppose that the
application has used the sqlite3_create_function() interface to
created an application-defined function "contained_in(boundary,lat,long)"
that accepts the demo_data.boundary object and a latitute and longitude
and returns return true or false if the lat/long is contained within
the boundary.
One may assume that "contained_in()" is a relatively slow
functions that we do not want to invoke too frequently.
Then an efficient way to find the specific ZIP code for the main
SQLite office would be to run a query like this:



SELECT objname FROM demo_data, demo_index
 WHERE demo_data.id=demo_index.id
   AND contained_in(demo_data.boundary, 35.37785, -80.77470)
   AND minX&lt;=-80.77470 AND maxX&gt;=-80.77470
   AND minY&lt;=35.37785  AND maxY&gt;=35.37785;


Notice how the query above works:  The R*Tree index runs in the outer
loop to find entries that contain the SQLite main office in their
boundary box.
For each row found, SQLite looks up
the corresponding entry in the demo_data table.  It then uses the boundary
field from the demo_data table as a parameter to the contained_in()
function and if that function returns true, then we know the sought after
coordinate is in that ZIP code boundary.

One would get the same answer without the use of the R*Tree index
using the following simpler query:

SELECT objname FROM demo_data
 WHERE contained_in(demo_data.boundary, 35.37785, -80.77470);


The problem with this latter query is that it must apply the
contained_in() function to all entries in the demo_data table.
The use of the R*Tree in the penultimate query reduces the number of
calls to contained_in() function to a small subset of the entire table.
The R*Tree index did not find the exact answer itself, it merely
limited the search space.



4.1. Auxiliary Columns


Beginning with SQLite version 3.24.0 (2018-06-04), r-tree tables
can have auxiliary columns that store arbitrary data.
Auxiliary columns can be used in place of
secondary tables such as "demo_data".


Auxiliary columns are marked with a "+" symbol before the column name.
Auxiliary columns must come after all of the coordinate boundary columns.
An RTREE table can have no more than 100 columns total.  In other words,
the count of columns including the integer primary key column, 
the coordinate boundary columns, and all auxiliary columns must be 100 or less.
The following example shows an r-tree table with auxiliary columns that
is equivalent to the two tables "demo_index" and "demo_data" above:

CREATE VIRTUAL TABLE demo_index2 USING rtree(
   id,              -- Integer primary key
   minX, maxX,      -- Minimu”m and maximum X coordinate
   minY, maxY,      -- Minimum and maximum Y coordinate
   +objname TEXT,   -- name of the object
   +objtype TEXT,   -- object type
   +boundary BLOB   -- detailed boundary of object
);



By combining location data and related information into the same
table, auxiliary columns can provide a cleaner model
and reduce the need to joins.
For example, the earlier
join between demo_index and demo_data can now
be written as a simple query, like this:

SELECT objname FROM demo_index2
 WHERE contained_in(boundary, 35.37785, -80.77470)
   AND minX&lt;=-80.77470 AND maxX&gt;=-80.77470
   AND minY&lt;=35.37785  AND maxY&gt;=35.37785;


4.1.1. Limitations


For auxiliary columns, only the name of the column matters.
The type affinity is ignored.
Constraints such as NOT NULL, UNIQUE, REFERENCES, or CHECK
are also ignored.  However, future versions
of SQLite might start paying attention to the type affinity and
constraints, so users of auxiliary columns are advised to leave
both blank, to avoid future compatibility problems.



5. Integer-Valued R-Trees


The default virtual table ("rtree") stores coordinates as
single-precision (4-byte) floating point numbers.  If integer coordinates
are desired, declare the table using "rtree_i32" instead:

CREATE VIRTUAL TABLE intrtree USING rtree_i32(id,x0,x1,y0,y1,z0,z1);



An rtree_i32 stores coordinates as 32-bit signed integers.  
Even though it stores values using integer, the rtree_i32 virtual
table still uses floating point computations internally as part of
the r-tree algorithm.



6. Custom R-Tree Queries

By using standard SQL expressions in the WHERE clause of a SELECT query,
a programmer can query for all R*Tree entries that 
intersect with or are contained within a particular bounding-box.
Custom R*Tree queries, using the MATCH
operator in the WHERE clause of a SELECT, allow the programmer to query for 
the set of R*Tree entries that intersect any arbitrary region or shape, not 
just a box.  This capability is useful, for example, in computing the 
subset of objects in the R*Tree that are visible from a camera positioned 
in 3-D space.

Regions for custom R*Tree queries are defined by R*Tree geometry callbacks
implemented by the application and registered with SQLite via a call to one
of the following two APIs:

int sqlite3_rtree_query_callback(
  sqlite3 *db,
  const char *zQueryFunc,
  int (*xQueryFunc)(sqlite3_rtree_query_info*),
  void *pContext,
  void (*xDestructor)(void*)
);
int sqlite3_rtree_geometry_callback(
  sqlite3 *db,
  const char *zGeom,
  int (*xGeom)(sqlite3_rtree_geometry *, int nCoord, double *aCoord, int *pRes),
  void *pContext
);


The sqlite3_rtree_query_callback() became available with SQLite
version 3.8.5 (2014-06-04) and is the preferred interface.
The sqlite3_rtree_geometry_callback() is an older and less flexible
interface that is supported for backwards compatibility.

A call to one of the above APIs creates a new SQL function named by the
second parameter (zQueryFunc or zGeom).  When that SQL function appears
on the right-hand side of the MATCH operator and the left-hand side of the
MATCH operator is any column in the R*Tree virtual table, then the callback 
defined by the third argument (xQueryFunc or xGeom) is invoked to determine
if a particular object or subtree overlaps the desired region.

For example, a query like the following might be used to find all
R*Tree entries that overlap with a circle centered a 45.3,22.9 with a
radius of 5.0:

SELECT id FROM demo_index WHERE id MATCH circle(45.3, 22.9, 5.0)


The SQL syntax for custom queries is the same regardless of which
interface, sqlite3_rtree_geometry_callback() or sqlite3_rtree_query_callback(),
is used to register the SQL function.  However, the newer query-style
callbacks give the application greater control over how the query proceeds.

6.1. The Legacy xGeom Callback

The legacy xGeom callback is invoked with four arguments.  The first
argument is a pointer to an sqlite3_rtree_geometry structure which provides
information about how the SQL function was invoked.•  The second argument
is the number of coordinates in each r-tree entry, and is always the same
for any given R*Tree.  The number of coordinates is 2 for a 1-dimensional R*Tree,
4 for a 2-dimensional R*Tree, 6 for a 3-dimensional R*Tree, and so forth.
The third argument, aCoord[], is an array of nCoord coordinates that defines
a bounding box to be tested.  The last argument is a pointer into which 
the callback result should be written.  The result is zero
if the bounding-box defined by aCoord[] is completely outside
the region defined by the xGeom callback and the result is non-zero if
the bounding-box is inside or overlaps with the xGeom region.  The xGeom
callback should normally return SQLITE_OK.  If xGeom returns anything other
than SQLITE_OK, then the r-tree query will abort with an error.

The sqlite3_rtree_geometry structure that the first argument to the
xGeom callback points to has a structure shown below.  The exact same
sqlite3_rtree_geometry
structure is used for every callback for same MATCH operator in the same
query.  The contents of the sqlite3_rtree_geometry
structure are initialized by SQLite but are
not subsequently modified.  The callback is free to make changes to the
pUser and xDelUser elements of the structure if desired.

typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry;
struct sqlite3_rtree_geometry {
  void *pContext;                 /* Copy of pContext passed to s_r_g_c() */
  int nParam;                     /* Size of array aParam */
  double *aParam;                 /* Parameters passed to SQL geom function */
  void *pUser;                    /* Callback implementation user data */
  void (*xDelUser)(void *);       /* Called by SQLite to clean up pUser */
};


The pContext member of the sqlite3_rtree_geometry
structure is always set to a copy of the pContext
argument passed to sqlite3_rtree_geometry_callback() when the
callback is registered. The aParam[] array (size nParam) contains the parameter
values passed to the SQL function on the right-hand side of the MATCH operator.
In the example "circle" query above, nParam would be set to 3 and the aParam[]
array would contain the three values 45.3, 22.9 and 5.0.

The pUser and xDelUser members of the sqlite3_rtree_geometry structure are
initially set to NULL. The pUser variable may be set by the callback
implementation to any arbitrary value that may be useful to subsequent
invocations of the callback within the same query (for example, a
pointer to a complicated data structure used to test for region intersection).
If the xDelUser variable is set to a non-NULL value, then after the
query has finished running SQLite automatically invokes it with the
value of the pUser variable as the only argument. In other words, xDelUser
may be set to a destructor function for the pUser value.

The xGeom callback always does a depth-first search of the r-tree.



6.2. The New xQueryFunc Callback

The newer xQueryFunc callback receives more information from the r-tree
query engine on each call, and it sends more information back to the query engine
before it returns.
To help keep the interface manageable, the xQueryFunc callback sends and receives
information from the query engine as fields in the
sqlite3_rtree_query_info structure:

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: Visiblity */
  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 */
};


The first five fields of the sqlite3_rtree_query_info structure are identical
to the sqlite3_rtree_geometry structure, and have exactly the same meaning.
The sqlite3_rtree_query_info structure also contains nCoord and aCoord fields 
which have the same meaning as the parameter of the same name in the xGeom callback.

The xQueryFunc must set the eWithin field of sqlite3_rtree_query_info to
one of the values NOT_WITHIN, PARTLY_WITHIN, or FULLY_WITHIN depending on whether
or not the bounding box defined by aCoord[] is completely outside the region,
overlaps the region, or is completely inside the region, respectively.  In
addition, the xQueryFunc must set the rScore field to a non-negative value that
indicates the order in which subtrees and entries of the query should be analyzed
and returned.  Smaller scores are processed first.

As its name implies, an R*Tree is organized as a tree.  Each node of the
tree is a bounding box.  The root of the tree is a bounding box that encapsulates
all elements of the tree.  Beneath the root are a number of subtrees (typically
20 or more) each with their own smaller bounding boxes and each containing some
subset of the R*Tree entries.  The subtrees may have sub-subtrees, and so forth
until finally one reaches the leaves of the tree which are the actual R*Tree
entries.

An R*Tree query is initialized by making the root node the only entry
in a priority queue sorted by rScore.
The query proceeds by extracting the entry from the priority queue that has
the lowest score.  If that entry is a leaf (meaning that it is an actual
R*Tree entry and not a subtree) then that entry
is returned as one row of the query result.  
If the extracted priority queue entry is a node (a subtree),
then the next child of that node is passed to the xQueryFunc callback.
If the node has more children then it is returned to the priority queue.
Otherwise it is discarded. Those subelements for which the xQueryFunc
callback sets eWithin to PARTLY_WITHIN or FULLY_WITHIN are added to the
priority queue using the score supplied by the callback.  Subelements that
return NOT_WITHIN are discarded.  The query runs until the priority queue is
empty.

Every leaf entry and node (subtree) within the R*Tree has an integer "level".
The leaves have a level of 0.  The first containing subtree of the leaves has
a level of 1.  The root of the R*Tree has the largest level value.  The
mxLevel entry in the sqlite3_rtree_query_info structure is the level value for
the root of the R*Tree.  The iLevel entry in sqlite3_rtree_query_info gives the
level for the object being interrogated.

Most R*Tree queries use a depth-first search.  This is accomplished by setting
the rScore equal to iLevel.  A depth-first search is usually preferred since it
minimizes the number of elements in the priority queue, which reduces memory
requirements and speeds processing.  However, some application may prefer a
breadth-first search, which can be accomplished by setting rScore to mxLevel-iLevel.
By creating more complex formulas for rScore, applications can exercise
detailed control over the order in which subtree are searched and leaf
R*Tree entries are returned.  For example, in an application with many
millions of R*Tree entries, the rScore might be arranged so that the
largest or most significant entries are returned first, allowing the
application to display the most important information quickly, and
filling in smaller and less important details as they become available.

Other information fields of the sqlite3_rtree_query_info structure are
available for use by the xQueryFunc callback, if desired.  The iRowid field
is the rowid (the first of the 3 to 11 columns in the R*Tree) for the element
being considered.  iRowid is only valid for leaves.  The eParentWithin and
rParentScore values are copies of the eWithin and rScore values from the
containing subtree of the current row.  The anQueue field is an array
of mxLevel+1 unsigned integers that tell the current number of elements in
the priority queue at each level.

6.3. Additional Considerations for Custom Queries


The MATCH operator of a custom R*Tree query function must be a top-level
AND-connected term of the WHERE clause, or else it will not be usable
by the R*Tree query optimizer and the query will not be runnable.
If the MATCH operator is connected to other terms of the WHERE clause 
via an OR operator, for example, the query will fail with an error.


Two or more MATCH operators are allowed in the same WHERE clause, as long
as they are connected by AND operators.  However,
the R*Tree query engine only contains a single priority queue.  The priority
assigned to each node in the search is the lowest priority returned by any
of the MATCH operators.

7. Implementation Details


The following sections describe some low-level details of the R*Tree implementation,
that might be useful for trouble-shooting or performance analysis.



7.1. Shadow Tables

The content of an R*Tree index is actually stored in three ordinary
SQLite tables with names derived from the name of the R*Tree.  These
three tables are called "shadow tables".  This is their schema:

CREATE TABLE %_node(nodeno INTEGER PRIMARY KEY, data)
CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode)
CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno)


The "%" in the name of each shadow table is replaced by the name of the
R*Tree virtual table.  So, if the name of the R*Tree table is "xyz" then
the three shadow tables would be "xyz_node", "xyz_parent", and "xyz_rowid".

There is one entry in the %_node table for each R*Tree node.  An
R*Tree node consists of one or more entries that are proximate to one another.
The nodes of an R*Tree for a tree.  All nodes other than the root have an
entry in the %_parent shadow table that identifies the parent node.
Each entry in an R*Tree has a rowid.  The %_rowid shadow table maps entry
rowids to the node that contains that entry.

Extra columns appended to the %_rowid table hold the 
content of auxiliary columns.  The names of these extra
%_rowid columns are probably not the same as the
actual auxiliary column names.



7.2. Integrity Check using the rtreecheck() SQL function

The scalar SQL function rtreecheck(R) or rtreecheck(S,R) runs an
integrity check on the rtree table named R contained within database S.
The function returns a human-language description of any problems found,
or the string 'ok' if everything is ok.  Running rtreecheck() on an R*Tree
virtual table is similar to running PRAGMA integrity_check on a
database.

Example: To verify that an R*Tree named "demo_index" is well-formed
and internally consistent, run:

SELECT rtreecheck('demo_index');


The rtreecheck() function performs the following checks:



For each cell in the r-tree structure (%_node table), that:

 for each dimension, (coord1 &lt;= coord2).
 unless the cell is on the root node, that the cell is bounded
        by the parent cell on the parent node.
 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.
 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.


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.

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.

This page last modified on  2021-09-29 16:36:36 UTCrtree.html
ûF‚S
=ƒöA!The SQLite R*Tree Module1. Overview


An R-Tree is a special
index that is designed for doing range queries.  R-Trees are most commonly
used in geospatial systems where each entry is a rectangle with minimum and
maximum X and Y coordinates.  Given a query rectangle, an R-Tree is able
to quickly find all entries that are contained within the query rectangle
or which overlap the query rectangle.  This idea is easily extended to
three dimensions for use in CAD systems.  R-Trees also find use in time-domain
range look-ups.  For example, suppose a database records the starting and
ending times for a large number of events.  A R-Tree is able to quickly
find all events that were active at any time during a given
time interval, or all events that started during a particular time interval,
or all events that both started and ended within a given time interval.
And so forth.



The R-Tree concept originated with 
Toni Guttman: 
R-Trees: A Dynamic Index Structure for Spatial Searching,
Proc. 1984 ACM SIGMOD International Conference on Management of Data,
pp. 47-57.
The implementation found in SQLite is a refinement of Guttman's original
idea, commonly called "R*Trees", that was described by
Norbert Beckmann, Hans-Peter Kriegel, Ralf Schneider, Bernhard Seeger:
The R*-Tree: An Efficient and Robust Access Method for Points
and Rectangles. SIGMOD Conference 1990: 322-331.


2. Compiling The R*Tree Module


The source code to the SQLite R*Tree module is included as part
of the amalgamation but is disabled by default.  To enable the
R*Tree module, simply compile with the SQLITE_ENABLE_RTREE 
C-preprocessor macro defined.  With many compilers, this is accomplished
by adding the option "-DSQLITE_ENABLE_RTREE=1" to the compiler
command-line.


3. Using the R*Tree Module


The SQLite R*Tree module is implemented as a
virtual table.  Each R*Tree index is a
virtual table with an odd number of columns between 3 and 11.
The first column is always a 64-bit signed integer primary key.
The other columns are pairs, one pair per dimension, containing the
minimum and maximum values for that dimension, respectively.
A 1-dimensional R*Tree thus has 3 columns.  
A 2-dimensional R*Tree has 5 columns.
A 3-dimensional R*Tree has 7 columns.
A 4-dimensional R*Tree has 9 columns.
And a 5-dimensional R*Tree has 11 columns.  The SQLite R*Tree implementation
does not support R*Trees wider than 5 dimensions.



The first column of an SQLite R*Tree is similar to an integer primary 
key column of a normal SQLite table. It may only store a 64-bit signed
integer value. Inserting a NULL value into this column causes SQLite
to automatically generate a new unique primary key value. If an attempt
is made to insert any other non-integer value into this column,
the r-tree module silently converts it to an integer before writing it
into the database.

The min/max-value pair columns are stored as 32-bit floating point values for
"rtree" virtual tables or as 32-bit signed integers in "rtree_i32" virtual
tables.  Unlike regular SQLite tables which can store data in a variety of
datatypes and formats, the R*Tree rigidly enforce these storage types. 
If any other type of value is inserted into such a column, the r-tree
module silently converts it to the required type before writing the
new record to the database.

3.1. Creating An R*Tree Index


A new R*Tree index is created as follows:


CREATE VIRTUAL TABLE &lt;name&gt; USING rtree(&lt;column-names&gt;);



The &lt;name&gt; is the name your application chooses for the
R*Tree index and ™ DELETE change represents a row, identified by
       its primary key values, to remove from a database table. The payload
       of a DELETE change consists of the values for all fields of the 
       deleted row.

   An UPDATE. An UPDATE change represents the modification of
       one or more non-PRIMARY KEY fields of a single row within a database 
       table, identified by its PRIMARY KEY fields. The payload for an UPDATE
       change consists of:
   
      The PRIMARY KEY values identifying the modified row, 
      The new values for each modified field of the row, and
      The original values for each modified field of the row.
   
        An UPDATE change does not contain any information regarding
       non-PRIMARY KEY fields that are not modified by the change. It is not
       possible for an UPDATE change to specify modifications to PRIMARY 
       KEY fields. 


 A single changeset may contain changes that apply to more than one 
database table. For each table that the changeset includes at least one change
for, it also encodes the following data:


   The name of the database table, 
   The number of columns the table has, and
   Which of those columns are PRIMARY KEY columns.


 Changesets may only be applied to databases that contain tables 
matching the above three criteria as stored in the changeset.

 A patchset is similar to a changeset. It is slightly more compact than
a changeset, but provides more limited conflict detection and resolution
options (see the next section for details). The differences between a 
patchset and a changeset are that:


   For a DELETE change, the payload consists of the PRIMARY KEY 
          fields only. The original values of other fields are not stored as
          part of a patchset.

   For an UPDATE change, the payload consists of the PRIMARY KEY 
          fields and the new values of modified fields only. The original
          values of modified fields are not stored as part of a patchset.


2.2. Conflicts

 When a changeset or patchset is applied to a database, an attempt is 
made to insert a new row for each INSERT change, remove a row for each
DELETE change and modify a row for each UPDATE change. If the target 
database is in the same state as the original database that the changeset
was recorded on, this is a simple matter. However, if the contents of the
target database is not in exactly this state, conflicts can occur when
applying the changeset or patchset.

When processing an INSERT change, the following conflicts can
occur:


   The target database may already contain a row with the same PRIMARY
       KEY values as specified by the INSERT change.

   Some other database constraint, for example a UNIQUE or CHECK 
       constraint, may be violated when the new row is inserted.


When processing a DELETE change, the following conflicts may be
detected:


   The target database may contain no row with the specified PRIMARY 
       KEY values to delete.

   The target database may contain a row with the specified PRIMARY
       KEY values, but the other fields may contain values that do not
       match those stored as part of the changeset. This type of conflict
       is not detected when using a patchset.


When processing an UPDATE change, the following conflicts may be
detected:


   The target database may contain no row with the specified PRIMARY 
       KEY values to modify.

   The target database may contain a row with the specified PRIMARY
       KEY values, but the current values of the fields that will be modified
       by the change may not match the original values stored within the
       changeset. This type of conflict is not detected when using a patchset.

   Some other database constraint, for example a UNIQUE or CHECK 
       constraint, may be violated when the row is updated.


 Depending on the type of conflict, a sessions application has a variety
of configurable options for dealing with conflicts, ranging from omitting the
conflicting change, aborting the entire changeset application or applying
the change despite the conšflict. For details, refer to the documentation for
the sqlite3changeset_apply() API.

2.3. Changeset Construction

 After a session object has been configured, it begins monitoring for 
changes to its configured tables. However, it does not record an entire
change each time a row within the database is modified. Instead, it records
just the PRIMARY KEY fields for each inserted row, and just the PRIMARY KEY 
and all original row values for any updated or deleted rows. If a row is 
modified more than once by a single session, no new information is recorded.

 The other information required to create a changeset or patchset is
read from the database file when sqlite3session_changeset() or
sqlite3session_patchset() is called. Specifically,


   For each primary key recorded as a result of an INSERT operation, 
       the sessions module checks if there is a row with a matching primary
       key still in the table. If so, an INSERT change is added to the 
       changeset.

   For each primary key recorded as a result of an UPDATE or DELETE
       operation, the sessions module also checks for a row with a matching
       primary key within the table. If one can be found, but one or more
       of the non-PRIMARY KEY fields does not match the original recorded
       value, an UPDATE is added to the changeset. Or, if there is no row
       at all with the specified primary key, a DELETE is added to the 
       changeset. If the row does exist but none of the non-PRIMARY KEY
       fields have been modified, no change is added to the changeset.


 One implication of the above is that if a change is made and then 
unmade within a single session (for example if a row is inserted and then
deleted again), the sessions module does not report any change at all. Or
if a row is updated multiple times within the same session, all updates
are coalesced into a single update within any changeset or patchset blob.

3. Using The Session Extension

 This section provides examples that demonstrate how to use the sessions
    extension.

3.1. Capturing a Changeset

 The example code below demonstrates the steps involved in capturing a
changeset while executing SQL commands. In summary:


   A session object (type sqlite3_session*) is created by making a 
          call to the sqlite3session_create() API function.

       A single session object monitors changes made to a single database 
          (i.e. "main", "temp" or an attached database) via a single 
          sqlite3* database handle.

   The session object is configured with a set of tables to monitor
          changes on.

        By default a session object does not monitor changes on any 
           database table. Before it does so it must be configured. There 
           are three ways to configure the set of tables to monitor changes
           on:
       
          By explicitly specifying tables using one call to
              sqlite3session_attach() for each table, or

          By specifying that all tables in the database should be monitored
              for changes using a call to sqlite3session_attach() with a
              NULL argument, or

          By configuring a callback to be invoked the first time each table
              is written to that indicates to the session module whether or
              not changes on the table should be monitored.
       
         The example code below uses the second of the methods enumerated
            above - it monitors for changes on all database tables.

    Changes are made to the database by executing SQL statements. The
           session object records these changes.

    A changeset blob is extracted from the session object using a call
           to sqlite3session_changeset() (or, if using patchsets, a call to
           the sqlite3session_patchset() function).

    The session object is deleted using a call to the 
           sqlite3session_delete() API function.

        It is not necessary to delete a session object after extracting
           a changeset or patchset from it. It can be left attached to the
       ›    database handle and will continue monitoring for changes on the
           configured tables as before. However, if 
           sqlite3session_changeset() or sqlite3session_patchset() is
           called a second time on a session object, the changeset or patchset
           will contain all changes that have taken place on the connection
           since the session was created. In other words,
           a session object is not reset or
           zeroed by a call to sqlite3session_changeset() or
           sqlite3session_patchset().


/*
** Argument zSql points to a buffer containing an SQL script to execute 
** against the database handle passed as the first argument. As well as
** executing the SQL script, this function collects a changeset recording
** all changes made to the "main" database file. Assuming no error occurs,
** output variables (*ppChangeset) and (*pnChangeset) are set to point
** to a buffer containing the changeset and the size of the changeset in
** bytes before returning SQLITE_OK. In this case it is the responsibility
** of the caller to eventually free the changeset blob by passing it to
** the sqlite3_free function.
**
** Or, if an error does occur, return an SQLite error code. The final
** value of (*pChangeset) and (*pnChangeset) are undefined in this case.
*/
int sql_exec_changeset(
  sqlite3 *db,                  /* Database handle */
  const char *zSql,             /* SQL script to execute */
  int *pnChangeset,             /* OUT: Size of changeset blob in bytes */
  void **ppChangeset            /* OUT: Pointer to changeset blob */
){
  sqlite3_session *pSession = 0;
  int rc;

  /* Create a new session object */
  rc = sqlite3session_create(db, "main", &pSession);

  /* Configure the session object to record changes to all tables */
  if( rc==SQLITE_OK ) rc = sqlite3session_attach(pSession, NULL);

  /* Execute the SQL script */
  if( rc==SQLITE_OK ) rc = sqlite3_exec(db, zSql, 0, 0, 0);

  /* Collect the changeset */
  if( rc==SQLITE_OK ){
    rc = sqlite3session_changeset(pSession, pnChangeset, ppChangeset);
  }

  /* Delete the session object */
  sqlite3session_delete(pSession);

  return rc;
}


3.2. Applying a Changeset to a Database

 Applying a changeset to a database is simpler than capturing a changeset.
Usually, a single call to sqlite3changeset_apply(), as depicted in the
example code below, suffices.

 In cases where it is complicated, the complications in applying a 
changeset lie in conflict resolution. Refer to the API documentation linked
above for details.

  /*
** Conflict handler callback used by apply_changeset(). See below.
*/
static int xConflict(void *pCtx, int eConflict, sqlite3_changset_iter *pIter){
  int ret = (int)pCtx;
  return ret;
}

/*
** Apply the changeset contained in blob pChangeset, size nChangeset bytes,
** to the main database of the database handle passed as the first argument.
** Return SQLITE_OK if successful, or an SQLite error code if an error
** occurs.
**
** If parameter bIgnoreConflicts is true, then any conflicting changes 
** within the changeset are simply ignored. Or, if bIgnoreConflicts is
** false, then this call fails with an SQLTIE_ABORT error if a changeset
** conflict is encountered.
*/
int apply_changeset(
  sqlite3 *db,                  /* Database handle */
  int bIgnoreConflicts,         /* True to ignore conflicting changes */
  int nChangeset,               /* Size of changeset in bytes */
  void *pChangeset              /* Pointer to changeset blob */
){
  return sqlite3changeset_apply(
      db, 
      nChangeset, pChangeset, 
      0, xConflict, 
      (void*)bIgnoreConflicts
  );
}


3.3. Inspecting the Contents of a Changeset

 The example code below demonstrates the techniques used to iterate 
through and extract the data related to all changes in a changeset. To
summarize:


   The sqlite3changeset_start() API is called to create and
          initialize an iterator to iterate through the contents of a
          changeset. Initially, the iterator points to no element at all.

   The first call to sqlite3changeset_next() on the iterator moves
          it to point to the first change  in the changeset (or to EOF, if 
          the changeset is completely empty). sqlite3changeset_next() returns
          SQLITE_ROW if it moves the iterator to point to a valid entry,
          SQLITE_DONE if it moves the iterator to EOF, or an SQLite error
          code if an error occurs.

   If the iterator points to a valid entry, the sqlite3changeset_op()
          API may be used to determine the type of change (INSERT, UPDATE or
          DELETE) that the iterator points to. Additionally, the same API 
          can be used to obtain the name of the table the change applies to
          and its expected number of columns and primary key columns.

   If the iterator points to a valid INSERT or UPDATE entry, the
          sqlite3changeset_new() API may be used to obtain the new.* values
          within the change payload.

   If the iterator points to a valid DELETE or UPDATE entry, the
          sqlite3changeset_old() API may be used to obtain the old.* values
          within the change payload.

   An iterator is deleted using a call to the 
          sqlite3changeset_finalize() API. If an error occured while
          iterating, an SQLite error code is returned (even if the same error
          code has already been returned by sqlite3changeset_next()). Or,
          if no error has occurred, SQLITE_OK is returned.


  /*
** Print the contents of the changeset to stdout.
*/
static int print_changeset(void *pChangeset, int nChangeset){
  int rc;
  sqlite3_changeset_iter *pIter = 0;

  /* Create an iterator to iterate through the changeset */
  rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset);
  if( rc!=SQLITE_OK ) return rc;

  /* This loop runs once for each change in the changeset */
  while( SQLITE_ROW==sqlite3changeset_next(pIter) ){
    const char *zTab;           /* Table change applies to */
    int nCol;                   /* Number of columns in table zTab */
    int op;                     /* SQLITE_INSERT, UPDATE or DELETE */
    sqlite3_value *pVal;

    /* Print the type of operation and the table it is on */
    rc = sqlite3changeset_op(pIter, &zTab, &nCol, &op, 0);
    if( rc!=SQLITE_OK ) goto exit_print_changeset;
    printf("%s on table %s\n",
      op==SQLITE_INSERT?"INSERT" : op==SQLITE_UPDATE?"UPDATE" : "DELETE",
      zTab
    );

    /* If this is an UPDATE or DELETE, print the old.* values */
    if( op==SQLITE_UPDATE || op==SQLITE_DELETE ){
      printf("Old values:");
      for(i=0; i&lt;nCol; i++){
        rc = sqlite3changeset_old(pIter, i, &pVal);
        if( rc!=SQLITE_OK ) goto exit_print_changeset;
        printf(" %s", pVal ? sqlite3_value_text(pVal) : "-");
      }
      printf("\n");
    }

    /* If this is an UPDATE or INSERT, print the new.* values */
    if( op==SQLITE_UPDATE || op==SQLITE_INSERT ){
      printf("New values:");
      for(i=0; i&lt;nCol; i++){
        rc = sqlite3changeset_new(pIter, i, &pVal);
        if( rc!=SQLITE_OK ) goto exit_print_changeset;
        printf(" %s", pVal ? sqlite3_value_text(pVal) : "-");
      }
      printf("\n");
    }
  }

  /* Clean up the changeset and return an error code (or SQLITE_OK) */
 exit_print_changeset:
  rc2 = sqlite3changeset_finalize(pIter);
  if( rc==SQLITE_OK ) rc = rc2;
  return rc;
}


4. Extended Functionality

 Most applications will only use the session module functionality described
in the previous section. However, the following additional functionality is
available for the use and manipulation of changeset and patchset blobs:


   Two or more changeset/patchsets may be combined using the 
       sqlite3changeset_concat() or sqlite3_changegroup interfaces.

   A changeset may be "inverted" using the sqlite3changeset_invert()
       API function. An inverted changeset undoes the changes made by the
       original. If changeset C+ is the inverse of changeset C, then
       applying C and then C+ to a database should leave
       the database unchanged.
This page last modified on  2018-02-28 22:21:53 UTCsessionintro.html
×ך‚T
7‚³M/The Session Extension1. Introduction

The session extension provide a mechanism for recording changes
to some or all of the rowid tables in an SQLite database, and packaging
those changes into a "changeset" or "patchset" file that can later
be used to apply the same set of changes to another database with
the same schema and compatible starting data.  A "changeset" may
also be inverted and used to "undo" a session.

This document is an introduction to the session extension.
The details of the interface are in the separate
Session Extension C-language Interface document.

1.1. Typical Use Case

Suppose SQLite is used as the application file format for a
particular design application.  Two users, Alice and Bob, each start
with a baseline design that is about a gigabyte in size.  They work
all day, in parallel, each making their own customizations and tweaks
to the design.  At the end of the day, they would like to merge their
changes together into a single unified design.

The session extension facilitates this by recording all changes to
both Alice's and Bob's databases and writing those changes into
changeset or patchset files.  At the end of the day, Alice can send her
changeset to Bob and Bob can "apply" it to his database.  The result (assuming
there are no conflicts) is that Bob's database then contains both his
changes and Alice's changes.  Likewise, Bob can send a changeset of
his work over to Alice and she can apply his changes to her database.

In other words, the session extension provides a facility for
SQLite database files that is similar to the unix
patch utility program,
or to the "merge" capabilities of version control systems such
as Fossil, Git, 
or Mercurial.

1.2. Obtaining the Session Extension

 Since version 3.13.0 (2016-05-18), 
the session extension has been included in the SQLite
amalgamation source distribution. By default, the session extension is 
disabled. To enable it, build with the following compiler switches:

-DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK


 Or, if using the autoconf build system, pass the --enable-session option to the configure script.

1.3. Limitations



 Prior to SQLite version 3.17.0, the session extension only worked with
        rowid tables, not WITHOUT ROWID tables. As of 3.17.0, both
        rowid and WITHOUT ROWID tables are supported.

 There is no support for virtual tables. Changes to virtual tables are
        not captured.

 The session extension only works with tables that have a declared
        PRIMARY KEY. The PRIMARY KEY of a table may be an INTEGER PRIMARY KEY
        (rowid alias) or an external PRIMARY KEY.

 SQLite allows NULL values to be stored in
        PRIMARY KEY columns. However, the session extension ignores all
        such rows. No changes affecting rows with one or more NULL values
        in PRIMARY KEY columns are recorded by the sessions module.


2. Concepts



2.1. Changesets and Patchsets
 The sessions module revolves around creating and manipulating 
changesets. A changeset is a blob of data that encodes a series of 
changes to a database. Each change in a changeset is one of the 
following:


   An INSERT. An INSERT change contains a single row to add to 
       a database table. The payload of the INSERT change consists of the
       values for each field of the new row.

   A DELETE. A˜žtatement contains
two named window-defs clauses, "win1" and "win2":

SELECT x, y, row_number() OVER win1, rank() OVER win2 
FROM t0 
WINDOW win1 AS (ORDER BY y RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
       win2 AS (PARTITION BY y ORDER BY x)
ORDER BY x;


The WINDOW clause, when one is present, comes after any HAVING clause and
before any ORDER BY.



2. Aggregate Window Functions

 The examples in this section all assume that the database is populated as
follows:

CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
INSERT INTO t1 VALUES   (1, 'A', 'one'  ),
                        (2, 'B', 'two'  ),
                        (3, 'C', 'three'),
                        (4, 'D', 'one'  ),
                        (5, 'E', 'two'  ),
                        (6, 'F', 'three'),
                        (7, 'G', 'one'  );


 An aggregate window function is similar to an 
ordinary aggregate function, except
adding it to a query does not change the number of rows returned. Instead,
for each row the result of the aggregate window function is as if the
corresponding aggregate were run over all rows in the "window frame"
specified by the OVER clause.


-- The following SELECT statement returns:
-- 
--   a | b | group_concat
-------------------------
--   1 | A | A.B         
--   2 | B | A.B.C       
--   3 | C | B.C.D       
--   4 | D | C.D.E       
--   5 | E | D.E.F       
--   6 | F | E.F.G       
--   7 | G | F.G         
-- 
SELECT a, b, group_concat(b, '.') OVER (
  ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) AS group_concat FROM t1;


 In the example above, the window frame consists of all rows between the
previous row ("1 PRECEDING") and the following row ("1 FOLLOWING"), inclusive,
where rows are sorted according to the ORDER BY clause in the
window-defn (in this case "ORDER BY a"). 
For example, the frame for the row with (a=3) consists of rows (2, 'B', 'two'),
(3, 'C', 'three') and (4, 'D', 'one'). The result of group_concat(b, '.') 
for that row is therefore 'B.C.D'.

 All of SQLite's aggregate functions may
be used as aggregate window functions. It is also possible to 
create user-defined aggregate window functions.




2.1. The PARTITION BY Clause

 For the purpose of computing window functions, the result set
of a query is divided into one or more "partitions".  A partition consists
of all rows that have the same value for all terms of the PARTITION BY clause
in the window-defn.  If there is no PARTITION BY clause,
then the entire result set of the query is a single partition.
Window-function processing is performed separately for each partition.

 For example:

-- The following SELECT statement returns:
-- 
--   c     | a | b | group_concat
---------------------------------
--   one   | 1 | A | A.D.G       
--   one   | 4 | D | D.G         
--   one   | 7 | G | G           
--   three | 3 | C | C.F         
--   three | 6 | F | F           
--   two   | 2 | B | B.E         
--   two   | 5 | E | E           
-- 
SELECT c, a, b, group_concat(b, '.') OVER (
  PARTITION BY c ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS group_concat
FROM t1 ORDER BY c, a;


 In the query above, the "PARTITION BY c" clause breaks the
result set up into three partitions. The first partition has
three rows with c=='one'.  The second partition has two rows with
c=='three' and the third partition has two rows with c=='two'.

 In the example above, all the rows for each partition are
grouped together in the final output.  This is because the PARTITION BY
clause is a prefix of the ORDER BY clause on the overall query.  
But that does not have
to be the case.  A partition can be composed of rows scattered
about haphazardly within the result set.  For example:

-- The following SELECT statement returns:
-- 
--   c     | a | b | group_concat
---------------------------------
--   one   | 1 | A | A.D.G       
--   two   | 2 | B | B.E         
--   three | 3 | C | C.F         
--   one   | 4 | D | D.G         
--   two   | 5 | E | E           
--   three | 6 | F | F           
--   one   | 7 | G | G           
Ÿ-- 
SELECT c, a, b, group_concat(b, '.') OVER (
  PARTITION BY c ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS group_concat
FROM t1 ORDER BY a;





2.2. Frame Specifications

 The frame-spec determines which output rows are
read by an aggregate window function.  The
frame-spec consists of four parts:


   A frame type - either ROWS, RANGE or GROUPS,
   A starting frame boundary,
   An ending frame boundary,
   An EXCLUDE clause.


 Here are the syntax details:

frame-spec:
hide
 
 

expr:
show
 
 

filter-clause:
show
 
 


literal-value:
show
 
 


over-clause:
show
 
 

ordering-term:
show
 
 



raise-function:
show
 
 


select-stmt:
show
 
 

common-table-expression:
show
 
 


compound-operator:
show
 
 


join-clause:
show
 
 

join-constraint:
show
 
 


join-operator:
show
 
 



ordering-term:
show
 
 


result-column:
show
 
 


table-or-subquery:
show
 
 


window-defn:
show
 
 



type-name:
show
 
 

signed-number:
show
 
 








The ending frame boundary can be omitted (if the
BETWEEN and AND keywords that surround the starting frame boundary
are also omitted),
in which case the ending frame boundary defaults to CURRENT ROW.

 If the frame type is RANGE or GROUPS, then rows with the same values for
all ORDER BY expressions are considered "peers". Or, if there are no ORDER BY
terms, all rows are peers. Peers are always within the same frame.

The default frame-spec is:

RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS


The default means that aggregate window functions read all
rows from the beginning of the partition up to and including the
current row and its peers. This implies that rows that have the same values for
all ORDER BY expressions will also have the same value for the result of the
window function (as the window frame is the same). For example:

-- The following SELECT statement returns:
-- 
--   a | b | c | group_concat
-----------------------------
--   1 | A | one   | A.D.G       
--   2 | B | two   | A.D.G.C.F.B.E
--   3 | C | three | A.D.G.C.F   
--   4 | D | one   | A.D.G       
--   5 | E | two   | A.D.G.C.F.B.E
--   6 | F | three | A.D.G.C.F   
--   7 | G | one   | A.D.G       
-- 
SELECT a, b, c, 
       group_concat(b, '.') OVER (ORDER BY c) AS group_concat 
FROM t1 ORDER BY a;




2.2.1. Frame Type


There are three frame types:  ROWS, GROUPS, and RANGE.
The frame type determines how the starting and ending boundaries
of the frame are measured.


ROWS: 
The ROWS frame type means that the starting and ending boundaries
for the frame are determined by counting individual rows relative
to the current row.



GROUPS:
The GROUPS frame type means that the starting and ending boundaries
are determine by counting "groups" relative to the current group.
A "group" is a set of rows that all have equivalent values for all
all terms of the window ORDER BY clause.  ("Equivalent" means that
the IS operator is true when comparing the two values.)
In other words, a group consists of all peers of a row.



RANGE:
The RANGE frame type requires that the ORDER BY clause of the
window have exactly one term.  Call that term "X".  With the
RANGE frame type, the elements of the frame are determined by
computing the value of expression X for all rows in the partition
and framing those rows for which the value of X is within a certain
range of the value of X for the current row.  See the description
in the "&lt;expr&gt; PRECEDING" boundary
specification below for details.


The ROWS and GROUPS frame types are similar in that they
both determine the extent of a frame by counting relative to
the current row.  The difference is that ROWS counts individual
rows and GROUPS counts peer groups.
The RANGE frame type is different.
The RANGE frame type determines the extent of a frame by
looking for expression values that are within some band of
values relative to the current row.



2.2.2. Frame Boundaries

 There are five ways to describe starting and ending frame boundaries:


 UNBOUNDED PRECEDING
     The frame boundary is the first
     row in the partition.

 &lt;expr &gt; PRECEDING
        &lt;expr&gt; must be a non-negative constant numeric expression.
        The boundary is a row that is &lt;expr&gt; "units" prior to
        the current row.  The meaning of "units" here depends on the
        frame type:
        
         ROWS &rarr;
        The frame boundary is the row that is &lt;expr&gt;
        rows before the current row, or the first row of the
        partition if there are fewer than &lt;expr&gt; rows
        before the current row.  &lt;expr&gt; must be an integer.
         GROUPS &rarr;
        A "group" is a set of peer rows - rows that all have
        the same values for every term in the ORDER BY clause.
        The frame boundary is the group that is &lt;expr&gt;
        groups before the group containing the current row, or the
        first group of the partition if there are fewer
        than &lt;expr&gt; groups before the current row.
        For the starting boundary of a frame, the first
        row of the group is used and for the ending boundary
        of a frame, the last row of the group is used.
        &lt;expr&gt; must be an integer.
        

         RANGE &rarr;
        For this form, the ORDER BY clause of the
        window-defn must have a single
        term.  Call that ORDER BY term "X".  Let
        Xi be the value of the X
        expression for the i-th row in the partition and let
        Xc be the value of X for the
        current row.  Informally, a RANGE bound is the first row
        for which Xi is within
        the &lt;expr&gt; of Xc.
        More precisely:
        
         If either Xi or
             Xc are non-numeric, then
             the boundary is the first row for which the expression
             "Xi IS Xc"
             is true.
         Else if the ORDER BY is ASC then the boundary
             is the first row for which
             Xi&gt;=Xc-&lt;expr&gt;.
         Else if the ORDER BY is DESC then the boundary
        is the first row for which
        Xi&lt;=Xc+&lt;expr&gt;.
        
        For this form, the &lt;expr&gt; does not have to be an
        integer. It can evaluate to a real number as long as
        it is constant and non-negative.
        
    The boundary description "0 PRECEDING" always means the same
    thing as "CURRENT ROW".

CURRENT ROW
        The current row. For RANGE and GROUPS frame types,
        peers of the current row are also included in the frame,
        unless specifically excluded by the EXCLUDE clause.
        This is true regardless of whether CURRENT ROW is used
        as the starting or ending frame boundary.

&lt;expr&gt; FOLLOWING
        This is the same as "&lt;expr&gt; PRECEDING" except that
        the boundary is &lt;expr&gt; units after the current
        rather than before the current row.

 UNBOUNDED FOLLOWING
   The frame boundary is the last
   row in the partition.



 The ending frame boundary may not take a form that appears higher in
the above list than the starting frame boundary.

 In the following example, the window frame for each row consists of all
rows from the current row to the end of the set, where rows are sorted
according to "ORDER BY a".

-- The following SELECT statement returns:
-- 
--   c     | a | b | group_concat
---------------------------------
--   one   | 1 | A | A.D.G.C.F.B.E
--   one   | 4 | D | D.G.C.F.B.E 
--   one   | 7 | G | G.C.F.B.E   
--   three | 3 | C | C.F.B.E     
--   three | 6 | F | F.B.E       
--   two   | 2 | B | B.E         
--   two   | 5 | E | E           
-- 
SELECT c, a, b, group_concat(b, '.') OVER (
  ORDER BY c, a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS group_concat
FROM t1 ORDER BY c, a;



 
2.2.3. The EXCLUDE Clause

 The optional EXCLUDE clause may take any of the following four forms:


    EXCLUDE NO OTHERS: This is the default. In this case no
  rows are excluded from the window frame as defined by its starting and ending
  frame boundaries.

    EXCLUDE CURRENT ROW: In this case the current row is 
  excluded from the window frame.  Peers of the current row remain in
  the frame for th¡e GROUPS and RANGE frame types.

    EXCLUDE GROUP: In this case the current row and all other
  rows that are peers of the current row are excluded from the frame. When
  processing an EXCLUDE clause, all rows with the same ORDER BY values, or all
  rows in the partition if there is no ORDER BY clause, are considered peers,
  even if the frame type is ROWS.

    EXCLUDE TIES: In this case the current row is part of the
  frame, but peers of the current row are excluded.


 The following example demonstrates the effect of the various
forms of the EXCLUDE clause:

-- The following SELECT statement returns:
-- 
--   c    | a | b | no_others     | current_row | grp       | ties
--  one   | 1 | A | A.D.G         | D.G         |           | A
--  one   | 4 | D | A.D.G         | A.G         |           | D
--  one   | 7 | G | A.D.G         | A.D         |           | G
--  three | 3 | C | A.D.G.C.F     | A.D.G.F     | A.D.G     | A.D.G.C
--  three | 6 | F | A.D.G.C.F     | A.D.G.C     | A.D.G     | A.D.G.F
--  two   | 2 | B | A.D.G.C.F.B.E | A.D.G.C.F.E | A.D.G.C.F | A.D.G.C.F.B
--  two   | 5 | E | A.D.G.C.F.B.E | A.D.G.C.F.B | A.D.G.C.F | A.D.G.C.F.E
-- 
SELECT c, a, b,
  group_concat(b, '.') OVER (
    ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS
  ) AS no_others,
  group_concat(b, '.') OVER (
    ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW
  ) AS current_row,
  group_concat(b, '.') OVER (
    ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE GROUP
  ) AS grp,
  group_concat(b, '.') OVER (
    ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES
  ) AS ties
FROM t1 ORDER BY c, a;


2.3. The FILTER Clause

filter-clause:
hide
 
 

expr:
show
 
 

literal-value:
show
 
 


over-clause:
show
 
 

frame-spec:
show
 
 


ordering-term:
show
 
 



raise-function:
show
 
 


select-stmt:
show
 
 

common-table-expression:
show
 
 


compound-operator:
show
 
 


join-clause:
show
 
 

join-constraint:
show
 
 


join-operator:
show
 
 



ordering-term:
show
 
 


result-column:
show
 
 


table-or-subquery:
show
 
 


window-defn:
show
 
 

frame-spec:
show
 
 




type-name:
show
 
 

signed-number:
show
 
 







If a FILTER clause is provided, then only rows for which the expr is
true are included in the window frame. The aggregate window still returns a
value for every row, but those for which the FILTER expression evaluates to
other than true are not included in the window frame for any row. For example:

-- The following SELECT statement returns:
-- 
--   c     | a | b | group_concat
---------------------------------
--   one   | 1 | A | A           
--   two   | 2 | B | A           
--   three | 3 | C | A.C         
--   one   | 4 | D | A.C.D       
--   two   | 5 | E | A.C.D       
--   three | 6 | F | A.C.D.F     
--   one   | 7 | G | A.C.D.F.G   
-- 
SELECT c, a, b, group_concat(b, '.') FILTER (WHERE c!='two') OVER (
  ORDER BY a
) AS group_concat
FROM t1 ORDER BY a;





3. Built-in Window Functions

 As well as aggregate window functions, SQLite features a set of built-in
window functions based on 

those supported by PostgreSQL.

 Built-in window functions honor any PARTITION BY clause in the same way
as aggregate window functions - each selected row is assigned to a partition 
and each partition is processed separately. The ways in which any ORDER BY
clause affects each built-in window function is described below. Some of
the window functions (rank(), dense_rank(), percent_rank() and ntile()) use
the concept of "peer groups" (rows within the same partition that have the
same values for all ORDER BY expressions). In these cases, it does not matter
whether the frame-spec specifies ROWS, GROUPS, or RANGE.
For the purposes of built-in window function processing, rows with the same values
for all ORDER BY expressions are considered peers regardless of the frame type.

 Most built-in window functions ignore the
frame-spec, the exceptions being first_value(),
last_value() and nth_value(). It is a syntax e¢rror to specify a FILTER 
clause as part of a built-in window function invocation.



 SQLite supports the following 11 built-in window functions:


  row_number()
   The number of the row within the current partition. Rows are
       numbered starting from 1 in the order defined by the ORDER BY clause in
       the window definition, or in arbitrary order otherwise.
  rank()
   The row_number() of the first peer in each group - the rank of the
       current row with gaps. If there is no ORDER BY clause, then all rows
       are considered peers and this function always returns 1.
  dense_rank()
   The number of the current row's peer group within its partition - the
       rank of the current row without gaps. Rows are numbered starting
       from 1 in the order defined by the ORDER BY clause in the window
       definition. If there is no ORDER BY clause, then all rows are
       considered peers and this function always returns 1.
  percent_rank()
   Despite the name, this function always returns a value between 0.0
       and 1.0 equal to (rank - 1)/(partition-rows - 1), where
       rank is the value returned by built-in window function rank()
       and partition-rows is the total number of rows in the
       partition. If the partition contains only one row, this function
       returns 0.0.
  cume_dist()
   The cumulative distribution. Calculated as
       row-number/partition-rows, where row-number is
       the value returned by row_number() for the last peer in the group
       and partition-rows the number of rows in the partition.
  ntile(N)
   Argument N is handled as an integer. This function divides the
       partition into N groups as evenly as possible and assigns an integer
       between 1 and N to each group, in the order defined by the ORDER
       BY clause, or in arbitrary order otherwise. If necessary, larger groups
       occur first. This function returns the integer value assigned to the
       group that the current row is a part of.

  lag(expr)lag(expr, offset)lag(expr, offset, default)
   The first form of the lag() function returns the result of evaluating
       expression expr against the previous row in the partition. Or, if
       there is no previous row (because the current row is the first), NULL.

       If the offset argument is provided, then it must be a
       non-negative integer. In this case the value returned is the result
       of evaluating expr against the row offset rows before the
       current row within the partition. If offset is 0, then
       expr is evaluated against the current row. If there is no row
       offset rows before the current row, NULL is returned.

       If default is also provided, then it is returned instead of
      NULL if the row identified by offset does not exist.
       
  lead(expr)lead(expr, offset)lead(expr, offset, default)
   The first form of the lead() function returns the result of evaluating
       expression expr against the next row in the partition. Or, if
       there is no next row (because the current row is the last), NULL.

       If the offset argument is provided, then it must be a
       non-negative integer. In this case the value returned is the result
       of evaluating expr against the row offset rows after the
       current row within the partition. If offset is 0, then
       expr is evaluated against the current row. If there is no row
       offset rows after the current row, NULL is returned.

       If default is also provided, then it is returned instead of
      NULL if the row identified by offset does not exist.
  first_value(expr)
   This built-in window function calculates the window frame for each
       row in the same way as an aggregate window function. It returns the
       value of expr evaluated against the first row in the window frame
       for each row.
  last_value(expr)
   This built-in window function calculates the window frame for each
       row in the same way as an aggregate window function. It returns the
       value of expr evaluated against the last row in the window f£rame
       for each row.
  nth_value(expr, N)
   This built-in window function calculates the window frame for each
       row in the same way as an aggregate window function. It returns the
       value of expr evaluated against the row N of the window
       frame. Rows are numbered within the window frame starting from 1 in
       the order defined by the ORDER BY clause if one is present, or in
       arbitrary order otherwise. If there is no Nth row in the
       partition, then NULL is returned.
  


The examples in this section use the
previously defined T1 table
as well as the following T2 table:

CREATE TABLE t2(a, b);
INSERT INTO t2 VALUES('a', 'one'), 
                     ('a', 'two'), 
                     ('a', 'three'), 
                     ('b', 'four'), 
                     ('c', 'five'), 
                     ('c', 'six');


The following example illustrates the behaviour of the five ranking
functions - row_number(), rank(), dense_rank(), percent_rank() and 
cume_dist().

-- The following SELECT statement returns:
-- 
--   a | row_number | rank | dense_rank | percent_rank | cume_dist
------------------------------------------------------------------
--   a |          1 |    1 |          1 |          0.0 |       0.5
--   a |          2 |    1 |          1 |          0.0 |       0.5
--   a |          3 |    1 |          1 |          0.0 |       0.5
--   b |          4 |    4 |          2 |          0.6 |       0.66
--   c |          5 |    5 |          3 |          0.8 |       1.0
--   c |          6 |    5 |          3 |          0.8 |       1.0
-- 
SELECT a                        AS a,
       row_number() OVER win    AS row_number,
       rank() OVER win          AS rank,
       dense_rank() OVER win    AS dense_rank,
       percent_rank() OVER win  AS percent_rank,
       cume_dist() OVER win     AS cume_dist
FROM t2
WINDOW win AS (ORDER BY a);


The example below uses ntile() to divide the six rows into two groups (the
ntile(2) call) and into four groups (the ntile(4) call). For ntile(2), there
are three rows assigned to each group. For ntile(4), there are two groups of
two and two groups of one. The larger groups of two appear first.

-- The following SELECT statement returns:
-- 
--   a | b     | ntile_2 | ntile_4
----------------------------------
--   a | one   |       1 |       1
--   a | two   |       1 |       1
--   a | three |       1 |       2
--   b | four  |       2 |       2
--   c | five  |       2 |       3
--   c | six   |       2 |       4
-- 
SELECT a                        AS a,
       b                        AS b,
       ntile(2) OVER win        AS ntile_2,
       ntile(4) OVER win        AS ntile_4
FROM t2
WINDOW win AS (ORDER BY a);


 The next example demonstrates lag(), lead(), first_value(), last_value()
and nth_value(). The frame-spec is ignored by 
both lag() and lead(), but respected by first_value(), last_value()
and nth_value().

-- The following SELECT statement returns:
-- 
--   b | lead | lag  | first_value | last_value | nth_value_3
-------------------------------------------------------------
--   A | C    | NULL | A           | A          | NULL       
--   B | D    | A    | A           | B          | NULL       
--   C | E    | B    | A           | C          | C          
--   D | F    | C    | A           | D          | C          
--   E | G    | D    | A           | E          | C          
--   F | n/a  | E    | A           | F          | C          
--   G | n/a  | F    | A           | G          | C          
-- 
SELECT b                          AS b,
       lead(b, 2, 'n/a') OVER win AS lead,
       lag(b) OVER win            AS lag,
       first_value(b) OVER win    AS first_value,
       last_value(b) OVER win     AS last_value,
       nth_value(b, 3) OVER win   AS nth_value_3
FROM t1
WINDOW win AS (ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)





4. Window Chaining


Window chaining is a shorthand that allows one window to be defined in terms 
of another. Specifically, the shorthand allows the new window to implicitly
copy the P¤ARTITION BY and optionally ORDER BY clauses of the base window. For
example, in the following:

SELECT group_concat(b, '.') OVER (
  win ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
FROM t1
WINDOW win AS (PARTITION BY a ORDER BY c)



the window used by the group_concat() function is equivalent
to "PARTITION BY a ORDER BY c ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW". In order to use window
chaining, all of the following must be true:


  The new window definition must not include a PARTITION BY clause. The
       PARTITION BY clause, if there is one, must be supplied by the base
       window specification.

  If the base window has an ORDER BY clause, it is copied into the new
       window. In this case the new window must not specify an ORDER BY clause.
       If the base window has no ORDER BY clause, one may be specified as part
       of the new window definition.
  
  The base window may not specify a frame specification.  The frame
      specification can only be given in the new window specification.


The two fragments of SQL below are similar, but not entirely equivalent, as
the latter will fail if the definition of window "win" contains a frame
specification.

SELECT group_concat(b, '.') OVER win ...
SELECT group_concat(b, '.') OVER (win) ...




5. User-Defined Aggregate Window Functions

 User-defined aggregate window functions may be created using the
sqlite3_create_window_function() API. Implementing an aggregate window
function is very similar to an ordinary aggregate function. Any user-defined
aggregate window function may also be used as an ordinary aggregate. To 
implement a user-defined aggregate window function the application must
supply four callback functions:


Callback Description
xStep 
      This method is required by both window aggregate and legacy aggregate
      function implementations. It is invoked to add a row to the current
      window. The function arguments, if any, corresponding to the row being
      added are passed to the implementation of xStep.

xFinal 
      This method is required by both window aggregate and legacy aggregate
      function implementations. It is invoked to return the current value
      of the aggregate (determined by the contents of the current window),
      and to free any resources allocated by earlier calls to xStep.

xValue 
      This method is  only required for window aggregate functions.  The presence
      of this method is what distinguishes a window aggregate function from a
      legacy  aggregate function.  This method is invoked to return the current
      value of the aggregate. Unlike xFinal, the implementation should not
      delete any context.

xInverse 
      This method is only required for window aggregate functions, not legacy
      aggregate function implementations. It is invoked to remove the oldest
      presently aggregated result of xStep from the current window.
      The function arguments, if any, are those
      passed to xStep for the row being removed.


 The C code below implements a simple window aggregate function named
sumint(). This works in the same way as the built-in sum() function, except
that it throws an exception if passed an argument that is not an integer
value.


/*
** xStep for sumint().
**
** Add the value of the argument to the aggregate context (an integer).
*/
static void sumintStep(
  sqlite3_context *ctx, 
  int nArg, 
  sqlite3_value *apArg[]
){
  sqlite3_int64 *pInt;

  assert( nArg==1 );
  if( sqlite3_value_type(apArg[0])!=SQLITE_INTEGER ){
    sqlite3_result_error(ctx, "invalid argument", -1);
    return;
  }
  pInt = (sqlite3_int64*)sqlite3_aggregate_context(ctx, sizeof(sqlite3_int64));
  if( pInt ){
    *pInt += sqlite3_value_int64(apArg[0]);
  }
}

/*
** xInverse for sumint().
**
** This does the opposite of xStep() - subtracts the value of the argument
** from the current context value. The error checking can be omitted from
** this function, as it is only ever called after xStep() (so the aggregate
** context has already been allocated) and with a value that has already
** been passed to xStep() without error (so it must be an integer).
*/
static void sumintInverse(
  sqlite3_context *ctx, 
  int nArg, 
  sqlite3_value *apArg[]
){
  sqlite3_int64 *pInt;
  assert( sqlite3_value_type(apArg[0])==SQLITE_INTEGER );
  pInt = (sqlite3_int64*)sqlite3_aggregate_context(ctx, sizeof(sqlite3_int64));
  *pInt -= sqlite3_value_int64(apArg[0]);
}

/*
** xFinal for sumint().
**
** Return the current value of the aggregate window function. Because
** this implementation does not allocate any resources beyond the buffer
** returned by sqlite3_aggregate_context, which is automatically freed
** by the system, there are no resources to free. And so this method is
** identical to xValue().
*/
static void sumintFinal(sqlite3_context *ctx){
  sqlite3_int64 res = 0;
  sqlite3_int64 *pInt;
  pInt = (sqlite3_int64*)sqlite3_aggregate_context(ctx, 0);
  if( pInt ) res = *pInt;
  sqlite3_result_int64(ctx, res);
}

/*
** xValue for sumint().
**
** Return the current value of the aggregate window function.
*/
static void sumintValue(sqlite3_context *ctx){
  sqlite3_int64 res = 0;
  sqlite3_int64 *pInt;
  pInt = (sqlite3_int64*)sqlite3_aggregate_context(ctx, 0);
  if( pInt ) res = *pInt;
  sqlite3_result_int64(ctx, res);
}

/*
** Register sumint() window aggregate with database handle db. 
*/
int register_sumint(sqlite3 *db){
  return sqlite3_create_window_function(db, "sumint", 1, SQLITE_UTF8, 0,
      sumintStep, sumintFinal, sumintValue, sumintInverse, 0
  );
}




 The following example uses the sumint() function implemented by the above
C code. For each row, the window consists of the preceding row (if any), the current row and the following row (again, if any):

CREATE TABLE t3(x, y);
INSERT INTO t3 VALUES('a', 4),
                     ('b', 5),
                     ('c', 3),
                     ('d', 8),
                     ('e', 1);

-- Assuming the database is populated using the above script, the 
-- following SELECT statement returns:
-- 
--   x | sum_y
--------------
--   a | 9    
--   b | 12   
--   c | 16   
--   d | 12   
--   e | 9    
-- 
SELECT x, sumint(y) OVER (
  ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) AS sum_y
FROM t3 ORDER BY x;


In processing the query above, SQLite invokes the sumint callbacks as
follows:



   xStep(4) - add "4" to the current window.
   xStep(5) - add "5" to the current window.
   xValue() - invoke xValue() to obtain the value of sumint() for
       the row with (x='a'). The window currently consists of values 4 and 5, 
       and so the result is 9.
   xStep(3) - add "3" to the current window.
   xValue() - invoke xValue() to obtain the value of sumint() for
       the row with (x='b'). The window currently consists of values 4, 5 and
       3, and so the result is 12.
   xInverse(4) - remove "4" from the window. 
   xStep(8) - add "8" to the current window. The window now consists
       of values 5, 3 and 8.
   xValue() - invoked to obtain the value for the row with (x='c').
       In this case, 16.
   xInverse(5) - remove value "5" from the window.
   xStep(1) - add value "1" to the window.
   xValue() - invoked to obtain the value for row (x='d').
   xInverse(3) - remove value "3" from the window. The window now
       contains values 8 and 1 only.
   xValue() - invoked to obtain the value for row (x='e'). 9.
   xFinal() - invoked to reclaim any allocated resources.


6. History

Window function support was first added to SQLite with release
version 3.25.0 (2018-09-15). The SQLite developers used
the PostgreSQL window function
documentation as their primary reference for how window functions
ought to behave.  Many test cases have been run against PostgreSQL
to ensure that window functions operate the same way in both
SQLite and PostgreSQL.

In SQLite version 3.28.0 (2019-04-16),
windows function support was extended to include the EXCLUDE clause,
GROUPS frame types, window chaining, and support for
"&lt;expr&gt; PRECEDING" and "&lt;expr&gt; FOLLOWING" boundaries
in RANGE frames.
This page last modified on  2022-08-09 12:51:29 UTCwindowfunctions.html
ÛÛ‚—|‚U
-„¯)5Window Functions1. Introduction to Window Functions

A window function is an SQL function where the input
values are taken from
a "window" of one or more rows in the results set of a SELECT statement.

Window functions are distinguished from other SQL functions by the
presence of an OVER clause. If a function has an OVER clause,
then it is a window function. If it lacks an OVER clause, then it is an
ordinary aggregate or scalar function. Window functions might also
have a FILTER clause in between the function and the OVER clause.

The syntax for a window function is like this:


window-function-invocation:
hide
 
 

expr:
show
 
 

literal-value:
show
 
 


over-clause:
show
 
 

frame-spec:
hide
 
 


ordering-term:
show
 
 



raise-function:
show
 
 


select-stmt:
show
 
 

common-table-expression:
show
 
 


compound-operator:
show
 
 


join-clause:
show
 
 

join-constraint:
show
 
 


join-operator:
show
 
 



ordering-term:
show
 
 


result-column:
show
 
 


table-or-subquery:
show
 
 



type-name:
show
 
 

signed-number:
show
 
 




filter-clause:
hide
 
 


window-defn:
hide
 
 

frame-spec:
hide
 
 


ordering-term:
show
 
 







Unlike ordinary functions, window functions
cannot use the DISTINCT keyword.
Also, Window functions may only appear in the result set and in the
ORDER BY clause of a SELECT statement.

Window functions come in two varieties: 
aggregate window functions and
built-in window functions.  Every aggregate window function
can also work as a ordinary aggregate function, simply by omitting
the OVER and FILTER clauses.  Furthermore, all of the built-in
aggregate functions of SQLite can be used as an
aggregate window function by adding an appropriate OVER clause.
Applications can register new aggregate window functions using
the sqlite3_create_window_function() interface.
The built-in window functions, however, require special-case
handling in the query planner and hence new window functions
that exhibit the exceptional properties found in the built-in
window functions cannot be added by the application.

Here is an example using the built-in row_number()
window function:

CREATE TABLE t0(x INTEGER PRIMARY KEY, y TEXT);
INSERT INTO t0 VALUES (1, 'aaa'), (2, 'ccc'), (3, 'bbb');

-- The following SELECT statement returns:
-- 
--   x | y | row_number
-----------------------
--   1 | aaa | 1         
--   2 | ccc | 3         
--   3 | bbb | 2         
-- 
SELECT x, y, row_number() OVER (ORDER BY y) AS row_number FROM t0 ORDER BY x;



The row_number() window function
assigns consecutive integers to each
row in order of the "ORDER BY" clause within the
window-defn (in this case "ORDER BY y"). Note that 
this does not affect the order in which results are returned from
the overall query.  The order of the final output is
still governed by the ORDER BY clause attached to the SELECT
statement (in this case "ORDER BY x").

Named window-defn clauses may also be added to a SELECT 
statement using a WINDOW clause and then referred to by name within window
function invocations. For example, the following SELECT s§ actually encounter this problem, running REINDEX on the
   damaged indexes will clear it.
2015-05-09 - Release 3.8.10.1
The 3.8.10 release did not add the new SQLITE_ENABLE_DBSTAT_VTAB
   compile-time option to the sqlite3_compileoption_used() interface.
   This patch release fixes that omission.  And while we are at it,
   the associated dbstat virtual table was enhanced slightly and a
   harmless compiler warning was fixed.

   There is no reason to upgrade from version 3.8.10 unless you are
   using the new SQLITE_ENABLE_DBSTAT_VTAB compile-time option.
2015-05-07 - Release 3.8.10
SQLite version 3.8.10 is a regularly scheduled maintenance release.
   This release features performance improvements, fixes to several
   arcane bugs found by the AFL fuzzer, the new "sqldiff.exe" command-line
   utility, improvements to the documentation, and other enhancements.
   See the release notes for 
   additional information.
2015-04-08 - Release 3.8.9
SQLite version 3.8.9 is a regularly scheduled maintenance release.
   New features in this release include the 
   PRAGMA index_xinfo command, the sqlite3_status64() interface,
   and the ".dbinfo" command of the command-line shell.
   See the release notes for
   additional information.
2015-02-25 - Release 3.8.8.3
The 3.8.8.3 patch release fixes an obscure problem in the SQLite code
   generator that can cause incorrect results when the qualifying expression
   of a partial index is used inside the ON clause of a LEFT JOIN.
   This problem has been in the code since support for partial indexes
   was first added in version 3.8.0.  However, it is difficult to imagine
   a valid reason to every put the qualifying constraint inside the ON
   clause of a LEFT JOIN, and so this issue has never come up before.

Any applications that is vulnerable to this bug would have encountered
   problems already.  Hence, upgrading from the previous release is optional.
2015-01-30 - Release 3.8.8.2
The 3.8.8.2 patch release fixes a single minor problem:  It ensures
   that the sqlite3_wal_checkpoint(TRUNCATE) operation will always truncate
   the write-ahead log even if log had already been reset and contained
   no new content.  It is unclear if this is a bug fix or a new feature.

Something like this would normally go into the next regularly scheduled
   release, but a prominent SQLite user needed the change in a hurry so
   we were happy to rush it out via this patch.

There is no reason to upgrade unless you actually need the enhanced
   behavior of sqlite3_wal_checkpoint(TRUNCATE).
2015-01-20 - Release 3.8.8.1
Within hours of releasing version 3.8.8, a bug was reported against
   the 10-month-old 3.8.4 release.  As that bug exists in all subsequent
   releases, the decision was made to issue a small patch to the
   3.8.8 before it came into widespread use.

See ticket
   f97c4637102a3ae72b7911
   for a description of the bug.

The changes between versions 3.8.8 and 3.8.8.1 are minimal.
2015-01-16 - Release 3.8.8
SQLite version 3.8.8 is a regularly schedule maintenance release of
   SQLite.

There are no dramatic new features or performance enhancements in this
   release, merely incremental improvements.  Most of the performance gain
   in this release comes from refactoring the B-Tree rebalancing logic to
   avoid unnecessary memcpy() operations.  New features include the
   PRAGMA data_version statement and the ability to accept a
   VALUES clause with no arbitrary limit on the number of rows.
   Several obscure bugs have been fixed, including some multithreading
   races and a work-around for a compiler bug on some Macs.

See the change log for a longer list of
   enhancements and bug fixes.
2014-12-09 - Release 3.8.7.4
SQLite version 3.8.7.4 an unscheduled bug-fix release.  Changes from
   the previous release and from version 3.8.7 are minimal.

This release fixes adds in a mutex that is required by the changes of
   the 3.8.7.3 patch but was accidentally omitted.  The mutex was not required
   by any of the internal SQLite tests, but Firefox crashes without it.
   Test cases have bee¨n added to ensure that mutex is never again missed.
2014-12-06 - Release 3.8.7.3
SQLite version 3.8.7.3 an unscheduled bug-fix release.  Changes from
   the previous release and from version 3.8.7 are minimal.

This release fixes two obscure bugs that can result in incorrect
   query results and/or application crashes, but not (as far as we can
   tell) security vulnerabilities.  Both bugs have been latent in the
   code across multiple prior releases and have never before been encountered,
   so they are unlikely to cause problems.  Nevertheless
   it seems prudent to publish fixes for them both.  See the
   change log for details.
2014-11-19 - Release 3.8.7.2
SQLite version 3.8.7.2 is a patch and bug-fix release.  Changes from
   the previous release are minimal.

The primary reason for this release is to enhance the ROLLBACK command
   so that it allows running queries on the same database connection to 
   continue running as long as the ROLLBACK does not change the schema.
   In all previous versions of SQLite, a ROLLBACK would cause pending
   queries to stop immediately and return SQLITE_ABORT or
   SQLITE_ABORT_ROLLBACK. Pending queries still abort if the ROLLBACK
   changes the database schema, but as of this patch release, the queries
   are allowed to continue running if the schema is unmodified.

In addition to the ROLLBACK enhancement, this patch release also
   includes fixes for three obscure bugs.  See the 
   change log for details.
2014-10-30 - Release 3.8.7.1
SQLite version 3.8.7.1 is a bug-fix release.

The primary reason for this bug-fix release is to address a problem with
   updating the value of fields at the end of a table that were added
   using ALTER TABLE ADD COLUMN.  This problem
   1 first appeared in the
   3.8.7 release.

Another minor annoyance in the 3.8.7 release was the fact that the
   Android build tried to use the strchrnul() function from the standard
   C library but that function is not available on Android.  Android builds
   had to add -DHAVE_STRCHRNUL=0 to work around the problem.  This patch
   fixes that so that Android builds should now work without any changes.

The operation of PRAGMA journal_mode=TRUNCATE has been enhanced so that
   it invokes fsync() after truncating the journal file when
   PRAGMA synchronous=FULL.  This helps to preserve transaction durability
   in the case of a power loss occurring shortly after commit.

Finally, a couple of long-standing and obscure problems associated with run
   UPDATE and DELETE on VIEWs were fixed.

The changes from 3.8.7 are minimal.
2014-10-17 - Release 3.8.7
SQLite version 3.8.7 is a regularly scheduled maintenance release.
   Upgrading from all prior versions is recommended.

Most of the changes from the previous release have been micro-optimizations
   designed to help SQLite run a little faster.  Each individual optimization
   has an unmeasurably small performance impact.  But the improvements add up.
   Measured on a well-defined workload (which the SQLite developers use
   as a proxy for a typical application workload) using cachegrind on Linux
   and compiled with gcc 4.8.1 and -Os on x64 linux, the current release 
   does over 20% more work for the same number of CPU cycles compared to the
   previous release.  Cachegrind is not a real CPU, and the workload
   used for measurement is only a proxy.  So your performance may vary.
   We expect to see about half the measured and reported improvement in
   real-world applications. 10% is less than 20% but it is still pretty
   good, we think.

This release includes a new set of C-language interfaces that have
   unsigned 64-bit instead of signed 32-bit length parameters.  The new
   APIs do not provide any new capabilities.  But they do make it easier
   to write applications that are more resistant to integer overflow
   vulnerabilities.

This release also includes a new sorter that is able to use multiple
   threads to help with large sort operations.  (Sort operations are
   sometimes required to implement ORDER BY and/or GROUP BY clauses and
   are almost alway©s required for CREATE INDEX.)  The multi-threads sorter
   is turned off by default and must be enabled using the
   PRAGMA threads SQL command.  Note that the multi-threaded sorter
   provides faster real-time performance for large sorts, but it also
   uses more CPU cycles and more energy.
2014-08-15 - Release 3.8.6
SQLite version 3.8.6 is a regularly scheduled maintenance release.
   Upgrading from all previous versions is recommended.

This release contains the usual assortment of obscure bug fixes.
   One bug, however, deserves special attention.
   A problem appeared in the CREATE INDEX command beginning with
   version 3.8.2 (2013-12-06) that allowed, under some circumstances,
   a UNIQUE index to be created on a column that was not unique.  Once
   the index was created, no new non-unique entries could be inserted, but
   preexisting non-unique entries would remain.  See ticket
   9a6daf340df99ba93c
   for further information.  In addition to fixing this bug, the
   PRAGMA integrity_check command has been enhanced to detect
   non-uniqueness in UNIQUE indices, so that if this bug did introduce
   any problems in databases, those problems can be easily detected.

Other noteworthy changes include the addition of support for
   hexadecimal integers (ex: 0x1234), and performance enhancements
   to the IN operator which, according to 
   mailing list reports,
   help some queries run up to five times faster.

Version 3.8.6 uses 25% fewer CPU cycles than version 3.8.0 from
   approximately one year ago, according to valgrind
   and the
   test/speedtest1.c
   test program.
   On the other hand,
   the compiled binary for version 3.8.6 is about 5% larger than 3.8.0.
   The size increase is 
   due in part to the addition of new features such as WITHOUT ROWID
   tables and common table expressions.
2014-06-04 - Release 3.8.5
SQLite version 3.8.5 is a regularly scheduled maintenance release.
   Upgrading from the previous version is recommended.

Version 3.8.5 fixes more than a dozen obscure bugs.  None of these
   bugs should be a problem for existing applications.  Nor do any of
   the bugs represent a security vulnerability.  Nevertheless, upgrading
   is recommended to prevent future problems.

In addition to bug fixes, the 3.8.5 release adds improvements to the
   query planner, especially regarding sorting using indices and handling 
   OR terms
   in the WHERE clause for WITHOUT ROWID tables.  The ".system" and
   ".once" dot-commands were added to the command-line interface.  And
   there were enhancements to the FTS4 and RTREE virtual tables.  See
   the change log for details.
2014-04-03 - Release 3.8.4.3
The optimizations added in version 3.8.4 caused some queries that involve
   subqueries in the FROM clause, DISTINCT, and ORDER BY clauses, to give an incorrect
   result.  See
   ticket 98825a79ce145
   for details.
   This release adds a 
   one-character change
   to a single line of code to fix the problem.
2014-03-26 - Release 3.8.4.2
The code changes that resulted in the performance improvements
   in version 3.8.4 missed a single buffer overflow test, which could
   result in a read past the end of a buffer while searching a database
   that is corrupted in a particular way.  Version 3.8.4.2 fixes that
   problem using a
   one-line patch.

We are not aware of any problems in version 3.8.4
   when working with well-formed database files.  The problem fixed by this
   release only comes up when reading corrupt database files.
2014-03-11 - Release 3.8.4.1
SQLite version 3.8.4.1 is a patch against version 3.8.4 that fixes
   two minor issues:

 Work around a C-preprocessor macro conflict that causes compilation
     problems for some configurations of Visual Studio.
 Adjust the cost computation for the skip-scan optimization for
     improved performance.

Both of these issues came to light within minutes of tagging the previous
release.  Neither issue is serious but they can be annoying.  Hence, the
decision was made to do a quick patch release to address both issues.
2014-03-10 - Release 3.8.4
SQLite ªversion 3.8.4 is a maintenance release featuring performance
   enhancements and fixes for a number of obscure bugs.
   There are no significant new features in SQLite version 3.8.4.
   However, the number of CPU cycles (measured by valgrind) needed to 
   do many common operations has be reduced by about 12% relative to the
   previous release, and by about 25% relative to version 3.7.16
   from approximately one year ago.

Version 3.8.4 of SQLite fixes several corner-case bugs that were
   found since the previous release.  These bugs were unlikely to appear
   in practice, and none represent a security vulnerability. 
   Nevertheless, developers are encouraged to upgrade from all prior releases.
2014-02-11 - Release 3.8.3.1
SQLite version 3.8.3.1 fixes a bug present in versions 3.8.1,
   3.8.2 and 3.8.3 that can cause queries to omit valid output rows.
   Upgrading from those versions is recommended.

The problem only comes up if SQLite is compiled with either the
   SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4 compile-time options.
   In that case, if a query has a WHERE clause that contains expressions
   like this:
   
WHERE (expr1 OR expr2 OR ... OR exprN) AND column IS NOT NULL
   
   Where all of expr1 through exprN are suitable for use by indexes,
   then during query planning SQLite might mistakenly converted
   the "column IS NOT NULL" term into "column>NULL".  But the latter
   term is never true, and so the query would return no rows.

The trouble ticket for this bug is
   &#91;4c86b126f2&#93;.
   It is recommended that all users upgrade to avoid this problem.
2014-02-03 - Release 3.8.3
  SQLite version 3.8.3 is a regularly scheduled maintenance release.
  Upgrading from the previous release is optional.

  The most visible change in version 3.8.3 is the addition of
  support for common table expressions.  It is now possible to write a
  single SELECT statement that will query a tree or graph, using either
  a depth-first or a breadth-first search.  A single SQLite query will 
  even solve Sudoku puzzles or compute the Mandelbrot set.  As part
  of this change, SQLite now accepts a VALUES clause anyplace that
  a SELECT statement is valid.

  This release also includes many small performance enhancements which
  should give a small speed boost to legacy applications.  And there are
  other minor enhancements such as the addition of the printf() SQL
  function.  See the change log for details.
2013-12-06 - Release 3.8.2
  SQLite version 3.8.2 is a regularly scheduled maintenance release.
  Upgrading from the previous release is optional.

  Version 3.8.2 adds support for WITHOUT ROWID tables.  This is a
  significant extension to SQLite.  Database files that contain WITHOUT ROWID
  tables are not readable or writable by prior versions of SQLite, however
  databases that do not use WITHOUT ROWID tables are fully backwards 
  and forwards compatible.

  The 3.8.2 release contains a potentially incompatible change.  In
  all prior versions of SQLite, a cast from a very large positive 
  floating point number into an integer resulted in the most negative integer.
  In other words, CAST(+99.9e99 to INT) would yield -9223372036854775808.
  This behavior came about because it is what x86/x64 hardware does 
  for the equivalent cast in the C language.  But the behavior is
  bizarre.  And so it has been changed effective with this release so that
  a cast from a floating point number into an integer returns the integer
  between the floating point value and zero that is closest to the floating
  point value.  Hence, CAST(+99.9e99 to INT) now returns +9223372036854775807.
  Since routines like sqlite3_column_int64() do an implicit cast if the
  value being accessed is really a floating point number, they are also
  affected by this change.

  Besides the two changes mentioned above, the 3.8.2 release also 
  includes a number of performance enhancements.  The
  skip-scan optimization is now available for databases that have been
  processed by ANALYZE.  Constant SQL functions are now factored out of
  inner loops, w«hich can result in a significant speedup for queries that
  contain WHERE clause terms like "date>datetime('now','-2 days')".  And
  various high-runner internal routines have been refactored for reduced
  CPU load.
2013-10-17 - Release 3.8.1
  SQLite version 3.8.1 is a regularly scheduled maintenance release.
  Upgrading from the previous release is optional, though you should upgrade
  if you are using partial indices as there was a 
  bug related to partial
  indices in the previous release that could result in an incorrect answer
  for count(*) queries.

  The next generation query planner that was premiered in the previous
  release continues to work well.  
  The new query planner has been tweaked slightly
  in the current release to help it make better decisions in some
  cases, but is largely unchanged.  Two new SQL functions, likelihood() and
  unlikely(), have been added to allow developers to give hints to the
  query planner without forcing the query planner into a particular decision.

  Version 3.8.1 is the first SQLite release to take into account the
  estimated size of table and index rows when choosing a query plan.
  Row size estimates are based on the declared datatypes of columns.
  For example, a column of type VARCHAR(1000) is assumed
  to use much more space than a column of type INT.  The datatype-based
  row size estimate can be
  overridden by appending a term of the form "sz=NNN" (where NNN is the
  average row size in bytes) to the end of the sqlite_stat1.stat
  record for a table or index.  Currently, row sizes are only used to help the
  query planner choose between a table or one of its indices when doing a
  table scan or a count(*) operation, though future releases are likely
  to use the estimated row size in other contexts as well.  The new
  PRAGMA stats statement can be used to view row size estimates.

  Version 3.8.1 adds the SQLITE_ENABLE_STAT4 compile-time option.
  STAT4 is very similar to STAT3 in that it uses samples from indices to 
  try to guess how many rows of the index will be satisfy by WHERE clause
  constraints.  The difference is that STAT4 samples all columns of the
  index whereas the older STAT3 only sampled the left-most column.  Users
  of STAT3 are encouraged to upgrade to STAT4.  Application developers should
  use STAT3 and STAT4 with caution since both options, by design, violate 
  the query planner stability guarantee, making it more difficult to ensure
  uniform performance is widely-deployed and mass-produced embedded
  applications.
2013-09-03 - Release 3.8.0.2
  SQLite version 3.8.0.2 contains a one-line fix to a bug in the
  new optimization that tries to omit unused LEFT JOINs from a query.
2013-08-29 - Release 3.8.0.1
  SQLite version 3.8.0.1 fixes some obscure bugs that were uncovered by
  users in the 3.8.0 release.  Changes from 3.8.0 are minimal.
2013-08-26 - Release 3.8.0
  Do not fear the zero!

  SQLite version 3.8.0 might easily have been called "3.7.18" instead.
  However, this release features the cutover of the
  next generation query planner or NGQP, and there is a small chance of
  breaking legacy programs that
  rely on undefined behavior in previous SQLite releases, and so the
  minor version number was incremented for that reason.
  But the risks are low and there is a query planner checklist is 
  available to application developers to aid in avoiding problems.

  SQLite version 3.8.0 is actually one of the most heavily tested
  SQLite releases ever.  Thousands and thousands of beta copies have
  be downloaded, and presumably tested, and there have been no problem
  reports.

  In addition to the next generation query planner, the 3.8.0 release
  adds support for partial indices, as well as several other new features.
  See the change log for further detail.
2013-05-20 - Release 3.7.17
  SQLite version 3.7.17 is a regularly schedule maintenance release.
  Visit the change log for a full explanation of the
  changes in this release.

  There are many bug fixes in version 3.7.17.  But this does not indicate
  that 3.7.16 was a pro¬blematic release.  All of the bugs in 3.7.17 are 
  obscure and are unlikely to impact any particular application.  And most 
  of the bugs that are fixed in 3.7.17 predate 3.7.16 and have been in 
  the code for years without ever before being noticed.
  Nevertheless, due to the large number of fixes,
  all users are encouraged to upgrade when possible.
2013-04-12 - Release 3.7.16.2
  SQLite version 3.7.16.2 fixes a long-standing flaw in the Windows
  OS interface that
  can result in database corruption under a rare race condition.
  See http://www.sqlite.org/src/info/7ff3120e4f for a full description
  of the problem.

  As far as we know, this bug has never been seen in the wild.  The
  problem was discovered by the SQLite developers while writing stress tests
  for a separate component of SQLite.  Those stress tests have not yet
  found any problems with the component they were intended to verify, but 
  they did find the bug which is the subject of this patch release.

  Other than updates to version numbers, the only difference between this
  release and 3.7.16.1 is a two-character change in a single identifier,
  which is contained in the windows-specific OS interface logic.  There 
  are no changes in this release (other than version numbers) for platforms
  other than Windows.
2013-03-29 - Release 3.7.16.1
  SQLite version 3.7.16.1 is a bug fix release that fixes a few problems
  that were present in the previous releases.

  The primary motivation for version 3.7.16.1 is to fix a bug in the
  query optimizer that was introduced as part of version 3.7.15.  The
  query optimizer was being a little overzealous in optimizing out some
  ORDER BY clauses, which resulted in sorting being omitted on occasions
  where sorting is required to get the correct answer.  See
  ticket a179fe7465 for
  details.

  In addition to the ORDER BY fix, several other patches to fix obscure
  (and mostly harmless) bugs and to fix spelling errors in source code
  comments are also included in this release.
2013-03-18 - Release 3.7.16
  SQLite version 3.7.16 is a regularly scheduled release of SQLite.
  This release contains several language enhancements and improvements
  to the query optimizer.  A list of the major enhancements and optimizations
  can be see on the change log.

  There was one important bug fix
  (see Ticket fc7bd6358f)
  that addresses an incorrect query result that could have occurred in
  a three-way join where the join constraints compared INTEGER columns
  to TEXT columns.  This issue had been in the code for time out of mind
  and had never before been reported, so we surmise that it is very obscure.
  Nevertheless, all users are advised to upgrade to avoid any future problems
  associated with this issue.
2013-01-09 - Release 3.7.15.2
  SQLite version 3.7.15.2 is a patch release that fixes a single bug
  that was introduced in version version 3.7.15.  The fix is a 4-character
  edit to a single line of code.  Other than this 4-character change and
  the update of the version number, nothing has changed from
  version 3.7.15.1.
2012-12-19 - Release 3.7.15.1
  SQLite version 3.7.15.1 is a patch release that fixes a single bug
  that was introduced in version version 3.7.15.  The fix involved changing
  two lines of code and adding a single assert().  This release also includes
  some new test cases to prevent a regression of the bug, and the version
  number is increased, of course.  But otherwise, nothing has changed from
  version 3.7.15.
2012-12-12 - Release 3.7.15
  SQLite version 3.7.15 is a regularly schedule release of SQLite.  This
  release contains several improvements to the query planner and optimizer
  and one important bug fix.  This is the first release to officially
  support Windows 8 Phone.

  The important bug fix is a problem that can lead to segfaults when using
  shared cache mode on a schema that contains a COLLATE operator within
  a CHECK constraint or within a view.  Collating functions are associated
  with individual database connections.  But a pointer to the collating function
  -was also being cached within expressions.  If an expression was part of the
  schema and contained a cached collating function, it would point to the
  collating function in the database connection that originally parsed the
  schema.  If that database connection closed while other database 
  connections using the same shared cache continued to operate, they other
  database connections would try to use the deallocated collating function
  in the database connection that closed.  The fix in version 3.7.15 was to
  not cache collating function pointers in the expression structure but 
  instead look them up each time a new statement is prepared.

  This release also contains some important enhancements to the query planner
  which should (we hope) make some queries run faster.  The enhancements
  include:

  When doing a full-table scan, try to use an index instead of
  the original table, under the theory that indices contain less information
  and are thus smaller and hence require less disk I/O to scan.

  Enhance the IN operator to allow it to make use of 
  indices that have numeric affinity.

  Do a better job of recognizing when an ORDER BY clause can be 
  implemented using indices - especially in cases where the ORDER BY clause
  contains terms from two or more tables in a join.
  
2012-10-04 - Release 3.7.14.1
  SQLite version 3.7.14.1 is a patch release.  Changes from the baseline
  version 3.7.14 are minimal and are restricted to fixing three bugs.

  One of the fixed bugs is a long-standing issue with the TCL interface.
  Another is an external compiler bug that SQLite merely works around and
  that only comes up if you are using the VisualStudio-2012 compiler to
  generate WinRT applications on ARM with optimizations enabled.  The
  third problem is an SQLite core bug, introduced in version 3.7.14, that
  can cause a segfault if a query contains a LEFT JOIN that contains an OR
  in the ON clause.
2012-09-03 - Release 3.7.14
  SQLite version 3.7.14 is a regularly scheduled maintenance release
  of SQLite.  The previous release continues to work well.  Upgrading
  is optional.

  Version 3.7.14 drops native support for OS/2.  We are not aware of any
  active projects that were using SQLite on OS/2 and since the SQLite
  developers had no way of testing on OS/2 it seemed like it was time
  to simply remove the OS/2 code from the SQLite tree.  If there are
  OS/2 projects out there that still need SQLite support, they can
  continue to maintain their own private VFS which can be linked to
  SQLite at start-time using the sqlite3_vfs_register() interface.

  The sqlite3_close_v2() interface has been added.  The sqlite3_close_v2()
  interface differs from sqlite3_close() in that it is designed to work
  better for host language that use a garbage collector.  With the older
  sqlite3_close() interface, the associated prepared statements and
  sqlite3_backup objects must be destroyed before the database connection.
  With the newer sqlite3_close_v2() interface, the objects can be destroyed
  in any order.

  This release also includes performance improvements to the sort algorithm
  that is used to implement ORDER BY and CREATE INDEX.  And the query planner
  has been enhanced to better use covering indices on queries that use OR
  terms in the WHERE clause.
2012-06-11 - Release 3.7.13
  SQLite version 3.7.13 adds support for WinRT and metro style
  applications for Microsoft Windows 8.  The 3.7.13 release is
  coming sooner than is usual after the previous release in order to get
  this new capability into the hands of developers.  To use SQLite in 
  a metro style application, compile with the -DSQLITE_OS_WINRT flag.
  Because of the increased application security and safety requirements
  of WinRT, all database
  filenames should be full pathnames.  Note that SQLite is not capable
  of accessing databases outside the installation directory and application
  data directory.  This restriction is another security and safety feature
  of WinRT. Apart from these restrictions, SQLite should work exactly
  the same® on WinRT as it does on every other system.

  Also in this release: when a database is opened using URI filenames
  and the mode=memory query parameter 
  then the database is an in-memory database, just as if it had
  been named ":memory:".  But, if shared cache mode is enabled, then
  all other database connections that specify the same URI filename
  will connect to the same in-memory database.  This allows two or more
  database connections (in the same process) to share the same in-memory
  database.

  This release also includes some corner-case performance optimizations
  that are obscure yet significant to an important subset of SQLite users.
  Getting these performance optimizations into circulation quickly is
  yet another reason for making this release so soon following the previous.

  The next release of SQLite is scheduled to occur after the usual
  2 or 3 month interval.
2012-05-22 - Patch Release 3.7.12.1
  SQLite version 3.7.12.1 is a patch release for version 3.7.12 that
  fixes a bug that was
  introduced in version 3.7.12 and that can
  cause a segfault for certain obscure nested aggregate queries.
  There are very few changes in 3.7.12.1, and upgrading is only needed for
  applications that do nested aggregate queries.
2012-05-14 - Version 3.7.12
  SQLite version 3.7.12 is a regularly scheduled maintenance release.
  This release contains several new optimizations and bug fixes and upgrading
  is recommended.  See the change summary for details.
2012-03-20 - Version 3.7.11
  SQLite version 3.7.11 is a regularly scheduled maintenance release
  which was rushed out early due to a 
  bug in the query optimizer
  introduced in the previous release.  The bug is obscure - it changes
  a LEFT JOIN into an INNER JOIN in some cases when there is a 3-way join
  and OR terms in the WHERE clause.  But it was considered serious enough to
  rush out a fix.  Apart from this one problem, SQLite version 3.7.10 has
  not given any trouble.  Upgrading to version 3.7.11 from versions
  3.7.6.3, 3.7.7, 3.7.7.1, 3.7.8, or 3.7.9 is
  optional.  Upgrading from other releases, including the previous release
  3.7.10, is recommended.

  Other enhancements found in this release are enumerated in the
  change log.
2012-01-16 - Version 3.7.10
  SQLite version 3.7.10 is a regularly scheduled maintenance release.
  Upgrading from version 3.7.6.3, 3.7.7, 3.7.7.1, 3.7.8, or 3.7.9 is
  optional.  Upgrading from other releases is recommended.

  The SQLITE_CONFIG_PCACHE mechanism has been replaced with
  SQLITE_CONFIG_PCACHE2.  If you do not know what this mechanism
  is (it is an extreme corner-case and is seldom used) then this 
  change will not effect you in the least.

  The default schema format number for new database files has changed
  from 1 to 4.  SQLite has been able to generate and read database files
  using schema format 4 for six years.  But up unto now, the default
  schema format has been 1 so that older versions of SQLite could read
  and write databases generated by newer versions of SQLite.  But those
  older versions of SQLite have become so scarce now that it seems 
  reasonable to make the new format the default.

  SQLite is changing some of the assumptions it makes above the behavior
  of disk drives and flash memory devices during a sudden power loss.
  This change is completely transparent to applications.
  Read about the powersafe overwrite property for additional information.

  Lots of new interfaces have been added in this release:
  
   sqlite3_db_release_memory()
   PRAGMA shrink_memory
   sqlite3_db_filename()
   sqlite3_stmt_busy()
   sqlite3_uri_boolean()
   sqlite3_uri_int64()
  

  The PRAGMA cache_size statement has been enhanced.  Formerly, you would
  use this statement to tell SQLite how many pages of the database files it
  should hold in its cache at once.  The total memory requirement would
  depend on the database page size. Now, if you give PRAGMA cache_size
  a negative value -N, it will allocate roughly N 
  kibibytes of memory to cache,
  divided up according to page size.  This¯ enhancement allows programs to
  more easily control their memory usage.

  There have been several obscure bug fixes.  One noteworthy bug,
  ticket ff5be73dee,
  could in theory result in a corrupt database file if a power loss
  occurred at just the wrong moment on an unusually cantankerous disk
  drive.  But that is mostly a theoretical concern and is very unlikely
  to happen in practice.  The bug was found during laboratory testing
  and has never been observed to occur in the wild.
2011-11-01 - Version 3.7.9
  SQLite version 3.7.9 is a regularly scheduled maintenance release.
  Upgrading from version 3.7.6.3, 3.7.7, 3.7.7.1, and 3.7.8 is optional.
  Upgrading from other versions is recommended.

  The SQLITE_ENABLE_STAT2 compile-time option is now a no-op.  The enhanced
  query-planner functionality formerly available using SQLITE_ENABLE_STAT2
  is now available through SQLITE_ENABLE_STAT3.  The enhanced query planning
  is still disabled by default.  However, future releases of SQLite might
  convert STAT3 from an enable-option to a disable-option so that it is 
  available by default and is only omitted upon request.

  The FTS4 full-text search engine has been enhanced such that tokens in
  the search string that begin with "&#94;" must be the first token in their
  respective columns in order to match.   Formerly, "&#94;" characters in the
  search string were simply ignored.  Hence, if a legacy application was
  including "&#94;" characters in FTS4 search strings, thinking that they would
  always be ignored, then those legacy applications might break with this
  update.  The fix is simply remove the "&#94;" characters from the search 
  string.

  See the change summary for additional changes associated
  with this release.  
2011-September-19 - Version 3.7.8
  SQLite version 3.7.8 is a quarterly maintenance release.  Upgrading from
  versions 3.7.6.3, 3.7.7, or 3.7.7.1 is optional.  Upgrading from other
  versions is recommended.

  This release features a new "external merge sort" algorithm used to
  implement ORDER BY and GROUP BY and also to presort the content of an
  index for CREATE INDEX.  The new algorithm does approximately the same
  number of comparisons and I/Os as before, but the I/Os are much more
  sequential and so runtimes are greatly reduced when the size of the
  set being sorted is larger than the filesystem cache.  The performance 
  improvement can be dramatic - orders of magnitude faster 
  for large CREATE INDEX commands.  On the other hand, 
  the code is slightly slower (1% or 2%)
  for a small CREATE INDEX.  Since CREATE INDEX is not an
  operation that commonly occurs on a speed-critical path, we feel that 
  this tradeoff is a good one.  The slight slowdown for small CREATE INDEX
  statements might be recovered in a future release.  ORDER BY and GROUP BY
  operations should now be faster for all cases, large and small.

  The query planner has been enhanced to do a better job of handling
  the DISTINCT keyword on SELECT statements.

  There has been a lot of work on the default VFSes.  The unix VFS has
  been enhanced to include more overrideable system calls - a feature requested
  by Chromium to make it easier to build SQLite into a sandbox.  The
  windows VFS has been enhanced to be more resistant to interference from
  anti-virus software.

  Every version of SQLite is better tested than the previous, and 3.7.8
  is no exception to this rule.  Version 3.7.8 has been used internally by
  the SQLite team for mission critical functions and has performed flawlessly.
  And, of course, it passes our rigorous testing procedures with no
  problems detected.  Version 3.7.8 is recommended for all new development.
2011-06-28 - Version 3.7.7.1
  SQLite version 3.7.7.1 adds a one-line bug fix to 3.7.7 to fix
  a problem
  causing PRAGMA case_sensitive_like statements compiled using the legacy
  sqlite3_prepare() interface to fail with an SQLITE_SCHEMA error. Because
  sqlite3_exec() uses sqlite3_prepare() internally, the problem also affects
  sqlite3_exec().

  Upgrading from 3.7.7 °is only required for applications that use "PRAGMA
  case_sensitive_like" and the sqlite3_prepare() (or sqlite3_exec()) interface.
2011-06-24 - Version 3.7.7
  SQLite version 3.7.7 is a regularly scheduled bi-monthly maintenance
  release.  Upgrading from version 3.7.6.3 is optional.  Upgrading from all
  prior releases is recommended.

  This release adds support for naming database files using URI filenames.
  URI filenames are disabled by default (for backwards compatibility) but
  applications are encouraged to enable them since incompatibilities are
  likely to be exceedingly rare and the feature is useful.  See the 
  URI filename documentation for details.

  Most of the other enhancements in this release involve 
  virtual tables.  The virtual table interface has been enhanced to
  support SAVEPOINT and ON CONFLICT clause processing, and the built-in 
  RTREE and FTS3/FTS4 have been augmented to take advantage of 
  the new capability.  This means, for example, that it is now possible
  to use the REPLACE command on FTS3/FTS4 and RTREE tables.

  The FTS4 full-text index extension has been enhanced to support
  the FTS4 prefix option and the FTS4 order option.  These two enhancements
  are provided in support of search-as-you-type interfaces where search
  results begin to appear after the first keystroke in the "search" box
  and are refined with each subsequent keystroke.  The way this is done is
  to do a separate full-text search after each key stroke, and add the
  "*" wildcard at the end of the word currently being typed.  So, for
  example, if the text typed so far is "fast da" and the next character
  typed is "t", then the application does a full-text search of the
  pattern "fast dat*" and displays the results.  Such capability has
  always existed.  What is new is that the FTS4 prefix option allows
  the search to be very fast (a matter of milliseconds) even for difficult
  cases such as "t*" or "th*".

  There has been a fair amount of work done on the FTS4 module for this
  release.  But the core SQLite code has changed little and the previous
  release has not given any problems, so we expect this to be a very
  stable release.
2011-05-19 - Version 3.7.6.3
  SQLite version 3.7.6.3 is a patch release that fixes a 
  single bug
  associated with WAL mode.  The bug has been in SQLite ever since WAL
  was added, but the problem is very obscure and so nobody has noticed
  before now.  Nevertheless, all users are encouraged to upgrade to
  version 3.7.6.3 or later.

  The bug is this:
  If the cache_size is set very small (less than 10) and SQLite comes
  under memory pressure and if a multi-statement transaction is started
  in which the last statement prior to COMMIT is a SELECT statement and if
  a checkpoint occurs right after the transaction commit, then
  it might happen that the transaction will be silently rolled back instead
  of being committed.

  The default setting for cache_size is 2000. So in most situations, this
  bug will never appear.  But sometimes programmers set cache_size to
  very small values on gadgets and other low-memory devices in order to
  save memory space.  Such applications are vulnerable.
  Note that this bug does not cause database corruption.  It is
  as if ROLLBACK were being run instead of COMMIT in some cases.

  Bug Details

  Transactions commit in WAL mode by adding a record onto the end of
  the WAL (the write-ahead log) that contains a "commit" flag.  So to
  commit a transaction, SQLite takes all the pages that have changed
  during that transaction, appends them to the WAL, and sets the commit
  flag on the last page.  Now, if SQLite comes under memory pressure, it
  might try to free up memory space by writing changed pages to the WAL
  prior to the commit.  We call this "spilling" the cache to WAL.  There 
  is nothing wrong with spilling cache to WAL.  But if the
  memory pressure is severe, it might be that by the time COMMIT is run,
  all changed pages for the transaction have already been spilled to WAL
  and there are no pages left to be written to± WAL.
  And with no unwritten pages, there was nothing to put the commit flag
  on.  And without a commit flag, the transaction would end up being
  rolled back.

  The fix to this problem was that if all changed pages has already
  been written to the WAL when the commit was started, then page 1 of
  the database will be written to the WAL again, so that there will always
  be a page available on which to set the commit flag.
2011-04-17 - Version 3.7.6.2
  SQLite version 3.7.6.2 adds a one-line bug fix to 3.7.6.1 that enables
  pthreads to work correctly on NetBSD.  The problem was a faulty function
  signature for the open system call.  The problem does not appear to have
  any adverse impact on any system other than NetBSD.

  Upgrading from version 3.7.6.1 is only needed on NetBSD.
2011-04-13 - Version 3.7.6.1
  SQLite version 3.7.6.1 fixes a single bug in 3.7.6 that can cause a
  segfault if SQLITE_FCNTL_SIZE_HINT is used on a unix build that has
  SQLITE_ENABLE_LOCKING_MODE set to 0 and is compiled with
  HAVE_POSIX_FALLOCATE.

  Upgrading from 3.7.6 is only needed for users effected by the 
  configuration-specific bug described above.  There are no other changes
  to the code.
2011-04-12 - Version 3.7.6
  SQLite version 3.7.6 is a regularly scheduled bi-monthly maintenance
  release of SQLite.  Upgrading from version 3.7.5 is optional.  Upgrading
  releases prior to 3.7.5 is recommended.
2011-02-01 - Version 3.7.5
  SQLite version 3.7.5 is a regularly scheduled bi-monthly maintenance
  release of SQLite.  Due to the discovery and fix of 
  an obscure bug
  that could cause database corruption, upgrading from all prior
  releases of SQLite is recommended.  This bug was found during code
  review and has not been observed in the wild.

  This release adds new opcodes for the
  sqlite3_db_status() interface that allow more precise measurement of
  how the lookaside memory allocator is performing, which can be useful
  for tuning in applications with very tight memory constraints.

  The sqlite3_vsnprintf() interface was added.  This routine is simply
  a varargs version of the long-standing sqlite3_snprintf() interface.

  The output from sqlite3_trace() interface has been enhanced to work
  better (and faster) in systems that use recursive extensions such as
  FTS3 or RTREE.

  Testing with Valgrind shows that this release of SQLite is about 1%
  or 2% faster than the previous release for most operations.

  A fork of the popular ADO.NET adaptor for SQLite known as System.Data.SQLite
  is now available on http://System.Data.SQLite.org/.  The originator
  of System.Data.SQLite, Robert Simpson, is aware of this fork, has
  expressed his approval, and has commit privileges on the new Fossil
  repository.  The SQLite development team intends to maintain
  System.Data.SQLite moving forward.
2010-12-08 - Version 3.7.4
  SQLite version 3.7.4 is a regularly scheduled bi-monthly maintenance
  release of SQLite.  Upgrading from version 3.7.2 and version 3.7.3
  is optional.  Upgrading from all other SQLite releases is recommended.

  This release features full-text search enhancements.  The older 
  FTS3 virtual table is still fully supported, and should also run
  faster.  In addition, the new FTS4 virtual table is added.  FTS4
  follows the same syntax as FTS3 but holds additional metadata which
  facilitates some performance improvements and more advanced 
  matchinfo() output.  Look for further full-text search enhancements
  in subsequent releases.

  Also in this release, the EXPLAIN QUERY PLAN output has been enhanced
  and new documentation is provided so that application developers can
  more easily understand how SQLite is performing their queries.

  Thanks to an account from the folks at http://www.devio.us/, OpenBSD
  has been added to the list of platforms upon which we 
  test SQLite prior to every release.  That list of platforms
  now includes:

  
   Linux x86 &amp; x86_64
   MacOS 10.5 &amp; 10.6
   MacOS 10.2 PowerPC
   WinXP and Win7
   Android 2.2
   OpenBSD 4.7
  

  The previous release of SQLite ²(version 3.7.3) has proven to be very
  robust.  The only serious issue discovered was
  ticket 80ba201079 that
  describes an incorrect query result that can occur under very 
  unusual circumstances.  The ticket description contains details of the
  problem.  Suffice it to say here that the problem is very obscure and
  is unlikely to effect most applications and so upgrading is optional.
  The problem is fixed, of course, in this release.
2010-October-08 - Version 3.7.3
  SQLite version 3.7.3 is a regularly scheduled bi-monthly maintenance
  release of SQLite.  Upgrading from version 3.7.2 is optional.
  Upgrading from all other releases is recommended.

  This release adds two new interfaces (really just variations on existing
  interfaces).  The sqlite3_create_function_v2() interface adds a 
  destructor for the application-data pointer.  The new 
  sqlite3_soft_heap_limit64() interface allows the soft heap limit to
  be set to a value greater than 231. 

  The RTREE extension has been enhanced with the ability to have an
  application-defined query region.  This might
  be used, for example, to locate all objects within 
  the field of view of a camera.

  The 3.7.3 release also includes some performance enhancements, including
  query planner improvements, documentation updates,
  and fixes to some very obscure bugs.
2010-August-24 - Version 3.7.2
  SQLite version 3.7.2 fixes a long-standing bug that can cause the
  database free-page list to go corrupt if incremental_vacuum is used
  multiple times to
  partially reduce the size of a database file that contains many hundreds
  of unused database pages.  The original bug reports together with links
  to the patch that fixes it can be seen 
  here.

  This bug has been in the code for at least a year and possibly longer.
  The bug has nothing to do with the versions 3.7.1 or 3.7.0 or any other
  recent release.  The fact that the bug was discovered (and fixed)
  within hours of the 3.7.1 release is purely a coincidence.

  The bug is impossible to hit without using incremental_vacuum and is
  very difficult to hit even with incremental_vacuum.  And the kind of
  corruption that the bug causes can usually be fixed 
  simply by running VACUUM.  Nevertheless, because the bug can result
  in database corruption, it is recommended that all SQLite users upgrade
  to version 3.7.2 or later.
2010-August-23 - Version 3.7.1
  SQLite version 3.7.1 is a stabilization release for the 3.7.x series.
  Other than the filesize-in-header bug that was fixed in version 3.7.0.1,
  no major problems have been seen in 3.7.0.  Some minor corner-case
  performance regressions have been fixed.  A typo in the OS/2 interface
  has been repaired.

  A biggest part of the 3.7.1 release is a cleanup and refactoring of
  the pager module within SQLite.  This refactoring should have no
  application-visible effects.  The purpose was to reorganize the code
  in ways that make it easier to prove correctness.

  The 3.7.1 release adds new experimental methods for obtained more 
  detailed memory usage information and for controlling database file
  fragmentation.  And the query planner now does a better job of
  optimizing the LIKE and GLOB operators.

  This release increases the maximum size of database pages from 32KiB to
  64KiB.  A database with 64KiB pages will not be readable or writable by
  older versions of SQLite.  Note that further increases in page size
  are not feasible since the file format uses 16-bit offsets to structures
  within each page.
2010-August-04 - Version 3.7.0.1
  SQLite version 3.7.0.1 is a patch release to fix a bug in the new
  filesize-in-header feature of the SQLite file format
  that could cause database corruption if the same database file is
  written alternately with version 3.7.0 and version 3.6.23.1 or earlier.
  A performance regression was also fixed in this release.
2010-07-22 - Version 3.7.0
  SQLite version 3.7.0 is a major release of SQLite that features
  a new transaction control mechanism using a write-ahead log or WAL.
  The traditional rollback-³journal is still used as the default so there
  should be no visible change for legacy programs.  But newer programs
  can take advantage of improved performance and concurrency by enabling
  the WAL journaling mode.

  SQLite version 3.7.0 also contains some query planner enhancements and
  a few obscure bug fixes, but the only really big change is the addition
  of WAL mode.
2010-03-30 - Version 3.6.23.1
  SQLite version 3.6.23.1 is a patch release to fix a bug in the
  offsets() function of FTS3 at the request of the Mozilla.  
2010-03-09 - Version 3.6.23
  SQLite version 3.6.23 is a regular bimonthly release of SQLite.
  Upgrading from the prior release is purely optional.

  This release contains new pragmas: the secure_delete pragma, and
  the compile_options pragma.
  There are a new SQL functions: sqlite_compileoption_used()
  and sqlite_compileoption_get().
  New C/C++ interfaces: sqlite3_compileoption_used(),
  sqlite3_compileoption_get(), SQLITE_CONFIG_LOG, and
  sqlite3_log().

  This release also includes several minor bug fixes and performance
  improvements.  Support for SQLITE_OMIT_FLOATING_POINT is enhanced.
  There are on-going improvements to FTS3.

  The ".genfkey" command in the Command Line Interface has been
  removed.  SQLite has supported standard SQL foreign key constraints
  since version 3.6.19 and so the ".genfkey" command was seen as
  an anachronism.
2010-01-06 - Version 3.6.22
  SQLite version 3.6.22 is a bug-fix release.  Two bugs have been fixed
  that might cause incorrect query results.  
  
  Ticket 31338dca7e
  describes a
  problem with queries that have a WHERE clause of the form (x AND y) OR z
  where x and z come from one table of a join and y comes from a different
  table.
   Ticket eb5548a849
  describes
  a problem where the use of the CAST operator in the WHERE clause can lead
  to incorrect results if the column being cast to a new datatype is also
  used in the same WHERE clause without being cast.
  
  Both bugs are obscure,
  but because they could arise in an application after deployment, it is
  recommended that all applications upgrade SQLite to version 3.6.22.

  This release also includes other minor bug fixes and performance
  enhancements, especially in the FTS3 extension.
2009-12-07 - Version 3.6.21
  SQLite version 3.6.21 focuses on performance optimization.  For
  a certain set of traces, this version uses 12% fewer CPU instructions
  than the previous release (as measured by Valgrind).  In addition, the
  FTS3 extension has been through an extensive cleanup and rework and
  the sqlite3_trace() interface has been modified to insert 
  bound parameter values into its output.
2009-11-04 - Version 3.6.20
  SQLite version 3.6.20 is a general maintenance release.  The
  query planner has been enhanced to work better with bound parameters
  in LIKE and GLOB operators and in range constraints and various minor
  bugs have been fixed.  Upgrading from 3.6.19 is optional.
2009-10-14 - Version 3.6.19
  SQLite version 3.6.19 adds native support for
  foreign key constraints, including deferred constraints and
  cascading deletes.  Enforcement of foreign keys is disabled by
  default for backwards compatibility and must be turned on using
  the foreign_keys pragma.

  Version 3.6.19 also adds support for the
  IS and IS NOT operators.  Formerly, SQLite (as most
  other SQL database engines) supported IS NULL and IS NOT NULL.  The
  IS and IS NOT operators are generalizations that allow the right-hand
  side to be an arbitrary expression.  IS and IS NOT work the same as
  == (equals) and != (not equals) except that with IS and IS NOT the
  NULL values compare equal to one another.
2009-09-11 - Version 3.6.18
  Beginning with this release, the SQLite source code is tracked and
  managed using the Fossil
  distributed configuration management system.  SQLite was previously
  versioned using CVS.  The entire CVS history has been imported into
  Fossil.  The older CVS repository remains on the website but is
  read-only.

  There are two major enhancements in SQLite version ´3.6.18.  The first
  is a series or refinements to the query planner that help SQLite to
  choose better plans for joins where in the past it was selecting suboptimal
  query plans.  The SQLITE_ENABLE_STAT2 compile-time option has been
  added to cause SQLite to collect histogram data on indices when the
  ANALYZE command is run.  The use of histograms improve the query
  planning performance even more.

  The second major enhancement is that SQLite now support recursive
  triggers.  The older non-recursive behavior of triggers is still the
  default behavior.  Recursive triggers are activated using the
  recursive_triggers pragma.  In addition to allowing triggers to
  call themselves (either directly or indirectly) the new capability
  also fires DELETE triggers on rows that are removed from a table
  as a result of REPLACE conflict resolution processing.

  Non-recursive triggers are still the default behavior since this
  is least likely to cause problems for existing applications.  However,
  we anticipate that triggers will become
  recursive by default beginning with release 3.7.0.  At that point,
  applications that want to continue using the older non-recursive
  trigger behavior will need to use the recursive_triggers pragma
  to disable recursive triggers.

  This version of SQLite also contains bug fixes, though none of the
  bugs are serious and all are obscure, so upgrading is optional.

  The SQLite core continues to have 100% branch test coverage
  and so despite the many changes in this release, the developers 
  believe that this version of SQLite is stable and ready for production
  use.
2009-08-10 - Version 3.6.17
  This is a monthly maintenance release with a focus of bug fixes,
  performance improvements, and increased test coverage.  This is the
  first release of SQLite since 100% branch test coverage
  was achieved on the SQLite core.  

  In addition, a new interface sqlite3_strnicmp() is provided for the
  convenience of extension writers.

  None of the bugs fixed in this release are serious.  All bugs are
  obscure.  Upgrading is optional.
2009-07-25 - 100% Branch Test Coverage
  A subset of the TH3 test suite was measured by gcov to provide
  100% branch test coverage over the SQLite core
  (exclusive of the VFS backend and of extensions such as FTS3 and RTREE)
  when compiled for SuSE 10.1 Linux on x86.  The SQLite developers pledge
  to maintain branch test coverage at 100% in all future releases.
  Ongoing work will strive for 100% branch test coverage on the 
  operating-system backends and extensions as well.
2009-06-27 - Version 3.6.16
  SQLite version 3.6.16 is another general maintenance release containing
  performance and robustness enhancements.  A single notable bug was fixed
  (ticket #3929).  This bug can cause INSERT or UPDATE statements to fail
  on indexed tables that have AFTER triggers that modify the same table and
  index.
2009-06-15 - Version 3.6.15
  SQLite version 3.6.15 is a general maintenance release containing
  performance and robustness enhancements and fixes for various obscure
  bugs.  
2009-05-25 - Version 3.6.14.2
  SQLite version 3.6.14.2 fixes an obscure bug in the code generator
  (ticket #3879)
  section of SQLite which can potentially cause incorrect query results.
  The changes from the prior release consist of only this one bug fix,
  check-in [6676]
  and a change to the version number text.

  The bug was introduced in version 3.6.14.  It is recommended that
  users of version 3.6.14 and 3.6.14.1 upgrade to this release.  Applications
  are unlikely to hit this bug, but since it is difficult to predict which
  applications might hit it and which might not, we recommend that all
  users of 3.6.14 and 3.5.14.1 upgrade to this release.
2009-05-19 - Version 3.6.14.1
  SQLite version 3.6.14.1 is a patch release to version 3.6.14 with
  minimal changes that fixes three bugs.  Upgrading is only necessary 
  for users who are impacted by one or more of those bugs.
2009-05-07 - Version 3.6.14
  SQLite version 3.6.14 provides new performance enhancements µin
  the btree and pager layers and in the query optimizer.  Certain
  workloads can be as much as twice as fast as the previous release,
  though 10% faster is a more typical result.

  Queries against virtual tables that contain OR and IN operators
  in the WHERE clause are now able to use indexing.

  A new optional asynchronous I/O backend is available for
  unix and windows.  The asynchronous backend gives the illusion of faster
  response time by pushing slow write operations into a background thread.
  The tradeoff for faster response time is that more memory is required
  (to hold the content of the pending writes) and if a power failure or
  program crash occurs, some transactions that appeared to have committed
  might end up being rolled back upon restart.

  This release also contains many minor bug fixes, documentation enhancements,
  new test cases, and cleanups and simplifications to the source code.

  There is no compelling reason to upgrade from versions 3.6.12 or
  3.6.13 if those prior versions are working.  Though many users may
  benefit from the improved performance.
2008-12-16 - Version 3.6.7
  SQLite version 3.6.7 contains a major cleanup of the Unix driver,
  and support for the new Proxy Locking mechanism on Mac OS X.  Though
  the Unix driver is reorganized, its functionality is the same and so
  applications should not notice a difference.
2008-11-26 - Version 3.6.6.2
  This release fixes a bug that was introduced into SQLite version 3.6.6
  and which seems like it might be able to cause database corruption.  This
  bug was detected during stress testing.  It has not been seen in the wild.
  An analysis of the problem suggests that the bug might be able to cause
  database corruption, however focused efforts to find a real-world test
  cases that actually causes database corruption have so far been unsuccessful.
  Hence, the likelihood of this bug causing problems is low.  Nevertheless,
  we have decided to do an emergency branch release out of an abundance of
  caution.

  The version 3.6.6.2 release also fixes an obscure memory leak that
  can occur following a disk I/O error.
2008-11-22 - Version 3.6.6.1
  This release fixes a bug that was introduced into SQLite version 3.6.4
  and that can cause database corruption in obscure cases.  This bug has
  never been seen in the wild; it was first detected by internal stress
  tests and required substantial analysis before it could be shown to 
  potentially lead to corruption.  So we feel that SQLite versions 3.6.4,
  3.6.5, and 3.6.6 are safe to use for development work.  But upgrading
  to this patch release or later is recommended prior to deploying
  products that incorporate SQLite.

  We have taken the unusual step of issuing a patch release in order to
  get the fix for this bug into circulation quickly.  SQLite version 3.6.7
  will continue on its normal path of development with an anticipated
  release in mid December.  
2008-11-19 - Version 3.6.6
  SQLite version 3.6.5 is released.  This is a quick turn-around release
  that fixes a bug in virtual tables and FTS3 that snuck into
  version 3.6.5.  This release also adds the new
  application-defined page cache mechanism.
2008-11-12 - Version 3.6.5
  SQLite version 3.6.5 is released.  There are various minor feature
  enhancements and numerous obscure bug fixes. 
  The change log contains the details.  Upgrading is
  optional.
2008-11-01 - Bloomberg Joins SQLite Consortium
  The SQLite developers are honored to announce that
  Bloomberg has joined the
  SQLite Consortium.
2008-10-15 - Version 3.6.4
  SQLite version 3.6.4 adds new features designed to help applications
  detect when indices are not being used on query.  There are also some
  important performance improvements.  Upgrading is optional.
2008-09-22 - Version 3.6.3
  SQLite version 3.6.3 fixes a bug in SELECT DISTINCT that was introduced
  by the previous version.  No new features are added.  Upgrading is
  recommended for all applications that make use of DISTINCT.
2008-08-30 - Version 3.6.2
  SQLite version 3.6.2 contain¶s rewrites of the page-cache subsystem and
  the procedures for matching identifiers to table columns in SQL statements.
  These changes are designed to better modularize the code and make it more
  maintainable and reliable moving forward.  Nearly 5000 non-comment lines 
  of core code (about 11.3%) have changed
  from the previous release.  Nevertheless, there should be no
  application-visible changes, other than bug fixes.
2008-08-06 - Version 3.6.1
  SQLite version 3.6.1 is a stabilization and performance enhancement
  release.  
2008-07-16 - Version 3.6.0 beta
  Version 3.6.0 makes changes to the VFS object in order
  to make SQLite more easily portable to a wider variety of platforms.
  There are potential incompatibilities with some legacy applications.
  See the 35to36.html document for details.

  Many new interfaces are introduced in version 3.6.0.  The code is
  very well tested and is appropriate for use in stable systems.  We
  have attached the "beta" designation only so that we can make tweaks to
  the new interfaces in the next release without having to declare an
  incompatibility.
2008-05-12 - Version 3.5.9
  Version 3.5.9 adds a new experimental PRAGMA: journal_mode.
  Setting the journal mode to PERSIST can provide performance improvement
  on systems where deleting a file is expensive.  The PERSIST journal
  mode is still considered experimental and should be used with caution
  pending further testing.

  Version 3.5.9 is intended to be the last stable release prior to
  version 3.6.0.  Version 3.6.0 will make incompatible changes to the
  sqlite3_vfs VFS layer in order to address deficiencies in the original
  design.  These incompatibilities will only effect programmers who
  write their own custom VFS layers (typically embedded device builders).
  The planned VFS changes will be much smaller
  than the changes that occurred on the 
  3.4.2 to 3.5.0 transaction that occurred last
  September.

  This release of SQLite is considered stable and ready for production use.
2008-04-16 - Version 3.5.8
  Version 3.5.8 includes some important new performance optimizations
  in the virtual machine code generator, including constant subexpression
  factoring and common subexpression elimination.  This release also
  creates new public interfaces:
  sqlite3_randomness() provides access to SQLite's internal
  pseudo-random number generator, sqlite3_limit() allows size
  limits to be set at run-time on a per-connection basis, and
  sqlite3_context_db_handle() is a convenience routine that allows
  an application-defined SQL function implementation to retrieve
  its database connection handle.

  This release of SQLite is considered stable and ready for production use.
2008-03-17 - Version 3.5.7
  Version 3.5.7 fixes several minor and obscure bugs, especially 
  in the autoconf-generated makefile.  Upgrading is optional.
  This release of SQLite is considered stable and ready for production use.
2008-02-06 - Version 3.5.6
  Version 3.5.6 fixes a minor regression in 3.5.5 - a regression that
  had nothing to do with the massive change of the virtual machine
  to a register-based design.
  No problems have been reported with the new virtual machine.  This
  release of SQLite is considered stable and ready for production use.
2008-01-31 - Version 3.5.5
  Version 3.5.5 changes over 8% of the core source code of SQLite in order
  to convert the internal virtual machine from a stack-based design into
  a register-based design.  This change will allow future optimizations
  and will avoid an entire class of stack overflow bugs that have caused
  problems in the past.  Even though this change is large, extensive testing
  has found zero errors in the new virtual machine and so we believe this
  to be a very stable release.
2007-12-14 - Version 3.5.4
  Version 3.5.4 fixes a long-standing but obscure bug in UPDATE and
  DELETE which might cause database corruption.  (See ticket #2832.)
  Upgrading is recommended for all users.

  This release also brings the processing of ORDER BY statements into
  compliance with st·andard SQL.  This could, in theory, cause problems
  for existing applications that depend on the older, buggy behavior.
  See ticket #2822 for additional information.
2007-12-12 - SQLite Consortium Announced
  The SQLite Consortium was launched
  today with Mozilla and
  Symbian as charter members.
  As noted in the press release,
  the Consortium's goal is to promote the continuing vitality and
  independence of SQLite.  
2007-11-27 - Version 3.5.3
  This is an incremental release that fixes several minor problems.
  Upgrading is optional.  If Version 3.5.2 or 3.5.1 is working fine
  for you, then there is no pressing need to change to 3.5.3.

  The prebuilt binaries and the amalgamation found on the 
  download page include the FTS3 fulltext
  search extension module.  We are doing this on an experimental
  basis and are not promising to provide prebuilt binaries with
  FTS3 in the future.
2007-11-05 - Version 3.5.2
  This is an incremental release that fixes several minor problems,
  adds some obscure features, and provides some performance tweaks.  
  Upgrading is optional.

  The experimental compile-time option
  SQLITE_OMIT_MEMORY_ALLOCATION is no longer supported.  On the other
  hand, it is now possible to compile SQLite so that it uses a static
  array for all its dynamic memory allocation needs and never calls
  malloc.  Expect to see additional radical changes to the memory 
  allocation subsystem in future releases.
2007-10-04 - Version 3.5.1
  Fix a long-standing bug that might cause database corruption if a
  disk-full error occurs in the middle of a transaction and that
  transaction is not rolled back.
  Ticket #2686.

  The new VFS layer is stable.  However, we still reserve the right to
  make tweaks to the interface definition of the VFS if necessary.
2007-09-04 - Version 3.5.0 alpha
  The OS interface layer and the memory allocation subsystems in
  SQLite have been reimplemented.  The published API is largely unchanged
  but the (unpublished) OS interface has been modified extensively.  
  Applications that implement their own OS interface will require
  modification.  See
  34to35.html for details.

  This is a large change.  Approximately 10% of the source code was
  modified.  We are calling this first release "alpha" in order to give
  the user community time to test and evaluate the changes before we
  freeze the new design.
2007-08-13 - Version 3.4.2
  While stress-testing the 
  soft_heap_limit
  feature, a bug that could lead to
  database corruption was discovered and fixed.
  Though the consequences of this bug are severe, the chances of hitting 
  it in a typical application are remote.  Upgrading is recommended
  only if you use the 
  sqlite3_soft_heap_limit
  interface.
2007-07-20 - Version 3.4.1
  This release fixes a bug in VACUUM that
  can lead to database corruption.  The bug was introduced in version 
  3.3.14.
  Upgrading is recommended for all users.  Also included are a slew of
  other more routine
  enhancements and bug fixes.
2007-06-18 - Version 3.4.0
  This release fixes two separate bugs either of which 
  can lead to database corruption.  Upgrading
  is strongly recommended.  If you must continue using an older version
  of SQLite, please at least read about how to avoid these bugs
  at CorruptionFollowingBusyError and ticket #2418
  
  This release also adds explicit limits on the
  sizes and quantities of things SQLite will handle.  The new limits might
  causes compatibility problems for existing applications that
  use excessively large strings, BLOBs, tables, or SQL statements. 
  The new limits can be increased at compile-time to work around any problems
  that arise.  Nevertheless, the version number of this release is
  3.4.0 instead of 3.3.18 in order to call attention to the possible
  incompatibility.
  
  There are also new features, including
  incremental BLOB I/O and
  incremental vacuum.
  See the change log 
  for additional information.
2007-04-25 - Version 3.3.17
  This version fixes a bug in the forwards-compatibility logic of SQLite
  that was ca¸using a database to become unreadable when it should have
  been read-only.  Upgrade from 3.3.16 only if you plan to deploy into
  a product that might need to be upgraded in the future.  For day to day
  use, it probably does not matter.
2007-04-18 - Version 3.3.16
  Performance improvements added in 3.3.14 but mistakenly turned off
  in 3.3.15 have been reinstated.  A bug has been fixed that prevented 
  VACUUM from running if a NULL value was in a UNIQUE column.
2007-04-09 - Version 3.3.15
  An annoying bug introduced in 3.3.14 has been fixed.  There are
  also many enhancements to the test suite.  
2007-04-02 - Version 3.3.14
  This version focuses on performance improvements.  If you recompile
  the amalgamation using GCC option -O3 (the precompiled binaries
  use -O2) you may see performance
  improvements of 35% or more over version 3.3.13 depending on your
  workload.  This version also
  adds support for 
  exclusive access mode.
2007-02-13 - Version 3.3.13
  This version fixes a subtle bug in the ORDER BY optimizer that can 
  occur when using joins.  There are also a few minor enhancements.
  Upgrading is recommended.
2007-01-27 - Version 3.3.12
  The first published build of the previous version used the wrong
  set of source files.  Consequently, many people downloaded a build
  that was labeled as "3.3.11" but was really 3.3.10.  Version 3.3.12
  is released to clear up the ambiguity.  A couple more bugs have
  also been fixed and 
  PRAGMA integrity_check has been enhanced.
2007-01-22 - Version 3.3.11
  Version 3.3.11 fixes for a few more problems in version 3.3.9 that
  version 3.3.10 failed to catch.  Upgrading is recommended.
2007-01-09 - Version 3.3.10
  Version 3.3.10 fixes several bugs that were introduced by the previous
  release.  Upgrading is recommended.
2007-01-04 - Version 3.3.9
  Version 3.3.9 fixes bugs that can lead to database corruption under
  obscure and difficult to reproduce circumstances.  See
  DatabaseCorruption in the
  wiki for details.
  This release also adds the new
  sqlite3_prepare_v2()
  API and includes important bug fixes in the command-line
  shell and enhancements to the query optimizer.  Upgrading is
  recommended.
2006-10-09 - Version 3.3.8
  Version 3.3.8 adds support for full-text search using the 
  FTS1 module.  There are also minor bug fixes.  Upgrade only if
  you want to try out the new full-text search capabilities or if
  you are having problems with 3.3.7.
2006-08-12 - Version 3.3.7
  Version 3.3.7 includes support for loadable extensions and virtual
  tables.  But both features are still considered "beta" and their
  APIs are subject to change in a future release.  This release is
  mostly to make available the minor bug fixes that have accumulated
  since 3.3.6.  Upgrading is not necessary.  Do so only if you encounter
  one of the obscure bugs that have been fixed or if you want to try
  out the new features.
2006-06-19 - New Book About SQLite
  The Definitive Guide to SQLite,
  a new book by
  Mike Owens
  is now available from Apress.
  The books covers the latest SQLite internals as well as
  the native C interface and bindings for PHP, Python,
  Perl, Ruby, Tcl, and Java.  Recommended.
2006-06-6 - Version 3.3.6
  Changes include improved tolerance for Windows virus scanners
  and faster :memory: databases.  There are also fixes for several
  obscure bugs.  Upgrade if you are having problems.
2006-04-5 - Version 3.3.5
  This release fixes many minor bugs and documentation typos and
  provides some minor new features and performance enhancements.
  Upgrade only if you are having problems or need one of the new features.
2006-02-11 - Version 3.3.4
  This release fixes several bugs, including a 
  blunder that might cause a deadlock on multithreaded systems.
  Anyone using SQLite in a multithreaded environment should probably upgrade.
2006-01-31 - Version 3.3.3 stable
  There have been no major problems discovered in version 3.3.2, so
  we hereby declare the new APIs and language features to be stable
  and supported.
2006-01-24 - Version 3.3.2 beta
 ¹ More bug fixes and performance improvements as we move closer to
  a production-ready version 3.3.x.
2006-01-16 - Version 3.3.1 alpha
  Many bugs found in last week's alpha release have now been fixed and
  the library is running much faster again.

  Database connections can now be moved between threads as long as the
  connection holds no locks at the time it is moved.  Thus the common
  paradigm of maintaining a pool of database connections and handing
  them off to transient worker threads is now supported.
  Please help test this new feature.
  See the MultiThreading wiki page for additional
  information.
2006-01-10 - Version 3.3.0 alpha
  Version 3.3.0 adds support for CHECK constraints, DESC indices,
  separate REAL and INTEGER column affinities, a new OS interface layer
  design, and many other changes.  The code passed a regression
  test but should still be considered alpha.  Please report any
  problems.

  The file format for version 3.3.0 has changed slightly to support
  descending indices and
  a more efficient encoding of boolean values.  SQLite 3.3.0 will read and
  write legacy databases created with any prior version of SQLite 3.  But
  databases created by version 3.3.0 will not be readable or writable
  by earlier versions of the SQLite.  The older file format can be
  specified at compile-time for those rare cases where it is needed.
2005-12-19 - Versions 3.2.8 and 2.8.17
  These versions contain one-line changes to 3.2.7 and 2.8.16 to fix a bug
  that has been present since March of 2002 and version 2.4.0.
  That bug might possibly cause database corruption if a large INSERT or
  UPDATE statement within a multi-statement transaction fails due to a
  uniqueness constraint but the containing transaction commits.
2005-09-24 - Version 3.2.7
  This version fixes several minor and obscure bugs.
  Upgrade only if you are having problems.
2005-09-16 - Version 3.2.6 - Critical Bug Fix
  This version fixes a bug that can result in database
  corruption if a VACUUM of a 1 gigabyte or larger database fails
  (perhaps do to running out of disk space or an unexpected power loss)
  and is later rolled back.
  
  Also in this release:
  The ORDER BY and GROUP BY processing was rewritten to use less memory.
  Support for COUNT(DISTINCT) was added.  The LIKE operator can now be
  used by the optimizer on columns with COLLATE NOCASE.
2005-08-27 - Version 3.2.5
  This release fixes a few more lingering bugs in the new code.
  We expect that this release will be stable and ready for production use.
2005-08-24 - Version 3.2.4
  This release fixes a bug in the new optimizer that can lead to segfaults
  when parsing very complex WHERE clauses.
2005-08-21 - Version 3.2.3
  This release adds the ANALYZE command,
  the CAST operator, and many
  very substantial improvements to the query optimizer.  See the
  change log for additional
  information.
2005-08-02 - 2005 Open Source Award for SQLite
  SQLite and its primary author D. Richard Hipp have been honored with
  a 2005 Open Source Award
  from Google and O'Reilly.
2005-06-13 - Version 3.2.2
  This release includes numerous minor bug fixes, speed improvements,
  and code size reductions.  There is no reason to upgrade unless you
  are having problems or unless you just want to.
2005-03-29 - Version 3.2.1
  This release fixes a memory allocation problem in the new
  ALTER TABLE ADD COLUMN
  command.
2005-03-21 - Version 3.2.0
  The primary purpose for version 3.2.0 is to add support for
  ALTER TABLE ADD COLUMN.
  The new ADD COLUMN capability is made
  possible by AOL developers supporting and embracing great
  open-source software.  Thanks, AOL!

  Version 3.2.0 also fixes an obscure but serious bug that was discovered
  just prior to release.  If you have a multi-statement transaction and
  within that transaction an UPDATE or INSERT statement fails due to a
  constraint, then you try to rollback the whole transaction, the rollback
  might not work correctly.  See
  Ticket #1171 for details.  Upgrading is recommended for all users.
2005-03-16 - Version 3.1.6
  Verºsion 3.1.6 fixes a critical bug that can cause database corruption
  when inserting rows into tables with around 125 columns. This bug was
  introduced in version 3.0.0.  See
  Ticket #1163 for additional information.
2005-03-11 - Versions 3.1.4 and 3.1.5 Released
  Version 3.1.4 fixes a critical bug that could cause database corruption
  if the autovacuum mode of version 3.1.0 is turned on (it is off by
  default) and a CREATE UNIQUE INDEX is executed within a transaction but
  fails because the indexed columns are not unique.  Anyone using the
  autovacuum feature and unique indices should upgrade.

  Version 3.1.5 adds the ability to disable
  the F_FULLFSYNC ioctl() in OS-X by setting "PRAGMA synchronous=on" instead
  of the default "PRAGMA synchronous=full".  There was an attempt to add
  this capability in 3.1.4 but it did not work due to a spelling error.
2005-02-19 - Version 3.1.3 Released
  Version 3.1.3 cleans up some minor issues discovered in version 3.1.2.
2005-02-15 - Versions 2.8.16 and 3.1.2 Released
  A critical bug in the VACUUM command that can lead to database
  corruption has been fixed in both the 2.x branch and the main
  3.x line.  This bug has existed in all prior versions of SQLite.
  Even though it is unlikely you will ever encounter this bug,
  it is suggested that all users upgrade.  See
  ticket #1116 for additional information.

  Version 3.1.2 is also the first stable release of the 3.1
  series.  SQLite 3.1 features added support for correlated
  subqueries, autovacuum, autoincrement, ALTER TABLE, and
  other enhancements.  See the 
  release notes
  for version 3.1.0 for a detailed description of the
  changes available in the 3.1 series.
2005-02-01 - Version 3.1.1 (beta) Released
  Version 3.1.1 (beta) is now available on the
  website.  Version 3.1.1 is fully backwards compatible with the 3.0 series
  and features many new features including Autovacuum and correlated
  subqueries.  The
  release notes
  From version 3.1.0 apply equally to this release beta.  A stable release
  is expected within a couple of weeks.
2005-01-21 - Version 3.1.0 (alpha) Released
  Version 3.1.0 (alpha) is now available on the
  website.  Version 3.1.0 is fully backwards compatible with the 3.0 series
  and features many new features including Autovacuum and correlated
  subqueries.  See the
  release notes
  for details.

  This is an alpha release.  A beta release is expected in about a week
  with the first stable release to follow after two more weeks.
2004-11-09 - SQLite at the 2004 International PHP Conference
  There was a talk on the architecture of SQLite and how to optimize
  SQLite queries at the 2004 International PHP Conference in Frankfurt,
  Germany.
  
  Slides from that talk are available.
2004-10-11 - Version 3.0.8
  Version 3.0.8 of SQLite contains several code optimizations and minor
  bug fixes and adds support for DEFERRED, IMMEDIATE, and EXCLUSIVE
  transactions.  This is an incremental release.  There is no reason
  to upgrade from version 3.0.7 if that version is working for you.
2004-10-10 - SQLite at the 11th
Annual Tcl/Tk Conference
  There will be a talk on the use of SQLite in Tcl/Tk at the
  11th Tcl/Tk Conference this week in
  New Orleans.  Visit http://www.tcl-lang.org/community/tcl2004/
  for details.
  
  Slides from the talk are available.
2004-09-18 - Version 3.0.7
  Version 3.0 has now been in use by multiple projects for several
  months with no major difficulties.   We consider it stable and
  ready for production use. 
2004-09-02 - Version 3.0.6 (beta)
  Because of some important changes to sqlite3_step(),
  we have decided to
  do an additional beta release prior to the first "stable" release.
  If no serious problems are discovered in this version, we will
  release version 3.0 "stable" in about a week.
2004-08-29 - Version 3.0.5 (beta)
  The fourth beta release of SQLite version 3.0 is now available.
  The next release is expected to be called "stable".
2004-08-08 - Version 3.0.4 (beta)
  The third beta release of SQLite version 3.0 is now available.
  This new beta fixes several bugs including a database corruption
  problem that can occur when doing a DELETE while a SELECT is pending.
  Expect at least one more beta before version 3.0 goes final.
2004-07-22 - Version 3.0.3 (beta)
  The second beta release of SQLite version 3.0 is now available.
  This new beta fixes many bugs and adds support for databases with
  varying page sizes.  The next 3.0 release will probably be called
  a final or stable release.

  Version 3.0 adds support for internationalization and a new
  more compact file format. 
  Details.
  The API and file format have been fixed since 3.0.2.  All
  regression tests pass (over 100000 tests) and the test suite
  exercises over 95% of the code.

  SQLite version 3.0 is made possible in part by AOL
  developers supporting and embracing great Open-Source Software.
2004-07-22 - Version 2.8.15
  SQLite version 2.8.15 is a maintenance release for the version 2.8
  series.  Version 2.8 continues to be maintained with bug fixes, but
  no new features will be added to version 2.8.  All the changes in
  this release are minor.  If you are not having problems, there is
  there is no reason to upgrade.
2004-06-30 - Version 3.0.2 (beta) Released
  The first beta release of SQLite version 3.0 is now available.
  Version 3.0 adds support for internationalization and a new
  more compact file format. 
  Details.
  As of this release, the API and file format are frozen.  All
  regression tests pass (over 100000 tests) and the test suite
  exercises over 95% of the code.

  SQLite version 3.0 is made possible in part by AOL
  developers supporting and embracing great Open-Source Software.
2004-06-25 - Website hacked
  The www.sqlite.org website was hacked sometime around 2004-06-22
  because the lead SQLite developer failed to properly patch CVS.
  Evidence suggests that the attacker was unable to elevate privileges
  above user "cvs".  Nevertheless, as a precaution the entire website
  has been reconstructed from scratch on a fresh machine.  All services
  should be back to normal as of 2004-06-28.
2004-06-18 - Version 3.0.0 (alpha) Released
  The first alpha release of SQLite version 3.0 is available for
  public review and comment.  Version 3.0 enhances internationalization support
  through the use of UTF-16 and user-defined text collating sequences.
  BLOBs can now be stored directly, without encoding.
  A new file format results in databases that are 25% smaller (depending
  on content).  The code is also a little faster.  In spite of the many
  new features, the library footprint is still less than 240KB
  (x86, gcc -O1).
  Additional information.

  Our intent is to freeze the file format and API on 2004-07-01.
  Users are encouraged to review and evaluate this alpha release carefully 
  and submit any feedback prior to that date.

  The 2.8 series of SQLite will continue to be supported with bug
  fixes for the foreseeable future.
2004-06-09 - Version 2.8.14 Released
  SQLite version 2.8.14 is a patch release to the stable 2.8 series.
  There is no reason to upgrade if 2.8.13 is working ok for you.
  This is only a bug-fix release.  Most development effort is
  going into version 3.0.0 which is due out soon.
2004-05-31 - CVS Access Temporarily Disabled
  Anonymous access to the CVS repository will be suspended
  for 2 weeks beginning on 2004-06-04.  Everyone will still
  be able to download
  prepackaged source bundles, create or modify trouble tickets, or view
  change logs during the CVS service interruption. Full open access to the
  CVS repository will be restored on 2004-06-18.
2004-04-23 - Work Begins On SQLite Version 3
  Work has begun on version 3 of SQLite.  Version 3 is a major
  changes to both the C-language API and the underlying file format
  that will enable SQLite to better support internationalization.
  The first beta is schedule for release on 2004-07-01.

  Plans are to continue to support SQLite version 2.8 with
  bug fixes.  But all new development will occur in version 3.0.

This page last modified on  2022-08-10 18:45:48 UTColdnews.html
§>§ë‚W
1ÕE#Quality Management1. Overview


This is the Quality Management Plan for SQLite.


Quality management documents tend to expand into
binders full of incomprehensible jargon that nobody
reads.  This document strives to break that pattern by
being concise and useful.


The inspiration for this document is
DO-178B.
Among quality standards, DO-178B seems to have the highest usefulness
to paperwork ratio.  Even so, the amount of documentation needed
for a full-up DO-178B implementation is vast.  SQLite strives to be
nimble and low-ceremony, and to that end, much of the required
DO-178B documentation is omitted.  We retain only those parts that
genuinely improve quality for an open-source software project such
as SQLite.


The purpose of this document is to brief the reader on how the
SQLite development team functions on a daily basis, as they continuously
enhance the SQLite software and work to improve its already high reliability.
The document achieves its purpose if a competent developer can be
assimilated into the development team quickly after perusing this
document.

1.1. About This Document


The quality management plan was originally composed by going through
the description of outputs in section 11 of DO-178B (pages 48 through 56)
and writing down those elements that seemed relevant to SQLite.
The text will be subsequent revised to track enhancements to the
SQLite quality process.

2. Soft¼…®e‚V
/ŠÝ %SQLite Older News2015-11-02 - Release 3.9.2
SQLite version 3.9.2 is a patch release fixing two obscure bugs.
(Details: (1),
(2)).
Upgrade only if you are having problems.
2015-10-16 - Release 3.9.1
SQLite version 3.9.1 is a
small patch
to version 3.9.0 that includes
a few simple build script and #ifdef tweaks to make the code easier to 
compile on a wider variety of platform.  There are no functional changes, 
except for a single
minor bug-fix in 
the json1 extension to stop it from recognizing form-feed 
(ASCII 0x0c) as a whitespace character, in conformance with 
RFC7159.
2015-10-14 - Release 3.9.0
SQLite version 3.9.0 is a regularly schedule maintenance release.
Key changes include:

Begin using semantic versioning.
JSON SQL functions
The FTS5 full-text search engine
Support for indexes on expressions
Support for table-valued functions

See the change log for a long and more complete list
of changes.
2015-07-29 - Release 3.8.11.1
SQLite version 3.8.11.1 is a patch release that fixes two arcane
   issues that were reported shortly after 3.8.11 was released.  Upgrade
   from 3.8.11 only in the unlikely event that one of these obscure
   issues affect your code.
2015-07-27 - Release 3.8.11
SQLite version 3.8.11 is a regularly scheduled maintenance release.
   See the change log for details.
2015-05-20 - Release 3.8.10.2
Yikes!  Index corruption after a sequence of valid SQL statements!
It has been many years since anything like 
   this bug has snuck into
   an official SQLite release.  But for the pasts seven months
   (version 3.8.7 through version 3.8.10.1)
   if you do an INSERT into a carefully
   crafted schema in which there are two nested triggers that convert
   an index key value from TEXT to INTEGER and then back
   to TEXT again, the INTEGER value might get inserted as the index
   key instead of the correct TEXT, resulting in index corruption.
   This patch release adds a single line of code to fix the problem.
If you do¦½ware Development Plan


This section is a combination of the Plan For Software Aspects Of
Certification and the Software Development Plan sections of DO-178B.



See About SQLite for an overview of the
SQLite software and what it does and how it is different.

2.1. Software Life Cycle


SQLite uses a continuous integration process.  The software
is under constant enhancement and refinement.  The latest trunk
check-ins are frequently used internally for mission-critical
operations. 


There is no pre-defined release cycle.  Releases occur
when there is a critical mass of feature enhancements and/or
bug fixes.  Historically, releases have occurred about 5 or 6
times per year.
Users of SQLite pick up new releases from the website on an
as-needed basis.

2.1.1. Maintenance Releases


Routine maintenance releases of SQLite contain feature enhancements,
performance enhancements, and/or fixes for non-critical issues.
The version number for major releases are of the form "3.N.0"
for some integer N.  See the version numbering conventions document
for details.


Upcoming maintenance releases announced on the sqlite-users and
sqlite-dev mailing lists about two weeks prior to the anticipated
release.  Approximately one week prior to release, the lead developer
declares "pencils down" after which only bug-fix check-ins are
allowed on trunk.  A new 
release checklist
is created and updated as needed.  As items of the checklist are 
verified, they are checked off and turn green.  The release occurs
when all elements of the checklist are green.  That process normally
takes about a week.

2.1.2. Patch Releases


Occasionally, a serious problem is found and a small "patch" release
must be made against a regular maintenance release.  Patches are distinct
from maintenance releases in that the number of lines of code changed
from the previous release is small.  Every effort is made to avoid
patch releases by making sure that maintenance releases are bug free.


Patch releases may or may not have a release checklist, depending on the
issue.  This is a judgement call by the project leader.

2.2. Release History

The documentation system automatically maintains a
chronology of past releases, as well as a
complete list of SQLite releases with change summaries.

2.3. Schedule

SQLite has a long-range vision.
Planning is done with the assumption that SQLite
will be used and supported through at least the year 2050.
All code is written with the idea that it will one day be read and
maintained by people not yet born.  The code is carefully commented
with an eye toward helping those future developers more easily 
understand the logic and the rationale behind the code.

3. Software Development Environment


SQLite is written in portable C code.
Development work occurs on a mix of Linux, Mac, and Windows workstations.
The developers use command-line tools and eschew integrated development
environments (IDEs) whenever possible.  All developers are expected to be
fluent with the unix command-line.


A minimum setup for compiling and testing SQLite from canonical
sources is as follows:


 A host computer with a 32-bit or 64-bit address space.
     The OS can be Linux, Mac, Windows, *BSD, Solaris, or some other.
 A C99 compiler such as GCC (including MinGW variants for Windows),
     Clang, or MSVC
 A text editor of the user's choice supporting UTF-8 text.
 Tcl version 8.6 or later.
 The "make" utility, or optionally "nmake" on Windows.



The Tcl script language is used to help translate canonical source code
into the amalgamation and to manage testing.  Tcl is not used directly
by SQLite itself (unless requested by a compile-time option).  End users
of the SQLite amalgamation sources do not need Tcl.


When building the CLI, it is helpful, but not required, to have
the following third-party libraries on hand:


 zLib
 readline
     or editline
     or linenoise for
     command-line editing.



A complete release-test of SQLite requires additional software,


 valgrind
 gcov



SQLite is expected to operate the same, and use exactly the same 
on-disk¾ format,
on all modern operating systems, on all modern computer architectures,
and using all modern C compilers.  The developers are constantly testing
SQLite on as many diverse platforms as they can get their hands on.

4. Software Verification Plan

The testing process for SQLite is described in the testing document.
Testing objectives include:


 100% MC/DC in an as-delivered configuration
 Testing of both source code and object code
 Testing on multiple platforms and with multiple compilers
 Fuzz testing
 Code change inspection
 Dynamic and static analysis of the code


The testing process is controlled by the
release testing checklists.  The checklists succinctly summarize
all steps necessary to fully validate SQLite, and they record when
and by whom each validation step was performed.

The set of checklist items for release checklist is potentially
updated for each release.  The content and complete
history of each release checklist are retained for the historical
record.

5. Software Configuration Management

5.1. Version Control


SQLite source code is managed using the Fossil
version control system.  Fossil was written specifically to support
SQLite development.  Fossil provides both distributed version control
and issue tracking.

5.2. Survivability


All code is archived on three separate machines:
https://www.sqlite.org, https://www2.sqlite.org, https://www3.sqlite.org.
These machines are located in different cities (Dallas, Newark, and
San Francisco, respectively) and managed by two different hosting
companies (Linode for the first two and
Digital Ocean for the third).
This diversity is intended to avoid a single point of failure.


The main machine in Dallas https://www.sqlite.org/ is the primary
server and the one that most people use.  The other two are considered
backups.


In addition to the official repositories, the developers typically
keep complete clones of all software on their personal machines.
And there are other clones scattered about the internet.

5.3. Repositories

The SQLite source is broken up into multiple repositories, each described
in a separate section below.

5.3.1. SQLite Source Code

The SQLite source code and the TCL test suite are stored together
in a single repository.  This one repository is all that is required to
build the SQLite.  The source repository is public and is
readable by anonymous passersby on the internet.


 Primary location: https://www.sqlite.org/src
 Backup A: https://www2.sqlite.org/src
 Backup B: https://www3.sqlite.org/cgi/src
 GitHub mirror: https://github.com/sqlite/sqlite/


5.3.2. SQLite Documentation Sources

The documentation sources include documentation text and images with the
scripts and makefile needed to construct the SQLite website documentation.
This document is contained within the documentation sources.  The
document sources are kept in a separate repository distinct from the
source code.  The documentation sources repository is publicly readable.

The makefiles and scripts used to generate the documentation gather
text from baseline documents in the documentation source repository.
Additional text is extracted from comments in the SQLite source code.
Requirements coverage information is extracted from special comments in the
TCL test suite which is part of the source repository, and from
comments in the TH3 test suite which is in a separate private repository.


 Primary location: https://www.sqlite.org/docsrc
 Backup A: https://www2.sqlite.org/docsrc
 Backup B: https://www3.sqlite.org/cgi/docsrc


5.3.3. SQL Logic Test


The SQL Logic Tests are a set of test cases designed to show that
SQLite behaves the same as other SQL database engines.  These tests
are hosted in a separate code public repository.


 Primary location: https://www.sqlite.org/sqllogictest
 Backups on private servers


5.3.4. Test Harness #3


The Test Harness #3 or TH3 test suite is a private set of
test cases used to test SQLite to 100% MC/DC in an as-delivered
configuration.  TH3 sources are served on the same servers as the
other SQLite repositories, but differ from the others in being
proprietary.  The TH3 code is only accessible to SQLite developers.



 Primary location: https://www.sqlite.org/th3
 Backup A: https://www3.sqlite.org/cgi/th3
 Additional backups on private servers


5.3.5. Dbsqlfuzz


The dbsqlfuzz module is a 
libFuzzer-based fuzzer
for SQLite.  Dbsqlfuzz fuzzes both the SQL and the database file at
the same time.  Dbsqlfuzz uses a customized mutator.


Dbsqlfuzz seems to work better at finding problems than any other
fuzzer available.  For that reason, it is kept private.  We do not
want hacker gaining access to this technology.


 Primary location: https://www.sqlite.org/dbsqlfuzz
 Backup A: https://www3.sqlite.org/cgi/dbsqlfuzz
 Additional backups on private servers


5.4. Software Verification Results


Release testing proceeds by checklist.  The current status and
complete change history for each checklist is stored in a separate
SQLite database file.  These files are not version controlled, but
separate copies are maintained on private backup servers.

The source code to the software that runs the checklists is stored
in its own Fossil repository at https://www.sqlite.org/checklistapp.

6. Software Requirements Standards And Data

In the SQLite project, the "requirements" are the project documentation.
Special markup in the documentation text indentifies individual requirements.
The requirement numbers are based on a cryptographic hash of normalized
requirement text, so that it is impossible to change the requirement text
without also changing the requirement number.

Documentation text (and hence requirement text) is taken from the
SQLite Documentation source repository, described above, and also from
comments in the implementation.  The makefiles to build the documentation
are in the documentation source repository.

When the documentation is build, requirements are identified and labeled.
The documentation build process also scans for test cases that verify
each requirement and constructs a matrix showing which requirements have
been testing and identifying the specific test cases that test those
requirements.

7. Software Design And Coding Standards

Objective coding standards for SQLite are minimal:


 2-space indentation
 No lines over 80 characters in length
 No tabs


All other design and coding rules are subjective.  The
goal here is to make the software so that it is readable
and maintainable through the year 2050.  To that end, we look
for succinct yet useful comments (no boilerplate), carefully
chosen variable names, and careful explanation of the meaning
of each data structure and the role of each code block.

8. Problem Reports

All problems are fixed expeditiously.  There are no lingering problems
in the sQLite software.

The Fossil version control system utilized by
SQLite contains built-in support for tracking trouble-tickets.  This built-in
ticket system is used to track and document many historical problems.

The SQLite Community Forum is a place
where anybody on the internet can go to ask questions about or report bugs
against SQLite.  Bugs found by third-parties are often reported initially
on the Forum.  Forum-reported bugs will sometimes be transferred to tickets,
though recent practice as been to just deal with the bugs on the Forum.
The Forum has an excellent full-text search feature, is mirrored to
multiple machines, and is just as searchable and survivable as the ticket
system, so it seems unnecessary to duplicate Forum-originated bug reports
into the ticket system.  The public locations of the Forum are:


 Primary location: https://www.sqlite.org/forum
 Backup A: https://www2.sqlite.org/forum
 Backup B: https://www3.sqlite.org/cgi/forum



As with the source repositories, the Forum is also synced to various
private machines.
Note that because of the way Fossil works, the "backups" are more than just
read-only backups.  They can also function as data inputs.  All content
entered is synced to all repositories, regardless of which repository is
used for insertion.
This page last modified on  2021-11-26 21:13:11 UTCqmplan.htmlÀthe constituent NULLs.
The following query demonstrates some row value comparisons:

SELECT
  (1,2,3) = (1,2,3),          -- 1
  (1,2,3) = (1,NULL,3),       -- NULL
  (1,2,3) = (1,NULL,4),       -- 0
  (1,2,3) &lt; (2,3,4),          -- 1
  (1,2,3) &lt; (1,2,4),          -- 1
  (1,2,3) &lt; (1,3,NULL),       -- 1
  (1,2,3) &lt; (1,2,NULL),       -- NULL
  (1,3,5) &lt; (1,2,NULL),       -- 0
  (1,2,NULL) IS (1,2,NULL);   -- 1


The result of "(1,2,3)=(1,NULL,3)" is NULL because the result might be
true if we replaced NULL&rarr;2 or false if we replaced NULL&rarr;9.
The result of "(1,2,3)=(1,NULL,4)" is not NULL because there is no
substitutions of the constituent NULL that will make the expression true,
since 3 will never equal 4 in the third column.

Any of the row values in the previous example could be replace by a
subquery that returns three columns and the same answer would result.
For example:

CREATE TABLE t1(a,b,c);
INSERT INTO t1(a,b,c) VALUES(1,2,3);
SELECT (1,2,3)=(SELECT * FROM t1); -- 1




2.2. Row Value IN Operators

For a row-value IN operator, the left-hand side (hereafter "LHS") can be either
a parenthesized list of values or a subquery with multiple columns.  But the
right-hand side (hereafter "RHS") must be a subquery expression.

CREATE TABLE t2(x,y,z);
INSERT INTO t2(x,y,z) VALUES(1,2,3),(2,3,4),(1,NULL,5);
SELECT
   (1,2,3) IN (SELECT * FROM t2),  -- 1
   (7,8,9) IN (SELECT * FROM t2),  -- 0
   (1,3,5) IN (SELECT * FROM t2);  -- NULL


2.3. Row Values In UPDATE Statements

Row values can also be used in the SET clause of an UPDATE statement.
The LHS must be a list of column names.  The RHS can be any row value.
For example:

UPDATE tab3 
   SET (a,b,c) = (SELECT x,y,z
                    FROM tab4
                   WHERE tab4.w=tab3.d)
 WHERE tab3.e BETWEEN 55 AND 66;


3. Example Uses Of Row Values

3.1. Scrolling Window Queries

Suppose an application wants to display a list of contacts
in alphabetical order by lastname, firstname, in a scrolling window
that can only show 7 contacts at a time.  Initialize the scrolling
window to the first 7 entries is easy:

SELECT * FROM contacts
 ORDER BY lastname, firstname
 LIMIT 7;


When the user scrolls down, the application needs to find the
second set of 7 entries.  One way to do this is to use the OFFSET clause:

SELECT * FROM contacts
 ORDER BY lastname, firstname
 LIMIT 7 OFFSET 7;


OFFSET gives the correct answer.  However, OFFSET requires time
proportional to the offset value.  What really happens
with "LIMIT x OFFSET y" is that SQLite computes the query as
"LIMIT x+y" and discards the first y values without returning them
to the application.  So as the window scrolls down toward
the bottom of a long list, and the y value becomes larger and larger,
successive offset computations take more and more time.

A more efficient approach is to remember the last entry currently
displayed and then use a row value comparison in the WHERE
clause:

SELECT * FROM contacts
 WHERE (lastname,firstname) &gt; (?1,?2)
 ORDER BY lastname, firstname
 LIMIT 7;


If the lastname and firstname on the bottom row of the previous
screen are bound to ?1 and ?2, then the query above computes the next
7 rows.  And, assuming there is an appropriate index, it does so
very efficiently &mdash; much more efficiently than OFFSET.

3.2. Comparison of dates stored as separate fields

The usual way of storing a date in a database table is as a single
field, as either a unix timestamp, a julian day number, or an ISO-8601
dates string.  But some application store dates as three separate
fields for the year, month, and day.  

CREATE TABLE info(
  year INT,          -- 4 digit year
  month INT,         -- 1 through 12
  day INT,           -- 1 through 31
  other_stuff BLOB   -- blah blah blah
);


When dates are stored this way, row value comparisons provide a
convenient way to compare dates:

SELECT * FROM info
 WHERE (year,month,day) BETWEEN (2015,9,12) AND (2016,9,12);


3.3. Search against multi-column keys

Suppose we want to know the order number, product number, and quantity
for any item in which the product number and quantity match the product
number and quantity of any item in order number 365:

SELECT ordid, prodid, qty
  FROM item
 WHERE (prodid, qty) IN (SELECT prodid, qty
                           FROM item
                          WHERE ordid = 365);


The query above could be rewritten as a join and without the use
of row values:

SELECT t1.ordid, t1.prodid, t1.qty
  FROM item AS t1, item AS t2
 WHERE t1.prodid=t2.prodid
   AND t1.qty=t2.qty
   AND t2.ordid=365;


Because the same query could be written without the use of row values,
row values do not provide new capabilities.  However, many developers say
that the row value format is easier to read, write, and debug.

Even in the JOIN form, the query can be made clearer through the use of
row values:

SELECT t1.ordid, t1.prodid, t1.qty
  FROM item AS t1, item AS t2
 WHERE (t1.prodid,t1.qty) = (t2.prodid,t2.qty)
   AND t2.ordid=365;


This later query generates exactly the same bytecode as the previous
scalar formulation, but using syntax that it cleaner and
easier to read.

3.4. Update multiple columns of a table based on a query

The row-value notation is useful for updating two or more columns
of a table from the result of a single query.
An example of this is in the full-text search feature of the
Fossil version control system.

In the Fossil full-text search system,
documents that participate in the full-text search (wiki pages, tickets,
check-ins, documentation files, etc) are tracked by a table called
"ftsdocs" (full text search documents).
As new documents are added to the repository, they are not indexed right
away.  Indexing is deferred until there is a search request.  The
ftsdocs table contains an "idxed" field which is true if the document
has been indexed and false if not.

When a search request occurs and pending documents are indexed for the
first time, the ftsdocs table must be updated by setting the idxed column
to true and also filling in several other columns with information pertinent
to the search.  That other information is obtained from a join.  The
query is this:

UPDATE ftsdocs SET
  idxed=1,
  name=NULL,
  (label,url,mtime) = 
      (SELECT printf('Check-in &#91;%%.16s&#93; on %%s',blob.uuid,
                     datetime(event.mtime)),
              printf('/timeline?y=ci&amp;c=%%.20s',blob.uuid),
              event.mtime
         FROM event, blob
        WHERE event.objid=ftsdocs.rid
          AND blob.rid=ftsdocs.rid)
WHERE ftsdocs.type='c' AND NOT ftsdocs.idxed


(See the 
source code
for further detail.  Other examples
here and
here.)

Five out of nine columns in the ftsdocs table are updated.  Two of
the modified columns, "idxed" and "name", can be updated independently of
the query.  But the three columns "label", "url", and "mtime" all require
a join query against the "event" and "blob" tables.  Without row values,
the equivalent UPDATE would require that the join be repeated three times, 
once for each column to be updated.

3.5. Clarity of presentation

Sometimes the use of row values just makes the SQL easier to read
and write.  Consider the following two UPDATE statements:

UPDATE tab1 SET (a,b)=(b,a);
UPDATE tab1 SET a=b, b=a;


Both UPDATE statements do exactly the same thing.  (They generate
identical bytecode.)  But the first form, the row value form, seems
to make it clearer that the intent of the statement is to swap the
values in columns A and B.

Or consider these identical queries:

SELECT * FROM tab1 WHERE a=?1 AND b=?2;
SELECT * FROM tab1 WHERE (a,b)=(?1,?2);


Once again, the SQL statements generate identical bytecode and thus
do exactly the same job in exactly the same way.  But the second form
is made easier for humans to read by grouping the query parameters together
into a single row value rather than scattering them across the WHERE
clause.

4. Backwards Compatibility

Row values were added to SQLite
version 3.15.0 (2016-10-14).  Attempts to use row values in
prior versions of SQLite will generate syntax errors.
This page last modified on  2022-03-07 15:31:00 UTCrowvalue.html

p
p˂X
!•K'Row Values1. Definitions

A "value" is a single number, string, BLOB or NULL.
Sometimes the qualified name "scalar value" is used to emphasize that
only a single quantity is involved.

A "row value" is an ordered list of two or more scalar values.
In other words, a "row value" is a vector or tuple.

The "size" of a row value is the number of scalar values the row value contains.
The size of a row value is always at least 2.
A row value with a single column is just a scalar value.
A row value with no columns is a syntax error.

2. Syntax

SQLite allows row values to be expressed in two ways:

A parenthesized, comma-separated list of scalar values.
A subquery expression with two or more result columns.


SQLite can use row values in two contexts:

Two row values of the same size 
can be compared using operators &lt;, &lt;=, &gt;, &gt;=,
=, &lt;&gt;, IS, IS NOT, IN, NOT IN, BETWEEN, or CASE.
In an UPDATE statement, a list of column names can be set to a row value of
the same size.


The syntax for row values and the circumstances in which row values
can be used are illustrated in examples below.

2.1. Row Value Comparisons

Two row values are compared by looking at the constituent scalar
values from left to right.
A NULL means of "unknown".  
The overall result of comparison is NULL if it is possible to make the
result either true or false by substituting alternative values in place
of ¿Ãe in an operation called "checkpoint".  WAL mode is
enabled by running "PRAGMA journal_mode=WAL".



In rollback mode, SQLite implements isolation by locking the database
file and preventing any reads by other database connections
while each write transaction is underway.
Readers can be active at the beginning of a write, before any content
is flushed to disk and while all changes are still held in the writer's
private memory space.  But before any changes are made to the database file
on disk, all readers must be (temporarily) expelled in order to give the writer
exclusive access to the database file.  
Hence, readers are prohibited from seeing incomplete
transactions by virtue of being locked out of the database while the
transaction is being written to disk.  Only after the transaction is
completely written and synced to disk and committed are the readers allowed
back into the database.  Hence readers never get a chance to see partially
written changes.



WAL mode permits simultaneous readers and writers.  It can do this because
changes do not overwrite the original database file, but rather go
into the separate write-ahead log file.  That means that readers can continue
to read the old, original, unaltered content from the original database file
at the same time that the writer is appending to the write-ahead log.
In WAL mode, SQLite exhibits "snapshot isolation".  When a read transaction
starts, that reader continues to see an unchanging "snapshot" of the database
file as it existed at the moment in time when the read transaction started.
Any write transactions that commit while the read transaction is
active are still invisible to the read transaction, because the reader is
seeing a snapshot of database file from a prior moment in time.



An example:  Suppose there are two database connections X and Y.  X starts
a read transaction using BEGIN followed by one or more SELECT statements.
Then Y comes along and runs an UPDATE statement to modify the database.
X can subsequently do a SELECT against the records that Y modified but
X will see the older unmodified entries because Y's changes are all
invisible to X while X is holding a read transaction.  If X wants to see
the changes that Y made, then X must end its read transaction and
start a new one (by running COMMIT followed by another BEGIN.)



Another example: X starts a read transaction using BEGIN and SELECT, then
Y makes a changes to the database using UPDATE.  Then X tries to make a
change to the database using UPDATE.  The attempt by X to escalate its
transaction from a read transaction to a write transaction fails with an
SQLITE_BUSY_SNAPSHOT error because the snapshot of the database being
viewed by X is no longer the latest version of the database.  If X were
allowed to write, it would fork the history of the database file, which is
something SQLite does not support.  In order for X to write to the database,
it must first release its snapshot (using ROLLBACK for example) then
start a new transaction with a subsequent BEGIN.



If X starts a transaction that will initially only read but X knows it
will eventually want to write and does not want to be troubled with
possible SQLITE_BUSY_SNAPSHOT errors that arise because another connection
jumped ahead of it in line, then X can issue BEGIN IMMEDIATE to start
its transaction instead of just an ordinary BEGIN.  The BEGIN IMMEDIATE
command goes ahead and starts a write transaction, and thus blocks all
other writers.  If the BEGIN IMMEDIATE operation succeeds, then no
subsequent operations in that transaction will ever fail with an
SQLITE_BUSY error.


No Isolation Between Operations On The Same Database Connection

SQLite provides isolation between operations in separate database
connections.  However, there is no isolation between operations that
occur within the same database connection.

In other words, if X begins a write transaction using BEGIN IMMEDIATE
then issues one or more UPDATE, DELETE, and/or INSERT
statements, then those changes are visible to subsequent SELECT statements
that are evaluated in database connection X.  SELECT statements on
a different  database connection Y will show no changes until the X
transaction commits.  But SELECT statements in X will show the changes
prior to the commit.

Within a single database connection X, a SELECT statement always sees all
changes to the database that are completed prior to the start of the SELECT
statement, whether committed or uncommitted.  And the SELECT statement
obviously does not see any changes that occur after the SELECT statement
completes.  But what about changes that occur while the SELECT statement
is running?  What if a SELECT statement is started and the sqlite3_step()
interface steps through roughly half of its output, then some UPDATE
statements are run by the application that modify the table that the
SELECT statement is reading, then more calls to sqlite3_step() are made
to finish out the SELECT statement?  Will the later steps of the SELECT
statement see the changes made by the UPDATE or not?  The answer is that
this behavior is undefined.  In particular, whether or not the SELECT statement
sees the concurrent changes depends on which release of SQLite is
running, the schema of the database file, whether or not ANALYZE has
been run, and the details of the query.  In some cases, it might depend
on the content of the database file, too.  There is no good way to know whether
or not a SELECT statement will see changes that were made to the database
by the same database connection after the SELECT statement was started.
And hence, developers should diligently avoid writing applications
that make assumptions about what will occur in that circumstance.


If an application issues a SELECT statement on a single table like
"SELECT rowid, * FROM table WHERE ..." and starts stepping through 
the output of that statement using sqlite3_step() and examining each
row, then it is safe for the application to delete the current row or
any prior row using "DELETE FROM table WHERE rowid=?".  It is also safe
(in the sense that it will not harm the database) for the application to
delete a row that expected to appear later in the query but has not
appeared yet.  If a future row is deleted, however, it might happen that
the row turns up after a subsequent sqlite3_step(), even after it has
allegedly been deleted.  Or it might not.  That behavior is undefined.
The application can 
also INSERT new rows into the table while the SELECT statement is 
running, but whether or not the new rows appear
in subsequent sqlite3_step()s of the query is undefined.  And the application
can UPDATE the current row or any prior row, though doing so might cause 
that row to reappear in a subsequent sqlite3_step().  As long as the 
application is prepared to deal with these ambiguities, the operations 
themselves are safe and will not harm the database file.


For the purposes of the previous two paragraphs, two database connections
that have the same shared cache and which have enabled
PRAGMA read_uncommitted are considered to be the same database connection.


Summary



Transactions in SQLite are SERIALIZABLE.



Changes made in one database connection are invisible to all other database
connections prior to commit.



A query sees all changes that are completed on the same database connection
prior to the start of the query, regardless of whether or not those changes
have been committed.



If changes occur on the same database connection after a query 
starts running but before the query completes, then it is undefined whether 
or not the query will see those changes.



If changes occur on the same database connection after a query 
starts running but before the query completes, then the query might return
a changed row more than once, or it might return a row that was previously
deleted.



For the purposes of the previous four items, two database connections that 
use the same shared cache and which enable PRAGMA read_uncommitted are
considered to be the same database connection, not separate database
connections.


This page last modified on  2022-01-20 21:38:08 UTCisolation.html
÷÷Ûy‚Y
3·))Isolation In SQLiteIsolation In SQLite



The "isolation" property of a database determines when changes made to 
the database by one operation become visible to other concurrent operations.


Isolation Between Database Connections


If the same database is being read and written using two different
database connections (two different sqlite3 objects returned by
separate calls to sqlite3_open()) and the two database connections
do not have a shared cache, then the reader is only able to
see complete committed transactions from the writer.  Partial changes
by the writer that have not been committed are invisible to the reader.
This is true regardless of whether the two database connections are in
the same thread, in different threads of the same process, or in
different processes.  This
is the usual and expected behavior for SQL database systems.



The previous paragraph is also true (separate database connections are
isolated from one another) in shared cache mode as long as the
read_uncommitted pragma remains turned off.  The read_uncommitted pragma
is off by default and so if the application does nothing to turn it on, 
it will remain off.  Hence, unless the read_uncommitted pragma is used
to change the default behavior, changes made by one database connection
are invisible to readers on a different database connection sharing the
same cache until the writer commits its transaction.



If two database connections share the same cache and the reader has 
enabled the read_uncommitted pragma, then the reader will be able to
see changes made by the writer before the writer transaction commits.
The combined use of shared cache mode and the read_uncommitted pragma 
is the only way that one database connection can see uncommitted changes
on a different database connection.  In all other circumstances, separate
database connections are completely isolated from one another.


Except in the case of shared cache database connections with
PRAGMA read_uncommitted turned on, all transactions in SQLite show
"serializable" isolation.  SQLite implements serializable transactions
by actually serializing the writes.  There can only be a single writer
at a time to an SQLite database.  There can be multiple database connections
open at the same time, and all of those database connections can write
to the database file, but they have to take turns.  SQLite uses locks
to serialize the writes automatically; this is not something that
the applications using SQLite need to worry about.


Isolation And Concurrency


SQLite implements isolation and concurrency control (and atomicity) using
transient journal files that appear in the same directory as the database file.
There are two major "journal modes".
The older "rollback mode" corresponds to using the "DELETE", "PERSIST",
or "TRUNCATE" options to the journal_mode pragma.  In rollback mode,
changes are written directly into the database file, while simultaneously
a separate rollback journal file is constructed that is able to restore
the database to its original state if the transaction rolls back.
Rollback mode (specifically DELETE mode, meaning that the rollback journal
is deleted from disk at the conclusion of each transaction) is the current
default behavior.


Since version 3.7.0 (2010-07-21), 
SQLite also supports "WAL mode".  In WAL mode,
changes are not written to the original database file.  Instead, changes
go into a separate "write-ahead log" or "WAL" file.  
Later, after the transaction
commits, those changes will be moved from the WAL file back into the
original databasÂÆse three files in the same directory
and compile them together.  Using MSVC:


cl shell.c sqlite3.c -Fesqlite3.exe


On unix systems (or on Windows using cygwin or mingw+msys)
the command typically looks something like this:


gcc shell.c sqlite3.c -lpthread -ldl -lm -o sqlite3


The pthreads library is needed to make SQLite threadsafe.  But
since the CLI is single threaded,  we could instruct SQLite to build
in a non-threadsafe mode and thereby omit the pthreads library:


gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl -lm -o sqlite3


The -ldl library is needed to support dynamic loading, the
sqlite3_load_extension() interface and the
load_extension() SQL function.  If these features are not required,
then they can be omitted using SQLITE_OMIT_LOAD_EXTENSION compile-time
option:


gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c -o sqlite3


One might want to provide other compile-time options such as
-DSQLITE_ENABLE_FTS4 or -DSQLITE_ENABLE_FTS5 for full-text search,
-DSQLITE_ENABLE_RTREE for the R*Tree search engine extension,
-DSQLITE_ENABLE_JSON1 to include JSON SQL functions, or
-DSQLITE_ENABLE_DBSTAT_VTAB for the dbstat virtual table.
In order to see extra commentary in EXPLAIN listings, add the 
-DSQLITE_ENABLE_EXPLAIN_COMMENTS option.
On unix systems, add -DHAVE_USLEEP=1 if the host machine supports the
usleep() system call.  Add -DHAVE_READLINE and the -lreadline
and -lncurses libraries to get command-line editing support.
One might also want to
specify some compiler optimization switches.  (The precompiled
CLI available for download from the SQLite website uses "-Os".)
There are countless possible variations here.  A command to
compile a full-featured shell might look something like this:


gcc -Os -I. -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS4 &#92;
   -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 &#92;
   -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_EXPLAIN_COMMENTS &#92;
   -DHAVE_USLEEP -DHAVE_READLINE &#92;
   shell.c sqlite3.c -ldl -lm -lreadline -lncurses -o sqlite3


The key point is this:  Building the CLI consists of compiling 
together two C-language files.   The shell.c file contains the
definition of the entry point and the user input loop and the
SQLite amalgamation sqlite3.c contains the complete implementation
of the SQLite library.



3. Compiling The TCL Interface

The TCL interface for SQLite is a small module that is added into
the regular amalgamation.  The result is a new amalgamated source
file called "tclsqlite3.c".  This single source file is all that
is needed to generate a shared library that can be loaded into a
standard 
tclsh or 
wish using the 
TCL load command, or to generate a
standalone tclsh that comes with SQLite built in.
A copy of the tcl amalgamation
is included on the download page as a file in the TEA tarball.

To generate a TCL-loadable library for SQLite on Linux, the following
command will suffice:


gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl


Building shared libraries for Mac OS X and Windows is not nearly so simple,
unfortunately.  For those platforms it is best to use the configure script
and makefile that is included with the TEA tarball.

To generate a standalone tclsh that is statically linked with SQLite,
use this compiler invocation:


gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm


The trick here is the -DTCLSH=1 option.  The TCL interface module for
SQLite includes a main() procedure that initializes a TCL interpreter
and enters a command-line loop when it is compiled with -DTCLSH=1.  The
command above works on both Linux and Mac OS X, though one may need to adjust
the library options depending on the platform and which version of TCL one
is linking against.



4. Building The Amalgamation

The versions of the SQLite amalgamation that are supplied on the
download page are normally adequate for most users.  However, some
projects may want or need to build their own amalgamations.  A common
reason for building a custom amalgamation is in order to use certain
compile-time options to customize the SQLite library.  Recall that
the SQLite amalgamation contains a lot of C-code that is generated by
auxiliary programs and scripts.  Many of the compile-time
options effect this generated code and must be supplied to the code
generators before the amalgamation is assembled.  The set of 
compile-time options that must be passed into the code generators can
vary from one release of SQLite to the next, but at the time of this
writing (circa SQLite 3.6.20, 2009-11-04) the set of options that must
be known by the code generators includes:


SQLITE_ENABLE_UPDATE_DELETE_LIMIT
SQLITE_OMIT_ALTERTABLE
SQLITE_OMIT_ANALYZE
SQLITE_OMIT_ATTACH
SQLITE_OMIT_AUTOINCREMENT
SQLITE_OMIT_CAST
SQLITE_OMIT_COMPOUND_SELECT
SQLITE_OMIT_EXPLAIN
SQLITE_OMIT_FOREIGN_KEY
SQLITE_OMIT_PRAGMA
SQLITE_OMIT_REINDEX
SQLITE_OMIT_SUBQUERY
SQLITE_OMIT_TEMPDB
SQLITE_OMIT_TRIGGER
SQLITE_OMIT_VACUUM
SQLITE_OMIT_VIEW
SQLITE_OMIT_VIRTUALTABLE


To build a custom amalgamation, first download the original individual
source files onto a unix or unix-like development platform.  
Be sure to get the original source
files not the "preprocessed source files".  One can obtain the complete
set of original source files either from the download page or directly
from the configuration management system.

Suppose the SQLite source tree is stored in a directory named "sqlite".
Plan to construct the amalgamation in a parallel directory named (for
example) "bld".  First construct an appropriate Makefile by either
running the configure script at the top of the SQLite source tree, or by
making a copy of one of the template Makefiles at the top of the source tree.
Then hand edit this Makefile to include the desired compile-time options.
Finally run:


make sqlite3.c


Or on Windows with MSVC:


nmake /f Makefile.msc sqlite3.c


The "sqlite3.c" make target will automatically construct the regular
"sqlite3.c" amalgamation source file, its header file
"sqlite3.h", and the "tclsqlite3.c" amalgamation source
file that includes the TCL interface.
Afterwards, the needed files can be copied into project directories and
compiled according to the procedures outlined above.



5. Building A Windows DLL

To build a DLL of SQLite for use in Windows, first acquire the
appropriate amalgamated source code files, sqlite3.c and sqlite3.h.  
These can either
be downloaded from the SQLite website
or custom generated from sources as shown above.

With source code files in the working directory, a DLL
can be generated using MSVC with the following command:


cl sqlite3.c -link -dll -out:sqlite3.dll


The above command should be run from the MSVC Native Tools Command
Prompt.  If you have MSVC installed on your machine, you probably
have multiple versions of this Command Prompt, for native builds
for x86 and x64, and possibly also for cross-compiling to ARM.
Use the appropriate Command Prompt depending on the desired DLL.

If using the MinGW compiler, the command-line is this:


gcc -shared sqlite3.c -o sqlite3.dll


Note that MinGW generates 32-bit DLLs only.  There is a separate
MinGW64 project that can be used to generate 64-bit DLLs.  Presumably
the command-line syntax is similar.
Also note that recent versions of MSVC generate DLLs that will not work
on WinXP and earlier versions of Windows.  So for maximum compatibility
of your generated DLL, MinGW is recommended.  A good rule-of-thumb
is to generate 32-bit DLLs using MinGW and 64-bit DLLs using MSVC.

In most cases, you will want to supplement the basic commands above with
compile-time options appropriate for your application.  Commonly used
compile-time options include:


-Os - Optimize for size. 
Make the DLL as small as possible.

-O2 - Optimize for speed.  This will make the DLL larger by
unrolling loops and inlining functions.

-DSQLITE_ENABLE_FTS4 -
Include the full-text search engine code in SQLite.

-DSQLITE_ENABLE_RTREE - Include the R-Tree extension.

-DSQLITE_ENABLE_COLUMN_METADATA -
This enables some extra APIs that are required by some common systems,
including Ruby-on-Rails.

This page last modified on  2021-10-12 03:48:52 UTChowtocompile.html
µ§µÀ'‚[
m‚ÿK)File Locking And Concurrency In SQLite Version 3This document was originally created in early 2004 when SQLite version 2
was still in widespread use and was written to introduce
the new concepts of SQLite version 3 to readers who were already familiar
with SQLite version 2.  But these days, most readers of this document have
probably never seen SQLite version 2 and are only familiar with SQLite
version 3.  Nevertheless, this document continues to serve as an
authoritative reÈÚI‚Z
7´?/How To Compile SQLiteHow To Compile SQLite



 Overview 


SQLite is ANSI-C source code.
It must be compiled into machine code before it is useful.
This article is a guide to the various ways of compiling SQLite.


This article does not contain a step-by-step recipe for compiling
SQLite.  That would be difficult since each development situation
is different.
Rather, this article describes and illustrates the principals behind the
compilation of SQLite.  Typical compilation commands are provided as examples
with the expectation that application developers can use these examples
as guidance for developing their own custom compilation procedures.
In other words, this article provides ideas and insights, not turnkey
solutions.

1. Amalgamation Versus Individual Source Files 

SQLite is built from over one hundred files of C code and script
spread across multiple directories.  The implementation of SQLite is pure
ANSI-C, but many of the C-language source code files are either
generated or transformed by auxiliary C programs and AWK, SED, and TCL 
scripts prior to being incorporated into the finished SQLite library.
Building the necessary C programs and transforming and/or creating the
C-language source code for SQLite is a complex process.

To simplify matters, SQLite is also available as a pre-packaged
amalgamation source code file: sqlite3.c.  The amalgamation is
a single file of ANSI-C code that implements the entire SQLite library.
The amalgamation is much easier to deal with.  Everything is contained
within a single code file, so it is easy to drop into the source tree
of a larger C or C++ program.  All the code generation and transformation
steps have already been carried out so there are no auxiliary C programs
to configure and compile and no scripts to run.  And, because the entire
library is contained in a single translation unit, compilers are able to
do more advanced optimizations resulting in a 5% to 10% performance 
improvement.  For these reasons, the amalgamation source file 
("sqlite3.c") is recommended for all applications.


The use of the amalgamation is recommended for all applications.


Building SQLite directly from individual source code files is certainly
possible, but it is not recommended.  For some specialized applications, it
might be necessary to modify the build process in ways that cannot be done
using just the prebuilt amalgamation source file downloaded from the website.
For those situations, it is recommended that a customized amalgamation be
built (as described below)
and used.  In other words, even if a project requires building SQLite 
beginning with individual source files, it is still recommended that an
amalgamation source file be used as an intermediate step.



2. Compiling The Command-Line Interface

A build of the command-line interface requires three source
files:


sqlite3.c: The SQLite amalgamation source file
sqlite3.h: The header files that accompanies sqlite3.c and 
defines the C-language interfaces to SQLite.
shell.c: The command-line interface program itself.
This is the C source code file that contains the definition of
the main() routine and the loop that prompts for user input
and passes that input into the SQLite database engine for processing.


All three of the above source files are contained in the
amalgamation tarball available on the download page.

To build the CLI, simply put theÅÉference to how database file locking works in SQLite 
version 3.

The document only describes locking for the older rollback-mode
transaction mechanism.  Locking for the newer write-ahead log or WAL mode
is described separately.


1.0 File Locking And Concurrency In SQLite Version 3

SQLite Version 3.0.0 introduced a new locking and journaling 
mechanism designed to improve concurrency over SQLite version 2
and to reduce the writer starvation 
problem.  The new mechanism also allows atomic commits of transactions
involving multiple database files.
This document describes the new locking mechanism.
The intended audience is programmers who want to understand and/or modify
the pager code and reviewers working to verify the design
of SQLite version 3.



2.0 Overview


Locking and concurrency control are handled by the 

pager module.
The pager module is responsible for making SQLite "ACID" (Atomic,
Consistent, Isolated, and Durable).  The pager module makes sure changes
happen all at once, that either all changes occur or none of them do,
that two or more processes do not try to access the database
in incompatible ways at the same time, and that once changes have been
written they persist until explicitly deleted.  The pager also provides
a memory cache of some of the contents of the disk file.

The pager is unconcerned
with the details of B-Trees, text encodings, indices, and so forth.
From the point of view of the pager the database consists of
a single file of uniform-sized blocks.  Each block is called a
"page" and is usually 1024 bytes in size.   The pages are numbered
beginning with 1.  So the first 1024 bytes of the database are called
"page 1" and the second 1024 bytes are call "page 2" and so forth. All 
other encoding details are handled by higher layers of the library.  
The pager communicates with the operating system using one of several
modules 
(Examples:

os_unix.c,

os_win.c)
that provides a uniform abstraction for operating system services.


The pager module effectively controls access for separate threads, or
separate processes, or both.  Throughout this document whenever the
word "process" is written you may substitute the word "thread" without
changing the truth of the statement.


3.0 Locking


From the point of view of a single process, a database file
can be in one of five locking states:




UNLOCKED

No locks are held on the database.  The database may be neither read nor
written.  Any internally cached data is considered suspect and subject to
verification against the database file before being used.  Other 
processes can read or write the database as their own locking states
permit.  This is the default state.


SHARED



The database may be read but not written.  Any number of 
processes can hold SHARED locks at the same time, hence there can be
many simultaneous readers.  But no other thread or process is allowed
to write to the database file while one or more SHARED locks are active.


RESERVED



A RESERVED lock means that the process is planning on writing to the
database file at some point in the future but that it is currently just
reading from the file.  Only a single RESERVED lock may be active at one
time, though multiple SHARED locks can coexist with a single RESERVED lock.
RESERVED differs from PENDING in that new SHARED locks can be acquired
while there is a RESERVED lock.


PENDING



A PENDING lock means that the process holding the lock wants to write
to the database as soon as possible and is just waiting on all current
SHARED locks to clear so that it can get an EXCLUSIVE lock.  No new 
SHARED locks are permitted against the database if
a PENDING lock is active, though existing SHARED locks are allowed to
continue.


EXCLUSIVE



An EXCLUSIVE lock is needed in order to write to the database file.
Only one EXCLUSIVE lock is allowed on the file and no other locks of
any kind are allowed to coexist with an EXCLUSIVE lock.  In order to
maximize concurrency, SQLite works to minimize the amount of time that
EXCLUSIVE locks are held.





The operating system interface layer underÊstands and tracks all five
locking states described above.  
The pager module only tracks four of the five locking states.
A PENDING lock is always just a temporary
stepping stone on the path to an EXCLUSIVE lock and so the pager module
does not track PENDING locks.



4.0 The Rollback Journal

When a process wants to change a database file (and it is not
in WAL mode), it
first records the original unchanged database content
in a rollback journal.  The rollback journal is an ordinary
disk file that is always located
in the same directory or folder as the database file and has the
same name as the database file with the addition of a -journal
suffix. The rollback journal also records the initial
size of the database so that if the database file grows it can be truncated
back to its original size on a rollback.

If SQLite is working with multiple databases at the same time
(using the ATTACH command) then each database has its own rollback journal.
But there is also a separate aggregate journal
called the super-journal.
The super-journal does not contain page data used for rolling back
changes.  Instead the super-journal contains the names of the
individual database rollback journals for each of the ATTACHed databases. 
Each of the individual database rollback journals also contain the name 
of the super-journal.
If there are no ATTACHed databases (or if none of the ATTACHed database
is participating in the current transaction) no super-journal is
created and the normal rollback journal contains an empty string
in the place normally reserved for recording the name of the
super-journal.

A rollback journal is said to be hot
if it needs to be rolled back
in order to restore the integrity of its database.  
A hot journal is created when a process is in the middle of a database
update and a program or operating system crash or power failure prevents 
the update from completing.
Hot journals are an exception condition. 
Hot journals exist to recover from crashes and power failures.
If everything is working correctly 
(that is, if there are no crashes or power failures)
you will never get a hot journal.



If no super-journal is involved, then
a journal is hot if it exists and has a non-zero header
and its corresponding database file
does not have a RESERVED lock.
If a super-journal is named in the file journal, then the file journal
is hot if its super-journal exists and there is no RESERVED
lock on the corresponding database file.
It is important to understand when a journal is hot so the
preceding rules will be repeated in bullets:



A journal is hot if...
    
    It exists, and
    Its size is greater than 512 bytes, and
    The journal header is non-zero and well-formed, and
    Its super-journal exists or the super-journal name is an
        empty string, and
    There is no RESERVED lock on the corresponding database file.
    




4.1 Dealing with hot journals


Before reading from a database file, SQLite always checks to see if that
database file has a hot journal.  If the file does have a hot journal, then
the journal is rolled back before the file is read.  In this way, we ensure
that the database file is in a consistent state before it is read.


When a process wants to read from a database file, it followed
the following sequence of steps:



Open the database file and obtain a SHARED lock.  If the SHARED lock
    cannot be obtained, fail immediately and return SQLITE_BUSY.
Check to see if the database file has a hot journal.   If the file
    does not have a hot journal, we are done.  Return immediately.
    If there is a hot journal, that journal must be rolled back by
    the subsequent steps of this algorithm.
Acquire a PENDING lock then an EXCLUSIVE lock on the database file.
    (Note: Do not acquire a RESERVED lock because that would make
    other processes think the journal was no longer hot.)  If we
    fail to acquire these locks it means another process
    is already trying to do the rollback.  In that case,
    drop all locks, close the database, and return SQLITE_BUSY. 
Read the journal file and Ëroll back the changes.
Wait for the rolled back changes to be written onto 
    persistent storage.  This protects the integrity of the database
    in case another power failure or crash occurs.
Delete the journal file (or truncate the journal to zero bytes in
    length if PRAGMA journal_mode=TRUNCATE is
    set, or zero the journal header if
    PRAGMA journal_mode=PERSIST is set).
Delete the super-journal file if it is safe to do so.
    This step is optional.  It is here only to prevent stale
    super-journals from cluttering up the disk drive.
    See the discussion below for details.
Drop the EXCLUSIVE and PENDING locks but retain the SHARED lock.


After the algorithm above completes successfully, it is safe to 
read from the database file.  Once all reading has completed, the
SHARED lock is dropped.


4.2 Deleting stale super-journals

A stale super-journal is a super-journal that is no longer being
used for anything.  There is no requirement that stale super-journals
be deleted.  The only reason for doing so is to free up disk space.

A super-journal is stale if no individual file journals are pointing
to it.  To figure out if a super-journal is stale, we first read the
super-journal to obtain the names of all of its file journals.  Then
we check each of those file journals.  If any of the file journals named
in the super-journal exists and points back to the super-journal, then
the super-journal is not stale.  If all file journals are either missing
or refer to other super-journals or no super-journal at all, then the
super-journal we are testing is stale and can be safely deleted.


5.0 Writing to a database file

To write to a database, a process must first acquire a SHARED lock
as described above (possibly rolling back incomplete changes if there
is a hot journal). 
After a SHARED lock is obtained, a RESERVED lock must be acquired.
The RESERVED lock signals that the process intends to write to the
database at some point in the future.  Only one process at a time
can hold a RESERVED lock.  But other processes can continue to read
the database while the RESERVED lock is held.


If the process that wants to write is unable to obtain a RESERVED
lock, it must mean that another process already has a RESERVED lock.
In that case, the write attempt fails and returns SQLITE_BUSY.

After obtaining a RESERVED lock, the process that wants to write
creates a rollback journal.  The header of the journal is initialized
with the original size of the database file.  Space in the journal header
is also reserved for a super-journal name, though the super-journal
name is initially empty.

Before making changes to any page of the database, the process writes
the original content of that page into the rollback journal.  Changes
to pages are held in memory at first and are not written to the disk.
The original database file remains unaltered, which means that other
processes can continue to read the database.

Eventually, the writing process will want to update the database
file, either because its memory cache has filled up or because it is
ready to commit its changes.  Before this happens, the writer must
make sure no other process is reading the database and that the rollback
journal data is safely on the disk surface so that it can be used to
rollback incomplete changes in the event of a power failure.
The steps are as follows:


Make sure all rollback journal data has actually been written to
    the surface of the disk (and is not just being held in the operating
    system's  or disk controllers cache) so that if a power failure occurs
    the data will still be there after power is restored.
Obtain a PENDING lock and then an EXCLUSIVE lock on the database file.
    If other processes still have SHARED locks, the writer might have
    to wait until those SHARED locks clear before it is able to obtain
    an EXCLUSIVE lock.
Write all page modifications currently held in memory out to the
    original database disk file.



If the reason for writing to the database file is because the memory
cache was full, then the writÌer will not commit right away.  Instead,
the writer might continue to make changes to other pages.  Before 
subsequent changes are written to the database file, the rollback
journal must be flushed to disk again.  Note also that the EXCLUSIVE
lock that the writer obtained in order to write to the database initially
must be held until all changes are committed.  That means that no other
processes are able to access the database from the
time the memory cache first spills to disk until the transaction
commits.



When a writer is ready to commit its changes, it executes the following
steps:




   Obtain an EXCLUSIVE lock on the database file and
   make sure all memory changes have been written to the database file
   using the algorithm of steps 1-3 above.
Flush all database file changes to the disk.  Wait for those changes
    to actually be written onto the disk surface.
Delete the journal file.  (Or if the PRAGMA journal_mode is TRUNCATE or
    PERSIST, truncate the journal file or zero the header of the journal file,
    respectively.)  This is the instant when the changes are
    committed.  Prior to deleting the journal file, if a power failure
    or crash occurs, the next process to open the database will see that
    it has a hot journal and will roll the changes back.
    After the journal is deleted, there will no longer be a hot journal
    and the changes will persist.
    
Drop the EXCLUSIVE and PENDING locks from the database file.
    


As soon as the PENDING lock is released from the database file, other
processes can begin reading the database again.  In the current implementation,
the RESERVED lock is also released, but that is not essential for
correct operation.

If a transaction involves multiple databases, then a more complex
commit sequence is used, as follows:



   Make sure all individual database files have an EXCLUSIVE lock and a
   valid journal.
Create a super-journal.  The name of the super-journal is arbitrary.
    (The current implementation appends random suffixes to the name of the
    main database file until it finds a name that does not previously exist.)
    Fill the super-journal with the names of all the individual journals
    and flush its contents to disk.
Write the name of the super-journal into
    all individual journals (in space set aside for that purpose in the
    headers of the individual journals) and flush the contents of the
    individual journals to disk and wait for those changes to reach the
    disk surface.
Flush all database file changes to the disk.  Wait for those changes
    to actually be written onto the disk surface.
Delete the super-journal file.  This is the instant when the changes are
    committed.  Prior to deleting the super-journal file, if a power failure
    or crash occurs, the individual file journals will be considered hot
    and will be rolled back by the next process that
    attempts to read them.  After the super-journal has been deleted,
    the file journals will no longer be considered hot and the changes
    will persist.
    
Delete all individual journal files.
Drop the EXCLUSIVE and PENDING locks from all database files.
    



5.1 Writer starvation

In SQLite version 2, if many processes are reading from the database,
it might be the case that there is never a time when there are
no active readers.  And if there is always at least one read lock on the
database, no process would ever be able to make changes to the database
because it would be impossible to acquire a write lock.  This situation
is called writer starvation.

SQLite version 3 seeks to avoid writer starvation through the use of
the PENDING lock.  The PENDING lock allows existing readers to continue
but prevents new readers from connecting to the database.  So when a
process wants to write a busy database, it can set a PENDING lock which
will prevent new readers from coming in.  Assuming existing readers do
eventually complete, all SHARED locks will eventually clear and the
writer will be given a chance to make its changes.


6.0 How To Corrupt Your Database FiÍles

The pager module is very robust but it can be subverted.  
This section attempts to identify and explain the risks.
(See also the Things That Can Go Wrong section of the article
on Atomic Commit.


Clearly, a hardware or operating system fault that introduces incorrect data
into the middle of the database file or journal will cause problems.
Likewise, 
if a rogue process opens a database file or journal and writes malformed
data into the middle of it, then the database will become corrupt.
There is not much that can be done about these kinds of problems
so they are given no further attention.



SQLite uses POSIX advisory locks to implement locking on Unix.  On
Windows it uses the LockFile(), LockFileEx(), and UnlockFile() system
calls.  SQLite assumes that these system calls all work as advertised.  If
that is not the case, then database corruption can result.  One should
note that POSIX advisory locking is known to be buggy or even unimplemented
on many NFS implementations (including recent versions of Mac OS X)
and that there are reports of locking problems
for network filesystems under Windows.  Your best defense is to not
use SQLite for files on a network filesystem.



SQLite uses the fsync() system call to flush data to the disk under Unix and
it uses the FlushFileBuffers() to do the same under Windows.  Once again,
SQLite assumes that these operating system services function as advertised.
But it has been reported that fsync() and FlushFileBuffers() do not always
work correctly, especially with some network filesystems or inexpensive IDE disks.
Apparently some manufactures of IDE disks have controller chips that report
that data has reached the disk surface when in fact the data is still
in volatile cache memory in the disk drive electronics.  There are also
reports that Windows sometimes chooses to ignore FlushFileBuffers() for
unspecified reasons.  The author cannot verify any of these reports.
But if they are true, it means that database corruption is a possibility
following an unexpected power loss.  These are hardware and/or operating
system bugs that SQLite is unable to defend against.




If a Linux ext3
filesystem is mounted without the "barrier=1" option
in the /etc/fstab
and the disk drive write cache is enabled
then filesystem corruption can occur following a power loss or OS crash.
Whether or not corruption can occur depends on the details of the disk control
hardware; corruption is more likely with inexpensive consumer-grade disks
and less of a problem for enterprise-class storage devices with advanced
features such as non-volatile write caches.
Various ext3 experts

confirm this behavior.
We are told that most Linux distributions do not use barrier=1 and do
not disable the write cache so most
Linux distributions are vulnerable to this problem.  Note that this is an
operating system and hardware issue and that there is nothing that SQLite
can do to work around it.  

Other database engines have also run into this same problem.


If a crash or power failure occurs and results in a hot journal but that
journal is deleted, the next process to open the database will not
know that it contains changes that need to be rolled back.  The rollback
will not occur and the database will be left in an inconsistent state.
Rollback journals might be deleted for any number of reasons:



An administrator might be cleaning up after an OS crash or power failure,
    see the journal file, think it is junk, and delete it.
Someone (or some process) might rename the database file but fail to
    also rename its associated journal.
If the database file has aliases (hard or soft links) and the file
    is opened by a different alias than the one used to create the journal,
    then the journal will not be found.  To avoid this problem, you should
    not create links to SQLite database files.
Filesystem corruption following a power failure might cause the
    journal to be renamed or deleted.



The last (fourth) bullet above merits additional comment.  When SQLite creates
a journal file on Unix, it opens the directory that contains that file and
calls fsync() on the directory, in an effort to push the directory information
to disk.  But suppose some other process is adding or removing unrelated
files to the directory that contains the database and journal at the
moment of a power failure.  The supposedly unrelated actions of this other
process might result in the journal file being dropped from the directory and
moved into "lost+found".  This is an unlikely scenario, but it could happen.
The best defenses are to use a journaling filesystem or to keep the
database and journal in a directory by themselves.



For a commit involving multiple databases and a super-journal, if the
various databases were on different disk volumes and a power failure occurs
during the commit, then when the machine comes back up the disks might
be remounted with different names.  Or some disks might not be mounted
at all.   When this happens the individual file journals and the
super-journal might not be able to find each other. The worst outcome from
this scenario is that the commit ceases to be atomic.  
Some databases might be rolled back and others might not. 
All databases will continue to be self-consistent.
To defend against this problem, keep all databases
on the same disk volume and/or remount disks using exactly the same names
after a power failure.



7.0 Transaction Control At The SQL Level


The changes to locking and concurrency control in SQLite version 3 also
introduce some subtle changes in the way transactions work at the SQL
language level.
By default, SQLite version 3 operates in autocommit mode.
In autocommit mode,
all changes to the database are committed as soon as all operations associated
with the current database connection complete.

The SQL command "BEGIN TRANSACTION" (the TRANSACTION keyword
is optional) is used to take SQLite out of autocommit mode.
Note that the BEGIN command does not acquire any locks on the database.
After a BEGIN command, a SHARED lock will be acquired when the first
SELECT statement is executed.  A RESERVED lock will be acquired when
the first INSERT, UPDATE, or DELETE statement is executed.  No EXCLUSIVE
lock is acquired until either the memory cache fills up and must
be spilled to disk or until the transaction commits.  In this way,
the system delays blocking read access to the file until the
last possible moment.


The SQL command "COMMIT"  does not actually commit the changes to
disk.  It just turns autocommit back on.  Then, at the conclusion of
the command, the regular autocommit logic takes over and causes the
actual commit to disk to occur.
The SQL command "ROLLBACK" also operates by turning autocommit back on,
but it also sets a flag that tells the autocommit logic to rollback rather
than commit.

If the SQL COMMIT command turns autocommit on and the autocommit logic
then tries to commit change but fails because some other process is holding
a SHARED lock, then autocommit is turned back off automatically.  This
allows the user to retry the COMMIT at a later time after the SHARED lock
has had an opportunity to clear.

If multiple commands are being executed against the same SQLite database
connection at the same time, the autocommit is deferred until the very
last command completes.  For example, if a SELECT statement is being
executed, the execution of the command will pause as each row of the
result is returned.  During this pause other INSERT, UPDATE, or DELETE
commands can be executed against other tables in the database.  But none
of these changes will commit until the original SELECT statement finishes.

This page last modified on  2022-08-10 18:45:48 UTClockingv3.htmlÏat the end of each transaction,
as described above.  The PERSIST journal mode foregoes the deletion of
the journal file and instead overwrites the rollback journal header
with zeros, which prevents other processes from rolling back the
journal and thus has the same effect as deleting the journal file, though
without the expense of actually removing the file from disk.  In other
words, journal mode PERSIST exhibits the same behavior as is seen
in EXCLUSIVE locking mode. The
OFF journal mode causes SQLite to omit the rollback journal, completely.
In other words, no rollback journal is ever written if journal mode is
set to OFF.
The OFF journal mode disables the atomic
commit and rollback capabilities of SQLite.  The ROLLBACK command
is not available when OFF journal mode is set.  And if a crash or power
loss occurs in the middle of a transaction that uses the OFF journal
mode, no recovery is possible and the database file will likely
go corrupt.
The MEMORY journal mode causes the rollback journal to be stored in
memory rather than on disk.  The ROLLBACK command still works when
the journal mode is MEMORY, but because no file exists on disks for
recovery, a crash or power loss in the middle of a transaction that uses
the MEMORY journal mode will likely result in a corrupt database.




2.2. Write-Ahead Log (WAL) Files


A write-ahead log or WAL file is used in place of a rollback journal
when SQLite is operating in WAL mode.  As with the rollback journal,
the purpose of the WAL file is to implement atomic commit and rollback.
The WAL file is always located in the same directory
as the database file and has the same name as the database
file except with the 4 characters "-wal" appended.
The WAL file is created when the first connection to the
database is opened and is normally removed when the last
connection to the database closes.  However, if the last connection
does not shutdown cleanly, the WAL file will remain in the filesystem
and will be automatically cleaned up the next time the database is
opened.




2.3. Shared-Memory Files


When operating in WAL mode, all SQLite database connections associated
with the same database file need to share some memory that is used as an
index for the WAL file.  In most implementations, this shared memory is
implemented by calling mmap() on a file created for this sole purpose:
the shared-memory file.  The shared-memory file, if it exists, is located
in the same directory as the database file and has the same name as the
database file except with the 4 characters "-shm" appended.
Shared memory files only exist while running in WAL mode.



The shared-memory file contains no persistent content.  The only purpose
of the shared-memory file is to provide a block of shared memory for use
by multiple processes all accessing the same database in WAL mode.
If the VFS is able to provide an alternative method for accessing shared
memory, then that alternative method might be used rather than the
shared-memory file.  For example, if PRAGMA locking_mode is set to
EXCLUSIVE (meaning that only one process is able to access the database
file) then the shared memory will be allocated from heap rather than out
of the shared-memory file, and the shared-memory file will never be
created.



The shared-memory file has the same lifetime as its associated WAL file.
The shared-memory file is created when the WAL file is created and is
deleted when the WAL file is deleted.  During WAL file recovery, the
shared memory file is recreated from scratch based on the contents of
the WAL file being recovered.




2.4. Super-Journal Files


The super-journal file is used as part of the atomic commit
process when a single transaction makes changes to multiple
databases that have been added to a single database connection
using the ATTACH statement.  The super-journal file is always
located in the same directory as the main database file
(the main database file is the database that is identified
in the original sqlite3_open(), sqlite3_open16(), or
sqlite3_open_v2() call that created the database connection)
with aÐ randomized suffix.  The super-journal file contains
the names of all of the various attached auxiliary databases
that were changed during the transaction.  The multi-database
transaction commits when the super-journal file is deleted.
See the documentation titled
Atomic Commit In SQLite for
additional detail.



Without the super-journal, the transaction commit on a multi-database
transaction would be atomic for each database individually, but it
would not be atomic across all databases.  In other words, if the
commit were interrupted in the middle by a crash or power loss, then
the changes to one of the databases might complete while the changes
to another database might roll back.  The super-journal causes all
changes in all databases to either rollback or commit together.



The super-journal file is only created for COMMIT operations that
involve multiple database files where at least two of the databases 
meet all of the following requirements:


The database is modified by the transaction
The PRAGMA synchronous setting is not OFF
The PRAGMA journal_mode is not OFF, MEMORY, or WAL



This means that SQLite transactions are not atomic
across multiple database files on a power-loss when the database 
files have synchronous turned off or when they are using journal 
modes of OFF, MEMORY, or WAL.  For synchronous OFF and for
journal_modes OFF and MEMORY, database will usually corrupt if
a transaction commit is interrupted by a power loss.  For 
WAL mode, individual database files are updated atomically
across a power-loss, but in the case of a multi-file transactions,
some files might rollback while others roll forward after
power is restored.





2.5. Statement Journal Files


A statement journal file is used to rollback partial results of
a single statement within a larger transaction.  For example, suppose
an UPDATE statement will attempt to modify 100 rows in the database.
But after modifying the first 50 rows, the UPDATE hits
a constraint violation which should block the entire statement.
The statement journal is used to undo the first 50 row changes
so that the database is restored to the state it was in at the start
of the statement.



A statement journal is only created for an UPDATE or INSERT statement
that might change multiple rows of a database and which might hit a
constraint or a RAISE exception within a trigger and thus need to
undo partial results.
If the UPDATE or INSERT is not contained within BEGIN...COMMIT and if
there are no other active statements on the same database connection then
no statement journal is created since the ordinary
rollback journal can be used instead.
The statement journal is also omitted if an alternative
conflict resolution algorithm is
used.  For example:



UPDATE OR FAIL ...
UPDATE OR IGNORE ...
UPDATE OR REPLACE ...
UPDATE OR ROLLBACK ...
INSERT OR FAIL ...
INSERT OR IGNORE ...
INSERT OR REPLACE ...
INSERT OR ROLLBACK ...
REPLACE INTO ....



The statement journal is given a randomized name, not necessarily
in the same directory as the main database, and is automatically
deleted at the conclusion of the transaction.  The size of the
statement journal is proportional to the size of the change implemented
by the UPDATE or INSERT statement that caused the statement journal
to be created.




2.6. TEMP Databases

Tables created using the "CREATE TEMP TABLE" syntax are only
visible to the database connection in which the "CREATE TEMP TABLE"
statement is originally evaluated.  These TEMP tables, together
with any associated indices, triggers, and views, are collectively
stored in a separate temporary database file that is created as
soon as the first "CREATE TEMP TABLE" statement is seen.
This separate temporary database file also has an associated
rollback journal.
The temporary database file used to store TEMP tables is deleted
automatically when the database connection is closed
using sqlite3_close().



The TEMP database file is very similar to auxiliary database
files added using the ATTACH statement, though with a few
special properties.
The TEMP database is always Ñautomatically deleted when the
database connection is closed.
The TEMP database always uses the
synchronous=OFF and journal_mode=PERSIST
PRAGMA settings.
And, the TEMP database cannot be used with DETACH nor can
another process ATTACH the TEMP database.



The temporary files associated with the TEMP database and its
rollback journal are only created if the application makes use
of the "CREATE TEMP TABLE" statement.




2.7. Materializations Of Views And Subqueries

Queries that contain subqueries must sometime evaluate
the subqueries separately and store the results in a temporary
table, then use the content of the temporary table to evaluate
the outer query.
We call this "materializing" the subquery.
The query optimizer in SQLite attempts to avoid materializing,
but sometimes it is not easily avoidable.
The temporary tables created by materialization are each stored
in their own separate temporary file, which is automatically
deleted at the conclusion of the query.
The size of these temporary tables depends on the amount of
data in the materialization of the subquery, of course.



A subquery on the right-hand side of IN operator must often
be materialized.  For example:



SELECT * FROM ex1 WHERE ex1.a IN (SELECT b FROM ex2);



In the query above, the subquery "SELECT b FROM ex2" is evaluated
and its results are stored in a temporary table (actually a temporary
index) that allows one to determine whether or not a value ex2.b
exists using a simple binary search.  Once this table is constructed,
the outer query is run and for each prospective result row a check
is made to see if ex1.a is contained within the temporary table.
The row is output only if the check is true.



To avoid creating the temporary table, the query might be rewritten
as follows:



SELECT * FROM ex1 WHERE EXISTS(SELECT 1 FROM ex2 WHERE ex2.b=ex1.a);



Recent versions of SQLite (version 3.5.4 2007-12-14) and later)
will do this rewrite automatically
if an index exists on the column ex2.b.



If the right-hand side of an IN operator can be list of values
as in the following:


SELECT * FROM ex1 WHERE a IN (1,2,3);


List values on the right-hand side of IN are treated as a 
subquery that must be materialized.  In other words, the
previous statement acts as if it were:


SELECT * FROM ex1 WHERE a IN (SELECT 1 UNION ALL
                              SELECT 2 UNION ALL
                              SELECT 3);


A temporary index is always used to hold the values of the
right-hand side of an IN operator when that right-hand side
is a list of values.



Subqueries might also need to be materialized when they appear
in the FROM clause of a SELECT statement.  For example:



SELECT * FROM ex1 JOIN (SELECT b FROM ex2) AS t ON t.b=ex1.a;



Depending on the query, SQLite might need to materialize the 
"(SELECT b FROM ex2)" subquery into a temporary table, then
perform the join between ex1 and the temporary table.  The
query optimizer tries to avoid this by "flattening" the
query.  In the previous example the query can be flattened,
and SQLite will automatically transform the query into



SELECT ex1.*, ex2.b FROM ex1 JOIN ex2 ON ex2.b=ex1.a;



More complex queries may or may not be able to employ query
flattening to avoid the temporary table.  Whether or not
the query can be flattened depends on such factors as whether
or not the subquery or outer query contain aggregate functions,
ORDER BY or GROUP BY clauses, LIMIT clauses, and so forth.
The rules for when a query can and cannot be flattened are
very complex and are beyond the scope of this document.




2.8. Transient Indices


SQLite may make use of transient indices to
implement SQL language features such as:



An ORDER BY or GROUP BY clause
The DISTINCT keyword in an aggregate query
Compound SELECT statements joined by UNION, EXCEPT, or INTERSECT



Each transient index is stored in its own temporary file.
The temporary file for a transient index is automatically deleted
at the end of the statement that uses it.



SQLite strives to implement ORDER BY clauses using a preexisting
index.  If an apÒpropriate index already exists, SQLite will walk
the index, rather than the underlying table, to extract the 
requested information, and thus cause the rows to come out in
the desired order.  But if SQLite cannot find an appropriate index
it will evaluate the query and store each row in a transient index
whose data is the row data and whose key is the ORDER BY terms.
After the query is evaluated, SQLite goes back and walks the
transient index from beginning to end in order to output the
rows in the desired order.



SQLite implements GROUP BY by ordering the output rows in the
order suggested by the GROUP BY terms.  Each output row is
compared to the previous to see if it starts a new "group".
The ordering by GROUP BY terms is done in exactly the same way
as the ordering by ORDER BY terms.  A preexisting index is used
if possible, but if no suitable index is available, a transient
index is created.



The DISTINCT keyword on an aggregate query is implemented by
creating a transient index in a temporary file and storing
each result row in that index.  As new result rows are computed
a check is made to see if they already exist in the transient
index and if they do the new result row is discarded.



The UNION operator for compound queries is implemented by creating
a transient index in a temporary file and storing the results
of the left and right subquery in the transient index, discarding
duplicates.  After both subqueries have been evaluated, the
transient index is walked from beginning to end to generate the final output.



The EXCEPT operator for compound queries is implemented by creating
a transient index in a temporary file, storing the results of the
left subquery in this transient index, then removing the result 
from right subquery from the transient index, and finally walking
the index from beginning to end to obtain the final output.



The INTERSECT operator for compound queries is implemented by
creating two separate transient indices, each in a separate
temporary file.  The left and right subqueries are evaluated
each into a separate transient index.  Then the two indices
are walked together and entries that appear in both indices
are output.



Note that the UNION ALL operator for compound queries does not
use transient indices by itself (though of course the right
and left subqueries of the UNION ALL might use transient indices
depending on how they are composed.)



2.9. Transient Database Used By VACUUM


The VACUUM command works by creating a temporary file
and then rebuilding the entire database into that temporary
file.  Then the content of the temporary file is copied back
into the original database file and the temporary file is
deleted.



The temporary file created by the VACUUM command exists only
for the duration of the command itself.  The size of the temporary
file will be no larger than the original database.




3. The SQLITE_TEMP_STORE Compile-Time Parameter and Pragma


The temporary files associated with transaction control, namely
the rollback journal, super-journal, write-ahead log (WAL) files,
and shared-memory files, are always written to disk.
But the other kinds of temporary files might be stored in memory
only and never written to disk.
Whether or not temporary files other than the rollback,
super, and statement journals are written to disk or stored only in memory
depends on the SQLITE_TEMP_STORE compile-time parameter, the
temp_store pragma,
and on the size of the temporary file.



The SQLITE_TEMP_STORE compile-time parameter is a #define whose value is
an integer between 0 and 3, inclusive.  The meaning of the
SQLITE_TEMP_STORE compile-time parameter is as follows:




Temporary files are always stored on disk regardless of the setting
of the temp_store pragma.


Temporary files are stored on disk by default but this can be
overridden by the temp_store pragma.


Temporary files are stored in memory by default but this can be
overridden by the temp_store pragma.


Temporary files are always stored in memory regardless of the setting
of the temp_store pragma.




The default value of the SQLITE_TEMP_STORE compile-time parameter is 1,
which means to store temporary files on disk but provide the option
of overriding the behavior using the temp_store pragma.



The temp_store pragma has
an integer value which also influences the decision of where to store
temporary files.  The values of the temp_store pragma have the
following meanings:




Use either disk or memory storage for temporary files as determined
by the SQLITE_TEMP_STORE compile-time parameter.


If the SQLITE_TEMP_STORE compile-time parameter specifies memory storage for
temporary files, then override that decision and use disk storage instead.
Otherwise follow the recommendation of the SQLITE_TEMP_STORE compile-time
parameter.


If the SQLITE_TEMP_STORE compile-time parameter specifies disk storage for
temporary files, then override that decision and use memory storage instead.
Otherwise follow the recommendation of the SQLITE_TEMP_STORE compile-time
parameter.




The default setting for the temp_store pragma is 0,
which means to following the recommendation of SQLITE_TEMP_STORE compile-time
parameter.



To reiterate, the SQLITE_TEMP_STORE compile-time parameter and the 
temp_store pragma only
influence the temporary files other than the rollback journal
and the super-journal.  The rollback journal and the
super-journal are always written to disk regardless of the settings of
the SQLITE_TEMP_STORE compile-time parameter and the
temp_store pragma.




4. Other Temporary File Optimizations


SQLite uses a page cache of recently read and written database
pages.  This page cache is used not just for the main database
file but also for transient indices and tables stored in temporary
files.  If SQLite needs to use a temporary index or table and
the SQLITE_TEMP_STORE compile-time parameter and the
temp_store pragma are
set to store temporary tables and index on disk, the information
is still initially stored in memory in the page cache.  The 
temporary file is not opened and the information is not truly
written to disk until the page cache is full.



This means that for many common cases where the temporary tables
and indices are small (small enough to fit into the page cache)
no temporary files are created and no disk I/O occurs.  Only
when the temporary data becomes too large to fit in RAM does
the information spill to disk.



Each temporary table and index is given its own page cache
which can store a maximum number of database pages determined
by the SQLITE_DEFAULT_TEMP_CACHE_SIZE compile-time parameter.
(The default value is 500 pages.)
The maximum number of database pages in the page cache is the
same for every temporary table and index.  The value cannot
be changed at run-time or on a per-table or per-index basis.
Each temporary file gets its own private page cache with its
own SQLITE_DEFAULT_TEMP_CACHE_SIZE page limit.




5. Temporary File Storage Locations


The directory or folder in which temporary files are created is
determined by the OS-specific VFS.


On unix-like systems, directories are searched in the following order:

The directory set by PRAGMA temp_store_directory or by the
    sqlite3_temp_directory global variable
The SQLITE_TMPDIR environment variable
The TMPDIR environment variable
/var/tmp
/usr/tmp
/tmp
The current working directory (".")

The first of the above that is found to exist and have the write and
execute bits set is used.  The final "." fallback is important for some
applications that use SQLite inside of chroot jails that do not have
the standard temporary file locations available.


On Windows systems, folders are searched in the following order:

The folder set by PRAGMA temp_store_directory or by the
    sqlite3_temp_directory global variable
The folder returned by the GetTempPath() system interface.

SQLite itself does not pay any attention to environment variables
in this case, though presumably the GetTempPath() system call does.
The search algorithm is different for CYGWIN builds.  Check the 
source code for details.
This page last modified on  2020-08-16 11:16:26 UTCtempfiles.html
””¾O‚\
I‚ü?)Temporary Files Used By SQLite1. Introduction


One of the distinctive features of
SQLite is that a database consists of a single disk file.
This simplifies the use of SQLite since moving or backing up a
database is a simple as copying a single file.  It also makes
SQLite appropriate for use as an
application file format.
But while a complete database is held in a single disk file,
SQLite does make use of many temporary files during the
course of processing a database.



This article describes the various temporary files that SQLite
creates and uses.  It describes when the files are created, when
they are deleted, what they are used for, why they are important,
and how to avoid them on systems where creating temporary files is
expensive.



The manner in which SQLite uses temporary files is not considered
part of the contract that SQLite makes with applications.  The
information in this document is a correct description of how
SQLite operates at the time that this document was written or last
updated.  But there is no guarantee that future versions of SQLite
will use temporary files in the same way.  New kinds of temporary
files might be employed  and some of
the current temporary file uses might be discontinued
in future releases of SQLite.




2. Nine Kinds Of Temporary Files


SQLite currently uses nine distinct types of temporary files:



Rollback journals
Super-journals
Write-ahead Log (WAL) files
Shared-memory files
Statement journals
TEMP databases
Materializations of views and subqueries
Transient indices
Transient databases used by VACUUM



Additional information about each of these temporary file types
is in the sequel.




2.1. Rollback Journals


A rollback journal is a temporary file used to implement
atomic commit and rollback capabilities in SQLite.
(For a detailed discussion of how this works, see
the separate document titled
Atomic Commit In SQLite.)
The rollback journal is always located in the same directory
as the database file and has the same name as the database
file except with the 8 characters "-journal" appended.
The rollback journal is usually created when a transaction
is first started and is usually deleted when a transaction
commits or rolls back.
The rollback journal file is essential for implementing the
atomic commit and rollback capabilities of SQLite.  Without
a rollback journal, SQLite would be unable to rollback an
incomplete transaction, and if a crash or power loss occurred
in the middle of a transaction the entire database would likely
go corrupt without a rollback journal.



The rollback journal is usually created and destroyed at the
start and end of a transaction, respectively.  But there are exceptions
to this rule.



If a crash or power loss occurs in the middle of a transaction,
then the rollback journal file is left on disk.  The next time
another application attempts to open the database file, it notices
the presence of the abandoned rollback journal (we call it a "hot
journal" in this circumstance) and uses the information in the
journal to restore the database to its state prior to the start
of the incomplete transaction.  This is how SQLite implements
atomic commit.



If an application puts SQLite in 
exclusive locking mode using
the pragma:



PRAGMA locking_mode=EXCLUSIVE;



SQLite creates a new rollback journal at the start of the first
transaction within an exclusive locking mode session.  But at the
conclusion of the transaction, it does not delete the rollback
journal.  The rollback journal might be truncated, or its header
might be zeroed (depending on what version of SQLite you are using)
but the rollback journal is not deleted.  The rollback journal is
not deleted until exclusive access mode is exited.


Rollback journal creation and deletion is also changed by the
journal_mode pragma.
The default journaling mode is DELETE, which is the default behavior
of deleting the rollback journal file ÎÕso come with multiple built-in VFSes.  The default
Windows VFS is called "win32" and is used in most applications.
Other VFSes that might be found on windows builds include:



win32-longpath - like "win32" except that pathnames can
          be up to 65534 bytes in length, whereas pathnames max out at
          1040 bytes in "win32".
win32-none - all file locking operations are no-ops.
win32-longpath-none - combination of "win32-longpath"
          and "win32-none" - long pathnames are supported and all lock
          operations are no-ops.


As with unix, most of the code for the various Windows VFSes is shared.

3.3. Specifying Which VFS To Use


There is always one VFS which is the default VFS.  On unix systems,
the "unix" VFS comes up as the default and on windows it is "win32".
If no other actions are taken, new database connections will make use
of the default VFS.



The default VFS can be changed by registering or re-registering the
VFS using the sqlite3_vfs_register() interface with a second parameter
of 1.  Hence, if a (unix) process wants to always use the "unix-nolock" VFS 
in place of "unix", the following code would work:



sqlite3_vfs_register(sqlite3_vfs_find("unix-nolock"), 1);



An alternate VFS can also be specified as the 4th parameter to the
sqlite3_open_v2() function.  For example:



int rc = sqlite3_open_v2("demo.db", &db, SQLITE_OPEN_READWRITE, "unix-nolock");



Finally, if URI filenames have been enabled, then the alternative
VFS can be specified using the "vfs=" parameter on the URI.  This technique
works with sqlite3_open(), sqlite3_open16(), sqlite3_open_v2(), and
when a new database is ATTACH-ed to an existing database connection.
For example:



ATTACH 'file:demo2.db?vfs=unix-none' AS demo2;



The VFS specified by a URI has the highest priority.  After that comes
a VFS specified as the fourth argument to sqlite3_open_v2().  The
default VFS is used if no VFS is specified otherwise.




3.4. VFS Shims


From the point of view of the uppers layers of the SQLite stack, each
open database file uses exactly one VFS.
But in practice, a particular VFS might
just be a thin wrapper around another VFS that does the real work.
We call a wrapper VFS a "shim".



A simple example of a shim is the "vfstrace" VFS.  This is a VFS
(implemented in the 
test_vfstrace.c
source file) that writes a message associated with each VFS method call
into a log file, then passes control off to another VFS to do the actual
work.


3.5. Other Example VFSes


The following are other VFS implementations available in the public
SQLite source tree:




appendvfs.c -
This VFS allows an SQLite database to be appended to the end of some
other file.  This can be used, for example, to append an SQLite database
onto the end of an executable such that, when run, it can easily
locate the appended database. The command-line shell will use this
VFS if launched with the --append option, and its .archive command
will use it given the --append flag.


test_demovfs.c - 
This file implements a very simple VFS named "demo" that uses POSIX 
functions such as
open(), read(), write(), fsync(), close(), fsync(), sleep(), time(),
and so forth.  This VFS only works on unix systems.  But it is not
intended as a replacement for the standard "unix" VFS used by default
on unix platforms.  The "demo" VFS is deliberately kept very simple
so that it can be used as a learning aid or as template for building
other VFSes or for porting SQLite to new operating systems.


test_quota.c - 
This file implements a shim called "quota" that enforces cumulative
file size limits on a collection of database files.  An auxiliary
interface is used to define "quota groups".  A quota group is a
set of files (database files, journals, and temporary files) whose
names all match a GLOB pattern.  The sum of the sizes of all files
in each quota group is tracked, and if that sum exceeds a threshold
defined for the quota group, a callback function is invoked.  That
callback can either increase the threshold or cause the operation
that would have exceeded the quota to fail with an 
SQLITE_FULL error.  One of the uses of this shim is used to enforce 
resource limits on application databases in Firefox.


test_multiplex.c - 
This file implements a shim that allows database files to exceed the
maximum file size of the underlying filesystem.  This shim presents
an interface to the upper six layers of SQLite that makes it look like
very large files are being used, when in reality each such large file
is split up into many smaller files on the underlying system.
This shim has been used, for example, to allow databases to grow
larger than 2 gibibytes on FAT16 filesystems.


test_onefile.c - 
This file implements a demonstration VFS named "fs" that shows how SQLite 
can be used on an embedded device that lacks a filesystem.  Content is
written directly to the underlying media.  A VFS derived from this
demonstration code could be used by a gadget with a limited amount of
flash memory to make SQLite behave as the filesystem for the flash memory
on the device.


test_journal.c - 
This file implements a shim used during SQLite testing that verifies that
the database and rollback journal are written in the correct order and
are "synced" at appropriate times in order to guarantee that the database
can recover from a power lose are hard reset at any time.  The shim
checks several invariants on the operation of databases and rollback
journals and raises exceptions if any of those invariants are violated.
These invariants, in turn, assure that the database is always recoverable.
Running a large suite of test cases using this shim provides added
assurance that SQLite databases will not be damaged by unexpected
power failures or device resets.


test_vfs.c - 
This file implements a shim that can be used to simulate filesystem faults.
This shim is used during testing to verify that SQLite responses sanely
to hardware malfunctions or to other error conditions such as running out
of filesystem space that are difficult to test on a real system.



There are other VFS implementations both in the core SQLite source code
library and in available extensions.  The list above is not meant to be
exhaustive but merely representative of the kinds of features that can
be realized using the VFS interface.


4. VFS Implementations


A new VFS is implemented by subclassing three objects:



sqlite3_vfs
sqlite3_io_methods
sqlite3_file



An sqlite3_vfs object defines the name of the VFS and the core
methods that implement the interface to the operating system, such
as checking for existence of files, deleting files, creating files
and opening and for reading and/or writing, converting filenames
into their canonical form.  The sqlite3_vfs object also contains
methods for obtaining randomness from the operating system, for
suspending a process (sleeping) and for finding the current date and
time.



The sqlite3_file object represents an open file.
The xOpen method of sqlite3_vfs constructs an sqlite3_file
object when the file is opened.  The sqlite3_file keeps track
of the state of the file while it is opened.



The sqlite3_io_methods object holds the methods used to interact
with an open file.  Each sqlite3_file contains a pointer to 
an sqlite3_io_methods object that is appropriate for the file it
represents.  The sqlite3_io_methods object contains methods to do
things such as read and write from the file, to truncate the file,
to flush any changes to persistent storage, to find the size of the
file, to lock and unlock the file, and to close file and destroy
the sqlite3_file object.



Writing the code for a new VFS involves constructing a subclass for
the sqlite3_vfs object and then registering that VFS object using
a call to sqlite3_vfs_register().  The VFS implementation also
provides subclasses for sqlite3_file and sqlite3_io_methods but
those objects are not registered directly with SQLite.  Instead, the
sqlite3_file object is returned from the xOpen method of
sqlite3_vfs and the sqlite3_file object points to an instance
of the sqlite3_io_methods object.

This page last modified on  2021-12-06 01:48:47 UTCvfs.html
¤¤ÞL‚]
M¼AThe SQLite OS Interface or "VFS"1. Introduction


This article describes the SQLite OS portability layer or "VFS" - the
module at the bottom of the SQLite implementation stack
that provides portability across operating systems.


2. The VFS In Relation To The Rest Of SQLite






The internal organization of the SQLite library can be viewed as the
stack of modules shown to the right.
The Tokenizer, Parser, and Code Generator components are used to
process SQL statements and convert them into executable programs 
in a virtual machine language or byte code.
Roughly speaking, these top three layers implement
sqlite3_prepare_v2().  The byte code generated by the top three
layers is a prepared statement.
The Virtual Machine module is responsible for running the SQL statement 
byte code. The B-Tree module organizes a database file into multiple 
key/value stores with ordered keys and logarithmic performance. 
The Pager module is responsible for loading pages of the database
file into memory, for implementing and controlling transactions, and 
for creating and maintaining the journal files that prevent database 
corruption following a crash or power failure. 
The OS Interface is a thin abstraction that provides a common set of 
routines for adapting SQLite to run on different operating systems.
Roughly speaking, the bottom four layers implement
sqlite3_step().



This article is about the bottom layer.


The OS Interface - also called the "VFS" - is what makes SQLite 
portable across operating systems.  Whenever any of the other modules
in SQLite needs to communicate with the operating
system, they invoke methods in the VFS.  The VFS then invokes the
operating-specific code needed to satisfy the request.
Hence, porting SQLite to a new
operating system is simply a matter of writing a new OS interface layer
or "VFS".

3. Multiple VFSes


The standard SQLite source tree contains built-in VFSes for unix
and windows.  Alternative VFSes can be
added at start-time or run-time using the
sqlite3_vfs_register() interface.



Multiple VFSes can be registered at the same time.
Each VFS has a unique names.
Separate database connections within the same process can be using
different VFSes at the same time.   For that matter, if a single
database connection has multiple database files open using
the ATTACH command, then each attached database might be using a
different VFS.


3.1. Standard Unix VFSes


Unix builds come with multiple built-in VFSes.  The default VFS
for unix is called "unix" and is used in most applications.
Other VFSes that might be found in unix (depending on compile-time
options) include:



unix-dotfile - uses dot-file locking rather than
          POSIX advisory locks.
unix-excl - obtains and holds an exclusive lock on
          database files, preventing other processes from accessing the
          database.  Also keeps the wal-index in heap rather than in
          shared memory.
unix-none - all file locking operations are no-ops.
unix-namedsem - uses named semaphores for file locking.
       VXWorks only.



The various unix VFSes differ only in the way they handle file locking -
they share most of their implementation in common with one another and
are all located in the same SQLite source file:  
os_unix.c.
Note that except for "unix" and "unix-excl", the various unix VFSes all
use incompatible locking implementations.  If two processes are accessing
the same SQLite database using different unix VFSes, they may
not see each others locks and may end up interfering with one another,
resulting in database corruption.  The "unix-none" VFS in particular
does no locking at all and will easily result in database corruption if
used by two or more database connections at the same time.
Programmers are encouraged to use only "unix" or "unix-excl" unless
there is a compelling reason to do otherwise.


3.2. Standard Windows VFSes



Windows builds alÔ
¹¹œC‚^      ;¸7)The UNION Virtual TableThe UNION virtual table (hereafter: "union-vtab")
is a virtual table that makes multiple independent
rowid tables tables look like a single large table.


The tables that participate in a union-vtab can be in the same 
database file, or they can be in separate databases files that
are ATTACH-ed to the same database connection.


The union-vtab is not built into SQLite.
Union-vtab is a loadable extension.
The source code for union-vtab is contained in a single file located at
ext/misc/unionvtab.c
in the SQLite source tree.


A new union-vtab instance is created as follows:


CREATE VIRTUAL TABLE temp.tabname USING unionvtab(query);



Every union-vtab must be in the TEMP namespace.  Hence, the "temp."
prior to tabname is required.  Only the union-vtab itself is required
to be in the TEMP namespace - the individual tables that are being unioned
can be any ATTACH-ed database.


The query in the CREATE VIRTUAL TABLE statement for a union-vtab 
must be a well-formed SQL query that returns four columns and an 
arbitrary number of rows.  Each row in the result of the query
represents a single table that is to participate in the union.


The first column is the schema name for the database that contains
the tables.  Examples:  "main", "zone512".

The second column is the name of the table.

The third column  is the minimum value for any rowid in the table.

The fourth column is the maximum value of any rowid in the table.



The query for the CREATE VIRTUAL TABLE statement of a union-vtab
can be either a SELECT statement or a VALUES clause.


The query is run once when the CREATE VIRTUAL TABLE statement is
first encountered and the results of that one run are used for all subsequent
access to the union-vtab.  If the results of query change, then
the union-vtab should be DROP-ed and recreated in order
to cause the query to be run again.


There must be no overlap in the bands of rowids for the various tables
in a union-vtab.


All tables that participate in a union-vtab must have identical
CREATE TABLE definitions, except that the names of the tables can be different.


All tables that participate in a union-vtab must be rowid tables.


The column names and definitions for tabname will be the same as
the underlying tables.  An application can access tabname just like
it was one of the real underlying tables.


No table in a union-vtab may contain entries that are outside of the
rowid bounds established by the query in the CREATE VIRTUAL TABLE
statement.


The union-vtab shall optimize access to the underlying real tables
when the constraints on the query are among forms shown below.
Other kinds of constraints may be optimized in the future, but only
these constraints are optimized in the initial implementation.

 rowid=$id
 rowid IN query-or-list
 rowid BETWEEN $lwr AND $upr


Other kinds of constraints may be used and will work, but other
constraints will be checked individually for each row and will not
be optimized (at least not initially). 
All constraint checking is completely automatic regardless of whether
or not optimization occurs.  The optimization referred to in this bullet point
is a performance consideration only.  The same result is obtained
regardless of whether or not the query is optimized.


The union-vtab is read-only.  Support for writing may be added at a later
time, but writing is not a part of the initial implementation.


Nota bene:
The sqlite3_blob_open() interface does not work for a union-vtab.
BLOB content must be read from the union-vtab using ordinary SQL statements.

This page last modified on  2017-07-21 19:12:49 UTCunionvtab.htmlÙrue or false, but there are test cases to demonstrate this.



SQLite version 3.22.0 (2018-01-22) contains 5290 assert() macros,
839 testcase() macros, 88 ALWAYS() macros, and 63 NEVER() macros.

1.1. Philosophy of assert()

In SQLite, the presence of assert(X) means that the developers have
a proof that X is always true.  Readers can depend upon X being true to
help them reason about the code.  An assert(X) is a strong statement
about the truth of X.  There is no doubt.

The ALWAYS(X) and NEVER(X) macros are a weaker statement about the
truth of X.  The presence of ALWAYS(X) or NEVER(X) means that the developers
believe X is always or never true, but there is no proof, or the proof
is complex and error-prone, or the proof depends on other aspects 
of the system that seem likely to change.

Other systems sometimes use assert(X) in a way that is
similar to the use of ALWAYS(X) or NEVER(X) in SQLite.
Developers will add an assert(X) as a 
tacit acknowledgement that they
do not fully believe that X is always true.
We believe that this use of assert(X) is wrong and violates the intent
and purpose of having assert(X) available in C in the first place.
An assert(X) should not be seen as a safety-net or top-rope used to
guard against mistakes.  Nor is assert(X) appropriate for defense-in-depth.
An ALWAYS(X) or NEVER(X) macro, or something similar, should be used in 
those cases because ALWAYS(X) or NEVER(X) will be followed by code to
actually deal with the problem when the programmers reasoning
turns out to be wrong.  Since the code that follows ALWAYS(X) or NEVER(X)
is untested, it should be something very simple, like a "return" statement,
that is easily verified by inspection.


Because assert() can be and is commonly misused, some programming language
theorists and designers look upon it with disfavor.
For example, the designers of the Go programming language 
intentionally omit a built-in assert().
They feel that the harm caused by misuse of assert()
outweighs the benefits of including it as a language built-in.
The SQLite developers disagree.  In fact, the original purpose of this
article is to push back against the common notion that assert() is harmful.
In our experience, SQLite would be much more difficult to develop, test,
and maintain without assert().

1.2. Different Behaviors According To Build Type

Three separate builds are used to validate the SQLite software.

 A functionality testing build is used to validate the source code.
 A coverage testing build is used to validate the test suite, to confirm
     that the test suite provides 100% MC/DC.
 The release build is used to validate the generated machine code.

All tests must give the same answer in all three
builds. See the "How SQLite Is Tested" document for more detail.

The various assert()-like
macros behave differently according to how SQLite is built.


Functionality TestingCoverage TestingRelease
assert(X)
abort() if X is false
no-op
no-op

ALWAYS(X)
abort() if X is false
always true
pass through the value X

NEVER(X)
abort() if X is true
always false
pass through the value X

testcase(X)
no-op
do some harmless work if X is true
no-op



The default behavior of assert(X) in standard C is that it is enabled
for release builds.  This is a reasonable default.  However, the
SQLite code base has many assert() statements in performance-sensitive
areas of the code.  Leaving assert(X) turned on causes SQLite to run about
three times slower.  Also, SQLite strives to provide 100% MC/DC in an
as-delivered configuration, which is obviously impossible if assert(X)
statements are enabled.  For these reasons, assert(X) is a no-op for
release builds in SQLite.

The ALWAYS(X) and NEVER(X) macros behave like assert(X) during
functionality testing, because the developers want to be immediately
alerted to the issue if the value of X is different from what is expected.
But for delivery, ALWAYS(X) and NEVER(X) are simple pass-through macros,
which provide defense-in-depth.  For coverage testing ALWAYS(X) and NEVER(X)
are hard-coded boolean values so that they do not cause unreachable
machine code to be generated.

The testcase(X) macro is normally a no-op, but for a coverage test
build it does generate a small amount of extra code that includes at least
one branch, in order to verify that test cases exist for which X is both
true and false.

2. Examples

An assert() statement is often used to validate pre-conditions on 
internal functions and methods.
Example: https://sqlite.org/src/artifact/c1e97e4c6f?ln=1048.
This is deemed better than simply stating the pre-condition in a header 
comment, since the assert() is actually executed.  In a highly tested
program like SQLite, the reader knows that the pre-condition is true
for all of the hundreds of millions of test cases run against SQLite,
since it has been verified by the assert().
In contrast, a text pre-condition statement in a header comment
is untested.  It might have been true when the code was written, 
but who is to say that it is still true now?


Sometimes SQLite uses compile-time evaluatable assert() statements.
Consider the code at
https://sqlite.org/src/artifact/c1e97e4c6f?ln=2130-2138.
Four assert() statements verify the values for compile-time constants
so that the reader can quickly check the validity of the if-statement
that follows, without having to look up the constant values in a separate
header file.


Sometimes compile-time assert() statements are used to verify that
SQLite has been correctly compiled.  For example, the code at
https://sqlite.org/src/artifact/c1e97e4c6f?ln=157
verifies that the SQLITE_PTRSIZE preprocessor macro is set correctly
for the target architecture.


The CORRUPT_DB macro is used in many assert() statements.
In functional testing builds, CORRUPT_DB references a global variable
that is true if the database file might contain corruption.  This variable
is true by default, since we do not normally know whether or not a database
is corrupt, but during testing while working on databases that are known
to be well-formed, that global variable can be set to false.
Then the CORRUPT_DB macro
can be used in assert() statements such as seen at
https://sqlite.org/src/artifact/18a53540aa3?ln=1679-1680.
Those assert()s specify pre-conditions to the routine that are true for
consistent database files, but which might be false if the database file
is corrupt. Knowledge of these kinds of conditions is very helpful to
readers who are trying to understand a block of code in isolation.


ALWAYS(X) and NEVER(X) functions are used in places where we always
want the test to occur even though the developers believe the value of
X is always true or false.  For example, the sqlite3BtreeCloseCursor()
routine shown must remove the closing cursor from a linked list of all
cursors.  We know that the cursor is on the list, so that the loop
must terminate by the "break" statement, but it is convenient to
use the ALWAYS(X) test at
https://sqlite.org/src/artifact/18a53540aa3?ln=4371 to prevent
running off the end of the linked list in case there is an error in some
other part of the code that has corrupted the linked list.


An ALWAYS(X) or NEVER(X) sometimes verifies pre-conditions that are
subject to change if other parts of the code are modified in
subtle ways.  At https://sqlite.org/src/artifact/18a53540aa3?ln=5512-5516
we have a test for two pre-conditions that are true only because
of the limited scope of use of the sqlite3BtreeRowCountEst() function.
Future enhancements to SQLite might use sqlite3BtreeRowCountEst() in
new ways where those preconditions no longer hold, and the NEVER()
macros will quickly alert the developers to that fact when the
situation arises.  But if, for some reason, the pre-conditions are
not satisfied in a release build, the program will still behave sanely
and will not do an undefined memory access.


The testcase() macro is often used to verify that boundary
cases of an inequality comparison are checked.  For example, at
https://sqlite.org/src/artifact/18a53540aa3?ln=5766.  These
kind of checks help to prevent off-by-one errors.
This page last modified on  2019-04-29 19:27:41 UTCassert.html
µ
ËMµ‰‚a       I‘Q#List of SQLite Syntax DiagramsList of SQLite Syntax Diagrams



aggregate-function-invocation
alter-table-stmt
analyze-stmt
attach-stmt
begin-stmt
column-constraint
column-def
column-name-list
comment-syntax
commit-stmt
common-table-expression
compound-operator
compound-select-stmt
conflict-clause
create-index-stmt
create-table-stmt
create-trigger-stmt
create-view-stmt
create-virtual-table-stmt
cte-table-name
delete-stmt
delete-stmt-limited
detach-stmt
drop-index-stmt
drop-table-stmt
drop-trigger-stmt
drop-view-stmt
expr
factored-select-stmt
filter-clause
foreign-key-clause
frame-spec
indexed-column
insert-stmt
join-clause
join-constraint
join-operator
literal-value
numeric-literal
ordering-term
over-clause
pragma-stmt
pragma-value
qualified-table-name
raise-function
recursive-cte
reindex-stmt
release-stmt
result-column
returning-clause
rollback-stmt
savepoint-stmt
select-core
select-stmt
signed-number
simple-function-invocation
simple-select-stmt
sql-stmt
sql-stmt-list
table-constraint
table-options
table-or-subquery
type-name
update-stmt
update-stmt-limited
upsert-clause
vacuum-stmt
window-defn
window-function-invocation
with-clausesyntax.htmlÆn‚`
E
Uniform Resource Identifiers1. URI Filenames In SQLite


Beginning with version 3.7.7 (2011-06-23),
the SQLite database file argument to the
sqlite3_open(), sqlite3_open16(), and sqlite3_open_v2() interfaces
and to the ATTACH command can be specified
either as an ordinary filename or as a Uniform Resource Identifier or URI.
The advantage of using a URI filename is that query parameters on the URI can
be used to control details of the newly created database connection.
For example, an alternative VFS can be specified using a 
"vfs=" query parameter.
Or the database can be opened read-only by using "mode=ro" as a query
parameter.


2. Backwards Compatibility


In order to maintain full backwards compatibility for legacy applications,
the URI filename capability is disabled by default.
URI filenames can be enabled or disabled using the SQLITE_USE_URI=1
or SQLITE_USE_ÛÊ%‚_
G“s#The Use Of assert() In SQLite1. Assert() And Similar Macros In SQLite


The assert(X) macro is 
part of standard C, in the
&lt;assert.h&gt; header file.
SQLite adds three other assert()-like macros named NEVER(X), ALWAYS(X),
and testcase(X).


assert(X) &rarr;
The assert(X) statement indicates that the condition X is always true.
In other words, X is an invariant.  The assert(X) macro works like a
procedure in that it has no return value.

ALWAYS(X) &rarr;
The ALWAYS(X) function indicates that condition X is always true as far
as the developers know, but there is no proof the X is true, or the
proof is complex and error-prone, or the proof depends on implementation
details that are likely to change in the future.  ALWAYS(X) behaves like
a function that returns the boolean value X, and is intended to be used
within the conditional of an "if" statement.

NEVER(X) &rarr;
The NEVER(X) function indicates that condition X is never true.  This
is the negative analog of the ALWAYS(X) function.

testcase(X) &rarr;
The testcase(X) statement indicates that X is sometimes true and sometimes
false.  In other words, testcase(X) indicates that X is definitely not an
invariant.  Since SQLite uses 100% MC/DC testing, the presence of a
testcase(X) macro indicates that not only is it possible for X to be either
tØÜURI=0 compile-time options.
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.
Regardless of the compile-time or start-time settings, URI filenames
can be enabled for individual database connections by including the
SQLITE_OPEN_URI bit in the set of bits passed as the F parameter
to sqlite3_open_v2(N,P,F,V).



If URI filenames are recognized when the database connection is originally
opened, then URI filenames will also be recognized on ATTACH statements.
Similarly, if URI filenames are not recognized when the database connection
is first opened, they will not be recognized by ATTACH.



Since SQLite always interprets any filename that does not begin
with "file:"
as an ordinary filename regardless of the URI setting, and because it is
very unusual to have an actual file begin with "file:", 
it is safe for most applications to enable URI processing even if URI 
filenames are not currently being used.


3. URI Format


According to RFC 3986, a URI consists
of a scheme, an authority, a path, a query string, and a fragment.  The
scheme is always required.  One of either the authority or the path is also
always required.  The query string and fragment are optional.



SQLite uses the "file:" URI syntax to identify database files.
SQLite strives to interpret file: URIs in exactly the same way as
popular web-browsers such as 
Firefox, 
Chrome, 
Safari, 
Internet Explorer, and
Opera,
and command-line programs such as 
Windows "start" and the Mac OS-X
"open" command.
A succinct summary of the URI parsing rules follows:



 The scheme of the URI must be "file:".  Any other scheme
     results in the input being treated as an ordinary filename.
 The authority may be omitted, may be blank, or may be
      "localhost".  Any other authority results in an error.
      Exception: If SQLite is compiled with SQLITE_ALLOW_URI_AUTHORITY
      then any authority value other than "localhost" is passed through to the 
      underlying operating system as a UNC filename.
 The path is optional if the authority is present.  If the authority
     is omitted then the path is required. 
 The query string is optional.  If the query string is present, then
      all query parameters are passed through into the xOpen method of
      the underlying VFS.  
 The fragment is optional.  If present, it is ignored.


Zero or more escape sequences of the form  "%HH" 
(where H represents any hexadecimal digit) can occur 
in the path, query string, or fragment.

A filename that is not a well-formed URI is interpreted as an
ordinary filename.

URIs are processed as UTF8 text.
The filename argument sqlite3_open16() is converted from UTF16 
native byte order into UTF8 prior to processing.

3.1. The URI Path

The path component of the URI specifies the disk file that is the
SQLite database to be opened.  If the path component is omitted, then
the database is stored in a temporary file that will be automatically
deleted when the database connection closes.  If the authority section
is present, then the path is always an absolute pathname.  If the 
authority section is omitted, then the path is an absolute pathname if it
begins with the "/" character (ASCII code 0x2f) and is a relative
pathname otherwise.  On windows, if the absolute path begins with
"/X:/" where X is any single ASCII alphabetic
character ("a" through "z" or "A" through "Z") then the "X:"
is understood to be the drive letter of the volume containing the file,
not the toplevel directory.

An ordinary filename can usually be converted into an equivalent URI 
by the steps shown below.  The one exception is that a relative windows
pathname with a drive letter cannot be converted directly into a URI; it must
be changed into an absolute pathname first.


Convert all "?" characters into "%3f".
Convert all "#" characters into "%23".
On windows only, convert all "\" characters into "/".
Convert all sequences of two or more "/" characters into a
    single "/" character.
On windows only, if the filename begins with a drive letter, prepend
    a single "/" character.
Prepend the "file:" scheme.


3.2. Query String

A URI filename can optionally be followed by a query string.
The query string consists of text following the first "?"
character but excluding the optional fragment that begins with
"#".  The query string is divided into key/value pairs.
We usually refer to these key/value pairs as "query parameters".
Key/value pairs are separated by a single "&amp;" character.
The key comes first and is separated from the value by a single
"=" character.
Both key and value may contain %HH escape sequences.


The text of query parameters is appended to the filename argument of
the xOpen method of the VFS.
Any %HH escape sequences in the query parameters are resolved prior to
being appended to the xOpen filename.
A single zero-byte separates the xOpen filename argument from the key of
the first query parameters, each key and value, and each subsequent key
from the prior value.
The list of query parameters appended to the xOpen filename
is terminated by a single zero-length key.
Note that the value of a query parameter can be an empty string.




3.3. Recognized Query Parameters


Some query parameters are interpreted by the SQLite core and used to 
modify the characteristics of the new connection.  All query parameters
are always passed through into the xOpen method of the VFS even if
they are previously read and interpreted by the SQLite core.



The following query parameters are recognized by SQLite as of 
version 3.15.0 (2016-10-14).
New query parameters might be added in the future.





cache=sharedcache=private
The cache query parameter determines if the new database is opened
using shared cache mode or with a private cache.




immutable=1
The immutable query parameter is a boolean that signals to
SQLite that the underlying database file is held on read-only media
and cannot be modified, even by another process with elevated 
privileges.  SQLite always opens immutable database files
read-only and it skips all file locking and change detection
on immutable database files.  If this query parameter (or
the SQLITE_IOCAP_IMMUTABLE bit in xDeviceCharacteristics)
asserts that a database file is immutable and that file 
changes anyhow, then SQLite might return incorrect query 
results and/or SQLITE_CORRUPT errors.




mode=romode=rwmode=rwcmode=memory
The mode query parameter determines if the new database is opened
read-only, read-write, read-write and created if it does not exist, or
that the database is a pure in-memory database that never interacts with
disk, respectively.




modeof=filename
When creating a new database file during sqlite3_open_v2()
on unix systems, SQLite will try to set the permissions of the new
database file to match the existing file "filename".




nolock=1
The nolock query parameter is a boolean that disables all calls
to the xLock, xUnlock, and xCheckReservedLock methods of the VFS when true.
The nolock query parameter might be used, for example, when trying to
access a file on a filesystem that does not support file locking.
Caution:  If two or more database connections try to interact with 
the same SQLite database and one or more of those connections has
enabled "nolock", then database corruption can result.  The "nolock"
query parameter should only be used if the application can guarantee
that writes to the database are serialized.



psow=0psow=1
The psow query parameter overrides the powersafe overwrite
property of the database file being opened.  The psow query parameter
works with the default windows and unix VFSes but might be a no-op for
other proprietary or non-standard VFSes.




vfs=NAME
The vfs query parameter causes the database connection to be opened
using the VFS called NAME.
The open attempt fails if NAME is not the name of a VFS that
is built into SQLite or that has been previously registered using
sqlite3_vfs_register().


4. See Also


 URI filenames in sqlite3_open()
 URI filename examples

This page last modified on  2022-01-20 21:38:08 UTCuri.htmlÞs tested in the same configuration that it appears
on the website.  It was compiled with -O6 optimization and with
the -DNDEBUG=1 switch which disables the many "assert()" statements
in the SQLite code.  The -DNDEBUG=1 compiler option roughly doubles
the speed of SQLite.



All tests are conducted on an otherwise quiescent machine.
A simple Tcl script was used to generate and run all the tests.
A copy of this Tcl script can be found in the SQLite source tree
in the file tools/speedtest.tcl.



The times reported on all tests represent wall-clock time 
in seconds.  Two separate time values are reported for SQLite.
The first value is for SQLite in its default configuration with
full disk synchronization turned on.  With synchronization turned
on, SQLite executes
an fsync() system call (or the equivalent) at key points
to make certain that critical data has 
actually been written to the disk drive surface.  Synchronization
is necessary to guarantee the integrity of the database if the
operating system crashes or the computer powers down unexpectedly
in the middle of a database update.  The second time reported for SQLite is
when synchronization is turned off.  With synchronization off,
SQLite is sometimes much faster, but there is a risk that an
operating system crash or an unexpected power failure could
damage the database.  Generally speaking, the synchronous SQLite
times are for comparison against PostgreSQL (which is also
synchronous) and the asynchronous SQLite times are for 
comparison against the asynchronous MySQL engine.


Test 1: 1000 INSERTs

CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));
INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three');
INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty');
... 995 lines omitted
INSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine');
INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two');
INSERT INTO t1 VALUES(1000,94142,'ninety four thousand one hundred forty two');


PostgreSQL:&nbsp;&nbsp;&nbsp;4.373
MySQL:&nbsp;&nbsp;&nbsp;0.114
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;13.061
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;0.223



Because it does not have a central server to coordinate access,
SQLite must close and reopen the database file, and thus invalidate
its cache, for each transaction.  In this test, each SQL statement
is a separate transaction so the database file must be opened and closed
and the cache must be flushed 1000 times.  In spite of this, the asynchronous
version of SQLite is still nearly as fast as MySQL.  Notice how much slower
the synchronous version is, however.  SQLite calls fsync() after 
each synchronous transaction to make sure that all data is safely on
the disk surface before continuing.  For most of the 13 seconds in the
synchronous test, SQLite was sitting idle waiting on disk I/O to complete.


Test 2: 25000 INSERTs in a transaction

BEGIN;
CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));
INSERT INTO t2 VALUES(1,59672,'fifty nine thousand six hundred seventy two');
... 24997 lines omitted
INSERT INTO t2 VALUES(24999,89569,'eighty nine thousand five hundred sixty nine');
INSERT INTO t2 VALUES(25000,94666,'ninety four thousand six hundred sixty six');
COMMIT;


PostgreSQL:&nbsp;&nbsp;&nbsp;4.900
MySQL:&nbsp;&nbsp;&nbsp;2.184
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;0.914
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;0.757



When all the INSERTs are put in a transaction, SQLite no longer has to
close and reopen the database or invalidate its cache between each statement.
It also does not
have to do any fsync()s until the very end.  When unshackled in
this way, SQLite is much faster than either PostgreSQL and MySQL.


Test 3: 25000 INSERTs into an indexed table

BEGIN;
CREATE TABLE t3(a INTEGER, b INTEGER, c VARCHAR(100));
CREATE INDEX i3 ON t3(c);
... 24998 lines omitted
INSERT INTO t3 VALUES(24999,88509,'eighty eight thousand five hundred nine');
INSERT INTO t3 VALUES(25000,84791,'eighty four thousand seven hundred ninety one');
COMMIT;


PostgreSQL:&nbsp;&nbsp;&nbsßp;8.175
MySQL:&nbsp;&nbsp;&nbsp;3.197
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;1.555
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;1.402



There were reports that SQLite did not perform as well on an indexed table.
This test was recently added to disprove those rumors.  It is true that
SQLite is not as fast at creating new index entries as the other engines
(see Test 6 below) but its overall speed is still better.


Test 4: 100 SELECTs without an index

BEGIN;
SELECT count(*), avg(b) FROM t2 WHERE b>=0 AND b
SELECT count(*), avg(b) FROM t2 WHERE b>=100 AND b
... 96 lines omitted
SELECT count(*), avg(b) FROM t2 WHERE b>=9800 AND b
SELECT count(*), avg(b) FROM t2 WHERE b>=9900 AND b
COMMIT;


PostgreSQL:&nbsp;&nbsp;&nbsp;3.629
MySQL:&nbsp;&nbsp;&nbsp;2.760
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;2.494
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;2.526




This test does 100 queries on a 25000 entry table without an index,
thus requiring a full table scan.   Prior versions of SQLite used to
be slower than PostgreSQL and MySQL on this test, but recent performance
enhancements have increased its speed so that it is now the fastest
of the group.


Test 5: 100 SELECTs on a string comparison

BEGIN;
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one%';
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%two%';
... 96 lines omitted
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%ninety nine%';
SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%one hundred%';
COMMIT;


PostgreSQL:&nbsp;&nbsp;&nbsp;13.409
MySQL:&nbsp;&nbsp;&nbsp;4.640
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;3.362
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;3.372



This test still does 100 full table scans but it uses
uses string comparisons instead of numerical comparisons.
SQLite is over three times faster than PostgreSQL here and about 30%
faster than MySQL.


Test 6: Creating an index

CREATE INDEX i2a ON t2(a);CREATE INDEX i2b ON t2(b);

PostgreSQL:&nbsp;&nbsp;&nbsp;0.381
MySQL:&nbsp;&nbsp;&nbsp;0.318
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;0.777
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;0.659



SQLite is slower at creating new indices.  This is not a huge problem
(since new indices are not created very often) but it is something that
is being worked on.  Hopefully, future versions of SQLite will do better
here.


Test 7: 5000 SELECTs with an index

SELECT count(*), avg(b) FROM t2 WHERE b>=0 AND b
SELECT count(*), avg(b) FROM t2 WHERE b>=100 AND b
SELECT count(*), avg(b) FROM t2 WHERE b>=200 AND b
... 4994 lines omitted
SELECT count(*), avg(b) FROM t2 WHERE b>=499700 AND b
SELECT count(*), avg(b) FROM t2 WHERE b>=499800 AND b
SELECT count(*), avg(b) FROM t2 WHERE b>=499900 AND b


PostgreSQL:&nbsp;&nbsp;&nbsp;4.614
MySQL:&nbsp;&nbsp;&nbsp;1.270
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;1.121
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;1.162



All three database engines run faster when they have indices to work with.
But SQLite is still the fastest.


Test 8: 1000 UPDATEs without an index

BEGIN;
UPDATE t1 SET b=b*2 WHERE a>=0 AND a
UPDATE t1 SET b=b*2 WHERE a>=10 AND a
... 996 lines omitted
UPDATE t1 SET b=b*2 WHERE a>=9980 AND a
UPDATE t1 SET b=b*2 WHERE a>=9990 AND a
COMMIT;


PostgreSQL:&nbsp;&nbsp;&nbsp;1.739
MySQL:&nbsp;&nbsp;&nbsp;8.410
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;0.637
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;0.638



For this particular UPDATE test, MySQL is consistently
five or ten times
slower than PostgreSQL and SQLite.  I do not know why.  MySQL is
normally a very fast engine.  Perhaps this problem has been addressed
in later versions of MySQL.


Test 9: 25000 UPDATEs with an index

BEGIN;
UPDATE t2 SET b=468026 WHERE a=1;
UPDATE t2 SET b=121928 WHERE a=2;
... 24996 lines omitted
UPDATE t2 SET b=35065 WHERE a=24999;
UPDATE t2 SET b=347393 WHERE a=25000;
COMMIT;


PostgreSQL:&nbsp;&nbsp;&nbsp;18.797
MySQL:&nbsp;&nbsp;&nbsp;8.134
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;3.520
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;3.104



As recently as version 2.7.0, SQLite ran at about the same speed as
MySQL on this test.  But recent optimizations to SQLite have more
than doubled speed of UPDATEs.


Test 10: 25000 text UPDATEs with an index

BEGIN;
UPDATE t2 SET c='one hundred forty eight thousand three hundred eighty two' WHERE a=1;
UPDATE t2 SET c='three hundred sixty six thousand five hundred two' WHERE a=2;
... 24996 lines omitted
UPDATE t2 SET c='three hundred eighty three thousand ninety nine' WHERE a=24999;
UPDATE t2 SET c='two hundred fifty six thousand eight hundred thirty' WHERE a=25000;
COMMIT;


PostgreSQL:&nbsp;&nbsp;&nbsp;48.133
MySQL:&nbsp;&nbsp;&nbsp;6.982
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;2.408
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;1.725



Here again, version 2.7.0 of SQLite used to run at about the same speed
as MySQL.  But now version 2.7.6 is over two times faster than MySQL and
over twenty times faster than PostgreSQL.



In fairness to PostgreSQL, it started thrashing on this test.  A
knowledgeable administrator might be able to get PostgreSQL to run a lot
faster here by tweaking and tuning the server a little.


Test 11: INSERTs from a SELECT

BEGIN;INSERT INTO t1 SELECT b,a,c FROM t2;INSERT INTO t2 SELECT b,a,c FROM t1;COMMIT;

PostgreSQL:&nbsp;&nbsp;&nbsp;61.364
MySQL:&nbsp;&nbsp;&nbsp;1.537
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;2.787
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;1.599



The asynchronous SQLite is just a shade slower than MySQL on this test.
(MySQL seems to be especially adept at INSERT...SELECT statements.)
The PostgreSQL engine is still thrashing - most of the 61 seconds it used
were spent waiting on disk I/O.


Test 12: DELETE without an index

DELETE FROM t2 WHERE c LIKE '%fifty%';

PostgreSQL:&nbsp;&nbsp;&nbsp;1.509
MySQL:&nbsp;&nbsp;&nbsp;0.975
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;4.004
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;0.560



The synchronous version of SQLite is the slowest of the group in this test,
but the asynchronous version is the fastest.  
The difference is the extra time needed to execute fsync().


Test 13: DELETE with an index

DELETE FROM t2 WHERE a>10 AND a
PostgreSQL:&nbsp;&nbsp;&nbsp;1.316
MySQL:&nbsp;&nbsp;&nbsp;2.262
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;2.068
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;0.752



This test is significant because it is one of the few where
PostgreSQL is faster than MySQL.  The asynchronous SQLite is,
however, faster then both the other two.


Test 14: A big INSERT after a big DELETE

INSERT INTO t2 SELECT * FROM t1;

PostgreSQL:&nbsp;&nbsp;&nbsp;13.168
MySQL:&nbsp;&nbsp;&nbsp;1.815
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;3.210
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;1.485



Some older versions of SQLite (prior to version 2.4.0)
would show decreasing performance after a
sequence of DELETEs followed by new INSERTs.  As this test shows, the
problem has now been resolved.


Test 15: A big DELETE followed by many small INSERTs

BEGIN;
DELETE FROM t1;
INSERT INTO t1 VALUES(1,10719,'ten thousand seven hundred nineteen');
... 11997 lines omitted
INSERT INTO t1 VALUES(11999,72836,'seventy two thousand eight hundred thirty six');
INSERT INTO t1 VALUES(12000,64231,'sixty four thousand two hundred thirty one');
COMMIT;


PostgreSQL:&nbsp;&nbsp;&nbsp;4.556
MySQL:&nbsp;&nbsp;&nbsp;1.704
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;0.618
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;0.406



SQLite is very good at doing INSERTs within a transaction, which probably
explains why it is so much faster than the other databases at this test.


Test 16: DROP TABLE

DROP TABLE t1;DROP TABLE t2;DROP TABLE t3;

PostgreSQL:&nbsp;&nbsp;&nbsp;0.135
MySQL:&nbsp;&nbsp;&nbsp;0.015
SQLite 2.7.6:&nbsp;&nbsp;&nbsp;0.939
SQLite 2.7.6 (nosync):&nbsp;&nbsp;&nbsp;0.254



SQLite is slower than the other databases when it comes to dropping tables.
This probably is because when SQLite drops a table, it has to go through and
erase the records in the database file that deal with that table.  MySQL and
PostgreSQL, on the other hand, use separate files to represent each table
so they can drop a table simply by deleting a file, which is much faster.



On the other hand, dropping tables is not a very common operation 
so if SQLite takes a little longer, that is not seen as a big problem.

This page last modified on  2014-04-01 15:02:43 UTCspeed.html
óf‚b
Mæq!SQLite Database Speed ComparisonDatabase Speed Comparison


Note:  This document is very very old.  It describes a speed comparison between
archaic versions of SQLite, MySQL and PostgreSQL.  

The numbers here have become meaningless.  This page has been retained only
as an historical artifact.  


Executive Summary

A series of tests were run to measure the relative performance of
SQLite 2.7.6, PostgreSQL 7.1.3, and MySQL 3.23.41.
The following are general
conclusions drawn from these experiments:




  SQLite 2.7.6 is significantly faster (sometimes as much as 10 or
  20 times faster) than the default PostgreSQL 7.1.3 installation
  on RedHat 7.2 for most common operations.  


  SQLite 2.7.6 is often faster (sometimes
  more than twice as fast) than MySQL 3.23.41
  for most common operations.


  SQLite does not execute CREATE INDEX or DROP TABLE as fast as
  the other databases.  But this is not seen as a problem because
  those are infrequent operations.


  SQLite works best if you group multiple operations together into
  a single transaction.




The results presented here come with the following caveats:




  These tests did not attempt to measure multi-user performance or
  optimization of complex queries involving multiple joins and subqueries.


  These tests are on a relatively small (approximately 14 megabyte) database.
  They do not measure how well the database engines scale to larger problems.



Test Environment


The platform used for these tests is a 1.6GHz Athlon with 1GB or memory
and an IDE disk drive.  The operating system is RedHat Linux 7.2 with
a stock kernel.



The PostgreSQL and MySQL servers used were as delivered by default on
RedHat 7.2.  (PostgreSQL version 7.1.3 and MySQL version 3.23.41.)
No effort was made to tune these engines.  Note in particular
the default MySQL configuration on RedHat 7.2 does not support
transactions.  Not having to support transactions gives MySQL a
big speed advantage, but SQLite is still able to hold its own on most
tests.



I am told that the default PostgreSQL configuration in RedHat 7.3
is unnecessarily conservative (it is designed to
work on a machine with 8MB of RAM) and that PostgreSQL could
be made to run a lot faster with some knowledgeable configuration
tuning.
Matt Sergeant reports that he has tuned his PostgreSQL installation
and rerun the tests shown below.  His results show that
PostgreSQL and MySQL run at about the same speed.  For Matt's
results, visit



http://www.sergeant.org/sqlite_vs_pgsync.html



SQLite waÝâach loop

Picking the nesting order is generally the more challenging problem.
Once the nesting order of the join is established, the choice of indexes
for each loop is normally obvious.



2.2.  The SQLite Query Planner Stability Guarantee

When the Query Planner Stability Guarantee (QPSG) is enabled
SQLite will always pick the same query plan for any
given SQL statement as long as:


the database schema does not change in significant ways such as 
    adding or dropping indexes,
the ANALYZE command is not rerun, 
the same version of SQLite is used.


The QPSG is disabled by default.  It can be enabled at compile-time
using the SQLITE_ENABLE_QPSG compile-time option, or at run-time by
invoking sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_QPSG,1,0).

The QPSG means that if all of your queries run efficiently
during testing, and if your application does not change the schema,
then SQLite will not suddenly decide to start using a different
query plan, possibly causing a performance problem after your application 
is released to users.  If your application works in the lab, it
will continue working the same way after deployment.

Enterprise-class client/server SQL database engines do not normally 
make this guarantee.
In client/server SQL database engines, the server keeps track of
statistics on the sizes of tables and on the quality of indexes 
and the query planner uses those statistics to help select the best plans.
As content is added, deleted, or changed in the database, the statistics 
will evolve and may cause the query planner to begin using a different 
query plan for some particular query.  Usually the new plan will be better 
for the evolving structure of the data.  But sometimes the new query plan will
cause a performance reduction.  With a client/server database engine, there
is typically a Database Administrator (DBA) on hand to deal with these 
rare problems as they come up.  But DBAs are not available to fix problems 
in an embedded database like SQLite, and hence SQLite is careful to
ensure that plans do not change unexpectedly after deployment.

It is important to note that changing versions of SQLite might cause
changes in query plans.
The same version of SQLite will
always pick the same query plan, but if you relink your application to use
a different version of SQLite, then query plans might change.  In rare
cases, an SQLite version change might lead to a performance regression.  
This is one reason
you should consider statically linking your applications against SQLite 
rather than use a system-wide SQLite shared library which might 
change without your knowledge or control.

3.  A Difficult Case


"TPC-H Q8" is a test query from the
Transaction Processing Performance
Council.  The query planners in SQLite versions 3.7.17 and earlier 
do not choose good plans for TPC-H Q8.  And it has been determined that 
no amount
of tweaking of the legacy query planner will fix that.  In order to find
a good solution to the TPC-H Q8 query, and to continue improving the 
quality of SQLite's query planner, it became necessary to redesign the
query planner.  This section tries to explain why this redesign was
necessary and how the NGQP is different and addresses the TPC-H Q8 problem.


3.1.  Query Details


TPC-H Q8 is an eight-way join.
As observed above, the main task of the query planner is
to figure out the best nesting order of the eight loops in order to minimize
the work needed to complete the join.
A simplified model of this problem for the case of TPC-H Q8 is shown
by the following diagram:








In the diagram, each of the 8 tables in the FROM clause of the query is
identified by a large circle with the label of the FROM-clause term:
N2, S, L, P, O, C, N1 and R.
The arcs in the graph represent the estimated cost of computing each term 
assuming that the origin of the arc is in an outer loop.  For example, the
cost of running the S loop as an inner loop to L is 2.30 whereas the
cost of running the S loop as an outer loop to L is 9.17.

The "cost" here is logarithmic.  With nested loops, the work
is multipãlied, not added.  But it is customary to think of graphs
with additive weights and so the graph shows the logarithm of the
various costs.  The graph shows a cost advantage of S being inside of
L of about 6.87, but this translates into the query running about
963 times faster when S loop is inside of the L loop rather than
being outside of it.

The arrows from the small circles labeled with "*" indicate the cost
of running each loop with no dependencies.  The outermost loop must use this
*-cost.  Inner loops have the option of using the *-cost or a cost assuming
one of the other terms is in an outer loop, whichever gives the best
result.  One can think of the *-costs as a short-hand notation indicating
multiple arcs, one from each of the other nodes in the
graph.  The graph is therefore "complete", meaning that there are arcs
(some explicit and some implied) in both directions between every pair of 
nodes in the graph.

The problem of finding the best query plan is equivalent to finding
a minimum-cost path through the graph that visits each node
exactly once.

(Side note:  The cost estimates in the TPC-H Q8 graph above were computed
by the query planner in SQLite 3.7.16 and converted using a natural logarithm.)


3.2.  Complications

The presentation of the query planner problem above is a simplification.
The costs are estimates.  We cannot
know what the true cost of running a loop is until we actually run the loop.
SQLite makes guesses for the cost of running a loop based on
the availability of indexes and constraints found in the WHERE
clause.  These guesses are usually pretty good, but they can sometimes be
off.  Using the ANALYZE command to collect additional statistical
information about the database can sometimes enable SQLite to make better
guesses about the cost.

The costs are comprised of multiple numbers, not a single number as
shown in the graph.
SQLite computes several different estimated costs for each loop that apply at
different times.  For example, there is a "setup" cost that is incurred
just once when the query starts.  The setup cost is the cost of computing
an automatic index for a table that does not already
have an index.  Then there
is the cost of running each step of the loop.  Finally, there is an estimate
of the number rows generated by the loop, which is information needed in
estimating the costs of inner loops.  Sorting costs may come into play
if the query has an ORDER BY clause.

In a general query, dependencies need not be on a single loop, and hence
the matrix of dependencies might not be representable as a graph.
For example, one of the WHERE clause constraints might be
S.a=L.b+P.c, implying that the S loop must be an inner loop of both
L and P.  Such dependencies cannot be drawn as a graph
since there is no way for an arc to originate at two or more nodes at
once.

If the query contains an ORDER BY clause or a GROUP BY clause or if
the query uses the DISTINCT keyword then it is advantageous to select a 
path through the graph that causes rows to naturally appear in sorted order, 
so that no separate sorting step is required.  Automatic elimination of 
ORDER BY clauses
can make a large performance difference, so this is another factor
that needs to be considered in a complete implementation.

In the TPC-H Q8 query, the setup costs are all negligible,
all dependencies are between individual nodes, and there is no ORDER BY,
GROUP BY, or DISTINCT clause. So for TPC-H Q8,
the graph above is a reasonable representation of what needs to be computed.
The general case involves a lot of extra complication, which for clarity
is neglected in the remainder of this article.

3.3.  Finding The Best Query Plan

Prior to version 3.8.0 (2013-08-26), SQLite always used
the "Nearest Neighbor" or "NN" heuristic when searching for the best query plan.
The NN heuristic makes a single traversal of the graph, always choosing
the lowest-cost arc as the next step.  
The NN heuristic works surprisingly well in most cases.
And NN is fast, so that SQLite is able to quickly find good plans
for even large 64-way joäins.  In contrast, other SQL database engines that
do more extensive searching tend to bog down when the
number of tables in a join goes above 10 or 15.

Unfortunately, the query plan computed by NN for TPC-H Q8 is not optimal.
The plan computed using NN is R-N1-N2-S-C-O-L-P with a cost of 36.92.  
The notation
in the previous sentence means that the R table is run in the outer loop,
N1 is in the next inner loop, N2 is in the third loop, and so forth down
to P which is in the inner-most loop.  The shortest path through the
graph (as found via exhaustive search) is  P-L-O-C-N1-R-S-N2
with a cost of 27.38.  The difference might not seem like much, but 
remember that
the costs are logarithmic, so the shortest path is nearly 750 times
faster than that path found using the NN heuristic.

One solution to this problem is to change SQLite to do an exhaustive
search for the best path.  But an exhaustive search requires time 
proportional to
K! (where K is the number of tables in the join) and so when you get 
beyond a 10-way join, the time
to run sqlite3_prepare() becomes very large.

3.4.  The N Nearest Neighbors or "N3" Heuristic

The NGQP uses a new heuristic for seeking the best path through the
graph: "N Nearest Neighbors" (hereafter "N3").  With N3, instead of
choosing just one nearest neighbor for each step, the algorithm keeps
track of the N bests paths at each step for some small integer N.

Suppose N=4.  Then for the TPC-H Q8 graph, the first step finds
the four shortest paths to visit any single node in the graph:


    R (cost: 3.56) 
    N1 (cost: 5.52) 
    N2 (cost: 5.52) 
    P (cost: 7.71) 


The second step finds the four shortest paths to visit two nodes 
beginning with one of the four paths from the previous step.  In the
case where two or more paths are equivalent (they have the same set of
visited nodes, though possibly in a different order) only the
first and lowest-cost path is retained.  We have:


    R-N1 (cost: 7.03) 
    R-N2 (cost: 9.08) 
    N2-N1 (cost: 11.04) 
    R-P {cost: 11.27} 


The third step starts with the four shortest two-node paths and finds
the four shortest three-node paths:


    R-N1-N2 (cost: 12.55) 
    R-N1-C (cost: 13.43) 
    R-N1-P (cost: 14.74) 
    R-N2-S (cost: 15.08) 


And so forth.  There are 8 nodes in the TPC-H Q8 query, 
so this process repeats a total of 8
times.  In the general case of a K-way join, the storage requirement
is O(N) and the computation time is O(K*N), which is significantly faster
than the O(2K) exact solution.

But what value to choose for N?  One might try N=K.  This makes the
algorithm O(K2) 
which is actually still quite efficient, since the
maximum value of K is 64 and K rarely exceeds 10.  
But that is not enough for the TPC-H Q8
problem.  With N=8 on TPC-H Q8 the N3 algorithm finds 
the solution R-N1-C-O-L-S-N2-P with a cost of 29.78.  
That is a big improvement over NN, but it is still
not optimal.  N3 finds the optimal solution for TPC-H Q8 
when N is 10 or greater.

The initial implementation of NGQP chooses N=1 for simple queries, N=5
for two-way joins and N=10 for all joins with three or more tables.  This
formula for selecting N might change in subsequent releases.



4.  Hazards Of Upgrading To NGQP

Update on 2018-11-24: This section was important 
when the NGQP was new.  But five years have elapsed, the NGQP has been
deployed successfully to billions of devices, and everyone has upgraded.
The upgrade hazard has vanished.
This section is retained for historical reference only.
Modern reads can skip ahead to the query planner checklist.

For most applications, upgrading from the legacy query planner to the NGQP
requires little thought or effort.
Simply replace the older SQLite version with the newer version of SQLite 
and recompile and the application will run faster.  
There are no API changes nor modifications
to compilation procedures.

But as with any query planner change, upgrading to the NGQP does carry
a small risk of introducing performance regressions.  The problem here is
not that the NGQP is incorrect or buggy or inferiorå to the legacy query
planner.  Given reliable information about the selectivity of indexes, 
the NGQP should always pick a plan that is as good or better than before.
The problem is that some applications may be using low-quality and
low-selectivity indexes without having run ANALYZE.  The older query
planners look at many fewer possible implementations for each query and 
so they may have stumbled over a good plan by stupid luck.  The NGQP, on 
the other hand, looks at many more query plan possibilities, and it may 
choose a different query plan that
works better in theory, assuming good indexes, but which gives a performance
regression in practice, because of the shape of the data.

Key points:


The NGQP will always find an equal or better query plan, compared to
    prior query planners, as long as it
    has access to accurate ANALYZE data in the SQLITE_STAT1 file.
The NGQP will always find a good query plan 
    as long as the schema does not contain indexes that have more than
    about 10 or 20 rows with the same value in the left-most column of the
    index.


Not all applications meet these conditions.  Fortunately,
the NGQP will still usually find good query plans, even without these conditions.
However, cases do arise (rarely) where performance regressions can occur.



4.1.  Case Study: Upgrading Fossil to the NGQP

The Fossil DVCS is the version
control system used to track all of the SQLite source code.
A Fossil repository is an SQLite database file.
(Readers are invited to ponder this recursion as an independent exercise.)
Fossil is both the version-control system for SQLite and a test
platform for SQLite.  Whenever enhancements are made to SQLite, 
Fossil is one of the first applications to test and evaluate those
enhancements.  So Fossil was an early adopter of the NGQP.

Unfortunately, the NGQP caused a
performance regression in Fossil.

One of the many reports that Fossil makes available is a timeline of
changes to a single branch showing all merges in and out of that branch.  See
http://www.sqlite.org/src/timeline?nd&n=200&r=trunk
for a typical
example of such a report.  Generating such a report normally takes just
a few milliseconds.  But after upgrading to the NGQP we noticed that
this one report was taking closer to 10 seconds for the trunk of the
repository.

The core query used to generate the branch timeline is shown below.
(Readers are not expected to understand the details of this query.
Commentary will follow.)


SELECT
     blob.rid AS blobRid,
     uuid AS uuid,
     datetime(event.mtime,'localtime') AS timestamp,
     coalesce(ecomment, comment) AS comment,
     coalesce(euser, user) AS user,
     blob.rid IN leaf AS leaf,
     bgcolor AS bgColor,
     event.type AS eventType,
     (SELECT group_concat(substr(tagname,5), ', ')
        FROM tag, tagxref
       WHERE tagname GLOB 'sym-*'
         AND tag.tagid=tagxref.tagid
         AND tagxref.rid=blob.rid
         AND tagxref.tagtype>0) AS tags,
     tagid AS tagid,
     brief AS brief,
     event.mtime AS mtime
  FROM event CROSS JOIN blob
 WHERE blob.rid=event.objid
   AND (EXISTS(SELECT 1 FROM tagxref
                WHERE tagid=11 AND tagtype>0 AND rid=blob.rid)
        OR EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=cid
                   WHERE tagid=11 AND tagtype>0 AND pid=blob.rid)
        OR EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid
                   WHERE tagid=11 AND tagtype>0 AND cid=blob.rid))
 ORDER BY event.mtime DESC
 LIMIT 200;


This query is not
especially complicated, but even so it replaces hundreds or 
perhaps thousands of lines of procedural code.
The gist of the query is this:  Scan down the EVENT table looking
for the most recent 200 check-ins that satisfy any one of three conditions:


 The check-in has a "trunk" tag.
 The check-in has a child that has a "trunk" tag.
 The check-in has a parent that has a "trunk" tag.



The first condition causes all of the trunk check-ins to be displayed and
the second and third cause check-ins that merge into or fork from
the trunk to also be included.
The threæe conditions are implemented by the three OR-connected
EXISTS statements in the WHERE clause of the query.
The slowdown that occurred with the NGQP was caused by the second and
third conditions.  The problem is the same in each, so we will examine
just the second one.
The subquery of the second condition can be rewritten (with minor
and immaterial simplifications) as follows:


SELECT 1
  FROM plink JOIN tagxref ON tagxref.rid=plink.cid
 WHERE tagxref.tagid=$trunk
   AND plink.pid=$ckid;


The PLINK table holds parent-child relationships between
check-ins.  The TAGXREF table maps tags into check-ins.
For reference, the relevant portions of the schemas
for these two tables is shown here:


CREATE TABLE plink(
  pid INTEGER REFERENCES blob,
  cid INTEGER REFERENCES blob
);
CREATE UNIQUE INDEX plink_i1 ON plink(pid,cid);

CREATE TABLE tagxref(
  tagid INTEGER REFERENCES tag,
  mtime TIMESTAMP,
  rid INTEGER REFERENCE blob,
  UNIQUE(rid, tagid)
);
CREATE INDEX tagxref_i1 ON tagxref(tagid, mtime);


There are only two reasonable ways to implement this query.
(There are many other possible algorithms, but none of the
others are contenders for being the "best" algorithm.)



Find all children of check-in $ckid and test each one to see if
it has the $trunk tag.

Find all check-ins with the $trunk tag and test each one to see if
it is a child of $ckid.



Intuitively, we humans understand that algorithm-1 is best.
Each check-in is likely to have few children (one child is
the most common case) and each child can be tested for the
$trunk tag in logarithmic time.  Indeed, algorithm-1 is the
faster choice in practice.  But the NGQP has no intuition.  The
NGQP must use hard math, and algorithm-2 is slightly
better mathematically.  This is because, in the absence of other information,
the NGQP must assume that the indexes PLINK_I1 and TAGXREF_I1 are of
equal quality and are equally selective.  Algorithm-2 uses one field
of the TAGXREF_I1 index and both fields of the PLINK_I1 index whereas
algorithm-1 only uses the first field of each index.  Since 
algorithm-2 uses more index material, the NGQP is correct
to judge it to be the better algorithm.  The scores are close and
algorithm-2 just barely squeaks ahead of algorithm-1.  But
algorithm-2 really is the correct choice here.



Unfortunately, algorithm-2 is slower than algorithm-1 in
this application.



The problem is that the indexes are not of equal quality.
A check-in is likely to only have one child.  So the first
field of PLINK_I1 will usually narrow down the search to just a single
row.  But there are thousands and thousands check-ins tagged with "trunk", 
so the first field of TAGXREF_I1 will be
of little help in narrowing down the search.



The NGQP has no way of knowing that TAGXREF_I1 is almost useless in this
query, unless ANALYZE has been run on the database.  The ANALYZE command
gathers statistics on the quality of the various indexes and stores those
statistics in SQLITE_STAT1 table.  
Having access to this statistical information,
the NGQP easily chooses algorithm-1 as the best algorithm, by a wide
margin.

Why didn't the legacy query planner choose algorithm-2?
Easy: because the NN algorithm
never even considered algorithm-2.  Graphs of the planning
problem look like this:







In the "without ANALYZE" case on the left, the NN algorithm chooses 
loop P (PLINK) as the outer loop because 4.9 is less than 5.2, resulting
in path P-T which is algorithm-1. NN only looks at the single best choice
at each step so it completely misses the fact that 
5.2+4.4 makes a slightly cheaper plan than 4.9+4.8. But the N3 algorithm
keeps track of the 5 best paths for a 2-way join, so it ends up
selecting path T-P because of its slightly lower overall cost.
Path T-P is algorithm-2.



Note that with ANALYZE the cost estimates are
better aligned with reality and algorithm-1 is 
selected by both NN and N3.


(Side note:  The costs estimates in the two most recent graphs 
were computed by the NGQP using a base-2 logarithm and slightly different
cost assumptions compared to the legacy qçuery planner.  
Hence, the cost estimates in
these latter two graphs are not directly comparable to the cost estimates
in the TPC-H Q8 graph.)

4.2.  Fixing The Problem

Running ANALYZE on the repository database immediately fixed the
performance problem.  However, we want Fossil to be robust and to always
work quickly regardless of whether or not its repository has been analyzed.
For this reason, the query was modified to use the CROSS JOIN operator 
instead of the plain JOIN operator.
SQLite will not reorder the tables of a CROSS JOIN.
This is a long-standing feature of SQLite that is specifically designed
to allow knowledgeable programmers
to enforce a particular loop nesting order.  Once the join
was changed to CROSS JOIN (the addition of a single keyword) the NGQP was
forced to choose the faster algorithm-1 regardless of whether or not
statistical information had been gathered using ANALYZE.

We say that algorithm-1 is "faster", but this
is not strictly true.  Algorithm-1 is faster in common repositories, but
it is possible to construct a repository in which
every check-in is on a different uniquely-named branch and
all check-ins are children of the root check-in.
In that case, TAGXREF_I1 would become more selective
than PLINK_I1 and algorithm-2 really would be the faster choice.
However such repositories are very unlikely to appear in
practice and so hard-coding the loop nested order using the
CROSS JOIN syntax is a reasonable solution
to the problem in this case.

4.3. Update 2017: A Better Fix

The prior text was written in early 2013, before the first release of
SQLite version 3.8.0.  This paragraph was added in mid 2021.
While all of the previous discussion remains true, a lot of improvements
have been made to the query planner, making this whole section largely moot.

In 2017, Fossil was enhanced to make use of the new
PRAGMA optimize statement.  Whenever Fossil is about to close the
database connection to its repository, it first runs
"PRAGMA optimize", which will in turn cause ANALYZE to be run if it
is needed.  Usually an ANALYZE is not needed, and so there is no
measurable performance penalty for doing this.  But every now and
then ANALYZE might be run on a few of the tables in the repository
database.  Because if this, query planning issues such as the one
described here no longer come up in Fossil.  The fact that ANALYZE
is run periodically to keep the sqlite_stat1 table up-to-date means
that hand-tuning of queries is no longer required.  We have not had
to tweak a query in Fossil in ages.

Therefore, the current recommendation for avoiding problems such
as this one is to simply run "PRAGMA optimize" (possibly preceded by
"PRAGMA analysis_limit=200") just prior to closing each database
connection.  The CROSS JOIN hack is still available, but if you keep
the query planner statistics in the sqlite_stat1 table up-to-date,
it usually won't be necessary.



5.  Checklist For Avoiding Or Fixing Query Planner Problems


Don't panic!
Cases where the query planner picks an inferior plan are actually quite
rare.  You are unlikely to run across any problems in your application.
If you are not having performance issues, you do not need to worry
about any of this.

Create appropriate indexes.
Most SQL performance problems arise not because of query planner issues
but rather due to lack of appropriate indexes.  Make sure indexes are
available to assist all large queries.  Most performance issues can be
resolved by one or two CREATE INDEX commands and with no changes to
application code.

Avoid creating low-quality indexes..
A low-quality index (for the purpose of this checklist) is one where
there are more than 10 or 20 rows in the table that have the same value
for the left-most column of the index.  In particular, avoid using
boolean or "enum" columns as the left-most columns of your indexes.

The Fossil performance problem described in the previous section of
this document arose because there were over
ten-thousand entries in the TAGXREF table with the same value for the 
left-most column (the TAGID column) of the TAGXREF_I1 index.

If you must use a low-quality index, be sure to run ANALYZE.
Low-quality indexes will not confuse the query planner as long as the
query planner knows that the indexes are of low quality.  And the way
the query planner knows this is by the content of the SQLITE_STAT1 table,
which is computed by the ANALYZE command.

Of course, ANALYZE only works effectively if you have a significant 
amount of content in your database in the first place.  When creating a 
new database that you expect to accumulate a lot of data, you can run 
the command "ANALYZE sqlite_schema" to create the SQLITE_STAT1 table,
then prepopulate the sqlite_stat1 table (using ordinary INSERT statements)
with content that describes a typical
database for your application - perhaps content that you extracted after
running ANALYZE on a well-populated template database in the lab.
Or, you could just run "PRAGMA optimize" before shutting down
database connections so that ANALYZE will be run automatically as
needed to keep the sqlite_stat1 table current.

Instrument your code.
Add logic that lets you know quickly and easily which queries are taking
too much time.  Then work on just those specific queries.

Use unlikely() and likelihood() SQL functions.
SQLite normally assumes that terms in the WHERE clause that cannot be used
by indexes have a strong probability of being true.  If this assumption
is incorrect, it could lead to a suboptimal query plan.  The
unlikely() and likelihood() SQL functions can be used to provide
hints to the query planner about WHERE clause terms that are probably
not true, and thus aid the query planner in selecting the best possible
plan.

Use the CROSS JOIN syntax to enforce a particular
loop nesting order on queries that might use low-quality indexes in an
unanalyzed database.
SQLite treats the CROSS JOIN operator specially, forcing the table to 
the left to be an outer loop relative to the table on the right.

Avoid this step if possible, as it defeats one of the huge advantages
of the whole SQL language concept, specifically that the application 
programmer does not need to get involved with query planning.  If you
do use CROSS JOIN, wait until late in your development cycle to do so,
and comment the use of CROSS JOIN carefully so that you can take it out
later if possible.  Avoid using CROSS JOIN early in the development
cycle as doing so is a premature optimization, which is well known to
be the root of
all evil.

Use unary "+" operators to disqualify WHERE clause terms.
If the query planner insists on selecting a poor-quality index for a particular
query when a much higher-quality index is available, then
careful use of unary "+" operators in the WHERE clause
can force the query planner away from the poor-quality index.
Avoid using this trick if at all possible, and especially avoid it
early in the application development cycle.  Beware that
adding a unary "+" operator to an equality expression might change
the result of that expression if 
type affinity is involved.

Use the INDEXED BY syntax to enforce the selection of
particular indexes on problem queries.
As with the previous two bullets, avoid this step if possible, and 
especially avoid doing this early in development as it is clearly a
premature optimization.


6.  Summary

The query planner in SQLite normally does a terrific job of selecting
fast algorithms for running your SQL statements.  This is true of the 
legacy query planner and even more true of the new NGQP.  There may be
an occasional situation where, due to incomplete information, the query
planner selects a suboptimal plan.  This will happen less often with the
NGQP than with the legacy query planner, but it might still happen.  Only
in those rare cases do application developers need to get involved and
help the query planner to do the right thing.  In the common case, the
NGQP is just a new enhancement to SQLite that makes the application run
a little faster and which requires no new developer thought or action.
This page last modified on  2022-09-19 12:27:16 UTCqueryplanner-ng.html
9+9‚¢Y‚d
A„ÄW-SQLite Foreign Key SupportOverview

This document describes the support for SQL foreign key constraints
   introduced in SQLite version 3.6.19 (2009-10-14). 

The first section introduces the 
   concept of an SQL foreign key by example and defines the terminology 
   used for the remainder of the document. Section 2 describes the steps 
   an application must take in order to enable foreign key constraints in 
   SQLite (it is disabled by default). The next section, sectionéû0‚c
Oƒõo5The Next-Generation Query Planner1.  Introduction


The task of the "query planner" is to figure
out the best algorithm or "query plan" to accomplish an SQL statement.
Beginning with SQLite version 3.8.0 (2013-08-26),
the query planner component has been
rewritten so that it runs faster and generates better plans.  The
rewrite is called the "next generation query planner" or "NGQP".


This article overviews the importance of query planning, describes some
of the problems inherent to query planning, and outlines how the NGQP
solves those problems.

The NGQP is almost always better than the legacy query planner.
However, there may exist legacy applications that unknowingly depend on 
undefined and/or suboptimal behavior in the legacy query planner, and
upgrading to the NGQP on those legacy applications could cause performance
regressions.  This risk is considered and a checklist is provided
for reducing the risk and for fixing any issues that do arise.

This document focuses on the NGQP.  For a more general overview of the
SQLite query planner that encompasses the entire history of SQLite, see the
"The SQLite Query Optimizer Overview" and
"How Indexes Work" documents.

2.  Background

For simple queries against a single table with few indexes, there is usually
an obvious choice for the best algorithm.
But for larger and more complex queries, such as
multi-way joins with many indexes
and subqueries, there can be hundreds, thousands, or millions
of reasonable algorithms for computing the result.
The job of the query planner is to choose the single "best" query plan from
this multitude of possibilities.

Query planners are what make SQL database engines so amazingly useful and powerful.
(This is true of all SQL database engines, not just SQLite.)
The query planner frees the programmer from the chore of selecting
a particular query plan, and thereby allows the programmer to
focus more mental energy on higher-level application issues and on 
providing more value to the end user.  For simple queries where the choice
of query plan is obvious, this is convenient but not hugely important.
But as applications and schemas and queries grow more complex, a
clever query planner can greatly speed and simplify the work of application
development. 
There is amazing power in being about to tell
the database engine what content is desired, and then let the database
engine figure out the best way to retrieve that content.

Writing a good query planner is more art than science.
The query planner must work with incomplete information.
It cannot determine how long any particular plan will take
without actually running that plan.  So when comparing two
or more plans to figure out which is "best", the query planner has to make
some guesses and assumptions and those guesses and assumptions will 
sometimes be wrong. A good query planner is one that will
find the correct solution often enough that application
programmers rarely need to get involved.

2.1.  Query Planning In SQLite

SQLite computes joins using nested loops, 
one loop for each table
in the join.  (Additional loops might be inserted for IN
and OR operators in the WHERE clause.  SQLite considers those too,
but for simplicity we will ignore them in this essay.)
One or more indexes might be used on each loop to speed the search,
or a loop might be a "full table scan" that reads every row in the
table.  Thus query planning decomposes into two subtasks:

 Picking the nested order of the various loops
 Choosing good indexes for eáê 3, 
   describes the indexes that the user must create in order to use 
   foreign key constraints, and those that should be created in order for
   foreign key constraints to function efficiently. Section 4 describes
   the advanced foreign key related features supported by SQLite and
   section 5 describes the way the ALTER and DROP TABLE commands are
   enhanced to support foreign key constraints. Finally, section 6 
   enumerates the missing features and limits of the current implementation.

This document does not contain a full description of the syntax used
   to create foreign key constraints in SQLite. This may be found as 
   part of the documentation for the CREATE TABLE statement.

1. Introduction to Foreign Key Constraints

  
    SQL foreign key constraints are used to enforce "exists" relationships 
    between tables. For example, consider a database schema created using 
    the following SQL commands:

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER     -- Must map to an artist.artistid!
);


  
    The applications using this database are entitled to assume that for
    each row in the track table there exists a corresponding row in the
    artist table. After all, the comment in the declaration says so.
    Unfortunately, if a user edits the database using an external tool or 
    if there is a bug in an application, rows might be inserted into the 
    track table that do not correspond to any row in the artist
    table. Or rows might be deleted from the artist table, leaving
    orphaned rows in the track table that do not correspond to any of
    the remaining rows in artist. This might cause the application
    or applications to malfunction later on, or at least make coding the
    application more difficult.

  
    One solution is to add an SQL foreign key constraint to the database 
    schema to enforce the relationship between the artist and 
    track table. To do so, a foreign key definition may be added
    by modifying the declaration of the track table to the following:

CREATE TABLE track(
  trackid     INTEGER, 
  trackname   TEXT, 
  trackartist INTEGER,
  FOREIGN KEY(trackartist) REFERENCES artist(artistid)
);


  
    This way, the constraint is enforced by SQLite. Attempting to insert
    a row into the track table that does not correspond to any
    row in the artist table will fail, as will attempting to
    delete a row from the artist table when there exist dependent 
    rows in the track table There is one exception: if the foreign
    key column in the track table is NULL, then no corresponding
    entry in the artist table is required. Expressed in SQL, this
    means that for every row in the track table, the following
    expression evaluates to true:
trackartist IS NULL OR EXISTS(SELECT 1 FROM artist WHERE artistid=trackartist)


  Tip: If the application requires a stricter relationship between 
     artist and track, where NULL values are not permitted 
     in the trackartist column, simply add the appropriate 
     "NOT NULL" constraint to the schema.

  There are several other ways to add an equivalent foreign key declaration 
     to a CREATE TABLE statement. Refer to the 
     CREATE TABLE documentation for details.

  The following SQLite command-line session illustrates the effect of the
     foreign key constraint added to the track table:

sqlite&gt; SELECT * FROM artist;
artistid  artistname       
--------  -----------------
1         Dean Martin      
2         Frank Sinatra    

sqlite> SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
11       That's Amore       1  
12       Christmas Blues    1  
13       My Way             2  

sqlite&gt; -- This fails because the value inserted into the trackartist column (3)
sqlite&gt; -- does not correspond to row in the artist table.
sqlite&gt; INSERT INTO track VALUES(14, 'Mr. Bojangles', 3);
SQL error: foreign key constraint failed

sqlite&gtë; -- This succeeds because a NULL is inserted into trackartist. A
sqlite&gt; -- corresponding row in the artist table is not required in this case.
sqlite&gt; INSERT INTO track VALUES(14, 'Mr. Bojangles', NULL);

sqlite&gt; -- Trying to modify the trackartist field of the record after it has 
sqlite&gt; -- been inserted does not work either, since the new value of trackartist (3)
sqlite&gt; -- Still does not correspond to any row in the artist table.
sqlite&gt; UPDATE track SET trackartist = 3 WHERE trackname = 'Mr. Bojangles';
SQL error: foreign key constraint failed

sqlite&gt; -- Insert the required row into the artist table. It is then possible to
sqlite&gt; -- update the inserted row to set trackartist to 3 (since a corresponding
sqlite&gt; -- row in the artist table now exists).
sqlite&gt; INSERT INTO artist VALUES(3, 'Sammy Davis Jr.');
sqlite&gt; UPDATE track SET trackartist = 3 WHERE trackname = 'Mr. Bojangles';

sqlite&gt; -- Now that "Sammy Davis Jr." (artistid = 3) has been added to the database,
sqlite&gt; -- it is possible to INSERT new tracks using this artist without violating
sqlite&gt; -- the foreign key constraint:
sqlite&gt; INSERT INTO track VALUES(15, 'Boogie Woogie', 3);


  
    As you would expect, it is not possible to manipulate the database to a state
    that violates the foreign key constraint by deleting or updating rows in the 
    artist table either:
sqlite&gt; -- Attempting to delete the artist record for "Frank Sinatra" fails, since
sqlite&gt; -- the track table contains a row that refer to it.
sqlite&gt; DELETE FROM artist WHERE artistname = 'Frank Sinatra';
SQL error: foreign key constraint failed

sqlite&gt; -- Delete all the records from the track table that refer to the artist
sqlite&gt; -- "Frank Sinatra". Only then is it possible to delete the artist.
sqlite&gt; DELETE FROM track WHERE trackname = 'My Way';
sqlite&gt; DELETE FROM artist WHERE artistname = 'Frank Sinatra';

sqlite&gt; -- Try to update the artistid of a row in the artist table while there
sqlite&gt; -- exists records in the track table that refer to it. 
sqlite&gt; UPDATE artist SET artistid=4 WHERE artistname = 'Dean Martin';
SQL error: foreign key constraint failed

sqlite&gt; -- Once all the records that refer to a row in the artist table have
sqlite&gt; -- been deleted, it is possible to modify the artistid of the row.
sqlite&gt; DELETE FROM track WHERE trackname IN('That''s Amore', 'Christmas Blues');
sqlite&gt; UPDATE artist SET artistid=4 WHERE artistname = 'Dean Martin';


  
    SQLite uses the following terminology:


  
    The parent table is the table that a foreign key constraint
        refers to. The parent table in the example in this section is the
        artist table. Some books and articles refer to this as the
        referenced table, which is arguably more correct, but tends
        to lead to confusion.

    The child table is the table that a foreign key constraint
        is applied to and the table that contains the REFERENCES clause.
        The example in this section uses the track table
        as the child table. Other books and articles refer to this as the
        referencing table.

    The parent key is the column or set of columns in the parent 
        table that the foreign key constraint refers to. This is normally, but
        not always, the primary key of the parent table.  The parent key must
        be a named column or columns in the parent table, not the rowid.

    The child key is the column or set of columns in the child 
        table that are constrained by the foreign key constraint and which
        hold the REFERENCES clause.
  

  
    The foreign key constraint is satisfied if for each row in the child table 
    either one or more of the child key columns are NULL, or there exists a 
    row in the parent table for which each parent key column contains a value
    equal to the value in its associated child key column.

  
    In the above paragraph, the term "equal" means equal when values are 
    compared using the rules specified 
    here. The follìowing clarifications apply:
    
  
    When comparing text values, the collating sequence
        associated with the parent key column is always used.
    When comparing values, if the parent key column has an affinity,
        then that affinity is applied to the child key value before the
        comparison is performed.  
  


2. 
  Enabling Foreign Key Support

  
    In order to use foreign key constraints in SQLite, the library must
    be compiled with neither SQLITE_OMIT_FOREIGN_KEY nor 
    SQLITE_OMIT_TRIGGER defined. If SQLITE_OMIT_TRIGGER is defined 
    but SQLITE_OMIT_FOREIGN_KEY is not, then SQLite behaves as it did prior 
    to version 3.6.19 (2009-10-14)
    - foreign key definitions are parsed and may be 
    queried using PRAGMA foreign_key_list, but foreign key constraints 
    are not enforced. The PRAGMA foreign_keys command is a no-op in this 
    configuration. If OMIT_FOREIGN_KEY is defined, then foreign key 
    definitions cannot even be parsed (attempting to specify a foreign
    key definition is a syntax error).

  
    Assuming the library is compiled with foreign key constraints enabled,
    it must still be enabled by the application at runtime, using the
    PRAGMA foreign_keys command. For example:

sqlite&gt; PRAGMA foreign_keys = ON;


  
    Foreign key constraints are disabled by default 
    (for backwards compatibility),
    so must be enabled separately for each database connection.
    (Note, however, that future releases of SQLite might change
    so that foreign key constraints enabled by default.  Careful
    developers will not
    make any assumptions about whether or not foreign keys are enabled by
    default but will instead enable or disable them as necessary.)
    The application can also use a PRAGMA foreign_keys statement to
    determine if foreign keys are currently enabled. The following 
    command-line session demonstrates this:
sqlite> PRAGMA foreign_keys;
0
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA foreign_keys;
1
sqlite> PRAGMA foreign_keys = OFF;
sqlite> PRAGMA foreign_keys;
0


  Tip: If the command "PRAGMA foreign_keys" returns no data instead of a
     single row containing "0" or "1", then the version of SQLite you are
     using does not support foreign keys (either because it is older than
     3.6.19 or because it was compiled with SQLITE_OMIT_FOREIGN_KEY or 
     SQLITE_OMIT_TRIGGER defined).

  
    It is not possible to enable or disable foreign key constraints
    in the middle of a multi-statement transaction (when SQLite
    is not in autocommit mode).  Attempting to do so does not return
    an error; it simply has no effect.

3. Required and Suggested Database Indexes

  
    Usually, the parent key of a foreign key constraint is the primary key of
    the parent table. If they are not the primary key, then the parent key
    columns must be collectively subject to a UNIQUE constraint or have
    a UNIQUE index. 
    If the parent key columns have a UNIQUE index,
    then that index must use the collation sequences that are specified
    in the CREATE TABLE statement for the parent table.
    For example,

CREATE TABLE parent(a PRIMARY KEY, b UNIQUE, c, d, e, f);
CREATE UNIQUE INDEX i1 ON parent(c, d);
CREATE INDEX i2 ON parent(e);
CREATE UNIQUE INDEX i3 ON parent(f COLLATE nocase);

CREATE TABLE child1(f, g REFERENCES parent(a));                        -- Ok
CREATE TABLE child2(h, i REFERENCES parent(b));                        -- Ok
CREATE TABLE child3(j, k, FOREIGN KEY(j, k) REFERENCES parent(c, d));  -- Ok
CREATE TABLE child4(l, m REFERENCES parent(e));                        -- Error!
CREATE TABLE child5(n, o REFERENCES parent(f));                        -- Error!
CREATE TABLE child6(p, q, FOREIGN KEY(p, q) REFERENCES parent(b, c));  -- Error!
CREATE TABLE child7(r REFERENCES parent(c));                           -- Error!


  
    The foreign key constraints created as part of tables child1, 
    child2 and child3 are all fine. The foreign key
    declared as part of table child4 is an error because even though
    the paríent key column is indexed, the index is not UNIQUE.
    The foreign key for table child5
    is an error because even though the parent key column has a unique
    index, the index uses a different collating sequence.
    Tables child6 and child7 are incorrect because while
    both have UNIQUE indices on their parent keys, the keys are not an
    exact match to the columns of a single UNIQUE index.

  
    If the database schema contains foreign key errors that require looking
    at more than one table definition to identify, then those errors are not
    detected when the tables are created. Instead, such errors prevent
    the application from preparing SQL statements that modify the content
    of the child or parent tables in ways that use the foreign keys.
    Errors reported when content is changed are "DML errors" and errors
    reported when the schema is changed are "DDL errors".
    So, in other words, misconfigured foreign key constraints that require
    looking at both the child and parent are DML errors.
    The English language error message for foreign key DML errors is usually
    "foreign key mismatch" but can also be "no such table" if the parent
    table does not exist.
    Foreign key DML errors are reported if:

  
     The parent table does not exist, or
     The parent key columns named in the foreign key constraint do
         not exist, or
     The parent key columns named in the foreign key constraint are not
         the primary key of the parent table and are not subject to a unique
         constraint using collating sequence specified in the CREATE TABLE, or
     The child table references the primary key of the parent without
         specifying the primary key columns and the number of primary key
         columns in the parent do not match the number of child key columns.
  

  
    The last bullet above is illustrated by the following:

CREATE TABLE parent2(a, b, PRIMARY KEY(a,b));

CREATE TABLE child8(x, y, FOREIGN KEY(x,y) REFERENCES parent2);        -- Ok
CREATE TABLE child9(x REFERENCES parent2);                             -- Error!
CREATE TABLE child10(x,y,z, FOREIGN KEY(x,y,z) REFERENCES parent2);    -- Error!


  
    By contrast, if foreign key errors can be recognized simply by looking
    at the definition of the child table and without having to consult the
    parent table definition, then the 
    CREATE TABLE statement for the child table fails.  Because the error
    occurs during a schema change, this is a DDL error.
    Foreign key DDL errors are reported regardless of
    whether or not foreign key constraints are enabled when the
    table is created.

  
    Indices are not required for child key columns but they are almost
    always beneficial. Returning to
    the example in section 1, each time an application
    deletes a row from the artist table (the parent table), it
    performs the equivalent of the following SELECT statement to search
    for referencing rows in the track table (the child table).

SELECT rowid FROM track WHERE trackartist = ?


 
   where ? in the above is replaced with the value of the artistid
   column of the record being deleted from the artist table (recall
   that the trackartist column is the child key and the artistid
   column is the parent key). Or, more generally:

SELECT rowid FROM &lt;child-table&gt; WHERE &lt;child-key&gt; = :parent_key_value


 
   If this SELECT returns any rows at all, then SQLite concludes that
   deleting the row from the parent table would violate the foreign key
   constraint and returns an error.
   Similar queries may be run if the content of the parent key
   is modified or a new row is inserted into the parent table.
   If these queries cannot use an index, they are forced to do a
   linear scan of the entire child table.  In a non-trivial database, this may
   be prohibitively expensive.

 
   So, in most real systems, an index should be created on the child key columns
   of each foreign key constraint. The child key index does not have
   to be (and usually will not be) a UNIQUE index.
 î  Returning again to the example in section 1, the
   complete database schema for efficient implementation of the foreign key 
   constraint might be:

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER REFERENCES artist
);
CREATE INDEX trackindex ON track(trackartist);


  
    The block above uses a shorthand form to create the foreign key constraint.
    Attaching a "REFERENCES &lt;parent-table&gt;" clause to a column
    definition creates a foreign key constraint that maps the column to the
    primary key of &lt;parent-table&gt;. Refer to the CREATE TABLE 
    documentation for further details.


4. Advanced Foreign Key Constraint Features

4.1. Composite Foreign Key Constraints

  
    A composite foreign key constraint is one where the child and parent keys
    are both composite keys. For example, consider
    the following database schema:

CREATE TABLE album(
  albumartist TEXT,
  albumname TEXT,
  albumcover BINARY,
  PRIMARY KEY(albumartist, albumname)
);

CREATE TABLE song(
  songid     INTEGER,
  songartist TEXT,
  songalbum TEXT,
  songname   TEXT,
  FOREIGN KEY(songartist, songalbum) REFERENCES album(albumartist, albumname)
);


  
    In this system, each entry in the song table is required to map to an entry
    in the album table with the same combination of artist and album.

  
    Parent and child keys must have the same cardinality.
    In SQLite, if any of the child key columns (in this case songartist 
    and songalbum) are NULL, then there is no requirement for a corresponding
    row in the parent table.

4.2. Deferred Foreign Key Constraints

  
    Each foreign key constraint in SQLite is classified as either immediate
     or deferred. Foreign key constraints are immediate by default.
     All the foreign key examples presented
     so far have been of immediate foreign key constraints.

  
    If a statement modifies the contents of the database so that an immediate 
    foreign key constraint is in violation at the conclusion the statement, 
    an exception is thrown and 
    the effects of the statement are reverted. By contrast, if
    a statement modifies the contents of the database such that a deferred 
    foreign key constraint is violated, the violation is not reported
    immediately. Deferred foreign key constraints are not checked
    until the transaction tries to COMMIT.
    For as long as the user has 
    an open transaction, the database is allowed to exist in a state that 
    violates any number of deferred foreign key constraints. However, 
    COMMIT will fail as long as foreign key constraints remain in
    violation.

  
    If the current statement is not inside an explicit transaction (a 
    BEGIN/COMMIT/ROLLBACK block), then an implicit
    transaction is committed
    as soon as the statement has finished executing. In this case deferred
    constraints behave the same as immediate constraints.

  
    To mark a foreign key constraint as deferred, its declaration must
    include the following clause:

DEFERRABLE INITIALLY DEFERRED                -- A deferred foreign key constraint


  
    The full syntax for specifying foreign key constraints is available as part
    of the CREATE TABLE documentation. Replacing the phrase above
    with any of the following 
    creates an immediate foreign key constraint.

NOT DEFERRABLE INITIALLY DEFERRED            -- An immediate foreign key constraint
NOT DEFERRABLE INITIALLY IMMEDIATE           -- An immediate foreign key constraint
NOT DEFERRABLE                               -- An immediate foreign key constraint
DEFERRABLE INITIALLY IMMEDIATE               -- An immediate foreign key constraint
DEFERRABLE                                   -- An immediate foreign key constraint


  The defer_foreign_keys pragma can be used to temporarily change all foreign
    key constraints to deferred regardless of how they are declared.

  
    The following example illustrates the effect of using a deferred forïeign
    key constraint.

-- Database schema. Both tables are initially empty. 
CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER REFERENCES artist(artistid) DEFERRABLE INITIALLY DEFERRED
);

sqlite3&gt; -- If the foreign key constraint were immediate, this INSERT would
sqlite3&gt; -- cause an error (since as there is no row in table artist with
sqlite3&gt; -- artistid=5). But as the constraint is deferred and there is an
sqlite3&gt; -- open transaction, no error occurs.
sqlite3&gt; BEGIN;
sqlite3&gt;   INSERT INTO track VALUES(1, 'White Christmas', 5);

sqlite3&gt; -- The following COMMIT fails, as the database is in a state that
sqlite3&gt; -- does not satisfy the deferred foreign key constraint. The
sqlite3&gt; -- transaction remains open.
sqlite3&gt; COMMIT;
SQL error: foreign key constraint failed

sqlite3&gt; -- After inserting a row into the artist table with artistid=5, the
sqlite3&gt; -- deferred foreign key constraint is satisfied. It is then possible
sqlite3&gt; -- to commit the transaction without error.
sqlite3&gt;   INSERT INTO artist VALUES(5, 'Bing Crosby');
sqlite3&gt; COMMIT;

  
    A nested savepoint transaction may be RELEASEd while the
    database is in a state that does not satisfy a deferred foreign key 
    constraint. A transaction savepoint (a non-nested savepoint that was
    opened while there was not currently an open transaction), on the 
    other hand, is subject to the same restrictions as a COMMIT - attempting 
    to RELEASE it while the database is in such a state will fail.

  
    If a COMMIT statement (or the RELEASE of a transaction SAVEPOINT) fails
    because the database is currently in a state that violates a deferred
    foreign key constraint and there are currently
    nested savepoints, the nested savepoints remain open.



4.3. 
  ON DELETE and ON UPDATE Actions


  
    Foreign key ON DELETE and ON UPDATE clauses are used to configure actions
    that take place when deleting rows from the parent table (ON DELETE), or 
    modifying the parent key values of existing rows (ON UPDATE). A single
    foreign key constraint may have different actions configured for ON DELETE
    and ON UPDATE. Foreign key actions are similar to triggers in many ways.

  
    The ON DELETE and ON UPDATE action associated with each foreign key in an
    SQLite database is one of "NO ACTION", "RESTRICT", "SET NULL",
    "SET DEFAULT" or "CASCADE". If an action is not explicitly specified, it 
    defaults to "NO ACTION".

  
     NO ACTION: Configuring "NO ACTION" means just that: when a
     parent key is modified or deleted from the database, no special action is
     taken.

     RESTRICT: The "RESTRICT" action means that the application
      is prohibited from deleting (for ON DELETE RESTRICT) or modifying
      (for ON UPDATE RESTRICT) a parent key when there exists one or more child
      keys mapped to it. The difference between the effect of a RESTRICT
      action and normal foreign key constraint enforcement is that the
      RESTRICT action processing happens as soon as the field is updated -
      not at the end of the current statement as it would with an immediate
      constraint, or at the end of the current transaction as it would with
      a deferred constraint.
      Even if the foreign key constraint it is 
      attached to is deferred, configuring a RESTRICT action causes SQLite to 
      return an error immediately if a parent key with dependent child keys is 
      deleted or modified.

     SET NULL: If the configured action is "SET NULL", then when
      a parent key is deleted (for ON DELETE SET NULL) or modified (for ON 
      UPDATE SET NULL), the child key columns of all rows in the child table
      that mapped to the parent key are set to contain SQL NULL values.

     SET DEFAULT: The "SET DEFAULT" actions are similar to
      "SET NULL",
      except that each of the child key columns is set to contain the column's 
      default value insteaðd of NULL. Refer to the CREATE TABLE 
      documentation for details on how default values are assigned to table
      columns.

     CASCADE: A "CASCADE" action propagates the delete or update
      operation on the parent key to each dependent child key. For an "ON 
      DELETE CASCADE" action, this means that each row in the child table that
      was associated with the deleted parent row is also deleted. For an "ON
      UPDATE CASCADE" action, it means that the values stored in each dependent
      child key are modified to match the new parent key values.
  

  
    For example, adding an "ON UPDATE CASCADE" clause to the foreign key as
    shown below enhances the example schema from section 1 to allow the user
    to update the artistid (the parent key of the foreign key constraint) 
    column without breaking referential integrity:
-- Database schema
CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE
);

sqlite&gt; SELECT * FROM artist;
artistid  artistname       
--------  -----------------
1         Dean Martin      
2         Frank Sinatra    

sqlite&gt; SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
11       That's Amore       1
12       Christmas Blues    1
13       My Way             2  

sqlite&gt; -- Update the artistid column of the artist record for "Dean Martin".
sqlite&gt; -- Normally, this would raise a constraint, as it would orphan the two
sqlite&gt; -- dependent records in the track table. However, the ON UPDATE CASCADE clause
sqlite&gt; -- attached to the foreign key definition causes the update to "cascade"
sqlite&gt; -- to the child table, preventing the foreign key constraint violation.
sqlite&gt; UPDATE artist SET artistid = 100 WHERE artistname = 'Dean Martin';

sqlite&gt; SELECT * FROM artist;
artistid  artistname       
--------  -----------------
2         Frank Sinatra    
100       Dean Martin      

sqlite&gt; SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
11       That's Amore       100
12       Christmas Blues    100  
13       My Way             2  


  
    Configuring an ON UPDATE or ON DELETE action does not mean that the foreign
    key constraint does not need to be satisfied. For example, if an
    "ON DELETE SET DEFAULT" action is configured,
    but there is no row in the parent table 
    that corresponds to the default values of the child key columns, deleting
    a parent key while dependent child keys exist still causes a foreign key
    violation. For example:

-- Database schema
CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER DEFAULT 0 REFERENCES artist(artistid) ON DELETE SET DEFAULT
);

sqlite&gt; SELECT * FROM artist;
artistid  artistname       
--------  -----------------
3         Sammy Davis Jr.

sqlite&gt; SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
14       Mr. Bojangles      3

sqlite&gt; -- Deleting the row from the parent table causes the child key
sqlite&gt; -- value of the dependent row to be set to integer value 0. However, this
sqlite&gt; -- value does not correspond to any row in the parent table. Therefore
sqlite&gt; -- the foreign key constraint is violated and an is exception thrown.
sqlite&gt; DELETE FROM artist WHERE artistname = 'Sammy Davis Jr.';
SQL error: foreign key constraint failed

sqlite&gt; -- This time, the value 0 does correspond to a parent table row. And
sqlite&gt; -- so the DELETE statement does not violate the foreign key constraint
sqlite&gt; -- and no exception is thrown.
sqlite&gt; INSERT INTO artist VALUES(0, 'Unknown Artist');
sqlite&gt; DELETE FROM artist WHERE artistname = 'Sammy Davis Jr.';

sqlite&gt; SELECT * FROM artist;
artistid  artistname       
--------  -----------------
0 ñ        Unknown Artist

sqlite&gt; SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
14       Mr. Bojangles      0


  
    Those familiar with SQLite triggers
    will have noticed that the 
    "ON DELETE SET DEFAULT" action demonstrated in the example above is
    similar in effect to the following AFTER DELETE trigger:
CREATE TRIGGER on_delete_set_default AFTER DELETE ON artist BEGIN
  UPDATE child SET trackartist = 0 WHERE trackartist = old.artistid;
END;


  
    Whenever a row in the parent table of a foreign key constraint is deleted,
    or when the values stored in the parent key column or columns are modified, 
    the logical sequence of events is:

  
    Execute applicable BEFORE trigger programs,
    Check local (non foreign key) constraints,
    Update or delete the row in the parent table,
    Perform any required foreign key actions,
    Execute applicable AFTER trigger programs.
  

  
    There is one important difference between ON UPDATE foreign key actions and
    SQL triggers. An ON UPDATE action is only taken if the values of the
    parent key are modified so that the new parent key values are 
    not equal to the old. For example:

-- Database schema
CREATE TABLE parent(x PRIMARY KEY);
CREATE TABLE child(y REFERENCES parent ON UPDATE SET NULL);

sqlite&gt; SELECT * FROM parent;
x
----
key

sqlite&gt; SELECT * FROM child;
y
----
key

sqlite&gt; -- Since the following UPDATE statement does not actually modify
sqlite&gt; -- the parent key value, the ON UPDATE action is not performed and
sqlite&gt; -- the child key value is not set to NULL.
sqlite&gt; UPDATE parent SET x = 'key';
sqlite&gt; SELECT IFNULL(y, 'null') FROM child;
y
----
key

sqlite&gt; -- This time, since the UPDATE statement does modify the parent key
sqlite&gt; -- value, the ON UPDATE action is performed and the child key is set
sqlite&gt; -- to NULL.
sqlite&gt; UPDATE parent SET x = 'key2';
sqlite&gt; SELECT IFNULL(y, 'null') FROM child;
y
----
null


5. CREATE, ALTER and DROP TABLE commands

  
    This section describes the way the CREATE TABLE, ALTER TABLE,
    and DROP TABLE commands
    interact with SQLite's foreign keys.

  
    A CREATE TABLE command operates the same whether or not
    foreign key constraints are enabled.  The parent key definitions of 
    foreign key constraints are not checked when a table is created. There is
    nothing stopping the user from creating a foreign key definition that
    refers to a parent table that does not exist, or to parent key columns that
    do not exist or are not collectively bound by a PRIMARY KEY or UNIQUE
    constraint.

  
    The ALTER TABLE command works differently in two respects when foreign
    key constraints are enabled:

  
     
         It is not possible to use the "ALTER TABLE ... ADD COLUMN" syntax
         to add a column that includes a REFERENCES clause, unless the default
         value of the new column is NULL. Attempting to do so returns an
         error.

     
         If an "ALTER TABLE ... RENAME TO" command is used to rename a table
         that is the parent table of one or more foreign key constraints, the
         definitions of the foreign key constraints are modified to refer to
         the parent table by its new name. The text of the child CREATE
         TABLE statement or statements stored in the sqlite_schema table are 
         modified to reflect the new parent table name.
  

  
    If foreign key constraints are enabled when it is prepared, the 
    DROP TABLE command performs an implicit DELETE to remove all
    rows from the table before dropping it. The implicit DELETE does not cause
    any SQL triggers to fire, but may invoke foreign key actions or constraint
    violations. If an immediate foreign key constraint is violated, the DROP
    TABLE statement fails and the table is not dropped. If a deferred foreign
    key constraint is violated, then an error is reported when the user attempts
    to commit the transaction if the foreign key constraint violations still
    exist at that point. Any "foreign key mismatch" errors encountered as part 
    of an implicit DELETE are ignored.

  
    The intent of these enhancements to the ALTER TABLE and DROP TABLE
    commands is to ensure that they cannot be used to create a database that
    contains foreign key violations, at least while foreign key constraints are
    enabled. There is one exception to this rule though. If a parent key is
    not subject to a PRIMARY KEY or UNIQUE constraint created as part of the
    parent table definition, but is subject to a UNIQUE constraint by virtue
    of an index created using the CREATE INDEX command, then the child 
    table may be populated without causing a "foreign key mismatch" error. If
    the UNIQUE index is dropped from the database schema, then the parent table
    itself is dropped, no error will be reported. However the database may be
    left in a state where the child table of the foreign key constraint contains
    rows that do not refer to any parent table row. This case can be avoided
    if all parent keys in the database schema are constrained by PRIMARY KEY
    or UNIQUE constraints added as part of the parent table definition, not
    by external UNIQUE indexes.

  
    The properties of the DROP TABLE and ALTER TABLE commands described
    above only apply if foreign keys are enabled. If the user considers them
    undesirable, then the workaround is to use PRAGMA foreign_keys to 
    disable foreign key constraints before executing the DROP or ALTER TABLE 
    command. Of course, while foreign key constraints are disabled, there is nothing
    to stop the user from violating foreign key constraints and thus creating
    an internally inconsistent database.
   
    

6. Limits and Unsupported Features

  
    This section lists a few limitations and omitted features that are not
    mentioned elsewhere.

  
     
      No support for the MATCH clause. According to SQL92, a MATCH clause
         may be attached to a composite foreign key definition to modify the way
         NULL values that occur in child keys are handled. If "MATCH SIMPLE" is
         specified, then a child key is not required to correspond to any row
         of the parent table if one or more of the child key values are NULL.
         If "MATCH FULL" is specified, then if any of the child key values is
         NULL, no corresponding row in the parent table is required, but all
         child key values must be NULL. Finally, if the foreign key constraint
         is declared as "MATCH PARTIAL" and one of the child key values is NULL,
         there must exist at least one row in the parent table for which the
         non-NULL child key values match the parent key values.

       
         SQLite parses MATCH clauses (i.e. does not report a syntax error
         if you specify one), but does not enforce them. All foreign key 
         constraints in SQLite are handled as if MATCH SIMPLE were specified.
     
      No support for switching constraints between deferred and immediate 
         mode. Many systems allow the user to toggle individual foreign key
         constraints between deferred and immediate 
         mode at runtime (for example using the Oracle "SET CONSTRAINT" command).
         SQLite does not support this. In SQLite, a foreign key constraint is
         permanently marked as deferred or immediate when it is created.

    
      Recursion limit on foreign key actions. The 
         SQLITE_MAX_TRIGGER_DEPTH and SQLITE_LIMIT_TRIGGER_DEPTH
         settings determine the maximum allowable depth of trigger
         program recursion. For the purposes of these limits,
         foreign key actions are considered trigger programs. The
         PRAGMA recursive_triggers setting does not affect the operation 
         of foreign key actions. It is not possible to disable recursive foreign 
         key actions.
   
This page last modified on  2022-01-20 21:38:08 UTCforeignkeys.html
 Љ4‚f
A‚’%Pointer Passing Interfaces1. Overview


Three new "_pointer()" interfaces were added to SQLite 3.20.0 (2017-08-01):

 sqlite3_bind_pointer(),
 sqlite3_result_pointer(), and
 sqlite3_value_pointer().


Questions and confusion quickly arose
on the mailing lists about the purpose behind these new interfaces,
why they were introduced, and what problem they solve.  This essay attempts
to answer those questions and clear up the confusion.

2. A Brief History Of Pointer Passing In SQLite


It is sometimes convenient for SQLite extensions to
communicate non-SQL values between subcomponents or between the extension
and the application.  Some examples:



In the FTS3 extension, the 
MATCH operator (which does the full-text search)
needs to communicate details of matching entries 
to the snippet(), offsets(),
and matchinfo() functions so that those functions can convert the details
of the match into useful output.


In order for an application to 
add new extensions to FTS5, such as new tokenizers, 
the application needs a pointer to the "fts5_api" object.


In the CARRAY extension, the application needs to tell the 
extension the
location of a C-language array that contains the data for the table-valuóŒ,‚e        -˜#High ReliabilitySQLite is a high-reliability storage solution.  It does not give
problems.  It just works.


The high-reliability of SQLite is proven in practice.
SQLite has been used without problems in multiple billions of smart-phones, 
IoT devices, and desktop applications, around the world, and for almost two
decades.


SQLite responds gracefully to system errors.  Obscure out-of-memory and
I/O errors are reported back up to the application.  These error reporting
paths are all carefully tested to ensure they will always work.


SQLite is resilient in the face of corrupt inputs, including maliciously
designed database files and SQL strings.  Extensive fuzz-testing ensures
that corrupt inputs will not lead to crashes or undefined behavior, but
will instead cause sensible errors to be reported back to the application.
(More...)


SQLite is built using a 
DO-178B-inspired process.
The testing standards for SQLite are among the highest for
commercial software.


SQLite is open-source but it is not open-contribution.
All the code in SQLite is written by a small team of experts.
The project does not accept "pull requests" or patches from 
anonymous passers-by on the internet.


The developers of SQLite intend to support the product through
the year 2050.  To this end, the source code is carefully documented
to promote long-term maintainability.  We prefer mature and stable
over trendy and cutting-edge.


All of these factors combine to make SQLite a very trouble-free
software library.
This page last modified on  2020-05-07 12:52:42 UTChirely.htmlôed
function that the extension implements.



The traditional way of communicating this information was to transform a
C-language pointer into a BLOB or a 64-bit integer, then move that BLOB or
integer through SQLite using the usual interfaces like
sqlite3_bind_blob(), sqlite3_result_blob(), sqlite3_value_blob() or
the integer equivalents.

2.1. Upping The Threat Level


Passing around pointers as if they were integers or BLOBs is easy,
effective, and works well in an environment where the application
components are all friendly toward one another.  However, passing pointers
as integers and BLOBs allows hostile SQL text to forge invalid pointers that
can carry out mischief.


For example, the first argument to the snippet() function is supposed to
be a special column of the FTS3 table that contains a pointer to an fts3cursor
object that contains information about the current full text search match.
That pointer was formerly passed as a BLOB.  
For example, if the FTS3 table is named "t1" and has a column named "cx",
one might write:

SELECT snippet(t1) FROM t1 WHERE cx MATCH $pattern;



But if a hacker is able to run arbitrary SQL, he might run a slightly
different query, like this:

SELECT hex(t1) FROM t1 WHERE cx MATCH $pattern;



Because the pointer is passed in the t1 column of the t1
table as a BLOB (in older versions of SQLite), such a query would have 
shown the value of the
pointer in hex.  The attacker could then modify that pointer to try to
get the snippet() function to modify memory in some other part of 
the application address space instead of the fts3cursor object it 
was supposed to be operating on:

SELECT snippet(x'6092310100000000') FROM t1 WHERE cx MATCH $pattern;



Historically, this was not considered a threat.  The argument was that if
a hostile agent is able to inject arbitrary SQL text into the application,
then that agent is already in full control of the application, so
letting the hostile agent forge a pointer does not give the agent
any new capability.


For most cases, it is true that potential attackers have no way of injecting
arbitrary SQL, and so most uses of SQLite are immune to the attack above.
But there are some notable exceptions.  To wit:



The WebSQL interface
to webkit allowed any webpage to run arbitrary SQL in the browser
for Chrome and Safari.  That arbitrary SQL was supposed to be run inside
a sandbox where it could do no harm even if exploited, but that sandbox
turned out to be less secure than people supposed.  In the spring of 2017, 
one team of hackers was able to root an iMac using a long sequence of 
exploits, one of which involved corrupting the pointers passed as BLOB 
values to the snippet() FTS3 function of an SQLite database running via
the WebSQL interface inside of Safari.


On Android, we are told, there are many services that will blindly 
run arbitrary SQL that is passed to them by untrustworthy apps
that have been downloaded from dodgy corners of the internet.
Android services are suppose to be more guarded about running SQL
from unvetted sources.  This author does not have any specific examples
to the contrary, but he has heard rumors that they exist.  Even if
all Android services are more careful and properly vet all the SQL
they run, it would be difficult to audit them
all in order to verify that they are safe.  Hence, security-minded people
are keen to ensure that no exploits are possible by passing arbitrary
SQL text.


The Fossil version control system (designed
and written for the purpose of supporting SQLite development) allows
mildly trusted users to enter arbitrary SQL for generating trouble-ticket
reports.  That SQL is sanitized using the
sqlite3_set_authorizer() interface, and no exploits have ever been
found.  But this is an example of potentially hostile agents being able to
inject arbitrary SQL into the system.


2.2. Preventing Forged Pointers


The first attempt at closing security gaps in pointer passing was to
prevent pointer values from being forged.  This was accomplished by
having the sender attach a subtype to each pointer usingõ
sqlite3_result_subtype() and having the receiver verify that subtype
using sqlite3_value_subtype() and reject pointers that had an incorrect
subtype.  Since there is no way to attach a subtype to a result using
pure SQL, this prevents pointers from being forged using SQL.  The only
way to send a pointer is to use C code.  If an attacker can set a subtype,
then he is also able to forge a pointer without the help of SQLite.


Using subtypes to identify valid pointers prevented the WebSQL exploit.
But it turned out to be an incomplete solution.



2.3. Pointer Leaks


The use of subtypes on pointers prevented pointer forgery using
pure SQL.  But subtypes do nothing to prevent an attacker from reading
the values of pointers.  In other words, subtypes on pointer values
prevent attacks using SQL statements like this:

SELECT snippet(x'6092310100000000') FROM t1 WHERE cx MATCH $pattern;



The BLOB argument to snippet() does not have the correct subtype, so the
snippet function ignores it, makes no changes to any data structures,
and harmlessly returns NULL.


But the use of subtypes does nothing to prevent the value of a
pointer from being read using SQL code like this:

SELECT hex(t1) FROM t1 WHERE cx MATCH $pattern;



What harm could come of that, you ask?  The SQLite developers (including
this author) wondered the same thing.  But then security researchers
pointed out that knowledge of pointers can help attackers to circumvent
address-space randomization defenses.  This is called a "pointer leak".
A pointer leak is not itself a vulnerability, but it can aid an attacker
in effectively exploiting other vulnerabilities.

3. The New Pointer-Passing Interfaces


Allowing extension components to pass private information to one another
securely and without introducing pointer leaks requires new interfaces:


sqlite3_bind_pointer(S,I,P,T,D) &rarr;
Bind pointer P of type T to the I-th parameter of prepared statement S.
D is an optional destructor function for P.
sqlite3_result_pointer(C,P,T,D) &rarr;
Return pointer P of type T as the argument of function C.
D is an optional destructor function for P.
sqlite3_value_pointer(V,T) &rarr;
Return the pointer of type T associated with value V, or if V has no
associated pointer, or if the pointer on V is of a type different from
T, then return NULL.



To SQL, the values created by sqlite3_bind_pointer() and 
sqlite3_result_pointer() are indistinguishable from NULL.  An
SQL statement that tries to use the hex() function to read the
value of a pointer will get an SQL NULL answer.  The only way to
discover whether or not a value has an associated pointer is to
use the sqlite3_value_pointer() interface with the appropriate
type string T. 


Pointer values read by sqlite3_value_pointer()
cannot be generated by pure SQL.  Hence, it is not possible for SQL to
forge pointers.


Pointer values generated by sqlite3_bind_pointer() and
sqlite3_result_pointer() cannot be read by pure SQL.
Hence, it is not possible for SQL to leak the value of pointers.


In this way the new pointer-passing interface seems to solve all of the
security problems associated with passing pointer values from one
extension to another in SQLite.



3.1. Pointer Types


The "pointer type" in the last parameter to sqlite3_bind_pointer(),
sqlite3_result_pointer(), and sqlite3_value_pointer() is used to prevent
pointers intended for one extension from being redirected to a different
extension.  For example, without the use of pointer types, an attacker 
could still get access to pointer information in a system that included 
both the FTS3 and the CARRAY extension using SQL like this:

SELECT ca.value FROM t1, carray(t1,10) AS ca WHERE cx MATCH $pattern



In the statement above, the FTS3 cursor pointer generated by the
MATCH operator is send into the carray() table-valued function instead
of its intended recipient snippet().  The carray() function treats the
pointer as a pointer to an array of integers and returns each integer
one by one, thus leaking the content of the FTS3 cursor object.  Since
the FTS3 cursor object contaöins pointers to other objects, the statement
above would be a pointer leak.


Except, the statement above does not work, thanks to pointer types.
The pointer generated by the MATCH operator has a type of "fts3cursor"
but the carray() function expects to receives a pointer of type "carray".
Because the pointer type on the sqlite3_result_pointer() does not match
the pointer type on the sqlite3_value_pointer() call, 
sqlite3_value_pointer() returns NULL in carray() and thus signals
the CARRAY extension that it has been passed an invalid pointer.

3.1.1. Pointer types are static strings


Pointer types are static strings, which ideally should be string literals
embedded directly in the SQLite API call, not parameters passed in from
other functions.  Consideration was given to using integer values as
the pointer type, but static strings provides a much larger name space
which reduces the chance of accidental type-name collisions between
unrelated extensions.


By "static string", we mean a zero-terminated array of bytes that is
fixed and unchanging for the life of the program.  In other words, the
pointer type string should be a string constant.
In contrast, a "dynamic string" is a zero-terminated array of bytes
that is held in memory allocated
from the heap, and which must be freed to avoid a memory leak.
Do not use dynamic strings as the pointer type string.


Multiple commentators have expressed a desire to use dynamic strings
for the pointer type, and to have SQLite take ownership of the type strings
and to automatically free the type string
when it has finished using it.  That design is rejected for the
following reasons:



The pointer type is not intended to be flexible and dynamic.  The
pointer type is intended to be a design-time constant.  Applications
should not synthesize pointer type strings at run-time.  Providing
support for dynamic pointer type strings would lead developers
to misuse the pointer-passing interfaces by creating run-time
synthesized pointer type strings.  Requiring the pointer type strings
to be static encourages developers to do the right thing by choosing
fixed pointer type names at design-time and encoding those names
as constant strings.


All string values at the SQL level in SQLite are dynamic strings.  
Requiring type strings to be static makes it difficult to 
create an application-defined SQL function that
can synthesize a pointer of an arbitrary type.  We do not want users
to create such SQL functions, since such functions would compromise the
security of the system.  Thus, the requirement to use static strings
helps to defend that the integrity of the pointer-passing interfaces against
ill-designed SQL functions.  The static string requirement is not
a perfect defense, since a sophisticated programmer can code around
it, and a novice program can simply take the memory leak.  But by
stating that the pointer type string must be static, we hope to encourage
developers who might otherwise use a dynamic string for the pointer type
to think more carefully about the problem and avoid introducing
security issues.


Having SQLite take ownership of the type strings would impose a performance
cost on all applications, even applications that do not use the 
pointer-passing interfaces.  SQLite passes values around as instances
of the sqlite3_value object.  That object has a destructor, which because
of the fact that sqlite3_value objects are used for nearly everything, is
invoked frequently.  If the destructor needs to check to see if there is
a pointer type string that needs to be freed, that is a few extra CPU
cycles that need to be burned on each call to the destructor.  Those
cycles add up.  We would be willing to bear the cost of the extra CPU
cycles if pointer-passing was a commonly used programming paradigm, but
pointer-passing is rare, and so it seems unwise to impose a run-time cost
on billions and billions of applications that do not use pointer passing
just for convenience of a few applications that do.



If you feel that you need dynamic pointer type strings in your application,
that is a strong indicator that you are misusing the pointer-passing interface.
Your intended use may be unsafe.
Please rethink your design.  Determine if you really need to be passing
pointers through SQL in the first place.  Or perhaps find a different
mechanism other than the pointer-passing interfaces described by this
article.

3.2. Destructor Functions


The last parameter to the sqlite3_bind_pointer() and
sqlite3_result_pointer() routines is a pointer to a procedure
used to dispose of the P pointer once SQLite has finished with it.
This pointer can be NULL, in which case no destructor is called.


When the D parameter is not NULL, that means that ownership of the
pointer is being transferred to SQLite.  SQLite will take responsibility
for freeing resources associated with the pointer when it has finished
using the pointer.  If the D parameter is NULL, that means that ownership
of the pointer remains with the caller and the caller is responsible for
disposing of the pointer.


Note that the destructor function D is for the pointer value P, not for
the type string T.  The type string T should be a static string with an
infinite lifetime.


If ownership of the pointer is passed into SQLite by providing a
non-NULL D parameter to sqlite3_bind_pointer() or sqlite3_result_pointer()
then the ownership remains with SQLite until the object is destroyed.
There is no way to transfer ownership out of SQLite and back into the
application again.

4. Restrictions On The Use of Pointer Values


The pointers that piggy-back on SQL NULL values using the
sqlite3_bind_pointer(), sqlite3_result_pointer(), and
sqlite3_value_pointer() interface are transient and ephemeral.
The pointers are never written into the database.  The pointers
will not survive sorting.  The latter fact is why there is no
sqlite3_column_pointer() interface, since it is impossible to
predict whether or not the query planner will insert a sort operation
prior to returning a value from a query, so it would be impossible to
know if a pointer value inserted into a query by
sqlite3_bind_pointer() or sqlite3_result_pointer() would survive
through to the result set.


Pointer values must flow directly from their producer into their
consumer, with no intermediate operators or functions.  Any transformation
of a pointer value destroys the pointer and transforms the value into
an ordinary SQL NULL.

5. Summary

Key take-aways from this essay:



The internet is an increasingly hostile place.  These day, developers
should assume that attackers will find a way to execute arbitrary SQL 
in an application.
Applications should be designed to prevent the execution of arbitrary
SQL from escalating into a more severe exploit.


A few SQLite extensions benefit from passing pointers:

The FTS3 MATCH operator passes pointers into snippet(),
    offsets(), and matchinfo().
The carray table-valued function needs to accept a pointer to
    an array of C-language values from the application.
The remember() extension
    needs a pointer to a C-language integer variable in which to remember
    the value it passes.
Applications need to receive a pointer to the "fts5_api" object in order
    to add extensions, such as custom tokenizers, to the FTS5 extension.



Pointers should never be exchanged by encoding them as some other
SQL datatype, such as integers or BLOBs.  Instead, use the interfaces
designed to facilitate secure pointer passing:
sqlite3_bind_pointer(), sqlite3_result_pointer(), and
sqlite3_value_pointer().


The use of pointer-passing is an advanced technique that should be used
infrequently and cautiously.  Pointer-passing should not be
used haphazardly or carelessly.  Pointer-passing is a sharp tool 
that can leave deep scars if misused.


The "pointer type" string which is the last parameter to each of the
pointer-passing interfaces should be a distinct, application-specific
string literal that appears directly in the API call.  The pointer type
should not be a parameter passed in from a higher-level function.

This page last modified on  2022-10-07 10:23:26 UTCbindptr.htmløND d='hello'


  Only columns a, b, and c of the index would be usable.  The d column
  would not be usable because it occurs to the right of c and c is
  constrained only by inequalities.


  For the index above and WHERE clause like this:

... WHERE a=5 AND b IN (1,2,3) AND d='hello'


  Only columns a and b of the index would be usable.  The d column
  would not be usable because column c is not constrained and there can
  be no gaps in the set of columns that usable by the index.


  For the index above and WHERE clause like this:

... WHERE b IN (1,2,3) AND c NOT NULL AND d='hello'


  The index is not usable at all because the left-most column of the
  index (column "a") is not constrained.  Assuming there are no other
  indexes, the query above would result in a full table scan.


  For the index above and WHERE clause like this:

... WHERE a=5 OR b IN (1,2,3) OR c NOT NULL OR d='hello'


  The index is not usable because the WHERE clause terms are connected
  by OR instead of AND. This query would result in a full table scan.
  However, if three additional indexes where added that contained columns
  b, c, and d as their left-most columns, then the
  OR-clause optimization might apply.




3. The BETWEEN Optimization


  If a term of the WHERE clause is of the following form:


  expr1 BETWEEN expr2 AND expr3


  Then two "virtual" terms are added as follows:


  expr1 &gt;= expr2 AND expr1 &lt;= expr3


  Virtual terms are used for analysis only and do not cause any byte-code
  to be generated.
  If both virtual terms end up being used as constraints on an index,
  then the original BETWEEN term is omitted and the corresponding test
  is not performed on input rows.
  Thus if the BETWEEN term ends up being used as an index constraint
  no tests are ever performed on that term.
  On the other hand, the
  virtual terms themselves never causes tests to be performed on
  input rows.
  Thus if the BETWEEN term is not used as an index constraint and
  instead must be used to test input rows, the expr1 expression is
  only evaluated once.



4. OR Optimizations


  WHERE clause constraints that are connected by OR instead of AND can
  be handled in two different ways.
  If a term consists of multiple subterms containing a common column
  name and separated by OR, like this:


  column = expr1 OR column = expr2 OR column = expr3 OR ...


  Then that term is rewritten as follows:


  column IN (expr1,expr2,expr3,...)


  The rewritten term then might go on to constrain an index using the
  normal rules for IN operators.  Note that column must be
  the same column in every OR-connected subterm,
  although the column can occur on either the left or the right side of
  the = operator.


  If and only if the previously described conversion of OR to an IN operator
  does not work, the second OR-clause optimization is attempted.
  Suppose the OR clause consists of multiple subterms as follows:


  expr1 OR expr2 OR expr3


  Individual subterms might be a single comparison expression like
  a=5 or x&gt;y or they can be 
  LIKE or BETWEEN expressions, or a subterm
  can be a parenthesized list of AND-connected sub-subterms.
  Each subterm is analyzed as if it were itself the entire WHERE clause
  in order to see if the subterm is indexable by itself.
  If every subterm of an OR clause is separately indexable
  then the OR clause might be coded such that a separate index is used
  to evaluate each term of the OR clause.  One way to think about how
  SQLite uses separate indexes for each OR clause term is to imagine
  that the WHERE clause where rewritten as follows:


  rowid IN (SELECT rowid FROM table WHERE expr1
            UNION SELECT rowid FROM table WHERE expr2
            UNION SELECT rowid FROM table WHERE expr3)


  The rewritten expression above is conceptual; WHERE clauses containing
  OR are not really rewritten this way.
  The actual implementation of the OR clause uses a mechanism that is
  more efficient and that works even for WITHOUT ROWID tables or 
  tables in which the "rowid" is inaccessible.  Neverthelùess,
  the essence of the implementation is captured by the statement
  above:  Separate indexes are used to find candidate result rows
  from each OR clause term and the final result is the union of
  those rows.


  Note that in most cases, SQLite will only use a single index for each
  table in the FROM clause of a query.  The second OR-clause optimization
  described here is the exception to that rule.  With an OR-clause,
  a different index might be used for each subterm in the OR-clause.


  For any given query, the fact that the OR-clause optimization described
  here can be used does not guarantee that it will be used.
  SQLite uses a cost-based query planner that estimates the CPU and
  disk I/O costs of various competing query plans and chooses the plan
  that it thinks will be the fastest.  If there are many OR terms in
  the WHERE clause or if some of the indexes on individual OR-clause 
  subterms are not very selective, then SQLite might decide that it is
  faster to use a different query algorithm, or even a full-table scan.
  Application developers can use the
  EXPLAIN QUERY PLAN prefix on a statement to get a
  high-level overview of the chosen query strategy.



5. The LIKE Optimization


  A WHERE-clause term that uses the LIKE or GLOB operator
  can sometimes be used with an index to do a range search, 
  almost as if the LIKE or GLOB were an alternative to a BETWEEN
  operator.
  There are many conditions on this optimization:


  
  The right-hand side of the LIKE or GLOB must be either a string literal
      or a parameter bound to a string literal
      that does not begin with a wildcard character.
  It must not be possible to make the LIKE or GLOB operator true by
      having a numeric value (instead of a string or blob) on the
      left-hand side. This means that either:
      
       the left-hand side of the LIKE or GLOB operator is the name
           of an indexed column with TEXT affinity, or
       the right-hand side pattern argument does not begin with a
           minus sign ("-") or a digit.
      
      This constraint arises from the fact that numbers do not sort in
      lexicographical order.  For example: 9&lt;10 but '9'&gt;'10'.
  The built-in functions used to implement LIKE and GLOB must not
      have been overloaded using the sqlite3_create_function() API.
  For the GLOB operator, the column must be indexed using the 
      built-in BINARY collating sequence.
  For the LIKE operator, if case_sensitive_like mode is enabled then
      the column must indexed using BINARY collating sequence, or if
      case_sensitive_like mode is disabled then the column must indexed
      using built-in NOCASE collating sequence.
  If the ESCAPE option is used, the ESCAPE character must be ASCII,
      or a single-byte character in UTF-8.
  


  The LIKE operator has two modes that can be set by a
  pragma.  The
  default mode is for LIKE comparisons to be insensitive to differences
  of case for latin1 characters.  Thus, by default, the following
  expression is true:

'a' LIKE 'A'


  If the case_sensitive_like pragma is enabled as follows:

PRAGMA case_sensitive_like=ON;


  Then the LIKE operator pays attention to case and the example above would
  evaluate to false.  Note that case insensitivity only applies to
  latin1 characters - basically the upper and lower case letters of English
  in the lower 127 byte codes of ASCII.  International character sets
  are case sensitive in SQLite unless an application-defined
  collating sequence and like() SQL function are provided that
  take non-ASCII characters into account.
  If an application-defined collating sequence and/or like() SQL
  function are provided, the LIKE optimization described here will never
  be taken.


  The LIKE operator is case insensitive by default because this is what
  the SQL standard requires.  You can change the default behavior at
  compile time by using the SQLITE_CASE_SENSITIVE_LIKE command-line option
  to the compiler.


  The LIKE optimization might occur if the column named on the left of the
  operatúor is indexed using the built-in BINARY collating sequence and
  case_sensitive_like is turned on.  Or the optimization might occur if
  the column is indexed using the built-in NOCASE collating sequence and the 
  case_sensitive_like mode is off.  These are the only two combinations
  under which LIKE operators will be optimized.


  The GLOB operator is always case sensitive.  The column on the left side
  of the GLOB operator must always use the built-in BINARY collating sequence
  or no attempt will be made to optimize that operator with indexes.


  The LIKE optimization will only be attempted if
  the right-hand side of the GLOB or LIKE operator is either
  literal string or a parameter that has been bound
  to a string literal.  The string literal must not
  begin with a wildcard; if the right-hand side begins with a wildcard
  character then this optimization is not attempted.  If the right-hand side 
  is a parameter that is bound to a string, then this optimization is
  only attempted if the prepared statement containing the expression
  was compiled with sqlite3_prepare_v2() or sqlite3_prepare16_v2().
  The LIKE optimization is not attempted if the
  right-hand side is a parameter and the statement was prepared using
  sqlite3_prepare() or sqlite3_prepare16().


  Suppose the initial sequence of non-wildcard characters on the right-hand
  side of the LIKE or GLOB operator is x.  We are using a single 
  character to denote this non-wildcard prefix but the reader should
  understand that the prefix can consist of more than 1 character.
  Let y be the smallest string that is the same length as /x/ but which
  compares greater than x.  For example, if x is
  'hello' then
  y would be 'hellp'.
  The LIKE and GLOB optimizations consist of adding two virtual terms
  like this:


  column &gt;= x AND column &lt; y


  Under most circumstances, the original LIKE or GLOB operator is still
  tested against each input row even if the virtual terms are used to
  constrain an index.  This is because we do not know what additional
  constraints may be imposed by characters to the right
  of the x prefix.  However, if there is only a single
  global wildcard to the right of x, then the original LIKE or 
  GLOB test is disabled.
  In other words, if the pattern is like this:


  column LIKE x%
  column GLOB x*


  then the original LIKE or GLOB tests are disabled when the virtual
  terms constrain an index because in that case we know that all of the
  rows selected by the index will pass the LIKE or GLOB test.


  Note that when the right-hand side of a LIKE or GLOB operator is
  a parameter and the statement is prepared using sqlite3_prepare_v2()
  or sqlite3_prepare16_v2() then the statement is automatically reparsed
  and recompiled on the first sqlite3_step() call of each run if the binding
  to the right-hand side parameter has changed since the previous run.
  This reparse and recompile is essentially the same action that occurs
  following a schema change.  The recompile is necessary so that the query
  planner can examine the new value bound to the right-hand side of the
  LIKE or GLOB operator and determine whether or not to employ the
  optimization described above.



6. The Skip-Scan Optimization


  The general rule is that indexes are only useful if there are 
  WHERE-clause constraints on the left-most columns of the index.
  However, in some cases,
  SQLite is able to use an index even if the first few columns of
  the index are omitted from the WHERE clause but later columns 
  are included.



  Consider a table such as the following:

CREATE TABLE people(
  name TEXT PRIMARY KEY,
  role TEXT NOT NULL,
  height INT NOT NULL, -- in cm
  CHECK( role IN ('student','teacher') )
);
CREATE INDEX people_idx1 ON people(role, height);



  The people table has one entry for each person in a large
  organization.  Each person is either a "student" or a "teacher",
  as determined by the "role" field.  The table also records the height in
  centimeters of each person.  The role and height are indexed.
  Notice thatû the left-most column of the index is not very
  selective - it only contains two possible values.



  Now consider a query to find the names of everyone in the
  organization that is 180cm tall or taller:


SELECT name FROM people WHERE height>=180;



  Because the left-most column of the index does not appear in the
  WHERE clause of the query, one is tempted to conclude that the
  index is not usable here.  However, SQLite is able to use the index.
  Conceptually, SQLite uses the index as if the query were more
  like the following:


SELECT name FROM people
 WHERE role IN (SELECT DISTINCT role FROM people)
   AND height>=180;



  Or this:

SELECT name FROM people WHERE role='teacher' AND height>=180
UNION ALL
SELECT name FROM people WHERE role='student' AND height>=180;



  The alternative query formulations shown above are conceptual only.
  SQLite does not really transform the query. 
  The actual query plan is like this:
  SQLite locates the first possible value for "role", which it
  can do by rewinding the "people_idx1" index to the beginning and reading
  the first record.  SQLite stores this first "role" value in an
  internal variable that we will here call "$role".  Then SQLite
  runs a query like: "SELECT name FROM people WHERE role=$role AND height>=180".
  This query has an equality constraint on the left-most column of the
  index and so the index can be used to resolve that query.  Once
  that query is finished, SQLite then uses the "people_idx1" index to
  locate the next value of the "role" column, using code that is logically
  similar to "SELECT role FROM people WHERE role>$role LIMIT 1".
  This new "role" value overwrites the $role variable, and the process
  repeats until all possible values for "role" have been examined.


  We call this kind of index usage a "skip-scan" because the database
  engine is basically doing a full scan of the index but it optimizes the
  scan (making it less than "full") by occasionally skipping ahead to the
  next candidate value.


  SQLite might use a skip-scan on an index if it knows that the first
  one or more columns contain many duplication values.
  If there are too few duplicates
  in the left-most columns of the index, then it would
  be faster to simply step ahead to the next value, and thus do
  a full table scan, than to do a binary search on an index to locate
  the next left-column value.


  The only way that SQLite can know that there are many duplicates
  in the left-most columns of an index
  is if the ANALYZE command has been run
  on the database.
  Without the results of ANALYZE, SQLite has to guess at the "shape" of
  the data in the table, and the default guess is that there are an average
  of 10 duplicates for every value in the left-most column of the index.
  Skip-scan only becomes profitable (it only gets to be faster than
  a full table scan) when the number of duplicates is about 18 or more.
  Hence, a skip-scan is never used on a database that has not been analyzed.



7. Joins


  The ON and USING clauses of an inner join are converted into additional
  terms of the WHERE clause prior to WHERE clause analysis described
  above in paragraph 2.0.
  Thus with SQLite, there is no computational
  advantage to use the newer SQL92 join syntax
  over the older SQL89 comma-join syntax.  They both end up accomplishing
  exactly the same thing on inner joins.


  For an OUTER JOIN the situation is more complex.  The following
  two queries are not equivalent:

SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.x=tab2.y;
SELECT * FROM tab1 LEFT JOIN tab2 WHERE tab1.x=tab2.y;


  For an inner join, the two queries above would be identical.  However,
  special processing applies to the ON and USING clauses of an OUTER join:
  specifically, the constraints in an ON or USING clause do not apply if
  the right table of the join is on a null row, but the constraints do apply
  in the WHERE clause.  The net effect is that putting the ON or USING
  clause expressions for a LEFT JOIN in the WHERE clause effectively converts
  the query to an
  ordinary INNüER JOIN - albeit an inner join that runs more slowly.



7.1. Order of Tables in a Join


  The current implementation of 
  SQLite uses only loop joins.  That is to say, joins are implemented as
  nested loops.


  The default order of the nested loops in a join is for the left-most
  table in the FROM clause to form the outer loop and the right-most
  table to form the inner loop.
  However, SQLite will nest the loops in a different order if doing so
  will help it to select better indexes.


  Inner joins can be freely reordered.  However a left outer join is
  neither commutative nor associative and hence will not be reordered.
  Inner joins to the left and right of the outer join might be reordered
  if the optimizer thinks that is advantageous but the outer joins are
  always evaluated in the order in which they occur.


  SQLite treats the CROSS JOIN operator specially.
  The CROSS JOIN operator is commutative, in theory.  However, SQLite chooses to
  never reorder tables in a CROSS JOIN.  This provides a mechanism
  by which the programmer can force SQLite to choose a particular loop nesting
  order.  


  When selecting the order of tables in a join, SQLite uses an efficient
  polynomial-time algorithm.  Because of this,
  SQLite is able to plan queries with 50- or 60-way joins in a matter of
  microseconds


  Join reordering is automatic and usually works well enough that
  programmers do not have to think about it, especially if ANALYZE
  has been used to gather statistics about the available indexes,
  though occasionally some hints from the programmer are needed.
  Consider, for example, the following schema:

CREATE TABLE node(
   id INTEGER PRIMARY KEY,
   name TEXT
);
CREATE INDEX node_idx ON node(name);
CREATE TABLE edge(
   orig INTEGER REFERENCES node,
   dest INTEGER REFERENCES node,
   PRIMARY KEY(orig, dest)
);
CREATE INDEX edge_idx ON edge(dest,orig);


  The schema above defines a directed graph with the ability to store a
  name at each node. Now consider a query against this schema:

SELECT *
  FROM edge AS e,
       node AS n1,
       node AS n2
 WHERE n1.name = 'alice'
   AND n2.name = 'bob'
   AND e.orig = n1.id
   AND e.dest = n2.id;


  This query asks for is all information about edges that go from
  nodes labeled "alice" to nodes labeled "bob".
  The query optimizer in SQLite has basically two choices on how to
  implement this query.  (There are actually six different choices, but
  we will only consider two of them here.)
  Pseudocode below demonstrating these two choices.



Option 1:
foreach n1 where n1.name='alice' do:
  foreach n2 where n2.name='bob' do:
    foreach e where e.orig=n1.id and e.dest=n2.id
      return n1.*, n2.*, e.*
    end
  end
end



Option 2:
foreach n1 where n1.name='alice' do:
  foreach e where e.orig=n1.id do:
    foreach n2 where n2.id=e.dest and n2.name='bob' do:
      return n1.*, n2.*, e.*
    end
  end
end


  The same indexes are used to speed up every loop in both implementation
  options.
  The only difference in these two query plans is the order in which
  the loops are nested.


  So which query plan is better? It turns out that the answer depends on
  what kind of data is found in the node and edge tables.


  Let the number of alice nodes be M and the number of bob nodes be N.
  Consider two scenarios. In the first scenario, M and N are both 2 but
  there are thousands of edges on each node. In this case, option 1 is
  preferred. With option 1, the inner loop checks for the existence of
  an edge between a pair of nodes and outputs the result if found. 
  Because there are only 2 alice and bob nodes each, the inner loop
  only has to run four times and the query is very quick. Option 2 would
  take much longer here. The outer loop of option 2 only executes twice,
  but because there are a large number of edges leaving each alice node,
  the middle loop has to iterate many thousands of times. It will be
  much slower. So in the first scenario, we prefer to use option 1.


  Now consider the case where M and N are both 3500. Alice nodes are
  aýbundant.  This time suppose each of these nodes is connected by only one
  or two edges. Now option 2 is preferred. With option 2,
  the outer loop still has to run 3500 times, but the middle loop only
  runs once or twice for each outer loop and the inner loop will only
  run once for each middle loop, if at all. So the total number of
  iterations of the inner loop is around 7000. Option 1, on the other
  hand, has to run both its outer loop and its middle loop 3500 times
  each, resulting in 12 million iterations of the middle loop.
  Thus in the second scenario, option 2 is nearly 2000 times faster
  than option 1.


  So you can see that depending on how the data is structured in the table,
  either query plan 1 or query plan 2 might be better.  Which plan does
  SQLite choose by default?  As of version 3.6.18, without running ANALYZE,
  SQLite will choose option 2.
  If the ANALYZE command is run in order to gather statistics,
  a different choice might be made if the statistics indicate that the
  alternative is likely to run faster.



7.2. Manual Control Of Query Plans Using SQLITE_STAT Tables


  SQLite provides the ability for advanced programmers to exercise control
  over the query plan chosen by the optimizer. One method for doing this
  is to fudge the ANALYZE results in the sqlite_stat1, 
  sqlite_stat3, and/or sqlite_stat4 tables.  This is not
  recommended for most situations.



7.3. Manual Control of Query Plans using CROSS JOIN


  Programmers can force SQLite to use a particular loop nesting order
  for a join by using the CROSS JOIN operator instead of just JOIN, 
  INNER JOIN, NATURAL JOIN, or a "," join.  Though CROSS JOINs are
  commutative in theory, SQLite chooses to never reorder the tables in
  a CROSS JOIN.  Hence, the left table of a CROSS JOIN will always be
  in an outer loop relative to the right table.


  In the following query, the optimizer is free to reorder the 
  tables of FROM clause any way it sees fit:

SELECT *
  FROM node AS n1,
       edge AS e,
       node AS n2
 WHERE n1.name = 'alice'
   AND n2.name = 'bob'
   AND e.orig = n1.id
   AND e.dest = n2.id;


  In the following logically equivalent formulation of the same query,
  the substitution of "CROSS JOIN" for the "," means that the order
  of tables must be N1, E, N2.

SELECT *
  FROM node AS n1 CROSS JOIN
       edge AS e CROSS JOIN
       node AS n2
 WHERE n1.name = 'alice'
   AND n2.name = 'bob'
   AND e.orig = n1.id
   AND e.dest = n2.id;


  In the latter query, the query plan must be 
  option 2.  Note that
  you must use the keyword "CROSS" in order to disable the table reordering
  optimization; INNER JOIN, NATURAL JOIN, JOIN, and other similar
  combinations work just like a comma join in that the optimizer is
  free to reorder tables as it sees fit. (Table reordering is also
  disabled on an outer join, but that is because outer joins are not
  associative or commutative. Reordering tables in OUTER JOIN changes
  the result.)


  See "The Fossil NGQP Upgrade Case Study" for another real-world example
  of using CROSS JOIN to manually control the nesting order of a join.
  The query planner checklist found later in the same document provides
  further guidance on manual control of the query planner.



8. Choosing Between Multiple Indexes


  Each table in the FROM clause of a query can use at most one index
  (except when the OR-clause optimization comes into
  play)
  and SQLite strives to use at least one index on each table.  Sometimes,
  two or more indexes might be candidates for use on a single table.
  For example:

CREATE TABLE ex2(x,y,z);
CREATE INDEX ex2i1 ON ex2(x);
CREATE INDEX ex2i2 ON ex2(y);
SELECT z FROM ex2 WHERE x=5 AND y=6;


  For the SELECT statement above, the optimizer can use the ex2i1 index
  to lookup rows of ex2 that contain x=5 and then test each row against
  the y=6 term.  Or it can use the ex2i2 index to lookup rows
  of ex2 that contain y=6 then test each of those rows against the
  x=5 term.


  When faced with a choice of two or more indexes, SQLite tries to estimate
  thþe total amount of work needed to perform the query using each option.
  It then selects the option that gives the least estimated work.


  To help the optimizer get a more accurate estimate of the work involved
  in using various indexes, the user may optionally run the ANALYZE command.
  The ANALYZE command scans all indexes of database where there might
  be a choice between two or more indexes and gathers statistics on the
  selectiveness of those indexes.  The statistics gathered by
  this scan are stored in special database tables names shows names all
  begin with "sqlite_stat".
  The content of these tables is not updated as the database
  changes so after making significant changes it might be prudent to
  rerun ANALYZE.
  The results of an ANALYZE command are only available to database connections
  that are opened after the ANALYZE command completes.


  The various sqlite_statN tables contain information on how
  selective the various indexes are.  For example, the sqlite_stat1
  table might indicate that an equality constraint on column x reduces the
  search space to 10 rows on average, whereas an equality constraint on
  column y reduces the search space to 3 rows on average.  In that case,
  SQLite would prefer to use index ex2i2 since that index is more selective.



8.1. Disqualifying WHERE Clause Terms using Unary-"+"


  Terms of the WHERE clause can be manually disqualified for use with
  indexes by prepending a unary + operator to the column name.  The
  unary + is a no-op and will not generate any byte code in the prepared
  statement.
  However, the unary + operator will prevent the term from
  constraining an index.
  So, in the example above, if the query were rewritten as:

SELECT z FROM ex2 WHERE +x=5 AND y=6;


  The + operator on the x column will prevent that term from 
  constraining an index.  This would force the use of the ex2i2 index.


  Note that the unary + operator also removes 
  type affinity from
  an expression, and in some cases this can cause subtle changes in
  the meaning of an expression.
  In the example above,
  if column x has TEXT affinity
  then the comparison "x=5" will be done as text.  The + operator
  removes the affinity.  So the comparison "+x=5" will compare the text
  in column x with the numeric value 5 and will always be false.



8.2. Range Queries


  Consider a slightly different scenario:

CREATE TABLE ex2(x,y,z);
CREATE INDEX ex2i1 ON ex2(x);
CREATE INDEX ex2i2 ON ex2(y);
SELECT z FROM ex2 WHERE x BETWEEN 1 AND 100 AND y BETWEEN 1 AND 100;


  Further suppose that column x contains values spread out
  between 0 and 1,000,000 and column y contains values
  that span between 0 and 1,000.  In that scenario,
  the range constraint on column x should reduce the search space by
  a factor of 10,000 whereas the range constraint on column y should
  reduce the search space by a factor of only 10.  So the ex2i1 index
  should be preferred.


  SQLite will make this determination, but only if it has been compiled
  with SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4.
  The SQLITE_ENABLE_STAT3 and SQLITE_ENABLE_STAT4 options causes
  the ANALYZE command to collect a histogram of column content in the
  sqlite_stat3 or sqlite_stat4 tables and to use this histogram to 
  make a better guess at the best query to use for range constraints
  such as the above.  The main difference between STAT3 and STAT4 is
  that STAT3 records histogram data for only the left-most column of
  an index whereas STAT4 records histogram data for all columns of an
  index.  For single-column indexes, STAT3 and STAT4 work the same.


  The histogram data is only useful if the right-hand side of the constraint
  is a simple compile-time constant or parameter and not an expression.


  Another limitation of the histogram data is that it only applies to the
  left-most column on an index.  Consider this scenario:

CREATE TABLE ex3(w,x,y,z);
CREATE INDEX ex3i1 ON ex2(w, x);
CREATE INDEX ex3i2 ON ex2(w, y);
SELECT z FROM ex3 WHERE w=5 AND x BETWEEN 1 AND 100 AND y BETWEEN 1 AND 100;


  Here theÿ inequalities are on columns x and y which are not the
  left-most index columns.  Hence, the histogram data which is collected no
  left-most column of indexes is useless in helping to choose between the
  range constraints on columns x and y.



9. Covering Indexes


  When doing an indexed lookup of a row, the usual procedure is to
  do a binary search on the index to find the index entry, then extract
  the rowid from the index and use that rowid to do a binary search on
  the original table.  Thus a typical indexed lookup involves two
  binary searches.
  If, however, all columns that were to be fetched from the table are
  already available in the index itself, SQLite will use the values
  contained in the index and will never look up the original table
  row.  This saves one binary search for each row and can make many
  queries run twice as fast.


  When an index contains all of the data needed for a query and when the
  original table never needs to be consulted, we call that index a
  "covering index".



10. ORDER BY Optimizations


  SQLite attempts to use an index to satisfy the ORDER BY clause of a
  query when possible.
  When faced with the choice of using an index to satisfy WHERE clause
  constraints or satisfying an ORDER BY clause, SQLite does the same
  cost analysis described above
  and chooses the index that it believes will result in the fastest answer.


  SQLite will also attempt to use indexes to help satisfy GROUP BY clauses
  and the DISTINCT keyword.  If the nested loops of the join can be arranged
  such that rows that are equivalent for the GROUP BY or for the DISTINCT are
  consecutive, then the GROUP BY or DISTINCT logic can determine if the 
  current row is part of the same group or if the current row is distinct
  simply by comparing the current row to the previous row.
  This can be much faster than the alternative of comparing each row to
  all prior rows.



10.1. Partial ORDER BY via Index


  If a query contains an ORDER BY clause with multiple terms, it might
  be that SQLite can use indexes to cause rows to come out in the order
  of some prefix of the terms in the ORDER BY but that later terms in
  the ORDER BY are not satisfied.  In that case, SQLite does block sorting.
  Suppose the ORDER BY clause has four terms and the natural order of the
  query results in rows appearing in order of the first two terms.  As
  each row is output by the query engine and enters the sorter, the 
  outputs in the current row corresponding to the first two terms of 
  the ORDER BY are compared against the previous row.  If they have
  changed, the current sort is finished and output and a new sort is
  started.  This results in a slightly faster sort.  Event bigger
  advantages are that many fewer rows need to be held in memory,
  reducing memory requirements, and outputs can begin to appear before
  the core query has run to completion.



11. Subquery Flattening


  When a subquery occurs in the FROM clause of a SELECT, the simplest
  behavior is to evaluate the subquery into a transient table, then run
  the outer SELECT against the transient table.  Such a plan
  can be suboptimal since the transient table will not have any indexes
  and the outer query (which is likely a join) will be forced to do a
  full table scan on the transient table.


  To overcome this problem, SQLite attempts to flatten subqueries in
  the FROM clause of a SELECT.
  This involves inserting the FROM clause of the subquery into the
  FROM clause of the outer query and rewriting expressions in
  the outer query that refer to the result set of the subquery.
  For example:

SELECT t1.a, t2.b FROM t2, (SELECT x+y AS a FROM t1 WHERE z&lt;100) WHERE a&gt;5


  Would be rewritten using query flattening as:

SELECT t1.x+t1.y AS a, t2.b FROM t2, t1 WHERE z&lt;100 AND a&gt;5


  There is a long list of conditions that must all be met in order for
  query flattening to occur.  Some of the constraints are marked as 
  obsolete by italic text.  These extra constraints are retained in the
  documentation to preserve the numbering of the other constraints.


  Casual readers are not expected to understand all of these rules.
  A key take-away from this section is that the rules for determining
  if query flatting is safe or unsafe are subtle and
  complex.  There have been multiple bugs over the years caused by
  over-aggressive query flattening.  On the other hand, performance
  of complex queries and/or queries involving views tends to suffer
  if query flattening is more conservative.


  
    (Obsolete.  Query flattening is no longer
                      attempted for aggregate subqueries.)

    (Obsolete.  Query flattening is no longer
                      attempted for aggregate subqueries.)

  
  If the subquery is the right operand of a LEFT JOIN then
    the subquery may not be a join, and
    the FROM clause of the subquery may
   not contain a virtual table, and
    the outer query may not be an aggregate.

    The subquery is not DISTINCT.

   (Subsumed into constraint 4)

   (Obsolete.  Query flattening is no longer
                      attempted for aggregate subqueries.)

  
  The subquery has a FROM clause.

  
  The subquery does not use LIMIT or the outer query is not a join.

  
  The subquery does not use LIMIT or the outer query does not use
  aggregates.

   (Restriction relaxed in 2005)

  
  The subquery and the outer query do not both have ORDER BY clauses.

   (Subsumed into constraint 3)

    The subquery and outer query do not both use LIMIT.

    The subquery does not use OFFSET.

  
  If the outer query is part of a compound select, then the
  subquery may not have a LIMIT clause.

  
  If the outer query is an aggregate, then the subquery may
  not contain ORDER BY. 

  
  If the sub-query is a compound SELECT, then
  
   all compound operators must be UNION ALL, and
   no terms with the subquery compound may be aggregate
       or DISTINCT, and
   every term within the subquery must have a FROM clause, and
   the outer query may not be an aggregate, DISTINCT query, or join.
  

  The parent and sub-query may contain WHERE clauses. Subject to
  rules (11), (12) and (13), they may also contain ORDER BY,
  LIMIT and OFFSET clauses.

  
  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.

  
  If the subquery uses LIMIT then the outer query may not
  have a WHERE clause.

  
  If the sub-query is a compound select, then it must not use
   an ORDER BY clause.

  
  If the subquery uses LIMIT, then the outer query may not be
  DISTINCT.

   The subquery may not be a recursive CTE.

   (Subsumed into constraint 17d.)

   (Obsolete. Query flattening is no longer
                      attempted for aggregate subqueries.)
  



  Query flattening is an important optimization when views are used as
  each use of a view is translated into a subquery.



12. Subquery Co-routines


  Prior to SQLite 3.7.15 (2012-12-12),
  a subquery in the FROM clause would be
  either flattened into the outer query, or else the subquery would be run
  to completion
  before the outer query started, the result set from the subquery
  would be stored in a transient table,
  and then the transient table would be used in the outer query.  Newer
  versions of SQLite have a third option, which is to implement the subquery
  using a co-routine.


  A co-routine is like a subroutine in that it runs in the same thread
  as the caller and eventually returns control back to the caller.  The
  difference is that a co-routine also has the ability to return
  before it has finished, and then resume where it left off the next
  time it is called.


  When a subquery is implemented as a co-routine, byte-code is generated
  to implement the subquery as if it were a standalone query, except
  instead of returning rows of results back to the application, the
  co-routine yields control back to the caller after each row is computed.
  The caller can then use that one computed row as part of its computation,
  then invoke the co-routine again when it is ready for the next row.


  Co-routines are better than storing the complete result set of the subquery
  in a transient table because co-routines use less memory.  With a co-routine,
  only a single row of the result needs to be remembered, whereas all rows of
  the result must be stored for a transient table.  Also, because the
  co-routine does not need to run to completion before the outer query
  begins its work, the first rows of output can appear much sooner, and if
  the overall query is aborted, less work is done overall.


  On the other hand, if the result of the subquery must be scanned multiple
  times (because, for example, it is just one table in a join) then it
  is better to use a transient table to remember the entire result of the
  subquery, in order to avoid computing the subquery more than once.



12.1. Using Co-routines to Defer Work until after the Sorting


  As of SQLite version 3.21.0 (2017-10-24), the query planner will
  always prefer to use a co-routine to implement FROM-clause subqueries 
  that contains an ORDER BY clause and that are not part of a join when
  the result set of the outer query is "complex".  This feature allows
  applications to shift expensive computations from before the
  sorter until after the sorter, which can result in faster operation.
  For example, consider this query:

SELECT expensive_function(a) FROM tab ORDER BY date DESC LIMIT 5;


  The goal of this query is to compute some value for the five most
  recent entries in the table.  In the query above, the
  "expensive_function()" is invoked prior to the sort and thus is
  invoked on every row of the table, even
  rows that are ultimately omitted due to the LIMIT clause.
  A co-routine can be used to work around this:

SELECT expensive_function(a) FROM (
  SELECT a FROM tab ORDER BY date DESC LIMIT 5
);


  In the revised query, the subquery implemented by a co-routine computes
  the five most recent values for "a".  Those five values are passed from the
  co-routine up into the outer query where the "expensive_function()" is
  invoked on only the specific rows that the application cares about.


  The query planner in future versions of SQLite might grow smart enough
  to make transformations such as the above automatically, in both directions.
  That is to say, future versions of SQLite might transform queries of the
  first form into the second, or queries written the second way into the
  first.  As of SQLite version 3.22.0 (2018-01-22), the query planner
  will flatten the subquery if the outer query does not make use of any
  user-defined functions or subqueries in its result set.  For the examples
  shown above, however, SQLite implements each of the queries as
  written.



13. The MIN/MAX Optimization


  Queries that contain a single MIN() or MAX() aggregate function whose
  argument is the left-most column of an index might be satisfied
  by doing a single index lookup rather than by scanning the entire table.
  Examples:

SELECT MIN(x) FROM table;
SELECT MAX(x)+1 FROM table;




14. Automatic Indexes


  When no indexes are available to aid the evaluation of a query, SQLite
  might create an automatic index that lasts only for the duration
  of a single SQL statement.
  Since the cost of constructing the automatic index is
  O(NlogN) (where N is the number of entries in the table) and the cost of
  doing a full table scan is only O(N), an automatic index will
  only be created if SQLite expects that the lookup will be run more than
  logN times during the course of the SQL statement. Consider an example:

CREATE TABLE t1(a,b);
CREATE TABLE t2(c,d);
-- Insert many rows into both t1 and t2
SELECT * FROM t1, t2 WHERE a=c;


  In the query above, if both t1 and t2 have approximately N rows, then
  without any indexes the query will require O(N*N) time.  On the other
  hand, creating an index on table t2 requires O(NlogN) time and using
  that index to evaluate the query requires an additional O(NlogN) time.
  In the absence of ANALYZE information, SQLite guesses that N is one
  million and hence it believes that constructing the automatic index will
  be the cheaper approach.


  An automatic index might also be used for a subquery:

CREATE TABLE t1(a,b);
CREATE TABLE t2(c,d);
-- Insert many rows into both t1 and t2
SELECT a, (SELECT d FROM t2 WHERE c=b) FROM t1;


  In this example, the t2 table is used in a subquery to translate values
  of the t1.b column.  If each table contains N rows, SQLite expects that
  the subquery will run N times, and hence it will believe it is faster
  to construct an automatic, transient index on t2 first and then use
  that index to satisfy the N instances of the subquery.


  The automatic indexing capability can be disabled at run-time using
  the automatic_index pragma.  Automatic indexing is turned on by
  default, but this can be changed so that automatic indexing is off
  by default using the SQLITE_DEFAULT_AUTOMATIC_INDEX compile-time option.
  The ability to create automatic indexes can be completely disabled by
  compiling with the SQLITE_OMIT_AUTOMATIC_INDEX compile-time option.


  In SQLite version 3.8.0 (2013-08-26) and later, 
  an SQLITE_WARNING_AUTOINDEX message is sent
  to the error log every time a statement is prepared that uses an
  automatic index.  Application developers can and should use these warnings
  to identify the need for new persistent indexes in the schema.


  Do not confuse automatic indexes with the internal indexes (having names
  like "sqlite_autoindex_table_N") that are sometimes
  created to implement a PRIMARY KEY constraint or UNIQUE constraint.
  The automatic indexes described here exist only for the duration of a
  single query, are never persisted to disk, and are only visible to a
  single database connection.  Internal indexes are part of the implementation
  of PRIMARY KEY and UNIQUE constraints, are long-lasting and persisted
  to disk, and are visible to all database connections.  The term "autoindex"
  appears in the names of internal indexes for legacy reasons and does
  not indicate that internal indexes and automatic indexes are related.



14.1. Hash Joins


 An automatic index is about the same thing as a
 hash join.  The only difference
 is that a B-Tree is used instead of a hash table.  If you are willing to
 say that the transient B-Tree constructed for an automatic index is
 really just a fancy hash table, then a query that uses an automatic
 index is just a hash join.


 SQLite constructs an transient index instead of a hash table in this
 instance because it already has a robust and high performance B-Tree
 implementation at hand, whereas a hash-table would need to be added.
 Adding a separate hash table implementation to handle this one case
 would increase the size of the library (which is designed for use on
 low-memory embedded devices) for minimal performance gain.  SQLite might
 be enhanced with a hash-table implementation someday, but for now it seems
 better to continue using automatic indexes in cases where client/server
 database engines might use a hash join.



15. The Push-Down Optimization


  If a subquery cannot be flattened into the outer query, it might
  still be possible to enhance performance by "pushing down" WHERE clause
  terms from the outer query into the subquery.  Consider an example:

CREATE TABLE t1(a INT, b INT);
CREATE TABLE t2(x INT, y INT);
CREATE VIEW v1(a,b) AS SELECT DISTINCT a, b FROM t1;

SELECT x, y, b
  FROM t2 JOIN v1 ON (x=a)
 WHERE b BETWEEN 10 AND 20;



  The view v1 cannot be flattened because it is DISTINCT.  It must
  instead be run as a subquery with the results being stored in a
  transient table, then the join is performed between t2 and the
  transient table.  The push-down optimization pushes down the
  "b BETWEEN 10 AND 20" term into the view.  This makes the transient
  table smaller, and helps the subquery to run faster if there
  is an index on t1.b.  The resulting evaluation is like this:

SELECT x, y, b
  FROM t2
  JOIN (SELECT DISTINCT a, b FROM t1 WHERE b BETWEEN 10 AND 20)
 WHERE b BETWEEN 10 AND 20;



  The push-down optimization cannot always be used.  For example,
  if the subquery contains a LIMIT, then pushing down any part of
  the WHERE clause from the outer query could change the result of
  the inner query.  There are other restrictions, explained in a
  comment in the source code on the pushDownWhereTerms() routine
  that implements this optimization.



16. The LEFT JOIN Strength Reduction Optimization


  A LEFT JOIN can sometimes be converted into an ordinary JOIN
  if there are terms in the WHERE clause that guarantee that the
  two joins will give identical results.  In particular, if any
  column in the right-hand table of the LEFT JOIN must be non-NULL
  in order for the WHERE clause to be true, then the LEFT JOIN is
  demoted to an ordinary JOIN.


  The prover that determines whether any column of the right-hand
  table of a LEFT JOIN must be non-NULL in the WHERE clause is
  imperfect.  It sometimes returns a false negative.  In other words,
  it sometimes fails to reduce the strength of a LEFT JOIN when doing
  so was in fact possible.  For example, the prover does not know
  the datetime() SQL function will always return NULL if its first
  argument is NULL, and so it will not recognize that the LEFT JOIN
  in the following query could be strength-reduced:

SELECT urls.url
  FROM urls
  LEFT JOIN
    (SELECT *
      FROM (SELECT url_id AS uid, max(retrieval_time) AS rtime
              FROM lookups GROUP BY 1 ORDER BY 1)
      WHERE uid IN (358341,358341,358341)
    ) recent
    ON u.source_seed_id = recent.xyz OR u.url_id = recent.xyz
 WHERE
     DATETIME(recent.rtime) > DATETIME('now', '-5 days');



  It is possible that future enhancements to the prover might enable it
  to recognize that NULL inputs to certain built-in functions
  always result in a NULL answer.  However, not all built-in
  functions have that property (for example coalesce()) and, of
  course, the prover will never be able to reason about
  application-defined SQL functions.




17. The Omit LEFT JOIN Optimization


  Sometimes a LEFT JOIN can be completely omitted from a query without
  changing the result.  This can happen if all of the following are
  true:


  
   The query is not an aggregate
   Either the query is DISTINCT or else the ON or USING clause
       on the LEFT JOIN constrains the join such that it matches
       only a single row
   The right-hand table of the LEFT JOIN is not be used anywhere
       in the query outside of its own USING or ON clause.
  


  LEFT JOIN elimination often comes up when LEFT JOINs are used
  inside of views, and then the view is used in such as way that
  none of the columns of the right-hand table of the LEFT JOIN are
  referenced.


  Here is a simple example of omitting a LEFT JOIN:

CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1);
CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2);
CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3);

SELECT v1, v3 FROM t1 
  LEFT JOIN t2 ON (t1.ipk=t2.ipk)
  LEFT JOIN t3 ON (t1.ipk=t3.ipk)



  The t2 table is completely unused in the query above, and so the
  query planner is able to implement the query as if it were written:

SELECT v1, v3 FROM t1 
  LEFT JOIN t3 ON (t1.ipk=t3.ipk)





18. The Constant Propagation Optimization


  When a WHERE clause contains two or more equality constraints connected
  by the AND operator such that all of the affinities of the various
  constraints are the same, then SQLite might use the transitive property
  of equality to construct new "virtual" constraints that can be used to
  simplify expressions and/or improve performance.  This is called the
  "constant-propagation optimization".


  For example, consider the following schema and query:

CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c INT);
SELECT * FROM t1 WHERE a=b AND b=5;



  SQLite looks at the "a=b" and "b=5" constraints and deduces that
  if those two constraints are true, then it must also be the case
  that "a=5" is true.  This means that the desired row can be looked up
  quickly using a value of 5 for the INTEGER PRIMARY KEY.
This page last modified on  2022-09-19 12:27:16 UTCoptoverview.html
EEƒ‚g
S†¹-The SQLite Query Optimizer Overview1. Introduction

  This document provides an overview of how the query planner and optimizer
  for SQLite works.



  Given a single SQL statement, there might be dozens, hundreds, or even
  thousands of ways to implement that statement, depending on the complexity
  of the statement itself and of the underlying database schema.  The 
  task of the query planner is to select the algorithm that minimizes
  disk I/O and CPU overhead.



  Additional background information is available in the
  indexing tutorial document.



  With release 3.8.0 (2013-08-26),
  the SQLite query planner was reimplemented as the
  Next Generation Query Planner or "NGQP".  All of the features, techniques,
  and algorithms described in this document are applicable to both the
  pre-3.8.0 legacy query planner and to the NGQP.  For further information on
  how the NGQP differs from the legacy query planner, see the 
  detailed description of the NGQP.






2. WHERE Clause Analysis


  The WHERE clause on a query is broken up into "terms" where each term
  is separated from the others by an AND operator.
  If the WHERE clause is composed of constraints separated by the OR
  operator then the entire clause is considered to be a single "term"
  to which the OR-clause optimization is applied.


  All terms of the WHERE clause are analyzed to see if they can be
  satisfied using indexes.
  To be usable by an index a term must usually be of one of the following
  forms:


  column = expression
  column IS expression
  column &gt; expression
  column &gt;= expression
  column &lt; expression
  column &lt;= expression
  expression = column
  expression &gt; column
  expression &gt;= column
  expression &lt; column
  expression &lt;= column
  column IN (expression-list)
  column IN (subquery)
  column IS NULL
  column LIKE pattern
  column GLOB pattern



  If an index is created using a statement like this:

CREATE INDEX idx_ex1 ON ex1(a,b,c,d,e,...,y,z);



  Then the index might be used if the initial columns of the index
  (columns a, b, and so forth) appear in WHERE clause terms.
  The initial columns of the index must be used with
  the = or IN or IS operators.  
  The right-most column that is used can employ inequalities.  
  For the right-most
  column of an index that is used, there can be up to two inequalities
  that must sandwich the allowed values of the column between two extremes.


  It is not necessary for every column of an index to appear in a
  WHERE clause term in order for that index to be used. 
  However, there cannot be gaps in the columns of the index that are used.
  Thus for the example index above, if there is no WHERE clause term
  that constrains column c, then terms that constrain columns a and b can
  be used with the index but not terms that constrain columns d through z.
  Similarly, index columns will not normally be used (for indexing purposes)
  if they are to the right of a 
  column that is constrained only by inequalities.
  (See the skip-scan optimization below for the exception.)


  In the case of indexes on expressions, whenever the word "column" is
  used in the foregoing text, one can substitute "indexed expression"
  (meaning a copy of the expression that appears in the CREATE INDEX
  statement) and everything will work the same.
  



2.1. Index Term Usage Examples

  For the index above and WHERE clause like this:

... WHERE a=5 AND b IN (1,2,3) AND c IS NULL AND d='hello'


  The first four columns a, b, c, and d of the index would be usable since
  those four columns form a prefix of the index and are all bound by
  equality constraints.


  For the index above and WHERE clause like this:

... WHERE a=5 AND b IN (1,2,3) AND c>12 A÷e module is very general. Each 
module-argument
may contain keywords, string literals, identifiers, numbers, and 
punctuation. Each module-argument is passed as 
written (as text) into the
constructor method of the virtual table implementation 
when the virtual 
table is created and that constructor is responsible for parsing and 
interpreting the arguments. The argument syntax is sufficiently general 
that a virtual table implementation can, if it wants to, interpret its
arguments as column definitions in an ordinary CREATE TABLE statement. 
The implementation could also impose some other interpretation on the 
arguments.

Once a virtual table has been created, it can be used like any other 
table with the exceptions noted above and imposed by specific virtual
table implementations. A virtual table is destroyed using the ordinary
DROP TABLE syntax.

1.1.1. Temporary virtual tables

There is no "CREATE TEMP VIRTUAL TABLE" statement.  To create a
temporary virtual table, add the "temp" schema
before the virtual table name.

CREATE VIRTUAL TABLE temp.tablename USING module(arg1, ...);




1.1.2. Eponymous virtual tables

Some virtual tables exist automatically in the "main" schema of
every database connection in which their
module is registered, even without a CREATE VIRTUAL TABLE statement.
Such virtual tables are called "eponymous virtual tables".
To use an eponymous virtual table, simply use the 
module name as if it were a table.
Eponymous virtual tables exist in the "main" schema only, so they will
not work if prefixed with a different schema name.

An example of an eponymous virtual table is the dbstat virtual table.
To use the dbstat virtual table as an eponymous virtual table, 
simply query against the "dbstat"
module name, as if it were an ordinary table.  (Note that SQLite
must be compiled with the SQLITE_ENABLE_DBSTAT_VTAB option to include
the dbstat virtual table in the build.)

SELECT * FROM dbstat;


A virtual table is eponymous if its xCreate method is the exact same
function as the xConnect method, or if the xCreate method is NULL.
The xCreate method is called when a virtual table is first created
using the CREATE VIRTUAL TABLE statement.  The xConnect method 
is invoked whenever
a database connection attaches to or reparses a schema. When these two methods
are the same, that indicates that the virtual table has no persistent
state that needs to be created and destroyed.



1.1.3. Eponymous-only virtual tables
If the xCreate method is NULL, then
CREATE VIRTUAL TABLE statements are prohibited for that virtual table,
and the virtual table is an "eponymous-only virtual table".
Eponymous-only virtual tables are useful as 
table-valued functions.


Note that prior to version 3.9.0 (2015-10-14), 
SQLite did not check the xCreate method
for NULL before invoking it.  So if an eponymous-only virtual table is
registered with SQLite version 3.8.11.1 (2015-07-29)
or earlier and a CREATE VIRTUAL TABLE
command is attempted against that virtual table module, a jump to a NULL
pointer will occur, resulting in a crash.

1.2. Implementation

Several new C-level objects are used by the virtual table implementation:

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;


The sqlite3_module structure defines a module object used to implement
a virtual table. Think of a module as a class from which one can 
construct multiple virtual tables having similar properties. For example,
one might have a module that provides read-only access to 
comma-separated-value (CSV) files on disk. That one module can then be
used to create several virtual tables where each virtual table refers
to a different CSV file.

The module structure contains methods that are invoked by SQLite to
perform various actions on the virtual table such as creating new
instances of a virtual table or destroying old ones, reading and
writing data, searching for and deleting, updating, or inserting rows. 
The module structure is explained in more detail below.

Each virtual table instance is represented by an sqlite3_vtab structure. 
The sqlite3_vtab structure looks like this:

struct sqlite3_vtab {
  const sqlite3_module *pModule;
  int nRef;
  char *zErrMsg;
};


Virtual table implementations will normally subclass this structure 
to add additional private and implementation-specific fields. 
The nRef field is used internally by the SQLite core and should not 
be altered by the virtual table implementation. The virtual table 
implementation may pass error message text to the core by putting 
an error message string in zErrMsg.
Space to hold this error message string must be obtained from an
SQLite memory allocation function such as sqlite3_mprintf() or
sqlite3_malloc().
Prior to assigning a new value to zErrMsg, the virtual table 
implementation must free any preexisting content of zErrMsg using 
sqlite3_free(). Failure to do this will result in a memory leak. 
The SQLite core will free and zero the content of zErrMsg when it 
delivers the error message text to the client application or when 
it destroys the virtual table. The virtual table implementation only 
needs to worry about freeing the zErrMsg content when it overwrites 
the content with a new, different error message.

The sqlite3_vtab_cursor structure represents a pointer to a specific
row of a virtual table. This is what an sqlite3_vtab_cursor looks like:

struct sqlite3_vtab_cursor {
  sqlite3_vtab *pVtab;
};


Once again, practical implementations will likely subclass this 
structure to add additional private fields.

The sqlite3_index_info structure is used to pass information into
and out of the xBestIndex method of the module that implements a 
virtual table.

Before a CREATE VIRTUAL TABLE statement can be run, the module 
specified in that statement must be registered with the database 
connection. This is accomplished using either of the sqlite3_create_module()
or sqlite3_create_module_v2() interfaces:

int sqlite3_create_module(
  sqlite3 *db,               /* SQLite connection to register module with */
  const char *zName,         /* Name of the module */
  const sqlite3_module *,    /* Methods for the module */
  void *                     /* Client data for xCreate/xConnect */
);
int sqlite3_create_module_v2(
  sqlite3 *db,               /* SQLite connection to register module with */
  const char *zName,         /* Name of the module */
  const sqlite3_module *,    /* Methods for the module */
  void *,                    /* Client data for xCreate/xConnect */
  void(*xDestroy)(void*)     /* Client data destructor function */
);


The sqlite3_create_module() and sqlite3_create_module_v2()
routines associates a module name with 
an sqlite3_module structure and a separate client data that is specific 
to each module.  The only difference between the two create_module methods
is that the _v2 method includes an extra parameter that specifies a
destructor for client data pointer.  The module structure is what defines
the behavior of a virtual table.  The module structure looks like this:


struct sqlite3_module {
  int iVersion;
  int (*xCreate)(sqlite3*, void *pAux,
               int argc, char *const*argv,
               sqlite3_vtab **ppVTab,
               char **pzErr);
  int (*xConnect)(sqlite3*, void *pAux,
               int argc, char *const*argv,
               sqlite3_vtab **ppVTab,
               char **pzErr);
  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*, sqlite_int64 *pRowid);
  int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite_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*);
};


The module structure defines all of the methods for each virtual 
table object. The module structure also contains the iVersion field which
defines the particular edition of the module table structure. Currently, 
iVersion is always 3 or less, but in future releases of SQLite the module
structure definition might be extended with additional methods and in 
that case the maximum iVersion value will be increased.

The rest of the module structure consists of methods used to implement
various features of the virtual table. Details on what each of these 
methods do are provided in the sequel.

1.3. Virtual Tables And Shared Cache

Prior to SQLite version 3.6.17 (2009-08-10), 
the virtual table mechanism assumes 
that each database connection kept
its own copy of the database schema. Hence, the virtual table mechanism
could not be used in a database that has shared cache mode enabled. 
The sqlite3_create_module() interface would return an error if 
shared cache mode is enabled.  That restriction was relaxed
beginning with SQLite version 3.6.17.



1.4. Creating New Virtual Table Implementations

Follow these steps to create your own virtual table:



 Write all necessary methods.
 Create an instance of the sqlite3_module structure containing pointers
     to all the methods from step 1.
 Register your sqlite3_module structure using one of the
     sqlite3_create_module() or sqlite3_create_module_v2() interfaces.
 Run a CREATE VIRTUAL TABLE command that specifies the new module in 
     the USING clause. 


The only really hard part is step 1. You might want to start with an 
existing virtual table implementation and modify it to suit your needs.
The SQLite source tree
contains many virtual table implementations that are suitable for copying,
including:



 templatevtab.c
&rarr; A virtual table created specifically to serve as a template for
other custom virtual tables.
 series.c
&rarr; Implementation of the generate_series() table-valued function.
 json.c &rarr;
Contains the sources for the json_each() and json_tree() table-valued
functions.
 csv.c &rarr;
A virtual table that reads CSV files.



There are many other virtual table implementations
in the SQLite source tree that can be used as examples.  Locate 
these other virtual table implementations by searching 
for "sqlite3_create_module".

You might also want to implement your new virtual table as a 
loadable extension.

2. Virtual Table Methods



2.1. The xCreate Method

int (*xCreate)(sqlite3 *db, void *pAux,
             int argc, char *const*argv,
             sqlite3_vtab **ppVTab,
             char **pzErr);


The xCreate method is called to create a new instance of a virtual table 
in response to a CREATE VIRTUAL TABLE statement.
If the xCreate method is the same pointer as the xConnect method, then the
virtual table is an eponymous virtual table.
If the xCreate method is omitted (if it is a NULL pointer) then the virtual 
table is an eponymous-only virtual table.


The db parameter is a pointer to the SQLite database connection that 
is executing the CREATE VIRTUAL TABLE statement. 
The pAux argument is the copy of the client data pointer that was the 
fourth argument to the sqlite3_create_module() or
sqlite3_create_module_v2() call that registered the 
virtual table module. 
The argv parameter is an array of argc pointers to null terminated strings. 
The first string, argv[0], is the name of the module being invoked.   The
module name is the name provided as the second argument to 
sqlite3_create_module() and as the argument to the USING clause of the
CREATE VIRTUAL TABLE statement that is running.
The second, argv[1], is the name of the database in which the new virtual 
table is being created. The database name is "main" for the primary database, or
"temp" for TEMP database, or the name given at the end of the ATTACH
statement for attached databases.  The third element of the array, argv[2], 
is the name of the new virtual table, as specified following the TABLE
keyword in the CREATE VIRTUAL TABLE statement.
If present, the fourth and subsequent strings in the argv[] array report 
the arguments to the module name in the CREATE VIRTUAL TABLE statement.

The job of this method is to construct the new virtual table object
(an sqlite3_vtab object) and return a pointer to it in *ppVTab.

As part of the task of creating a new sqlite3_vtab structure, this 
method must invoke sqlite3_declare_vtab() to tell the SQLite 
core about the columns and datatypes in the virtual table. 
The sqlite3_declare_vtab() API has the following prototype:

int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable)


The first argument to sqlite3_declare_vtab() must be the same 
database connection pointer as the first parameter to this method.
The second argument to sqlite3_declare_vtab() must a zero-terminated 
UTF-8 string that contains a well-formed CREATE TABLE statement that 
defines the columns in the virtual table and their data types. 
The name of the table in this CREATE TABLE statement is ignored, 
as are all constraints. Only the column names and datatypes matter.
The CREATE TABLE statement string need not to be 
held in persistent memory.  The string can be
deallocated and/or reused as soon as the sqlite3_declare_vtab()
routine returns.

The xConnect method can also optionally request special features
for the virtual table by making one or more calls to
the sqlite3_vtab_config() interface:

int sqlite3_vtab_config(sqlite3 *db, int op, ...);


Calls to sqlite3_vtab_config() are optional.  But for maximum
security, it is recommended that virtual table implementations
invoke "sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY)" if the
virtual table will not be used from inside of triggers or views.

The xCreate method need not initialize the pModule, nRef, and zErrMsg
fields of the sqlite3_vtab object.  The SQLite core will take care of 
that chore.

The xCreate should return SQLITE_OK if it is successful in 
creating the new virtual table, or SQLITE_ERROR if it is not successful.
If not successful, the sqlite3_vtab structure must not be allocated. 
An error message may optionally be returned in *pzErr if unsuccessful.
Space to hold the error message string must be allocated using
an SQLite memory allocation function like 
sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will
attempt to free the space using sqlite3_free() after the error has
been reported up to the application.


If the xCreate method is omitted (left as a NULL pointer) then the
virtual table is an eponymous-only virtual table.  New instances of
the virtual table cannot be created using CREATE VIRTUAL TABLE and the
virtual table can only be used via its module name.
Note that SQLite versions prior to 3.9.0 (2015-10-14) do not understand
eponymous-only virtual tables and will segfault if an attempt is made
to CREATE VIRTUAL TABLE on an eponymous-only virtual table because
the xCreate method was not checked for null.


If the xCreate method is the exact same pointer as the xConnect method,
that indicates that the virtual table does not need to initialize backing
store.  Such a virtual table can be used as an eponymous virtual table
or as a named virtual table using CREATE VIRTUAL TABLE or both.



2.1.1. Hidden columns in virtual tables
If a column datatype contains the special keyword "HIDDEN"
(in any combi        nation of upper and lower case letters) then that keyword
it is omitted from the column datatype name and the column is marked 
as a hidden column internally. 
A hidden column differs from a normal column in three respects:



 Hidden columns are not listed in the dataset returned by 
     "PRAGMA table_info",
 Hidden columns are not included in the expansion of a "*"
     expression in the result set of a SELECT, and
 Hidden columns are not included in the implicit column-list 
     used by an INSERT statement that lacks an explicit column-list. 


For example, if the following SQL is passed to sqlite3_declare_vtab():

CREATE TABLE x(a HIDDEN VARCHAR(12), b INTEGER, c INTEGER Hidden);


Then the virtual table would be created with two hidden columns,
and with datatypes of "VARCHAR(12)" and "INTEGER".

An example use of hidden columns can be seen in the FTS3 virtual 
table implementation, where every FTS virtual table
contains an FTS hidden column that is used to pass information from the
virtual table into FTS auxiliary functions and to the FTS MATCH operator.



2.1.2. Table-valued functions

A virtual table that contains hidden columns can be used like
a table-valued function in the FROM clause of a SELECT statement.
The arguments to the table-valued function become constraints on 
the HIDDEN columns of the virtual table.

For example, the "generate_series" extension (located in the
ext/misc/series.c
file in the source tree)
implements an eponymous virtual table with the following schema:

CREATE TABLE generate_series(
  value,
  start HIDDEN,
  stop HIDDEN,
  step HIDDEN
);


The sqlite3_module.xBestIndex method in the implementation of this
table checks for equality constraints against the HIDDEN columns, and uses
those as input parameters to determine the range of integer "value" outputs
to generate.  Reasonable defaults are used for any unconstrained columns.
For example, to list all integers between 5 and 50:

SELECT value FROM generate_series(5,50);


The previous query is equivalent to the following:

SELECT value FROM generate_series WHERE start=5 AND stop=50;


Arguments on the virtual table name are matched to hidden columns
in order.  The number of arguments can be less than the
number of hidden columns, in which case the latter hidden columns are
unconstrained.  However, an error results if there are more arguments
than there are hidden columns in the virtual table.



2.1.3.  WITHOUT ROWID Virtual Tables 

Beginning with SQLite version 3.14.0 (2016-08-08), 
the CREATE TABLE statement that
is passed into sqlite3_declare_vtab() may contain a WITHOUT ROWID clause.
This is useful for cases where the virtual table rows 
cannot easily be mapped into unique integers.  A CREATE TABLE
statement that includes WITHOUT ROWID must define one or more columns as
the PRIMARY KEY.  Every column of the PRIMARY KEY must individually be
NOT NULL and all columns for each row must be collectively unique.

Note that SQLite does not enforce the PRIMARY KEY for a WITHOUT ROWID
virtual table.  Enforcement is the responsibility of the underlying
virtual table implementation.  But SQLite does assume that the PRIMARY KEY
constraint is valid - that the identified columns really are UNIQUE and
NOT NULL - and it uses that assumption to optimize queries against the
virtual table.

The rowid column is not accessible on a
WITHOUT ROWID virtual table (of course).

The xUpdate method was originally designed around having a
ROWID as a single value.  The xUpdate method has been expanded to
accommodate an arbitrary PRIMARY KEY in place of the ROWID, but the
PRIMARY KEY must still be only one column.  For this reason, SQLite
will reject any WITHOUT ROWID virtual table that has more than one
PRIMARY KEY column and a non-NULL xUpdate method.



2.2. The xConnect Method

int (*xConnect)(sqlite3*, void *pAux,
             int argc, char *const*argv,
             sqlite3_vtab **ppVTab,
             char **pzErr);


The xConnect method is very similar to xCreate. 
It has the same parameters and constructs a new sqlite3_vtab structure 
just like xC
reate. 
And it must also call sqlite3_declare_vtab() like xCreate.  It
should also make all of the same sqlite3_vtab_config() calls as
xCreate.

The difference is that xConnect is called to establish a new 
connection to an existing virtual table whereas xCreate is called 
to create a new virtual table from scratch.

The xCreate and xConnect methods are only different when the
virtual table has some kind of backing store that must be initialized 
the first time the virtual table is created. The xCreate method creates 
and initializes the backing store. The xConnect method just connects 
to an existing backing store.  When xCreate and xConnect are the same,
the table is an eponymous virtual table.

As an example, consider a virtual table implementation that 
provides read-only access to existing comma-separated-value (CSV)
files on disk. There is no backing store that needs to be created 
or initialized for such a virtual table (since the CSV files already 
exist on disk) so the xCreate and xConnect methods will be identical 
for that module.

Another example is a virtual table that implements a full-text index. 
The xCreate method must create and initialize data structures to hold 
the dictionary and posting lists for that index. The xConnect method,
on the other hand, only has to locate and use an existing dictionary 
and posting lists that were created by a prior xCreate call.

The xConnect method must return SQLITE_OK if it is successful 
in creating the new virtual table, or SQLITE_ERROR if it is not 
successful. If not successful, the sqlite3_vtab structure must not be 
allocated. An error message may optionally be returned in *pzErr if 
unsuccessful. 
Space to hold the error message string must be allocated using
an SQLite memory allocation function like 
sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will
attempt to free the space using sqlite3_free() after the error has
been reported up to the application.

The xConnect method is required for every virtual table implementation, 
though the xCreate and xConnect pointers of the sqlite3_module object
may point to the same function if the virtual table does not need to
initialize backing store.



2.3. The xBestIndex Method

SQLite uses the xBestIndex method of a virtual table module to determine
the best way to access the virtual table. 
The xBestIndex method has a prototype like this:

int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*);


The SQLite core communicates with the xBestIndex method by filling 
in certain fields of the sqlite3_index_info structure and passing a 
pointer to that structure into xBestIndex as the second parameter. 
The xBestIndex method fills out other fields of this structure which
forms the reply. The sqlite3_index_info structure looks like this:

struct sqlite3_index_info {
  /* Inputs */
  const int nConstraint;     /* Number of entries in aConstraint */
  const 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 */
  } *const aConstraint;      /* Table of WHERE clause constraints */
  const int nOrderBy;        /* Number of terms in the ORDER BY clause */
  const struct sqlite3_index_orderby {
     int iColumn;              /* Column number */
     unsigned char desc;       /* True for DESC.  False for ASC. */
  } *const 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 */
  } *const 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 */
};


Note the warnings on the "estimatedRows", "idxFlags", and colUsed fields.
These fields were added with SQLite versions 3.8.2, 3.9.0, and 3.10.0, respectively. 
Any extension that reads or writes these fields must first check that the 
version of the SQLite library in use is greater than or equal to appropriate
version - perhaps comparing the value returned from sqlite3_libversion_number()
against constants 3008002, 3009000, and/or 3010000. The result of attempting 
to access these fields in an sqlite3_index_info structure created by an 
older version of SQLite are undefined.

In addition, there are some defined constants:

#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  /* 3.10.0 and later */
#define SQLITE_INDEX_CONSTRAINT_GLOB      66  /* 3.10.0 and later */
#define SQLITE_INDEX_CONSTRAINT_REGEXP    67  /* 3.10.0 and later */
#define SQLITE_INDEX_CONSTRAINT_NE        68  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_ISNOT     69  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_ISNULL    71  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_IS        72  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_LIMIT     73  /* 3.38.0 and later */
#define SQLITE_INDEX_CONSTRAINT_OFFSET    74  /* 3.38.0 and later */
#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150  /* 3.25.0 and later */
#define SQLITE_INDEX_SCAN_UNIQUE           1  /* Scan visits at most 1 row */


Use the sqlite3_vtab_collation() interface to find the name of
the collating sequence that should be used when evaluating the i-th
constraint:

const char *sqlite3_vtab_collation(sqlite3_index_info*, int i);


The SQLite core calls the xBestIndex method when it is compiling a query
that involves a virtual table. In other words, SQLite calls this method 
when it is running sqlite3_prepare() or the equivalent. 
By calling this method, the 
SQLite core is saying to the virtual table that it needs to access 
some subset of the rows in the virtual table and it wants to know the
most efficient way to do that access. The xBestIndex method replies 
with information that the SQLite core can then use to conduct an 
efficient search of the virtual table.

While compiling a single SQL query, the SQLite core might call 
xBestIndex multiple times with different settings in sqlite3_index_info.
The SQLite core will then select the combination that appears to 
give the best performance.

Before calling this method, the SQLite core initializes an instance 
of the sqlite3_index_info structure with information about the
query that it is currently trying to process. This information 
derives mainly from the WHERE clause and ORDER BY or GROUP BY clauses 
of the query, but also from any ON or USING clauses if the query is a 
join. The information that the SQLite core provides to the xBestIndex 
method is held in the part of the structure that is marked as "Inputs". 
The "Outputs" section is initialized to zero.

The information in the sqlite3_index_info structure is ephemeral
and may be overwritten or deallocated as soon as the xBestIndex method
returns.  If the xBestIndex method needs to remember any part of the
sqlite3_index_info structure, it should make a copy.  Care must be
take to store the copy in a place where it will be deallocated, such
as in the idxStr field with needToFreeIdxStr set to 1.

Note that xBestIndex will always be called before xFilter, since
the idxNum and idxStr outputs from xBestIndex are required inputs to
xFilter.  However, there is no guarantee that xFilter will be called
following a successful xBestIndex.

The xBestIndex method is required for every virtual table implementation.

2.3.1. Inputs

The main thing that the SQLite core is trying to communicate to 
the virtual table is the constraints that are available to limit 
the number of rows that need to be searched. The aConstraint[] array 
contains one entry for each constraint. There will be exactly 
nConstraint entries in that array.

Each constraint will usually correspond to a term in the WHERE clause
or in a USING or ON clause that is of the form


     column  OP  EXPR


Where "column" is a column in the virtual table, OP is an operator 
like "=" or "&lt;", and EXPR is an arbitrary expression. So, for example,
if the WHERE clause contained a term like this:

a = 5


Then one of the constraints would be on the "a" column with 
operator "=" and an expression of "5". Constraints need not have a
literal representation of the WHERE clause. The query optimizer might
make transformations to the 
WHERE clause in order to extract as many constraints 
as it can. So, for example, if the WHERE clause contained something 
like this:

x BETWEEN 10 AND 100 AND 999&gt;y


The query optimizer might translate this into three separate constraints:

x &gt;= 10
x &lt;= 100
y &lt; 999


For each such constraint, the aConstraint[].iColumn field indicates which 
column appears on the left-hand side of the constraint.
The first column of the virtual table is column 0. 
The rowid of the virtual table is column -1. 
The aConstraint[].op field indicates which operator is used. 
The SQLITE_INDEX_CONSTRAINT_* constants map integer constants 
into operator values.
Columns occur in the order they were defined by the call to
sqlite3_declare_vtab() in the xCreate or xConnect method.
Hidden columns are counted when determining the column index.

If the xFindFunction() method for the virtual table is defined, and 
if xFindFunction() sometimes returns SQLITE_INDEX_CONSTRAINT_FUNCTION or
larger, then the constraints might also be of the form:


     FUNCTION( column, EXPR)


In this case the aConstraint[].op value is the same as the value
returned by xFindFunction() for FUNCTION.

The aConstraint[] array contains information about all constraints 
that apply to the virtual table. But some of the constraints might
not be usable because of the way tables are ordered in a join. 
The xBestIndex method must therefore only consider constraints 
that have an aConstraint[].usable flag which is true.

In addition to WHERE clause constraints, the SQLite core also 
tells the xBestIndex method about the ORDER BY clause. 
(In an aggregate query, the SQLite core might put in GROUP BY clause 
information in place of the ORDER BY clause information, but this fact
should not make any difference to the xBestIndex method.) 
If all terms of the ORDER BY clause are columns in the virtual table, 
then nOrderBy will be the number of terms in the ORDER BY clause 
and the aOrderBy[] array will identify the column for each term 
in the order by clause and whether or not that column is ASC or DESC.



In SQLite version 3.10.0 (2016-01-06) and later, 
the colUsed field is available
to indicate which fields of the virtual table are actually used by the
statement being prepared.  If the lowest bit of colUsed is set, that
means that the first column is used.  The second lowest bit corresponds
to the second column.  And so forth.  If the most significant bit of
colUsed is set, that means that one or more columns other than the 
first 63 columns are used.  If column usage information is needed by the
xFilter method, then the required bits must be encoded into either
the output idxNum field or idxStr content.

2.3.1.1. LIKE, GLOB, REGEXP, and MATCH functions

For the LIKE, GLOB, REGEXP, and MATCH operators, the 
a
Constraint[].iColumn value is the virtual table column that
is the left operand of the operator.  However, if these operators
are expressed as function calls instead of operators, then
the aConstraint[].iColumn value references the virtual table
column that is the second argument to that function:


LIKE(EXPR, column)
GLOB(EXPR, column)
REGEXP(EXPR, column)
MATCH(EXPR, column)


Hence, as far as the xBestIndex() method is concerned, the following
two forms are equivalent:


column LIKE EXPR
LIKE(EXPR,column)


This special behavior of looking at the second argument of a function
only occurs for the LIKE, GLOB, REGEXP, and MATCH functions.  For all
other functions, the aConstraint[].iColumn value references the first
argument of the function.

This special feature of LIKE, GLOB, REGEXP, and MATCH does not
apply to the xFindFunction() method, however.  The
xFindFunction() method always keys off of the left operand of an
LIKE, GLOB, REGEXP, or MATCH operator but off of the first argument
to function-call equivalents of those operators.

2.3.1.2. LIMIT and OFFSET

When aConstraint[].op is one of SQLITE_INDEX_CONSTRAINT_LIMIT or
SQLITE_INDEX_CONSTRAINT_OFFSET, that indicates that there is a
LIMIT or OFFSET clause on the SQL query statement that is using
the virtual table.  The LIMIT and OFFSET operators have no
left operand, and so when aConstraint[].op is one of
SQLITE_INDEX_CONSTRAINT_LIMIT or SQLITE_INDEX_CONSTRAINT_OFFSET
then the aConstraint[].iColumn value is meaningless and should
not be used.

2.3.1.3. Right-hand side values of constraints

The sqlite3_vtab_rhs_value() interface can be used to try to
access the right-hand operand of a constraint.  However, the value
of a right-hand operator might not be known at the time that
the xBestIndex method is run, so the sqlite3_vtab_rhs_value()
call might not be successful.  Usually the right operand of a
constraint is only available to xBestIndex if it is coded as
a literal value in the input SQL.  If the right operand is
coded as an expression or a host parameter, it probably will
not be accessible to xBestIndex.  Some operators, such as
SQLITE_INDEX_CONSTRAINT_ISNULL and
SQLITE_INDEX_CONSTRAINT_ISNOTNULL have no right-hand operand.
The sqlite3_vtab_rhs_value() interface always returns
SQLITE_NOTFOUND for such operators.

2.3.2. Outputs

Given all of the information above, the job of the xBestIndex 
method it to figure out the best way to search the virtual table.

The xBestIndex method conveys an indexing strategy to the xFilter 
method through the idxNum and idxStr fields. The idxNum value and 
idxStr string content are arbitrary as far as the SQLite core is 
concerned and can have any meaning as long as xBestIndex and xFilter 
agree on what that meaning is. The SQLite core just copies the 
information from xBestIndex through to the xFilter method, assuming 
only that the char sequence referenced via idxStr is NUL terminated.

The idxStr value may be a string obtained from an SQLite
memory allocation function such as sqlite3_mprintf(). 
If this is the case, then the needToFreeIdxStr flag must be set to 
true so that the SQLite core will know to call sqlite3_free() on 
that string when it has finished with it, and thus avoid a memory leak.
The idxStr value may also be a static constant string, in which case
the needToFreeIdxStr boolean should remain false.


The estimatedCost field should be set to the estimated number
of disk access operations required to execute this query against 
the virtual table. The SQLite core will often call xBestIndex 
multiple times with different constraints, obtain multiple cost
estimates, then choose the query plan that gives the lowest estimate.
The SQLite core initializes estimatedCost to a very large value
prior to invoking xBestIndex, so if xBestIndex determines that the
current combination of parameters is undesirable, it can leave the
estimatedCost field unchanged to discourage its use.

If the current version of SQLite is 3.8.2 or greater, the estimatedRows
field may be set to an estimate of the number of rows returned by the
proposed query plan. If this value is not explicitly set, the default 
estimate of 25 rows is used.

If the current version of SQLite is 3.9.0 or greater, the idxFlags field
may be set to SQLITE_INDEX_SCAN_UNIQUE to indicate that the virtual table
will return only zero or one rows given the input constraints.  Additional
bits of the idxFlags field might be understood in later versions of SQLite.

The aConstraintUsage[] array contains one element for each of 
the nConstraint constraints in the inputs section of the 
sqlite3_index_info structure. 
The aConstraintUsage[] array is used by xBestIndex to tell the 
core how it is using the constraints.

The xBestIndex method may set aConstraintUsage[].argvIndex 
entries to values greater than zero. 
Exactly one entry should be set to 1, another to 2, another to 3, 
and so forth up to as many or as few as the xBestIndex method wants. 
The EXPR of the corresponding constraints will then be passed 
in as the argv[] parameters to xFilter.

For example, if the aConstraint[3].argvIndex is set to 1, then 
when xFilter is called, the argv[0] passed to xFilter will have 
the EXPR value of the aConstraint[3] constraint.

2.3.2.1. Omit constraint checking in bytecode

By default, the SQLite generates bytecode that will double
checks all constraints on each row of the virtual table to verify
that they are satisfied.  If the virtual table can guarantee
that a constraint will always be satisfied, it can try to
suppress that double-check by setting aConstraintUsage[].omit.
However, with some exceptions, this is only a hint and
there is no guarantee that the redundant check of the constraint
will be suppressed.  Key points:



The omit flag is only honored if the argvIndex value for the
constraint is greater than 0 and less than or equal to 16.  
Constraint checking is never suppressed for constraints
that do not pass their right operand into the xFilter method.
The current implementation is only able to suppress redundant
constraint checking for the first 16 values passed to xFilter,
though that limitation might be increased in future releases.


The omit flag is always honored for SQLITE_INDEX_CONSTRAINT_OFFSET
constraints as long as argvIndex is greater than 0.  Setting the
omit flag on an SQLITE_INDEX_CONSTRAINT_OFFSET constraint indicates
to SQLite that the virtual table will itself suppress the first N
rows of output, where N is the right operand of the OFFSET operator.
If the virtual table implementation sets omit on an
SQLITE_INDEX_CONSTRAINT_OFFSET constraint but then fails to suppress
the first N rows of output, an incorrect answer will result from
the overall query.




2.3.2.2. ORDER BY and orderByConsumed

If the virtual table will output rows in the order specified by 
the ORDER BY clause, then the orderByConsumed flag may be set to 
true. If the output is not automatically in the correct order 
then orderByConsumed must be left in its default false setting. 
This will indicate to the SQLite core that it will need to do a 
separate sorting pass over the data after it comes out of the virtual table.
Setting orderByConsumed is an optimization.  A query will always
get the correct answer if orderByConsumed is left at its default
value (0).  Unnecessary sort operations might be avoided resulting
in a faster query if orderByConsumed is set, but setting
orderByConsumed incorrectly can result in an incorrect answer.
It is suggested that new virtual table implementations leave
the orderByConsumed value unset initially, and then after everything
else is known to be working correctly, go back and attempt to
optimize by setting orderByConsumed where appropriate.

Sometimes the orderByConsumed flag can be safely set even if
the outputs from the virtual table are not strictly in the order
specified by nOrderBy and aOrderBy.  If the
sqlite3_vtab_distinct() interface returns 1 or 2, that indicates
that the ordering can be relaxed.  See the documentation on
sqlite3_vtab_distinct() for further information.


2.3.3. Return Value

The xBestIndex method should return SQLITE_OK on success.  If any
kind of fatal error occurs, an appropriate error code (ex: SQLITE_NOMEM)
should be returned instead.

If xBestIndex returns SQLITE_CONSTRAINT, that does not indicate an
error.  Rather, SQLITE_CONSTRAINT indicates that the particular combination
of input parameters specified is insufficient for the virtual table
to do its job.
This is logically the same as setting the estimatedCost to infinity.
If every call to xBestIndex for a particular query plan returns
SQLITE_CONSTRAINT, that means there is no way for the virtual table
to be safely used, and the sqlite3_prepare() call will fail with
a "no query solution" error.

2.3.4. Enforcing Required Parameters On Table-Valued Functions

The SQLITE_CONSTRAINT return from xBestIndex
is useful for table-valued functions that
have required parameters.  If the aConstraint[].usable field is false
for one of the required parameter, then the xBestIndex method should
return SQLITE_CONSTRAINT.  If a required field does not appear in
the aConstraint[] array at all, that means that the corresponding
parameter is omitted from the input SQL.  In that case, xBestIndex
should set an error message in pVTab-&gt;zErrMsg and return
SQLITE_ERROR.  To summarize:



The aConstraint[].usable value for a required parameter is
false &rarr; return SQLITE_CONSTRAINT.

A required parameter does not appears anywhere in
the aConstraint[] array &rarr;
Set an error message in pVTab-&gt;zErrMsg and return
SQLITE_ERROR


The following example will better illustrate the use of SQLITE_CONSTRAINT
as a return value from xBestIndex:

SELECT * FROM realtab, tablevaluedfunc(realtab.x);


Assuming that the first hidden column of "tablevaluedfunc" is "param1",
the query above is semantically equivalent to this:

SELECT * FROM realtab, tablevaluedfunc
 WHERE tablevaluedfunc.param1 = realtab.x;


The query planner must decide between many possible implementations
of this query, but two plans in particular are of note:


Scan all
rows of realtab and for each row, find rows in tablevaluedfunc where
param1 is equal to realtab.x

Scan all rows of tablevalued func and for each row find rows
in realtab where x is equal to tablevaluedfunc.param1.


The xBestIndex method will be invoked once for each of the potential
plans above.  For plan 1, the aConstraint[].usable flag for the
SQLITE_CONSTRAINT_EQ constraint on the param1 column will be true because
the right-hand side value for the "param1 = ?" constraint will be known,
since it is determined by the outer realtab loop.
But for plan 2, the aConstraint[].usable flag for "param1 = ?" will be false
because the right-hand side value is determined by an inner loop and is thus
an unknown quantity.  Because param1 is a required input to the table-valued
functions, the xBestIndex method should return SQLITE_CONSTRAINT when presented 
with plan 2, indicating that a required input is missing.  This forces the
query planner to select plan 1.



2.4. The xDisconnect Method

int (*xDisconnect)(sqlite3_vtab *pVTab);


This method releases a connection to a virtual table. 
Only the sqlite3_vtab object is destroyed.
The virtual table is not destroyed and any backing store 
associated with the virtual table persists. 

This method undoes the work of xConnect.

This method is a destructor for a connection to the virtual table.
Contrast this method with xDestroy.  The xDestroy is a destructor
for the entire virtual table.

The xDisconnect method is required for every virtual table implementation,
though it is acceptable for the xDisconnect and xDestroy methods to be
the same function if that makes sense for the particular virtual table.



2.5. The xDestroy Method

int (*xDestroy)(sqlite3_vtab *pVTab);


This method releases a connection to a virtual table, just like 
the xDisconnect method, and it also destroys the underlying 
table implementation. This method undoes the work of xCreate.

The xDisconnect method is called whenever a database connection
that uses a virtual table is closed. The xDestroy method is only 
called when a DROP TABLE statement is executed against the virtual table.

The xDestroy method is required for every virtual table implementation,
though it is acceptable for the xDisconnect and xDestroy methods to be
the same function if that makes sense for the particular virtual table.



2.6. The xOpen Method

int (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor);


The xOpen method creates a new cursor used for accessing (read and/or
writing) a virtual table.  A successful invocation of this method 
will allocate the memory for the sqlite3_vtab_cursor (or a subclass),
initialize the new object, and make *ppCursor point to the new object.
The successful call then returns SQLITE_OK.

For every successful call to this method, the SQLite core will
later invoke the xClose method to destroy 
the allocated cursor.

The xOpen method need not initialize the pVtab field of the
sqlite3_vtab_cursor structure.  The SQLite core will take care
of that chore automatically.

A virtual table implementation must be able to support an arbitrary
number of simultaneously open cursors.

When initially opened, the cursor is in an undefined state.
The SQLite core will invoke the xFilter method
on the cursor prior to any attempt to position or read from the cursor.

The xOpen method is required for every virtual table implementation.



2.7. The xClose Method

int (*xClose)(sqlite3_vtab_cursor*);


The xClose method closes a cursor previously opened by 
xOpen. 
The SQLite core will always call xClose once for each cursor opened 
using xOpen.

This method must release all resources allocated by the
corresponding xOpen call. The routine will not be called again even if it
returns an error.  The SQLite core will not use the
sqlite3_vtab_cursor again after it has been closed.

The xClose method is required for every virtual table implementation.



2.8. The xEof Method

int (*xEof)(sqlite3_vtab_cursor*);


The xEof method must return false (zero) if the specified cursor 
currently points to a valid row of data, or true (non-zero) otherwise. 
This method is called by the SQL engine immediately after each 
xFilter and xNext invocation.

The xEof method is required for every virtual table implementation.



2.9. The xFilter Method

int (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr,
              int argc, sqlite3_value **argv);


This method begins a search of a virtual table. 
The first argument is a cursor opened by xOpen. 
The next two arguments define a particular search index previously 
chosen by xBestIndex. The specific meanings of idxNum and idxStr 
are unimportant as long as xFilter and xBestIndex agree on what 
that meaning is.

The xBestIndex function may have requested the values of 
certain expressions using the aConstraintUsage[].argvIndex values 
of the sqlite3_index_info structure. 
Those values are passed to xFilter using the argc and argv parameters.

If the virtual table contains one or more rows that match the
search criteria, then the cursor must be left point at the first row.
Subsequent calls to xEof must return false (zero).
If there are no rows match, then the cursor must be left in a state 
that will cause the xEof to return true (non-zero).
The SQLite engine will use
the xColumn and xRowid methods to access that row content.
The xNext method will be used to advance to the next row.

This method must return SQLITE_OK if successful, or an sqlite 
error code if an error occurs.

The xFilter method is required for every virtual table implementation.



2.10. The xNext Method

int (*xNext)(sqlite3_vtab_cursor*);


The xNext method advances a virtual table cursor
to the next row of a result set initiated by xFilter. 
If the cursor is already pointing at the last row when this 
routine is called, then the cursor no longer points to valid 
data and a subsequent call to the xEof method must return true (non-zero). 
If the cursor is successfully advanced to another row of content, then
subsequent calls to xEof must return false (zero).

This method must return SQLITE_OK if successful, or an sqlite 
error code if an error occurs.

The xNext method is required for every virtual table implementation.



2.11. The xColumn Method

int (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int N);


The SQLite core invokes this method in order to find the value for 
the N-th column of the current row. N is zero-based so the first column 
is numbered 0. 
The xColumn method may return its result back to SQLite using one of the
following interface:



 sqlite3_result_blob()
 sqlite3_result_double()
 sqlite3_result_int()
 sqlite3_result_int64()
 sqlite3_result_null()
 sqlite3_result_text()
 sqlite3_result_text16()
 sqlite3_result_text16le()
 sqlite3_result_text16be()
 sqlite3_result_zeroblob()



If the xColumn method implementation calls none of the functions above,
then the value of the column defaults to an SQL NULL.

To raise an error, the xColumn method should use one of the result_text() 
methods to set the error message text, then return an appropriate
error code.  The xColumn method must return SQLITE_OK on success.

The xColumn method is required for every virtual table implementation.



2.12. The xRowid Method

int (*xRowid)(sqlite3_vtab_cursor *pCur, sqlite_int64 *pRowid);


A successful invocation of this method will cause *pRowid to be
filled with the rowid of row that the
virtual table cursor pCur is currently pointing at.
This method returns SQLITE_OK on success.
It returns an appropriate error code on failure.

The xRowid method is required for every virtual table implementation.



2.13. The xUpdate Method

int (*xUpdate)(
  sqlite3_vtab *pVTab,
  int argc,
  sqlite3_value **argv,
  sqlite_int64 *pRowid
);


All changes to a virtual table are made using the xUpdate method.
This one method can be used to insert, delete, or update.

The argc parameter specifies the number of entries in the argv array. 
The value of argc will be 1 for a pure delete operation or N+2 for an insert
or replace or update where N is the number of columns in the table.  
In the previous sentence, N includes any hidden columns.

Every argv entry will have a non-NULL value in C but may contain the 
SQL value NULL.  In other words, it is always true that
argv&#91;i&#93;!=0 for i between 0 and argc-1.
However, it might be the case that
sqlite3_value_type(argv&#91;i&#93;)==SQLITE_NULL.

The argv[0] parameter is the rowid of a row in the virtual table 
to be deleted. If argv[0] is an SQL NULL, then no deletion occurs.

The argv[1] parameter is the rowid of a new row to be inserted 
into the virtual table. If argv[1] is an SQL NULL, then the implementation 
must choose a rowid for the newly inserted row. Subsequent argv[] 
entries contain values of the columns of the virtual table, in the 
order that the columns were declared. The number of columns will
match the table declaration that the xConnect or xCreate method made 
using the sqlite3_declare_vtab() call.  All hidden columns are included.

When doing an insert without a rowid (argc>1, argv[1] is an SQL NULL),
on a virtual table that uses ROWID (but not on a WITHOUT ROWID virtual table),
the implementation must set *pRowid to the rowid of the newly inserted row; 
this will become the value returned by the sqlite3_last_insert_rowid()
function. Setting this value in all the other cases is a harmless no-op;
the SQLite engine ignores the *pRowid return value if argc==1 or 
argv[1] is not an SQL NULL.

Each call to xUpdate will fall into one of cases shown below.
Not that references to argv&#91;i&#93; mean the SQL value
held within the argv&#91;i&#93; object, not the argv&#91;i&#93;
object itself.



argc = 1  argv[0] &ne; NULL

DELETE: The single row with rowid or PRIMARY KEY equal to argv[0] is deleted. 
No insert occurs.

argc &gt; 1  argv[0] = NULL

INSERT: A new row is inserted with column values taken from
argv[2] and following.  In a rowid virtual table, if argv[1] is an SQL NULL,
then a new unique rowid is generated automatically.  The argv[1] will be NULL
for a WITHOUT ROWID virtual table, in which case the implementation should
take the PRIMARY KEY value from the appropriate column in argv[2] and following.

argc &gt; 1  argv[0] &ne; NULL  argv[0] = argv[1]

UPDATE:
The row with rowid or PRIMARY KEY argv[0] is updated with new values 
in argv[2] and following parameters.

argc &gt; 1  argv[0] &ne; NULL  argv[0] &ne; argv[1]

UPDATE with rowid or PRIMARY KEY change:
The row with rowid or PRIMARY KEY argv[0] is updated with 
the rowid or PRIMARY KEY in argv[1] 
and new values in argv[2] and following parameters. This will occur 
when an SQL statement updates a rowid, as in the statement:

   UPDATE table SET rowid=rowid+1 WHERE ...; 




The xUpdate method must return SQLITE_OK if and only if it is
successful.  If a failure occurs, the xUpdate must return an appropriate
error code.  On a failure, the pVTab->zErrMsg element may optionally
be replaced with error message text stored in memory allocated from SQLite 
using functions such as sqlite3_mprintf() or sqlite3_malloc().

If the xUpdate method violates some constraint of the virtual table
(including, but not limited to, attempting to store a value of the wrong 
datatype, attempting to store a value that is too
large or too small, or attempting to change a read-only value) then the
xUpdate must fail with an appropriate error code.

If the xUpdate method is performing an UPDATE, then
sqlite3_value_nochange(X) can be used to discover which columns
of the virtual table were actually modified by the UPDATE
statement.  The sqlite3_value_nochange(X) interface returns
true for columns that do not change.
On every UPDATE, SQLite will first invoke
xColumn separately for each unchanging column in the table to 
obtain the value for that column.  The xColumn method can
check to see if the column is unchanged at the SQL level
by invoking sqlite3_vtab_nochange().  If xColumn sees that
the column is not being modified, it should return without setting 
a result using one of the sqlite3_result_xxxxx()
interfaces.  Only in that case sqlite3_value_nochange() will be
true within the xUpdate method.  If xColumn does
invoke one or more sqlite3_result_xxxxx()
interfaces, then SQLite understands that as a change in the value
of the column and the sqlite3_value_nochange() call for that
column within xUpdate will return false.

There might be one or more sqlite3_vtab_cursor objects open and in use 
on the virtual table instance and perhaps even on the row of the virtual
table when the xUpdate method is invoked.  The implementation of
xUpdate must be prepared for attempts to delete or modify rows of the table
out from other existing cursors.  If the virtual table cannot accommodate
such changes, the xUpdate method must return an error code.

The xUpdate method is optional.
If the xUpdate pointer in the sqlite3_module for a virtual table
is a NULL pointer, then the virtual table is read-only.




2.14. The xFindFunction Method

int (*xFindFunction)(
  sqlite3_vtab *pVtab,
  int nArg,
  const char *zName,
  void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
  void **ppArg
);


This method is called during sqlite3_prepare() to give the virtual
table implementation an opportunity to overload functions. 
This method may be set to NULL in which case no overloading occurs.

When a function uses a column from a virtual table as its first 
argument, this method is called to see if the virtual table would 
like to overload the function. The first three parameters are inputs: 
the virtual table, the number of arguments to the function, and the 
name of the function. If no overloading is desired, this method
returns 0. To overload the function, this method writes the new 
function implementation into *pxFunc and writes user data into *ppArg 
and returns either 1 or a number between
SQLITE_INDEX_CONSTRAINT_FUNCTION and 255.

Historically, the return value from xFindFunction() was either zero
or one.  Zero means that the function is not overloaded and one means that
it is overload.  The ability to return values of 
SQLITE_INDEX_CONSTRAINT_FUNCTION or greater was added in
version 3.25.0 (2018-09-15).  If xFindFunction returns
SQLITE_INDEX_CONSTRAINT_FUNCTION or greater, than means that the function
takes two arguments and the function
can be used as a boolean in the WHERE clause of a query and that
the virtual table is able to exploit that function to speed up the query
result.  When xFindFunction returns SQLITE_INDEX_CONSTRAINT_FUNCTION or 
larger, the value returned becomes the sqlite3_index_info.aConstraint.op
value for one of the constraints passed into xBestIndex().  The first
argument to the function is the column identified by 
aConstraint[].iColumn field of the constraint and the second argument to the
function is the value that will be passed into xFilter() (if the
aConstraintUsage[].argvIndex value is set) or the value returned from
sqlite3_vtab_rhs_value().

The Geopoly module is an example of a virtual table that makes use
of SQLITE_INDEX_CONSTRAINT_FUNCTION to improve performance.
The xFindFunction() method for Geopoly returns
SQLITE_INDEX_CONSTRAINT_FUNCTION for the geopoly_overlap() SQL function
and it returns
SQLITE_INDEX_CONSTRAINT_FUNCTION+1 for the geopoly_within() SQL function.
This permits search optimizations for queries such as:

SELECT * FROM geopolytab WHERE geopoly_overlap(_shape, $query_polygon);
SELECT * FROM geopolytab WHERE geopoly_within(_shape, $query_polygon);


Note that infix functions (LIKE, GLOB, REGEXP, and MATCH) reverse 
the order of their arguments. So "like(A,B)" would normally work the same
as "B like A".
However, xFindFunction() always looks a the left-most argument, not
the first logical argument.
Hence, for the form "B like A", SQLite looks at the
left operand "B" and if that operand is a virtual table column
it invokes the xFindFunction() method on that virtual table.
But if the form "like(A,B)" is used instead, then SQLite checks
the A term to see if it is column of a virtual table and if so
it invokes the xFindFunction() method for the virtual table of
column A. 

The function pointer returned by this routine must be valid for
the lifetime of the sqlite3_vtab object given in the first parameter.



2.15. The xBegin Method

int (*xBegin)(sqlite3_vtab *pVTab);


This method begins a transaction on a virtual table.
This is method is optional.  The xBegin pointer of sqlite3_module
may be NULL.

This method is always followed by one call to either the
xCommit or xRollback method.  Virtual table transactions do
not nest, so the xBegin method will not be invoked more than once
on a single virtual table
without an intervening call to either xCommit or xRollback.
Multiple calls to other methods can and likely will occur in between
the xBegin and the corresponding xCommit or xRollback.



2.16. The xSync Method

int (*xSync)(sqlite3_vtab *pVTab);



This method signals the start of a two-phase commit on a virtual
table.
This is method is optional.  The xSync pointer of sqlite3_module
may be NULL.

This method is only invoked after call to the xBegin method and
prior to an xCommit or xRollback.  In order to implement two-phase
commit, the xSync method on all virtual tables is invoked prior to
invoking the xCommit method on any virtual table.  If any of the 
xSync methods fail, the entire transaction is rolled back.



2.17. The xCommit Method

int (*xCommit)(sqlite3_vtab *pVTab);


This method causes a virtual table transaction to commit.
This is method is optional.  The xCommit pointer of sqlite3_module
may be NULL.

A call to this method always follows a prior call to xBegin and
xSync.




2.18. The xRollback Method

int (*xRollback)(sqlite3_vtab *pVTab);


This method causes a virtual table transaction to rollback.
This is method is optional.  The xRollback pointer of sqlite3_module
may be NULL.

A call to this method always follows a prior call to xBegin.




2.19. The xRename Method

int (*xRename)(sqlite3_vtab *pVtab, const char *zNew);


This method provides notification that the virtual table implementation
that the virtual table will be given a new name. 
If this method returns SQLITE_OK then SQLite renames the table.
If this method returns an error code then the renaming is prevented.

The xRename method is optional.  If omitted, then the virtual
table may not be renamed using the ALTER TABLE RENAME command.

The PRAGMA legacy_alter_table setting is enabled prior to invoking this
method, and the value for legacy_alter_table is restored after this
method finishes.  This is necessary for the correct operation of virtual
tables that make use of shadow tables where the shadow tables must be
renamed to match the new virtual table name.  If the legacy_alter_format is
off, then the xConnect method will be invoked for the virtual table every
time the xRename method tries to change the name of the shadow table.



2.20. The xSavepoint, xRelease, and xRollbackTo Methods

int (*xSavepoint)(sqlite3_vtab *pVtab, int);
int (*xRelease)(sqlite3_vtab *pVtab, int);
int (*xRollbackTo)(sqlite3_vtab *pVtab, int);



These methods provide the virtual table implementation an opportunity to
implement nested transactions.  They are always optional and will only be
called in SQLite version 3.7.7 (2011-06-23) and later.



When xSavepoint(X,N) is invoked, that is a signal to the virtual table X
that it should save its current state as savepoint N.  
A subsequent call
to xRollbackTo(X,R) means that the state of the virtual table should return
to what it was when xSavepoint(X,R) was last called.  
The call
to xRollbackTo(X,R) will invalidate all savepoints with N>R; none of the
invalided savepoints will be rolled back or released without first
being reinitialized by a call to xSavepoint().  
A call to xRelease(X,M) invalidates all savepoints where N>=M.



None of the xSavepoint(), xRelease(), or xRollbackTo() methods will ever
be called except in between calls to xBegin() and 
either xCommit() or xRollback().




2.21. The xShadowName Method

Some virtual table implementations (ex: FTS3, FTS5, and RTREE) make
use of real (non-virtual) database tables to store content.  For example,
when content is inserted into the FTS3 virtual table, the data is ultimately
stored in real tables named "%_content", "%_segdir", "%_segments", "%_stat",
and "%_docsize" where "%" is the name of the original virtual table.  This
auxiliary real tables that store content for a virtual table are called
"shadow tables".  See
(1),
(2), and
(3) for additional information.

The xShadowName method exists to allow SQLite to determine whether a
certain real table is in fact a shadow table for a virtual table.

SQLite understands a real table to be a shadow table if all of
the following are true:


 The name of the table contains one or more "_" characters.
 The part of the name prior to the last "_" exactly matches
     the name of a virtual table that was created using CREATE VIRTUAL TABLE.
     (Shadow tables are not recognized for eponymous virtual tables
     and table-valued functions.)
 The virtual table contains an xShadowName method.
 The xShadowName method returns true when its input is the part
     of the table name past the last "_" character.



If SQLite recognizes a table as a shadow table, and if the
SQLITE_DBCONFIG_DEFENSIVE flag is set, then the shadow table is read-only
for ordinary SQL statements.  The shadow table can still be written, but
only by SQL that is invoked from within one of the methods of
some virtual table implementation.


The whole point of the xShadowName method is to protect the content of
shadow tables from being corrupted by hostile SQL.  Every virtual table
implementation that uses shadow tables should be able to detect and cope
with corrupted shadow table content.  However, bugs in particular virtual 
table implementation might allow a deliberately corrupted shadow table to
cause a crash or other malfunction.  The xShadowName mechanism seeks to 
avoid zero-day exploits by preventing ordinary SQL statements from
deliberately corrupting shadow tables.


Shadow tables are read/write by default.
Shadow tables only become read-only when the SQLITE_DBCONFIG_DEFENSIVE
flag is set using sqlite3_db_config().
Shadow tables need to be read/write by default in order to maintain
backwards compatibility.
For example, the SQL text generated by the .dump command of the CLI
writes directly into shadow tables.
This page last modified on  2022-12-05 12:38:46 UTCvtab.html
]]„”Z‚h
Wˆ¨QThe Virtual Table Mechanism Of SQLite1. Introduction

A virtual table is an object that is registered with an open SQLite
database connection. From the perspective of an SQL statement,
the virtual table object looks like any other table or view. 
But behind the scenes, queries and updates on a virtual table
invoke callback methods of the virtual table object instead of
reading and writing on the database file.

The virtual table mechanism allows an application to publish
interfaces that are accessible from SQL statements as if they were
tables. SQL statements can do almost anything to a
virtual table that they can do to a real table, with the following
exceptions:



 One cannot create a trigger on a virtual table.
 One cannot create additional indices on a virtual table. 
     (Virtual tables can have indices but that must be built into
     the virtual table implementation.  Indices cannot be added
     separately using CREATE INDEX statements.)
 One cannot run ALTER TABLE ... ADD COLUMN
     commands against a virtual table.


Individual virtual table implementations might impose additional
constraints. For example, some virtual implementations might provide
read-only tables. Or some virtual table implementations might allow
INSERT or DELETE but not UPDATE.  Or some virtual table implementations
might limit the kinds of UPDATEs that can be made.

A virtual table might represent an in-memory data structures. 
Or it might represent a view of data on disk that is not in the
SQLite format. Or the application might compute the content of the 
virtual table on demand.

Here are some existing and postulated uses for virtual tables:


 A full-text search interface
 Spatial indices using R-Trees
 Introspect the disk content of an SQLite database file
     (the dbstat virtual table)
 Read and/or write the content of a comma-separated value (CSV)
     file
 Access the filesystem of the host computer as if it were a database table
 Enabling SQL manipulation of data in statistics packages like R


See the list of virtual tables page for a longer list of actual
virtual table implementations.


1.1. Usage

A virtual table is created using a CREATE VIRTUAL TABLE statement.

create-virtual-table-stmt:
hide
 
 




The CREATE VIRTUAL TABLE statement creates a new table
called table-name derived from the class
module-name.  The module-name
is the name that is registered for the virtual table by
the sqlite3_create_module() interface.

CREATE VIRTUAL TABLE tablename USING modulename;


One can also provide comma-separated arguments to the module following 
the module name:

CREATE VIRTUAL TABLE tablename USING modulename(arg1, arg2, ...);


The format of the arguments to th
gg‚i        K¹Q#The SQLITE_DBPAGE Virtual Table1. Overview


The SQLITE_DBPAGE extension implements an eponymous-only virtual table that
provides direct access to the underlying database file by interacting
with the pager.  SQLITE_DBPAGE is capable of both reading and writing any
page of the database.  Because interaction is through the pager layer, all
changes are transactional.



Warning: writing to the SQLITE_DBPAGE virtual table can very easily
cause unrecoverably database corruption.  Do not allow untrusted components
to access the SQLITE_DBPAGE table.  Use appropriate care while using the
SQLITE_DBPAGE table.  Back up important data prior to experimenting with the
SQLITE_DBPAGE table.  Writes to the SQLITE_DBPAGE virtual table are
disabled when the SQLITE_DBCONFIG_DEFENSIVE flag is set.


The SQLITE_DBPAGE extension is included in the amalgamation though 
it is disabled
by default.  Use the SQLITE_ENABLE_DBPAGE_VTAB compile-time option to enable
the SQLITE_DBPAGE extension.  The SQLITE_DBPAGE extension makes use of
unpublished internal interfaces and is not run-time loadable.  The only way
to add SQLITE_DBPAGE to an application is to compile it in using the
SQLITE_ENABLE_DBPAGE_VTAB compile-time option.



The SQLITE_DBPAGE extension is enabled in default builds
of the command-line shell.

2. Usage


The SQLITE_DBPAGE virtual table read/write table that provides direct
access to the underlying disk file on a page-by-page basis.  The
virtual table appears to have a schema like this:

CREATE TABLE sqlite_dbpage(
  pgno INTEGER PRIMARY KEY,
  data BLOB
);



An SQLite database file is divided into pages.
The first page is 1, the second page is 2, and so forth.
There is no page 0.
Every page is the same size.
The size of every page is a power of 2 between 512 and 65536.
See the file format documentation for further details.


The SQLITE_DBPAGE table allows an application to view or replace the
raw binary content of each page of the database file.
No attempt is made to interpret the content of the page.
Content is returned byte-for-byte as it appears on disk.


The SQLITE_DBPAGE table has one row for each page in the database file.
SQLITE_DBPAGE allows pages to be read or to be overwritten.
However the size of the database file cannot be changed.  It is not
possible to change the number of rows in the SQLITE_DBPAGE table by
running DELETE or INSERT operations against that table.

2.1. Using SQLITE_DBPAGE On ATTACH-ed Databases


The SQLITE_DBPAGE table schema shown above is incomplete.  There is
a third hidden column named "schema" that determines which
ATTACH-ed database should be read or written.  Because
the "schema" column is hidden, it can be used as a parameter when
SQLITE_DBPAGE is invoked as a table-valued function.


For example, suppose an additional database is attached to the 
database connection using a statement like this:

ATTACH 'auxdata1.db' AS aux1;



Then to read the first page of that database file, one merely runs:

SELECT data FROM sqlite_dbpage('aux1') WHERE pgno=1;



If the "schema" is omitted, it defaults to the primary database
(usually called 'main', unless renamed using SQLITE_DBCONFIG_MAINDBNAME).
Hence, the following two queries are normally equivalent:

SELECT data FROM sqlite_dbpage('main') WHERE pgno=1;
SELECT data FROM sqlite_dbpage WHERE pgno=1;



The SQLITE_DBPAGE table can participate in a join just like any other
table.  Hence, to see the content of the first page to all connected
database files, one might run a statement like this:

SELECT dbpage.data, dblist.name
  FROM pragma_database_list AS dblist
  JOIN sqlite_dbpage(dblist.name) AS dbpage
 WHERE dbpage.pgno=1;

This page last modified on  2018-11-12 15:24:40 UTCdbpage.html SQL database engine
that supports this advanced capability.

The behavior of ANY is slightly different in a
STRICT table versus an ordinary non-strict table.  In a STRICT table,
a column of type ANY always preserves the data exactly as it is received.
For an ordinary non-strict table, a column of type ANY will attempt to
convert strings that look like numbers into a numeric value, and if
successful will store the numeric value rather than the original string.
For example:



STRICTordinary non-strict
CREATE TABLE t1(a ANY) STRICT;
INSERT INTO t1 VALUES('000123');
SELECT typeof(a), quote(a) FROM t1;
-- result: text '000123'

CREATE TABLE t1(a ANY);
INSERT INTO t1 VALUES('000123');
SELECT typeof(a), quote(a) FROM t1;
-- result: integer 123



4. Backwards Compatibility

The STRICT keyword at the end of a CREATE TABLE statement is only
recognized by SQLite version 3.37.0 (2021-11-27) and later.  If
you try to open a database containing the STRICT keyword in an earlier
version of SQLite, it will not recognize the keyword and will report
an error (except as noted below).  But apart from the extra STRICT keyword,
the underlying file format of the database is identical.

Thus, in general, a database file that contains one or more STRICT
tables can only be read and written by SQLite version 3.37.0 or later.
However, a database created by SQLite 3.37.0 or later can still be
read and written by earlier versions of SQLite, going all the way back
to version 3.0.0 (2004-06-18) as long as the database does not contain
any STRICT tables or other features that were introduced after the older
version of SQLite.

The STRICT keyword may still be used as an identifier.
(It is only treated as a keyword in a certain part of the syntax,
and sqlite3_keyword_check(..) does not recognize it as a regular keyword.)

4.1. Accessing STRICT tables in earlier versions of SQLite

Because of a quirk in the SQL language parser, versions of SQLite prior
to 3.37.0 can still read and write STRICT tables if they set
"PRAGMA writable_schema=ON" immediately after opening the database
file, prior to doing anything else that requires knowing the schema.
One of the features of PRAGMA writable_schema=ON is that it disables
errors in the schema parser.  This is intentional, because a big reason for
having PRAGMA writable_schema=ON is to facilitate recovery of database files
with corrupt schemas.  So with writable_schema=ON, when the schema
parser reaches the STRICT keyword, it says to itself "I don't know what
to do with this, but everything up to this point seems like a valid
table definition so I'll just use what I have."  Hence, the STRICT
keyword is effectively ignored.  Because nothing else about the file
format changes for STRICT tables, everything else will work normally.
Of course, rigid type enforcement will not occur because the earlier
versions of SQLite do not know how to do that.

The .dump command in the CLI sets PRAGMA writable_schema=ON, because
.dump is designed to extract as much content as it can even from a corrupt
database file.  Hence, if you are using an older version of SQLite and
you open a database with STRICT tables in the CLI and issue the ".dump"
command before doing anything else, you will be able to read and write
to the STRICT tables without rigid type enforcement.  This could, potentially,
corrupt the database, by allowing incorrect types into STRICT tables.
Reopening the database with a newer version of SQLite and running
"PRAGMA quick_check" will detect and report all such corruption.

5. Other Table Options

The SQLite parser accepts a comma-separated list of table options after
the final close parenthesis in a CREATE TABLE statement.  As of this
writing (2021-08-23) only two options are recognized:


 STRICT
 WITHOUT ROWID


If there are multiple options, they can be specified in any order.
To keep things simple, the current parser accepts duplicate options without
complaining, but that might change in future releases, so applications
should not rely on it.
This page last modified on  2022-01-20 21:38:08 UTCstricttables.html
++½I‚j     'úQ/STRICT Tables1. Introduction

SQLite strives to be flexible regarding the datatype of
the content that it stores.  For example, if a table column has a type of
"INTEGER", then SQLite tries to convert anything inserted into that column
into an integer.  So an attempt to insert the string '123' results
in an integer 123 being inserted.  But if the content cannot be losslessly
converted into an integer, for example if the input is 'xyz', then
the original string is inserted instead.
See the Datatypes In SQLite document for additional information.

Some developers appreciate the freedom that SQLite's flexible typing
rules provide and use that freedom to advantage.
But other developers are aghast at SQLite's
flagrant rule-breaking and prefer the traditional rigid type
system found in all other SQL database engines and in the
SQL standard.  For this latter group, SQLite supports a strict typing
mode, as of version 3.37.0 (2021-11-27), that is enabled
separately for each table.

2. STRICT Tables

In a CREATE TABLE statement, if the "STRICT" table-option keyword is
added to the end, after the closing ")", then strict typing rules apply
to that table. 
The STRICT keyword causes the following differences:



Every column definition must specify a datatype for that column.
The freedom to specify a column without a datatype is removed.


The datatype must be one of following:

 INT
 INTEGER
 REAL
 TEXT
 BLOB
 ANY

No other datatype names are allowed, though new types might be added in
future releases of SQLite.


Content inserted into the column with a datatype other than ANY
must be either a NULL (assuming there
is no NOT NULL constraint on the column) or the type specified.
SQLite attempts to coerce the data into the appropriate type using the usual
affinity rules, as PostgreSQL, MySQL, SQL Server,
and Oracle all do.  If the value cannot be
losslessly converted in the specified datatype, then an
SQLITE_CONSTRAINT_DATATYPE error is raised.


Columns with datatype ANY can accept any kind of data (except they will
reject NULL values if they have a NOT NULL constraint, of course).  No
type coercion occurs for a column of type ANY in a STRICT table.


Columns that are part of the PRIMARY KEY are implicitly NOT NULL.
However, even though the PRIMARY KEY has an implicit NOT NULL constraint,
when a NULL value is inserted into an INTEGER PRIMARY KEY column, the
NULL is automatically converted into a unique integer, using the same
rules for INTEGER PRIMARY KEY on ordinary, non-strict tables.


The PRAGMA integrity_check and PRAGMA quick_check commands check the
type of the content of all columns in STRICT tables and show errors if
anything is amiss.



Everything else about a STRICT table works the same as it does in an
ordinary non-strict table:


 CHECK constraints work the same.
 NOT NULL constraints work the same.
 FOREIGN KEY constraints work the same.
 UNIQUE constraints work the same.
 DEFAULT clauses work the same.
 COLLATE clauses work the same.
 Generated columns work the same.
 ON CONFLICT clauses work the same.
 Indexes work the same.
 AUTOINCREMENT works the same.
 An INTEGER PRIMARY KEY column is an alias for the rowid, but an
INT PRIMARY KEY column is not.
 The on-disk format for the table data is the same.


3. The ANY datatype

The ability to host any type of data in a single column has proven to
be remarkably useful over the years.  In order to continue supporting this
ability, even in STRICT tables, the new ANY datatype name is introduced.
When the datatype of a column is "ANY", that means that any kind of data - 
integers, floating point values, strings, or binary blobs, can be inserted
into that table and its value and datatype will be preserved exactly as
it is inserted.  As far as we know, SQLite is the only
“|‚k       I§?Internal Versus External BLOBsInternal Versus External BLOBs in SQLite



If you have a database of large BLOBs, do you get better read performance
when you store the complete
BLOB content directly in the database or is it faster to store each BLOB
in a separate file and store just the corresponding filename in the database?



To try to answer this, we ran 49 test cases with various BLOB sizes and
SQLite page sizes on a Linux workstation (Ubuntu circa 2011 with the
Ext4 filesystem on a fast SATA disk).
For each test case, a database was created containing 100MB of BLOB
content.  The sizes of the BLOBs ranged from 10KB to 1MB.  The number
of BLOBs varied in order to keep the total BLOB content at about 100MB.
(Hence, 100 BLOBs for the 1MB size and 10000 BLOBs for the 10K size and
so forth.)  SQLite version 3.7.8 (2011-09-19) was used.



Update: New measurements for SQLite version 3.19.0
(2017-05-22) show that SQLite is about 
35% faster than direct disk I/O for 
both reads and writes of 10KB blobs.



The matrix below shows the time needed to read BLOBs stored in separate files
divided by the time needed to read BLOBs stored entirely in the database.  
Hence, for numbers larger than 1.0, it is faster to store the BLOBs directly 
in the database.  For numbers smaller than 1.0, it is faster to store the BLOBs
in separate files.



In every case, the pager cache size was adjusted to keep the amount of
cache memory at about 2MB.  
For example, a 2000 page cache was used for 1024 byte pages
and a 31 page cache was used for 65536 byte pages.
The BLOB values were read in a random order.




Database Page SizeBLOB size

10k20k50k100k200k500k1m


10241.5351.0200.6080.4560.3300.2470.233


20482.0041.4370.8700.6360.4830.3720.340


40962.2611.8861.1730.8900.7010.5260.487


81922.2401.8661.3341.0350.8300.6250.720


163842.4391.7571.2921.0230.8290.8200.598


327681.8781.8431.2960.9810.9760.6750.613


655361.2561.2551.3390.9830.7690.6870.609




We deduce the following rules of thumb from the matrix above:



A database page size of 8192 or 16384 gives the best performance
for large BLOB I/O.

For BLOBs smaller than 100KB, reads are faster when
the BLOBs are stored directly in the database file.  For BLOBs larger than
100KB, reads from a separate file are faster.


Of course, your mileage may vary depending on hardware, filesystem,
and operating system.  Double-check these figures on target hardware
before committing to a particular design.
This page last modified on  2022-01-20 21:38:08 UTCintern-v-extern-blob.html
--O‚l   1ºW+Invalid UTF Policy1. Garbage In, Garbage Out


With regard to invalid UTF, SQLite follows a policy of
Garbage-In, Garbage-Out (GIGO). If you insert invalid UTF
into an SQLite database, then try to query that data, what you get back out
might not be exactly what you put in.  If you put garbage in, then you
may not complain if you get different garbage back out.


For the purposes of this discussion, "invalid UTF" can mean any of
the following circumstances:



Invalid surrogate pairs in UTF-16.


Invalid multi-byte sequences in UTF-8.


Using more bytes of UTF-8 than necessary to represent a single
code point.  (Example:  encoding 'A' as the two-byte sequence
0xc1, 0x01 instead of just a single 0x41 byte.)


NUL characters (U+0000) embedded in strings.


Invalid sequences of combining characters.


UTF-8 or UTF-16 bytes sequences that encode numbers that are not
defined Unicode characters.



1.1. Invalid UTF will never cause memory errors


If you insert invalid UTF into an SQLite database, then SQLite makes
no guarantees about what text you might get back out.  But it does
promise that invalid UTF will never cause memory errors
(array overruns, reads or writes of uninitialized memory, etc), at
least for the built-in processing of SQLite.
In other words, invalid UTF will not cause SQLite to crash.


This promise only applies to the core SQLite components, not
application-provided extensions, of course.
If an application adds new application-defined SQL functions or
virtual tables or collating sequences or other extensions, and a
database contains invalid UTF, then invalid UTF might get passed
into those extensions.  If the invalid UTF causes one of those
extensions to crash, then that is a problem with the extension,
not with SQLite.

2. No enforcement of text formatting rules


SQLite does not try to enforce UTF formatting rules.  You can
insert invalid UTF into a TEXT field and SQLite will not complain
about this.  It stores the invalid TEXT as best it can.  SQLite
sees its role in the world as a storage engine, not a text format
validation engine.

3. Best effort to preserve text


SQLite does not promise to always preserve invalid UTF, but it does
make an effort.  Generally speaking, if you insert invalid UTF into
SQLite, you will get the exact same byte sequence back out, as long
as you do not ask SQLite to transform the text in any way.


For example, if you insert some UTF-16LE with invalid surrogates into
a TEXT column of a table of a database that has PRAGMA encoding=UTF16LE,
then later query that column using sqlite3_column_text16(), you will 
probably get back the same exact invalid UTF-16.  But if you insert the
same invalid UTF-16LE content in a PRAGMA encoding=UTF8 database,
the content must be converted into UTF8 when it is stored, which could
cause irreversible changes to the content.  Or if you insert that
same invalid UTF-16LE content into a PRAGMA encoding=UTF16LE database
but then read it out using sqlite3_column_text(), then a UTF16 to
UTF8 conversion must occur during the read-out and that conversion might
introduce irreversible changes.


Or, suppose you are doing everything using UTF-8 (the most common case).
Invalid UTF-8 will normally pass through the database without any change
in its byte sequence.  However, if you try to transform the invalid
UTF-8 with SQL function like substr() or replace()
or if you try to do string matching with the LIKE operator, then
you might get unexpected results.


So, in other words, SQLite does not actively try to subvert your
invalid text.  But when you ask SQLite to make transformations of invalid
UTF, there are no guarantees that those transformations will be reversible
or even sensible.
This page last modified on  2021-12-13 15:03:51 UTCinvalidutf.html
ñÀd‚n
-+How SQLite Works1. Background


SQLite is a software library
that translates high-level disk I/O requests generated by an application
into low-level I/O operations that
can be carried out by the operating system.  The application constructs 
high-level I/O requests using the
SQL language.
SQLite translates each high-level SQL statement into a sequence of
many low-level I/O requests (open a file, read a few bytes from a file,
write a few bytes into a file, etc.) that do the wŽ‚m      G›9+File Format Changes in SQLiteFile Format Changes in SQLite


The underlying file format for SQLite databases does not
change in incompatible ways.  There are literally trillions of
SQLite database files in circulation and the SQLite developers are
committing to supporting those files for decades into the future.



Prior to SQLite version 3.0.0 (2004-06-18), the file format did
sometimes change from one release to the next.  But since that time,
the file format has been fully backwards compatible.



By "backwards compatible" we mean that
newer versions of SQLite can always read and write database files created
by older versions of SQLite.
It is often also the case that SQLite is "forwards compatible", that
older versions of SQLite can read and write database files created by
newer versions of SQLite.  But there are sometimes forward compatibility
breaks.  Sometimes new features are added to the file format.  For
example, WAL mode was added in version 3.7.0 (2010-07-21).  
SQLite 3.7.0 and later can read and write all database files created
by earlier versions of SQLite.  And earlier versions of SQLite can
read and write database files created by SQLite 3.7.0 and later
as long as the database does not use WAL mode.  But versions of
SQLite prior to version 3.7.0 cannot read nor write SQLite database files
that make use of WAL mode.


Summary



Newer versions of SQLite can always read and/or write database files
created by older versions of SQLite, back to version 3.0.0 (2004-06-18).


Older versions of SQLite back to version 3.0.0 can read and write
database files created by newer versions of SQLite as long as the
database does not make use of newer features that are unknown to that
older version.

This page last modified on  2022-09-13 14:04:46 UTCformatchng.htmlork requested by
the SQL.



An application program could do all its disk I/O by direct calls to
operating system I/O routines
or by using a key/value storage engine like 
Berkeley DB or
RocksDB (to name but two).
But there are advantages to using a higher-level interface based
on the SQL language.



SQL is a very high-level language.
A few lines of SQL can replace hundreds or thousands of lines of
procedural code.  SQL thus reduces
the amount of work needed to develop and maintain the application,
and thereby helps to reduce the number of bugs in the application.


SQL and SQLite are 
transactional.
The use of a transactional storage system makes it much easier to
reason about the behavior of the application, and to write applications
that are robust, even in the face of software bugs, hardware faults,
or power losses.


SQLite is often
faster than direct low-level I/O.
This is counterintuitive.  One would expect that a
high-level interface such as SQLite would impose a run-time penalty.
And, theoretically, that is correct.  But in practice, SQL-based
systems such as SQLite do so many behind-the-scenes optimizations
that an application developer would never have time to create and
maintain, that the SQL-based systems end up providing
a net performance gain.


1.1. SQLite Is Different From Most Other SQL Databases


There are many SQL-based database management systems available, besides
SQLite.  Common options include MySQL, PostgreSQL, and SQL-Server.
All these systems use the SQL langauge to communicate with the 
application, just like SQLite.  But these other systems different
from SQLite in important respects.



SQLite is a serverless software library, whereas the other
systems are client-server based.  With MySQL, PostgreSQL, SQL-Server,
and others, the application sends a message containing some SQL
over to a separate server thread or process. That separate
thread or process performs the requested I/O, then send the results
back to the application.  But there is no separate thread or
process with SQLite.  SQLite runs in the same address space as
the application, using the same program counter and heap storage.
SQLite does no interprocess communication (IPC).  When an application
sends an SQL statement into SQLite (by invoking a the appropriate
SQLite library subroutine), SQLite interprets the SQL
in the same thread as the caller.  When an SQLite API routine
returns, it does not leave behind any background tasks that
run separately from the application.


An SQLite database is a single ordinary file on disk
(with a well-defined file format).  With other
systems, a "database" is usually a large number of separate
files hidden away in obscure directories of the filesystem, or
even spread across multiple machines.  But with SQLite, a
complete database is just an ordinary disk file.


2. SQL Is A Programming Language


The best way to understand how SQL database engines work is to
think of SQL as a programming language, not as a "query language".
Each SQL statement is a separate program.  Applications construct
SQL program source files and send them to the database engine.
The database engine compiles the SQL source code into executable
form, runs that executable, then sends the result back to the
application.


While SQL is a programming language, it is different from other
programming languages like C, Javascript, Python, or Go in that
SQL is a 
declarative language
where the others are
imperative languages.
This is an important difference that has implications for the
design of the compiler used to translate program source text into an
executable format. However, those details 
should not detract from the fact that
SQL is really just another programming language.

2.1. Programming Language Processing Steps


All programming languages are processed in two steps:



Translate the program source text into an executable format.

Run the executable generated in the previous step in order to
carry out the desired action.



All programming languages uses those two basic steps.
The main difference is in the executable format.


"Compiled" languages like C++ and Rust translate
the source text into machine code that can be directly executed
by the underlying hardware.  There exist SQL database systems
that do the same with SQL - they translate each SQL statement
directly into machine code.  But that approach is uncommon and
is not the approach taken by SQLite.


Other languages like Java, Perl, Python, and TCL
typically translate the program source text into bytecode.
This bytecode is then run through an interpreter that
reads the bytecode and carries out the desired operations.
SQLite uses this bytecode approach.  If you preceed
any SQL statement with the "EXPLAIN" keyword in SQLite,
it will show you the bytecode that is generated rather
than run the bytecode.


Another approach is to translate the program source text
into a tree of objects in memory.  This tree is the "executable".
An interpret runs the executable by walking the tree.
This is the technique used by MySQL, PostgreSQL, and
SQL-Server.


Of course, not every language fits neatly into one of the
above categories.  This applies to both SQL database engines
and more familiar imperative programming languages.  Javascript
is famous for using a hybrid execution model, where the code
is initially compiled into a tree of objects, but might be
further translating (using just-in-time compilation) down into
more efficient bytecode or machine code, as a means of boosting
performance.


The executable format really ends up being just an implementation
detail.  The key point is that all languages have a compiler
step which translates programs into an executable format and
a run step that executes the compiled program.


2.2. Compiling SQLite Programs


When an SQL program is submitted to SQLite, the first step is
to split the source text into "tokens".  A token might be:


A language keyword like "SELECT" or "UPDATE".
An identifier for a table or column or variable.
Punctuation characters like "," or "==" or ";".
Literal values: numeric or string constants.
Whitespace or comments.



Whitespace and comment tokens are discarded.  All other tokens
are fed into an
LALR(1) Parser
that analyzes the structure of the input program and generates an
Abstract Syntax Tree (AST)
for the input program.


The parser forwards the AST on to the code generator.
The code generator is the heart of SQLite, and is where most of
the magic happens.
The code generator resolves symbolic names in the AST - matching
the names of columns and tables in the input SQL into actual
columns and tables of the database.  The code generator also does
various transformations on the AST to "optimize" it.  Finally
the code generator chooses appropriate algorithms to implement
the operations requested by the AST and constructs bytecode to
carry out those operations.


The bytecode generated by the code generator is called a
"prepared statement".  Translating SQL source text into a
prepared statement is analogous to converting a C++ program
into machine code by invoking gcc or clang.  Human-readable
source text (SQL or C++) goes in, and a machine readable executable
(bytecode or machine code) comes out.

3. Further Reading



The Atomic Commit document describes how SQLite implements
transactions.


The bytecode engine document has more information
on the bytecode format used by SQLite, and how to view and interpret
an SQLite prepared statement.


The SQLite query planner and
Next Generation Query Planner documents have further details
on the algorithms SQLite uses to implement SQL statements and
how it goes above choosing an appropriate algorithm for each
individual SQL statement.

This page last modified on  2022-06-16 15:42:19 UTChowitworks.htmlmmap the shm file and use it
as shared memory for coordinating access to the database and as a cache
for quickly locating frame within the wal file.  The name
of the shm file is the main database file name with the four characters
"-shm" appended.  Or, for 8+3 filesystems, the shm file is the main
database file with the suffix changed to ".SHM".

The shm does not contain any database content and is not required
to recover the database following a crash.  For that reason, the first
client to connect to a quiescent database will normally truncate the
shm file if it exists.  Since the content of the shm file does not need
to be preserved across a crash, the shm file is never fsync()-ed to disk.
In fact, if there were a mechanism by which SQLite could tell the 
operating system to never persist the shm file to disk but always hold
it in cache memory, SQLite would use that mechanism to avoid any
unnecessary disk I/O associated with the shm file.  However, no such
mechanism exists in standard posix.

Because the shm is only used to coordinate access between concurrent
clients, the shm file is omitted if exclusive locking mode
is set, as an optimization.  When exclusive locking mode is set,
SQLite uses heap memory in place of the memory-mapped shm file.

1.4. File Lifecycles

When a WAL mode database is in active use, all three of the above
files usually exist.  Except, the Wal-Index file is omitted if
exclusive locking mode is set.

If the last client using the database shuts down cleanly by
calling sqlite3_close(), then a checkpoint is run automatically
in order to transfer all information from the wal file
over into the main database, and both the shm file
and the wal file are unlinked.  Thus, when the database is not in
use by any client, it is usually the case that only the main
database file exists on disk.
However, if the last client did not call sqlite3_close() before it
shut down, or if the last client to disconnect was a read-only client,
then the final cleanup operation does not occur and the
shm and wal files may still exist on disk even when the database is
not in use.

1.5. Variations

When PRAGMA locking_mode=EXCLUSIVE (exclusive locking mode) is set,
only a single client is allowed to have the database open at one time.  Since
only a single client can use the database, the shm file is omitted.
The single client uses a buffer in heap memory as a substitute for the
memory-mapped shm file.

If a read/write client invokes
sqlite3_file_control(SQLITE_FCNTL_PERSIST_WAL) prior to shutdown,
then at shutdown a checkpoint is still run, but the shm file and wal
file are not deleted.
This allows subsequent read-only clients to connect to and read the
database.



2. The WAL-Index File Format


The WAL-index or "shm" file is used to coordinate access to the database
by multiple clients, and as a cache to help clients quickly locate frames
within the wal file.


Because the shm file is not involved in recovery, the shm file does not
need to be machine byte-order independent.  Hence, numeric values in
the shm file are written in the native byte order of the host computer,
rather than being converted into a specific cross-platform byte order as
is done with the main database file and the wal file.


The shm file consists of one or more hash tables, where each hash table
is 32768 bytes in size.  Except, a 136-byte header is carved out of the
front of the very first hash table, so the first hash table is only
32632 bytes in size.  The total size of the shm file is always a multiple
of 32768.  In most cases, the total size of the shm file is exactly 32768
bytes.  The shm file only needs to grow beyond a single hash table if
when the wal file grows very large (more than 4079 frames).  Since the
default automatic checkpoint threshold is
1000, WAL files rare reach the 4079 threshold needed to make the shm file
grow.

2.1. The WAL-Index Header

The first 136 bytes of the shm file are a header.  The shm header has
three main divisions as follows:


WAL-Index Header Divisions

BytesDescription
0..47First copy of the WAL Index Information
48..95Second copy of the WAL Index Information
96..135Checkpoint Information and Locks



Individual fields of the shm header, except for the
salt values copied from the WAL header, are unsigned integers
in the native byte-order of the host machine.  The salt values
are exact copies from the WAL header and are in whatever byte
order is used by the WAL file.
The size of integers may be 8, 16, 32, or 64 bits.
A detailed breakout of the individual fields of the shm header
follows:


WAL-Index Header Details

BytesNameMeaning

0..3iVersion
The WAL-index format version number.  Always 3007000.


4..7&nbsp;
Unused padding space.  Must be zero.


8..11iChange
Unsigned integer counter, incremented with each transaction


12isInit
The "isInit" flag.  1 when the shm file has been initialized.


13bigEndCksum
True if the WAL file uses big-ending checksums.  0 if the WAL
    uses little-endian checksums.


14..15szPage
The database page size in bytes, or 1 if the page size is 65536.


16..19mxFrame
Number of valid and committed frames in the WAL file.


20..23nPage
Size of the database file in pages.


24..31aFrameCksum
Checksum of the last frame in the WAL file.


32..39aSalt
The two salt value copied from the WAL file header.
These values are in the byte-order of the WAL file, which
might be different from the native byte-order of the
machine.


40..47aCksum
A checksum over bytes 0 through 39 of this header.


48..95&nbsp;
A copy of bytes 0 through 47 of this header.


96..99nBackfill
Number of WAL frames that have already been backfilled into the database
    by prior checkpoints


100..119read-mark&#91;0..4&#93;
Five "read marks".  Each read mark is a 32-bit unsigned integer (4 bytes).


120..127&nbsp;
Unused space set aside for 8 file locks.


128..132nBackfillAttempted
Number of WAL frames that have attempted to be backfilled but which might
    not have been backfilled successfully.


132..136&nbsp;
Unused space reserved for further expansion.






2.1.1. The mxFrame field

The 32-bit unsigned integer at offset 16 (and repeated at offset 64)
is the number of valid frames in the WAL.  Because WAL frame are numbered
starting with 1, mxFrame is also the index of the last valid commit frame
in the WAL. A commit frame is a frame that has a non-zero "size of database"
value in bytes 4 through 7 of the frame header, and that indicates the end
of a transaction.

When mxFrame field is zero, it indicates that the WAL is empty and that
all content should be obtained directly from the database file.

When mxFrame is equal to nBackfill, that indicates that all content
in the WAL has been written back into the database.
In that case, all content can be read directly from the database.
Furthermore, the next writer is free to reset the WAL if no other
connections hold locks on WAL_READ_LOCK(N) for N>0.

The mxFrame value is always greater than or equal to both
nBackfill and nBackfillAttempted.




2.1.2. The nBackfill field

The 32-bit unsigned integer at offset 128 in the WAL-index header
is called the "nBackfill".
this field holds the number of frames in the WAL file which
have been copied back into the main database.

The nBackfill number is never greater than mxFrame.
When nBackfill equals mxFrame, that means that the WAL content
has been completely written back into the database and it is
ok to reset the WAL if there are no locks held on any of WAL_READ_LOCK(N)
for N>0.

The nBackfill can only be increased while holding the
WAL_CKPT_LOCK.  However, nBackfill is changed to zero
during a WAL reset, and this happens while holding
the WAL_WRITE_LOCK.



2.1.3. WAL Locks

Eight bytes of space are set aside in the header to support
file locking using the xShmLock() method in the sqlite3_io_methods
object.  These eight bytes are never read nor written by SQLite since
some VFSes (ex: Windows) might implement locks using mandatory file locks.

These are the eight locks supported:


WAL-Index Locks Controlled By xShmLock()

NameOffset
xShmLockFile

WAL_WRITE_LOCK
0
120



WAL_CKPT_LOCK
1
121



WAL_RECOVER_LOCK
2
122



WAL_READ_LOCK(0 )
3
123



WAL_READ_LOCK(1)
4
124



WAL_READ_LOCK(2)
5
125



WAL_READ_LOCK(3)
6
126



WAL_READ_LOCK(4)
7
127






TBD:  More information about the header

2.2. WAL-Index Hash Tables

The hash tables in the shm file are designed to answer the
following question quickly:


FindFrame(P,M):
Given a page number P and a maximum WAL frame index M,
return the largest WAL frame index for page P that does not exceed M, 
or return NULL if there are no frames for page P that do not exceed M.



Let the datatypes "u8", "u16", and "u32" mean unsigned integers of
length 8, 16, and 32 bits, respectively.  Then, the first 32768-byte unit
of the shm file is organized as follows:


u8 aWalIndexHeader[136];
u32 aPgno[4062];
u16 aHash[8192];


The second and all subsequent 32768-byte units of the shm file are
like this:


u32 aPgno[4096];
u16 aHash[8192];


Collectively, the aPgno entries record the database page number stored
in all frames of the WAL file.  The aPgno[0] entry on the first hash table
records the database page number stored in the very first frame in the WAL 
file. The aPgno[i] entry from the first hash table is the database page number
for the i-th frame in the WAL file.  The aPgno[k] entry for the second
hash table is the database page number for the (k+4062)-th frame in the
WAL file.  The aPgno[k] entry for the n-th 32768-byte hash table in the
shm file (for n>1) holds the database page number stored in the
(k+4062+4096*(n-2))-th frame of the WAL file.

Here is a slightly different way to describe the aPgno values:
If you think of all aPgno values as a contiguous array, then
the database page number stored in the i-th frame of the WAL file
is stored in aPgno[i].  Of course, aPgno is not a contiguous array.
The first 4062 entries are on the first 32768-byte unit of the shm
file and subsequent values are in 4096 entry chunks in later units
of the shm file.

One way to compute FindFrame(P,M) would be to scan the aPgno
array starting with the M-th entry and working backwards towards
the beginning and return J where aPgno[J]==P.  Such an algorithm would
work, and it would be faster than searching the whole WAL file for
the latest frame with page number P.  But the search can be made
much faster still by using the aHash structure.

A database page number P is mapped into a hash value
using the following hash function:


h = (P * 383)%8192


This function maps every page number into an integer between 0
and 8191 inclusive.  The aHash field of each 32768-byte shm file unit
maps P values into indexes of the aPgno field of the same unit as
follows:


 Compute the hash value: h = P * 383
 Let X be the largest set of consecutive integers {h, h+1, h+2, ..., h+N}
     such that for every j in X, aPgno&#91;j%8192]!=0.  The X set will be empty
     if aPgno&#91;h%8192]==0.  The X set is easily computed by starting with
     the value h%8192, and adding h%8192 to X and incrementing h until
     encountering the first aPgno&#91;h%8192] entry that is zero.
 The set X contains the index in aPgno of every entry in the current
     32768-byte unit of the shm file that might possible be a solution
     to the FindFrame(P,M) function.  Each of these entries must be
     checked separately to ensure that the aPgno value is P and that the
     frame number does not exceed M.  The largest frame number that passes
     those two tests is the answer.


Each entry in the aPgno array has a single corresponding entry
in the aHash array.  There are more available slots in aHash than
there are in aPgno.  The unused slots in aHash are filled with zero.
And since there are guaranteed to be unused slots in aHash, that means
the loop that computes X is guaranteed to terminate.  The expected size
of X is less than 2.  The worst case is that X will be the same as the
number of entries in aPgno, in which case the algorithm runs at about
the same speed as a linear scan of aPgno.  But that worst case performance
is exceedingly rare.  Usually, the size of X will be small and the use
of the aHash array allows one to compute FindFrame(P,M) much faster.

Here i!s an alternative way of describing the hash look-up algorithm:
Start with h = (P * 383)%8192 and look at aHash[h] and subsequent entries,
wrapping around to zero when h reaches 8192, until finding an entry with
aHash[h]==0.  All aPgno entries having a page number of P will have an
index that is one of the aHash[h] values thusly computed.
But not all the computed aHash[h] values will
meet the matching criteria, so you must check them independently.  The
speed advantage comes about because normally this set of h values is
very small.

Note that each 32768-byte unit of the shm file has its own aHash and
aPgno arrays.  The aHash array for a single unit is only helpful in finding
aPgno entries in that same unit.  The overall FindFrame(P,M) function
needs to do hash lookups beginning with the latest unit and working
backwards to the oldest unit until it finds an answer.

2.3. Locking Matrix

Access is coordinated in WAL mode using both the legacy DELETE-mode
locks controlled by the xLock and xUnlock methods of the sqlite3_io_methods
object and the WAL locks controlled by the xShmLock method of the
sqlite3_io_methods object.

Conceptually, there is just a single DELETE-mode lock.  The DELETE-mode
lock for a single database connection can be in exactly one of the
following states:

 SQLITE_LOCK_NONE (unlocked)
 SQLITE_LOCK_SHARED (reading)
 SQLITE_LOCK_RESERVED (reading, waiting to write)
 SQLITE_LOCK_PENDING (new readers blocked, waiting to write)
 SQLITE_LOCK_EXCLUSIVE (writing)

The DELETE-mode locks are stored on the lock-byte page of the
main database file.
Only SQLITE_LOCK_SHARED and SQLITE_LOCK_EXCLUSIVE are factors for WAL-mode
databases.
The other locking states are used in rollback-mode, but not in WAL-mode.

The WAL-mode locks are described above.

2.3.1. How the various locks are used

The following rules show how each of the locks is used.


SQLITE_LOCK_SHARED

All connections hold SQLITE_LOCK_SHARED continuously while attached
to a WAL-mode database.  This is true for both read/write connections
and read-only connections.
The SQLITE_LOCK_SHARED lock is held even by connections that are
not within transaction.
This is different from rollback mode, where the SQLITE_LOCK_SHARED is
released at the end of each transaction.

SQLITE_LOCK_EXCLUSIVE

Connections hold an exclusive lock when change in between WAL mode
and any of the various rollback-modes.  Connections might also attempt to
obtain an EXCLUSIVE lock when they disconnect from WAL mode.  If
a connection is able to obtain an EXCLUSIVE lock, that means it is the
only connection to the database and so it may attempt to checkpoint
and then delete the WAL-index and WAL files.

When a connection is holding a SHARED lock on the main database,
that will prevent any other connection from acquiring the EXCLUSIVE
lock, which in turn prevents the WAL-index and WAL files from being
deleted out from under other users, and prevents a transition out of
WAL-mode while other users are accessing the database in WAL-mode.


WAL_WRITE_LOCK

The WAL_WRITE_LOCK is only locked exclusively.  There is never a shared
lock taken on WAL_WRITE_LOCK.

An EXCLUSIVE WAL_WRITE_LOCK is held by any connection that is appending
content to the end of the WAL.  Hence, only a single process at a time
can append content to the WAL.  If a WAL reset occurs as a consequence of
a write, then the nBackfill field of the WAL-index header is reset to
zero while holding this lock.
An EXCLUSIVE is also held WAL_WRITE_LOCK, and on several other locking
bytes, when a connection is running recovery on the shared WAL-index.

WAL_CKPT_LOCK

The WAL_CKPT_LOCK is only locked exclusively.  There is never a shared
lock taken on WAL_CKPT_LOCK.

An EXCLUSIVE WAL_CKPT_LOCK is held by any connection that is running
a checkpoint.  The nBackfill field of the WAL-index header may be
increased while holding this exclusive lock, but it may not be decreased.
An EXCLUSIVE is also held WAL_CKPT_LOCK, and on several other locking
bytes, when a connection is running recovery on the shared WAL-index.

WAL_RECOVER_LOCK

The WAL_RECO"VER_LOCK is only locked exclusively.  There is never a shared
lock taken on WAL_RECOVER_LOCK.

An EXCLUSIVE WAL_RECOVER_LOCK is held by any connection that is running
recovery to reconstruct the shared WAL-index.

A read-only connection that is rebuilding its private heap-memory WAL-index
does not hold this lock.  (It cannot, since read-only connections are not
allowed to hold any exclusive locks.)  This lock is only held when rebuilding
the global shared WAL-index contained in the memory-mapped SHM file.

In addition to locking this byte, a connection running recovery also
gets an exclusive lock on all other WAL locks except for WAL_READ_LOCK(0).

WAL_READ_LOCK(N)

There are five separate read locks, numbers 0 through 4.
Read locks may be either SHARED or EXCLUSIVE.
Connections obtain a shared lock on one of the read locks bytes while
they are within a transaction.
Connections also obtain an exclusive lock on read locks, one at a time,
for the brief moment while they are updating the values of the corresponding
read-marks.
Read locks 1 through 4 are held exclusively when running recovery.

Each read lock byte corresponds to one of the five 32-bit read-mark
integers located in bytes 100 through 119 of the WAL-index header, as
follows:


Lock NameLock offsetRead-mark nameRead-mark offset
WAL_READ_LOCK(0)123read-mark[0]100..103
WAL_READ_LOCK(1)124read-mark[1]104..107
WAL_READ_LOCK(2)125read-mark[2]108..111
WAL_READ_LOCK(3)126read-mark[3]112..115
WAL_READ_LOCK(4)127read-mark[4]116..119



When a connection holds a shared lock on WAL_READ_LOCK(N), that is a
promise by the connection that it will use the WAL and not the database
file for any database pages that are modified by the first
read-mark[N] entries in the WAL.
The read-mark[0] is always zero.  If a connection holds a shared lock
on WAL_READ_LOCK(0), that means the connection expects to be able to ignore
the WAL and read any content it wants from the main database.
If N>0 then the connection is free to use more of the WAL file beyond
read-mark[N] if it wants to, up to the first mxFrame frames.
But when a connection holds a shared lock on WAL_READ_LOCK(0), that is a
promise that it will never read content from the WAL
and will acquire all content directly from the main database.

When a checkpoint runs, if it sees a lock on WAL_READ_LOCK(N), then it
must not move WAL content into the main database for more than the first
read-mark[N] frames.  Were it to do so, it would overwrite content that
the process holding the lock was expecting to be able to read out of the
main database file.  A consequence of if this is that f the WAL file
contains more than read-mark[N] frames (if mxFrame>read-mark[N]
for any read-mark for which WAL_READ_LOCK(N) is held by another process),
then the checkpoint cannot run to completion.

When a writer wants to reset the WAL, it must ensure that there are
no locks on WAL_READ_LOCK(N) for N>0 because such locks indicate
that some other connection is still using the current WAL file and 
a WAL reset would delete content out from those other connections.  It is
ok for a WAL reset to occur if other connections are holding WAL_READ_LOCK(0)
because by holding WAL_READ_LOCK(0), those other connections are promising
not to use any content from the WAL.


2.3.2. Operations that require locks and which locks those operations use


Transition into and out of WAL-mode

The SQLITE_LOCK_EXCLUSIVE lock must be held by a connection that wants
to transition into our out of WAL mode.
Transitioning into WAL mode is, therefore, just like any other write
transaction, since every write transaction in rollback mode requires
the SQLITE_LOCK_EXCLUSIVE lock.
If the database file is already in WAL mode (hence if the desire it to change
it back into rollback mode) and if there are two
or more connections to the database, then each of these connections will
be holding an SQLITE_LOCK_SHARED lock.  That means that the
SQLITE_LOCK_EXCLUSIVE cannot be obtained, and the transition out of
WAL mode will not be allowed.  This prevents one connection from deleting
WAL mode out from under another.  It also means that the only way to move
a database from WAL mode into rollback mode is to close all but one
connection to the database.


Close a connection to a WAL mode database

When a database connection closes (via sqlite3_close() or
sqlite3_close_v2()), an attempt is made to acquire
SQLITE_LOCK_EXCLUSIVE.  If this attempt is successful, that means
the connection that is closing is the last connection to the database.
In that case, it is desirable to clean up the WAL and WAL-index files,
so the closing connection runs a checkpoint (while holding
SQLITE_LOCK_EXCLUSIVE) and the deletes both the WAL and WAL-index files.
The SQLITE_LOCK_EXCLUSIVE is not released until after both the
WAL and WAL-index files have been deleted.

If the application invokes
sqlite3_file_control(SQLITE_FCNTL_PERSIST_WAL) on the database
connection prior to closing, then the final checkpoint is still
run but the WAL and WAL-index files are
not deleted as they normally would be.
This leaves the database in a state that allows other processes
without write permission on the database, WAL, or WAL-index files
to open the database read-only.
If the WAL and WAL-index files are missing, then a process that
lacks permission to create and initialize those files will not be
able to open the database, unless the database is designated
as immutable using the immutable query parameter.

Reconstruct the global shared WAL-index during recovery

All of the WAL-index locks, except for WAL_READ_LOCK(0),
are held exclusively while reconstructing the global shared WAL-index
during recovery.  

Append a new transaction to the end of the WAL

An exclusive lock is held on WAL_WRITE_LOCK while adding new
frame onto the end of a WAL file.  

Read content from the database and WAL as part of a transaction

Run a checkpoint

Reset the WAL file

A WAL reset means to rewind the WAL and start adding new frames
at the beginning.  This occurs while appending new frames to a WAL
that has mxFrame equal to nBackfill and which has no locks on
WAL_READ_LOCK(1) through WAL_READ_LOCK(4).  The WAL_WRITE_LOCK is
held.





3. Recovery


Recovery is the process of rebuilding the WAL-index so that it is
synchronized with the WAL.


Recovery is run by the first thread to connect to a WAL-mode database.
Recovery restores the WAL-index so that it accurately describes the
WAL file.  If there is no WAL file present when the first thread connects
to the database, there is nothing to recover, but the recovery process
still runs to initialize the WAL-index.


If the WAL-index is implemented as a memory-mapped file and that file is
read-only to the first thread to connect, then that thread creates an
private heap-memory ersazt WAL-index and runs the recovery routine to
populate that private WAL-index.  The same data results, but it is held
privately rather that being written into the public shared memory area.


Recovery works by doing a single pass over the WAL, from beginning to end.
The checksums are verified on each frame of the WAL as it is read.  The
scan stops at the end of the file or at the first invalid checksum.
The mxFrame field is set to the index of the last valid commit frame
in WAL.  Since WAL frame numbers are indexed starting with 1, mxFrame is
also the number of valid frames in the WAL.  A "commit frame" is a frame
that has a non-zero value in bytes 4 through 7 of the frame header.
Since the recovery procedure has no way of knowing how many frames of the
WAL might have previously been copied back into the database, it initializes
the nBackfill value to zero.


During recovery of the global shared-memory WAL-index, exclusive locks are
held on WAL_WRITE_LOCK, WAL_CKPT_LOCK, WAL_RECOVER_LOCK, and WAL_READ_LOCK(1) through WAL_READ_LOCK(4).  In other words, all locks associated with the
WAL-index except for WAL_READ_LOCK(0) are held exclusively.  This prevents
any other thread from writing the database and from reading any transactions
that are held in the WAL, until the recovery is complete.
This page last modified on  2019-04-17 15:17:39 UTCwalformat.html
ã†ã«‚p       /Õq#Generated Columns1. Introduction

Generated columns (also sometimes called "computed columns")
are columns of a table whose values are a function of other columns
in the same row.
Generated columns can be read, but their values can not be directly
written.  The only way to change the value of a generated column is to
modify the values of the other columns used to calculate
the generated column.

2. Syntax

Syntactically, generated columns are designated using a
"GENERATED ALWAYS" column-constraint.  For example:

CREATE TABLE t1(
   a INTEGER PRIMARY KEY,
   b INT,
   c TEXT,
   d INT GENERATED ALWAYS AS (a*abs(b)) VIRTUAL,
   e TEXT GENERATED ALWAYS AS (substr(c,b,b+1)) STORED
);


The statement above has three ordinary columns, "a" (the PRIMARY KEY),
"b", and "c", and two generated columns "d" and "e".

The "GENERATED ALWAYS" keywords at the beginning of the constraint
and the "VIRTUAL" or "STORED" keyword at the end are all optional.
Only the "AS" keyword and the parenthesized expression are required.
If the trailing "VIRTUAL" or "STORED" keyword is omitted, then
VIRTUAL is the default.  Hence, the example statement above could
be simplified to just:

CREATE TABLE t1(
   a INTEGER PRIMARY KEY,
   b INT,
   c TEXT,
   d INT AS (a*abs(b)),
   e TEXT AS (substr(c,b,b+1)) STORED
);


2.1. VIRTUAL versus STORED columns

Generated columns can be either VIRTUAL or STORED.  The value of
a VIRTUAL column is c$ÐY‚o
5ƒ g)WAL-mode File FormatThis document describes low-level details on how WAL mode is
implemented on unix and windows.

The separate file format description provides details on the
structure of a database file and of the write-head log file used in
WAL mode.  But details of the locking protocol and of the format
of the WAL-index are deliberately omitted since those details
are left to discretion of individual VFS implementations.  This
document fills in those missing details for the unix and windows VFSes.

For completeness, some of the higher level formatting information
contains in the file format document and elsewhere is replicated here,
when it pertains to WAL mode processing.

1. Files On Disk

When in active use, the state of a WAL mode database is described
by three separate files:


 The main database file with an arbitrary name "X".
 The write-ahead log file, usually named "X-wal".
 The wal-index file, usually named "X-shm".


1.1. The Main Database File

The format of the main database file is as described in the
file format document.  The file format version numbers at offsets
18 and 19 into the main database must both be 2 to indicate that the
database is in WAL mode.  The main database may have an arbitrary
name allowed by the underlying filesystem.  No special file suffixes
are required, though ".db", ".sqlite", and ".sqlite3" seem to be
popular choices.

1.2. The Write-Ahead-Log or "-wal" File
The write-ahead log or "wal" file is a roll-forward journal
that records transactions that have been committed but not yet applied
to the main database.  Details on the format of the wal file are
describe in the WAL format subsection of the main file format
document.  The wal file is named by appending the four characters
"-wal" to the end of the name of the main database file.  Except
on 8+3 filesystems, such names are not allowed, and in that case
the file suffix is changed to ".WAL".  But as 8+3 filesystems are
increasingly rare, that exceptional case can usually be ignored.



1.3. The Wal-Index or "-shm" file
The wal-index file or "shm" file is not actually used as a file.
Rather, individual database clients omputed when read, whereas the value of a STORED
column is computed when the row is written.  STORED columns take up space
in the database file, whereas VIRTUAL columns use more CPU cycles when
being read.

From the point of view of SQL, STORED and VIRTUAL columns are almost
exactly the same.  Queries against either class of generated column
produce the same results.  The only functional difference is that
one cannot add new STORED columns using the
ALTER TABLE ADD COLUMN command.  Only VIRTUAL columns can be added
using ALTER TABLE.

2.2. Capabilities



Generated columns can have a datatype.  SQLite attempts to transform
the result of the generating expression into that datatype using the
same affinity rules as for ordinary columns.


Generated columns may have NOT NULL, CHECK, and UNIQUE constraints,
and foreign key constraints, just like ordinary columns.


Generated columns can participate in indexes, just like ordinary
columns.


The expression of a generated column can refer to any of the
other declared columns in the table, including other generated columns,
as long as the expression does not directly or indirectly refer back
to itself.


Generated columns can occur anywhere in the table definition.  Generated
columns can be interspersed among ordinary columns.  It is not necessary
to put generated columns at the end of the list of columns in the
table definition, as is shown in the examples above.



2.3. Limitations



Generated columns may not have a default value (they may not use the
"DEFAULT" clause).  The value of a generated column is always the value
specified by the expression that follows the "AS" keyword.


Generated columns may not be used as part of the PRIMARY KEY.
(Future versions of SQLite might relax this constraint for STORED columns.)


The expression of a generated column may only reference
constant literals and columns within the same row, and may only use
scalar deterministic functions.  The expression may not use subqueries,
aggregate functions, window functions, or table-valued functions.


The expression of a generated column may refer to other generated columns
in the same row, but no generated column can depend upon itself, either
directly or indirectly.  

The expression of a generated column may not directly reference
the ROWID, though it can reference the INTEGER PRIMARY KEY column,
which is often the same thing.


Every table must have at least one non-generated column.


It is not possible to ALTER TABLE ADD COLUMN a STORED column.
One can add a VIRTUAL column, however.


The datatype and collating sequence of the generated column are determined
only by the datatype and COLLATE clause on the column definition.
The datatype and collating sequence of the GENERATED ALWAYS AS expression
have no affect on the datatype and collating sequence of the column itself.


Generated columns are not included in the list of columns provided by
the PRAGMA table_info statement.  But they are included in the output of
the newer PRAGMA table_xinfo statement.


3. Compatibility

Generated column support was added with SQLite version 3.31.0
(2020-01-22).  If an earlier version of SQLite attempts to read
a database file that contains a generated column in its schema, then
that earlier version will perceive the generated column syntax as an
error and will report that the database schema is corrupt.

To clarify:  SQLite version 3.31.0 can read and write any database
created by any prior version of SQLite going back to 
SQLite 3.0.0 (2004-06-18).  And, earlier versions of SQLite,
prior to 3.31.0, can read and write databases created by SQLite
version 3.31.0 and later as long
as the database schema does not contain features, such as
generated columns, that are not understood by the earlier version.
Problems only arise if you create a new database that contains
generated columns, using SQLite version 3.31.0 or later, and then
try to read or write that database file using an earlier version of
SQLite that does not understand generated columns.
This page last modified on  2022-11-09 20:09:19 UTCgencol.html&criticism of the current OpenDocument
design.  The point of this essay is to suggest ways to improve
future file format designs.

About OpenDocument And OpenDocument Presentation


The OpenDocument file format is used for office applications:
word processors, spreadsheets, and presentations.  It was originally
designed for the OpenOffice suite but has since been incorporated into
other desktop application suites.  The OpenOffice application has been
forked and renamed a few times.  This author's primary use for OpenDocument is 
building slide presentations with either 
NeoOffice on Mac, or
LibreOffice on Linux and Windows.


An OpenDocument Presentation or "ODP" file is a
ZIP archive containing
XML files describing presentation slides and separate image files for the
various images that are included as part of the presentation.
(OpenDocument word processor and spreadsheet files are similarly
structured but are not considered by this article.) The reader can
easily see the content of an ODP file by using the "zip -l" command.
For example, the following is the "zip -l" output from a 49-slide presentation
about SQLite from the 2014
SouthEast LinuxFest
conference:


Archive:  self2014.odp
  Length      Date    Time    Name
---------  ---------- -----   ----
       47  2014-06-21 12:34   mimetype
        0  2014-06-21 12:34   Configurations2/statusbar/
        0  2014-06-21 12:34   Configurations2/accelerator/current.xml
        0  2014-06-21 12:34   Configurations2/floater/
        0  2014-06-21 12:34   Configurations2/popupmenu/
        0  2014-06-21 12:34   Configurations2/progressbar/
        0  2014-06-21 12:34   Configurations2/menubar/
        0  2014-06-21 12:34   Configurations2/toolbar/
        0  2014-06-21 12:34   Configurations2/images/Bitmaps/
    54702  2014-06-21 12:34   Pictures/10000000000001F40000018C595A5A3D.png
    46269  2014-06-21 12:34   Pictures/100000000000012C000000A8ED96BFD9.png
... 58 other pictures omitted...
    13013  2014-06-21 12:34   Pictures/10000000000000EE0000004765E03BA8.png
  1005059  2014-06-21 12:34   Pictures/10000000000004760000034223EACEFD.png
   211831  2014-06-21 12:34   content.xml
    46169  2014-06-21 12:34   styles.xml
     1001  2014-06-21 12:34   meta.xml
     9291  2014-06-21 12:34   Thumbnails/thumbnail.png
    38705  2014-06-21 12:34   Thumbnails/thumbnail.pdf
     9664  2014-06-21 12:34   settings.xml
     9704  2014-06-21 12:34   META-INF/manifest.xml
---------                     -------
 10961006                     78 files



The ODP ZIP archive contains four different XML files:
content.xml, styles.xml, meta.xml, and settings.xml.  Those four files
define the slide layout, text content, and styling.  This particular
presentation contains 62 images, ranging from full-screen pictures to
tiny icons, each stored as a separate file in the Pictures
folder.  The "mimetype" file contains a single line of text that says:


application/vnd.oasis.opendocument.presentation


The purpose of the other files and folders is presently 
unknown to the author but is probably not difficult to figure out.

Limitations Of The OpenDocument Presentation Format


The use of a ZIP archive to encapsulate XML files plus resources is an
elegant approach to an application file format.
It is clearly superior to a custom binary file format.
But using an SQLite database as the
container, instead of ZIP, would be more elegant still.

A ZIP archive is basically a key/value database, optimized for
the case of write-once/read-many and for a relatively small number
of distinct keys (a few hundred to a few thousand) each with a large BLOB
as its value.  A ZIP archive can be viewed as a "pile-of-files"
database.  This works, but it has some shortcomings relative to an
SQLite database, as follows:


Incremental update is hard.

It is difficult to update individual entries in a ZIP archive.
It is especially difficult to update individual entries in a ZIP
archive in a way that does not destroy
the entire document if the computer loses power and/or crashes
in the middle of the update.  It is not impossi'ble to do this, but
it is sufficiently difficult that nobody actually does it.  Instead, whenever
the user selects "File/Save", the entire ZIP archive is rewritten.  
Hence, "File/Save" takes longer than it ought, especially on
older hardware.  Newer machines are faster, but it is still bothersome
that changing a single character in a 50 megabyte presentation causes one
to burn through 50 megabytes of the finite write life on the SSD.

Startup is slow.

In keeping with the pile-of-files theme, OpenDocument stores all slide 
content in a single big XML file named "content.xml".  
LibreOffice reads and parses this entire file just to display
the first slide.
LibreOffice also seems to
read all images into memory as well, which makes sense seeing as when
the user does "File/Save" it is going to have to write them all back out
again, even though none of them changed.  The net effect is that
start-up is slow.  Double-clicking an OpenDocument file brings up a
progress bar rather than the first slide.
This results in a bad user experience.
The situation grows ever more annoying as
the document size increases.

More memory is required.

Because ZIP archives are optimized for storing big chunks of content, they
encourage a style of programming where the entire document is read into
memory at startup, all editing occurs in memory, then the entire document
is written to disk during "File/Save".  OpenOffice and its descendants
embrace that pattern.


One might argue that it is ok, in this era of multi-gigabyte desktops, to
read the entire document into memory.
But it is not ok.
For one, the amount of memory used far exceeds the (compressed) file size
on disk.  So a 50MB presentation might take 200MB or more RAM.  
That still is not a problem if one only edits a single document at a time.  
But when working on a talk, this author will typically have 10 or 15 different 
presentations up all at the same
time (to facilitate copy/paste of slides from past presentation) and so
gigabytes of memory are required.
Add in an open web browser or two and a few other 
desktop apps, and suddenly the disk is whirling and the machine is swapping.
And even having just a single document is a problem when working
on an inexpensive Chromebook retrofitted with Ubuntu.
Using less memory is always better.


Crash recovery is difficult.

The descendants of OpenOffice tend to segfault more often than commercial
competitors.  Perhaps for this reason, the OpenOffice forks make
periodic backups of their in-memory documents so that users do not lose
all pending edits when the inevitable application crash does occur.
This causes frustrating pauses in the application for the few seconds
while each backup is being made.
After restarting from a crash, the user is presented with a dialog box
that walks them through the recovery process.  Managing the crash
recovery this way involves lots of extra application logic and is
generally an annoyance to the user.

Content is inaccessible.

One cannot easily view, change, or extract the content of an 
OpenDocument presentation using generic tools.
The only reasonable way to view or edit an OpenDocument document is to open
it up using an application that is specifically designed to read or write
OpenDocument (read: LibreOffice or one of its cousins).  The situation
could be worse.  One can extract and view individual images (say) from
a presentation using just the "zip" archiver tool.  But it is not reasonable
try to extract the text from a slide.  Remember that all content is stored
in a single "context.xml" file.  That file is XML, so it is a text file.
But it is not a text file that can be managed with an ordinary text
editor.  For the example presentation above, the content.xml file
consist of exactly two lines. The first line of the file is just:


&lt;?xml version="1.0" encoding="UTF-8"?&gt;


The second line of the file contains 211792 characters of
impenetrable XML.  Yes, 211792 characters all on one line.
This file is a good stress-test for a text editor.
Thankfully, the file is not some obscure
binary format, but( in terms of accessibility, it might as well be
written in Klingon.


First Improvement:  Replace ZIP with SQLite


Let us suppose that instead of using a ZIP archive to store its files,
OpenDocument used a very simple SQLite database with the following
single-table schema:


CREATE TABLE OpenDocTree(
  filename TEXT PRIMARY KEY,  -- Name of file
  filesize BIGINT,            -- Size of file after decompression
  content BLOB                -- Compressed file content
);



For this first experiment, nothing else about the file format is changed.
The OpenDocument is still a pile-of-files, only now each file is a row
in an SQLite database rather than an entry in a ZIP archive.
This simple change does not use the power of a relational
database.  Even so, this simple change shows some improvements.




Surprisingly, using SQLite in place of ZIP makes the presentation
file smaller.  Really.  One would think that a relational database file
would be larger than a ZIP archive, but at least in the case of NeoOffice
that is not so.  The following is an actual screen-scrape showing
the sizes of the same NeoOffice presentation, both in its original 
ZIP archive format as generated by NeoOffice (self2014.odp), and 
as repacked as an SQLite database using the 
SQLAR utility:


-rw-r--r--  1 drh  staff  10514994 Jun  8 14:32 self2014.odp
-rw-r--r--  1 drh  staff  10464256 Jun  8 14:37 self2014.sqlar
-rw-r--r--  1 drh  staff  10416644 Jun  8 14:40 zip.odp



The SQLite database file ("self2014.sqlar") is about a
half percent smaller than the equivalent ODP file!  How can this be?
Apparently the ZIP archive generator logic in NeoOffice
is not as efficient as it could be, because when the same pile-of-files
is recompressed using the command-line "zip" utility, one gets a file
("zip.odp") that is smaller still, by another half percent, as seen
in the third line above.  So, a well-written ZIP archive
can be slightly smaller than the equivalent SQLite database, as one would
expect.  But the difference is slight.  The key take-away is that an
SQLite database is size-competitive with a ZIP archive.


The other advantage to using SQLite in place of
ZIP is that the document can now be updated incrementally, without risk
of corrupting the document if a power loss or other crash occurs in the
middle of the update.  (Remember that writes to 
SQLite databases are atomic.)   True, all the
content is still kept in a single big XML file ("content.xml") which must
be completely rewritten if so much as a single character changes.  But
with SQLite, only that one file needs to change.  The other 77 files in the
repository can remain unaltered.  They do not all have to be rewritten,
which in turn makes "File/Save" run much faster and saves wear on SSDs.

Second Improvement:  Split content into smaller pieces


A pile-of-files encourages content to be stored in a few large chunks.
In the case of ODP, there are just four XML files that define the layout
off all slides in a presentation.  An SQLite database allows storing
information in a few large chunks, but SQLite is also adept and efficient
at storing information in numerous smaller pieces.


So then, instead of storing all content for all slides in a single
oversized XML file ("content.xml"), suppose there was a separate table
for storing the content of each slide separately.  The table schema
might look something like this:


CREATE TABLE slide(
  pageNumber INTEGER,   -- The slide page number
  slideContent TEXT     -- Slide content as XML or JSON
);
CREATE INDEX slide_pgnum ON slide(pageNumber); -- Optional


The content of each slide could still be stored as compressed XML.
But now each page is stored separately.  So when opening a new document,
the application could simply run:


SELECT slideContent FROM slide WHERE pageNumber=1;


This query will quickly and efficiently return the content of the first
slide, which could then be speedily parsed and displayed to the user.
Only one page needs to be read and parsed in order render the first screen,
which means that the first screen appears much fast)er and
there is no longer a need for an annoying progress bar.

If the application wanted
to keep all content in memory, it could continue reading and parsing the
other pages using a background thread after drawing the first page.  Or,
since reading from SQLite is so efficient, the application might 
instead choose to reduce its memory footprint and only keep a single
slide in memory at a time.  Or maybe it keeps the current slide and the
next slide in memory, to facility rapid transitions to the next slide.


Notice that dividing up the content into smaller pieces using an SQLite
table gives flexibility to the implementation.  The application can choose
to read all content into memory at startup.  Or it can read just a
few pages into memory and keep the rest on disk.  Or it can read just
single page into memory at a time.  And different versions of the application
can make different choices without having to make any changes to the
file format.  Such options are not available when all content is in
a single big XML file in a ZIP archive.


Splitting content into smaller pieces also helps File/Save operations
to go faster.  Instead of having to write back the content of all pages
when doing a File/Save, the application only has to write back those
pages that have actually changed.


One minor downside of splitting content into smaller pieces is that
compression does not work as well on shorter texts and so the size of
the document might increase.  But as the bulk of the document space 
is used to store images, a small reduction in the compression efficiency 
of the text content will hardly be noticeable, and is a small price 
to pay for an improved user experience.

Third Improvement:  Versioning


Once one is comfortable with the concept of storing each slide separately,
it is a small step to support versioning of the presentation.  Consider
the following schema:


CREATE TABLE slide(
  slideId INTEGER PRIMARY KEY,
  derivedFrom INTEGER REFERENCES slide,
  content TEXT     -- XML or JSON or whatever
);
CREATE TABLE version(
  versionId INTEGER PRIMARY KEY,
  priorVersion INTEGER REFERENCES version,
  checkinTime DATETIME,   -- When this version was saved
  comment TEXT,           -- Description of this version
  manifest TEXT           -- List of integer slideIds
);



In this schema, instead of each slide having a page number that determines
its order within the presentation, each slide has a unique
integer identifier that is unrelated to where it occurs in sequence.
The order of slides in the presentation is determined by a list of
slideIds, stored as a text string in the MANIFEST column of the VERSION
table.
Since multiple entries are allowed in the VERSION table, that means that
multiple presentations can be stored in the same document.


On startup, the application first decides which version it
wants to display.  Since the versionId will naturally increase in time
and one would normally want to see the latest version, an appropriate
query might be:


SELECT manifest, versionId FROM version ORDER BY versionId DESC LIMIT 1;



Or perhaps the application would rather use the
most recent checkinTime:


SELECT manifest, versionId, max(checkinTime) FROM version;



Using a single query such as the above, the application obtains a list
of the slideIds for all slides in the presentation.  The application then
queries for the content of the first slide, and parses and displays that
content, as before.

(Aside:  Yes, that second query above that uses "max(checkinTime)"
really does work and really does return a well-defined answer in SQLite.
Such a query either returns an undefined answer or generates an error
in many other SQL database engines, but in SQLite it does what you would 
expect: it returns the manifest and versionId of the entry that has the
maximum checkinTime.)

When the user does a "File/Save", instead of overwriting the modified
slides, the application can now make new entries in the SLIDE table for
just those slides that have been added or altered.  Then it creates a
new entry in the VERSION table contai*ning the revised manifest.

The VERSION table shown above has columns to record a check-in comment
(presumably supplied by the user) and the time and date at which the File/Save
action occurred.  It also records the parent version to record the history
of changes.  Perhaps the manifest could be stored as a delta from the
parent version, though typically the manifest will be small enough that
storing a delta might be more trouble than it is worth.  The SLIDE table
also contains a derivedFrom column which could be used for delta encoding
if it is determined that saving the slide content as a delta from its
previous version is a worthwhile optimization.

So with this simple change, the ODP file now stores not just the most
recent edit to the presentation, but a history of all historic edits.  The
user would normally want to see just the most recent edition of the
presentation, but if desired, the user can now go backwards in time to 
see historical versions of the same presentation.

Or, multiple presentations could be stored within the same document.

With such a schema, the application would no longer need to make
periodic backups of the unsaved changes to a separate file to avoid lost
work in the event of a crash.  Instead, a special "pending" version could
be allocated and unsaved changes could be written into the pending version.
Because only changes would need to be written, not the entire document,
saving the pending changes would only involve writing a few kilobytes of
content, not multiple megabytes, and would take milliseconds instead of
seconds, and so it could be done frequently and silently in the background.
Then when a crash occurs and the user reboots, all (or almost all)
of their work is retained.  If the user decides to discard unsaved changes, 
they simply go back to the previous version.


There are details to fill in here.
Perhaps a screen can be provided that displays a history changes
(perhaps with a graph) allowing the user to select which version they
want to view or edit.  Perhaps some facility can be provided to merge
forks that might occur in the version history.  And perhaps the
application should provide a means to purge old and unwanted versions.
The key point is that using an SQLite database to store the content,
rather than a ZIP archive, makes all of these features much, much easier
to implement, which increases the possibility that they will eventually
get implemented.

And So Forth...


In the previous sections, we have seen how moving from a key/value
store implemented as a ZIP archive to a simple SQLite database
with just three tables can add significant capabilities to an application
file format.
We could continue to enhance the schema with new tables, with indexes
added for performance, with triggers and views for programming convenience,
and constraints to enforce consistency of content even in the face of
programming errors.  Further enhancement ideas include:

 Store an automated undo/redo stack in a database table so that
     Undo could go back into prior edit sessions.
 Add full text search capabilities to the slide deck, or across
     multiple slide decks.
 Decompose the "settings.xml" file into an SQL table that
     is more easily viewed and edited by separate applications.
 Break out the "Presentor Notes" from each slide into a separate
     table, for easier access from third-party applications and/or scripts.
 Enhance the presentation concept beyond the simple linear sequence of
     slides to allow for side-tracks and excursions to be taken depending on
     how the audience is responding.



An SQLite database has a lot of capability, which
this essay has only begun to touch upon.  But hopefully this quick glimpse
has convinced some readers that using an SQL database as an application
file format is worth a second look.


Some readers might resist using SQLite as an application
file format due to prior exposure to enterprise SQL databases and
the caveats and limitations of those other systems.  
For example, many enterprise database
engines advise against storing large strings or BLOBs in the database
and instead suggest that large strings and BLOBs be stored as separate
files and the filename stored in the database.  But SQLite 
is not like that.  Any column of an SQLite database can hold
a string or BLOB up to about a gigabyte in size.  And for strings and
BLOBs of 100 kilobytes or less, 
I/O performance is better than using separate
files.


Some readers might be reluctant to consider SQLite as an application
file format because they have been inculcated with the idea that all
SQL database schemas must be factored into third normal form and store
only small primitive data types such as strings and integers.  Certainly
relational theory is important and designers should strive to understand
it.  But, as demonstrated above, it is often quite acceptable to store
complex information as XML or JSON in text fields of a database.
Do what works, not what your database professor said you ought to do.

Review Of The Benefits Of Using SQLite


In summary,
the claim of this essay is that using SQLite as a container for an application
file format like OpenDocument
and storing lots of smaller objects in that container
works out much better than using a ZIP archive holding a few larger objects.
To wit:



An SQLite database file is approximately the same size, and in some cases
smaller, than a ZIP archive holding the same information.


The atomic update capabilities
of SQLite allow small incremental changes
to be safely written into the document.  This reduces total disk I/O
and improves File/Save performance, enhancing the user experience.


Startup time is reduced by allowing the application to read in only the
content shown for the initial screen.  This largely eliminates the
need to show a progress bar when opening a new document.  The document
just pops up immediately, further enhancing the user experience.


The memory footprint of the application can be dramatically reduced by
only loading content that is relevant to the current display and keeping
the bulk of the content on disk.  The fast query capability of SQLite
make this a viable alternative to keeping all content in memory at all times.
And when applications use less memory, it makes the entire computer more
responsive, further enhancing the user experience.


The schema of an SQL database is able to represent information more directly
and succinctly than a key/value database such as a ZIP archive.  This makes
the document content more accessible to third-party applications and scripts
and facilitates advanced features such as built-in document versioning, and
incremental saving of work in progress for recovery after a crash.



These are just a few of the benefits of using SQLite as an application file
format &mdash; the benefits that seem most likely to improve the user
experience for applications like OpenOffice.  Other applications might
benefit from SQLite in different ways. See the Application File Format
document for additional ideas.


Finally, let us reiterate that this essay is a thought experiment.
The OpenDocument format is well-established and already well-designed.
Nobody really believes that OpenDocument should be changed to use SQLite
as its container instead of ZIP.  Nor is this article a criticism of
OpenDocument for not choosing SQLite as its container since OpenDocument
predates SQLite.  Rather, the point of this article is to use OpenDocument
as a concrete example of how SQLite can be used to build better 
application file formats for future projects.
This page last modified on  2018-11-30 21:04:18 UTCaffcase1.html
¿^‚q
O‚þY'What If OpenDocument Used SQLite?What If OpenDocument Used SQLite?

Introduction

Suppose the
OpenDocument file format,
and specifically the "ODP" OpenDocument Presentation format, were
built around SQLite.  Benefits would include:

Smaller documents
Faster File/Save times
Faster startup times
Less memory used
Document versioning
A better user experience



Note that this is only a thought experiment.
We are not suggesting that OpenDocument be changed.
Nor is this article a %-e zip archive without compression. 8 means the
                    raw deflate algorithm. 


3.2. Virtual Table Interface (read/write access)

In order to create or modify an existing zip file, a "zipfile" virtual 
table must be created in the database schema. The CREATE VIRTUAL TABLE
statement expects a path to the zip file as its only argument. For example, to
write to zip file "test.zip" in the current directory, a zipfile table may be
created using:

CREATE VIRTUAL TABLE temp.zip USING zipfile('test.zip');


Such a virtual table has the same columns as the table-valued function
described in the previous section. It may be read from using a SELECT 
statement in the same way as the table-valued function can. 

Using the virtual table interface, new entries may be added to a zip
archive by inserting new rows into the virtual table. Entries may be
removed by deleting rows or modified by updating them.


3.2.1. Adding Entries to a Zip Archive

Entries may be added to a zip archive by inserting new rows. The easiest
way to do this is to specify values for the "name" and "data" columns only and
have zipfile fill in sensible defaults for other fields.  To insert a directory
into the archive, set the "data" column to NULL.  For example, to add the
directory "dir1" and the file "m.txt" containing the text "abcdefghi" to zip
archive "test.zip":

INSERT INTO temp.zip(name, data) VALUES('dir1', NULL);           -- Add directory 
INSERT INTO temp.zip(name, data) VALUES('m.txt', 'abcdefghi');   -- Add regular file 


When a directory is inserted, if the "name" value does not end with
a '/' character, the zipfile module appends one. This is necessary for
compatibility with other programs (most notably "info-zip") that 
manipulate zip archives.

To insert a symbolic link, the user must also supply a "mode" value.
For example, to add a symbolic link from "link.txt" to "m.txt":

INSERT INTO temp.zip(name, mode, data) VALUES('link.txt', 'lrwxrw-rw-', 'abcdefghi');


The following rules and caveats apply to the values specified as part of
each INSERT statement:


Columns  Notes
 name
   A non-NULL text value must be specified for the name column. 
       It is an error if the specified name already exists in the
       archive. 

 mode
   If NULL is inserted into the mode column, then the mode of the
       new archive entry is automatically set to either 33188 (-rw-r--r--)
       or 16877 (drwxr-xr-x), depending on whether or not the values 
       specified for columns "sz", "data" and "rawdata" indicate that
       the new entry is a directory.
       
       If the specified value is an integer (or text that looks like
       an integer), it is inserted verbatim. If the value is not a valid UNIX
       mode, some programs may behave unexpectedly when extracting files
       from the archive.

       Finally, if the value specified for this column is not an integer
       or a NULL, then it is assumed to be a UNIX permissions string similar
       to those output by the "ls -l" command (e.g. "-rw-r--r--", "drwxr-xr-x"
       etc.). In this case, if the string cannot be parsed it is an error.

 mtime
   If NULL is inserted into the mtime column, then the timestamp
       of the new entry is set to the current time. Otherwise, the specified
       value is interpreted as an integer and used as is.

 sz
   This column must be set to NULL. If a non-NULL value is inserted into
       this column, or if a new non-NULL value is provided using an UPDATE
       statement, it is an error.

 rawdata
   This column must be set to NULL. If a non-NULL value is inserted into
       this column, or if a new non-NULL value is provided using an UPDATE
       statement, it is an error.

 data

       To insert a directory into the archive, this field must be set to 
       NULL. In this case if a value was explicitly specified for the "mode"
       column, then it must be consistent with a directory (i.e. it must be
       true that (mode & 0040000)=0040000). 

       Otherwise, the value inserted into this field is the file contents
       for a regular file, or the target of a symbolic link.
 method

       This field must be set one of integer values 0 and 8, or else to
       NULL. 

       For a directory entry, any value inserted into this field is ignored.
       Otherwise, if it is set to 0, then the file data or symbolic link
       target is stored as is in the zip archive and the compression method
       set to 0. If it is set to 8, then the file data or link target is
       compressed using deflate compression before it is stored and the
       compression method set to 8. Finally, if a NULL value is written
       to this field, the zipfile module automatically decides whether
       or not to compress the data before storing it.


 Specifying an explicit value for the rowid field as part of an INSERT
statement is not supported. Any value supplied is ignored.

3.2.2.  Deleting Zip Archive Entries 

Records may be removed from an existing zip archive by deleting the
corresponding rows. For example, to remove file "m.txt" from zip archive
"test.zip" using the virtual table created above:

DELETE FROM temp.zip WHERE name = 'm.txt';


Note that deleting records from a zip archive does not reclaim the 
space used within the archive - it merely removes an entry from the
archives "Central Directory Structure", making the entry inaccessible.
One way to work around this inefficiency is to create a new zip 
archive based on the contents of the edited archive. For example, after
editing the archive accessed via virtual table temp.zzz:

-- Create a new, empty, archive: 
CREATE VIRTUAL TABLE temp.newzip USING zipfile('new.zip');

-- Copy the contents of the existing archive into the new archive
INSERT INTO temp.newzip(name, mode, mtime, data, method)
    SELECT name, mode, mtime, data, method FROM temp.zzz;


3.2.3.  Updating Existing Zip Archive Entries 

Existing zip archive entries may be modified using UPDATE statements.

The three leftmost columns of a zipfile virtual table, "name", "mode" 
and "mtime", may each be set to any value that may be inserted into the same
column (see above). If either "mode" or "mtime" is set to NULL, the final 
value is determined as described for an INSERT of a NULL value - the current
time for "mtime" and either 33188 or 16877 for "mode", depending on whether 
or not the values specified for the next four columns of the zipfile table
indicate that the entry is a directory or a file.

It is an error to attempt to set the sz or rawdata field to any value
other than NULL. 

The data and method columns may also be set as described for an INSERT
above.  

3.3.  The zipfile() Aggregate Function 

 New zip archives may be constructed entirely within memory using the
zipfile() aggregate function. Each row visited by the aggregate function
adds an entry to the zip archive. The value returned is a blob containing
the entire archive image.

 The zipfile() aggregate function may be called with 2, 4 or 5 
arguments. If it is called with 5 arguments, then the entry added to
the archive is equivalent to inserting the same values into the "name", 
"mode", "mtime", "data" and "method" columns of a zipfile virtual table.

 If zipfile() is invoked with 2 arguments, then the entry added to
the archive is equivalent to that added by inserting the same two values into
the "name" and "data" columns of a zipfile virtual table, with all
other values set to NULL. If invoked with 4 arguments, it is equivalent
to inserting the 4 values into the "name", "mode", "mtime" and "data"
columns. In other words, the following pairs of queries are equivalent:

SELECT zipfile(name, data) ...
SELECT zipfile(name, NULL, NULL, data, NULL) ...

SELECT zipfile(name, mode, mtime, data) ...
SELECT zipfile(name, mode, mtime, data, NULL) ...


 For example, to create an archive containing two text files, "a.txt" and
"b.txt", containing the text "abc" and "123" respectively:

WITH contents(name, data) AS (
  VALUES('a.txt', 'abc') UNION ALL
  VALUES('b.txt', '123')
)
SELECT zipfile(name, data) FROM contents;

This page last modified on  2018-03-10 12:09:19 UTCzipfile.html
ŒŒÜd‚r
?¸w%The SQLite Zipfile Module1. Overview

 The zipfile module provides read/write access to simple 
ZIP archives.
The current implementation has the following restrictions:


   Does not support encryption.
   Does not support ZIP archives that span multiple files.
   Does not support zip64 extensions.
   The only compression algorithm supported is
       "deflate".


 Some or all of these restrictions may be removed in the future.

2. Obtaining and Compiling Zipfile

The code for the zipfile module is found in the 
ext/misc/zipfile.c
file of the
main SQLite source tree.
It may be compiled into an SQLite 
loadable extension using a command like:

gcc -g -fPIC -shared zipfile.c -o zipfile.so


Alternatively, the zipfile.c file may be compiled into the application. 
In this case, the following function should be invoked to register the
extension with each new database connection:

int sqlite3_zipfile_init(sqlite3 *db, void*, void*);


 The first argument passed should be the database handle to register the
extension with. The second and third arguments should both be passed 0.

 Zipfile is included in most builds of the command-line shell.

3. Using Zipfile

The zipfile module provides three similar interfaces for accessing, updating
and creating zip file archives:


   A table-valued function, which provides read-only access to existing
       archives, either from the file-system or in-memory.
   A virtual table, which provides read and write access to archives
       stored in the file-system.
   An SQL aggregate function, which can be used to create new archives
       in memory.


The zipfile module provides two similar interfaces for accessing zip
archives. A table-valued function, which provides read-only access to
existing archives, and a virtual table interface, which provides both
read and write access.

3.1. Table-Valued Function (read-only access)

For reading existing zip archives, the Zipfile module provides a
table-valued function that accepts a single argument. If the argument
is a text value, then it is a path to a zip archive to read from the
file-system. Or, if the argument is an SQL blob, then it is the zip
archive data itself.

For example, to inspect the contents of zip archive "test.zip" from 
the current directory:

SELECT * FROM zipfile('test.zip');


Or, from the SQLite shell tool (the readfile() 
function reads the contents of a file from the file-system and returns it as a
blob):

SELECT * FROM zipfile( readfile('test.zip') );


The table-valued function returns one row for each record (file, 
directory or symbolic link) in the zip archive. Each row has the 
following columns:


Column&nbsp;NameContents
name  File name/path for the zip file record.
mode  UNIX mode, as returned by stat(2) for the zip file record (an
                  integer). This identifies the type of record (file, directory
                  or symbolic link), and the associated user/group/all 
                  permissions.
mtime  UTC timestamp, in seconds since the UNIX epoch (an integer).
sz     Size of associated data in bytes after it has been 
                   uncompressed (an integer).
rawdata  Raw (possibly compressed) data associated with zip file
                     entry (a blob).
data  If the compression method for the record is either 0 or 8
                  (see below), then the uncompressed data associated with the
                  zip file entry. Or, if the compression method is not 0 or 8, 
                  this column contains a NULL value.
method  The compression method used to compress the data (an
                    integer). The value 0 indicates that the data is stored
                    in th,
ËËœ1‚s    O·o9SQLite Copyright Release TemplateCopyright Release for
Contributions To SQLite



SQLite is software that implements an embeddable SQL database engine.
SQLite is available for free download from http://www.sqlite.org/.
The principal author and maintainer of SQLite has disclaimed all
copyright interest in his contributions to SQLite
and thus released his contributions into the public domain.
In order to keep the SQLite software unencumbered by copyright
claims, the principal author asks others who may from time to
time contribute changes and enhancements to likewise disclaim
their own individual copyright interest.



Because the SQLite software found at http://www.sqlite.org/ is in the
public domain, anyone is free to download the SQLite software
from that website, make changes to the software, use, distribute,
or sell the modified software, under either the original name or
under some new name, without any need to obtain permission, pay
royalties, acknowledge the original source of the software, or
in any other way compensate, identify, or notify the original authors.  
Nobody is in any way compelled to contribute their SQLite changes and 
enhancements back to the SQLite website.  This document concerns
only changes and enhancements to SQLite that are intentionally and
deliberately contributed back to the SQLite website.  



For the purposes of this document, "SQLite software" shall mean any
computer source code, documentation, makefiles, test scripts, or
other information that is published on the SQLite website, 
http://www.sqlite.org/.  Precompiled binaries are excluded from
the definition of "SQLite software" in this document because the
process of compiling the software may introduce information from
outside sources which is not properly a part of SQLite.



The header comments on the SQLite source files exhort the reader to
share freely and to never take more than one gives.
In the spirit of that exhortation I make the following declarations:




I dedicate to the public domain 
any and all copyright interest in the SQLite software that
was publicly available on the SQLite website (http://www.sqlite.org/) prior
to the date of the signature below and any changes or enhancements to
the SQLite software 
that I may cause to be published on that website in the future.
I make this dedication for the benefit of the public at large and
to the detriment of my heirs and successors.  I intend this
dedication to be an overt act of relinquishment in perpetuity of
all present and future rights to the SQLite software under copyright
law.



To the best of my knowledge and belief, the changes and enhancements that
I have contributed to SQLite are either originally written by me
or are derived from prior works which I have verified are also
in the public domain and are not subject to claims of copyright
by other parties.



To the best of my knowledge and belief, no individual, business, organization,
government, or other entity has any copyright interest
in the SQLite software as it existed on the
SQLite website as of the date on the signature line below.



I agree never to publish any additional information
to the SQLite website (by CVS, email, scp, FTP, or any other means) unless
that information is an original work of authorship by me or is derived from 
prior published versions of SQLite.
I agree never to copy and paste code into the SQLite code base from
other sources.
I agree never to publish on the SQLite website any information that
would violate a law or breach a contract.







Signature:
&nbsp;
&nbsp;
&nbsp;

Date:


Name (printed):copyright-release.html1ma is issued.
    Unknown pragmas are simply ignored. This means if there is a typo in 
    a pragma statement the library does not inform the user of the fact.
Some pragmas take effect during the SQL compilation stage, not the
    execution stage. This means if using the C-language sqlite3_prepare(), 
    sqlite3_step(), sqlite3_finalize() API (or similar in a wrapper 
    interface), the pragma may run during the sqlite3_prepare() call,
    not during the sqlite3_step() call as normal SQL statements do.
    Or the pragma might run during sqlite3_step() just like normal
    SQL statements.  Whether or not the pragma runs during sqlite3_prepare()
    or sqlite3_step() depends on the pragma and on the specific release
    of SQLite.
The EXPLAIN and EXPLAIN QUERY PLAN prefixes to SQL statements
    only affect the behavior of the statement during sqlite3_step().
    That means that PRAGMA statements that take effect during
    sqlite3_prepare() will behave the same way regardless of whether or
    not they are prefaced by "EXPLAIN".


The C-language API for SQLite provides the SQLITE_FCNTL_PRAGMA
file control which gives VFS implementations the
opportunity to add new PRAGMA statements or to override the meaning of
built-in PRAGMA statements.



PRAGMA command syntax
pragma-stmt:
hide
 
 

pragma-value:
hide
 
 

signed-number:
show
 
 







A pragma can take either zero or one argument.  The argument is may be either
in parentheses or it may be separated from the pragma name by an equal sign.
The two syntaxes yield identical results.
In many pragmas, the argument is a boolean.  The boolean can be one of:



1 yes true on0 no false off


Keyword arguments can optionally appear in quotes.  
(Example:  'yes' &#91;FALSE&#93;.) Some pragmas
takes a string literal as their argument.  When pragma takes a keyword
argument, it will usually also take a numeric equivalent as well.
For example, "0" and "no" mean the same thing, as does "1" and "yes".
When querying the value of a setting, many pragmas return the number
rather than the keyword.

A pragma may have an optional schema-name
before the pragma name.
The schema-name is the name of an ATTACH-ed database 
or "main" or "temp" for the main and the TEMP databases.  If the optional
schema name is omitted, "main" is assumed.  In some pragmas, the schema
name is meaningless and is simply ignored.  In the documentation below,
pragmas for which the schema name is meaningful are shown with a
"schema." prefix.



PRAGMA functions



PRAGMAs that return results and that have no side-effects can be 
accessed from ordinary SELECT statements as table-valued functions.
For each participating PRAGMA, the corresponding table-valued function
has the same name as the PRAGMA with a 7-character "pragma_" prefix.
The PRAGMA argument and schema, if any, are passed as arguments to the
table-valued function, with the schema as an optional, last argument.

For example, information about the columns in an index can be
read using the index_info pragma as follows:


PRAGMA index_info('idx52');


Or, the same content can be read using:


SELECT * FROM pragma_index_info('idx52');


The advantage of the table-valued function format is that the query
can return just a subset of the PRAGMA columns, can include a WHERE clause,
can use aggregate functions, and the table-valued function can be just
one of several data sources in a join.
For example, to get a list of all indexed columns in a schema, one
could query:


SELECT DISTINCT m.name || '.' || ii.name AS 'indexed-columns'
  FROM sqlite_schema AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table'
 ORDER BY 1;



Additional notes:


Table-valued functions exist only for built-in PRAGMAs, not for PRAGMAs
defined using the SQLITE_FCNTL_PRAGMA file control.

Table-valued functions exist only for PRAGMAs that return results and
that have no side-effects.

This feature could be used to implement
information schema
by first creating a separate schema using

ATTACH ':memory:' AS 'information_schema';

Then cr2eating
VIEWs in that schema that implement the official information schema
tables using table-valued PRAGMA functions.

This feature is experimental and is subject to change.  Further documentation
will become available if and when the table-valued functions for PRAGMAs
feature becomes officially supported.

The table-valued functions for PRAGMA feature was added
in SQLite version 3.16.0 (2017-01-02).  Prior versions of SQLite
cannot use this feature.



List Of PRAGMAs


analysis_limit
application_id
auto_vacuum
automatic_index
busy_timeout
cache_size
cache_spill
case_sensitive_like
cell_size_check
checkpoint_fullfsync
collation_list
compile_options
count_changes&sup1;
data_store_directory&sup1;
data_version
database_list
default_cache_size&sup1;
defer_foreign_keys
empty_result_callbacks&sup1;
encoding
foreign_key_check
foreign_key_list
foreign_keys
freelist_count
full_column_names&sup1;
fullfsync
function_list
hard_heap_limit
ignore_check_constraints
incremental_vacuum
index_info
index_list
index_xinfo
integrity_check
journal_mode
journal_size_limit
legacy_alter_table
legacy_file_format
locking_mode
max_page_count
mmap_size
module_list
optimize
page_count
page_size
parser_trace&sup2;
pragma_list
query_only
quick_check
read_uncommitted
recursive_triggers
reverse_unordered_selects
schema_version&sup3;
secure_delete
short_column_names&sup1;
shrink_memory
soft_heap_limit
stats&sup3;
synchronous
table_info
table_list
table_xinfo
temp_store
temp_store_directory&sup1;
threads
trusted_schema
user_version
vdbe_addoptrace&sup2;
vdbe_debug&sup2;
vdbe_listing&sup2;
vdbe_trace&sup2;
wal_autocheckpoint
wal_checkpoint
writable_schema&sup3;



Notes:

Pragmas whose names are struck through
are deprecated. Do not use them. They exist
for historical compatibility.
These pragmas are only available in builds using non-standard
compile-time options.
These pragmas are used for testing SQLite and are not recommended
for use in application programs.

 PRAGMA analysis_limit
   PRAGMA analysis_limit;
        PRAGMA analysis_limit = N;
   Query or change a limit on the approximate ANALYZE setting.
      This is the approximate number of
      rows examined in each index by the ANALYZE command.
      If the argument N is omitted, then the analysis limit
      is unchanged.
      If the limit is zero, then the analysis limit is disabled and
      the ANALYZE command will examine all rows of each index.
      If N is greater than zero, then the analysis limit is set to N
      and subsequent ANALYZE commands will stop analyzing
      each index after it has examined approximately N rows.
      If N is a negative number or something other than an integer value,
      then the pragma behaves as if the N argument was omitted.
      In all cases, the value returned is the new analysis limit used
      for subsequent ANALYZE commands.
   This pragma can be used to help the ANALYZE command run faster
      on large databases.  The results of analysis are not as good
      when only part of each index is examined, but the results are
      usually good enough.  Setting N to 100 or 1000 allows the
      ANALYZE command to run very quickly, even on multi-gigabyte
      database files.  This pragma is particularly useful in combination
      with PRAGMA optimize.
   This pragma was added in SQLite version 3.32.0 (2020-05-22).
      The current implementation only uses the lower 31 bits of the
      N value - higher order bits are silently ignored.  Future versions
      of SQLite might begin using higher order bits.

 PRAGMA application_id
    PRAGMA schema.application_id;
     PRAGMA schema.application_id = integer ;
  
    The application_id PRAGMA is used to query or set the 32-bit
       signed big-endian "Application ID" integer located at offset
       68 into the database header.  Applications that use SQLite as their
       application file-format should set the Application ID integer to
       a unique integer so that utilities such as 
       file(1) can determine the specific
       file type rather than just reporting "SQLite3 Database".  A l3ist of
       assigned application IDs can be seen by consulting the
       magic.txt file in the SQLite source repository.

   See also the user_version pragma.

 PRAGMA auto_vacuum
    PRAGMA schema.auto_vacuum;
          PRAGMA schema.auto_vacuum = 
           0 | NONE | 1 | FULL | 2 | INCREMENTAL;

    Query or set the auto-vacuum status in the database.

    The default setting for auto-vacuum is 0 or "none",
    unless the SQLITE_DEFAULT_AUTOVACUUM compile-time option is used.
    The "none" setting means that auto-vacuum is disabled.
    When auto-vacuum is disabled and data is deleted data from a database,
    the database file remains the same size.  Unused database file 
    pages are added to a "freelist" and reused for subsequent inserts.  So
    no database file space is lost.  However, the database file does not
    shrink.  In this mode the VACUUM
    command can be used to rebuild the entire database file and
    thus reclaim unused disk space.

    When the auto-vacuum mode is 1  or "full", the freelist pages are
    moved to the end of the database file and the database file is truncated
    to remove the freelist pages at every transaction commit.
    Note, however, that auto-vacuum only truncates the freelist pages
    from the file.  Auto-vacuum does not defragment the database nor
    repack individual database pages the way that the
    VACUUM command does.  In fact, because
    it moves pages around within the file, auto-vacuum can actually
    make fragmentation worse.

    Auto-vacuuming is only possible if the database stores some
    additional information that allows each database page to be
    traced backwards to its referrer.  Therefore, auto-vacuuming must
    be turned on before any tables are created.  It is not possible
    to enable or disable auto-vacuum after a table has been created.

    When the value of auto-vacuum is 2 or "incremental" then the additional
    information needed to do auto-vacuuming is stored in the database file
    but auto-vacuuming does not occur automatically at each commit as it
    does with auto_vacuum=full.  In incremental mode, the separate
    incremental_vacuum pragma must
    be invoked to cause the auto-vacuum to occur.

    The database connection can be changed between full and incremental
    autovacuum mode at any time.  However, changing from
    "none" to "full" or "incremental" can only occur when the database 
    is new (no tables
    have yet been created) or by running the VACUUM command.  To
    change auto-vacuum modes, first use the auto_vacuum pragma to set
    the new desired mode, then invoke the VACUUM command to 
    reorganize the entire database file.  To change from "full" or
    "incremental" back to "none" always requires running VACUUM even
    on an empty database.
    

    When the auto_vacuum pragma is invoked with no arguments, it
    returns the current auto_vacuum mode.

 PRAGMA automatic_index
    PRAGMA automatic_index;
     PRAGMA automatic_index = boolean;

    Query, set, or clear the automatic indexing capability.
    Automatic indexing is enabled by default as of 
    version 3.7.17 (2013-05-20),
    but this might change in future releases of SQLite.

 PRAGMA busy_timeout
    PRAGMA busy_timeout;
         PRAGMA busy_timeout = milliseconds;
    Query or change the setting of the
    busy timeout.
    This pragma is an alternative to the sqlite3_busy_timeout() C-language
    interface which is made available as a pragma for use with language
    bindings that do not provide direct access to sqlite3_busy_timeout().

    Each database connection can only have a single
    busy handler.  This PRAGMA sets the busy handler
    for the process, possibly overwriting any previously set busy handler.

 PRAGMA cache_size
    PRAGMA schema.cache_size;
       PRAGMA schema.cache_size = pages;
       PRAGMA schema.cache_size = -kibibytes;
    Query or change the suggested maximum number of database disk pages
    that SQLite will hold in memory at once per open database file.  Whether
    or not this suggestion is hono4red is at the discretion of the
    Application Defined Page Cache.
    The default page cache that is built into SQLite honors the request,
    however alternative application-defined page cache implementations
    may choose to interpret the suggested cache size in different ways
    or to ignore it all together.
    The default suggested cache size is -2000, which means the cache size
    is limited to 2048000 bytes of memory.
    The default suggested cache size can be altered using the
    SQLITE_DEFAULT_CACHE_SIZE compile-time options.
    The TEMP database has a default suggested cache size of 0 pages.

    If the argument N is positive then the suggested cache size is set 
    to N. 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.  SQLite remembers the number of pages in the page cache,
    not the amount of memory used.  So if you set the cache size using
    a negative number and subsequently change the page size (using the
    PRAGMA page_size command) then the maximum amount of cache
    memory will go up or down in proportion to the change in page size.

    Backwards compatibility note:
    The behavior of cache_size with a negative N
    was different prior to version 3.7.10 (2012-01-16).  In
    earlier versions, the number of pages in the cache was set
    to the absolute value of N.

    When you change the cache size using the cache_size pragma, the
    change only endures for the current session.  The cache size reverts
    to the default value when the database is closed and reopened.

    The default page cache implemention does not allocate
    the full amount of cache memory all at once.  Cache memory
    is allocated in smaller chunks on an as-needed basis.  The page_cache
    setting is a (suggested) upper bound on the amount of memory that the
    cache can use, not the amount of memory it will use all of the time.
    This is the behavior of the default page cache implementation, but an
    application defined page cache is free
    to behave differently if it wants.

 PRAGMA cache_spill
    PRAGMA cache_spill;
         PRAGMA cache_spill=boolean;
         PRAGMA schema.cache_spill=N;

    The cache_spill pragma enables or disables the ability of the pager
    to spill dirty cache pages to the database file in the middle of a 
    transaction.  Cache_spill is enabled by default and most applications
    should leave it that way as cache spilling is usually advantageous.
    However, a cache spill has the side-effect of acquiring an
    EXCLUSIVE lock on the database file.  Hence, some applications that
    have large long-running transactions may want to disable cache spilling
    in order to prevent the application from acquiring an exclusive lock
    on the database until the moment that the transaction COMMITs.
    The "PRAGMA cache_spill=N" form of this pragma sets a minimum
    cache size threshold required for spilling to occur. The number of pages
    in cache must exceed both the cache_spill threshold and the maximum cache
    size set by the PRAGMA cache_size statement in order for spilling to
    occur.
    The "PRAGMA cache_spill=boolean" form of this pragma applies
    across all databases attached to the database connection.  But the
    "PRAGMA cache_spill=N" form of this statement only applies to
    the "main" schema or whatever other schema is specified as part of the
    statement.

 PRAGMA case_sensitive_like
    PRAGMA case_sensitive_like = boolean;
    The default behavior of the LIKE operator is to ignore case
    for ASCII characters. Hence, by default 'a' LIKE 'A' is
    true.  The case_sensitive_like pragma installs a new application-defined
    LIKE function that is either case sensitive or insensitive depending
    on the value of the case_sensitive_like pragma.
    When case_sensitive_like is disabled, the default LIKE behavior is
    expressed.  When case_sensitive_like is enabled, case becomes
    significant.  S5o, for example,
    'a' LIKE 'A' is false but 'a' LIKE 'a' is still true.

    This pragma uses sqlite3_create_function() to overload the
    LIKE and GLOB functions, which may override previous implementations
    of LIKE and GLOB registered by the application.  This pragma
    only changes the behavior of the SQL LIKE operator.  It does not
    change the behavior of the sqlite3_strlike() C-language interface,
    which is always case insensitive.

 PRAGMA cell_size_check
    PRAGMA cell_size_check
       PRAGMA cell_size_check = boolean;
    The cell_size_check pragma enables or disables additional sanity
    checking on database b-tree pages as they are initially read from disk.
    With cell size checking enabled, database corruption is detected earlier
    and is less likely to "spread".  However, there is a small performance
    hit for doing the extra checks and so cell size checking is turned off
    by default.

 PRAGMA checkpoint_fullfsync
    PRAGMA checkpoint_fullfsync
       PRAGMA checkpoint_fullfsync = boolean;
    Query or change the fullfsync flag for checkpoint operations.
    If this flag is set, then the F_FULLFSYNC syncing method is used
    during checkpoint operations on systems that support F_FULLFSYNC. 
    The default value of the checkpoint_fullfsync flag
    is off.  Only Mac OS-X supports F_FULLFSYNC.

    If the fullfsync flag is set, then the F_FULLFSYNC syncing
    method is used for all sync operations and the checkpoint_fullfsync
    setting is irrelevant.

 PRAGMA collation_list
    PRAGMA collation_list;
    Return a list of the collating sequences defined for the current
    database connection.

 PRAGMA compile_options
    PRAGMA compile_options;
    This pragma returns the names of compile-time options used when
    building SQLite, one option per row.  The "SQLITE_" prefix is omitted
    from the returned option names.  See also the
    sqlite3_compileoption_get() C/C++ interface and the
    sqlite_compileoption_get() SQL functions.

 PRAGMA count_changes
    PRAGMA count_changes;
       PRAGMA count_changes = boolean;

    Query or change the count-changes flag. Normally, when the
    count-changes flag is not set, INSERT, UPDATE and DELETE statements
    return no data. When count-changes is set, each of these commands 
    returns a single row of data consisting of one integer value - the
    number of rows inserted, modified or deleted by the command. The 
    returned change count does not include any insertions, modifications
    or deletions performed by triggers, any changes made automatically
    by foreign key actions, or updates caused by an upsert.

    Another way to get the row change counts is to use the
    sqlite3_changes() or sqlite3_total_changes() interfaces.
    There is a subtle different, though.  When an INSERT, UPDATE, or
    DELETE is run against a view using an INSTEAD OF trigger,
    the count_changes pragma reports the number of rows in the view
    that fired the trigger, whereas sqlite3_changes() and
    sqlite3_total_changes() do not.

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.
    
  

 PRAGMA data_store_directory
    PRAGMA data_store_directory;
      PRAGMA data_store_directory = 'directory-name';
    Query or change the value of the sqlite3_data_directory global
    variable, which windows operating-system interface backends use to
    determine where to store database files specified using a relative
    pathname.

    Changing the data_store_directory setting is not threadsafe.
    Never change the data_store_directory setting if another thread
    within the application is running any SQLite interface at the same time.
    Doing so results in undefined behavior.  Changing the data_store_directory
    setting writes to the sqlite3_data_directory global
6    variable and that global variable is not protected by a mutex.

    This facility is provided for WinRT which does not have an OS
    mechanism for reading or changing the current working directory.
    The use of this pragma in any other context is discouraged and may
    be disallowed in future releases.

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.
    
  

 PRAGMA data_version
    PRAGMA schema.data_version;
    The "PRAGMA data_version" command provides an indication that the
    database file has been modified.
    Interactive programs that hold database content in memory or that
    display database content on-screen can use the PRAGMA data_version
    command to determine if they need to flush and reload their memory
    or update the screen display.

    The integer values returned by two
    invocations of "PRAGMA data_version" from the same connection
    will be different if changes were committed to the database 
    by any other connection in the interim.
    The "PRAGMA data_version" value is unchanged for commits made
    on the same database connection.
    The behavior of "PRAGMA data_version" is the same for all database
    connections, including database connections in separate processes
    and shared cache database connections.

    The "PRAGMA data_version" value is a local property of each
    database connection and so values returned by two concurrent invocations
    of "PRAGMA data_version" on separate database connections are 
    often different even though the underlying database is identical.
    It is only meaningful to compare the "PRAGMA data_version" values
    returned by the same database connection at two different points in
    time.

 PRAGMA database_list
    PRAGMA database_list;
    This pragma works like a query to return one row for each database
    attached to the current database connection.
    The second column is "main" for the main database file, "temp"
    for the database file used to store TEMP objects, or the name of the
    ATTACHed database for other database files.
    The third column is the name of the database file itself, or an empty
    string if the database is not associated with a file.

 PRAGMA default_cache_size
    PRAGMA schema.default_cache_size;
       PRAGMA schema.default_cache_size
            = Number-of-pages;

    This pragma queries or sets the suggested maximum number of pages
    of disk cache that will be allocated per open database file.
    The difference between this pragma and cache_size is that the
    value set here persists across database connections.
    The value of the default cache size is stored in the 4-byte
    big-endian integer located at offset 48 in the header of the
    database file.
    

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.
    
  

 PRAGMA defer_foreign_keys
    PRAGMA defer_foreign_keys
       PRAGMA defer_foreign_keys = boolean;
    When the defer_foreign_keys PRAGMA is on,
    enforcement of all foreign key constraints is delayed until the
    outermost transaction is committed.  The defer_foreign_keys pragma
    defaults to OFF so that foreign key constraints are only deferred if
    they are created as "DEFERRABLE INITIALLY DEFERRED".  The 
    defer_foreign_keys pragma is automatically switched off at each
    COMMIT or ROLLBACK.  Hence, the defer_foreign_keys pragma must be
    separately enabled for each transaction.  This pragma is
    only meaningful if foreign key constraints are enabled, of course.

    The sqlite3_db_s7tatus(db,SQLITE_DBSTATUS_DEFERRED_FKS,...)
    C-language interface can be used during a transaction to determine 
    if there are deferred and unresolved foreign key constraints.

 PRAGMA empty_result_callbacks
    PRAGMA empty_result_callbacks;
       PRAGMA empty_result_callbacks = boolean;

    Query or change the empty-result-callbacks flag.

    The empty-result-callbacks flag affects the sqlite3_exec() API only.
    Normally, when the empty-result-callbacks flag is cleared, the
    callback function supplied to the sqlite3_exec() is not invoked
    for commands that return zero rows of data.  When empty-result-callbacks
    is set in this situation, the callback function is invoked exactly once,
    with the third parameter set to 0 (NULL). This is to enable programs  
    that use the sqlite3_exec() API to retrieve column-names even when
    a query returns no data.

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.
    
  

 PRAGMA encoding
   PRAGMA encoding;
       PRAGMA encoding = 'UTF-8';
       PRAGMA encoding = 'UTF-16';
       PRAGMA encoding = 'UTF-16le';
       PRAGMA encoding = 'UTF-16be';
    In first form, if the main database has already been
    created, then this pragma returns the text encoding used by the
    main database, one of 'UTF-8', 'UTF-16le' (little-endian UTF-16
    encoding) or 'UTF-16be' (big-endian UTF-16 encoding).  If the main
    database has not already been created, then the value returned is the
    text encoding that will be used to create the main database, if 
    it is created by this session.

    The second through fifth forms of this pragma
    set the encoding that the main database will be created with if
    it is created by this session. The string 'UTF-16' is interpreted
    as "UTF-16 encoding using native machine byte-ordering".  It is not
    possible to change the text encoding of a database after it has been
    created and any attempt to do so will be silently ignored.

    If no encoding is first set with this pragma,
    then the encoding with which the main database will be created
    defaults to one determined by the
    API used to open the connection.

    Once an encoding has been set for a database, it cannot be changed.

    Databases created by the ATTACH command always use the same encoding
    as the main database.  An attempt to ATTACH a database with a different
    text encoding from the "main" database will fail.

 PRAGMA foreign_key_check
    PRAGMA schema.foreign_key_check;
        PRAGMA schema.foreign_key_check(table-name);

    The foreign_key_check pragma checks the database, or the table
    called "table-name", for 
    foreign key constraints that are violated.  The foreign_key_check
    pragma returns one row output for each foreign key violation.
    There are four columns in each result row.
    The first column is the name of the table that contains the REFERENCES
    clause.  The second column is the rowid of the row that
    contains the invalid REFERENCES clause, or NULL if the child table is a
    WITHOUT ROWID table.  The third column is the name
    of the table that is referred to. The fourth column is the index of
    the specific foreign key constraint that failed.  The fourth column
    in the output of the foreign_key_check pragma is the same integer as
    the first column in the output of the foreign_key_list pragma.
    When a "table-name" is specified, the only foreign key constraints
    checked are those created by REFERENCES clauses in the
    CREATE TABLE statement for table-name.

 PRAGMA foreign_key_list
    PRAGMA foreign_key_list(table-name);

    This pragma returns one row for each foreign key constraint
    created by a REFERENCES clause in the CREATE TABLE statement of
    table "table-name".

 PRAGMA foreign_keys
   8  PRAGMA foreign_keys;
       PRAGMA foreign_keys = boolean;
    Query, set, or clear the enforcement of foreign key constraints.

    This pragma is a no-op within a transaction; foreign key constraint
       enforcement may only be enabled or disabled when there is no pending
       BEGIN or SAVEPOINT.

    Changing the foreign_keys setting affects the execution of
       all statements prepared
       using the database connection, including those prepared before the
       setting was changed. Any existing statements prepared using the legacy 
       sqlite3_prepare() interface may fail with an SQLITE_SCHEMA error
       after the foreign_keys setting is changed.

    As of SQLite version 3.6.19, the default setting for foreign
       key enforcement is OFF.  However, that might change in a future
       release of SQLite.  The default setting for foreign key enforcement
       can be specified at compile-time using the SQLITE_DEFAULT_FOREIGN_KEYS
       preprocessor macro.  To minimize future problems, applications should
       set the foreign key enforcement flag as required by the application
       and not depend on the default setting.

 PRAGMA freelist_count
    PRAGMA schema.freelist_count;
    Return the number of unused pages in the database file.

 PRAGMA full_column_names
    PRAGMA full_column_names;
       PRAGMA full_column_names = boolean;

    Query or change the full_column_names flag. This flag together 
    with the short_column_names flag determine
    the way SQLite assigns names to result columns of SELECT statements.
    Result columns are named by applying the following rules in order:
    
    If there is an AS clause on the result, then the name of
        the column is the right-hand side of the AS clause.
    If the result is a general expression, not a just the name of
        a source table column,
        then the name of the result is a copy of the expression text.
    If the short_column_names pragma is ON, then the name of the
        result is the name of the source table column without the 
        source table name prefix:  COLUMN.
    If both pragmas short_column_names and full_column_names
        are OFF then case (2) applies.
        
    The name of the result column is a combination of the source table
        and source column name:  TABLE.COLUMN
    

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.
    
  

 PRAGMA fullfsync
    PRAGMA fullfsync
       PRAGMA fullfsync = boolean;
    Query or change the fullfsync flag. This flag
    determines whether or not the F_FULLFSYNC syncing method is used
    on systems that support it.  The default value of the fullfsync flag
    is off.  Only Mac OS X supports F_FULLFSYNC.

    See also checkpoint_fullfsync.

 PRAGMA function_list
    PRAGMA function_list;
    This pragma returns a list of SQL functions
    known to the database connection.  Each row of the result
    describes a single calling signature for a single SQL function.
    Some SQL functions will have multiple rows in the result set
    if they can (for example) be invoked with a varying number of
    arguments or can accept text in various encodings.

 PRAGMA hard_heap_limit
    PRAGMA hard_heap_limit
          PRAGMA hard_heap_limit=N

    This pragma invokes the sqlite3_hard_heap_limit64() interface with
    the argument N, if N is specified and N is a positive integer that
    is less than the current hard heap limit.
    The hard_heap_limit pragma always returns the same integer
    that would be returned by the sqlite3_hard_heap_limit64(-1) C-language
    function.  That is to say, it always returns the value of the hard
    heap limit that is set after any changes imposed by this PRAGMA.
    

    This pragma can only lower the heap limit, never raise it.
    The C-language 9interface sqlite3_hard_heap_limit64() must be used
    to raise the heap limit.

    See also the soft_heap_limit pragma.

 PRAGMA ignore_check_constraints
    PRAGMA ignore_check_constraints  = boolean;

    This pragma enables or disables the enforcement of CHECK constraints.
    The default setting is off, meaning that CHECK constraints are
    enforced by default.

 PRAGMA incremental_vacuum
    PRAGMA schema.incremental_vacuum(N);
      PRAGMA schema.incremental_vacuum;
    The incremental_vacuum pragma causes up to N pages to
    be removed from the freelist.  The database file is truncated by
    the same amount.  The incremental_vacuum pragma has no effect if
    the database is not in
    auto_vacuum=incremental mode
    or if there are no pages on the freelist.  If there are fewer than
    N pages on the freelist, or if N is less than 1, or
    if the "(N)" argument is omitted, then the entire
    freelist is cleared.

 PRAGMA index_info
    PRAGMA schema.index_info(index-name);
    This pragma returns one row for each key column in the named index.
    A key column is a column that is actually named in the CREATE INDEX
    index statement or UNIQUE constraint or PRIMARY KEY constraint that
    created the index.  Index entries also usually contain auxiliary
    columns that point back to the table row being indexed.  The auxiliary
    index-columns are not shown by the index_info pragma, but they are
    listed by the index_xinfo pragma.

    Output columns from the index_info pragma are as follows:
    
    The rank of the column within the index.  (0 means left-most.)
    The rank of the column within the table being indexed.
        A value of -1 means rowid and a value of -2 means that an
        expression is being used.
    The name of the column being indexed.  This columns is NULL
        if the column is the rowid or an expression.
    

    If there is no index named index-name but there is a
    WITHOUT ROWID table with that name, then (as of
    SQLite version 3.30.0 on 2019-10-04) this pragma returns the
    PRIMARY KEY columns of the WITHOUT ROWID table as they are used
    in the records of the underlying b-tree, which is to say with
    duplicate columns removed.

 PRAGMA index_list
    PRAGMA schema.index_list(table-name);
    This pragma returns one row for each index associated with the
    given table.
    Output columns from the index_list pragma are as follows:
    
    A sequence number assigned to each index for internal tracking
          purposes.
    The name of the index.
    "1" if the index is UNIQUE and "0" if not.
    "c" if the index was created by a CREATE INDEX statement,
          "u" if the index was created by a UNIQUE constraint, or
          "pk" if the index was created by a PRIMARY KEY constraint.
    "1" if the index is a partial index and "0" if not.
    
    

 PRAGMA index_xinfo
    PRAGMA schema.index_xinfo(index-name);
    This pragma returns information about every column in an index.
    Unlike this index_info pragma, this pragma returns information about
    every column in the index, not just the key columns.
    (A key column is a column that is actually named in the CREATE INDEX
    index statement or UNIQUE constraint or PRIMARY KEY constraint that
    created the index.  Auxiliary columns are additional columns needed to
    locate the table entry that corresponds to each index entry.)

    Output columns from the index_xinfo pragma are as follows:
    
    The rank of the column within the index. (0 means left-most.
         Key columns come before auxiliary columns.)
    The rank of the column within the table being indexed, or -1 if
         the index-column is the rowid of the table being indexed and -2
         if the index is on an expression.
    The name of the column being indexed, or NULL if the index-column
         is the rowid of the table being indexed or an
         expression.
    1 if the index-column is sorted in reverse (DESC) order by the
         index and 0 otherwise.
    The name for the collating sequence
         used to compa:re values in the index-column.
    1 if the index-column is a key column and 0 if the index-column
         is an auxiliary column.
    

    If there is no index named index-name but there is a
    WITHOUT ROWID table with that name, then (as of
    SQLite version 3.30.0 on 2019-10-04) this pragma returns the
    columns of the WITHOUT ROWID table as they are used
    in the records of the underlying b-tree, which is to say with
    de-duplicated PRIMARY KEY columns first followed by data columns.

 PRAGMA integrity_check
    PRAGMA schema.integrity_check;
      PRAGMA schema.integrity_check(N)
      PRAGMA schema.integrity_check(TABLENAME)
    This pragma does a low-level formatting and consistency check
    of the database.  The integrity_check pragma look for:
    
     Table or index entries that are out of sequence
     Misformatted records
     Missing pages
     Missing or surplus index entries
     UNIQUE, CHECK, and NOT NULL constraint errors
     Integrity of the freelist
     Sections of the database that are used more than once, or not at all
    
    If the integrity_check pragma finds problems, strings are returned
    (as multiple rows with a single column per row) which describe
    the problems.  Pragma integrity_check will return at most N
    errors before the analysis quits, with N defaulting
    to 100.  If pragma integrity_check finds no errors, a
    single row with the value 'ok' is returned.

    The usual case is that the entire database file is checked.  However,
    if the argument is TABLENAME, then checking is only performed for the
    the table named and its associated indexes.
    This is called a "partial integrity check".  Because only a subset of the
    database is checked, errors such as unused sections of the file or duplication
    use of the same section of the file by two or more tables cannot be detected.
    The freelist is only verified on a
    partial integrity check if TABLENAME is sqlite_schema or one of its
    aliases.  Support for partial integrity checks was added with
    version 3.33.0 (2020-08-14).

    PRAGMA integrity_check does not find
    FOREIGN KEY errors.  
    Use the PRAGMA foreign_key_check command to find errors in
    FOREIGN KEY constraints.

    See also the PRAGMA quick_check command which does most of the
    checking of PRAGMA integrity_check but runs much faster.

 PRAGMA journal_mode
    PRAGMA schema.journal_mode;
        PRAGMA schema.journal_mode
              = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF

    This pragma queries or sets the journal mode for databases
    associated with the current database connection.

    The first form of this pragma queries the current journaling
    mode for database.  When database is omitted, the
    "main" database is queried.

    The second form changes the journaling mode for "database"
    or for all attached databases if "database" is omitted.
    The new journal mode is returned.  If the journal mode
    could not be changed, the original journal mode is returned.

    The DELETE journaling mode is the normal behavior.  In the DELETE
    mode, the rollback journal is deleted at the conclusion of each
    transaction.  Indeed, the delete operation is the action that causes
    the transaction to commit.
    (See the document titled 
    Atomic Commit In SQLite for additional detail.)

    The TRUNCATE journaling mode commits transactions by truncating
    the rollback journal to zero-length instead of deleting it.  On many
    systems, truncating a file is much faster than deleting the file since
    the containing directory does not need to be changed.

    The PERSIST journaling mode prevents the rollback journal from
    being deleted at the end of each transaction.  Instead, the header
    of the journal is overwritten with zeros.  This will prevent other
    database connections from rolling the journal back.  The PERSIST
    journaling mode is useful as an optimization on platforms where
    deleting or truncating a file is much more expensive than overwriting
    the first block ;of a file with zeros.  See also:
    PRAGMA journal_size_limit and SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT.

    The MEMORY journaling mode stores the rollback journal in 
    volatile RAM.  This saves disk I/O but at the expense of database
    safety and integrity.  If the application using SQLite crashes in
    the middle of a transaction when the MEMORY journaling mode is set,
    then the database file will very likely 
    go corrupt.

    The WAL journaling mode uses a write-ahead log instead of a
    rollback journal to implement transactions.  The WAL journaling mode
    is persistent; after being set it stays in effect
    across multiple database connections and after closing and
    reopening the database.  A database in WAL journaling mode
    can only be accessed by SQLite version 3.7.0 (2010-07-21)
    or later.

    The OFF journaling mode disables the rollback journal completely.
    No rollback journal is ever created and hence there is never a rollback
    journal to delete.  The OFF journaling mode disables the atomic
    commit and rollback capabilities of SQLite. The ROLLBACK command
    no longer works; it behaves in an undefined way.  Applications must
    avoid using the ROLLBACK command when the journal mode is OFF.
    If the application crashes
    in the middle of a transaction when the OFF journaling mode is
    set, then the database file will very likely
    go corrupt. Without a journal, there is no way for
    a statement to unwind partially completed operations following
    a constraint error.  This might also leave the database in a corrupted
    state.  For example, if a duplicate entry causes a 
    CREATE UNIQUE INDEX statement to fail half-way through,
    it will leave behind a partially created, and hence corrupt, index.
    Because OFF journaling
    mode allows the database file to be corrupted using ordinary SQL,
    it is disabled when SQLITE_DBCONFIG_DEFENSIVE is enabled.

    Note that the journal_mode for an in-memory database
    is either MEMORY or OFF and can not be changed to a different value.
    An attempt to change the journal_mode of an in-memory database to
    any setting other than MEMORY or OFF is ignored.  Note also that
    the journal_mode cannot be changed while a transaction is active.

 PRAGMA journal_size_limit
    
    PRAGMA schema.journal_size_limit
    PRAGMA schema.journal_size_limit = N ;

  If a database connection is operating in
  exclusive locking mode or in
  persistent journal mode 
  (PRAGMA journal_mode=persist) then
  after committing a transaction the rollback journal file may remain in
  the file-system. This increases performance for subsequent transactions
  since overwriting an existing file is faster than append to a file,
  but it also consumes
  file-system space. After a large transaction (e.g. a VACUUM),
  the rollback journal file may consume a very large amount of space.

  Similarly, in WAL mode, the write-ahead log file is not truncated
  following a checkpoint.  Instead, SQLite reuses the existing file
  for subsequent WAL entries since overwriting is faster than appending.

  The journal_size_limit pragma may be used to limit the size of 
  rollback-journal and WAL files left
  in the file-system after transactions or checkpoints.
  Each time a transaction is committed or a WAL file resets, SQLite 
  compares the size of the rollback journal file or WAL file left in 
  the file-system to the size limit
  set by this pragma and if the journal or WAL file is larger 
  it is truncated to the limit.

  The second form of the pragma listed above is used to set a new limit
  in bytes for the specified database.  A negative number implies no limit.
  To always truncate rollback journals and WAL files to their minimum size, 
  set the journal_size_limit to zero.
  Both the first and second forms of the pragma listed above return a single
  result row containing a single integer column - the value of the journal
  size limit in bytes. The default journal size limit is -1 (no limit).  The
  SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT preproces<sor macro can be used to change
  the default journal size limit at compile-time.

  This pragma only operates on the single database specified prior
  to the pragma name (or on the "main" database if no database is specified.)
  There is no way to change the journal size limit on all attached databases
  using a single PRAGMA statement.  The size limit must be set separately for
  each attached database.

 PRAGMA legacy_alter_table
   PRAGMA legacy_alter_table;
       PRAGMA legacy_alter_table = boolean
    This pragma sets or queries the value of the legacy_alter_table
    flag.  When this flag is on, the ALTER TABLE RENAME
    command (for changing the name of a table) works as it did
    in SQLite 3.24.0 (2018-06-04) and earlier.  More specifically,
    when this flag is on
    the ALTER TABLE RENAME command only rewrites the initial occurrence
    of the table name in its CREATE TABLE statement and in any associated
    CREATE INDEX and CREATE TRIGGER statements.  Other references to the
    table are unmodified, including:
    
     References to the table within the bodies of triggers and views.
     References to the table within CHECK constraints in the original
         CREATE TABLE statement.
     References to the table within the WHERE clauses of partial indexes.
    
    The default setting for this pragma is OFF, which means that all
    references to the table anywhere in the schema are converted to the new name.
    This pragma is provided as a work-around for older programs that
    contain code that expect the incomplete behavior
    of ALTER TABLE RENAME found in older versions of SQLite.
    New applications should leave this flag turned off.
    For compatibility with older virtual table implementations,
    this flag is turned on temporarily while the sqlite3_module.xRename
    method is being run.  The value of this flag is restored after the 
    sqlite3_module.xRename method finishes.
    The legacy alter table behavior can also be toggled on and off
    using the SQLITE_DBCONFIG_LEGACY_ALTER_TABLE option to the
    sqlite3_db_config() interface.
    The legacy alter table behavior is a per-connection setting.  Turning
    this features on or off affects all attached database files within the
    database connection.
    The setting does not persist.  Changing this setting in one connection
    does not affect any other connections.

 PRAGMA legacy_file_format
   PRAGMA legacy_file_format;
    This pragma no longer functions.  It has become a no-op.
    The capabilities formerly provided by PRAGMA legacy_file_format
    are now available using the SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
    option to the sqlite3_db_config() C-language interface.
    

 PRAGMA locking_mode
    PRAGMA schema.locking_mode;
    PRAGMA schema.locking_mode
                = NORMAL | EXCLUSIVE
    This pragma sets or queries the database connection locking-mode. 
    The locking-mode is either NORMAL or EXCLUSIVE.

    In NORMAL locking-mode (the default unless overridden at compile-time
    using SQLITE_DEFAULT_LOCKING_MODE), a database connection
    unlocks the database file at the conclusion of each read or
    write transaction. When the locking-mode is set to EXCLUSIVE, the
    database connection never releases file-locks. The first time the
    database is read in EXCLUSIVE mode, a shared lock is obtained and 
    held. The first time the database is written, an exclusive lock is
    obtained and held.

    Database locks obtained by a connection in EXCLUSIVE mode may be
    released either by closing the database connection, or by setting the
    locking-mode back to NORMAL using this pragma and then accessing the
    database file (for read or write). Simply setting the locking-mode to
    NORMAL is not enough - locks are not released until the next time
    the database file is accessed.

    There are three reasons to set the locking-mode to EXCLUSIVE.
    
    The application wants to prevent other processes from
        accessing the database file.
    The number of system calls for filesystem operations i=s reduced,
        possibly resulting in a small performance increase.
    WAL databases can be accessed in EXCLUSIVE mode without the
        use of shared memory. 
        (Additional information)
    
    

    When the locking_mode pragma specifies a particular database,
    for example:

    
PRAGMA main.locking_mode=EXCLUSIVE;
    

    then the locking mode applies only to the named database.  If no
    database name qualifier precedes the "locking_mode" keyword then
    the locking mode is applied to all databases, including any new
    databases added by subsequent ATTACH commands.

   The "temp" database (in which TEMP tables and indices are stored)
   and in-memory databases
   always uses exclusive locking mode.  The locking mode of temp and
   in-memory databases cannot
   be changed.  All other databases use the normal locking mode by default
   and are affected by this pragma.

   If the locking mode is EXCLUSIVE when first entering
   WAL journal mode, then the locking mode cannot be changed to
   NORMAL until after exiting WAL journal mode. 
   If the locking mode is NORMAL when first entering WAL
   journal mode, then the locking mode can be changed between NORMAL and
   EXCLUSIVE and back again at any time and without needing to exit
   WAL journal mode.

 PRAGMA max_page_count
    PRAGMA schema.max_page_count;
        PRAGMA schema.max_page_count = N;
    Query or set the maximum number of pages in the database file.
    Both forms of the pragma return the maximum page count.  The second
    form attempts to modify the maximum page count.  The maximum page
    count cannot be reduced below the current database size.
    

 PRAGMA mmap_size
    PRAGMA schema.mmap_size;
         PRAGMA schema.mmap_size=N

    Query or change the maximum number of bytes that are set
       aside for memory-mapped I/O on a single database.  The first form
       (without an argument) queries the current limit.  The second
       form (with a numeric argument) sets the limit for the specified
       database, or for all databases if the optional database name is
       omitted.  In the second form, if the database name is omitted, the
       limit that is set becomes the default limit for all databases that
       are added to the database connection by subsequent ATTACH
       statements.

    The argument N is the maximum number of bytes of the database file
       that will be accessed using memory-mapped I/O.  If N is zero then
       memory mapped I/O is disabled.  If N is negative, then the limit
       reverts to the default value determined by the most recent
       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE), or to the compile
       time default determined by SQLITE_DEFAULT_MMAP_SIZE if not
       start-time limit has been set.

    The PRAGMA mmap_size statement will never increase the amount
       of address space used for memory-mapped I/O above the
       hard limit set by the SQLITE_MAX_MMAP_SIZE compile-time option,
       nor the hard limit set at startup-time by the second argument to
       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE)

    The size of the memory-mapped I/O region cannot be changed while
       the memory-mapped I/O region is in active use, to avoid unmapping
       memory out from under running SQL statements.  For this reason,
       the mmap_size pragma may be a no-op if the prior mmap_size is non-zero
       and there are other SQL statements running concurrently on the same
       database connection.

 PRAGMA module_list
    PRAGMA module_list;
    This pragma returns a list of 
    virtual table modules registered with the database connection.

 PRAGMA optimize
  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.
  To achieve the best long-term query performance without the need to
  do a detailed engineering analysis of the application schema and SQL,
  it is recommended> that applications run "PRAGMA optimize" (with no arguments)
  just before closing each database connection.  Long-running applications
  might also benefit from setting a timer to run "PRAGMA optimize" every
  few hours.
  
  This pragma is usually a no-op or nearly so and is very fast.
  However if SQLite feels
  that performing database optimizations (such as running ANALYZE
  or creating new indexes) will improve the performance of future queries, then
  some database I/O may be done.  Applications that want to limit the amount
  of work performed can set a timer that will invoke
  sqlite3_interrupt() if the pragma goes on for too long.
  Or, since SQLite 3.32.0, the application can use 
  PRAGMA analysis_limit=N for some small
  value of N (a few hundred or a few thousand) to limit the depth
  of analyze.
  
  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 MASK argument is a bitmask of optimizations to perform:
  
  
         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.
  
         Run ANALYZE on tables that might benefit.  On by default.
         See below for additional information.
  
         (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.
  
         (Not yet implemented)
         Create indexes that might have been helpful to recent queries.
  
  The default MASK is and always shall be 0xfffe.  The 0xfffe mask means
  perform all of the optimizations listed above except Debug Mode.  If new
  optimizations are added in the future that should be off by default, those
  new optimizations will be given a mask of 0x10000 or larger.

  To see all optimizations that would have been done without actually
  doing them, run "PRAGMA optimize(-1)".  To use only the ANALYZE
  optimization, run "PRAGMA optimize(0x02)".
  
  Determination Of When To Run Analyze
   In the current implementation, a table is analyzed if and only if 
      all of the following are true:
  
  
    MASK bit 0x02 is set.
  
    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.
  
    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.

 PRAGMA page_count
    PRAGMA schema.page_count;
    Return the total number of pages in the database file.

 PRAGMA page_size
   PRAGMA schema.page_size;
       PRAGMA schema.page_size = bytes;
    Query or set the page size of the database. The page
    size must be a power of two between 512 and 65536 inclusive.
    

    When a new database is created, SQLite assigns a page size to
    the database based on platform and filesystem.  For many years,
    the default page size was almost always 1024 bytes, but beginning
    with SQLite version 3.12.0 (2016-03-29), 
    the default page size increased to 4096.
    The default page size is recommended for most applications.

    Specifying a new page size does not change the page size
    immediately.  Instead, the new page size is remembered and is used
    to set the page size when the database is first created, if it does
    not already exist when the page_size pragma is issued, or at the
    next VACUUM command that is run on the same database connection
    while not in WAL mode.

    The SQLITE_DEFAULT_PAGE_SIZE compile-time option can be used
    to change the default page size assigned to new databases.

 PRAGMA parser_trace
    PRAGMA parser_trace = boolean?; 

    If SQLite has been compiled with the SQLITE_DEBUG compile-time
    option, then the parser_trace pragma can be used to turn on tracing
    for the SQL parser used internally by SQLite.
    This feature is used for debugging SQLite itself.

    
    
    This pragma is intended for use when debugging SQLite itself.  It
    is only available when the SQLITE_DEBUG compile-time option
    is used.
  

 PRAGMA pragma_list
    PRAGMA pragma_list;
    This pragma returns a list of PRAGMA commands
    known to the database connection.

 PRAGMA query_only
    PRAGMA query_only;
      PRAGMA query_only = boolean;

    The query_only pragma prevents data changes on database files when
    enabled.  When this pragma is enabled, any attempt to CREATE, DELETE,
    DROP, INSERT, or UPDATE will result in an SQLITE_READONLY error.
    However, the database is not truly read-only.  You can still run
    a checkpoint or a COMMIT and the return value of the
    sqlite3_db_readonly() routine is not affected.
     

 PRAGMA quick_check
    PRAGMA schema.quick_check;
      PRAGMA schema.quick_check(N)
      PRAGMA schema.quick_check(TABLENAME)
    The pragma is like integrity_check except that it does not verify
    UNIQUE constraints and does not verify
    that index content matches table content.  By skipping UNIQUE
    and index consistency checks, quick_check is able to run faster.
    PRAGMA quick_check runs in O(N) time whereas PRAGMA integrity_check
    requires O(NlogN) time where N is the total number of rows in the 
    database. Otherwise the two pragmas are the same.
    

 PRAGMA read_uncommitted
    PRAGMA read_uncommitted;
       PRAGMA read_uncommitted = boolean;
    Query, set, or clear READ UNCOMMITTED isolation. The default isolation
    level for SQLite is SERIALIZABLE.  Any process or thread can select
    READ UNCOMMITTED isolation, but SERIALIZABLE will still be used except
    between connections that share a common page and schema cache.
    Cache sharing is enabled using the sqlite3_enable_shared_cache() API.
    Cache sharing is disabled by default.
    

    See SQLite Shared-Cache Mode for additional information.

 PRAGMA recursive_triggers
    PRAGMA recursive_triggers;
       PRAGMA recursive_triggers = boolean;
    Query, set, or clear the recursive trigger capability.

    Changing the recursive_triggers setting affects the execution of
       all statements prepared
       using the database connection, including those prepared before the
       setting was changed. Any existing statements prepared using the legacy 
       sqlite3_prepare() interface may fail with an SQLITE_SCHEMA error
       after the recursive_triggers setting is changed.

    Prior to SQLite version 3.6.18 (2009-09-11), 
    recursive triggers were not supported.
    The behavior of SQLite was always as if this pragma was
    set to OFF.  Support for recursive triggers was added in version 3.6.18
    but was initially turned OFF by default, for compatibility.  Recursive
    triggers may be turned on by default in future versions of SQLite.
    

    The depth of recursion for triggers has a hard upper limit set by
    the SQLITE_MAX_TRIGGER_DEPTH compile-time option and a run-time
    limit set by sqlite3_limit(db,SQLITE_LIMIT_TRIGGER_DEPTH,...).

 PRAGMA reverse_unordered_selects
    PRAGMA reverse_unordered_selects;
       PRAGMA reverse_unordered_selects = boolean;
    When enabled, this PRAGMA causes many SELECT statements without
    an ORDER BY clause to emit their results in the reverse order from what
    they normally would.  This can help debug applications that are
    making invalid assumptions about the result order.  
    The reverse_unordered_selects pragma works for most SELECT statements,
    however the query planner may sometimes choose an algorithm that is
    not easily reversed, in which case the output will appear in the same
    order regardless of the reverse_unordered_selects setting.
    SQLite makes no
    guarantees about the order of results if a SELECT omits the ORDER BY
    clause.  Even so, the@ order of results does not change from one
    run to the next, and so many applications mistakenly come to depend
    on the arbitrary output order whatever that order happens to be.  However, 
    sometimes new versions of SQLite will contain optimizer enhancements
    that will cause the output order of queries without ORDER BY clauses
    to shift.  When that happens, applications that depend on a certain
    output order might malfunction.  By running the application multiple
    times with this pragma both disabled and enabled, cases where the
    application makes faulty assumptions about output order can be
    identified and fixed early, reducing problems
    that might be caused by linking against a different version of SQLite.
    

 PRAGMA schema_version
    PRAGMA schema.schema_version; 
      PRAGMA schema.schema_version = integer ;

   The schema_version pragma will get or set
       the value of the schema-version integer at offset 40 in the
       database header. 

    SQLite automatically increments the schema-version whenever the
       schema changes. As each SQL statement runs, the schema version is
       checked to ensure that the schema has not changed since the SQL
       statement was prepared.
       Subverting this mechanism by using "PRAGMA schema_version=N"
       to change the value of the schema_version
       may cause SQL statement to run using an obsolete schema,
       which can lead to incorrect answers and/or
       database corruption.
       It is always safe to read the schema_version, but changing the
       schema_version can cause problems.  For this reason, attempts
       to change the value of schema_version are a silent no-op when
       defensive mode is enabled for a
       database connection.

       
    
    Warning:
    Misuse of this pragma can result in database corruption.
    
  

    For the purposes of this pragma, the VACUUM command is considered
       a schema change, since VACUUM will usually alter the "rootpage"
       values for entries in the sqlite_schema table.


    See also the application_id pragma and user_version pragma.

 PRAGMA secure_delete
    PRAGMA schema.secure_delete;
     PRAGMA schema.secure_delete = boolean|FAST
    Query or change the secure-delete setting. When secure_delete is
    on, SQLite overwrites deleted content with zeros.  The default
    setting for secure_delete is determined by the SQLITE_SECURE_DELETE
    compile-time option and is normally off.  The off setting for
    secure_delete improves performance by reducing the number of CPU cycles
    and the amount of disk I/O.  Applications that wish to avoid leaving
    forensic traces after content is deleted or updated should enable the
    secure_delete pragma prior to performing the delete or update, or else
    run VACUUM after the delete or update.

    The "fast" setting for secure_delete (added circa 2017-08-01)
    is an intermediate setting in between "on" and "off".
    When secure_delete is set to "fast",
    SQLite will overwrite deleted content with zeros only if doing so
    does not increase the amount of I/O.  In other words, the "fast"
    setting uses more CPU cycles but does not use more I/O.
    This has the effect of purging all old content from b-tree pages,
    but leaving forensic traces on freelist pages.

    
    When there are attached databases and no database
    is specified in the pragma, all databases have their secure-delete
    setting altered.
    The secure-delete setting for newly attached databases is the setting
    of the main database at the time the ATTACH command is evaluated.

    
    When multiple database connections share the same cache, changing
    the secure-delete flag on one database connection changes it for them
    all.
    

 PRAGMA short_column_names
    PRAGMA short_column_names;
       PRAGMA short_column_names = boolean;

    Query or change the short-column-names flag. This flag affects
    the way SQLite names columns of data returned by SELECT statements.
    See the full_column_names pragma for full detaiAls.
    

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.
    
  

 PRAGMA shrink_memory
    PRAGMA shrink_memory

    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().
    

 PRAGMA soft_heap_limit
    PRAGMA soft_heap_limit
          PRAGMA soft_heap_limit=N

    This pragma invokes the sqlite3_soft_heap_limit64() interface with
    the argument N, if N is specified and is a non-negative integer.
    The soft_heap_limit pragma always returns the same integer
    that would be returned by the sqlite3_soft_heap_limit64(-1) C-language
    function.
    
    See also the hard_heap_limit pragma.

 PRAGMA stats
    PRAGMA stats; 
    This pragma returns auxiliary information about tables and
    indices.  The returned information is used during testing to help
    verify that the query planner is operating correctly.  The format
    and meaning of this pragma will likely change from one release
    to the next. Because of its volatility, the behavior and output
    format of this pragma are deliberately undocumented.

    
    
    The intended use of this pragma is only for testing and validation of
    SQLite.  This pragma is subject to change without notice and is not
    recommended for use by application programs.
  

 PRAGMA synchronous
    PRAGMA schema.synchronous;
        PRAGMA schema.synchronous = 
          0 | OFF | 1 | NORMAL | 2 | FULL | 3 | EXTRA;

    Query or change the setting of the "synchronous" flag.
    The first (query) form will return the synchronous setting as an 
    integer.  The second form changes the synchronous setting.
    The meanings of the various synchronous settings are as follows:
    
    EXTRA (3)
    
    EXTRA synchronous is like FULL with the addition that the directory
    containing a rollback journal is synced after that journal is unlinked
    to commit a transaction in DELETE mode.  EXTRA provides additional
    durability if the commit is followed closely by a power loss.
    FULL (2)
    
    When synchronous is FULL (2), the SQLite database engine will
    use the xSync method of the VFS to ensure that all content is safely
    written to the disk surface prior to continuing.
    This ensures that an operating system crash or power failure will
    not corrupt the database.
    FULL synchronous is very safe, but it is also slower.  FULL is the
    most commonly used synchronous setting when not in WAL mode.
    NORMAL (1)
    
    When synchronous is NORMAL (1), the SQLite database
    engine will still sync at the most critical moments, but less often
    than in FULL mode.  There is a very small (though non-zero) chance that
    a power failure at just the wrong time could corrupt the database in
    journal_mode=DELETE on an older filesystem.
    WAL mode is safe from corruption with synchronous=NORMAL, and probably
    DELETE mode is safe too on modern filesystems.  WAL mode is always consistent
    with synchronous=NORMAL, but WAL mode does lose durability.  A transaction
    committed in WAL mode with synchronous=NORMAL might roll back following
    a power loss or system crash.  Transactions are durable across application
    crashes regardless of the synchronous setting or journal mode.
    The synchronous=NORMAL setting is a good choice for most applications
    running in WAL mode.
    OFF (0)
    
    With synchronous OFF (0), SQLite continues without syncing
    as soon as it has handed data off to the operating system.
    If the application running SQLite crashes, the data will be safe, but
    the database might become corrupted if the operating system
    crashes or the computer loses power before that data has been written
    to the disk surface.  On the other hand, commBits can be orders of
    magnitude faster with synchronous OFF.
    
    
 
    In WAL mode when synchronous is NORMAL (1), the WAL file is
    synchronized before each checkpoint and the database file is
    synchronized after each completed checkpoint and the WAL file
    header is synchronized when a WAL file begins to be reused after
    a checkpoint, but no sync operations occur during most transactions.
    With synchronous=FULL in WAL mode, an additional
    sync operation of the WAL file happens after each transaction commit.
    The extra WAL sync following each transaction helps ensure that 
    transactions are durable across a power loss.  Transactions are
    consistent with or without the extra syncs provided by
    synchronous=FULL.
    If durability is not a concern, then synchronous=NORMAL is normally
    all one needs in WAL mode.

    The TEMP schema always has synchronous=OFF since the content of
    of TEMP is ephemeral and is not expected to survive a power outage.
    Attempts to change the synchronous setting for TEMP are
    silently ignored.

    See also the fullfsync and checkpoint_fullfsync pragmas.

 PRAGMA table_info
    PRAGMA schema.table_info(table-name);
    This pragma returns one row for each normal column
    in the named table.
    Columns in the result set include: "name" (its name); "type"
    (data type if given, else ''); "notnull" (whether or not the column
    can be NULL); "dflt_value" (the default value for the column);
    and "pk" (either zero for columns that are not part of the primary key,
    or the 1-based index of the column within the primary key).
    The "cid" column should not be taken to mean more than
    "rank within the current result set".
    The table named in the table_info pragma can also be a view.
    This pragma does not show information about generated columns or
    hidden columns.  Use PRAGMA table_xinfo to get a more complete list
    of columns that includes generated and hidden columns.

 PRAGMA table_list
     PRAGMA table_list;
         PRAGMA schema.table_list;
         PRAGMA table_list(table-name);
    This pragma returns information about the tables and views in the schema,
    one table per row of output.  The table_list pragma first appeared
    in SQLite version 3.37.0 (2021-11-27).  As of its initial release
    the columns returned by the table_list pragma include those listed below.
    Future versions of SQLite will probably add additional columns of
    output.
    
    
     schema: the schema in which the table or view appears
    (for example "main" or "temp").
     name: the name of the table or view.
     type: the type of object - one of "table", "view",
           "shadow" (for shadow tables), or "virtual" for
           virtual tables.
     ncol: the number of columns in the table, including
         generated columns and hidden columns.
     wr: 1 if the table is a WITHOUT ROWID table or 0 if is not.
     strict: 1 if the table is a STRICT table or 0 if it is not.
     Additional columns will likely be added in future releases.
    
    
    The default behavior is to show all tables in all schemas.  If the
    schema. name appears before the pragma, then only tables in that
    one schema are shown.  If a table-name argument is supplied, then
    only information about that one table is returned.

 PRAGMA table_xinfo
    PRAGMA schema.table_xinfo(table-name);
    This pragma returns one row for each column in the named table,
    including generated columns and hidden columns.
    The output has the same columns as for PRAGMA table_info plus
    a column, "hidden", whose value signifies a normal column (0),
    a dynamic or stored generated column (2 or 3),
    or a hidden column in a virtual table (1). The rows for which
    this field is non-zero are those omitted for PRAGMA table_info.

 PRAGMA temp_store
    PRAGMA temp_store;
        PRAGMA temp_store = 
            0 | DEFAULT | 1 | FILE | 2 | MEMORY;

    Query or change the setting of the "temp_store" parameter.
    When temp_store is DEFAULT (0), the compile-Ctime C preprocessor macro
    SQLITE_TEMP_STORE is used to determine where temporary tables and indices
    are stored.  When
    temp_store is MEMORY (2) temporary tables and indices are kept
    as if they were in pure in-memory databases.
    When temp_store is FILE (1) temporary tables and indices are stored
    in a file.  The temp_store_directory pragma can be used to specify
    the directory containing temporary files when
    FILE is specified.  When the temp_store setting is changed,
    all existing temporary tables, indices, triggers, and views are
    immediately deleted.

    It is possible for the library compile-time C preprocessor symbol
    SQLITE_TEMP_STORE to override this pragma setting.
    The following table summarizes
    the interaction of the SQLITE_TEMP_STORE preprocessor macro and the
    temp_store pragma:

    
    
    SQLITE_TEMP_STORE
        PRAGMAtemp_store
        Storage used forTEMP tables and indices
    0
        any
        file
    1
        0
        file
    1
        1
        file
    1
        2
        memory
    2
        0
        memory
    2
        1
        file
    2
        2
        memory
    3
        any
        memory
    
    

 PRAGMA temp_store_directory
    PRAGMA temp_store_directory;
      PRAGMA temp_store_directory = 'directory-name';
    Query or change the value of the sqlite3_temp_directory global
    variable, which many operating-system interface backends use to
    determine where to store temporary tables and indices.

    When the temp_store_directory setting is changed, all existing temporary
    tables, indices, triggers, and viewers in the database connection that
    issued the pragma are immediately deleted.  In
    practice, temp_store_directory should be set immediately after the first
    database connection for a process is opened.  If the temp_store_directory
    is changed for one database connection while other database connections
    are open in the same process, then the behavior is undefined and
    probably undesirable.

    Changing the temp_store_directory setting is not threadsafe.
    Never change the temp_store_directory setting if another thread
    within the application is running any SQLite interface at the same time.
    Doing so results in undefined behavior.  Changing the temp_store_directory
    setting writes to the sqlite3_temp_directory global
    variable and that global variable is not protected by a mutex.

    The value directory-name should be enclosed in single quotes.
    To revert the directory to the default, set the directory-name to
    an empty string, e.g., PRAGMA temp_store_directory = ''.  An
    error is raised if directory-name is not found or is not
    writable. 

    The default directory for temporary files depends on the OS.  Some
    OS interfaces may choose to ignore this variable and place temporary
    files in some other directory different from the directory specified
    here.  In that sense, this pragma is only advisory.

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.
    
  

 PRAGMA threads
    PRAGMA threads;
      PRAGMA threads = N;
    Query or change the value of the 
    sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,...) limit for
    the current database connection.  This limit sets an upper bound
    on the number of auxiliary threads that a prepared statement is
    allowed to launch to assist with a query.  The default limit is 0
    unless it is changed using the SQLITE_DEFAULT_WORKER_THREADS
    compile-time option.  When the limit is zero, that means no
    auxiliary threads will be launched.

    This pragma is a thin wrapper around the
    sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,...) interface.
    

 PRAGMA trusted_schema
    PRAGMA trusted_schema;
      PRAGMA trusted_schemDa = boolean;
    The trusted_schema setting is a per-connection boolean that
    determines whether or not SQL functions and virtual tables that
    have not been security audited are allowed to be run by views,
    triggers, or in expressions of the schema such as CHECK constraints,
    DEFAULT clauses, generated columns, expression indexes, and/or
    partial indexes.  This setting can also be controlled using
    the sqlite3_db_config(db,SQLITE_DBCONFIG_TRUSTED_SCHEMA,...)
    C-language interface.
    In order to maintain backwards compatibility, this setting is
    ON by default.  There are advantages to turning it off, and most
    applications will be unaffected if it is turned off.  For that reason,
    all applications are encouraged to switch this setting off on every
    database connection as soon as that connection is opened.
    The -DSQLITE_TRUSTED_SCHEMA=0 compile-time option will cause
    this setting to default to OFF.

 PRAGMA user_version
      PRAGMA schema.user_version;
      PRAGMA schema.user_version = integer ;

  
    The user_version pragma will get or set
       the value of the user-version integer at offset 60 in the
       database header.  The user-version is an integer that is
       available to applications to use however they want.  SQLite
       makes no use of the user-version itself.

    See also the application_id pragma and schema_version pragma.

 PRAGMA vdbe_addoptrace
    PRAGMA vdbe_addoptrace = boolean;

    If SQLite has been compiled with the SQLITE_DEBUG compile-time
    option, then the vdbe_addoptrace pragma can be used to cause a complete
    VDBE opcodes to be displayed as they are created during code generation.
    This feature is used for debugging SQLite itself.  See the 
    VDBE documentation for more 
    information.

    
    
    This pragma is intended for use when debugging SQLite itself.  It
    is only available when the SQLITE_DEBUG compile-time option
    is used.
  

 PRAGMA vdbe_debug
    PRAGMA vdbe_debug = boolean;

    If SQLite has been compiled with the SQLITE_DEBUG compile-time
    option, then the vdbe_debug pragma is a shorthand for three other
    debug-only pragmas: vdbe_addoptrace, vdbe_listing, and vdbe_trace.
    This feature is used for debugging SQLite itself.  See the 
    VDBE documentation for more 
    information.

    
    
    This pragma is intended for use when debugging SQLite itself.  It
    is only available when the SQLITE_DEBUG compile-time option
    is used.
  

 PRAGMA vdbe_listing
    PRAGMA vdbe_listing = boolean;

    If SQLite has been compiled with the SQLITE_DEBUG compile-time
    option, then the vdbe_listing pragma can be used to cause a complete
    listing of the virtual machine opcodes to appear on standard output
    as each statement is evaluated.
    With listing is on, the entire content of a program is printed
    just prior to beginning execution.  The statement
    executes normally after the listing is printed.
    This feature is used for debugging SQLite itself.  See the 
    VDBE documentation for more 
    information.

    
    
    This pragma is intended for use when debugging SQLite itself.  It
    is only available when the SQLITE_DEBUG compile-time option
    is used.
  

 PRAGMA vdbe_trace
    PRAGMA vdbe_trace = boolean;

    If SQLite has been compiled with the SQLITE_DEBUG compile-time
    option, then the vdbe_trace pragma can be used to cause virtual machine
    opcodes to be printed on standard output as they are evaluated.
    This feature is used for debugging SQLite.  See the 
    VDBE documentation for more 
    information.

    
    
    This pragma is intended for use when debugging SQLite itself.  It
    is only available when the SQLITE_DEBUG compile-time option
    is used.
  

 PRAGMA wal_autocheckpoint
    PRAGMA wal_autocheckpoint;
          PRAGMA wal_autocheckpoint=N;

    This pragma queries or sets the write-ahead log 
    auto-checkpoint interval.
    When the write-ahead log is enabled (via the
    journal_mode pragma) a checkpoint will be run automatically whenever
    the write-ahead log equals or exceeds N pages in length.
    Setting the auto-checkpoint size to zero or a negative value
    turns auto-checkpointing off.
    
    This pragma is a wrapper around the
    sqlite3_wal_autocheckpoint() C interface.
    All automatic checkpoints are PASSIVE.

    Autocheckpointing is enabled by default with an interval
    of 1000 or SQLITE_DEFAULT_WAL_AUTOCHECKPOINT.


 PRAGMA wal_checkpoint
    PRAGMA schema.wal_checkpoint;
       PRAGMA schema.wal_checkpoint(PASSIVE);
       PRAGMA schema.wal_checkpoint(FULL);
       PRAGMA schema.wal_checkpoint(RESTART);
       PRAGMA schema.wal_checkpoint(TRUNCATE);
   

    If the write-ahead log is enabled (via the journal_mode pragma),
    this pragma causes a checkpoint operation to run on database
    database, or on all attached databases if database
    is omitted.  If write-ahead log mode is disabled, this pragma is a
    harmless no-op.

    Invoking this
    pragma without an argument is equivalent to calling the
    sqlite3_wal_checkpoint() C interface.
    Invoking this pragma with an argument is equivalent to calling the
    sqlite3_wal_checkpoint_v2() C interface with a 
    3rd parameter
    corresponding to the argument:

    
    PASSIVE
      Checkpoint as many frames as possible without waiting for any database 
      readers or writers to finish. Sync the db file if all frames in the log
      are checkpointed. This mode is the same as calling the
      sqlite3_wal_checkpoint() C interface. The
      busy-handler callback is never invoked in
      this mode.
   
    FULL
      This mode blocks 
      (invokes the 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. FULL blocks concurrent writers while it is
      running, but readers can proceed.
   
    RESTART
      This mode works the same way as FULL with the addition that after 
      checkpointing the log file it blocks (calls the 
      busy-handler callback)
      until all readers are finished with the log file. This ensures 
      that the next client to write to the database file restarts the log file 
      from the beginning. RESTART blocks concurrent writers while it is
      running, but allowed readers to proceed.
   
    TRUNCATE
      This mode works the same way as RESTART with the 
      addition that the WAL file is truncated to zero bytes upon successful
      completion.
    


    The wal_checkpoint pragma returns a single row with three
    integer columns.  The first column is usually 0 but will be
    1 if a RESTART or FULL or TRUNCATE checkpoint was blocked from completing,
    for example because another thread or process was actively
    using the database.  In other words, the first column is 0 if the
    equivalent call to sqlite3_wal_checkpoint_v2() would have returned
    SQLITE_OK or 1 if the equivalent call would have returned SQLITE_BUSY.
    The second column is the number of modified pages that have been
    written to the write-ahead log file.
    The third column is the number of pages in the write-ahead log file
    that have been successfully moved back into the database file at
    the conclusion of the checkpoint.
   The second and third column are -1 if there is no
    write-ahead log, for example if this pragma is invoked on a database
    connection that is not in WAL mode.

 PRAGMA writable_schema
    PRAGMA writable_schema  = boolean;
         PRAGMA writable_schema = RESET

    When this pragma is on, and the SQLITE_DBCONFIG_DEFENSIVE flag
    is off, then the sqlite_schema table
    can be changed using ordinary UPDATE, INSERT, and DELETE
    statements.  If the argument is "RESET" then schema writing is
    disabled (as with "PRAGMA writable_schema=OFF") and, in addition, the
    schema is reloaded.  Warning:
    misuse of this pragma can easily result in
    a corrupt database file.


This page last modified on  2022-11-21 19:17:39 UTCpragma.html

9
9…¤j‚t
WŠÈm#Pragma statements supported by SQLitePRAGMA Statements



The PRAGMA statement is an SQL extension specific to SQLite and used to 
modify the operation of the SQLite library or to query the SQLite library for 
internal (non-table) data. The PRAGMA statement is issued using the same
interface as other SQLite commands (e.g. SELECT, INSERT) but is
different in the following important respects:


The pragma command is specific to SQLite and is
    not compatible with any other SQL database engine.
Specific pragma statements may be removed and others added in future
    releases of SQLite. There is no guarantee of backwards compatibility.
No error messages are generated if an unknown prag0s grows too large.

1.3 Locking and Concurrency

Multiple connections from within a single process that use this
implementation of asynchronous IO may access a single database
file concurrently. From the point of view of the user, if all
connections are from within a single process, there is no difference
between the concurrency offered by "normal" SQLite and SQLite
using the asynchronous backend.

If file-locking is enabled (it is enabled by default), then connections
from multiple processes may also read and write the database file.
However concurrency is reduced as follows:


 When a connection using asynchronous IO begins a database
        transaction, the database is locked immediately. However the
        lock is not released until after all relevant operations
        in the write-queue have been flushed to disk. This means
        (for example) that the database may remain locked for some 
        time after a "COMMIT" or "ROLLBACK" is issued.

 If an application using asynchronous IO executes transactions
        in quick succession, other database users may be effectively
        locked out of the database. This is because when a BEGIN
        is executed, a database lock is established immediately. But
        when the corresponding COMMIT or ROLLBACK occurs, the lock
        is not released until the relevant part of the write-queue 
        has been flushed through. As a result, if a COMMIT is followed
        by a BEGIN before the write-queue is flushed through, the database 
        is never unlocked,preventing other processes from accessing 
        the database.


File-locking may be disabled at runtime using the sqlite3async_control()
API (see below). This may improve performance when an NFS or other 
network file-system, as the synchronous round-trips to the server be 
required to establish file locks are avoided. However, if multiple 
connections attempt to access the same database file when file-locking
is disabled, application crashes and database corruption is a likely
outcome.


2.0 COMPILATION AND USAGE


The asynchronous IO extension consists of a single file of C code
(sqlite3async.c), and a header file (sqlite3async.h), located in the

ext/async/ subfolder of the SQLite source tree, that defines the 
C API used by applications to activate and control the modules 
functionality.


To use the asynchronous IO extension, compile sqlite3async.c as
part of the application that uses SQLite. Then use the APIs defined
in sqlite3async.h to initialize and configure the module.


The asynchronous IO VFS API is described in detail in comments in 
sqlite3async.h. Using the API usually consists of the following steps:


Register the asynchronous IO VFS with SQLite by calling the
       sqlite3async_initialize() function.

Create a background thread to perform write operations and call
       sqlite3async_run().

Use the normal SQLite API to read and write to databases via 
       the asynchronous IO VFS.


Refer to comments in the

sqlite3async.h header file for details.


3.0 PORTING

Currently the asynchronous IO extension is compatible with win32 systems
and systems that support the pthreads interface, including Mac OS X, Linux, 
and other varieties of Unix. 

To port the asynchronous IO extension to another platform, the user must
implement mutex and condition variable primitives for the new platform.
Currently there is no externally available interface to allow this, but
modifying the code within sqlite3async.c to include the new platforms
concurrency primitives is relatively easy. Search within sqlite3async.c
for the comment string "PORTING FUNCTIONS" for details. Then implement
new versions of each of the following:


static void async_mutex_enter(int eMutex);
static void async_mutex_leave(int eMutex);
static void async_cond_wait(int eCond, int eMutex);
static void async_cond_signal(int eCond);
static void async_sched_yield(void);


The functionality required of each of the above functions is described
in comments in sqlite3async.c.
This page last modified on  2012-12-03 20:10:10 UTCasyncvfs.html
½½¼7‚u      Wø'An Asynchronous I/O Module For SQLiteAn Asynchronous I/O Module For SQLite


NOTE: 
WAL mode with PRAGMA synchronous set to NORMAL avoids calls to
fsync() during transaction commit and only invokes fsync() during
a checkpoint operation.  The use of WAL mode largely obviates the
need for this asynchronous I/O module.  Hence, this module is no longer
supported.  The source code continues to exist in the SQLite source tree,
but it is not a part of any standard build and is no longer maintained.
This documentation is retained for historical reference.

Normally, when SQLite writes to a database file, it waits until the write
operation is finished before returning control to the calling application.
Since writing to the file-system is usually very slow compared with CPU
bound operations, this can be a performance bottleneck. The asynchronous I/O
backend is an extension that causes SQLite to perform all write requests
using a separate thread running in the background. Although this does not
reduce the overall system resources (CPU, disk bandwidth etc.), it does
allow SQLite to return control to the caller quickly even when writing to
the database.

1.0 FUNCTIONALITY

With asynchronous I/O, write requests are handled by a separate thread
running in the background.  This means that the thread that initiates
a database write does not have to wait for (sometimes slow) disk I/O
to occur.  The write seems to happen very quickly, though in reality
it is happening at its usual slow pace in the background.

Asynchronous I/O appears to give better responsiveness, but at a price.
You lose the Durable property.  With the default I/O backend of SQLite,
once a write completes, you know that the information you wrote is
safely on disk.  With the asynchronous I/O, this is not the case.  If
your program crashes or if a power loss occurs after the database
write but before the asynchronous write thread has completed, then the
database change might never make it to disk and the next user of the
database might not see your change.

You lose Durability with asynchronous I/O, but you still retain the
other parts of ACID:  Atomic,  Consistent, and Isolated.  Many
applications get along fine without the Durability.

1.1 How it Works

Asynchronous I/O works by creating an SQLite VFS object
and registering it with sqlite3_vfs_register().
When files opened via 
this VFS are written to (using the vfs xWrite() method), the data is not 
written directly to disk, but is placed in the "write-queue" to be
handled by the background thread.

When files opened with the asynchronous VFS are read from 
(using the vfs xRead() method), the data is read from the file on 
disk and the write-queue, so that from the point of view of
the vfs reader the xWrite() appears to have already completed.

The asynchronous I/O VFS is registered (and unregistered) by calls to the 
API functions sqlite3async_initialize() and sqlite3async_shutdown().
See section "Compilation and Usage" below for details.

1.2 Limitations

In order to gain experience with the main ideas surrounding asynchronous 
IO, this implementation is deliberately kept simple. Additional 
capabilities may be added in the future.

For example, as currently implemented, if writes are happening at a 
steady stream that exceeds the I/O capability of the background writer
thread, the queue of pending write operations will grow without bound.
If this goes on for long enough, the host system could run out of memory. 
A more sophisticated module could to keep track of the quantity of 
pending writes and stop accepting new write requests when the queue of 
pending writeFIly.
      This change allows the xAccess() method to report failures.
      In association with this signature change, a new 
      extended error code SQLITE_IOERR_ACCESS has been added.
      

      The xGetTempname method has been removed from sqlite3_vfs.
      In its place, the xOpen method is enhanced to open a temporary file
      of its own invention when the filename parameter is NULL.

      Added the xGetLastError() method to sqlite3_vfs for returning
      filesystem-specific error messages and error codes back to
      SQLite.
      
  

  The signature of the xCheckReservedLock method on sqlite3_io_methods
      has been modified so that it returns an error code and stores its
      boolean result into an integer pointed to by a parameter.  In
      association with this change, a new extended error code
      SQLITE_IOERR_CHECKRESERVEDLOCK has been added.

  When SQLite is ported to new operating systems (operating systems 
      other than Unix, Windows, and OS/2 for which ports are provided together
      with the core)
      two new functions, sqlite3_os_init() and sqlite3_os_end(), must
      be provided as part of the port.

  The way in which the IN and NOT IN operators handle NULL values
      in their right-hand expressions has been brought into compliance with
      the SQL standard and with other SQL database engines.

  The column names for the result sets of SELECT statements have
      been tweaked in some cases to work more like other SQL database
      engines.      

  Changes to compile-time options:

      
      The SQLITE_MUTEX_APPDEF compile-time parameter is no longer
      recognized.  As a replacement, alternative 
      mutex implementations may be created
      at runtime using sqlite3_config() with the SQLITE_CONFIG_MUTEX
      operator and the sqlite3_mutex_methods object.

      Compile-time options OS_UNIX, OS_WIN, OS_OS2, OS_OTHER, and
      TEMP_STORE have been renamed to include an "SQLITE_" prefix in order
      to help avoid namespace collisions with application software.  The
      new names of these options are respectively:
      SQLITE_OS_UNIX, SQLITE_OS_WIN, SQLITE_OS_OS2, SQLITE_OS_OTHER,
      and SQLITE_TEMP_STORE.
      
  
  

1.2 Changes To The VFS Layer
  SQLite version 3.5.0 introduced a new OS interface layer that
  provided an abstraction of the underlying operating system.
  This was an important innovation and has proven to be helpful
  in porting and maintaining SQLite.
  However, the developers have discovered some minor flaws in the
  original "virtual file system" design introduced in version 3.5.0
  and so SQLite 3.6.0 includes some small incompatible changes
  to address these flaws.


  Key Point:  The incompatible
  changes in the SQLite operating-system interface for version 3.6.0
  only affect the rare applications that make use of the 
  virtual file system interface or that
  supply an application-defined mutex implementation
  or that make use of other obscure compile-time options.  The
  changes introduced by SQLite version 3.6.0 will have zero impact on the
  vast majority of SQLite applications that use the built-in interfaces
  to Unix, Windows, and OS/2 and that use the standard build configuration.

1.3 Changes In The Way The IN Operator Handles NULLs
  All versions of SQLite up to and including version 3.5.9 have mishandled
  NULL values on the right-hand side of IN and NOT IN operators.
  Specifically, SQLite has previously ignored NULLs on the right-hand side
  of IN and NOT IN.


  Suppose we have a table X1 defined as follows:


  CREATE TABLE x1(x INTEGER);
  INSERT INTO x1 VALUES(1);
  INSERT INTO x1 VALUES(2);
  INSERT INTO x1 VALUES(NULL);

  Given the definition of X1 above, the following expressions have
  historically evaluated to FALSE in SQLite, though the correct
  answer is actually NULL:


  3 IN (1,2,NULL)
  3 IN (SELECT * FROM x1)

  Similarly, the following expressions have historically evaluated to
  TRUE when in fact NULL is also the correct answer here:


  3 NOT IN (1,2,NULL)
  3 NOT IN (SELECT * FROM x1)

  The historical behavior of SQLite is incorrect according to the SQL:1999
  standard and it is inconsistent with the behavior of MySQL and
  PostgreSQL.  Version 3.6.0 changes the behavior of the IN and
  NOT IN operators to conform to the standard and to give the same
  results as other SQL database engines.


  Key Point: The change to the way NULL values are handled
  by the IN and NOT IN operators is technically a bug fix, not a design
  change.  However, maintainers should check to ensure that applications
  do not depend on the older, buggy behavior prior to upgrading to
  version 3.6.0.

1.4 Changes To Column Naming Rules
  The column names reported by join subqueries have been modified slightly
  in order to work more like other database engines.  Consider the following
  query:


  CREATE TABLE t1(a);
  CREATE TABLE t2(x);
  SELECT * FROM (SELECT t1.a FROM t1 JOIN t2 ORDER BY t2.x LIMIT 1) ORDER BY 1;

  In version 3.5.9 the query above would return a single column named "t1.a".
  In version 3.6.0 the column name is just "a".


  SQLite has never made any promises about the names of columns in the
  result set of SELECT statement unless the column contains an AS clause.
  So this change to column name is technically not an incompatibility.
  SQLite is merely changing from one undefined behavior to another.
  Nevertheless, many applications depend on the unspecified column naming
  behavior of SQLite and so this change is discussed under the
  incompatible changes subheading.

1.5 Changes To Compile-Time Options
  Compile-time options to SQLite are controlled by C-preprocessor 
  macros.  SQLite version 3.6.0 changes the names of some of these
  macros so that all C-preprocessor macros that are specific to
  SQLite begin with the "SQLITE_" prefix.  This is done to reduce the
  risk of name collisions with other software modules.


  Key Point:  Changes to compile-time options have the
  potential to affect makefiles in projects that do customized builds of
  SQLite. These changes should have zero impact on application code and for
  most projects which use a standard, default build of SQLite.

2.0 Fully Backwards-Compatible Enhancements
  In addition to the incompatible changes listed above, SQLite
  version 3.6.0 adds the following backwards compatible changes and
  enhancements:


  

  The new sqlite3_config() interface allows an application
  to customize the behavior of SQLite at run-time.  Customizations possible
  using sqlite3_config() include the following:
  
  Specify an alternative mutex implementation using the
  SQLITE_CONFIG_MUTEX verb with the sqlite3_mutex_methods object.
  Specify an alternative malloc implementation using the
  SQLITE_CONFIG_MALLOC verb with the sqlite3_mem_methods object.
  Partially or fully disable the use of mutexes using
  SQLITE_CONFIG_SINGLETHREAD, SQLITE_CONFIG_MULTITHREAD and
  SQLITE_CONFIG_SERIALIZED.
  
  

  A new flag SQLITE_OPEN_NOMUTEX is made available to the
  sqlite3_open_v2() interface.

  The new sqlite3_status() interface allows an application to query
  the performance status of SQLite at runtime.
  

  The sqlite3_memory_used() and sqlite3_memory_highwater()
  interfaces are deprecated.  The equivalent functionality is now available
  through sqlite3_status().

  The sqlite3_initialize() interface can be called to explicitly
  initialize the SQLite subsystem.  The sqlite3_initialize() interface is
  called automatically when invoking certain interfaces so the use of
  sqlite3_initialize() is not required, but it is recommended.

  The sqlite3_shutdown() interface causes SQLite to release any
  system resources (memory allocations, mutexes, open file handles)
  that might have been allocated by sqlite3_initialize().

  The sqlite3_next_stmt() interface allows an application to discover
  all prepared statements associated with a database connection.

  Added the page_count PRAGMA for returning the size of the underlying
  database file in pages.

  Added a new R*Tree index extension.

  


This page last modified on  2016-09-28 14:07:03 UTC35to36.html
´´È<‚v
a#SQLite Changes From Version 3.5.9 To 3.6.0Moving From SQLite 3.5.9 to 3.6.0
  SQLite version 3.6.0 (2008-07-16)
  contains many changes.  As is the custom with
  the SQLite project, most changes are fully backwards compatible.
  However, a few of the changes in version 3.6.0 are incompatible and
  might require modifications to application code and/or makefiles.
  This document is a briefing on the changes in SQLite 3.6.0
  with special attention to the incompatible changes.


  Key Points:
  
   The database file format is unchanged. 
   All incompatibilities are on obscure interfaces and hence should
       have zero impact on most applications. 
  

1.0 Incompatible Changes
  Incompatible changes are covered first since they are the most
  important to maintainers and programmers.

1.1 Overview Of Incompatible Changes
  
  Changes to the sqlite3_vfs object

      
      The signature of the xAccess method has been modified to
      return an error code and to store its output into an integer pointed
      to by a parameter, rather than returning the output directHL      to sqlite_open.
A zero-terminated string containing the text of one or more
       SQL statements and/or queries to be processed.
A pointer to a callback function which is invoked once for each
       row in the result of a query.  This argument may be NULL, in which
       case no callbacks will ever be invoked.
A pointer that is forwarded to become the first argument
       to the callback function.
A pointer to an error string.  Error messages are written to space
       obtained from malloc() and the error string is made to point to
       the malloced space.  The calling function is responsible for freeing
       this space when it has finished with it.
       This argument may be NULL, in which case error messages are not
       reported back to the calling function.



The callback function is used to receive the results of a query.  A
prototype for the callback function is as follows:


int Callback(void *pArg, int argc, char **argv, char **columnNames){
  return 0;
}



The first argument to the callback is just a copy of the fourth argument
to sqlite_exec  This parameter can be used to pass arbitrary
information through to the callback function from client code.
The second argument is the number of columns in the query result.
The third argument is an array of pointers to strings where each string
is a single column of the result for that record.  Note that the
callback function reports a NULL value in the database as a NULL pointer,
which is very different from an empty string.  If the i-th parameter
is an empty string, we will get:

argv&#91;i]&#91;0] == 0

But if the i-th parameter is NULL we will get:

argv&#91;i] == 0


The names of the columns are contained in first argc
entries of the fourth argument.
If the SHOW_DATATYPES pragma
is on (it is off by default) then
the second argc entries in the 4th argument are the datatypes
for the corresponding columns.


If the 
EMPTY_RESULT_CALLBACKS pragma is set to ON and the result of
a query is an empty set, then the callback is invoked once with the
third parameter (argv) set to 0.  In other words

argv == 0

The second parameter (argc)
and the fourth parameter (columnNames) are still valid
and can be used to determine the number and names of the result
columns if there had been a result.
The default behavior is not to invoke the callback at all if the
result set is empty.


The callback function should normally return 0.  If the callback
function returns non-zero, the query is immediately aborted and 
sqlite_exec will return SQLITE_ABORT.

1.4 Error Codes


The sqlite_exec function normally returns SQLITE_OK.  But
if something goes wrong it can return a different value to indicate
the type of error.  Here is a complete list of the return codes:



#define SQLITE_OK           0   /* Successful result */
#define SQLITE_ERROR        1   /* SQL error or missing database */
#define SQLITE_INTERNAL     2   /* An 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 sqlite_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   /* (Internal Only) Table or record not found */
#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 Only) Database table is empty */
#define SQLITE_SCHEMA      17   /* The database schema changed */
#define SQLITE_TOOBIG      18   /* Too much data for onMe row of a table */
#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_ROW         100  /* sqlite_step() has another row ready */
#define SQLITE_DONE        101  /* sqlite_step() has finished executing */



The meanings of these various return values are as follows:




SQLITE_OK
This value is returned if everything worked and there were no errors.

SQLITE_INTERNAL
This value indicates that an internal consistency check within
the SQLite library failed.  This can only happen if there is a bug in
the SQLite library.  If you ever get an SQLITE_INTERNAL reply from
an sqlite_exec call, please report the problem on the SQLite
mailing list.

SQLITE_ERROR
This return value indicates that there was an error in the SQL
that was passed into the sqlite_exec.

SQLITE_PERM
This return value says that the access permissions on the database
file are such that the file cannot be opened.

SQLITE_ABORT
This value is returned if the callback function returns non-zero.

SQLITE_BUSY
This return code indicates that another program or thread has
the database locked.  SQLite allows two or more threads to read the
database at the same time, but only one thread can have the database
open for writing at the same time.  Locking in SQLite is on the
entire database.

SQLITE_LOCKED
This return code is similar to SQLITE_BUSY in that it indicates
that the database is locked.  But the source of the lock is a recursive
call to sqlite_exec.  This return can only occur if you attempt
to invoke sqlite_exec from within a callback routine of a query
from a prior invocation of sqlite_exec.  Recursive calls to
sqlite_exec are allowed as long as they do
not attempt to write the same table.

SQLITE_NOMEM
This value is returned if a call to malloc fails.

SQLITE_READONLY
This return code indicates that an attempt was made to write to
a database file that is opened for reading only.

SQLITE_INTERRUPT
This value is returned if a call to sqlite_interrupt
interrupts a database operation in progress.

SQLITE_IOERR
This value is returned if the operating system informs SQLite
that it is unable to perform some disk I/O operation.  This could mean
that there is no more space left on the disk.

SQLITE_CORRUPT
This value is returned if SQLite detects that the database it is
working on has become corrupted.  Corruption might occur due to a rogue
process writing to the database file or it might happen due to a
previously undetected logic error in of SQLite. This value is also
returned if a disk I/O error occurs in such a way that SQLite is forced
to leave the database file in a corrupted state.  The latter should only
happen due to a hardware or operating system malfunction.

SQLITE_FULL
This value is returned if an insertion failed because there is
no space left on the disk, or the database is too big to hold any
more information.  The latter case should only occur for databases
that are larger than 2GB in size.

SQLITE_CANTOPEN
This value is returned if the database file could not be opened
for some reason.

SQLITE_PROTOCOL
This value is returned if some other process is messing with
file locks and has violated the file locking protocol that SQLite uses
on its rollback journal files.

SQLITE_SCHEMA
When the database first opened, SQLite reads the database schema
into memory and uses that schema to parse new SQL statements.  If another
process changes the schema, the command currently being processed will
abort because the virtual machine code generated assumed the old
schema.  This is the return code for such cases.  Retrying the
command usually will clear the problem.

SQLITE_TOOBIG
SQLite will not store more than about 1 megabyte of data in a single
row of a single table.  If you attempt to store more than 1 megabyte
in a single row, this is the return code you get.

SQLITE_CONSTRANINT
This constant is returned if the SQL statement would have violated
a database constraint.

SQLITE_MISMATCH
This error occurs when there is an attempt to insert non-integer
data into a column labeled INTEGER PRIMARY KEY.  For most columns, SQLite
ignores the data type and allows any kind of data to be stored.  But
an INTEGER PRIMARY KEY column is only allowed to store integer data.

SQLITE_MISUSE
This error might occur if one or more of the SQLite API routines
is used incorrectly.  Examples of incorrect usage include calling
sqlite_exec after the database has been closed using
sqlite_close or 
calling sqlite_exec with the same
database pointer simultaneously from two separate threads.

SQLITE_NOLFS
This error means that you have attempts to create or access a file
database file that is larger that 2GB on a legacy Unix machine that
lacks large file support.

SQLITE_AUTH
This error indicates that the authorizer callback
has disallowed the SQL you are attempting to execute.

SQLITE_ROW
This is one of the return codes from the
sqlite_step routine which is part of the non-callback API.
It indicates that another row of result data is available.

SQLITE_DONE
This is one of the return codes from the
sqlite_step routine which is part of the non-callback API.
It indicates that the SQL statement has been completely executed and
the sqlite_finalize routine is ready to be called.




2.0 Accessing Data Without Using A Callback Function


The sqlite_exec routine described above used to be the only
way to retrieve data from an SQLite database.  But many programmers found
it inconvenient to use a callback function to obtain results.  So beginning
with SQLite version 2.7.7, a second access interface is available that
does not use callbacks.



The new interface uses three separate functions to replace the single
sqlite_exec function.



typedef struct sqlite_vm sqlite_vm;

int sqlite_compile(
  sqlite *db,              /* The open database */
  const char *zSql,        /* SQL statement to be compiled */
  const char **pzTail,     /* OUT: uncompiled tail of zSql */
  sqlite_vm **ppVm,        /* OUT: the virtual machine to execute zSql */
  char **pzErrmsg          /* OUT: Error message. */
);

int sqlite_step(
  sqlite_vm *pVm,          /* The virtual machine to execute */
  int *pN,                 /* OUT: Number of columns in result */
  const char ***pazValue,  /* OUT: Column data */
  const char ***pazColName /* OUT: Column names and datatypes */
);

int sqlite_finalize(
  sqlite_vm *pVm,          /* The virtual machine to be finalized */
  char **pzErrMsg          /* OUT: Error message */
);



The strategy is to compile a single SQL statement using
sqlite_compile then invoke sqlite_step multiple times,
once for each row of output, and finally call sqlite_finalize
to clean up after the SQL has finished execution.


2.1 Compiling An SQL Statement Into A Virtual Machine


The sqlite_compile "compiles" a single SQL statement (specified
by the second parameter) and generates a virtual machine that is able
to execute that statement.  
As with must interface routines, the first parameter must be a pointer
to an sqlite structure that was obtained from a prior call to
sqlite_open.


A pointer to the virtual machine is stored in a pointer which is passed
in as the 4th parameter.
Space to hold the virtual machine is dynamically allocated.  To avoid
a memory leak, the calling function must invoke
sqlite_finalize on the virtual machine after it has finished
with it.
The 4th parameter may be set to NULL if an error is encountered during
compilation.



If any errors are encountered during compilation, an error message is
written into memory obtained from malloc and the 5th parameter
is made to point to that memory.  If the 5th parameter is NULL, then
no error message is generated.  If the 5th parameter is not NULL, then
the calling function should dispose of the memory containing the error
message by calling sqlite_freemem.



If the 2nd parameter actually contains two or more statements of SQL,
only the first statement is compiled.  (ThisO is different from the
behavior of sqlite_exec which executes all SQL statements
in its input string.)  The 3rd parameter to sqlite_compile
is made to point to the first character beyond the end of the first
statement of SQL in the input.  If the 2nd parameter contains only
a single SQL statement, then the 3rd parameter will be made to point
to the '\000' terminator at the end of the 2nd parameter.



On success, sqlite_compile returns SQLITE_OK.
Otherwise and error code is returned.


2.2 Step-By-Step Execution Of An SQL Statement


After a virtual machine has been generated using sqlite_compile
it is executed by one or more calls to sqlite_step.  Each
invocation of sqlite_step, except the last one,
returns a single row of the result.
The number of columns in  the result is stored in the integer that
the 2nd parameter points to.
The pointer specified by the 3rd parameter is made to point
to an array of pointers to column values.
The pointer in the 4th parameter is made to point to an array
of pointers to column names and datatypes.
The 2nd through 4th parameters to sqlite_step convey the
same information as the 2nd through 4th parameters of the
callback routine when using
the sqlite_exec interface.  Except, with sqlite_step
the column datatype information is always included in the in the
4th parameter regardless of whether or not the
SHOW_DATATYPES pragma
is on or off.



Each invocation of sqlite_step returns an integer code that
indicates what happened during that step.  This code may be
SQLITE_BUSY, SQLITE_ROW, SQLITE_DONE, SQLITE_ERROR, or
SQLITE_MISUSE.



If the virtual machine is unable to open the database file because
it is locked by another thread or process, sqlite_step
will return SQLITE_BUSY.  The calling function should do some other
activity, or sleep, for a short amount of time to give the lock a
chance to clear, then invoke sqlite_step again.  This can
be repeated as many times as desired.



Whenever another row of result data is available,
sqlite_step will return SQLITE_ROW.  The row data is
stored in an array of pointers to strings and the 2nd parameter
is made to point to this array.



When all processing is complete, sqlite_step will return
either SQLITE_DONE or SQLITE_ERROR.  SQLITE_DONE indicates that the
statement completed successfully and SQLITE_ERROR indicates that there
was a run-time error.  (The details of the error are obtained from
sqlite_finalize.)  It is a misuse of the library to attempt
to call sqlite_step again after it has returned SQLITE_DONE
or SQLITE_ERROR.



When sqlite_step returns SQLITE_DONE or SQLITE_ERROR,
the *pN and *pazColName values are set to the number of columns
in the result set and to the names of the columns, just as they
are for an SQLITE_ROW return.  This allows the calling code to
find the number of result columns and the column names and datatypes
even if the result set is empty.  The *pazValue parameter is always
set to NULL when the return codes is SQLITE_DONE or SQLITE_ERROR.
If the SQL being executed is a statement that does not
return a result (such as an INSERT or an UPDATE) then *pN will
be set to zero and *pazColName will be set to NULL.



If you abuse the library by trying to call sqlite_step
inappropriately it will attempt return SQLITE_MISUSE.
This can happen if you call sqlite_step() on the same virtual machine
at the same
time from two or more threads or if you call sqlite_step()
again after it returned SQLITE_DONE or SQLITE_ERROR or if you
pass in an invalid virtual machine pointer to sqlite_step().
You should not depend on the SQLITE_MISUSE return code to indicate
an error.  It is possible that a misuse of the interface will go
undetected and result in a program crash.  The SQLITE_MISUSE is
intended as a debugging aid only - to help you detect incorrect
usage prior to a mishap.  The misuse detection logic is not guaranteed
to work in every case.


2.3 Deleting A Virtual Machine


Every virtual machine that sqlite_compile creates should
eventually be handed to sqlite_finalize.  The sqlite_finalize()
procedure deallocates the memory and otPher resources that the virtual
machine uses.  Failure to call sqlite_finalize() will result in 
resource leaks in your program.



The sqlite_finalize routine also returns the result code
that indicates success or failure of the SQL operation that the
virtual machine carried out.
The value returned by sqlite_finalize() will be the same as would
have been returned had the same SQL been executed by sqlite_exec.
The error message returned will also be the same.



It is acceptable to call sqlite_finalize on a virtual machine
before sqlite_step has returned SQLITE_DONE.  Doing so has
the effect of interrupting the operation in progress.  Partially completed
changes will be rolled back and the database will be restored to its
original state (unless an alternative recovery algorithm is selected using
an ON CONFLICT clause in the SQL being executed.)  The effect is the
same as if a callback function of sqlite_exec had returned
non-zero.



It is also acceptable to call sqlite_finalize on a virtual machine
that has never been passed to sqlite_step even once.


3.0 The Extended API

Only the three core routines described in section 1.0 are required to use
SQLite.  But there are many other functions that provide 
useful interfaces.  These extended routines are as follows:



int sqlite_last_insert_rowid(sqlite*);

int sqlite_changes(sqlite*);

int sqlite_get_table(
  sqlite*,
  char *sql,
  char ***result,
  int *nrow,
  int *ncolumn,
  char **errmsg
);

void sqlite_free_table(char**);

void sqlite_interrupt(sqlite*);

int sqlite_complete(const char *sql);

void sqlite_busy_handler(sqlite*, int (*)(void*,const char*,int), void*);

void sqlite_busy_timeout(sqlite*, int ms);

const char sqlite_version&#91;];

const char sqlite_encoding&#91;];

int sqlite_exec_printf(
  sqlite*,
  char *sql,
  int (*)(void*,int,char**,char**),
  void*,
  char **errmsg,
  ...
);

int sqlite_exec_vprintf(
  sqlite*,
  char *sql,
  int (*)(void*,int,char**,char**),
  void*,
  char **errmsg,
  va_list
);

int sqlite_get_table_printf(
  sqlite*,
  char *sql,
  char ***result,
  int *nrow,
  int *ncolumn,
  char **errmsg,
  ...
);

int sqlite_get_table_vprintf(
  sqlite*,
  char *sql,
  char ***result,
  int *nrow,
  int *ncolumn,
  char **errmsg,
  va_list
);

char *sqlite_mprintf(const char *zFormat, ...);

char *sqlite_vmprintf(const char *zFormat, va_list);

void sqlite_freemem(char*);

void sqlite_progress_handler(sqlite*, int, int (*)(void*), void*);



All of the above definitions are included in the "sqlite.h"
header file that comes in the source tree.

3.1 The ROWID of the most recent insert

Every row of an SQLite table has a unique integer key.  If the
table has a column labeled INTEGER PRIMARY KEY, then that column
serves as the key.  If there is no INTEGER PRIMARY KEY column then
the key is a unique integer.  The key for a row can be accessed in
a SELECT statement or used in a WHERE or ORDER BY clause using any
of the names "ROWID", "OID", or "_ROWID_".

When you do an insert into a table that does not have an INTEGER PRIMARY
KEY column, or if the table does have an INTEGER PRIMARY KEY but the value
for that column is not specified in the VALUES clause of the insert, then
the key is automatically generated.  You can find the value of the key
for the most recent INSERT statement using the
sqlite_last_insert_rowid API function.

3.2 The number of rows that changed

The sqlite_changes API function returns the number of rows
that have been inserted, deleted, or modified since the database was
last quiescent.  A "quiescent" database is one in which there are
no outstanding calls to sqlite_exec and no VMs created by
sqlite_compile that have not been finalized by sqlite_finalize.
In common usage, sqlite_changes returns the number
of rows inserted, deleted, or modified by the most recent sqlite_exec
call or since the most recent sqlite_compile.  But if you have
nested calls to sqlite_exec (that is, if the callback routine
of one sqlite_exec invokes another sqlite_exec) or if
you invoke sqlite_compile to create a new VM while there is
still anotherQ VM in existence, then
the meaning of the number returned by sqlite_changes is more
complex.
The number reported includes any changes
that were later undone by a ROLLBACK or ABORT.  But rows that are
deleted because of a DROP TABLE are not counted.

SQLite implements the command "DELETE FROM table" (without
a WHERE clause) by dropping the table then recreating it.  
This is much faster than deleting the elements of the table individually.
But it also means that the value returned from sqlite_changes
will be zero regardless of the number of elements that were originally
in the table.  If an accurate count of the number of elements deleted
is necessary, use "DELETE FROM table WHERE 1" instead.

3.3 Querying into memory obtained from malloc()

The sqlite_get_table function is a wrapper around
sqlite_exec that collects all the information from successive
callbacks and writes it into memory obtained from malloc().  This
is a convenience function that allows the application to get the
entire result of a database query with a single function call.

The main result from sqlite_get_table is an array of pointers
to strings.  There is one element in this array for each column of
each row in the result.  NULL results are represented by a NULL
pointer. In addition to the regular data, there is an added row at the 
beginning of the array that contains the name of each column of the
result.

As an example, consider the following query:


SELECT employee_name, login, host FROM users WHERE login LIKE 'd%';


This query will return the name, login and host computer name
for every employee whose login begins with the letter "d".  If this
query is submitted to sqlite_get_table the result might
look like this:


nrow = 2
ncolumn = 3
result&#91;0] = "employee_name"
result&#91;1] = "login"
result&#91;2] = "host"
result&#91;3] = "dummy"
result&#91;4] = "No such user"
result&#91;5] = 0
result&#91;6] = "D. Richard Hipp"
result&#91;7] = "drh"
result&#91;8] = "zadok"


Notice that the "host" value for the "dummy" record is NULL so
the result&#91;] array contains a NULL pointer at that slot.

If the result set of a query is empty, then by default
sqlite_get_table will set nrow to 0 and leave its
result parameter is set to NULL.  But if the EMPTY_RESULT_CALLBACKS
pragma is ON then the result parameter is initialized to the names
of the columns only.  For example, consider this query which has
an empty result set:


SELECT employee_name, login, host FROM users WHERE employee_name IS NULL;



The default behavior gives this results:



nrow = 0
ncolumn = 0
result = 0



But if the EMPTY_RESULT_CALLBACKS pragma is ON, then the following
is returned:



nrow = 0
ncolumn = 3
result&#91;0] = "employee_name"
result&#91;1] = "login"
result&#91;2] = "host"


Memory to hold the information returned by sqlite_get_table
is obtained from malloc().  But the calling function should not try
to free this information directly.  Instead, pass the complete table
to sqlite_free_table when the table is no longer needed.
It is safe to call sqlite_free_table with a NULL pointer such
as would be returned if the result set is empty.

The sqlite_get_table routine returns the same integer
result code as sqlite_exec.

3.4 Interrupting an SQLite operation

The sqlite_interrupt function can be called from a
different thread or from a signal handler to cause the current database
operation to exit at its first opportunity.  When this happens,
the sqlite_exec routine (or the equivalent) that started
the database operation will return SQLITE_INTERRUPT.

3.5 Testing for a complete SQL statement

The next interface routine to SQLite is a convenience function used
to test whether or not a string forms a complete SQL statement.
If the sqlite_complete function returns true when its input
is a string, then the argument forms a complete SQL statement.
There are no guarantees that the syntax of that statement is correct,
but we at least know the statement is complete.  If sqlite_complete
returns false, then more text is required to complete the SQL statement.

For the purpose of the sqlitRe_complete function, an SQL
statement is complete if it ends in a semicolon.

The sqlite command-line utility uses the sqlite_complete
function to know when it needs to call sqlite_exec.  After each
line of input is received, sqlite calls sqlite_complete
on all input in its buffer.  If sqlite_complete returns true, 
then sqlite_exec is called and the input buffer is reset.  If
sqlite_complete returns false, then the prompt is changed to
the continuation prompt and another line of text is read and added to
the input buffer.

3.6 Library version string

The SQLite library exports the string constant named
sqlite_version which contains the version number of the
library.  The header file contains a macro SQLITE_VERSION
with the same information.  If desired, a program can compare
the SQLITE_VERSION macro against the sqlite_version
string constant to verify that the version number of the
header file and the library match. 

3.7 Library character encoding

By default, SQLite assumes that all data uses a fixed-size
8-bit character (iso8859).  But if you give the --enable-utf8 option
to the configure script, then the library assumes UTF-8 variable
sized characters.  This makes a difference for the LIKE and GLOB
operators and the LENGTH() and SUBSTR() functions.  The static
string sqlite_encoding will be set to either "UTF-8" or
"iso8859" to indicate how the library was compiled.  In addition,
the sqlite.h header file will define one of the
macros SQLITE_UTF8 or SQLITE_ISO8859, as appropriate.

Note that the character encoding mechanism used by SQLite cannot
be changed at run-time.  This is a compile-time option only.  The
sqlite_encoding character string just tells you how the library
was compiled.

3.8 Changing the library's response to locked files

The sqlite_busy_handler procedure can be used to register
a busy callback with an open SQLite database.  The busy callback will
be invoked whenever SQLite tries to access a database that is locked.
The callback will typically do some other useful work, or perhaps sleep,
in order to give the lock a chance to clear.  If the callback returns
non-zero, then SQLite tries again to access the database and the cycle
repeats.  If the callback returns zero, then SQLite aborts the current
operation and returns SQLITE_BUSY.

The arguments to sqlite_busy_handler are the opaque
structure returned from sqlite_open, a pointer to the busy
callback function, and a generic pointer that will be passed as
the first argument to the busy callback.  When SQLite invokes the
busy callback, it sends it three arguments:  the generic pointer
that was passed in as the third argument to sqlite_busy_handler,
the name of the database table or index that the library is trying
to access, and the number of times that the library has attempted to
access the database table or index.

For the common case where we want the busy callback to sleep,
the SQLite library provides a convenience routine sqlite_busy_timeout.
The first argument to sqlite_busy_timeout is a pointer to
an open SQLite database and the second argument is a number of milliseconds.
After sqlite_busy_timeout has been executed, the SQLite library
will wait for the lock to clear for at least the number of milliseconds 
specified before it returns SQLITE_BUSY.  Specifying zero milliseconds for
the timeout restores the default behavior.

3.9 Using the _printf() wrapper functions

The four utility functions



sqlite_exec_printf()
sqlite_exec_vprintf()
sqlite_get_table_printf()
sqlite_get_table_vprintf()



implement the same query functionality as sqlite_exec
and sqlite_get_table.  But instead of taking a complete
SQL statement as their second argument, the four _printf
routines take a printf-style format string.  The SQL statement to
be executed is generated from this format string and from whatever
additional arguments are attached to the end of the function call.

There are two advantages to using the SQLite printf
functions instead of sprintf.  First of all, with the
SQLite printf routines, there is never a danger of overflowing a
static buffer as theSre is with sprintf.  The SQLite
printf routines automatically allocate (and later frees)
as much memory as is 
necessary to hold the SQL statements generated.

The second advantage the SQLite printf routines have over
sprintf are two new formatting options specifically designed
to support string literals in SQL.  Within the format string,
the %q formatting option works very much like %s in that it
reads a null-terminated string from the argument list and inserts
it into the result.  But %q translates the inserted string by
making two copies of every single-quote (') character in the
substituted string.  This has the effect of escaping the end-of-string
meaning of single-quote within a string literal. The %Q formatting
option works similar; it translates the single-quotes like %q and
additionally encloses the resulting string in single-quotes.
If the argument for the %Q formatting options is a NULL pointer,
the resulting string is NULL without single quotes.


Consider an example.  Suppose you are trying to insert a string
value into a database table where the string value was obtained from
user input.  Suppose the string to be inserted is stored in a variable
named zString.  The code to do the insertion might look like this:


sqlite_exec_printf(db,
  "INSERT INTO table1 VALUES('%s')",
  0, 0, 0, zString);


If the zString variable holds text like "Hello", then this statement
will work just fine.  But suppose the user enters a string like 
"Hi y'all!".  The SQL statement generated reads as follows:


INSERT INTO table1 VALUES('Hi y'all')


This is not valid SQL because of the apostrophe in the word "y'all".
But if the %q formatting option is used instead of %s, like this:


sqlite_exec_printf(db,
  "INSERT INTO table1 VALUES('%q')",
  0, 0, 0, zString);


Then the generated SQL will look like the following:


INSERT INTO table1 VALUES('Hi y''all')


Here the apostrophe has been escaped and the SQL statement is well-formed.
When generating SQL on-the-fly from data that might contain a
single-quote character ('), it is always a good idea to use the
SQLite printf routines and the %q formatting option instead of sprintf.


If the %Q formatting option is used instead of %q, like this:


sqlite_exec_printf(db,
  "INSERT INTO table1 VALUES(%Q)",
  0, 0, 0, zString);


Then the generated SQL will look like the following:


INSERT INTO table1 VALUES('Hi y''all')


If the value of the zString variable is NULL, the generated SQL
will look like the following:


INSERT INTO table1 VALUES(NULL)


All of the _printf() routines above are built around the following
two functions:


char *sqlite_mprintf(const char *zFormat, ...);
char *sqlite_vmprintf(const char *zFormat, va_list);


The sqlite_mprintf() routine works like the standard library
sprintf() except that it writes its results into memory obtained
from malloc() and returns a pointer to the malloced buffer.  
sqlite_mprintf() also understands the %q and %Q extensions described
above.  The sqlite_vmprintf() is a varargs version of the same
routine.  The string pointer that these routines return should be freed
by passing it to sqlite_freemem().


3.10 Performing background jobs during large queries

The sqlite_progress_handler() routine can be used to register a
callback routine with an SQLite database to be invoked periodically during long
running calls to sqlite_exec(), sqlite_step() and the various
wrapper functions.


The callback is invoked every N virtual machine operations, where N is
supplied as the second argument to sqlite_progress_handler(). The third
and fourth arguments to sqlite_progress_handler() are a pointer to the
routine to be invoked and a void pointer to be passed as the first argument to
it.


The time taken to execute each virtual machine operation can vary based on
many factors.  A typical value for a 1 GHz PC is between half and three million
per second but may be much higher or lower, depending on the query.  As such it
is difficult to schedule background operations based on virtual machine
operations. Instead, it is recommended that a callback be scheduled relatively
frequently (say every 1000 instructions) and external timer routines used to
determine whether or not background jobs need to be run.  



4.0 Adding New SQL Functions

Beginning with version 2.4.0, SQLite allows the SQL language to be
extended with new functions implemented as C code.  The following interface
is used:



typedef struct sqlite_func sqlite_func;

int sqlite_create_function(
  sqlite *db,
  const char *zName,
  int nArg,
  void (*xFunc)(sqlite_func*,int,const char**),
  void *pUserData
);
int sqlite_create_aggregate(
  sqlite *db,
  const char *zName,
  int nArg,
  void (*xStep)(sqlite_func*,int,const char**),
  void (*xFinalize)(sqlite_func*),
  void *pUserData
);

char *sqlite_set_result_string(sqlite_func*,const char*,int);
void sqlite_set_result_int(sqlite_func*,int);
void sqlite_set_result_double(sqlite_func*,double);
void sqlite_set_result_error(sqlite_func*,const char*,int);

void *sqlite_user_data(sqlite_func*);
void *sqlite_aggregate_context(sqlite_func*, int nBytes);
int sqlite_aggregate_count(sqlite_func*);



The sqlite_create_function() interface is used to create 
regular functions and sqlite_create_aggregate() is used to
create new aggregate functions.  In both cases, the db
parameter is an open SQLite database on which the functions should
be registered, zName is the name of the new function,
nArg is the number of arguments, and pUserData is
a pointer which is passed through unchanged to the C implementation
of the function.  Both routines return 0 on success and non-zero
if there are any errors.



The length of a function name may not exceed 255 characters.
Any attempt to create a function whose name exceeds 255 characters
in length will result in an error.



For regular functions, the xFunc callback is invoked once
for each function call.  The implementation of xFunc should call
one of the sqlite_set_result_... interfaces to return its
result.  The sqlite_user_data() routine can be used to
retrieve the pUserData pointer that was passed in when the
function was registered.



For aggregate functions, the xStep callback is invoked once
for each row in the result and then xFinalize is invoked at the
end to compute a final answer.  The xStep routine can use the
sqlite_aggregate_context() interface to allocate memory that
will be unique to that particular instance of the SQL function.
This memory will be automatically deleted after xFinalize is called.
The sqlite_aggregate_count() routine can be used to find out
how many rows of data were passed to the aggregate.  The xFinalize
callback should invoke one of the sqlite_set_result_...
interfaces to set the final result of the aggregate.



SQLite now implements all of its built-in functions using this
interface.  For additional information and examples on how to create
new SQL functions, review the SQLite source code in the file
func.c.


5.0 Multi-Threading And SQLite


If SQLite is compiled with the THREADSAFE preprocessor macro set to 1,
then it is safe to use SQLite from two or more threads of the same process
at the same time.  But each thread should have its own sqlite*
pointer returned from sqlite_open.  It is never safe for two
or more threads to access the same sqlite* pointer at the same time.



In precompiled SQLite libraries available on the website, the Unix
versions are compiled with THREADSAFE turned off but the Windows
versions are compiled with THREADSAFE turned on.  If you need something
different that this you will have to recompile.



Under Unix, an sqlite* pointer should not be carried across a
fork() system call into the child process.  The child process
should open its own copy of the database after the fork().


6.0 Usage Examples

For examples of how the SQLite C/C++ interface can be used,
refer to the source code for the sqlite program in the
file src/shell.c
of the source tree.
Additional information about sqlite is available at
cli.html.
See also the sources to the Tcl interface for SQLite in
the source file 
src/tclsqlite.c.
This page last modified on  2020-04-14 16:00:55 UTCc_interface.html
ùù‚¹Z‚w
e„ò5-The C language interface to SQLite Version 2Editorial Note:
This document describes SQLite version 2, which was deprecated and
replaced by SQLite3 in 2004.
This document is retained as part of the historical record of SQLite.
Modern programmers should refer to
more up-to-date documentation on SQLite is available elsewhere
on this website.

The C language interface to SQLite Version 2

The SQLite library is designed to be very easy to use from
a C or C++ program.  This document gives an overview of the C/C++
programming interface.

1.0 The Core API

The interface to the SQLite library consists of three core functions,
one opaque data structure, and some constants used as return values.
The core interface is as follows:


typedef struct sqlite sqlite;
#define SQLITE_OK           0   /* Successful result */

sqlite *sqlite_open(const char *dbname, int mode, char **errmsg);

void sqlite_close(sqlite *db);

int sqlite_exec(
  sqlite *db,
  char *sql,
  int (*xCallback)(void*,int,char**,char**),
  void *pArg,
  char **errmsg
);



The above is all you really need to know in order to use SQLite
in your C or C++ programs.  There are other interface functions
available (and described below) but we will begin by describing
the core functions shown above.



1.1 Opening a database

Use the sqlite_open function to open an existing SQLite
database or to create a new SQLite database.  The first argument
is the database name.  The second argument is intended to signal
whether the database is going to be used for reading and writing
or just for reading.  But in the current implementation, the
second argument to sqlite_open is ignored.
The third argument is a pointer to a string pointer.
If the third argument is not NULL and an error occurs
while trying to open the database, then an error message will be
written to memory obtained from malloc() and *errmsg will be made
to point to this error message.  The calling function is responsible
for freeing the memory when it has finished with it.

The name of an SQLite database is the name of a file that will
contain the database.  If the file does not exist, SQLite attempts
to create and initialize it.  If the file is read-only (due to
permission bits or because it is located on read-only media like
a CD-ROM) then SQLite opens the database for reading only.  The
entire SQL database is stored in a single file on the disk.  But
additional temporary files may be created during the execution of
an SQL command in order to store the database rollback journal or
temporary and intermediate results of a query.

The return value of the sqlite_open function is a
pointer to an opaque sqlite structure.  This pointer will
be the first argument to all subsequent SQLite function calls that
deal with the same database.  NULL is returned if the open fails
for any reason.


1.2 Closing the database

To close an SQLite database, call the sqlite_close
function passing it the sqlite structure pointer that was obtained
from a prior call to sqlite_open.
If a transaction is active when the database is closed, the transaction
is rolled back.


1.3 Executing SQL statements

The sqlite_exec function is used to process SQL statements
and queries.  This function requires 5 parameters as follows:


A pointer to the sqlite structure obtained from a prior call
 K
¾¾š>‚x        {³g/The Bytecode() And Tables_Used() Table-Valued Functions1. Overview


Bytecode and tables_used are virtual tables built into SQLite that
access information about prepared statements.
Both bytecode and tables_used operate as table-valued functions.
They take a single required argument which is either the text of
an SQL statement, or a pointer to an existing prepared statement.
The bytecode function returns one row of result for each bytecode
operation in the prepared statement.  The tables_used function returns
one row for each persistent btree (either a table or an index) accessed
by the prepared statement.

2. Usage


The bytecode and tables_used tables are only available if SQLite has
been compiled with the -DSQLITE_ENABLE_BYTECODE_VTAB compile-time option.
The CLI has been compiled that way, and so you can use the standard
CLI as a test platform to experiement.


Both virtual tables are read-only eponymous-only virtual tables.  You use them
by mentioning them directly in the FROM clause of a SELECT statement.
They both require a single argument which is the SQL statement to be
analyzed.  For example:

SELECT * FROM bytecode('SELECT * FROM bytecode(?1)');



The argument can be either the text of an SQL statement, in which case
the bytecode (or tables_used) for that statement is returned, or the
argument can be a parameter such as ?1 or $stmt that is later bound
to a prepared statement object using the
sqlite3_bind_pointer() interface.  Use a pointer type of
"stmt-pointer" for the sqlite3_bind_pointer() interface.

2.1. Schema


The schema of the bytecode table is:

CREATE TABLE bytecode(
  addr INT,
  opcode TEXT,
  p1 INT,
  p2 INT,
  p3 INT,
  p4 TEXT,
  p5 INT,
  comment TEXT,
  subprog TEXT,
  stmt HIDDEN
);



The first eight columns are the address, opcode, and operands for a
single bytecode in the virtual machine that implements the statement.
These columns are the same columns output when using EXPLAIN.  The
bytecode virtual tables shows all operations in the prepared statement,
both the main body of the prepared statement and in subprograms used
to implement triggers or foreign key actions.  The "subprog" field
is NULL for the main body of the prepared statement, or is the trigger
name or the string "(FK)" for triggers and foreign key actions.


The schema for the tables_used table is:

CREATE TABLE tables_used(
  type TEXT,
  schema TEXT,
  name TEXT,
  wr INT,
  subprog TEXT,
  stmt HIDDEN
);



The tables_used table is intended to show which btrees of the database file
are read or written by a prepared statement, both by the main statement
itself but also by related triggers and foreign key actions.  The columns
are as follows:


type &rarr; Either "table" or "index", depending on what role
the btree is serving.

schema &rarr; Which database file the btree is located in.
This will be "main" for the main database (the usual case), or "temp" for
TEMP tables and indexes, or the name assigned to attached databases by
the ATTACH statement.

name &rarr; The name of the table or index

wr &rarr; 0 if the object is read, 1 if the object is written

subprog &rarr;  The sub-program in which the object is
accessed.  NULL means the main body of the prepared statement.  Otherwise
this field is the name of a trigger or "(FK)" for a foreign key action.

This page last modified on  2020-05-20 17:42:32 UTCbytecodevtab.htmlW1709 separate files.

2. Operation

TH3 is a test program generator.  The output of TH3 is a program
implemented in C-code and intended to be
linked against the SQLite library under test.  The generated test
program is compiled and run on the target platform in order to verify
correct operation of SQLite on that platform.

The inputs to TH3 are test modules written in C or SQL and
small configuration
files that determine how to initialize SQLite.  The
TH3 package includes  1,444 test
modules and more than 47 configurations (as of 2018-05-19).
New modules and configurations
can be added to customize TH3 for specialized applications.
Each time TH3 is run, it reads
a subset of the available test modules and configuration files to generate
a custom C program that performs all of the specified tests under all
specified configurations.  A complete test of SQLite normally involves running
TH3 multiple times to generate multiple test programs covering different
aspects of SQLite's operation, then linking all test programs against
a common SQLite library and running them separately on the target platform.


There are no arbitrary limits in TH3.  One could generate a
single test program that contained all test modules and all configuration files.
However, such a test program might be too large to deploy on embedded
platforms.  (As of 2018-05-19, a full-up TH3 test is over 850,000 lines and
58MB of C code.)  TH3 provides the ability to break the library of test
modules up into smaller, more easily digested pieces.

Each individual test module might contain dozens, hundreds, or thousands
of separate tests.  The test modules can be written in C or as scripts of
SQL or a mixture of the two.  About two-thirds of the existing test modules are
written in pure SQL with the remainder either in pure C or a combination 
of C and SQL.


Each test module file contains a header which describes the circumstances
under which the test is valid.  For a particular configuration, only those
modules that are compatible with the configuration are run.  

3. Generating A Test Program

The TH3 program generator is a TCL script named "mkth3.tcl".
To generate a test program, one has merely to run this script and supply
the names of files containing test modules and configurations on the
command line.  Test modules are files that use the ".test" suffix
and configurations are files that use the ".cfg" suffix.  A
typical invocation of mkth3.tcl might look something like the following:

tclsh mkth3.tcl *.test *.cfg &gt;testprog1.c


The output from the mkth3.tcl script is a C program that contains
everything needed to run the tests - everything that is except for
the SQLite library itself.  The generated test program contains 
implementations for all of the support interfaces used by the test
modules and it contains the main() routine that drives the
tests.  To convert the test program into a working executable, simply
compile it against SQLite:

cc -o testprog1 testprog1.c sqlite3.c


The compilation step shown immediately above is merely representative.
In a working installation, one would normally want
to specify optimization parameters and compile-time switches on the
compiler command line.

For testing on embedded systems, the mkth3.tcl script and the compiler
steps shown above are performed on an ordinary workstation using
a cross-compiler, then the resulting test program is
transferred onto the device to be run.

Once the test program is generated, it is run with no arguments to
perform the tests.  Progress information as well as error diagnostics
appear on standard output.  (Alternative output arrangements can be made
using a compile-time option for embedded devices that lack a standard
output channel.) The program returns zero if there are no
errors and non-zero if any problems were detected.

Typical output from a single TH3 test program run looks like this:

With SQLite 3.8.11 2015-05-15 04:13:15 56ef98a04765c34c1c2f3ed7a6f03a732f3b886e
-DSQLITE_COVERAGE_TEST
-DSQLITE_NO_SYNC
-DSQLITE_SYSTEM_MALLOC
-DSQLITE_THREADSAFE=1
Config-begin c1.
Begin c1X.pager08
End c1.pager08
Begin c1.build33
End c1.build33
Begin c1.orderby01
End c1.orderby01
... 15014 lines of output omitted ....
Begin 64k.syscall01
End 64k.syscall01
Begin 64k.build01
End 64k.build01
Begin 64k.auth01
End 64k.auth01
Config-end 64k. TH3 memory used: 6373738
Config-begin wal1.
Begin wal1.wal37
End wal1.wal37
Config-end wal1. TH3 memory used: 100961
All 226 VDBE coverage points reached
th3: 0 errors out of 1442264 tests in 213.741 seconds. 64-bit little-endian
th3: SQLite 3.8.11 2015-05-15 04:13:15 56ef98a04765c34c1c2f3ed7a6f03a732f3b886e


The output begins with a report of the SQLITE_SOURCE_ID
(cross-checked again sqlite3_sourceid()) for the
SQLite under test and the compile-time options used as reported
by sqlite3_compileoption_get().  The output concludes with a summary
of the test results and a repeat of the SQLITE_SOURCE_ID.  If any
errors are detected, additional lines detail the problem.  The error
reporting lines always begin with a single space character so that they
can be quickly extracted from large output files using:

grep "&#94; "


The default output shows the beginning and end of each configuration
and test module combination.  In the example above "c1" and "64k" are
configurations and "pager08", "build33", "orderby01", etc. are test modules.
Compile-time and run-time options are available to increase or decrease
the amount of output.
The output can be increased by showing each test case within each
test module.  The output can be decreased
by degrees: omitting test modules starts and stops,
omitting configuration starts and stops, and finally by omitting all output.

3.1. Test Automation Scripts

TH3 comes with additional TCL scripts that help automate the testing
process on workstations.  The "th3make" script automatically runs "mkth3.tcl"
and "gcc" and then runs the resulting test program and checks the results.
Arguments to th3make include all of the "*.test" test modules and 
"*.cfg" configurations that are to be included in the test.  Additional
options to th3make can cause the test program to be compiled using different
compilers (GCC, Clang, MSVC), to use different output verbosity levels, to
run the test program under valgrind, to check the output for coverage using
gcov, and so forth.  The th3make script also accepts "*.rc" filenames as
arguments.  These *.rc files are just collections of other arguments that
are commonly used together for a single purpose.  For example, the "quick.rc"
file contains a set of eight arguments to th3make that run a fast (3-minute)
full-coverage test.  This allows the operator to type "./th3make quick.rc" as
a short-cut to typing out all of the required command-line options.  The
following are a few of the more than 40 available *.rc files:


alignmentN.rc - 
    These files contain -D options to the compiler that are used by
    various notable downstreams.
cov.rc - Options for measuring test coverage
extensions.rc - Options to enable FTS4, R-Trees,
    and STAT4.
fast.rc - Run most tests, including those not needed for
    coverage, skipping only soak tests, using delivery compiler options
    (ex: -O3)
memdebug.rc - like test.rc but also enable
    -DSQLITE_MEMDEBUG.
min.rc - Run the minimum set of tests needed for 100% coverage.
quick.rc - Run all tests required for 100% coverage tests
    using -Os and -DSQLITE_DEBUG.
test.rc - Run the same tests as in fast.rc but without
    compiler optimization and enabling options like
    -DSQLITE_DEBUG and
    -DSQLITE_ENABLE_EXPENSIVE_ASSERT.
test-ex.rc - long-running soak tests.


The TH3 repository also includes the "multitest.tcl" script, another
TCL script used to automate TH3 testing on workstations.  Multitest.tcl
automatically compiles SQLite, then
runs ./th3make repeatedly with a variety of alignments, and captures
the output in a succinct summary screen.  A typical multitest.tcl run
generates output that looks like this:

./multitest.tcl -q --jobs 3
start-time: 2018-05-19 03:17:12 UTC
file mkdir sqlite3bld
cd sqlite3bld
exec sh /ramdisk/sqlite/configure
file copy -force config.h ../config.hY
exec make clean sqlite3.c
file rename sqlite3.c ../sqlite3.c
file rename sqlite3.h ../sqlite3.h
exec make clean sqlite3.c OPTS=-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
file rename sqlite3.c ../sqlite3udl.c
exec make clean sqlite3.c OPTS=-DSQLITE_SMALL_STACK=1
file rename sqlite3.c ../sqlite3ss.c
cd ..
*******************************************************************************
t01: cov.rc.................................................... Ok   (00:03:42)
t02: cov.rc ++STAT4 ++DESERIALIZE -D_HAVE_SQLITE_CONFIG_H...... Ok   (00:04:45)
t03: vfs-cov.rc................................................ Ok   (00:03:59)
t04: demo.rc................................................... Ok   (00:00:05)
t07: test.rc ../th3private/*.test.............................. Ok   (00:00:21)
t08: test.rc ../th3private/*.test ++STAT4...................... Ok   (00:01:41)
t05: quick.rc.................................................. Ok   (00:04:26)
t09: quick.rc ~TEST_REALLOC_STRESS -funsigned-char............. Ok   (00:05:39)
t10: quick.rc ~THREADSAFE=0 -DLONGDOUBLE_TYPE=double........... Ok   (00:03:24)
t06: quick.rc extensions.rc -D_HAVE_SQLITE_CONFIG_H............ Ok   (00:09:03)
t11: quick.rc sqlite3ss.c ~MAX_ATTACHED=125.................... Ok   (00:04:39)
t12: quick.rc ~BYTEORDER=0 ++RTREE............................. Ok   (00:07:28)
t13: quick.rc ~DISABLE_INTRINSIC ++RTREE....................... Ok   (00:07:31)
t16: quick.rc ~TRACE_SIZE_LIMIT=15 cov1/main16.test............ Ok   (00:00:22)
t14: quick.rc ~DIRECT_OVERFLOW_READ -fsigned-char.............. Ok   (00:04:35)
t15: quick.rc ~UNTESTABLE ~EXTRA_IFNULLROW..................... Ok   (00:01:44)
t17: quick.rc ~MAX_MMAP_SIZE=0................................. Ok   (00:04:46)
t18: quick.rc ++NULL_TRIM ++OFFSET_SQL_FUNC.................... Ok   (00:04:47)
t19: quick.rc ++BATCH_ATOMIC_WRITE ++DESERIALIZE............... Ok   (00:05:41)
t20: lean1.rc quick.rc......................................... Ok   (00:03:09)
t22: test.rc alignment2.rc sqlite3udl.c........................ Ok   (00:44:22)
t21: test.rc alignment1.rc..................................... Ok   (01:02:32)
t23: memdebug1.rc extensions.rc................................ Ok   (01:49:58)
t25: valgrind1.rc -O3 extensions.rc............................ Ok   (00:56:08)
t24: memdebug2.rc extensions.rc................................ Ok   (01:43:34)
t27: test-ex1.rc............................................... Ok   (00:45:00)
t26: valgrind2.rc -O3 extensions.rc............................ Ok   (01:02:52)
t29: test-ex3.rc............................................... Ok   (00:31:48)
t28: test-ex2.rc............................................... Ok   (01:12:03)
t30: test-ex4.rc............................................... Ok   (01:09:47)
t32: test.rc alignment4.rc -m32 CC=clang....................... Ok   (00:48:31)
t31: test.rc alignment3.rc sqlite3udl.c........................ Ok   (01:22:29)
t34: test.rc alignment6.rc..................................... Ok   (00:35:31)
t33: test.rc alignment5.rc extensions.rc....................... Ok   (00:59:33)
t35: test.rc alignment7.rc..................................... Ok   (00:44:10)
t40: fast.rc alignment2.rc sqlite3udl.c........................ Ok   (00:15:46)
t39: fast.rc alignment1.rc extensions.rc -m32.................. Ok   (00:33:19)
t36: test.rc ~MUTATION_TEST.................................... Ok   (00:35:45)
t42: fast.rc alignment4.rc..................................... Ok   (00:13:03)
t43: fast.rc alignment5.rc..................................... Ok   (00:13:32)
t44: fast.rc alignment6.rc..................................... Ok   (00:11:41)
t41: fast.rc alignment3.rc sqlite3udl.c........................ Ok   (00:26:31)
t45: fast.rc alignment7.rc..................................... Ok   (00:12:57)
t46: fast.rc -fsanitize=undefined.............................. Ok   (00:38:18)
*******************************************************************************
0 failures on 44 th3makes and 198583082 tests in (07:16:01) 3 cores on bella
SQLite 3.24.0 2018-05-18 17:58:33 c6071ac99cfa4b6272ac4d739fc61a85acb544f6c1c2a


As can be seen above, a single run
of multitest.tcl invokes th3make dozens of times and takes between 12 and 24
CPU hours.  The middle section of the output shows the arguments to each
individual th3make run and the result and elapse time for that th3make.
All build products and output for the separate th3make runs are
captures in subdirectories for post-test analysis.
The two-line summary at the bottom shows the total number of errors and tests
over all th3make runs and the total elapse time, together with the 
SQLITE_SOURCE_ID information for the version of SQLite that was
tested.  This summary information is recorded in the
release
checklist during final testing.

Abbreviations are applied in the multitest.tcl output so that
each th3make invocation will fit on a single 80-column output line.
The initial "th3make" verb is omitted.
"~" is shorthand for "-DSQLITE_" and "++" is stands for
"-DSQLITE_ENABLE".  Hence, multitest.tcl output line

quick.rc ~DISABLE_INTRINSIC ++RTREE


Really means

th3make quick.rc -DSQLITE_DISABLE_INTRINSIC -DSQLITE_ENABLE_RTREE


4. Test Coverage

Using one particular subset of the available TH3 test modules (the "cov1"
tests) SQLite obtained 
100% branch test coverage and 100% MC/DC as measured
by gcov
on Linux x86 and x86_64 hardware.  All releases of SQLite since
version 3.6.17 (2009-08-10) have been tested to this standard. 
The SQLite developers 
are committed to maintaining 100% branch coverage and MC/DC for all 
future releases of SQLite.

The cov1 test set used to obtain 100% branch test coverage are only a
subset of the tests currently implemented using TH3.  New test modules are
added on a regular basis.



5. Mutation Testing

The TH3 source tree contains a scripted name
"mutation-test.tcl" that automates the process of
mutation testing.

The mutation-test.tcl script takes care of all of the details for
running a mutation test:


 The script compiles the TH3 test harness into machine code ("th3.o") if
     necessary.
 The script compiles the sqlite3.c source file into assembly language
     ("sqlite3.s") if necessary.
 The script loops through instructions in the assembly language file
     to locate branch operations.
     
     The script makes a copy of the original sqlite3.s file.
     The copy is edited to change the branch instruction into either
         a no-op or an unconditional jump.
     The copy of sqlite3.s is assembled into sqlite3.o then linked
         again th3.o to generate the "th3" executable.
     The "th3" binary is run and the output checked for errors.
     
 The script shows progress for each cycle of the previous step then
     displays a summary of "survivors" at the end.  A "survivor" is a
     mutation that was not detected by TH3.


Mutation testing can be slow, since each test can take up to 5
minutes on a fast workstation, and there are two tests for each
branch instructions, and over 20,000 branch instructions.  Efforts are
made to expedite operation.  For example, TH3 is compiled in such a
way that it exits as soon as it finds the first error, and as many
of the mutations are easily detected,  many cycles happen in only
a few seconds.  Nevertheless, the mutation-test.tcl script includes
command-line options to limit the range of code lines tested so that
mutation testing only needs to be performed on blocks of code that
have recently changed.

6. TH3 License

SQLite itself is in the public domain and
can be used for any purpose.  But TH3 is proprietary and requires a license.


Even though open-source users do not have direct access to TH3, all
users of SQLite benefit from TH3 indirectly since each version of SQLite is
validated running TH3 on multiple platforms (Linux, Windows, WinRT, Mac,
OpenBSD) prior to release.  So anyone using an official release
of SQLite can deploy their application with the confidence of knowing that
it has been tested using TH3.  They simply cannot rerun those tests
themselves without purchasing a TH3 license.
This page last modified on  2018-05-19 14:21:54 UTCth3.html
––”Q‚y
‚©TH31. Overview

SQLite Test Harness #3 (hereafter "TH3") is one of
three test harnesses used for testing SQLite.
TH3 meets the following objectives:


 TH3 is able to run on embedded platforms that lack the support
     infrastructure of workstations.

 TH3 tests SQLite in an as-deployed configuration using only
     published and documented interfaces.
     In other words, TH3 tests the compiled object code, not
     the source code, thus verifying that no problems were introduced
     by compiler bugs.  "Test what you fly and fly what you test."

 TH3 checks SQLite's response to out-of-memory errors, disk I/O
     errors, and power loss during transaction commit. 

 TH3 exercises SQLite in a variety of run-time configurations
     (UTF8 vs UTF16, different pages sizes, varying journal modes, etc.)
     

 TH3 achieves 100% branch test coverage (and 100% 
    MC/DC)
    over the SQLite core.
    (Test coverage of extensions such as FTS and RTREE is less than 100%).
     


TH3 was originally written for validation testing only, but has
subsequently been used for development testing and debugging
as well, and has proven very helpful in those roles.  A full-coverage
test takes less than five minutes on a workstation and hence
serves as a fast regression test during day-to-day maintenance
of the SQLite code base.

1.1. History

TH3 originated from an effort to test SQLite on 
SymbianOS.
Prior to TH3, all SQLite tests were run using the
TCL script language, but TCL would not (easily)
compile on SymbianOS which made testing difficult.  The first attempt
to remedy this problem was the "TH1" (Test Harness #1) scripting 
language - a reimplementation of parts of the TCL language in a 
more portable form that would compile and run on SymbianOS, and 
that was sufficient to run the SQLite tests.  TH1
did not survive as a standard testing tool for SQLite,
but it did find continued service as a
scripting language used to customize the 
Fossil version control system.
There was also a "Test Harness #2" which was an attempt to
create a simple scripting language using operator prefix notation
to drive tests. TH3 was the third attempt.

At about that same time, some avionics manufacturers were
expressing interest in SQLite, which prompted the SQLite developers
to design TH3 to support the rigorous testing standards of
DO-178B.

The first code for TH3 was laid down on 2008-09-25.
An intense effort over the next 10 months resulted in TH3 achieving
100% MC/DC on 2009-07-25.  The TH3 code continues to be improved and
expanded.

As of 2018-05-19, the TH3 source tree consists 
and well over 500,000 lines of source code in V\to see what has been happening on SQLite, I visit the
timeline and in a single
screen I see a summary of the latest changes, on all branches.
In a few clicks, I can drill down as much detail as I
want.  I can even do this from a phone.


GitHub and GitLab offer nothing comparable.  The closest I have
found is the network,
which is slow to render (unless it is already cached), does not 
offer nearly as much details, and scarcely works at all on mobile.
The commits view
of GitHub provides more detail, renders quickly,
and works on mobile, but only shows a single branch at a time,
so I cannot easily know if I've seen all of the recent changes.
And even if GitHub/GitLab did offer better interfaces, both are
third-party services.  They are not a core part of Git.  Hence,
using them introduces yet another dependency into the project.


I am told that Git users commonly install third-party graphical
viewers for Git, many of which do a better job of showing recent 
activity on the project.  That is great, but these are still
more third-party applications that must be installed and
managed separately.  Many are platform-specific.  (One of the
better ones, GitUp, only works on Mac, for
example.)  All require that you first sync your local repository
then bring up their graphical interface on your desktop.  And
even with all that, I still cannot see what I typically want to 
see without multiple clicks.  Checking on project status from
a phone while away from the office is not an option.

2.2. Git makes it difficult to find successors (descendents)
of a check-in


Git lets you look backwards in time, but not forwards.
Given some historical check-in, you can see what came before,
but it is challenging see what came next.


In contrast, Fossil offers helpful displays such as
https://sqlite.org/src/timeline?df=major-release
to show all check-ins that are derived from the most
recent major release.





All SQLite check-ins derived from the most recent major release



It is not impossible to find the descendents of a check-in
in Git.  It is merely difficult.  For example,
there is a 
stackoverflow page
showing the command sequence for finding the descendents of a check-in
in unix:

git rev-list --all --parents | grep ".\{40\}.*.*" | awk '{print $1}'




But this is not the same thing.  The command above gives
a list of descendents without showing the branching structure, which
is important for understanding what happened.  And the command only works
if you have a local clone of the repository; finding the descendents of
a check-in is not something you can do with web interfaces such
as GitHub or GitLab.


This is not really about just finding the descendents of a check-in
from time to time.  The fact that descendents are readily available in
Fossil means that the information pervades the web pages provided by
Fossil.  One example: Every Fossil check-in information page
(example) shows
a small "Context" graph of the immediate predecessor and successors 
to that check-in.  This helps the user maintain better situational
awareness, and it provides useful capabilities, such as the ability
click forward to the next check-in in sequence.  Another example:
Fossil easily shows the context around a specific check-in
(example)
which again helps to promote situational awareness and a deeper
understanding of what is happening in the code.  There is a
whole page of additional examples
in the Fossil documentation.


All of the above is theoretically possible with Git, given the right extensions
and tools and using the right commands.  But it is not easy to do,
and so it rarely gets done.  Consequently, developers have less awareness
of what is happening in the code.

2.3. The mental model for Git is needlessly complex


The complexity of Git
distracts attention from the software under development.  A user of Git
needs to keep all of the following in mind:

 The working directory
 The "index" or staging area
 The local head
 The local copy of the remote head
 The actual remote head


Git has commands (and/or options on commands) for moving and
c]omparing content between all of these locations. 

In contrast,
Fossil users only need to think about their working directory and
the check-in they are working on.  That is 60% less distraction.
Every developer has a finite number of brain-cycles.  Fossil
requires fewer brain-cycles to operate, thus freeing up 
intellectual resources to focus on the software under development.

One user of both Git and Fossil
writes in HN:


Fossil gives me peace of mind that I have everything ... synced to 
the server with a single command....
I never get this peace of mind with git.


2.4. Git does not track historical branch names


Git keeps the complete DAG of the check-in sequence.  But branch
tags are local information that is not synced and not retained
once a branch closes.
This makes review of historical
branches tedious.


As an example, suppose a customer asks you:
"What ever became of that 'prefer-coroutine-sort-subquery' branch
from two years ago?"
You might try to answer by consulting the history in
your version control system, thusly:


GitHub: https://github.com/sqlite/sqlite/commits/prefer-coroutine-sort-subquery
Fossil: https://sqlite.org/src/timeline?r=prefer-coroutine-sort-subquery



The Fossil view clearly shows that the branch was eventually merged back into
trunk.  It shows where the branch started, and it shows two occasions where changes
on trunk were merged into the branch.  GitHub shows none of this.  In fact, the
GitHub display is mostly useless in trying to figure out what happened.


Many readers have recommended various third-party GUIs for Git that
might do a better job of showing historical development activity.  Maybe
some of them do work better than native Git and/or GitHub, though they
will all be hampered by the fact that Git does not preserve historical
branch names across syncs.  And even if those other tools are better,
the fact that it is necessary to go to a third-party tool to get the information
desired does not speak well of the core system.

2.5. Git requires more administrative support


Git is complex software.
One needs an installer of some kind to put Git on a developer
workstation, or to upgrade to a newer version of Git.
Standing up a Git server is non-trivial, and so most developers
use a third-party service such as GitHub or GitLab,
and thus introduce additional dependencies.


In contrast, Fossil is a single standalone binary which is
installed by putting it on $PATH.  That one binary contains all
the functionality of core Git and also GitHub and/or GitLab.  It
manages a community server with wiki, bug tracking, and forums, 
provides packaged downloads for consumers, login managements, 
and so forth, with no extra software required.  Standing up a
community server for Fossil takes minutes.  And Fossil is efficient.
A Fossil server will run fine on a $5/month VPS or a Raspberry Pi,
whereas GitLab and similar require beefier hardware.


Less administration means that programmers spend more time working
on the software (SQLite in this case) and less time fussing with
the version control system.

2.6. Git provides a poor user experience

The following https://xkcd.com/1597/ cartoon is an
exaggeration, yet hits close to home:




Let's be real.  Few people dispute that Git provides
a suboptimal user experience.  A lot of 
the underlying implementation shows through into the user
interface.  The interface is so bad that there is even a
parody site that generates
fake git man pages.

Designing software is hard.  It takes a lot of focus.
A good version control system should provide the developer with
assistance, not frustration.  Git has gotten better in this
regard over the past decade, but it still has a long way to go.


3. A Git-User's Guide To Accessing SQLite Source Code


If you are a devoted Git user, you can still easily access SQLite.  
This section gives some hints on how to do so.

3.1. The Official GitHub Mirror


As of 2019-03-20, there is now an 
official Git mirror of the
SQLite sources on GitHub.

The mirror is an incremental export of the 
canonical Fossil repository for
SQLite.  A cron-job updates the GitHub repository once an hour.
This is a one-way, read-only code mirror.  No pull requests or 
changes are accepted via GitHub.  The GitHub repository merely copies
the content from the Fossil repository.  All changes are input via
Fossil.


The hashes that identify check-ins and files on the Git mirror are
different from the hashes in Fossil.  There are many reasons for
this, chief among them that Fossil uses a SHA3-256 hash whereas
Git uses a SHA1 hash.  During export, the original Fossil hash for
each check-in is added as a footer to check-in comments.  To avoid
confusion, always use the original Fossil hash, not the Git hash,
when referring to SQLite check-ins.

3.2. Web Access


The SQLite Fossil Repository contains links
for downloading  a Tarball, ZIP Archive, or SQLite Archive for any
historical version of SQLite.  The URLs for these downloads are
simple and can be incorporated easily into automated tools.  The format is:


https://sqlite.org/src/tarball/VERSION/sqlite.tar.gz



Simply replace VERSION with some description of the version to be
downloaded.  The VERSION can be a prefix of the cryptographic hash
name of a specific check-in, or the name of a branch (in which case the
most recent version of the branch is fetched) or a tag for a specific
check-in like "version-3.23.1":


https://sqlite.org/src/tarball/version-3.23.1/sqlite.tar.gz



To get the latest release, use "release"
for VERSION, like this:


https://sqlite.org/src/tarball/release/sqlite.tar.gz



To get the latest trunk check-in, us "trunk" for VERSION:


https://sqlite.org/src/tarball/trunk/sqlite.tar.gz



And so forth.
For ZIP archives and SQLite Archives, simply change the "/tarball/" element
into either "/zip/" or "/sqlar/", and maybe also change the name of the
download file to have a ".zip" or ".sqlar" suffix.

3.3. Fossil Access


Fossil is easy to install and use.  Here are the steps for unix.
(Windows is similar.)



Download the self-contained Fossil executable from
https://fossil-scm.org/fossil/uv/download.html and put the executable
somewhere on your $PATH.
mkdir ~/fossils
fossil clone https://sqlite.org/src ~/fossils/sqlite.fossil
mkdir ~/sqlite; cd ~/sqlite
fossil open ~/fossils/sqlite.fossil



At this point you are ready to type "./configure; make"
(or on Windows with MSVC, "nmake /f Makefile.msc").


To change your checkout to a different version of Fossil use
the "update" command:


fossil update VERSION



Use "trunk" for VERSION to get the latest trunk version of SQLite.
Or use a prefix of a cryptographic hash name, or the name of some branch
or tag.  See
https://fossil-scm.org/fossil/doc/trunk/www/checkin_names.wiki for more
suggestions on what names can be used for VERSION.


Use the "fossil ui" command from within the ~/sqlite checkout to
bring up a local copy of the website.


Additional documentation on Fossil can be found at
https://fossil-scm.org/fossil/doc/trunk/www/permutedindex.html


Do not be afraid to explore and experiment.
Without a log-in you won't be able to
push back any changes you make, so you cannot damage the project.

3.4. Verifying Source Code Integrity


If you need to verify that the SQLite source code that you have is
authentic and has not been modified in any way (perhaps by an adversary)
that can be done using a few simple command-line tools.  At the root 
of the SQLite source tree is a file named "manifest".  The manifest 
file contains the name of every other file in the source tree together 
with either a SHA1 or SHA3-256 hash for that file.  (SHA1 is used for
older files and SHA3-256 for newer files.)  You can write a
script to extract these hashes and verify them against the source code 
files.  The hash name for the check-in is just the SHA3-256 hash of the
"manifest" file itself, possibly with the last line omitted if the
last line begins with "# Remove this line..."

4. See Also

Other pages that talk about Fossil and Git include:

Fossil vs. Git
What others say about Fossil and Git

This page last modified on  2021-12-21 16:55:31 UTCwhynotgit.html
        íg‚z
CÚu)Why SQLite Does Not Use Git1. Introduction


SQLite does not use the
Git version control system.
SQLite uses
Fossil instead, which is a
version control system that was specifically designed
and written to support SQLite.


People often wonder why SQLite does not use the
Git version control system like everybody
else.
This article attempts to answer that question.  Also,
in section 3, 
this article provides hints to Git users
about how they can easily access the SQLite source code.


This article is not a comparison between Fossil
and Git.  See
https://fossil-scm.org/fossil/doc/trunk/www/fossil-v-git.wiki
for one comparison of the two systems.  Other third-party 
comparisons are available as well - use a search engine to find them.


This article is not advocating that you switch your projects
away from Git.  You can use whatever version control system you want.
If you are perfectly happy with Git, then by all means keep using
Git.  But, if Git is not working well for you or you are wondering 
if it can be improved or if there is something better,
then maybe try to understand the perspectives presented below.
Use the insights thus obtained to find or write a different and
better version control system, or to just make
improvements to Git itself.

1.1. Edits


This article has been revised multiple times in an attempt
to improve clarity, address concerns and misgivings,
and to fix errors.
The complete edit history for this document can be seen at
https://sqlite.org/docsrc/finfo/pages/whynotgit.in.
(Usage hint: Click on any two nodes of the graph for a diff.
BTW, are there any Git web interfaces that offers a similar
capability?)

2. A Few Reasons Why SQLite Does Not Use Git

2.1. Git does not provide good situational awareness


When I want [` iterates through all records in a table
  in an order defined by an index. "SEARCH" indicates that only a subset of 
  the table rows are visited. Each SCAN or SEARCH record includes the
  following information:


   The name of the table, view, or subquery that data is read from.
   Whether or not an index or automatic index is used.
   Whether or not the covering index optimization applies.
   Which terms of the WHERE clause are used for indexing.



  For example, the following EXPLAIN QUERY PLAN command operates on a SELECT
  statement that is implemented by performing a full-table scan on table t1:
sqlite&gt; EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1;
QUERY PLAN
`--SCAN t1



  The example above shows
  SQLite picking full-table scan will visit all rows in the table.
  If the query were able to use an index, then the 
  SCAN/SEARCH record would include the name of the index and, for a
  SEARCH record, an indication of how the subset of rows visited is
  identified. For example:
sqlite&gt; CREATE INDEX i1 ON t1(a);
sqlite&gt; EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1;
QUERY PLAN
`--SEARCH t1 USING INDEX i1 (a=?)



  The previous example, SQLite uses index "i1" to optimize
  a WHERE clause term of the form (a=?) - in this case "a=1".
  The previous example could not use a covering index, but the following
  example can, and that fact is reflected in the output:
sqlite&gt; CREATE INDEX i2 ON t1(a, b);
sqlite&gt; EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1; 
QUERY PLAN
`--SEARCH t1 USING COVERING INDEX i2 (a=?)



  All joins in SQLite are implemented using nested scans. When a
  SELECT query that features a join is analyzed using EXPLAIN QUERY PLAN, one
  SCAN or SEARCH record is output for each nested loop. For example:
sqlite&gt; EXPLAIN QUERY PLAN SELECT t1.*, t2.* FROM t1, t2 WHERE t1.a=1 AND t1.b>2;
QUERY PLAN
|--SEARCH t1 USING INDEX i2 (a=? AND b>?)
`--SCAN t2



  The order of the entries indicates the nesting order. In
  this case, the scan of table t1 using index i2 is the outer loop (since it
  appears first)
  and the full-table scan of table t2 is the inner loop (since it appears
  last).
  In the following example, the positions of t1 and t2 in the FROM 
  clause of the SELECT are reversed. The query strategy remains the same.
  The output from EXPLAIN QUERY PLAN shows how the query is actually
  evaluated, not how it is specified in the SQL statement.
sqlite&gt; EXPLAIN QUERY PLAN SELECT t1.*, t2.* FROM t2, t1 WHERE t1.a=1 AND t1.b>2;
QUERY PLAN
|--SEARCH t1 USING INDEX i2 (a=? AND b>?)
`--SCAN t2





  If the WHERE clause of a query contains an OR expression, then SQLite might
  use the "OR by union" strategy (also known as the
  OR optimization). In this case there will be single top-level record
  for the search, with two sub-records, one for each index:
sqlite&gt; CREATE INDEX i3 ON t1(b);
sqlite&gt; EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=1 OR b=2;
QUERY PLAN
`--MULTI-INDEX OR
   |--SEARCH t1 USING COVERING INDEX i2 (a=?)
   `--SEARCH t1 USING INDEX i3 (b=?)


1.2. Temporary Sorting B-Trees


  If a SELECT query contains an ORDER BY, GROUP BY or DISTINCT clause, 
  SQLite may need to use a temporary b-tree structure to sort the output
  rows. Or, it might use an index. Using an index is 
  almost always much more efficient than performing a sort.
  If a temporary b-tree is required, a record is added to the EXPLAIN
  QUERY PLAN output with the "detail" field set to a string value of
  the form "USE TEMP B-TREE FOR xxx", where xxx is one of "ORDER BY",
  "GROUP BY" or "DISTINCT". For example:

sqlite&gt; EXPLAIN QUERY PLAN SELECT c, d FROM t2 ORDER BY c;
QUERY PLAN
|--SCAN t2
`--USE TEMP B-TREE FOR ORDER BY



  In this case using the temporary b-tree can be avoided by creating an index
  on t2(c), as follows:

sqlite&gt; CREATE INDEX i4 ON t2(c);
sqlite&gt; EXPLAIN QUERY PLAN SELECT c, d FROM t2 ORDER BY c; 
QUERY PLAN
`--SCAN t2 USING INDEX i4


1.3. Subqueries


  In all the examples above, there has only been a single SELECT statement.
  If a query contains sub-selects, those are shown as being children of
  the outer SELECT.  For example:

sqlite&gt; EXPLAIN QUERY PLAN SELECT (SELECT b FROM t1 WHERE a=0), (SELECT a FROM t1 WHERE b=t2.c) FROM t2;
|--SCAN TABLE t2 USING COVERING INDEX i4
|--SCALAR SUBQUERY
|  `--SEARCH t1 USING COVERING INDEX i2 (a=?)
`--CORRELATED SCALAR SUBQUERY
   `--SEARCH t1 USING INDEX i3 (b=?)



  The example above contains two "SCALAR" subqueries.  The subqueries
  are SCALAR in the sense that they return a single value - a one-row,
  one-column table.  If the actual query returns more than that, then
  only the first column of the first row is used.

  The first subquery above is constant with respect to the outer query.
  The value for the first subquery can be computed once and then reused
  for each row of the outer SELECT.  The second subquery, however, is
  "CORRELATED".  The value of the second subquery changes depending
  on values in the current row of the outer query.  Hence, the second
  subquery must be run once for each output row in the outer SELECT.


  Unless the flattening optimization is applied, if a subquery appears in
  the FROM clause of a SELECT statement, SQLite can either run the subquery and
  stores the results in a temporary table, or it can run the subquery as a
  co-routine.  The following query is an example of the latter.  The subquery
  is run by a co-routine.  The outer query blocks whenever it needs another
  row of input from the subquery.  Control switches to the co-routine which
  produces the desired output row, then control switches back to the main
  routine which continues processing.  

sqlite&gt; EXPLAIN QUERY PLAN SELECT count(*)
      &gt; FROM (SELECT max(b) AS x FROM t1 GROUP BY a) AS qqq
      &gt; GROUP BY x;
QUERY PLAN
|--CO-ROUTINE qqq
|  `--SCAN t1 USING COVERING INDEX i2
|--SCAN qqqq
`--USE TEMP B-TREE FOR GROUP BY



  
  If the flattening optimization is used on a subquery in the FROM clause
  of a SELECT statement, that effectively merges the subquery into the outer
  query.  The output of EXPLAIN QUERY PLAN reflects this, as in the following
  example:

sqlite&gt; EXPLAIN QUERY PLAN SELECT * FROM (SELECT * FROM t2 WHERE c=1) AS t3, t1;
QUERY PLAN
|--SEARCH t2 USING INDEX i4 (c=?)
`--SCAN t1




  If the content of a subquery might need to be visited more than once, then
  the use of a co-routine is undesirable, as the co-routine would then have to
  compute the data more than once.  And if the subquery cannot be flattened,
  that means the subquery must be manifested into a transient table.

sqlite&gt; SELECT * FROM
      &gt;   (SELECT * FROM t1 WHERE a=1 ORDER BY b LIMIT 2) AS x,
      &gt;   (SELECT * FROM t2 WHERE c=1 ORDER BY d LIMIT 2) AS y;
QUERY PLAN
|--MATERIALIZE x
|  `--SEARCH t1 USING COVERING INDEX i2 (a=?)
|--MATERIALIZE y
|  |--SEARCH t2 USING INDEX i4 (c=?)
|  `--USE TEMP B-TREE FOR ORDER BY
|--SCAN x
`--SCAN y


1.4. Compound Queries


  Each component query of a compound query (UNION, UNION ALL, EXCEPT or 
  INTERSECT) is assigned computed separately and is given its own line in
  the EXPLAIN QUERY PLAN output.

sqlite&gt; EXPLAIN QUERY PLAN SELECT a FROM t1 UNION SELECT c FROM t2;
QUERY PLAN
`--COMPOUND QUERY
   |--LEFT-MOST SUBQUERY
   |  `--SCAN t1 USING COVERING INDEX i1
   `--UNION USING TEMP B-TREE
      `--SCAN t2 USING COVERING INDEX i4



  The "USING TEMP B-TREE" clause in the above output indicates that a 
  temporary b-tree structure is used to implement the UNION of the results
  of the two sub-selects.  An alternative method of computing a compound
  is to run each subquery as a co-routine, arrange for their outputs to
  appear in sorted order, and merge the results together.  When the query
  planner chooses this latter approach, the EXPLAIN QUERY PLAN output
  looks like this:

sqlite&gt; EXPLAIN QUERY PLAN SELECT a FROM t1 EXCEPT SELECT d FROM t2 ORDER BY 1;
QUERY PLAN
`--MERGE (EXCEPT)
   |--LEFT
   |  `--SCAN t1 USING COVERING INDEX i1
   `--RIGHT
      |--SCAN t2
      `--USE TEMP B-TREE FOR ORDER BY

This page last modified on  2021-03-23 20:19:29 UTCeqp.html
5]&5À‚}    9ÿKArchitecture of SQLiteIntroduction


This document describes the architecture of the SQLite library.
The information here is useful to those who want to understand or
modify the inner workings of SQLite.








A nearby diagram shows the main components of SQLite
and how they interoperate.  The text below
explains the roles of the various components.


Overview

SQLite works by compiling SQL text into bytecode, then running
that bytecode using a virtual machine.

The sqlite3b4‚#9#sqlite.htmlRedirect to ./cli.htmlsqlite.htmlÙ‚{
1±kEXPLAIN QUERY PLAN1. The EXPLAIN QUERY PLAN Command


Warning: The data returned by the EXPLAIN QUERY PLAN command is 
intended for interactive debugging only.  The output format may change
between SQLite releases. Applications should not depend on the output
format of the EXPLAIN QUERY PLAN command.


Alert: As warned above, the EXPLAIN QUERY PLAN output format did
change substantially with the version 3.24.0 release (2018-06-04).
Additional minor changes occurred in version 3.36.0 (2021-06-18).
Further changes are possible in subsequent releases.


The EXPLAIN QUERY PLAN SQL command is used to obtain a high-level
description of the strategy or plan that SQLite uses to implement a specific
SQL query.  Most significantly, EXPLAIN QUERY PLAN reports on the way in 
which the query uses database indices. This document is a guide to
understanding and interpreting the EXPLAIN QUERY PLAN output.  Background
information is available separately:


 A primer on How SQLite Works.
 Notes on the query optimizer.
 How indexing works.
 The next generation query planner.


A query plan is represented as a tree.
In raw form, as returned by sqlite3_step(), each node of the tree
consists of four fields:  An integer node id, an integer parent id,
an auxiliary integer field that is not currently used, and a description
of the node.
The entire tree is therefore a table with four columns and zero or more
rows.
The command-line shell will usually intercept this table and renders
it as an ASCII-art graph for more convenient viewing.  To disable the
shells automatic graph rendering and to display EXPLAIN QUERY PLAN
output in its tabular format, run the command ".explain off" to set
the "EXPLAIN formatting mode" to off.  To restore automatic graph rendering,
run ".explain auto".  You can see the current "EXPLAIN formatting mode" 
setting using the ".show" command.

One can also set the CLI into automatic EXPLAIN QUERY PLAN mode
using the ".eqp on" command:

sqlite&gt; .eqp on


 In automatic EXPLAIN QUERY PLAN mode, the shell automatically runs
a separate EXPLAIN QUERY PLAN query for each statement you enter and
displays the result before actually running the query.  Use the
".eqp off" command to turn automatic EXPLAIN QUERY PLAN mode back off.

EXPLAIN QUERY PLAN is most useful on a SELECT statement,
but may also appear with other statements that read data from database
tables (e.g. UPDATE, DELETE, INSERT INTO ... SELECT).

1.1. Table and Index Scans


  When processing a SELECT (or other) statement, SQLite may retrieve data from
  database tables in a variety of ways. It may scan through all the records in
  a table (a full-table scan), scan a contiguous subset of the records in a
  table based on the rowid index, scan a contiguous subset of the entries in a
  database index, or use a combination of the above strategies
  in a single scan. The various ways in which SQLite may retrieve data from a
  table or index are described in detail here.


  For each table read by the query, the output of EXPLAIN QUERY 
  PLAN includes a record for which the value in the "detail" column begins
  with either "SCAN" or "SEARCH". "SCAN" is used for a full-table scan,
  including cases where SQLite_c_prepare_v2() and related interfaces act as a compiler
for converting SQL text into bytecode.  The sqlite3_stmt object is
a container for a single bytecode program that implements a single
SQL statement.  The sqlite3_step() interface passes a bytecode program
into the virtual machine, and runs the program until it either completes,
or forms a row of result to be returned, or hits a fatal error, or is
interrupted.

Interface

Much of the C-language Interface is found in source
files main.c, legacy.c, and
vdbeapi.c
though some routines are
scattered about in other files where they can have access to data 
structures with file scope.  
The sqlite3_get_table() routine is implemented in table.c.
The sqlite3_mprintf() routine is found in printf.c.
The sqlite3_complete() interface is in complete.c.
The TCL Interface is implemented by tclsqlite.c.

To avoid name collisions, all external
symbols in the SQLite library begin with the prefix sqlite3.
Those symbols that are intended for external use (in other words,
those symbols which form the API for SQLite) add an underscore, and
thus begin with sqlite3_.  Extension APIs sometimes add the
extension name prior to the underscore; for example:
sqlite3rbu_ or sqlite3session_.

Tokenizer

When a string containing SQL statements is to be evaluated it is
first sent to the tokenizer.
The tokenizer breaks
the SQL text into tokens and hands those tokens
one by one to the parser.  The tokenizer is hand-coded in 
the file tokenize.c.

Note that in this design, the tokenizer calls the parser.  People
who are familiar with YACC and BISON may be accustomed to doing things the
other way around &mdash; having the parser call the tokenizer.  Having
the tokenizer call the parser is better, though, because it can be made
threadsafe and it runs faster.

Parser

The parser assigns meaning to tokens based on
their context.  The parser for SQLite is generated using the
Lemon parser generator.
Lemon does the same job as YACC/BISON, but it uses
a different input syntax which is less error-prone.
Lemon also generates a parser which is reentrant and thread-safe.
And Lemon defines the concept of a non-terminal destructor so
that it does not leak memory when syntax errors are encountered.
The grammar file that drives Lemon and that defines the SQL language
that SQLite understands is found in parse.y.

Because
Lemon is a program not normally found on development machines, the
complete source code to Lemon (just one C file) is included in the
SQLite distribution in the "tool" subdirectory.


Code Generator

After the parser assembles tokens into a parse tree,
the code generator runs to analyze the parse tree and generate
bytecode that performs the work of the SQL statement.
The prepared statement object is a container for this bytecode.
There are many files in the code generator, including:
attach.c,
auth.c,
build.c,
delete.c,
expr.c,
insert.c,
pragma.c,
select.c,
trigger.c,
update.c,
vacuum.c,
where.c,
wherecode.c, and
whereexpr.c.
In these files is where most of the serious magic happens.
expr.c handles code generation for expressions.
where*.c handles code generation for WHERE clauses on
SELECT, UPDATE and DELETE statements.  The files attach.c,
delete.c, insert.c, select.c, 
trigger.c
update.c, and vacuum.c handle the code generation
for SQL statements with the same names.  (Each of these files calls routines
in expr.c and where.c as necessary.)  All other
SQL statements are coded out of build.c.
The auth.c file implements the functionality of
sqlite3_set_authorizer().

The code generator, and especially the logic in where*.c
and in select.c, is sometimes called the
query planner.  For any particular SQL statement, there might be
hundreds, thousands, or millions of different algorithms to compute
the answer.  The query planner is an AI that strives to select the
best algorithm from these millions of choices.

Bytecode Engine

The bytecode program created by the code generator is run by
a virtual machine.

The virtual machine itself is entirely contained in a single
source file vdbe.c.  The
vdbe.h header file defines an interface
between the virtual machine and the rest of the SQLite library and
vdbeInt.h which defines structures and interfaces that
are private to the virtual machine itself.
Various other vdbe*.c files are helpers to the virtual machine.
The vdbeaux.c file contains utilities used by the virtual
machine and interface modules used by the rest of the library to
construct VM programs.  The vdbeapi.c file contains external
interfaces to the virtual machine such as the 
sqlite3_bind_int() and sqlite3_step().  Individual values
(strings, integer, floating point numbers, and BLOBs) are stored
in an internal object named "Mem" which is implemented by
vdbemem.c.


SQLite implements SQL functions using callbacks to C-language routines.
Even the built-in SQL functions are implemented this way.  Most of
the built-in SQL functions (ex: abs(), count(),
substr(), and so forth) can be found in func.c source
file.
Date and time conversion functions are found in date.c.
Some functions such as coalesce() and typeof() are implemented
as bytecode directly by the code generator.


B-Tree

An SQLite database is maintained on disk using a B-tree implementation
found in the btree.c source file.  Separate B-trees are used for
each table and each index in the database.  All B-trees are stored in the
same disk file.  The file format details are stable and well-defined and
are guaranteed to be compatible moving forward.

The interface to the B-tree subsystem and the rest of the SQLite library
is defined by the header file btree.h.


Page Cache

The B-tree module requests information from the disk in fixed-size
pages.  The default page_size is 4096 bytes but can be any power of
two between 512 and 65536 bytes.
The page cache is responsible for reading, writing, and
caching these pages.
The page cache also provides the rollback and atomic commit abstraction
and takes care of locking of the database file.  The
B-tree driver requests particular pages from the page cache and notifies
the page cache when it wants to modify pages or commit or rollback
changes. The page cache handles all the messy details of making sure
the requests are handled quickly, safely, and efficiently.

The primary page cache implementation is in the
pager.c file.  WAL mode logic is in the separate
wal.c.  In-memory caching is implemented by the
pcache.c and pcache1.c files.
The interface between page cache subsystem
and the rest of SQLite is defined by the header file pager.h.


OS Interface


In order to provide portability across operating systems,
SQLite uses an abstract object called the VFS.  Each VFS provides methods
for opening, reading, writing, and closing files on disk, and for other
OS-specific tasks such as finding the current time, or obtaining randomness
to initialize the built-in pseudo-random number generator.
SQLite currently provides VFSes for unix (in the os_unix.c
file) and Windows (in the os_win.c file).


Utilities


Memory allocation, caseless string comparison routines, 
portable text-to-number conversion routines, and other utilities
are located in util.c.
Symbol tables used by the parser are maintained by hash tables found
in hash.c.  The utf.c source file contains Unicode
conversion subroutines.
SQLite has its own private implementation of 
printf() (with
some extensions) in printf.c and its own
pseudo-random number generator (PRNG) in random.c.


Test Code


Files in the "src/" folder of the source tree whose names begin with
test are for testing only and are not included in a standard
build of the library.


This page last modified on  2022-01-20 21:38:08 UTCarch.htmlhema table itself.  See the
schema storage subsection of the file format documentation for
additional information on how SQLite uses the sqlite_schema table
internally.

2. Alternative Names

The schema table can always be referenced using the name "sqlite_schema",
especially if qualifed by the schema name like 
"main.sqlite_schema" or "temp.sqlite_schema".  But for historical
compatibility, some alternative names are also recognized, including:


 sqlite_master
 sqlite_temp_schema
 sqlite_temp_master



Alternatives (2) and (3) only work for the TEMP database associated
with each database connection, but alternative (1) works anywhere.
For historical reasons, callbacks from the sqlite3_set_authorizer()
interface always refer to the schema table using names (1) or (3).

3. Interpretation Of The Schema Table

The meanings of the fields of the schema table are as follows:


type

The sqlite_schema.type column will be one
of the following text strings:  'table', 'index', 'view', or 'trigger'
according to the type of object defined.  The 'table' string is used
for both ordinary and virtual tables.


name

The sqlite_schema.name column will hold the name of the object.
(UNIQUE and PRIMARY KEY constraints on tables cause SQLite to create
internal indexes with names of the form "sqlite_autoindex_TABLE_N"
where TABLE is replaced by the name of the table that contains the
constraint and N is an integer beginning with 1 and increasing by one
with each constraint seen in the table definition.
In a WITHOUT ROWID table, there is no sqlite_schema entry for the
PRIMARY KEY, but the "sqlite_autoindex_TABLE_N" name is set aside
for the PRIMARY KEY as if the sqlite_schema entry did exist.  This
will affect the numbering of subsequent UNIQUE constraints.
The "sqlite_autoindex_TABLE_N" name is never allocated for an
INTEGER PRIMARY KEY, either in rowid tables or WITHOUT ROWID tables.



tbl_name

The sqlite_schema.tbl_name column holds the name of a table or view
that the object is associated with.  For a table or view, the
tbl_name column is a copy of the name column.  For an index, the tbl_name
is the name of the table that is indexed.  For a trigger, the tbl_name
column stores the name of the table or view that causes the trigger 
to fire.


rootpage

The sqlite_schema.rootpage column stores the page number of the root
b-tree page for tables and indexes.  For rows that define views, triggers,
and virtual tables, the rootpage column is 0 or NULL.


sql

The sqlite_schema.sql column stores SQL text that describes the
object.  This SQL text is a CREATE TABLE, CREATE VIRTUAL TABLE,
CREATE INDEX,
CREATE VIEW, or CREATE TRIGGER statement that if evaluated against
the database file when it is the main database of a database connection
would recreate the object.  The text is usually a copy of the original
statement used to create the object but with normalizations applied so
that the text conforms to the following rules:


The CREATE, TABLE, VIEW, TRIGGER, and INDEX keywords at the beginning
of the statement are converted to all upper case letters.
The TEMP or TEMPORARY keyword is removed if it occurs after the 
initial CREATE keyword.
Any database name qualifier that occurs prior to the name of the
object being created is removed.
Leading spaces are removed.
All spaces following the first two keywords are converted into a single
space.


The text in the sqlite_schema.sql column is a copy of the original
CREATE statement text that created the object, except normalized as
described above and as modified by subsequent ALTER TABLE statements.
The sqlite_schema.sql is NULL for the internal indexes that are
automatically created by UNIQUE or PRIMARY KEY constraints.



4. Creation and Modification Of The Schema Table

SQLite creates the schema table upon database creation and modifies
its content as SQLite users submit DDL statements for execution. There
is no need for users to modify it under normal circumstances, and they
bear the risk of database corruption if they do modify it.
This page last modified on  2022-02-15 00:09:14 UTCschematab.html
Ç
¬ÇŒŽ‚
W˜›UThe Virtual Database Engine of SQLiteThe Virtual Database Engine of SQLite


Obsolete Documentation Warning:
This document describes the virtual machine used in SQLite version 2.8.0. 
The virtual machine in SQLite version 3.0 and 3.1 is similar in
concept but is now register-based instead of stack-based, has five
operands per opcode instead of three, and has a different set of
opcodes from those shown below.  See the virtual machine instructions
document for the current set of VDBE opcodes and a brief overview
of how the VDBE operates.  This document is retained as an historical
reference.



If you want to know how the SQLite library works internally,
you need to begin with a solid understanding of the Virtual Database
Engine or VDBE.  The VDBE occurs right in the middle of the
processing stream (see the architecture diagram)
and so it seems to touch most parts of the library.  Even
parts of the code that do not directly interact with the VDBE
are usually in a supporting role.  The VDBE really is the heart of
SQLite.

This article is a brief introduction to how the VDBE
works and in particular how the various VDBE instructions
(documented here) work together
to do useful things with the database.  The style is tutorial,
beginning with simple tasks and working toward solving more
complex problems.  Along the way we will visit most
submodules in the SQLite library.  After completing this tutorial,
you should have a pretty good understanding of how SQLite works
and will be ready to begin studying the actual source code.

Preliminaries

The VDBE implements a virtual computer that runs a program in
its virtual machine language.  The goal of each program is to 
interrogate or change the database.  Toward this end, the machine
language that the VDBE implements is specifically designed to
search, read, and modify databases.

Each instruction of the VDBE language contains an opcode and
three operands labeled P1, P2, and P3.  Operand P1 is an arbitrary
integer.   P2 is a non-nf¤H‚~        -ÈO)The Schema Table1. Introduction

Every SQLite database contains a single "schema table" that stores the
schema for that database.  The schema for a database is a description of
all of the other tables, indexes, triggers, and views that are
contained within the database.  The schema table looks like this:


CREATE TABLE sqlite_schema(
  type text,
  name text,
  tbl_name text,
  rootpage integer,
  sql text
);


The sqlite_schema table contains one row for each table, index, view,
and trigger (collectively "objects") in the schema, except there
is no entry for the sqlite_scdgegative integer.  P3 is a pointer to a data 
structure or zero-terminated string, possibly null.  Only a few VDBE
instructions use all three operands.  Many instructions use only
one or two operands.  A significant number of instructions use
no operands at all but instead take their data and store their results
on the execution stack.  The details of what each instruction
does and which operands it uses are described in the separate
opcode description document.

A VDBE program begins
execution on instruction 0 and continues with successive instructions
until it either (1) encounters a fatal error, (2) executes a
Halt instruction, or (3) advances the program counter past the
last instruction of the program.  When the VDBE completes execution,
all open database cursors are closed, all memory is freed, and 
everything is popped from the stack.
So there are never any worries about memory leaks or 
undeallocated resources.

If you have done any assembly language programming or have
worked with any kind of abstract machine before, all of these
details should be familiar to you.  So let's jump right in and
start looking as some code.


Inserting Records Into The Database

We begin with a problem that can be solved using a VDBE program
that is only a few instructions long.  Suppose we have an SQL
table that was created like this:


CREATE TABLE examp(one text, two int);


In words, we have a database table named "examp" that has two
columns of data named "one" and "two".  Now suppose we want to insert a single
record into this table.  Like this:


INSERT INTO examp VALUES('Hello, World!',99);


We can see the VDBE program that SQLite uses to implement this
INSERT using the sqlite command-line utility.  First start
up sqlite on a new, empty database, then create the table.
Next change the output format of sqlite to a form that
is designed to work with VDBE program dumps by entering the
".explain" command.
Finally, enter the [INSERT] statement shown above, but precede the
[INSERT] with the special keyword [EXPLAIN].  The [EXPLAIN] keyword
will cause sqlite to print the VDBE program rather than 
execute it.  We have:
$&nbsp;sqlite&nbsp;test_database_1
sqlite&gt;&nbsp;CREATE&nbsp;TABLE&nbsp;examp(one&nbsp;text,&nbsp;two&nbsp;int);
sqlite&gt;&nbsp;.explain
sqlite&gt;&nbsp;EXPLAIN&nbsp;INSERT&nbsp;INTO&nbsp;examp&nbsp;VALUES('Hello,&nbsp;World!',99);
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsph;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewRecno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello,&nbsp;World!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MakeRecord&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutIntKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Commit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0As you can see above, our simple insert statement is
implemented in 12 instructions.  The first 3 and last 2 instructions are 
a standard prologue and epilogue, so the real work is done in the middle 
7 instructions.  There are no jumps, so the program executes once through 
from top to bottom.  Let's now look at each instruction in detail.
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
The instruction Transaction 
begins a transaction.  The transaction ends when a Commit or Rollback 
opcode is encountered.  P1 is the index of the database file on which 
the transaction is started.  Index 0 is the main database file.  A write 
lock is obtained on the database file when a transaction is started.  
No other process can read or write the file while the transaction is 
underway.  Starting a transaction also creates a rollback journal.  A 
transaction must be started before any changes can be made to the 
database.

The instruction VerifyCookie
checks cookie 0 (the database schema version) to make sure it is equal 
to P2 (the value obtained when the database schema was last read).  
P1 is the database number (0 for the main database).  This is done to 
make sure the database schema hasn't been changed by another thread, in 
which case it has to be reread.

 The second Transaction 
instruction begins a transaction and starts a rollback journal for 
database 1, the database used for temporary tables.
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp
 The instruction Integer pushes 
the integer value P1 (0) onto the stack.  Here 0 is the number of the 
database to use in the following OpenWrite instruction.  If P3 is not 
NULL then it is a string representation of the same integer.  Afterwards 
the stack looks like this:
(integer) 0
 The instruction OpenWrite opens 
a new read/write cursor with handle P1 (0 in this case) on table "examp", 
whose root page is P2 (3, in this database file).  Cursor handles can be 
any non-negative integer.  But the VDBE allocates cursors in an array 
with the size of the array being one more than the largest cursor.  So 
to conserve memory, it is best to use handles beginning with zero and 
working upward consecutively.  Here P3 ("examp") is the name of the 
table being opened, but this is unused, and only generated to make the 
code easier to read.  This instruction pops the database number to use 
(0, the main database) from the top of the stack, so afterwards the 
stack is empty again.
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewRecno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
 The instruction NewRecno creates 
a new integer record number for the table pointed to by cursor P1.  The 
record number is one not currently used as a key in the table.  The new 
record number is pushed onto the stack.  Afterwards the stack looks like 
this:
(integer) new record key6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello,&nbsp;World!
 The instruction String pushes its 
P3 operand onto the stack.  Afterwards the stack looks like this:
(string) "Hello, World!"(integer) new record key7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;99
 The instruction Integer pushes 
its P1 operand (99) onto the stack.  Afterwards the stack looks like 
this:
(integer) 99(string) "Hello, World!"(integer) new record key8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MakeRecord&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
 The instruction MakeRecord pops 
the top P1 elements off the stack (2 in this case) and converts them into 
the binary format used for storing records in a database file.  
(See the file format description for 
details.)  The new record generated by the MakeRecord instruction is 
pushed back onto the stack.  Afterwards the stack looks ljike this:

(record) "Hello, World!", 99(integer) new record key9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutIntKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1
 The instruction PutIntKey uses 
the top 2 stack entries to write an entry into the table pointed to by 
cursor P1.  A new entry is created if it doesn't already exist or the 
data for an existing entry is overwritten.  The record data is the top 
stack entry, and the key is the next entry down.  The stack is popped 
twice by this instruction.  Because operand P2 is 1 the row change count 
is incremented and the rowid is stored for subsequent return by the 
sqlite_last_insert_rowid() function.  If P2 is 0 the row change count is 
unmodified.  This instruction is where the insert actually occurs.
10&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
 The instruction Close closes a 
cursor previously opened as P1 (0, the only open cursor). If P1 is not 
currently open, this instruction is a no-op.
11&nbsp;&nbsp;&nbsp;&nbsp;Commit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
 The instruction Commit causes all 
modifications to the database that have been made since the last 
Transaction to actually take effect.  No additional modifications are 
allowed until another transaction is started.  The Commit instruction 
deletes the journal file and releases the write lock on the database.  
A read lock continues to be held if there are still cursors open.
12&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
 The instruction Halt causes the VDBE 
engine to exit immediately.  All open cursors, Lists, Sorts, etc are 
closed automatically.  P1 is the result code returned by sqlite_exec().  
For a normal halt, this should be SQLITE_OK (0).  For errors, it can be 
some other value.  The operand P2 is only used when there is an error.  
There is an implied "Halt 0 0 0" instruction at the end of every 
program, which the VDBE appends when it prepares a program to run.



Tracing VDBE Program Execution

If the SQLite library is compiled without the NDEBUG preprocessor 
macro, then the PRAGMA vdbe_trace
 causes the VDBE to trace the execution of programs.  Though this 
feature was originally intended for testing and debugging, it can also 
be useful in learning about how the VDBE operates.  
Use "PRAGMA&nbsp;vdbe_trace=ON;" to turn tracing on and 
"PRAGMA&nbsp;vdbe_trace=OFF" to turn tracing back off.  
Like this:
sqlite&gt;&nbsp;PRAGMA&nbsp;vdbe_trace=ON;
&nbsp;&nbsp;&nbsp;0&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0
sqlite&gt;&nbsp;INSERT&nbsp;INTO&nbsp;examp&nbsp;VALUES('Hello,&nbsp;World!',99);
&nbsp;&nbsp;&nbsp;0&nbsp;Transaction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0
&nbsp;&nbsp;&nbsp;1&nbsp;VerifyCookie&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;81
&nbsp;&nbsp;&nbsp;2&nbsp;Transaction&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;0
&nbsp;&nbsp;&nbsp;3&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0
Stack:&nbsp;i:0
&nbsp;&nbsp;&nbsp;4&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;examp
&nbsp;&nbsp;&nbsp;5&nbsp;NewRecno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0
Stack:&nbsp;i:2
&nbsp;&nbsp;&nbsp;6&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;Hello,&nbsp;World!
Stack:&nbsp;t[Hello,.World!]&nbsp;i:2
&nbsp;&nbsp;&nbsp;7&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;99
Stack:&nbsp;si:99&nbsp;t[Hello,.World!]&nbsp;i:2
&nbsp;&nbsp;&nbsp;8&nbsp;MakeRecord&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;0
Stack:&nbsp;s[...Hello,.World!.99]&nbsp;i:2
&nbsp;&nbsp;&nbsp;9&nbsp;PutIntKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;1
&nbsp;&nbsp;10&nbspk;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0
&nbsp;&nbsp;11&nbsp;Commit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0
&nbsp;&nbsp;12&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0
With tracing mode on, the VDBE prints each instruction prior
to executing it.  After the instruction is executed, the top few
entries in the stack are displayed.  The stack display is omitted
if the stack is empty.

On the stack display, most entries are shown with a prefix
that tells the datatype of that stack entry.  Integers begin
with "i:".  Floating point values begin with "r:".
(The "r" stands for "real-number".)  Strings begin with either
"s:", "t:", "e:" or "z:".  
The difference among the string prefixes is caused by how their 
memory is allocated. The z: strings are stored in memory obtained
from malloc().  The t: strings are statically allocated.  
The e: strings are ephemeral.  All other strings have the s: prefix.  
This doesn't make any difference to you,
the observer, but it is vitally important to the VDBE since the
z: strings need to be passed to free() when they are
popped to avoid a memory leak.  Note that only the first 10
characters of string values are displayed and that binary
values (such as the result of the MakeRecord instruction) are
treated as strings.  The only other datatype that can be stored
on the VDBE stack is a NULL, which is display without prefix
as simply "NULL".  If an integer has been placed on the 
stack as both an integer and a string, its prefix is "si:".



Simple Queries

At this point, you should understand the basics of how the VDBE
writes to a database.  Now let's look at how it does queries.
We will use the following simple SELECT statement as our example:


SELECT * FROM examp;


The VDBE program generated for this SQL statement is as follows:
sqlite&gt;&nbsp;EXPLAIN&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;examp;
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;two&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lnbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
Before we begin looking at this problem, let's briefly review
how queries work in SQLite so that we will know what we are trying
to accomplish.  For each row in the result of a query,
SQLite will invoke a callback function with the following
prototype:


int Callback(void *pUserData, int nColumn, char *azData[], char *azColumnName[]);


The SQLite library supplies the VDBE with a pointer to the callback function
and the pUserData pointer.  (Both the callback and the user data were
originally passed in as arguments to the sqlite_exec() API function.)
The job of the VDBE is to
come up with values for nColumn, azData[], 
and azColumnName[].
nColumn is the number of columns in the results, of course.
azColumnName[] is an array of strings where each string is the name
of one of the result columns.  azData[] is an array of strings holding
the actual data.
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;two
The first two instructions in the VDBE program for our query are
concerned with setting up values for azColumn.
The ColumnName instructions tell 
the VDBE what values to fill in for each element of the azColumnName[] 
array.  Every query will begin with one ColumnName instruction for each 
column in the result, and there will bem a matching Column instruction for 
each one later in the query.

2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;81
Instructions 2 and 3 open a read cursor on the database table that is 
to be queried.  This works the same as the OpenWrite instruction in the 
INSERT example except that the cursor is opened for reading this time 
instead of for writing.  Instruction 4 verifies the database schema as 
in the INSERT example.
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10
 The Rewind instruction initializes 
a loop that iterates over the "examp" table. It rewinds the cursor P1 
to the first entry in its table.  This is required by the Column and 
Next instructions, which use the cursor to iterate through the table.  
If the table is empty, then jump to P2 (10), which is the instruction just 
past the loop.  If the table is not empty, fall through to the following 
instruction at 6, which is the beginning of the loop body.
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
 The instructions 6 through 8 form the body of the loop that will 
execute once for each record in the database file.  

The Column instructions at addresses 6 
and 7 each take the P2-th column from the P1-th cursor and push it onto 
the stack.  In this example, the first Column instruction is pushing the 
value for the column "one" onto the stack and the second Column 
instruction is pushing the value for column "two".  

The Callback instruction at address 8 
invokes the callback() function.  The P1 operand to Callback becomes the 
value for nColumn.  The Callback instruction pops P1 values from
the stack and uses them to fill the azData[] array.
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6
The instruction at address 9 implements the branching part of the 
loop.  Together with the Rewind at address 5 it forms the loop logic.  
This is a key concept that you should pay close attention to.   
The Next instruction advances the cursor 
P1 to the next record.  If the cursor advance was successful, then jump 
immediately to P2 (6, the beginning of the loop body).  If the cursor 
was at the end, then fall through to the following instruction, which 
ends the loop.
10&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbnsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
The Close instruction at the end of the program closes the
cursor that points into the table "examp".  It is not really necessary
to call Close here since all cursors will be automatically closed
by the VDBE when the program halts.  But we needed an instruction
for the Rewind to jump to so we might as well go ahead and have that
instruction do something useful.
The Halt instruction ends the VDBE program.

Note that the program for this SELECT query didn't contain the 
Transaction and Commit instructions used in the INSERT example.  Because 
the SELECT is a read operation that doesn't alter the database, it 
doesn't require a transaction.


A Slightly More Complex Query

The key points of the previous example were the use of the Callback
instruction to invoke the callback function, and the use of the Next
instruction to implement a loop over all records of the database file.
This example attempts to drive home those ideas by demonstrating a
slightly more complex query that involves more columns of
output, some of which are computed values, and a WHERE clause that
limits which records actually make it to the callback function.
Consider this query:


SELECT one, two, one || two AS 'both'
FROM examp
WHERE one LIKE 'H%'


This query is perhaps a bit contrived, but it does serve to
illustrate our points.  The result will have three column with
names "one", "two", and "both".  The first two columns are direct
copies of the two columns in the table and the third result
column is a string formed by concatenating the first and
second columns of the table.
Finally, the
WHERE clause says that we will only chose rows for the 
results where the "one" column begins with an "H".
Here is what the VDBE program looks like for this query:
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;two
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;both
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;81
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;18
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H%&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsop;ptr(0x7f1ac0)
10&nbsp;&nbsp;&nbsp;&nbsp;IfNot&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17
11&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
12&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1
13&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
14&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1
15&nbsp;&nbsp;&nbsp;&nbsp;Concat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
16&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
17&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7
18&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
19&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
Except for the WHERE clause, the structure of the program for
this example is very much like the prior example, just with an
extra column.  There are now 3 columns, instead of 2 as before,
and there are three ColumnName instructions.
A cursor is opened using the OpenRead instruction, just like in the
prior example.  The Rewind instruction at address 6 and the
Next at address 17 form a loop over all records of the table.  
The Close instruction at the end is there to give the
Rewind instruction something to jump to when it is done.  All of
this is just like in the first query demonstration.

The Callback instruction in this example has to generate
data for three result columns instead of two, but is otherwise
the same as in the first query.  When the Callback instruction
is invoked, the left-most column of the result should be
the lowest in the stack and the right-most result column should
be the top of the stack.  We can see the stack being set up 
this way at addresses 11 through 15.  The Column instructions at
11 and 12 push the values for the first two columns in the result.
The two Column instructions at 13 and 14 pull in the values needed
to compute the third result column and the Concat instruction at
15 joins them together into a single entry on the stack.

The only thing that is really new about the current example
is the WHERE clause which is implemented by instructions at
addresses 7 through 10.  Instructions at address 7 and 8 push
onto the stack the value of the "one" column from the table
and the literal string "H%".  
The Function instruction at address 9 
pops these two values from the stack and pushes the result of the LIKE() 
function back onto the stack.  
The IfNot instruction pops the top stack 
value and causes an immediate jump forward to the Next instruction if the 
top value was false (not not like the literal string "H%").  
Taking this jump effectively skips the callback, which is the whole point
of the WHERE clause.  If the result
of the comparison is true, the jump is not taken and control
falls through to the Callback instruction below.

Notice how the LIKE operator is implemented.  It is a user-defined 
function in SQLite, so the address of its function definition is 
specified in P3.  The operand P1 is the number of function arguments for 
it to take from the stack.  In this case the LIKE() function takes 2 
arguments.  The arguments are taken off the stack in reverse order 
(right-to-left), so the pattern to match is the top stack element, and 
the next element is the data to compare.  The return value is pushed 
onto the stack.



A Template For SELECT Programs

The first two query examples illustrate a kind of template that
every SELECT program will follow.  Basically, we have:



Initialize the azColumnName[] array for the callback.
Open a cursor into the table to be queried.
Forp each record in the table, do:
    
    If the WHERE clause evaluates to FALSE, then skip the steps that
        follow and continue to the next record.
    Compute all columns for the current row of the result.
    Invoke the callback function for the current row of the result.
    
Close the cursor.



This template will be expanded considerably as we consider
additional complications such as joins, compound selects, using
indices to speed the search, sorting, and aggregate functions
with and without GROUP BY and HAVING clauses.
But the same basic ideas will continue to apply.

UPDATE And DELETE Statements

The UPDATE and DELETE statements are coded using a template
that is very similar to the SELECT statement template.  The main
difference, of course, is that the end action is to modify the
database rather than invoke a callback function.  Because it modifies 
the database it will also use transactions.  Let's begin
by looking at a DELETE statement:


DELETE FROM examp WHERE two

This DELETE statement will remove every record from the "examp"
table where the "two" column is less than 50.
The code generated to do this is as follows:
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;178
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Recno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
10&nbsp;&nbsp;&nbsp;&nbsp;ListWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
11&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6
12&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
13&nbsp;&nbsp;&nbsp;&nbsp;ListRewind&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
14&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
15&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3
16&nbsp;&nbsp;&nbsp;&nbsp;ListRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20
17&nbsp;&nbsp;&nbsp;&nbsp;NotExists&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19
18&nbsp;&nbsp;&nbsp;&nbsp;Delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1
19&nbsp;&nbsp;&nbsp;&nbsp;Goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16
20&nbsp;&nbsp;&nbsp;&nbsp;ListReset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbspq;&nbsp;&nbsp;&nbsp;0
21&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
22&nbsp;&nbsp;&nbsp;&nbsp;Commit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
23&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
Here is what the program must do.  First it has to locate all of
the records in the table "examp" that are to be deleted.  This is
done using a loop very much like the loop used in the SELECT examples
above.  Once all records have been located, then we can go back through
and delete them one by one.  Note that we cannot delete each record
as soon as we find it.  We have to locate all records first, then
go back and delete them.  This is because the SQLite database
backend might change the scan order after a delete operation.
And if the scan
order changes in the middle of the scan, some records might be
visited more than once and other records might not be visited at all.

So the implementation of DELETE is really in two loops.  The first loop 
(instructions 5 through 11) locates the records that are to be deleted 
and saves their keys onto a temporary list, and the second loop 
(instructions 16 through 19) uses the key list to delete the records one 
by one.  
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;178
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp
Instructions 0 though 4 are as in the INSERT example.  They start 
transactions for the main and temporary databases, verify the database 
schema for the main database, and open a read cursor on the table 
"examp".  Notice that the cursor is opened for reading, not writing.  At 
this stage of the program we are only going to be scanning the table, 
not changing it.  We will reopen the same table for writing later, at 
instruction 15.
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12
As in the SELECT example, the Rewind 
instruction rewinds the cursor to the beginning of the table, readying 
it for use in the loop body.
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11
The WHERE clause is implemented by instructions 6 through 8.
The job of the where clause is to skip the ListWrite if the WHERE
condition is false.  To this end, it jumps ahead to the Next instruction
if the "two" column (extracted by the Column instruction) is
greater than or equal to 50.

As before, the Column instruction uses cursor P1 and pushes the data 
record in column P2 (1, column "two") onto the stack.  The Integer 
instruction pushes the value 50 onto the top of the stack.  After these 
two instructions the stack looks like:
(integer) 50(record) current record for column "two" 
The Ge operator compares the top two 
elements on the stack, pops them, and then branches based on the result 
of the comparison.  If the second element is >= the top element, then 
jump to address P2 (the Next instruction at the end of the loop).  
Because P1 is true, if either operand is NULL (and thus the result is 
NULL) then take the jump.  If we don't jump, just advance to the next 
instruction.
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rercno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
10&nbsp;&nbsp;&nbsp;&nbsp;ListWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
The Recno instruction pushes onto the 
stack an integer which is the first 4 bytes of the key to the current 
entry in a sequential scan of the table pointed to by cursor P1.
The ListWrite instruction writes the 
integer on the top of the stack into a temporary storage list and pops 
the top element.  This is the important work of this loop, to store the 
keys of the records to be deleted so we can delete them in the second 
loop.  After this ListWrite instruction the stack is empty again.
11&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6
12&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
 The Next instruction increments the cursor to point to the next 
element in the table pointed to by cursor P0, and if it was successful 
branches to P2 (6, the beginning of the loop body).  The Close 
instruction closes cursor P1.  It doesn't affect the temporary storage 
list because it isn't associated with cursor P1; it is instead a global 
working list (which can be saved with ListPush).
13&nbsp;&nbsp;&nbsp;&nbsp;ListRewind&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
 The ListRewind instruction 
rewinds the temporary storage list to the beginning.  This prepares it 
for use in the second loop.
14&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
15&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3
 As in the INSERT example, we push the database number P1 (0, the main 
database) onto the stack and use OpenWrite to open the cursor P1 on table 
P2 (base page 3, "examp") for modification.
16&nbsp;&nbsp;&nbsp;&nbsp;ListRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20
17&nbsp;&nbsp;&nbsp;&nbsp;NotExists&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19
18&nbsp;&nbsp;&nbsp;&nbsp;Delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1
19&nbsp;&nbsp;&nbsp;&nbsp;Goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16
This loop does the actual deleting.  It is organized differently from 
the one in the UPDATE example.  The ListRead instruction plays the role 
that the Next did in the INSERT loop, but because it jumps to P2 on 
failure, and Next jumps on success, we put it at the start of the loop 
instead of the end.  This means that we have to put a Goto at the end of 
the loop to jump back to the loop test at the beginning.  So this 
loop has the form of a C while(){...} loop, while the loop in the INSERT 
example had the form of a do{...}while() loop.  The Delete instruction 
fills the role that the callback function did in the preceding examples.

The ListRead instruction reads an 
element from the temporary storage list and pushes it onto the stack.  
If this was successful, it continues to the next instruction.  If this 
fails because the list is empty, it branches to P2, which is the 
instruction just after the loop.  Afterwards the stack looks like:
(integer) key for current record
Notice the similarity between the ListRead and Next instructions.  
Both operations work according to this rule:


Push the next "thing" onto the stack and fall through OR jump to P2, 
depending on whether or not there is a next "thing" to push.

One difference between Next and ListRead is their idea of a "thing".  
The "things" for the Next instruction are records in a database file.  
"Things" for ListRead are integer keys in a list.  Another difference 
is whether to jump or fall through if there is no next "thing".  In this 
case, Next falls through, and ListRead jumps. Later on, we will see 
other looping instructions (NextIdx and SortNext) thsat operate using the 
same principle.

The NotExists instruction pops 
the top stack element and uses it as an integer key.  If a record with 
that key does not exist in table P1, then jump to P2.  If a record does 
exist, then fall through to the next instruction.  In this case P2 takes 
us to the Goto at the end of the loop, which jumps back to the ListRead 
at the beginning.  This could have been coded to have P2 be 16, the 
ListRead at the start of the loop, but the SQLite parser which generated 
this code didn't make that optimization.
The Delete does the work of this 
loop; it pops an integer key off the stack (placed there by the 
preceding ListRead) and deletes the record of cursor P1 that has that key.  
Because P2 is true, the row change counter is incremented.
The Goto jumps back to the beginning 
of the loop.  This is the end of the loop.
20&nbsp;&nbsp;&nbsp;&nbsp;ListReset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
21&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
22&nbsp;&nbsp;&nbsp;&nbsp;Commit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
23&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
This block of instruction cleans up the VDBE program. Three of these 
instructions aren't really required, but are generated by the SQLite 
parser from its code templates, which are designed to handle more 
complicated cases.
The ListReset instruction empties 
the temporary storage list.  This list is emptied automatically when the 
VDBE program terminates, so it isn't necessary in this case.  The Close 
instruction closes the cursor P1.  Again, this is done by the VDBE 
engine when it is finished running this program.  The Commit ends the 
current transaction successfully, and causes all changes that occurred 
in this transaction to be saved to the database.  The final Halt is also 
unnecessary, since it is added to every VDBE program when it is 
prepared to run.


UPDATE statements work very much like DELETE statements except
that instead of deleting the record they replace it with a new one.
Consider this example:



UPDATE examp SET one= '(' || one || ')' WHERE two 

Instead of deleting records where the "two" column is less than
50, this statement just puts the "one" column in parentheses
The VDBE program to implement this statement follows:
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;178&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&tnbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Recno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;ListWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsup;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;ListRewind&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;ListRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;Dup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;NotExists&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;Concat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
22&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
23&nbsp;&nbsp;&nbsp;&nbsp;Concat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
24&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
25&nbsp;&nbsp;&nbsp;&nbsp;MakeRecord&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&vnbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
26&nbsp;&nbsp;&nbsp;&nbsp;PutIntKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
27&nbsp;&nbsp;&nbsp;&nbsp;Goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
28&nbsp;&nbsp;&nbsp;&nbsp;ListReset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
29&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
30&nbsp;&nbsp;&nbsp;&nbsp;Commit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
31&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
This program is essentially the same as the DELETE program except 
that the body of the second loop has been replace by a sequence of 
instructions (at addresses 17 through 26) that update the record rather 
than delete it.  Most of this instruction sequence should already be 
familiar to you, but there are a couple of minor twists so we will go 
over it briefly.  Also note that the order of some of the instructions 
before and after the 2nd loop has changed.  This is just the way the 
SQLite parser chose to output the code using a different template.

As we enter the interior of the second loop (at instruction 17)
the stack contains a single integer which is the key of the
record we want to modify.  We are going to need to use this
key twice: once to fetch the old value of the record and
a second time to write back the revised record.  So the first instruction
is a Dup to make a duplicate of the key on the top of the stack.  The
Dup instruction will duplicate any element of the stack, not just the top
element.  You specify which element to duplication using the
P1 operand.  When P1 is 0, the top of the stack is duplicated.
When P1 is 1, the next element down on the stack duplication.
And so forth.

After duplicating the key, the next instruction, NotExists,
pops the stack once and uses the value popped as a key to
check the existence of a record in the database file.  If there is no record 
for this key, it jumps back to the ListRead to get another key.

Instructions 19 through 25 construct a new database record
that will be used to replace the existing record.  This is
the same kind of code that we saw 
in the description of INSERT and will not be described further.
After instruction 25 executes, the stack looks like this:
(record) new data record(integer) key
The PutIntKey instruction (also described
during the discussion about INSERT) writes an entry into the
database file whose data is the top of the stack and whose key
iws the next on the stack, and then pops the stack twice.  The
PutIntKey instruction will overwrite the data of an existing record
with the same key, which is what we want here.  Overwriting was not
an issue with INSERT because with INSERT the key was generated
by the NewRecno instruction which is guaranteed to provide a key
that has not been used before.

CREATE and DROP

Using CREATE or DROP to create or destroy a table or index is
really the same as doing an INSERT or DELETE from the special
"sqlite_master" table, at least from the point of view of the VDBE.
The sqlite_master table is a special table that is automatically
created for every SQLite database.  It looks like this:


CREATE TABLE sqlite_master (
  type      TEXT,    -- either "table" or "index"
  name      TEXT,    -- name of this table or index
  tbl_name  TEXT,    -- for indices: name of associated table
  sql       TEXT     -- SQL text of the original CREATE statement
)


Every table (except the "sqlite_master" table itself)
and every named index in an SQLite database has an entry
in the sqlite_master table.  You can query this table using
a SELECT statement just like any other table.  But you are
not allowed to directly change the table using UPDATE, INSERT,
or DELETE.  Changes to sqlite_master have to occur using
the CREATE and DROP commands because SQLite also has to update
some of its internal data structures when tables and indices
are added or destroyed.

But from the point of view of the VDBE, a CREATE works
pretty much like an INSERT and a DROP works like a DELETE.
When the SQLite library opens to an existing database,
the first thing it does is a SELECT to read the "sql"
columns from all entries of the sqlite_master table.
The "sql" column contains the complete SQL text of the
CREATE statement that originally generated the index or
table.  This text is fed back into the SQLite parser
and used to reconstruct the
internal data structures describing the index or table.

Using Indexes To Speed Searching

In the example queries above, every row of the table being
queried must be loaded off of the disk and examined, even if only
a small percentage of the rows end up in the result.  This can
take a long time on a big table.  To speed things up, SQLite
can use an index.

An SQLite file associates a key with some data.  For an SQLite
table, the database file is set up so that the key is an integer
and the data is the information for one row of the table.
Indices in SQLite reverse this arrangement.  The index key
is (some of) the information being stored and the index data 
is an integer.
To access a table row that has some particular
content, we first look up the content in the index table to find
its integer index, then we use that integer to look up the
complete record in the table.

Note that SQLite uses b-trees, which are a sorted data structure, 
so indices can be used when the WHERE clause of the SELECT statement
contains tests for equality or inequality.  Queries like the following 
can use an index if it is available:


SELECT * FROM examp WHERE two==50;
SELECT * FROM examp WHERE two

If there exists an index that maps the "two" column of the "examp"
table into integers, then SQLite will use that index to find the integer
keys of all rows in examp that have a value of 50 for column two, or 
all rows that are less than 50, etc.
But the following queries cannot use the index:


SELECT * FROM examp WHERE two%50 == 10;
SELECT * FROM examp WHERE two&127 == 3;


Note that the SQLite parser will not always generate code to use an 
index, even if it is possible to do so.  The following queries will not 
currently use the index:


SELECT * FROM examp WHERE two+10 == 50;
SELECT * FROM examp WHERE two==50 OR two==100;


To understand better how indices work, lets first look at how
they are created.  Let's go ahead and put an index on the two
column of the examp table.  We have:


CREATE INDEX examp_idx1 ON examp(two);


The VDBE code generated by the above statement looks like the
following:
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbspx;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;178&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewRecno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp_idx1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateIndex&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr(0x791380)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Dup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ynbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CREATE&nbsp;INDEX&nbsp;examp_idx1&nbsp;ON&nbsp;examp(tw
14&nbsp;&nbsp;&nbsp;&nbsp;MakeRecord&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;PutIntKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;Recno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;MakeIdxKey&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
22&nbsp;&nbsp;&nbsp;&nbsp;IdxPut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexed&nbsp;columns&nbsp;are&nbsp;not&nbsp;uniqzue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
23&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
24&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
25&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
26&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;333&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
27&nbsp;&nbsp;&nbsp;&nbsp;SetCookie&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
28&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
29&nbsp;&nbsp;&nbsp;&nbsp;Commit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
30&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
Remember that every table (except sqlite_master) and every named
index has an entry in the sqlite_master table.  Since we are creating
a new index, we have to add a new entry to sqlite_master.  This is
handled by instructions 3 through 15.  Adding an entry to sqlite_master
works just like any other INSERT statement so we will not say any more
about it here.  In this example, we want to focus on populating the
new index with valid data, which happens on instructions 16 through 
23.
16&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp
The first thing that happens is that we open the table being
indexed for reading.  In order to construct an index for a table,
we have to know what is in that table.  The index has already been 
opened for writing using cursor 0 by instructions 3 and 4.
18&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;Recno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;MakeIdxKey&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
22&nbsp;&nbsp;&nbsp;&nbsp;IdxPut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;indexed&nbsp;columns&nbsp;are&nbsp;not&nbsp;unique&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
23&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19
Instructions 18 through 23 implement a loop over every row of the 
table being indexed.  For each table row, we first extract the integer 
key for that row using Recno in instruction 19, then get the value of 
the "two" column using Column in instruction 20.  
The MakeIdxKey instruction at 21 
converts data from the "two" column (which is on the top of the stack) 
into a valid index key.  For an index on a single column, this is 
basically a no-op.  But if the P1 operand to MakeIdxKey had been 
greater than one multiple entries would have been popped from the stack 
and converted into a single index key.  
The IdxPut instruction at 22 is what 
actually creates the index entry.  IdxPut pops two elements from the 
stack.  The top of the stack is used as a key to fetch an entry from the 
index table.  Then the integer which was second on stack is added to the 
set of integers for that index and the new record is written back to the 
database file.  Note
that the same index entry can store multiple integers if there
are two or more table entries with the same value for the two
column.


Now let's look at how this index will be used.  Consider the
following query:


SELECT * FROM examp WHERE two==50;


SQLite generates the following VDBE code to handle this query:
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;two&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb|sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;256&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp_idx1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MakeKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemStore&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;MoveTo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;MemLoad&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;IdxGT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;IdxRecno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14&nbsp;&nbsp;&nbsp;&nbsp;MoveTo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
The SELECT begins in a familiar fashion.  First the column
names are initialized and the table being queried is opened.
Things become different beginning with instructions 5 and 6 where
the index file is also opened.  Instructions 7 and 8 make
a key with the value of 50.  
The MemStore instruction at 9 stores 
the index key in VDBE memory location 0.  The VDBE memory is used to 
avoid having to fetch a value from deep in the stack, which can be done,
but makes the program harder to generate.  The following instruction 
MoveTo at address 10 pops the key off 
the stack and moves the index cursor to the first row of the index with 
that key.  This initializes the cursor for use in the following loop.

Instructions 11 through 18 implement a loop over all index records 
with the key that was fetched by instruction 8.  All of the index 
records with this key will be contiguous in the index table, so we walk 
through them and fetch the corresponding table key from the index.  
This table key is then used to move the cursor to that row in the table.  
The rest of the loop is the same as the loop for the non-indexed SELECT 
query.

The loop begins with ~the MemLoad 
instruction at 11 which pushes a copy of the index key back onto the 
stack.  The instruction IdxGT at 12 
compares the key to the key in the current index record pointed to by 
cursor P1.  If the index key at the current cursor location is greater 
than the index we are looking for, then jump out of the loop.

The instruction IdxRecno at 13 
pushes onto the stack the table record number from the index.  The 
following MoveTo pops it and moves the table cursor to that row.  The 
next 3 instructions select the column data the same way as in the non-
indexed case. The Column instructions fetch the column data and the 
callback function is invoked.  The final Next instruction advances the 
index cursor, not the table cursor, to the next row, and then branches 
back to the start of the loop if there are any index records left.

Since the index is used to look up values in the table,
it is important that the index and table be kept consistent.
Now that there is an index on the examp table, we will have
to update that index whenever data is inserted, deleted, or
changed in the examp table.  Remember the first example above
where we were able to insert a new row into the "examp" table using
12 VDBE instructions.  Now that this table is indexed, 19
instructions are required.  The SQL statement is this:


INSERT INTO examp VALUES('Hello, World!',99);


And the generated code looks like this:
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;256&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp_idx1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NewRecno&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hello,&nbsp;World!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Dup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Dup&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;MakeIdxKey&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;IdxPut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14&nbsp;&nbsp;&nbsp;&nbsp;MakeRecord&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;PutIntKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs€p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;Commit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
At this point, you should understand the VDBE well enough to
figure out on your own how the above program works.  So we will
not discuss it further in this text.

Joins

In a join, two or more tables are combined to generate a single
result.  The result table consists of every possible combination
of rows from the tables being joined.  The easiest and most natural
way to implement this is with nested loops.

Recall the query template discussed above where there was a
single loop that searched through every record of the table.
In a join we have basically the same thing except that there
are nested loops.  For example, to join two tables, the query
template might look something like this:



Initialize the azColumnName[] array for the callback.
Open two cursors, one to each of the two tables being queried.
For each record in the first table, do:
    
    For each record in the second table do:
      
      If the WHERE clause evaluates to FALSE, then skip the steps that
          follow and continue to the next record.
      Compute all columns for the current row of the result.
      Invoke the callback function for the current row of the result.
      
    
Close both cursors.



This template will work, but it is likely to be slow since we
are now dealing with an O(N2) loop.  But it often works
out that the WHERE clause can be factored into terms and that one or
more of those terms will involve only columns in the first table.
When this happens, we can factor part of the WHERE clause test out of
the inner loop and gain a lot of efficiency.  So a better template
would be something like this:



Initialize the azColumnName[] array for the callback.
Open two cursors, one to each of the two tables being queried.
For each record in the first table, do:
    
    Evaluate terms of the WHERE clause that only involve columns from
        the first table.  If any term is false (meaning that the whole
        WHERE clause must be false) then skip the rest of this loop and
        continue to the next record.
    For each record in the second table do:
      
      If the WHERE clause evaluates to FALSE, then skip the steps that
          follow and continue to the next record.
      Compute all columns for the current row of the result.
      Invoke the callback function for the current row of the result.
      
    
Close both cursors.



Additional speed-up can occur if an index can be used to speed
the search of either or the two loops.

SQLite always constructs the loops in the same order as the
tables appear in the FROM clause of the SELECT statement.  The
left-most table becomes the outer loop and the right-most table
becomes the inner loop.  It is possible, in theory, to reorder
the loops in some circumstances to speed the evaluation of the
join.  But SQLite does not attempt this optimization.

You can see how SQLite constructs nested loops in the following
example:


CREATE TABLE examp2(three int, four int);
SELECT * FROM examp, examp2 WHERE two
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp.one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp.two&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp2.three&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp2.four&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;909&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;Ge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nb‚sp;&nbsp;&nbsp;&nbsp;23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;Ne&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
22&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
23&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbspƒ;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
24&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
25&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
26&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
The outer loop over table examp is implement by instructions
7 through 23.  The inner loop is instructions 13 through 22.
Notice that the "two

SQLite does not impose any arbitrary limits on the tables in
a join.  It also allows a table to be joined with itself.

The ORDER BY clause

For historical reasons, and for efficiency, all sorting is currently 
done in memory.

SQLite implements the ORDER BY clause using a special
set of instructions to control an object called a sorter.  In the
inner-most loop of the query, where there would normally be
a Callback instruction, instead a record is constructed that
contains both callback parameters and a key.  This record
is added to the sorter (in a linked list).  After the query loop 
finishes, the list of records is sorted and this list is walked.  For 
each record on the list, the callback is invoked.  Finally, the sorter
is closed and memory is deallocated.

We can see the process in action in the following query:


SELECT * FROM examp ORDER BY one DESC, two;

addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;two&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&n„bsp;&nbsp;&nbsp;&nbsp;909&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SortMakeRec&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;SortMakeKey&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;SortPut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;Sort&n…bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;SortNext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;SortCallback&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;Goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;SortReset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
There is only one sorter object, so there are no instructions to open 
or close it.  It is opened automatically when needed, and it is closed 
when the VDBE program halts.

The query loop is built from instructions 5 through 13.  Instructions
6 through 8 build a record that contains the azData[] values for a single
invocation of the callback.  A sort key is generated by instructions
9 through 11.  Instruction 12 combines the invocation record and the
sort key into a single entry and puts that entry on the sort list.

The P3 argument of instruction 11 is of particular interest.  The
sort key is formed by prepending one character from P3 to each string
and concatenating all the strings.  The sort comparison function will
look at this character to determine whether the sort order is
ascending or descending, and whether to sort as a string or number.  
In this example, the first column should be sorted as a string 
in descending order so its prefix is "D" and the second column should 
sorted numerically in ascending order so its prefix is "+".  Ascending 
string sorting uses "A", and descending numeric sorting uses "-".

After the query loop ends, the table being queried is closed at
instruction 14.  This is done early in order to allow other processes
or threads to access that table, if desired.  The list of records
that was built up inside the query loop is sorted by the instruction
at 15.  Instructions 16 through 18 walk through the record list
(which is now in sorted order) and invoke the callback once for
each record.  Finally, the sorter is closed at instruction 19.

Aggregate Functions And The GROUP BY and HAVING Clauses

To compute aggregate functions, the VDBE implements a special 
data structure and instructions for controlling that data structure.
The data structure is an unordered set of buckets, where each bucket
has a key and one or more memory locations.  Within the query
loop, the GROUP BY clause is used to construct a key and the bucket
with that key is brought into focus.  A new bucket is created with
the key if one did not previously exist.  On†ce the bucket is in
focus, the memory locations of the bucket are used to accumulate
the values of the various aggregate functions.  After the query
loop terminates, each bucket is visited once to generate a
single row of the results.

An example will help to clarify this concept.  Consider the
following query:


SELECT three, min(three+four)+avg(four) 
FROM examp2
GROUP BY three;



The VDBE code generated for this query is as follows:
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;three&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min(three+four)+avg(four)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AggReset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AggInit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr(0x7903a0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AggInit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr(0x790700)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;909&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb‡sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;MakeKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;AggFocus&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;AggSet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;Add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;AggFunc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr(0x7903a0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nˆbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;AggFunc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr(0x790700)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
22&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
23&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
24&nbsp;&nbsp;&nbsp;&nbsp;AggNext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
25&nbsp;&nbsp;&nbsp;&nbsp;AggGet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
26&nbsp;&nbsp;&nbsp;&nbsp;AggGet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
27&nbsp;&nbsp;&nbsp;&nbsp;AggGet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
28&nbsp;&nbsp;&nbsp;&nbsp;Add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
29&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
30&nbsp;&nbsp;&nbsp;&nbsp;Goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
31&nbsp;&nbsp;&nbsp;&nbsp;Noop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs‰p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
32&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
The first instruction of interest is the 
AggReset at 2.
The AggReset instruction initializes the set of buckets to be the
empty set and specifies the number of memory slots available in each
bucket as P2.  In this example, each bucket will hold 3 memory slots.
It is not obvious, but if you look closely at the rest of the program
you can figure out what each of these slots is intended for.


Memory SlotIntended Use Of This Memory Slot
0The "three" column -- the key to the bucket
1The minimum "three+four" value
2The sum of all "four" values. This is used to compute 
   "avg(four)".


The query loop is implemented by instructions 8 through 22.
The aggregate key specified by the GROUP BY clause is computed
by instructions 9 and 10.  Instruction 11 causes the appropriate
bucket to come into focus.  If a bucket with the given key does
not already exists, a new bucket is created and control falls
through to instructions 12 and 13 which initialize the bucket.
If the bucket does already exist, then a jump is made to instruction
14.  The values of aggregate functions are updated by the instructions
between 11 and 21.  Instructions 14 through 18 update memory
slot 1 to hold the next value "min(three+four)".  Then the sum of the 
"four" column is updated by instructions 19 through 21.

After the query loop is finished, the table "examp2" is closed at
instruction 23 so that its lock will be released and it can be
used by other threads or processes.  The next step is to loop
over all aggregate buckets and output one row of the result for
each bucket.  This is done by the loop at instructions 24
through 30.  The AggNext instruction at 24 brings the next bucket
into focus, or jumps to the end of the loop if all buckets have
been examined already.  The 3 columns of the result are fetched from 
the aggregator bucket in order at instructions 25 through 27.
Finally, the callback is invoked at instruction 29.

In summary then, any query with aggregate functions is implemented
by two loops.  The first loop scans the input table and computes
aggregate information into buckets and the second loop scans through
all the buckets to compute the final result.

The realization that an aggregate query is really two consecutive
loops makes it much easier to understand the difference between
a WHERE clause and a HAVING clause in SQL query statement.  The
WHERE clause is a restriction on the first loop and the HAVING
clause is a restriction on the second loop.  You can see this
by adding both a WHERE and a HAVING clause to our example query:



SELECT three, min(three+four)+avg(four) 
FROM examp2
WHERE three>four
GROUP BY three
HAVING avg(four)
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;three&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min(three+four)+avg(four)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AggReset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Š&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AggInit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr(0x7903a0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AggInit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr(0x790700)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;909&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Le&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;MakeKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb‹sp;&nbsp;
14&nbsp;&nbsp;&nbsp;&nbsp;AggFocus&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;AggSet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;Add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;AggFunc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr(0x7903a0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
22&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
23&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
24&nbsp;&nbsp;&nbsp;&nbsp;AggFunc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr(0x790700)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
25&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbspŒ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
26&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
27&nbsp;&nbsp;&nbsp;&nbsp;AggNext&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
28&nbsp;&nbsp;&nbsp;&nbsp;AggGet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
29&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
30&nbsp;&nbsp;&nbsp;&nbsp;Ge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
31&nbsp;&nbsp;&nbsp;&nbsp;AggGet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
32&nbsp;&nbsp;&nbsp;&nbsp;AggGet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
33&nbsp;&nbsp;&nbsp;&nbsp;AggGet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
34&nbsp;&nbsp;&nbsp;&nbsp;Add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
35&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
36&nbsp;&nbsp;&nbsp;&nbsp;Goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
37&nbsp;&nbsp;&nbsp;&nbsp;Noop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
38&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
The code generated in this last example is the same as the
previous except for the addition of two conditional jumps used
to implement the extra WHERE and HAVING clauses.  The WHERE
clause is implemented by instructions 9 through 11 in the query
loop.  The HAVING clause is implemented by instruction 28 through
30 in the output loop.

Using SELECT Statements As Terms In An Expression

The very name "Structured Query Language" tells us that SQL should
support nested queries.  And, in fact, two different kinds of nesting
are supported.  Any SELECT statement that returns a single-row, single-column
result can be used as a term in an expression of another SELECT statement.
And, a SELECT statement that returns a single-column, multi-row result
can be used as the right-hand operand of the IN and NOT IN operators.
We will begin this section with an example of the first kind of nesting,
where a single-row, single-column SELECT is used as a term in an expression
of another SELECT.  Here is our example:


SELECT * FROM examp
WHERE two!=(SELECT three FROM examp2
            WHERE four=5);


The way SQLite deals with this is to first run the inner SELECT
(the one against examp2) and store its result in a private memory
cell.  SQLite then substitutes the value of this private memory
cell for the inner SELECT when it evaluates the outer SELECT.
The code looks like this:
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemStore&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;Ž&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;909&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ne&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;MemStore&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;two&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;MemLoad&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;Eq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
22&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
23&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
24&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
25&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
26&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
27&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
The private memory cell is initialized to NULL by the first
two instructions.  Instructions 2 through 13 implement the inner
SELECT statement against the examp2 table.  Notice that instead of
sending the result to a callback or storing the result on a sorter,
the result of the query is pushed into the memory cell by instruction
10 and the loop is abandoned by the jump at instruction 11.  
The jump at instruction at 11 is vestigial and never executes.

The outer SELECT is implemented by instructions 14 through 25.
In particular, the WHERE clause that contains the nested select
is implemented by instructions 19 through 21.  You can see that
the result of the inner select is loaded onto the stack by instruction
20 and used by the conditional jump at 21.

When the result of a sub-select is a scalar, a single private memory
cell can be used, as shown in the previous
example.  But when the result of a sub-select is a vector, such
as when the sub-select is the right-hand operand of IN or NOT IN,
a different approach is needed.  In this case, 
the result of the sub-select is
stored in a transient table and the contents of that table
are tested using the Found or NotFound operators.  Consider this
example:


SELECT * FROM examp
WHERE two IN (SELECT three FROM examp2);


The code generated to implement this last query is as follows:
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenTemp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;909&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbs‘p;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IsNull&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutStrKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;one&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;two&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;’&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;NotNull&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;Pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;Goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;NotFound&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
22&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
23&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
24&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
25&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
26&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
The transient table in which the results of the inner SELECT are
stored is created by the OpenTemp 
instruction at 0.  This opcode is used for tables that exist for the 
duration of a single SQL statement only.  The transient cursor is always 
opened read/write even if the main database is read-only.  The transient 
table is deleted automatically when the cursor is closed.  The P2 value 
of 1 means the curso“r points to a BTree index, which has no data but can 
have an arbitrary key.

The inner SELECT statement is implemented by instructions 1 through 10.
All this code does is make an entry in the temporary table for each
row of the examp2 table with a non-NULL value for the "three" column.  
The key for each temporary table entry is the "three" column of examp2 
and the data is an empty string since it is never used.

The outer SELECT is implemented by instructions 11 through 25.  In
particular, the WHERE clause containing the IN operator is implemented
by instructions at 16, 17, and 20.  Instruction 16 pushes the value of
the "two" column for the current row onto the stack and instruction 17
checks to see that it is non-NULL.  If this is successful, execution 
jumps to 20, where it tests to see if top of the stack matches any key 
in the temporary table.  The rest of the code is the same as what has 
been shown before.

Compound SELECT Statements

SQLite also allows two or more SELECT statements to be joined as
peers using operators UNION, UNION ALL, INTERSECT, and EXCEPT.  These
compound select statements are implemented using transient tables.
The implementation is slightly different for each operator, but the
basic ideas are the same.  For an example we will use the EXCEPT
operator.


SELECT two FROM examp
EXCEPT
SELECT four FROM examp2;


The result of this last example should be every unique value
of the "two" column in the examp table, except any value that is
in the "four" column of examp2 is removed.  The code to implement
this query is as follows:
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;------------&nbsp;&nbsp;-----&nbsp;&nbsp;-----&nbsp;&nbsp;-----------------------------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenTemp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KeyAsData&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerifyCookie&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;909&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp”;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MakeRecord&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PutStrKey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
13&nbsp;&nbsp;&nbsp;&nbsp;OpenRead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;examp2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
14&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
16&nbsp;&nbsp;&nbsp;&nbsp;MakeRecord&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n•bsp;&nbsp;&nbsp;
17&nbsp;&nbsp;&nbsp;&nbsp;NotFound&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18&nbsp;&nbsp;&nbsp;&nbsp;Delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
19&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
20&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
21&nbsp;&nbsp;&nbsp;&nbsp;ColumnName&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;four&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
22&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
23&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
24&nbsp;&nbsp;&nbsp;&nbsp;Callback&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
25&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
26&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
27&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0
The transient table in which the result is built is created by
instruction 0.  Three loops then follow.  The loop at instructions
5 through 10 implements the first SELECT statement.  The second
SELECT statement is implemented by the loop at instructions 14 through
19.  Finally, a loop at instructions 22 through 25 reads the transient
table and invokes the callback once for each row in the result.

Instruction 1 is of particular importance in this example.  Normally,
the Column instruction extracts the value of a column from a larger
record in the data of an SQLite file entry.  Instruction 1 sets a flag on
the transient table so that Column will instead treat the key of the
SQLite file entry as if it were data and extract column information from
the key.

Here is what is going to happen:  The first SELECT statement
will construct rows of the result and save each row as the key of
an entry in the transient table.  The data for each entry in the
transient table is a never used so we fill it in with an empty string.
The second SELECT statement also constructs rows, but the rows
constructed by the second SELECT are removed from the transient table.
That is why we want the rows to be stored in the key of the SQLite file
instead of in the data -- so they can be easily located and deleted.

Let's look more closely at what is happening here.  The first
SELECT is implemented by the loop at instructions 5 through 10.
Instruction 5 initializes the loop by rewinding its cursor.
Instruction 6 extracts the value of the "two" column from "examp"
and instruction 7 converts this into a row.  Instruction 8 pushes
an empty string onto the stack.  Finally, instruction 9 writes the
row into the temporary table.  But remember, the PutStrKey opcode uses
the top of the stack as the record data and the next on stack as the
key.  For an INSERT statement, the row generated by the
MakeRecord opcode is the record data and the record key is an integer
created by the NewRecno opcode.  But here the roles are reversed and
the row created by MakeRecord is the record key and the record data is
just an empty string.

The second SELECT is implemented by instructions 14 through 19.
Instruction 14 initializes the loop by rewinding its cursor.
A new result row is created from the "four" column of table "examp2"
by instructions 15 and 16.  But instead of using PutStrKey to write this
new row into the temporary table, we instead call Delete to remove
it from the temporary table if it exists.

The result of the compound select is sent to the callback routine
by the loop at instructions 22 through 25.  There is nothing new
or remarkable about this loop, except for the fact that the Column 
instruction at 23 will be extracting a column out of the record key
rather than the record data.

Summary

This article has reviewed all of the major techniques used by
SQLite's VDBE to implement SQL statements.  What has not been shown
is that most of these techniques can be used in combination to
generate code for an appropriately complex query statement.  For
example, we have shown how sorting is accomplished on a simple query
and we have shown how to implement a compound query.  But we did
not give an example of sorting in a compound query.  This is because
sorting a compound query does not introduce any new concepts: it
merely combines two previous ideas (sorting and compounding)
in the same VDBE program.

For additional information on how the SQLite library
functions, the reader is directed to look at the SQLite source
code directly.  If you understand the material in this article,
you should not have much difficulty in following the sources.
Serious students of the internals of SQLite will probably
also want to make a careful study of the VDBE opcodes
as documented here.  Most of the
opcode documentation is extracted from comments in the source
code using a script so you can also get information about the
various opcodes directly from the vdbe.c source file.
If you have successfully read this far, you should have little
difficulty understanding the rest.

If you find errors in either the documentation or the code,
feel free to fix them and/or contact the author at
drh@hwaci.com.  Your bug fixes or
suggestions are always welcomed.

This page last modified on  2020-04-14 16:00:55 UTCvdbe.html—PEN_NOTEMPDIR&nbsp;(270)
SQLITE_CANTOPEN_SYMLINK&nbsp;(1550)
SQLITE_CONSTRAINT_CHECK&nbsp;(275)
SQLITE_CONSTRAINT_COMMITHOOK&nbsp;(531)
SQLITE_CONSTRAINT_DATATYPE&nbsp;(3091)
SQLITE_CONSTRAINT_FOREIGNKEY&nbsp;(787)
SQLITE_CONSTRAINT_FUNCTION&nbsp;(1043)
SQLITE_CONSTRAINT_NOTNULL&nbsp;(1299)
SQLITE_CONSTRAINT_PINNED&nbsp;(2835)
SQLITE_CONSTRAINT_PRIMARYKEY&nbsp;(1555)
SQLITE_CONSTRAINT_ROWID&nbsp;(2579)
SQLITE_CONSTRAINT_TRIGGER&nbsp;(1811)
SQLITE_CONSTRAINT_UNIQUE&nbsp;(2067)
SQLITE_CONSTRAINT_VTAB&nbsp;(2323)
SQLITE_CORRUPT_INDEX&nbsp;(779)
SQLITE_CORRUPT_SEQUENCE&nbsp;(523)
SQLITE_CORRUPT_VTAB&nbsp;(267)
SQLITE_ERROR_MISSING_COLLSEQ&nbsp;(257)
SQLITE_ERROR_RETRY&nbsp;(513)
SQLITE_ERROR_SNAPSHOT&nbsp;(769)
SQLITE_IOERR_ACCESS&nbsp;(3338)
SQLITE_IOERR_AUTH&nbsp;(7178)
SQLITE_IOERR_BEGIN_ATOMIC&nbsp;(7434)
SQLITE_IOERR_BLOCKED&nbsp;(2826)
SQLITE_IOERR_CHECKRESERVEDLOCK&nbsp;(3594)
SQLITE_IOERR_CLOSE&nbsp;(4106)
SQLITE_IOERR_COMMIT_ATOMIC&nbsp;(7690)
SQLITE_IOERR_CONVPATH&nbsp;(6666)
SQLITE_IOERR_CORRUPTFS&nbsp;(8458)
SQLITE_IOERR_DATA&nbsp;(8202)
SQLITE_IOERR_DELETE&nbsp;(2570)
SQLITE_IOERR_DELETE_NOENT&nbsp;(5898)
SQLITE_IOERR_DIR_CLOSE&nbsp;(4362)
SQLITE_IOERR_DIR_FSYNC&nbsp;(1290)
SQLITE_IOERR_FSTAT&nbsp;(1802)
SQLITE_IOERR_FSYNC&nbsp;(1034)
SQLITE_IOERR_GETTEMPPATH&nbsp;(6410)
SQLITE_IOERR_LOCK&nbsp;(3850)
SQLITE_IOERR_MMAP&nbsp;(6154)
SQLITE_IOERR_NOMEM&nbsp;(3082)
SQLITE_IOERR_RDLOCK&nbsp;(2314)
SQLITE_IOERR_READ&nbsp;(266)
SQLITE_IOERR_ROLLBACK_ATOMIC&nbsp;(7946)
SQLITE_IOERR_SEEK&nbsp;(5642)
SQLITE_IOERR_SHMLOCK&nbsp;(5130)
SQLITE_IOERR_SHMMAP&nbsp;(5386)
SQLITE_IOERR_SHMOPEN&nbsp;(4618)
SQLITE_IOERR_SHMSIZE&nbsp;(4874)
SQLITE_IOERR_SHORT_READ&nbsp;(522)
SQLITE_IOERR_TRUNCATE&nbsp;(1546)
SQLITE_IOERR_UNLOCK&nbsp;(2058)
SQLITE_IOERR_VNODE&nbsp;(6922)
SQLITE_IOERR_WRITE&nbsp;(778)
SQLITE_LOCKED_SHAREDCACHE&nbsp;(262)
SQLITE_LOCKED_VTAB&nbsp;(518)
SQLITE_NOTICE_RECOVER_ROLLBACK&nbsp;(539)
SQLITE_NOTICE_RECOVER_WAL&nbsp;(283)
SQLITE_OK_LOAD_PERMANENTLY&nbsp;(256)
SQLITE_READONLY_CANTINIT&nbsp;(1288)
SQLITE_READONLY_CANTLOCK&nbsp;(520)
SQLITE_READONLY_DBMOVED&nbsp;(1032)
SQLITE_READONLY_DIRECTORY&nbsp;(1544)
SQLITE_READONLY_RECOVERY&nbsp;(264)
SQLITE_READONLY_ROLLBACK&nbsp;(776)
SQLITE_WARNING_AUTOINDEX&nbsp;(284)



6. Result Code Meanings

The meanings for all 105
result code values are shown below,
in numeric order.



(1) SQLITE_ERROR

  The SQLITE_ERROR result code is a generic error code that is used when
  no other more specific error code is available.




(3) SQLITE_PERM

  The SQLITE_PERM result code indicates that the requested access mode
  for a newly created database could not be provided.




(5) SQLITE_BUSY

  The SQLITE_BUSY result code indicates that the database file could not
  be written (or in some cases read) because of concurrent activity by 
  some other database connection, usually a database connection in a
  separate process.
  
  For example, if process A is in the middle of a large write transaction
  and at the same time process B attempts to start a new write transaction,
  process B will get back an SQLITE_BUSY result because SQLite only supports
  one writer at a time.  Process B will need to wait for process A to finish
  its transaction before starting a new transaction.  The
  sqlite3_busy_timeout() and sqlite3_busy_handler() interfaces and
  the busy_timeout pragma are available to process B to help it deal
  with SQLITE_BUSY errors.
  
  An SQLITE_BUSY error can occur at any point in a transaction: when the
  transaction is first started, during any write or update operations, or
  when the transaction commits.
  To avoid encountering SQLITE_BUSY errors in the middle of a transaction,
  the application can use BEGIN IMMEDIATE instead of just BEGIN to
  start a transaction.  The BEGIN IMMEDIATE command might itself return
  SQLITE_BUSY, but if it succeeds, then SQLite guarantees that no 
  subsequent operations on the same database through the next COMMIT 
  will return SQLITE_BUSY.
  
  See also:  SQLITE_BUSY_RECOVERY and SQLITE_BUSY_SNAPSHOT.
  
  The SQLITE_BUSY result code ˜differs from SQLITE_LOCKED in that
  SQLITE_BUSY indicates a conflict with a
  separate database connection, probably in a separate process,
  whereas SQLITE_LOCKED 
  indicates a conflict within the same database connection (or sometimes
  a database connection with a shared cache).




(7) SQLITE_NOMEM

  The SQLITE_NOMEM result code indicates that SQLite was unable to allocate
  all the memory it needed to complete the operation.  In other words, an
  internal call to sqlite3_malloc() or sqlite3_realloc() has failed in
  a case where the memory being allocated was required in order to continue
  the operation.




(9) SQLITE_INTERRUPT

  The SQLITE_INTERRUPT result code indicates that an operation was
  interrupted by the sqlite3_interrupt() interface.
  See also: SQLITE_ABORT




(11) SQLITE_CORRUPT

  The SQLITE_CORRUPT result code indicates that the database file has
  been corrupted.  See the How To Corrupt Your Database Files for
  further discussion on how corruption can occur.




(13) SQLITE_FULL

  The SQLITE_FULL result code indicates that a write could not complete
  because the disk is full.  Note that this error can occur when trying
  to write information into the main database file, or it can also
  occur when writing into temporary disk files.
  
  Sometimes applications encounter this error even though there is an
  abundance of primary disk space because the error occurs when writing
  into temporary disk files on a system where temporary files are stored
  on a separate partition with much less space that the primary disk.




(15) SQLITE_PROTOCOL

  The SQLITE_PROTOCOL result code indicates a problem with the file locking
  protocol used by SQLite.  The SQLITE_PROTOCOL error is currently only
  returned when using WAL mode and attempting to start a new transaction.
  There is a race condition that can occur when two separate 
  database connections both try to start a transaction at the same time
  in WAL mode.  The loser of the race backs off and tries again, after
  a brief delay.  If the same connection loses the locking race dozens
  of times over a span of multiple seconds, it will eventually give up and
  return SQLITE_PROTOCOL.  The SQLITE_PROTOCOL error should appear in practice
  very, very rarely, and only when there are many separate processes all
  competing intensely to write to the same database.




(17) SQLITE_SCHEMA

  The SQLITE_SCHEMA result code indicates that the database schema
  has changed.  This result code can be returned from sqlite3_step() for
  a prepared statement that was generated using sqlite3_prepare() or
  sqlite3_prepare16().  If the database schema was changed by some other
  process in between the time that the statement was prepared and the time
  the statement was run, this error can result.
  
  If a prepared statement is generated from sqlite3_prepare_v2() then
  the statement is automatically re-prepared if the schema changes, up to
  SQLITE_MAX_SCHEMA_RETRY times (default: 50).  The sqlite3_step()
  interface will only return SQLITE_SCHEMA back to the application if 
  the failure persists after these many retries.




(19) SQLITE_CONSTRAINT

  The SQLITE_CONSTRAINT error code means that an SQL constraint violation
  occurred while trying to process an SQL statement.  Additional information
  about the failed constraint can be found by consulting the
  accompanying error message (returned via sqlite3_errmsg() or
  sqlite3_errmsg16()) or by looking at the extended error code.
  
  The SQLITE_CONSTRAINT code can also be used as the return value from
  the xBestIndex() method of a virtual table implementation.  When
  xBestIndex() returns SQLITE_CONSTRAINT, that indicates that the particular
  combination of inputs submitted to xBestIndex() cannot result in a
  usable query plan and should not be given further consideration.




(21) SQLITE_MISUSE

  The SQLITE_MISUSE return code might be returned if the application uses
  any SQLite interface in a way that is undefined or unsupported.  For
  example, using a prepared statement after that prepared statem™ent has
  been finalized might result in an SQLITE_MISUSE error.
  
  SQLite tries to detect misuse and report the misuse using this result code.
  However, there is no guarantee that the detection of misuse will be
  successful.  Misuse detection is probabilistic.  Applications should
  never depend on an SQLITE_MISUSE return value.
  
  If SQLite ever returns SQLITE_MISUSE from any interface, that means that
  the application is incorrectly coded and needs to be fixed.  Do not ship
  an application that sometimes returns SQLITE_MISUSE from a standard
  SQLite interface because that application contains potentially serious bugs.




(23) SQLITE_AUTH

  The SQLITE_AUTH error is returned when the
  authorizer callback indicates that an
  SQL statement being prepared is not authorized.




(25) SQLITE_RANGE

  The SQLITE_RANGE error indices that the parameter number argument
  to one of the sqlite3_bind routines or the
  column number in one of the sqlite3_column
  routines is out of range.




(27) SQLITE_NOTICE

  The SQLITE_NOTICE result code is not returned by any C/C++ interface.
  However, SQLITE_NOTICE (or rather one of its extended error codes)
  is sometimes used as the first argument in an sqlite3_log() callback
  to indicate that an unusual operation is taking place.




(100) SQLITE_ROW

  The SQLITE_ROW result code returned by
  sqlite3_step() indicates that another row of output is available.




(256) SQLITE_OK_LOAD_PERMANENTLY

  The sqlite3_load_extension() interface loads an 
  extension into a single
  database connection.  The default behavior is for that extension to be
  automatically unloaded when the database connection closes.  However,
  if the extension entry point returns SQLITE_OK_LOAD_PERMANENTLY instead
  of SQLITE_OK, then the extension remains loaded into the process address
  space after the database connection closes.  In other words, the
  xDlClose methods of the sqlite3_vfs object is not called for the
  extension when the database connection closes.
  
  The SQLITE_OK_LOAD_PERMANENTLY return code is useful to 
  loadable extensions that register new VFSes, for example.




(261) SQLITE_BUSY_RECOVERY

  The SQLITE_BUSY_RECOVERY error code is an extended error code
  for SQLITE_BUSY that indicates that an operation could not continue
  because another process is busy recovering a WAL mode database file
  following a crash.  The SQLITE_BUSY_RECOVERY error code only occurs
  on WAL mode databases.




(264) SQLITE_READONLY_RECOVERY

  The SQLITE_READONLY_RECOVERY error code is an extended error code
  for SQLITE_READONLY.  The SQLITE_READONLY_RECOVERY error code indicates
  that a WAL mode database cannot be opened because the database file
  needs to be recovered and recovery requires write access but only
  read access is available.




(267) SQLITE_CORRUPT_VTAB

  The SQLITE_CORRUPT_VTAB error code is an extended error code
  for SQLITE_CORRUPT used by virtual tables.  A virtual table might
  return SQLITE_CORRUPT_VTAB to indicate that content in the virtual table
  is corrupt.




(275) SQLITE_CONSTRAINT_CHECK

  The SQLITE_CONSTRAINT_CHECK error code is an extended error code
  for SQLITE_CONSTRAINT indicating that a CHECK constraint failed.




(283) SQLITE_NOTICE_RECOVER_WAL

  The SQLITE_NOTICE_RECOVER_WAL result code is
  passed to the callback of
  sqlite3_log() when a WAL mode database file is recovered.




(513) SQLITE_ERROR_RETRY

  The SQLITE_ERROR_RETRY is used internally to provoke sqlite3_prepare_v2()
  (or one of its sibling routines for creating prepared statements) to
  try again to prepare a statement that failed with an error on the
  previous attempt.




(517) SQLITE_BUSY_SNAPSHOT

  The SQLITE_BUSY_SNAPSHOT error code is an extended error code
  for SQLITE_BUSY that occurs on WAL mode databases when a database
  connection tries to promote a read transaction into a write transaction
  but finds that another database connection has already written to the
  database and thus invalidated prior reads.
  
  The following scenario illustrates how an SQLITE_BUSY_SNAPšSHOT error
  might arise:
  
   Process A starts a read transaction on the database and does one
       or more SELECT statement.  Process A keeps the transaction open.
   Process B updates the database, changing values previous read by
       process A.
   Process A now tries to write to the database.  But process A's view
       of the database content is now obsolete because process B has
       modified the database file after process A read from it.  Hence
       process A gets an SQLITE_BUSY_SNAPSHOT error.
  




(520) SQLITE_READONLY_CANTLOCK

  The SQLITE_READONLY_CANTLOCK error code is an extended error code
  for SQLITE_READONLY.  The SQLITE_READONLY_CANTLOCK error code indicates
  that SQLite is unable to obtain a read lock on a WAL mode database
  because the shared-memory file associated with that database is read-only.




(523) SQLITE_CORRUPT_SEQUENCE

  The SQLITE_CORRUPT_SEQUENCE result code means that the schema of
  the sqlite_sequence table is corrupt.  The sqlite_sequence table
  is used to help implement the AUTOINCREMENT feature.  The
  sqlite_sequence table should have the following format:
  
  CREATE TABLE sqlite_sequence(name,seq);
  
  If SQLite discovers that the sqlite_sequence table has any other
  format, it returns the SQLITE_CORRUPT_SEQUENCE error.




(531) SQLITE_CONSTRAINT_COMMITHOOK

  The SQLITE_CONSTRAINT_COMMITHOOK error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a
  commit hook callback returned non-zero that thus
  caused the SQL statement to be rolled back.




(769) SQLITE_ERROR_SNAPSHOT

  The SQLITE_ERROR_SNAPSHOT result code might be returned when attempting
  to start a read transaction on an historical version of the database
  by using the sqlite3_snapshot_open() interface.  If the historical
  snapshot is no longer available, then the read transaction will fail
  with the SQLITE_ERROR_SNAPSHOT.  This error code is only possible if
  SQLite is compiled with -DSQLITE_ENABLE_SNAPSHOT.




(776) SQLITE_READONLY_ROLLBACK

  The SQLITE_READONLY_ROLLBACK error code is an extended error code
  for SQLITE_READONLY.  The SQLITE_READONLY_ROLLBACK error code indicates
  that a database cannot be opened because it has a hot journal that
  needs to be rolled back but cannot because the database is readonly.




(779) SQLITE_CORRUPT_INDEX

  The SQLITE_CORRUPT_INDEX result code means that SQLite detected
  an entry is or was missing from an index.  This is a special case of
  the SQLITE_CORRUPT error code that suggests that the problem might
  be resolved by running the REINDEX command, assuming no other
  problems exist elsewhere in the database file.




(787) SQLITE_CONSTRAINT_FOREIGNKEY

  The SQLITE_CONSTRAINT_FOREIGNKEY error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a foreign key constraint failed.




(1034) SQLITE_IOERR_FSYNC

  The SQLITE_IOERR_FSYNC error code is an extended error code
  for SQLITE_IOERR indicating an I/O error in the VFS layer
  while trying to flush previously written content out of OS and/or
  disk-control buffers and into persistent storage.  In other words,
  this code indicates a problem with the fsync() system call in unix
  or the FlushFileBuffers() system call in windows.




(1043) SQLITE_CONSTRAINT_FUNCTION

  The SQLITE_CONSTRAINT_FUNCTION error code is not currently used
  by the SQLite core.  However, this error code is available for use
  by extension functions.




(1290) SQLITE_IOERR_DIR_FSYNC

  The SQLITE_IOERR_DIR_FSYNC error code is an extended error code
  for SQLITE_IOERR indicating an I/O error in the VFS layer
  while trying to invoke fsync() on a directory.  The unix VFS attempts
  to fsync() directories after creating or deleting certain files to
  ensure that those files will still appear in the filesystem following
  a power loss or system crash.  This error code indicates a problem
  attempting to perform that fsync().




(1299) SQLITE_CONSTRAINT_NOTNULL

  The SQLITE_CONSTRAINT_NOTNULL error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a NOT NULL constraint failed.




(1546) SQLITE_IOERR_TRUNCATE

  The SQLITE_IOERR_TRUNCATE error code is an extended error code
  for SQLITE_IOERR indicating an I/O error in the VFS layer
  while trying to truncate a file to a smaller size.




(1555) SQLITE_CONSTRAINT_PRIMARYKEY

  The SQLITE_CONSTRAINT_PRIMARYKEY error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a PRIMARY KEY constraint failed.




(1811) SQLITE_CONSTRAINT_TRIGGER

  The SQLITE_CONSTRAINT_TRIGGER error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a RAISE function within
  a trigger fired, causing the SQL statement to abort.




(2067) SQLITE_CONSTRAINT_UNIQUE

  The SQLITE_CONSTRAINT_UNIQUE error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a UNIQUE constraint failed.




(2323) SQLITE_CONSTRAINT_VTAB

  The SQLITE_CONSTRAINT_VTAB error code is not currently used
  by the SQLite core.  However, this error code is available for use
  by application-defined virtual tables.




(2579) SQLITE_CONSTRAINT_ROWID

  The SQLITE_CONSTRAINT_ROWID error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a rowid is not unique.




(2835) SQLITE_CONSTRAINT_PINNED

  The SQLITE_CONSTRAINT_PINNED error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that an UPDATE trigger attempted
  do delete the row that was being updated in the middle of the update.




(3091) SQLITE_CONSTRAINT_DATATYPE

  The SQLITE_CONSTRAINT_DATATYPE error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that an insert or update attempted
  to store a value inconsistent with the column's declared type
  in a table defined as STRICT.




(3594) SQLITE_IOERR_CHECKRESERVEDLOCK

  The SQLITE_IOERR_CHECKRESERVEDLOCK error code is
  an extended error code
  for SQLITE_IOERR indicating an I/O error
  within the xCheckReservedLock method on the sqlite3_io_methods object.




(4106) SQLITE_IOERR_CLOSE

  The SQLITE_IOERR_ACCESS error code is an extended error code
  for SQLITE_IOERR indicating an I/O error
  within the xClose method on the sqlite3_io_methods object.




(4618) SQLITE_IOERR_SHMOPEN

  The SQLITE_IOERR_SHMOPEN error code is an extended error code
  for SQLITE_IOERR indicating an I/O error
  within the xShmMap method on the sqlite3_io_methods object
  while trying to open a new shared memory segment.




(5130) SQLITE_IOERR_SHMLOCK

  The SQLITE_IOERR_SHMLOCK error code is no longer used.




(5642) SQLITE_IOERR_SEEK

  The SQLITE_IOERR_SEEK error code is an extended error code
  for SQLITE_IOERR indicating an I/O error
  within the xRead or xWrite methods on the sqlite3_io_methods object
  while trying to seek a file descriptor to the beginning point of the
  file where the read or write is to occur.




(6154) SQLITE_IOERR_MMAP

  The SQLITE_IOERR_MMAP error code is an extended error code
  for SQLITE_IOERR indicating an I/O error
  within the xFetch or xUnfetch methods on the sqlite3_io_methods object
  while trying to map or unmap part of the database file into the
  process address space.




(6666) SQLITE_IOERR_CONVPATH

  The SQLITE_IOERR_CONVPATH error code is an extended error code
  for SQLITE_IOERR used only by Cygwin VFS and indicating that
  the cygwin_conv_path() system call failed.
  See also: SQLITE_CANTOPEN_CONVPATH




(7178) SQLITE_IOERR_AUTH

  The SQLITE_IOERR_AUTH error code is a code reserved for use
  by extensions.  It is not used by the SQLite core.




(7690) SQLITE_IOERR_COMMIT_ATOMIC

  The SQLITE_IOERR_COMMIT_ATOMIC error code indicates that the
  underlying operating system reported and error on the
  SQLITE_FCNTL_COMMIT_ATOMIC_WRITE file-control.  This only comes
  up when SQLITE_ENABLE_ATOMIC_WRITE is enabled and the database
  is hosted on a filesystem that supports atomic writes.




(8202) SQLITE_IOERR_DATA

  The SQLITE_IOERR_DATA error code is an extended error code
  for SQLITE_IOERR used only by checksum VFS shim to indicate that
  the checksum on a page of the database file is incorrect.rescode.html
Üܾƒ
9‚ûC%Result and Error CodesOverview 


Many of the routines in the SQLite C-language Interface return
numeric result codes indicating either success or failure, and 
in the event of a failure, providing some idea of the cause of
the failure.  This document strives to explain what each
of those numeric result codes means.

1. Result Codes versus Error Codes


"Error codes" are a subset of "result codes" that indicate that
something has gone wrong.  There are only a few non-error result
codes:  SQLITE_OK, SQLITE_ROW, and SQLITE_DONE.  The term
"error code" means any result code other than these three.



2. Primary Result Codes versus Extended Result Codes


Result codes are signed 32-bit integers.
The least significant 8 bits of the result code define a broad category
and are called the "primary result code".  More significant bits provide
more detailed information about the error and are called the
"extended result code"


Note that the primary result code is always a part of the extended
result code.  Given a full 32-bit extended result code, the application
can always find the corresponding primary result code merely by extracting
the least significant 8 bits of the extended result code.


All extended result codes are also error codes.  Hence the terms
"extended result code" and "extended error code" are interchangeable.


For historic compatibility, the C-language interfaces return
primary result codes by default.  
The extended result code for the most recent error can be
retrieved using the sqlite3_extended_errcode() interface.
The sqlite3_extended_result_codes() interface can be used to put
a database connection into a mode where it returns the
extended result codes instead of the primary result codes.

3. Definitions


All result codes are integers.
Symbolic names for all result codes are created using
"#define" macros in the sqlite3.h header file.
There are separate sections in the sqlite3.h header file for
the result code definitions and the extended result code definitions.


Primary result code symbolic names are of the form "SQLITE_XXXXXX" where
XXXXXX is a sequence of uppercase alphabetic characters.  Extended
result code names are of the form "SQLITE_XXXXXX_YYYYYYY" where
the XXXXXX part is the corresponding primary result code and the
YYYYYYY is an extension that further classifies the result code.


The names and numeric values for existing result codes are fixed
and unchanging.  However, new result codes, and especially new extended
result codes, might appear in future releases of SQLite.


4. Primary Result Code List
The 31 result codes are 
   defined in sqlite3.h and are listed in
   alphabetical order below: 


SQLITE_ABORT&nbsp;(4)
SQLITE_AUTH&nbsp;(23)
SQLITE_BUSY&nbsp;(5)
SQLITE_CANTOPEN&nbsp;(14)
SQLITE_CONSTRAINT&nbsp;(19)
SQLITE_CORRUPT&nbsp;(11)
SQLITE_DONE&nbsp;(101)
SQLITE_EMPTY&nbsp;(16)
SQLITE_ERROR&nbsp;(1)
SQLITE_FORMAT&nbsp;(24)
SQLITE_FULL&nbsp;(13)
SQLITE_INTERNAL&nbsp;(2)
SQLITE_INTERRUPT&nbsp;(9)
SQLITE_IOERR&nbsp;(10)
SQLITE_LOCKED&nbsp;(6)
SQLITE_MISMATCH&nbsp;(20)
SQLITE_MISUSE&nbsp;(21)
SQLITE_NOLFS&nbsp;(22)
SQLITE_NOMEM&nbsp;(7)
SQLITE_NOTADB&nbsp;(26)
SQLITE_NOTFOUND&nbsp;(12)
SQLITE_NOTICE&nbsp;(27)
SQLITE_OK&nbsp;(0)
SQLITE_PERM&nbsp;(3)
SQLITE_PROTOCOL&nbsp;(15)
SQLITE_RANGE&nbsp;(25)
SQLITE_READONLY&nbsp;(8)
SQLITE_ROW&nbsp;(100)
SQLITE_SCHEMA&nbsp;(17)
SQLITE_TOOBIG&nbsp;(18)
SQLITE_WARNING&nbsp;(28)




5. Extended Result Code List
The 74 extended result codes
  are defined in sqlite3.h and are
  listed in alphabetical order below:


SQLITE_ABORT_ROLLBACK&nbsp;(516)
SQLITE_AUTH_USER&nbsp;(279)
SQLITE_BUSY_RECOVERY&nbsp;(261)
SQLITE_BUSY_SNAPSHOT&nbsp;(517)
SQLITE_BUSY_TIMEOUT&nbsp;(773)
SQLITE_CANTOPEN_CONVPATH&nbsp;(1038)
SQLITE_CANTOPEN_DIRTYWAL&nbsp;(1294)
SQLITE_CANTOPEN_FULLPATH&nbsp;(782)
SQLITE_CANTOPEN_ISDIR&nbsp;(526)
SQLITE_CANTO–ingle API call as follows:

sqlite3_cksumvfs_init();


Cksumvfs is a VFS shim. When loaded, "cksmvfs" becomes the new
default VFS, and it uses the prior default VFS as the next VFS
down in the stack.  This is normally what you want.  However, in
complex situations where multiple VFS shims are being loaded,
it might be important to ensure that cksumvfs is loaded in the
correct order so that it sequences itself into the default VFS
Shim stack in the right order.

4. Usage

Open database connections using the sqlite3_open() or 
sqlite3_open_v2() interfaces, as normal.  Ordinary database files
(without a checksum) will operate normally.  Databases with 
checksums will return an SQLITE_IOERR_DATA error if a page is
encountered that contains an invalid checksum.

Checksumming only works on databases that have a reserve bytes
value of exactly 8.  The default value for reserve-bytes is 0.
Hence, newly created database files will omit the checksum by
default.  To create a database that includes a checksum, change
the reserve-bytes value to 8 by running code similar to this:

int n = 8;
sqlite3_file_control(db, 0, SQLITE_FCNTL_RESERVE_BYTES, &n);


If you do this immediately after creating a new database file,
before anything else has been written into the file, then that
might be all that you need to do.  Otherwise, the API call
above should be followed by:

sqlite3_exec(db, "VACUUM", 0, 0, 0);


It never hurts to run the VACUUM, even if you don't need it.
If the database is in WAL mode, you should shutdown and
reopen all database connections before continuing.

From the CLI, use the ".filectrl reserve_bytes 8" command, 
followed by "VACUUM;".

Note that SQLite allows the number of reserve-bytes to be
increased but not decreased.  So if a database file already
has a reserve-bytes value greater than 8, there is no way to
activate checksumming on that database, other than to dump
and restore the database file.  Note also that other extensions
might also make use of the reserve-bytes.  Checksumming will
be incompatible with those other extensions.

5. Verification Of Checksums

If any checksum is incorrect, the "PRAGMA quick_check" command
will find it.  To verify that checksums are actually enabled
and running, use SQL like the following:

SELECT count(*), verify_checksum(data)
  FROM sqlite_dbpage
 GROUP BY 2;


There are three possible outputs from the verify_checksum()
function: 1, 0, and NULL.  1 is returned if the checksum is
correct.  0 is returned if the checksum is incorrect.  NULL
is returned if the page is unreadable.  If checksumming is
enabled, the read will fail if the checksum is wrong, so the
usual result from verify_checksum() on a bad checksum is NULL.

If everything is OK, the query above should return a single
row where the second column is 1.  Any other result indicates
either that there is a checksum error, or checksum validation
is disabled.

6. Controlling Checksum Verification

The cksumvfs extension implements a new PRAGMA statement that can
be used to disable, re-enable, or query the status of checksum
verification:

PRAGMA checksum_verification;          -- query status
PRAGMA checksum_verification=OFF;      -- disable verification
PRAGMA checksum_verification=ON;       -- re-enable verification


The "checksum_verification" pragma will return "1" (true) or "0"
(false) if checksum verification is enabled or disabled, respectively.
"Verification" in this context means the feature that causes
SQLITE_IOERR_DATA errors if a checksum mismatch is detected while
reading.  Checksums are always kept up-to-date as long as the
reserve bytes value of the database is 8, regardless of the setting
of this pragma.  Checksum verification can be disabled (for example)
to do forensic analysis of a database that has previously reported
a checksum error.

The "checksum_verification" pragma will always respond with "0" if
the database file does not have a reserve bytes value of 8.  The
pragma will return no rows at all if the cksumvfs extension is
not loaded.
This page last modified on  2020-12-10 10:53:35 UTCcksumvfs.html
¯dƒ    7Þ'The Checksum VFS Shim1. Overview

The checksum VFS extension is a VFS shim that adds an 8-byte
checksum to the end of every page in an SQLite database.  The checksum
is added as each page is written and verified as each page is read.
The checksum is intended to help detect database corruption caused by
random bit-flips in the mass storage device.

The checksum VFS extension requires 
SQLite version 3.32.0 (2020-05-22) or later.  It will not
work with earlier versions of SQLite.

2. Compiling

The checksum VFS module is a loadable extension.  It is not
included in the amalgamation.  It must be added to SQLite
either at compile-time or at run-time.  The source code to
the checksum VFS module is in the
ext/misc/cksumvfs.c
source file in the
SQLite source tree.

To build the checksum VFS module into a run-time loadable
extension, use commands similar to the following:


(linux) &rarr; gcc -fPIC -shared cksumvfs.c -o cksumvfs.so
(mac) &rarr; clang -fPIC -dynamiclib cksumvfs.c -o cksumvfs.dylib
(windows) &rarr; cl cksumvfs.c -link -dll -out:cksumvfs.dll


You may want to add additional compiler options, of course,
according to the needs of your project.

To statically link this extension with your product,
compile it like any other C-language module but add the
"-DSQLITE_CKSUMVFS_STATIC" option so that this module knows that
it is being statically linked rather than dynamically linked.

3. Loading

To load this extension as a shared library, you first have to
bring up a dummy SQLite database connection to use as the argument
to the sqlite3_load_extension() API call.  Then you invoke the
sqlite3_load_extension() API and shutdown the dummy database
connection.  All subsequent database connections that are opened
will include this extension.  For example:

sqlite3 *db;
sqlite3_open(":memory:", &db);
sqlite3_load_extension(db, "./cksumvfs");
sqlite3_close(db);


If this extension is compiled with -DSQLITE_CKSUMVFS_STATIC and
statically linked against the application, initialize it using
a sœŸulti-byte UTF8 characters.


The built-in SQLite has compile-time options such as
SQLITE_PRINTF_PRECISION_LIMIT that provide defense against 
denial-of-service attacks for application that expose the
printf() functionality to untrusted users.


Using a built-in printf() implementation means that SQLite has one
fewer dependency on the host environment, making it more portable.


1.2. Disadvantages


In fairness, having a built-in implementation of printf() also comes with
some disadvantages.  To wit:



The built-in printf() implementation uses extra code space 
(about 7800 bytes on GCC 5.4 with -Os).


The floating-point to text conversion subfunction for the built-in printf()
is limited in precision to 16 significant digits or 26 significant digits
if the "!" alternate-form-2 flag is used.
Every IEEE-754 double can be represented exactly as a decimal floating-point
value, but some doubles require more than 16 or 26 significant digits.


The order of the buffer pointer and buffer size parameters in the built-in
snprintf() implementation is reversed from the order used in standard-library
implementations.


The built-in printf() implementation does not handle posix positional referencing
modifiers that allow the order of arguments to printf() to be different from the
order of the %-substitutions.  In the built-in printf(), the order of the arguments
must exactly match the order of the %-substitutions.



In spite of the disadvantages, the developers believe that having a built-in
printf() implementation inside of SQLite is a net positive.

2. Formatting Details

The format string for printf() is a template for the generated
string.  Substitutions are made whenever a "%" character appears in
the format string.  The "%" is followed by one or more additional
characters that describe the substitution.  Each substitution has
the following format:


%&#91;flags&#93;&#91;width&#93;&#91;.precision&#93;&#91;length&#93;type


All substitutions begin with a single "%" and end with a single type character.
The other elements of the substitution are optional.

To include a single "%" character in the output, put two consecutive
"%" characters in the template.

2.1. Substitution Types

The following chart shows the substitution types supported by SQLite:




Substitution TypeMeaning

%
Two "%" characters in a row are translated into a single "%" in the output,
    without substituting any values.

d, i
The argument is a signed integer which is displayed in decimal.

u
The argument is an unsigned integer which is displayed in decimal.

f
The argument is a double which is displayed in decimal.

e, E
The argument is a double which is displayed in exponential notation.
    The exponent character is 'e' or 'E' depending on the type.

g, G
The argument is a double which is displayed in either normal decimal
    notation or if the exponent is not close to zero, in exponential
    notation.

x, X
The argument is an integer which is displayed in hexadecimal.
    Lower-case hexadecimal is used for %x and upper-case is used
    for %X

o
The argument is an integer which is displayed in octal.

s, z



    The argument is either a zero-terminated string that is displayed,
    or a null pointer which is treated as an empty string.  For
    the %z type in C-language interfaces, sqlite3_free() is invoked
    on the string after it has been copied into the output. The %s and %z
    substitutions are identical for the SQL printf() function, with
    a NULL argument treated as an empty string.
    The %s substitution is universal among printf functions, but
    the %z substitution and safe treatment of null pointers
    are SQLite enhancements, not found in other
    printf() implementations.

c
For the C-language interfaces, the argument is an integer which
    is interpreted as a character.  For the format() SQL function the
    argument is a string from which the first character is extracted and
    displayed.

p
The argument is a pointer which is displayed as a hexadecimal address.
    Since the SQL language has no concept of a pointer, the %p s ubstitution
    for the format() SQL function works like %x.

n
The argument is a pointer to an integer.  Nothing is displayed for
    this substitution type.  Instead, the integer to which the argument
    points is overwritten with the number of characters in the generated
    string that result from all format symbols to the left of the %n.

q, Q


    The argument is a zero-terminated string.  The string is printed with
    all single quote (') characters doubled so that the string can safely
    appear inside an SQL string literal.  The %Q substitution type also
    puts single-quotes on both ends of the substituted string.
    If the argument
    to %Q is a null pointer then the output is an unquoted "NULL".  In other
    words, a null pointer generates an SQL NULL, and a non-null pointer generates
    a valid SQL string literal.  If the argument to %q is a null pointer
    then no output is generated.  Thus a null-pointer to %q is the same as
    an empty string.
    For these  substitutions, the precision is the number of bytes or
    characters taken from the argument, not the number of bytes or characters that
    are written into the output.
    
    The %q and %Q substitutions are SQLite enhancements, not found in
    most other printf() implementations.

w


    This substitution works like %q except that it doubles all double-quote
    characters (") instead of single-quotes, making the result suitable for
    using with a double-quoted identifier name in an SQL statement.
    
    The %w substitution is an SQLite enhancements, not found in
    most other printf() implementations.



2.2. The Optional Length Field

The length of the argument value can be specified by one or more letters
that occur just prior to the substitution type letter.  In SQLite, the
length only matter for integer types.  The length is ignored for the
format() SQL function which always uses 64-bit values.  The following
table shows the length specifiers allowed by SQLite:




Length Specifier
Meaning

(default)
An "int" or "unsigned int".  32-bits on all modern systems.

l
A "long int" or "long unsigned int".  Also 32-bits on all modern systems.

ll
A "long long int" or "long long unsigned" or an "sqlite3_int64" or
    "sqlite3_uint64" value.  These are 64-bit integers on all modern systems.



Only the "ll" length modifier ever makes a difference for SQLite.  And
it only makes a difference when using the C-language interfaces.

2.3. The Optional Width Field

The width field specifies the minimum width of the substituted value in
the output.  If the string or number that is written into the output is shorter
than the width, then the value is padded.  Padding is on the left (the
value is right-justified) by default.  If the "-" flag is used, then the
padding is on the right and the value is left-justified.

The width is measured in bytes by default.  However, if the "!" flag is
present then the width is in characters.  This only makes a difference for
multi-byte utf-8 characters, and those only occur on string substitutions.

If the width is a single "*" character instead of a number, then the
actual width value is read as an integer from the argument list.  If the
value read is negative, then the absolute value is used for the width and
the value is left-justified as if the "-" flag were present.

If the value being substituted is larger than the width, then full value
is added to the output.  In other words, the width is the minimum width of
the value as it is rendered in the output.

2.4. The Optional Precision Field

The precision field, if it is present, must follow the width separated
by a single "." character.  If there is no width, then the "." that introduces
the precision immediately follows either the flags (if there are any) or
the initial "%".

For string substitutions (%s, %z, %q, %Q, or %w) the precision is the number
of byte or character used from the argument.  The number is bytes by default but
is characters if the "!" flag is present.  If there is no precision, then the
entire string is substituted.  Examples:  "%.3s" substitutes the first 3 bytes
of the argument string.  "%!.3s" substitutes the first three characters of the
argument string.

For integer substitutions (%d, %i, %x, %X, %o, and %p) the precision specifies
minimum number of digits to display.  Leading zeros are added if necessary, to
expand the output to the minimum number of digits.

For floating-point substitutions (%e, %E, %f, %g, %G) the precision specifies 
the number of digits to display to the right of the decimal point.

For the character substitution (%c) a precision N greater than 1 causes the
character to be repeated N times.  This is a non-standard extension found only
in SQLite.

If the precision is a single "*" character instead of a number, then the
actual precision value is read as an integer from the argument list.

2.5. The Options Flags Field

Flags consist of zero or more characters that immediately follow the
"%" that introduces the substitution.  The various flags and their meanings
are as follows:




Flag
Meaning

-
Left-justify the value in the output.  The default is to right-justify.
If the width is zero or is otherwise less than the length of the value being
substituted, then there is no padding and the "-" flag is a no-op.

+
For signed numeric substitutions, include a "+" sign before positive numbers.
A "-" sign always appears before negative numbers regardless of flag settings.

(space)
For signed numeric substitutions, prepend a single space before positive
numbers.

0
Prepend as many "0" characters to numeric substitutions as necessary to
expand the value out to the specified width.  If the width field is omitted,
then this flag is a no-op.

#
This is the "alternate-form-1" flag.
For %g and %G substitutions, this causes trailing zeros to be removed.
This flag forces a decimal point to appear for all floating-point substitutions.
For %o, %x, and %X substitutions, the alternate-form-1 flag cause the value
to be prepended with "0", "0x", or "0X", respectively.

,
This flag causes comma-separators to be added to the output of %d and %i
substitutions, between every 3 digits from the left.  This can help humans
to more easily discern the magnitude of large integer values.  For example,
the value 2147483647 would be rendered as "2147483647" using "%d" but would
appear as "2,147,483,647" with "%,d".  This flag is a non-standard extension.

!
This is the "alternate-form-2 flag.
For string substitutions, this flag causes the width and precision to be understand
in terms of characters rather than bytes.
For floating point substitutions, the alternate-form-2 flag increases the 
maximum number of significant digits displayed from 16 to 26,
forces the display of the decimal point and causes at least one digit
to appear after the decimal point.
The alternate-form-2 flag is a non-standard extension that appears in no
other printf() implementations, as far as we know.



3. Implementation And History


The core string formatting routine is the sqlite3VXPrintf() function found in the
printf.c source file.  All the
various interfaces invoke (sometimes indirectly) this one core function.
The sqlite3VXPrintf() function began as code written by the first author
of SQLite (Hipp) when he was a graduate student at Duke University in the
late 1980s.  Hipp kept this printf() implementation in his personal toolbox until
he started working on SQLite in 2000.  The code was incorporated into the
SQLite source tree on 2000-10-08
for SQLite version 1.0.9.


The Fossil Version Control System uses its own
printf() implementation that is derived from an early version of the SQLite
printf() implementation, but those two implementations have since diverged.


The sqlite3_snprintf() function has its buffer pointer and buffer size
arguments reversed from what is found in the standard C library snprintf()
routine. This is because there was no snprintf() routine in the
standard C library
when Hipp was first implementing his version, and he chose a different order
than the designers of the standard C library.
This page last modified on  2022-02-15 13:32:30 UTCprintf.html
QQõƒ
Aée#SQLite's Built-in printf()1. Overview

SQLite contains its own implementation of the string formatting routine "printf()",
accessible via the following interfaces:


 format() &rarr; an SQL function returning the formatted string
 sqlite3_mprintf() &rarr; Store the formatted string in memory obtained
     sqlite3_malloc64().
 sqlite3_snprintf() &rarr; Store the formatted string in a static buffer
 sqlite3_str_appendf() &rarr; Append formatted text to a dynamic string
 sqlite3_vmprintf() &rarr; Varargs version of sqlite3_mprintf()
 sqlite3_vsnprintf() &rarr; Varargs version of sqlite3_snprintf()
 sqlite3_str_vappendf() &rarr; Varargs version of sqlite3_str_appendf()


The same core string formatter is also used internally by SQLite.

1.1. Advantages

Why does SQLite have its own private built-in printf() implementation?
Why not use the printf() implementation from the standard C library?
Several reasons:




By using its own built-in implementation, SQLite guarantees that the
output will be the same on all platforms and in all LOCALEs.
This is important for consistency and for testing.  It would be problematic
if one machine gave an answer of "5.25e+08" and another gave an answer
of "5.250e+008".  Both answers are correct, but it is better when SQLite
always gives the same answer.


We know of no way to use the standard library printf() C interface to
implement the format() SQL function feature of SQLite.  The built-in
printf() implementation can be easily adapted to that task, however.


The printf() in SQLite supports new non-standard substitution
types (%q, %Q, %w, and %z), and enhanced substitution
behavior (%s and %z) that are useful both internally to SQLite
and to applications using SQLite.
Standard library printf()s cannot normally be extended in this way.


Via the sqlite3_mprintf() and sqlite3_vmprintf() interfaces,
the built-in printf() implementation supports the ability to render an
arbitrary-length string into a memory buffer obtained from sqlite3_malloc64().
This is safer and less error prone than trying to precompute an upper size
limit on the result string, allocate an appropriately sized buffer, and
then calling snprintf().


The SQLite-specific printf() supports a new flag (!) called the
"alternate-form-2" flag.  The alternate-form-2 flag changes the processing
of floating-point conversions in subtle ways so that the output is always
an SQL-compatible text representation of a floating-point number - something
that is not possible to achieve with standard-library printf().  For
string substitutions, the alternate-form-2 flag causes the width and
precision to be measured in characters instead of bytes, which simplifies
processing of strings containing mž£h the ".open" command, you might want to use a
full pathname with forward-slash directory separators to avoid ambiguity.



3. Special commands to sqlite3 (dot-commands)


Most of the time, sqlite3 just reads lines of input and passes them
on to the SQLite library for execution.
But input lines that begin with a dot (".")
are intercepted and interpreted by the sqlite3 program itself.
These "dot commands" are typically used to change the output format
of queries, or to execute certain prepackaged query statements.
There were originally just a few dot commands, but over the years
many new features have accumulated so that today there are over 60.



For a listing of the available dot commands, you can enter ".help" with
no arguments.  Or enter ".help TOPIC" for detailed information about TOPIC.
The list of available dot-commands follows:


sqlite&gt; .help
.archive ...             Manage SQL archives
.auth ON|OFF             Show authorizer callbacks
.backup ?DB? FILE        Backup DB (default "main") to FILE
.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
.connection &#91;close&#93; &#91;#&#93;  Open or close an auxiliary database connection
.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 ?OBJECTS?          Render database content as SQL
.echo on|off             Turn command echo on or off
.eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN
.excel                   Display the output of next command in spreadsheet
.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
.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
.imposter INDEX TABLE    Create imposter table TABLE on index INDEX
.indexes ?TABLE?         Show names of indexes
.limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT
.lint OPTIONS            Report potential schema issues.
.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
.nonce STRING            Disable safe mode for one command if the nonce matches
.nullvalue STRING        Use STRING in place of NULL values
.once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE
.open ?OPTIONS? ?FILE?   Close existing database and reopen FILE
.output ?FILE?           Send output to FILE or stdout if FILE is omitted
.parameter CMD ...       Manage SQL parameter bindings
.print STRING...         Print literal STRING
.progress N              Invoke progress handler after every N opcodes
.prompt MAIN CONTINUE    Replace the standard prompts
.quit                    Exit this program
.read FILE               Read input from FILE
.recover                 Recover as much data as possible from corrupt db.
.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
.selftest ?OPTIONS?      Run tests defined in the SELFTEST table
.separator COL ?ROW?     Change the column and row separators
.session ?NAME? CMD ...  Create or c¤ontrol sessions
.sha3sum ...             Compute a SHA3 hash of database content
.shell CMD ARGS...       Run CMD ARGS... in a system shell
.show                    Show the current values for various settings
.stats ?ARG?             Show stats or turn stats on or off
.system CMD ARGS...      Run CMD ARGS... in a system shell
.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
.timeout MS              Try opening locked tables for MS milliseconds
.timer on|off            Turn SQL timer on or off
.trace ?OPTIONS?         Output each SQL statement as it is run
.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 minimum column widths for columnar output
sqlite&gt;




4. Rules for "dot-commands", SQL and More

4.1. Line Structure

The CLI's input is parsed into a sequence consisting of:
  
    SQL statements;
    dot-commands; or
    CLI comments
  
SQL statements are free-form, and can be spread across multiple lines,
  with whitespace or SQL comments embedded anywhere.
  They are terminated by either a ';' character at the end of an input line,
  or a '/' character or the word "go" on a line by itself.
  When not at the end of an input line, the ';' character
  acts to separate SQL statements.
  Trailing whitespace is ignored for purposes of termination.
A dot-command has a more restrictive structure:

It must begin with its "." at the left margin
    with no preceding whitespace.
It must be entirely contained on a single input line.
It cannot occur in the middle of an ordinary SQL
    statement.  In other words, it cannot occur at a
    continuation prompt.
There is no comment syntax for dot-commands.

The CLI also accepts whole-line comments that
begin with a '#' character and extend to the end of the line.
There can be no with whitespace prior to the '#'.

4.2. Dot-command arguments
The arguments passed to dot-commands are parsed from the command tail, 
  per these rules:

  The trailing newline and any other trailing whitespace is discarded;
  Whitespace immediately following the dot-command name, or any argument
    input end bound is discarded;
  An argument input begins with any non-whitespace character;
  An argument input ends with a character which
    depends upon its leading character thusly:
  
    for a leading single-quote ('), a single-quote acts
      as the end delimiter;
    for a leading double-quote ("), an unescaped double-quote
      acts as the end delimiter;
    for any other leading character, the end delimiter is
      any whitespace; and
    the command tail end acts as the end delimiter for any argument;
  
  Within a double-quoted argument input, a backslash-escaped double-quote
    is part of the argument rather than its terminating quote;
  Within a double-quoted argument, traditional C-string literal, backslash
    escape sequence translation is done; and
  Argument input delimiters (the bounding quotes or whitespace)
    are discarded to yield the passed argument.


4.3. Dot-command execution
The dot-commands
are interpreted by the sqlite3.exe command-line program, not by
SQLite itself.  So none of the dot-commands will work as an argument
to SQLite interfaces such as sqlite3_prepare() or sqlite3_exec().



5. Changing Output Formats

The sqlite3 program is able to show the results of a query
in 14 different output formats:


 ascii
 box
 csv
 column
 html
 insert
 json
 line
 list
 markdown
 quote
 table
 tabs
 tcl


You can use the ".mode" dot command to switch between these output
formats.
The default output mode is "list".  In
list mode, each row of a query result is written on one line of
output and each column within that row is separated by a specific
separator string.  The default separator is a pipe symbol ("|").
List mode is especially useful when you are going to send ¥the output
of a query to another program (such as AWK) for additional processing.

sqlite&gt; .mode list
sqlite&gt; select * from tbl1;
hello!|10
goodbye|20
sqlite&gt;


Type ".mode" with no arguments to show the current mode:

sqlite&gt; .mode
current output mode: list
sqlite&gt;


Use the ".separator" dot command to change the separator.
For example, to change the separator to a comma and
a space, you could do this:

sqlite&gt; .separator ", "
sqlite&gt; select * from tbl1;
hello!, 10
goodbye, 20
sqlite&gt;


The next ".mode" command might reset the ".separator" back to some
default value (depending on its arguments).
So you will likely need to repeat the ".separator" command whenever you
change modes if you want to continue using a non-standard separator.



In "quote" mode, the output is formatted as SQL literals.  Strings are
enclosed in single-quotes and internal single-quotes are escaped by doubling.
Blobs are displayed in hexadecimal blob literal notation (Ex: x'abcd').
Numbers are displayed as ASCII text and NULL values are shown as "NULL".
All columns are separated from each other by a comma (or whatever alternative
character is selected using ".separator").

sqlite&gt; .mode quote
sqlite&gt; select * from tbl1;
'hello!',10
'goodbye',20
sqlite&gt;


In "line" mode, each column in a row of the database
is shown on a line by itself.  Each line consists of the column
name, an equal sign and the column data.  Successive records are
separated by a blank line.  Here is an example of line mode
output:

sqlite&gt; .mode line
sqlite&gt; select * from tbl1;
one = hello!
two = 10

one = goodbye
two = 20
sqlite&gt;





In column mode, each record is shown on a separate line with the
data aligned in columns.  For example:

sqlite&gt; .mode column
sqlite&gt; select * from tbl1;
one       two       
--------  ---
hello!    10        
goodbye   20        
sqlite&gt;


In "column" mode (and also in "box", "table", and "markdown" modes)
the width of columns adjusts automatically.  But you can override this,
providing a speicified width for each column using the ".width" command.
The arguments to ".width" are integers which are the number of
characters to devote to each column.  Negative numbers mean right-justify.
Thus:

sqlite&gt; .width 12 -6
sqlite&gt; select * from tbl1;
one              two
------------  ------
hello!            10
goodbye           20
sqlite&gt;


A width of 0 means the column width is chosen automatically.
Unspecified column widths become zero.  Hence, the command
".width" with no arguments resets all column widths to zero and
hence causes all column widths to be determined automatically.

The "column" mode is a tabular output format.  Other
tabular output formats are "box", "markdown", and "table":

sqlite&gt; .width
sqlite&gt; .mode markdown
sqlite&gt; select * from tbl1;
|   one   | two |
|---------|-----|
| hello!  | 10  |
| goodbye | 20  |
sqlite&gt; .mode table
sqlite&gt; select * from tbl1;
+---------+-----+
|   one   | two |
+---------+-----+
| hello!  | 10  |
| goodbye | 20  |
+---------+-----+
sqlite&gt; .mode box
sqlite&gt; select * from tbl1;
┌─────────┬─────â”
│   one   │ two │
├─────────┼─────┤
│ hello!  │ 10  │
│ goodbye │ 20  │
└─────────┴─────┘
sqlite&gt;





The columnar modes accept some addition options to control formatting.
The "--wrap N" option (where N is an integer) causes columns
to wrap text that is longer than N characters.  Wrapping is disabled if
N is zero.

sqlite&gt; insert into tbl1 values('The quick fox jumps over a lazy brown dog.',90);
sqlite&gt; .mode box --wrap 30
sqlite&gt; select * from tbl1 where two&gt;50;
┌────────────────────────────────┬─────â”
│              one               │ two │
├────────────────────────────────┼─────┤
│ The quick fox jumps over a laz │ 90  │
│ y¦ brown dog.                   │     │
└────────────────────────────────┴─────┘
sqlite&gt;


Wrapping happens after exactly N characters, 
which might be in the middle of a word.
To wrap at a word boundary, add the "--wordwrap on" option 
(or just "-ww" for short):

sqlite&gt; .mode box --wrap 30 -ww
sqlite&gt; select * from tbl1 where two&gt;50;
┌─────────────────────────────┬─────â”
│             one             │ two │
├─────────────────────────────┼─────┤
│ The quick fox jumps over a  │ 90  │
│ lazy brown dog.             │     │
└─────────────────────────────┴─────┘
sqlite&gt;


The "--quote" option causes the results in each column to be
quoted like an SQL literal, as in the "quote" mode.  See the on-line
help for additional options.



The command ".mode box --wrap 60 --quote" is so useful for general-purpose
database queries that it is given its own alias.  Instead of typing out
that whole 27-character command, you can just say ".mode qbox".

Another useful output mode is "insert".  In insert mode, the output
is formatted to look like SQL INSERT statements.  Use insert
mode to generate text that can later be used to input data into a 
different database.

When specifying insert mode, you have to give an extra argument
which is the name of the table to be inserted into.  For example:

sqlite&gt; .mode insert new_table
sqlite&gt; select * from tbl1 where two&lt;50;
INSERT INTO "new_table" VALUES('hello',10);
INSERT INTO "new_table" VALUES('goodbye',20);
sqlite&gt;



Other output modes include "csv", "json", and "tcl".  Try these
yourself to see what they do.




6. Querying the database schema

The sqlite3 program provides several convenience commands that
are useful for looking at the schema of the database.  There is
nothing that these commands do that cannot be done by some other
means.  These commands are provided purely as a shortcut.



For example, to see a list of the tables in the database, you
can enter ".tables".


sqlite&gt; .tables
tbl1 tbl2
sqlite&gt;



The ".tables" command is similar to setting list mode then
executing the following query:

SELECT name FROM sqlite_schema 
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
ORDER BY 1


But the ".tables" command does more.  It queries the sqlite_schema table
for all attached databases, not just the primary database.  And it arranges
its output into neat columns.

The ".indexes" command works in a similar way to list all of
the indexes. If the ".indexes" command is given an argument which is
the name of a table, then it shows just indexes on that table.



The ".schema" command shows the complete schema for the database,
or for a single table if an optional tablename argument is provided:

sqlite&gt; .schema
create table tbl1(one varchar(10), two smallint)
CREATE TABLE tbl2 (
  f1 varchar(30) primary key,
  f2 text,
  f3 real
);
sqlite&gt; .schema tbl2
CREATE TABLE tbl2 (
  f1 varchar(30) primary key,
  f2 text,
  f3 real
);
sqlite&gt;



The ".schema" command is roughly the same as setting
list mode, then entering the following query:

SELECT sql FROM sqlite_schema
ORDER BY tbl_name, type DESC, name


As with ".tables", the ".schema" command shows the schema for
all attached databases.  If you only want to see the schema for
a single database (perhaps "main") then you can add an argument
to ".schema" to restrict its output:

sqlite&gt; .schema main.*


The ".schema" command can be augmented with the "--indent" option,
in which case it tries to reformat the various CREATE statements of
the schema so that they are more easily readable by humans.



The ".databases" command shows a list of all databases open in
the current connection.  There will always be at least 2.  The first
one is "main", the original database opened. § The second is "temp",
the database used for temporary tables. There may be additional 
databases listed for databases attached using the ATTACH statement.
The first output column is the name the database is attached with, 
and the second result column is the filename of the external file.
There may be a third result column which will be either "'r/o'" or
"'r/w'" depending on whether the database file is read-only or read-write.
And there might be a fourth result column showing the result of
sqlite3_txn_state() for that database file.

sqlite&gt; .databases




The ".fullschema" dot-command works like the ".schema" command in
that it displays the entire database schema.  But ".fullschema" also
includes dumps of the statistics tables "sqlite_stat1", "sqlite_stat3",
and "sqlite_stat4", if they exist.  The ".fullschema" command normally
provides all of the information needed to exactly recreate a query
plan for a specific query.  When reporting suspected problems with
the SQLite query planner to the SQLite development team, developers
are requested to provide the complete ".fullschema" output as part
of the trouble report.  Note that the sqlite_stat3 and sqlite_stat4
tables contain samples of index entries and so might contain sensitive
data, so do not send the ".fullschema" output of a proprietary database
over a public channel.



7. Opening Database Files

The ".open" command opens a new database connection, after first closing the
previously opened database command.  In its simplest form, the ".open" command merely
invokes sqlite3_open() on the file named as its argument.  Use the name ":memory:"
to open a new in-memory database that disappears when the CLI exits or when the
".open" command is run again.

If the --new option is included with ".open", then the database is reset prior
to being opened.  Any prior data is destroyed.  This is a destructive overwrite of
prior data and no confirmation is requested, so use this option carefully.

The --readonly option opens the database in read-only mode.  Write will be
prohibited.

The --deserialize option causes the entire content of the on-disk file to be
read into memory and then opened as an in-memory database using the
sqlite3_deserialize() interface.  This will, of course, require a lot of memory
if you have a large database.  Also, any changes you make to the database will not
be saved back to disk unless you explicitly save them using the ".save" or ".backup"
commands.

The --append option causes the SQLite database to be appended to an existing
file rather than working as a stand-alone file.  See the 
appendvfs extension for
more information.

The --zip option causes the specified input file to be interpreted as a ZIP archive
instead of as an SQLite database file.

The --hexdb option causes the database content to be to be read from subsequent
lines of input in a hex format, rather than from a separate file on disk.  
The "dbtotxt" command-line tool can be used to generate
the appropriate text for a database.  The --hexdb option is intended for use by the
SQLite developers for testing purposes.  We do not know of any use cases for this
option outside of internal SQLite testing and development.

8. Redirecting I/O



8.1. Writing results to a file

By default, sqlite3 sends query results to standard output.  You
can change this using the ".output" and ".once" commands.  Just put 
the name of an output file as an argument to .output and all subsequent
query results will be written to that file.  Or use the .once command
instead of .output and output will only be redirected for the single next
command before reverting to the console.  Use .output with no arguments to
begin writing to standard output again.  For example:

sqlite&gt; .mode list
sqlite&gt; .separator |
sqlite&gt; .output test_file_1.txt
sqlite&gt; select * from tbl1;
sqlite&gt; .exit
$ cat test_file_1.txt
hello|10
goodbye|20
$


If the first character of the ".output" or ".once" filename is a pipe
symbol ("|") then the remaining characters are treated as a command and the
output is sent to that command.¨  This makes it easy to pipe the results
of a query into some other process.  For example, the 
"open -f" command on a Mac opens a text editor to display the content that
it reads from standard input.  So to see the results of a query
in a text editor, one could type:

sqlite&gt; .once | open -f
sqlite&gt; SELECT * FROM bigTable;


If the ".output" or ".once" commands have an argument of "-e" then
output is collected into a temporary file and the system text editor is
invoked on that text file.  Thus, the command ".once -e" achieves the
same result as ".once '|open -f'" but with the benefit of being portable
across all systems.

If the ".output" or ".once" commands have a "-x" argument, that causes
them to accumulate output as Comma-Separated-Values (CSV) in a temporary
file, then invoke the default system utility for viewing CSV files
(usually a spreadsheet program) on the result.  This is a quick way of
sending the result of a query to a spreadsheet for easy viewing:

sqlite&gt; .once -x
sqlite&gt; SELECT * FROM bigTable;




The ".excel" command is an alias for ".once -x".  It does exactly the same
thing.



8.2. Reading SQL from a file

In interactive mode, sqlite3 reads input text (either SQL statements
or dot-commands) from the keyboard.  You can also redirect input from
a file when you launch sqlite3, of course, but then you do not have the
ability to interact with the program.  Sometimes it is useful to run an
SQL script contained in a file entering other commands from the command-line.
For this, the ".read" dot-command is provided.

The ".read" command takes a single argument which is (usually) the name
of a file from which to read input text.

sqlite&gt; .read myscript.sql


The ".read" command temporarily stops reading from the keyboard and instead
takes its input from the file named.  Upon reaching the end of the file,
input reverts back to the keyboard.  The script file may contain dot-commands,
just like ordinary interactive input.

If the argument to ".read" begins with the "|" character, then instead of
opening the argument as a file, it runs the argument (without the leading "|")
as a command, then uses the output of that command as its input.  Thus, if you
have a script that generates SQL, you can execute that SQL directly using
a command similar to the following:

sqlite&gt; .read |myscript.bat





8.3. File I/O Functions

The command-line shell adds two application-defined SQL functions that
facilitate reading content from a file into a table column, and writing the
content of a column into a file, respectively.

The readfile(X) SQL function reads the entire content of the file named
X and returns that content as a BLOB.  This can be used to load content into
a table.  For example:

sqlite&gt; CREATE TABLE images(name TEXT, type TEXT, img BLOB);
sqlite&gt; INSERT INTO images(name,type,img)
   ...&gt;   VALUES('icon','jpeg',readfile('icon.jpg'));


The writefile(X,Y) SQL function write the blob Y into the file named X
and returns the number of bytes written.  Use this function to extract
the content of a single table column into a file.  For example:

sqlite&gt; SELECT writefile('icon.jpg',img) FROM images WHERE name='icon';


Note that the readfile(X) and writefile(X,Y) functions are extension
functions and are not built into the core SQLite library.  These routines
are available as a loadable extension in the
ext/misc/fileio.c
source file in the SQLite source code repositories.



8.4. The edit() SQL function

The CLI has another built-in SQL function named edit().  Edit() takes
one or two arguments.  The first argument is a value - often a large
multi-line string to be edited.  The second argument is the invocation
for a text editor. (It may include options to affect the editor's
behavior.) If the second argument is omitted, the VISUAL environment
variable is used.  The edit() function writes its first argument into a
temporary file, invokes the editor on the temporary file, rereads the file
back into memory after the editor is done, then returns the edited text.

The edit() function can be use©d to make changes to large text
values.  For example:

sqlite&gt; UPDATE docs SET body=edit(body) WHERE name='report-15';


In this example, the content of the docs.body field for the entry where
docs.name is "report-15" will be sent to the editor.  After the editor returns,
the result will be written back into the docs.body field.

The default operation of edit() is to invoke a text editor.  But by using
an alternative edit program in the second argument, you can also get it to edit
images or other non-text resources.  For example, if you want to modify a JPEG
image that happens to be stored in a field of a table, you could run:

sqlite&gt; UPDATE pics SET img=edit(img,'gimp') WHERE id='pic-1542';


The edit program can also be used as a viewer, by simply ignoring the
return value.  For example, to merely look at the image above, you might run:

sqlite&gt; SELECT length(edit(img,'gimp')) WHERE id='pic-1542';




8.5. Importing files as CSV or other formats

Use the ".import" command to import CSV (comma separated value)
or similarly delimited data into an SQLite table.
The ".import" command takes two arguments which are the
source from which data is to be read and the name of the
SQLite table into which the data is to be inserted. The source argument
is the name of a file to be read or, if it begins with a "|" character,
it specifies a command which will be run to produce the input data.

Note that it may be important to set the "mode" before running the
 ".import" command.  This is prudent to prevent the command-line shell
from trying to interpret the input file text as some format other than
how the file is structured. If the --csv or --ascii options are used,
they control import input delimiters. Otherwise, the delimiters are
those in effect for the current output mode.

To import into a table not in the "main" schema, the --schema option
may be used to specify that the table is in some other schema. This can
be useful for ATTACH'ed databases or to import into a TEMP table.

When .import is run, its treatment of the first input row depends
upon whether the target table already exists. If it does not exist,
the table is automatically created and the content of the first input
row is used to set the name of all the columns in the table. In this
case, the table data content is taken from the second and subsequent
input rows. If the target table already exists, every row of the
input, including the first, is taken to be actual data content.  If
the input file contains an initial row of column labels, you can make
the .import command skip that initial row using the "--skip 1" option.

Here is an example usage, loading a pre-existing temporary table
from a CSV file which has column names in its first row:

sqlite&gt; .import --csv --skip 1 --schema temp C:/work/somedata.csv tab1


While reading input data in modes other than 'ascii', ".import"
interprets input as records composed of fields according to the RFC 4180
specification with this exception: The input record and field separators
are as set by the mode or by use of the .separator command. Fields are
always subject to quote removal to reverse quoting done per RFC 4180,
except in ascii mode.

To import data with arbitrary delimiters and no quoting,
first set ascii mode (".mode&nbsp;ascii"), then set the field
and record delimiters using the ".separators" command. This
will suppress dequoting. Upon ".import", the data will be split
into fields and records according to the delimiters so specified.



8.6. Export to CSV

To export an SQLite table (or part of a table) as CSV, simply set
the "mode" to "csv" and then run a query to extract the desired rows
of the table. The output will formatted as CSV per RFC 4180.

sqlite&gt; .headers on
sqlite&gt; .mode csv
sqlite&gt; .once c:/work/dataout.csv
sqlite&gt; SELECT * FROM tab1;
sqlite&gt; .system c:/work/dataout.csv


In the example above, the ".headers on" line causes column labels to
be printed as the first row of output.  This means that the first row of
the resulting CSV file will contain column labels.  If column laªbels are
not desired, set ".headers off" instead. (The ".headers off" setting is
the default and can be omitted if the headers have not been previously
turned on.)

The line ".once FILENAME" causes all query output to go into
the named file instead of being printed on the console.  In the example
above, that line causes the CSV content to be written into a file named
"C:/work/dataout.csv".

The final line of the example (the ".system c:/work/dataout.csv")
has the same effect as double-clicking on the c:/work/dataout.csv file
in windows.  This will typically bring up a spreadsheet program to display
the CSV file.

That command only works as written on Windows.  
The equivalent line on a Mac would be:

sqlite&gt; .system open dataout.csv


On Linux and other unix systems you will need to enter something like:


sqlite&gt; .system xdg-open dataout.csv




8.6.1.  Export to Excel 

To simplify export to a spreadsheet, the CLI provides the
".excel" command which captures the output of a single query and sends
that output to the default spreadsheet program on the host computer.
Use it like this:

sqlite&gt; .excel
sqlite&gt; SELECT * FROM tab;



The command above writes the output of the query as CSV into a temporary
file, invokes the default handler for CSV files (usually the preferred
spreadsheet program such as Excel or LibreOffice), then deletes the
temporary file.  This is essentially a short-hand method of doing
the sequence of ".csv", ".once", and ".system" commands described above.


The ".excel" command is really an alias for ".once -x".  The -x option
to .once causes it to writes results as CSV into a temporary file that
is named with a ".csv" suffix, then invoke the systems default handler
for CSV files.


There is also a ".once -e" command which works similarly, except that
it names the temporary file with a ".txt" suffix so that the default
text editor for the system will be invoked, instead of the default
spreadsheet.



8.6.2.  Export to TSV (tab separated values)


Exporting to pure TSV, without any field quoting, can be done by
entering ".mode tabs" before running a query. However, the output
will not be read correctly in tabs mode by the ".import" command
if it contains doublequote characters. To get TSV quoted per
RFC 4180 so that it can be input in tabs mode with ".import",
first enter ".mode&nbsp;csv", then enter '.separator&nbsp;"\t"'
before running a query.



9. Accessing ZIP Archives As Database Files

In addition to reading and writing SQLite database files,
the sqlite3 program will also read and write ZIP archives.
Simply specify a ZIP archive filename in place of an SQLite database
filename on the initial command line, or in the ".open" command,
and sqlite3 will automatically detect that the file is a
ZIP archive instead of an SQLite database and will open it as such.
This works regardless of file suffix.  So you can open JAR, DOCX,
and ODP files and any other file format that is really a ZIP
archive and SQLite will read it for you.

A ZIP archive appears to be a database containing a single table
with the following schema:

CREATE TABLE zip(
  name,     // Name of the file
  mode,     // Unix-style file permissions
  mtime,    // Timestamp, seconds since 1970
  sz,       // File size after decompression
  rawdata,  // Raw compressed file data
  data,     // Uncompressed file content
  method    // ZIP compression method code
);


So, for example, if you wanted to see the compression efficiency
(expressed as the size of the compressed content relative to the
original uncompressed file size) for all files in the ZIP archive,
sorted from most compressed to least compressed, you could run a
query like this:

sqlite&gt; SELECT name, (100.0*length(rawdata))/sz FROM zip ORDER BY 2;


Or using file I/O functions, you can extract elements of the
ZIP archive:

sqlite&gt; SELECT writefile(name,content) FROM zip
   ...&gt; WHERE name LIKE 'docProps/%';


9.1. How ZIP archive access is implemented

The command-line shell uses the Zipfile virtual table to
access ZIP archives.  You can see this by running th«e ".schema"
command when a ZIP archive is open:

sqlite&gt; .schema
CREATE VIRTUAL TABLE zip USING zipfile('document.docx')
/* zip(name,mode,mtime,sz,rawdata,data,method) */;


When opening a file, if the command-line client discovers that the
file is ZIP archive instead of an SQLite database, it actually opens
an in-memory database and then in that in-memory database it creates
an instance of the Zipfile virtual table that is attached to the
ZIP archive.

The special processing for opening ZIP archives is a trick of the
command-line shell, not the core SQLite library.  So if you want to
open a ZIP archive as a database in your application, you will need to
activate the Zipfile virtual table module then run an appropriate
CREATE VIRTUAL TABLE statement.




10. Converting An Entire Database To A Text File

Use the ".dump" command to convert the entire contents of a
database into a single UTF-8 text file.  This file can be converted
back into a database by piping it back into sqlite3.

A good way to make an archival copy of a database is this:


$ sqlite3 ex1 .dump | gzip -c &gt;ex1.dump.gz



This generates a file named ex1.dump.gz that contains everything
you need to reconstruct the database at a later time, or on another
machine.  To reconstruct the database, just type:


$ zcat ex1.dump.gz | sqlite3 ex2



The text format is pure SQL so you
can also use the .dump command to export an SQLite database
into other popular SQL database engines.  Like this:


$ createdb ex2
$ sqlite3 ex1 .dump | psql ex2




11. Recover Data From a Corrupted Database

Like the ".dump" command, ".recover" attempts to convert the entire 
contents of a database file to text. The difference is that instead of
reading data using the normal SQL database interface, ".recover"
attempts to reassemble the database based on data extracted directly from 
as many database pages as possible. If the database is corrupt, ".recover"
is usually able to recover data from all uncorrupted parts of the database,
whereas ".dump" stops when the first sign of corruption is encountered.

If the ".recover" command recovers one or more rows that it cannot 
attribute to any database table, the output script creates a "lost_and_found"
table to store the orphaned rows. The schema of the lost_and_found
table is as follows:

CREATE TABLE lost_and_found(
    rootpgno INTEGER,             -- root page of tree pgno is a part of
    pgno INTEGER,                 -- page number row was found on
    nfield INTEGER,               -- number of fields in row
    id INTEGER,                   -- value of rowid field, or NULL
    c0, c1, c2, c3...             -- columns for fields of row
);


The "lost_and_found" table contains one row for each orphaned row recovered
from the database. Additionally, there is one row for each recovered index
entry that cannot be attributed to any SQL index. This is because, in an
SQLite database, the same format is used to store SQL index entries and
WITHOUT ROWID table entries.


  ColumnContents
  rootpgno Even though it may not be possible to attribute the 
      row to a specific database table, it may be part of a tree structure
      within the database file. In this case, the root page number of that
      tree structure is stored in this column. Or, if the page the row was
      found on is not part of a tree structure, this column stores a copy of
      the value in column "pgno" - the page number of the page the row was
      found on. In many, although not all, cases, all rows in the
      lost_and_found table with the same value in this column belong to the
      same table.

  pgno The page number of the page on which this row was found.

  nfield The number of fields in this row.

  id If the row comes from a WITHOUT ROWID table, this column 
      contains NULL. Otherwise, it contains the 64-bit integer rowid value for
      the row.

  c0,&nbsp;c1,&nbsp;c2... The values for each column of the row
      are stored in these columns. The ".recover" command creates the
      lost_and_found table with as many columns as required by the ¬longest
      orphaned row.


If the recovered database schema already contains a table named
"lost_and_found", the ".recover" command uses the name "lost_and_found0". If
the name "lost_and_found0" is also already taken, "lost_and_found1", and so
on. The default name "lost_and_found" may be overridden by invoking ".recover"
with the --lost-and-found switch. For example, to have the output script call
the table "orphaned_rows":

sqlite&gt; .recover --lost-and-found orphaned_rows




12. Loading Extensions

You can add new custom application-defined SQL functions,
collating sequences, virtual tables, and VFSes to the command-line
shell at run-time using the ".load" command.  First, build the
extension as a DLL or shared library (as described in the
Run-Time Loadable Extensions document) then type:

sqlite&gt; .load /path/to/my_extension


Note that SQLite automatically adds the appropriate extension suffix
(".dll" on windows, ".dylib" on Mac, ".so" on most other unixes) to the
extension filename.  It is generally a good idea to specify the full
pathname of the extension.

SQLite computes the entry point for the extension based on the extension
filename.  To override this choice, simply add the name of the extension
as a second argument to the ".load" command.

Source code for several useful extensions can be found in the
ext/misc
subdirectory of the SQLite source tree.  You can use these extensions
as-is, or as a basis for creating your own custom extensions to address
your own particular needs.




13. Cryptographic Hashes Of Database Content

The ".sha3sum" dot-command computes a
SHA3 hash of the content
of the database.  To be clear, the hash is computed over the database content,
not its representation on disk.  This means, for example, that a VACUUM
or similar data-preserving transformation does not change the hash.

The ".sha3sum" command supports options "--sha3-224", "--sha3-256", 
"--sha3-384", and "--sha3-512" to define which variety of SHA3 to use
for the hash.  The default is SHA3-256.

The database schema (in the sqlite_schema table) is not normally
included in the hash, but can be added by the "--schema" option.

The ".sha3sum" command takes a single optional argument which is a
LIKE pattern.  If this option is present, only tables whose names match
the LIKE pattern will be hashed.

The ".sha3sum" command is implemented with the help of the
extension function "sha3_query()"
that is included with the command-line shell.



14. Database Content Self-Tests

The ".selftest" command attempts to verify that a database is
intact and is not corrupt.  
The .selftest command looks for a table in schema named "selftest"
and defined as follows:

CREATE TABLE selftest(
  tno INTEGER PRIMARY KEY,  -- Test number
  op TEXT,                  -- 'run' or 'memo'
  cmd TEXT,                 -- SQL command to run, or text of "memo"
  ans TEXT                  -- Expected result of the SQL command
);


The .selftest command reads the rows of the selftest table in
selftest.tno order.
For each 'memo' row, it writes the text in 'cmd' to the output.  For
each 'run' row, it runs the 'cmd' text as SQL and compares the result
to the value in 'ans', and shows an error message if the results differ.

If there is no selftest table, the ".selftest" command runs
PRAGMA integrity_check.

The ".selftest --init" command creates the selftest table if it
does not already exists, then appends entries that check the SHA3
hash of the content of all tables.  Subsequent runs of ".selftest"
will verify that the database has not been changed in any way.  To
generate tests to verify that a subset of the tables is unchanged,
simply run ".selftest --init" then DELETE the selftest rows that
refer to tables that are not constant.  



15. SQLite Archive Support

The ".archive" dot-command and the "-A" command-line option
provide built-in support for the 
SQLite Archive format. The interface is similar to
that of the "tar" command on unix systems. Each invocation of the ".ar"
command must specify a single command option. The following commands
are availab-le for ".archive":


  OptionLong&nbsp;OptionPurpose
  -c--createCreate a new archive containing specified files.
  -x--extractExtract specified files from archive.
  -i--insertAdd files to existing archive.
  -r--removeRemove files from the archive.
  -t--listList the files in the archive.
  -u--updateAdd files to existing archive if they have changed.


As well as the command option, each invocation of ".ar" may specify
one or more modifier options. Some modifier options require an argument,
some do not. The following modifier options are available:


  OptionLong&nbsp;OptionPurpose
  -v--verboseList each file as it is processed.
  -f FILE--file FILEIf specified, use file FILE as the
  archive. Otherwise, assume that the current "main" database is the 
  archive to be operated on.
  -a FILE--append FILELike --file, use file FILE as the
  archive, but open the file using the 
  apndvfs VFS so that
  the archive will be appended to the end of FILE if FILE already exists.
  -C DIR--directory DIRIf specified, interpret all relative
  paths as relative to DIR, instead of the current working directory.
  -g--globUse glob(Y,X) to match arguments
  against names in the archive.
  -n--dryrunShow the SQL that would be run to carry out the
                       archive operation, but do not actually change anything.
  ----All subsequent command line words are command arguments,
  not options.



For command-line usage, add the short style command-line options immediately
following the "-A", without an intervening space.  All subsequent arguments
are considered to be part of the .archive command.  For example, the following 
commands are equivalent:

sqlite3 new_archive.db -Acv file1 file2 file3
sqlite3 new_archive.db ".ar -cv file1 file2 file3"



Long and short style options may be mixed. For example, the following are
equivalent:

-- Two ways to create a new archive named "new_archive.db" containing
-- files "file1", "file2" and "file3".
.ar -c --file new_archive.db file1 file2 file3
.ar -f new_archive.db --create file1 file2 file3


Alternatively, the first argument following to ".ar" may be the concatenation
of the short form of all required options (without the "-" characters). In 
this case arguments for options requiring them are read from the command line
next, and any remaining words are considered command arguments. For example:

-- Create a new archive "new_archive.db" containing files "file1" and
-- "file2" from directory "dir1".
.ar cCf dir1 new_archive.db file1 file2 file3


15.1.  SQLite Archive Create Command 

Create a new archive, overwriting any existing archive (either in the current
"main" db or in the file specified by a --file option). Each argument following
the options is a file to add to the archive. Directories are imported
recursively. See above for examples.

15.2.  SQLite Archive Extract Command 

Extract files from the archive (either to the current working directory or
to the directory specified by a --directory option). 
Files or directories whose names match the arguments,
as affected by the --glob option, are extracted. 
Or, if no arguments follow the options, all files and directories are extracted.
Any specified directories are extracted recursively. It is an error if any
specified names or match patterns cannot be found in the archive.

-- Extract all files from the archive in the current "main" db to the
-- current working directory. List files as they are extracted. 
.ar --extract --verbose

-- Extract file "file1" from archive "ar.db" to directory "dir1".
.ar fCx ar.db dir1 file1

-- Extract files with ".h" extension to directory "headers".
.ar -gCx headers *.h


15.3.  SQLite Archive List Command 

List the contents of the archive. If no arguments are specified, then all
files are listed. Otherwise, only those which match the arguments,
as affected by the --glob option, are listed. Currently,
the --verbose option does not change the behaviour of this command. That may
change in the future.

-- List contents of archive in current "main" db..
.ar --list




15.4.  SQLite Archive Insert® And Update Commands 

 The --update and --insert commands work like --create command, except that 
they do not delete the current archive before commencing. New versions of
files silently replace existing files with the same names, but otherwise
the initial contents of the archive (if any) remain intact.

 For the --insert command, all files listed are inserted into the archive.
For the --update command, files are only inserted if they do not previously
exist in the archive, or if their "mtime" or "mode" is different from what
is currently in the archive.

 Compatibility node:  Prior to SQLite version 3.28.0 (2019-04-16) only
the --update option was supported but that option worked like --insert in that
it always reinserted every file regardless of whether or not it had changed.

15.5.  SQLite Archive Remove Command 

 The --remove command deletes files and directories which match the
provided arguments (if any) as affected by the --glob option.
It is an error to provide arguments which match nothing in the archive.

15.6.  Operations On ZIP Archives 

If FILE is a ZIP archive rather than an SQLite Archive, the ".archive"
command and the "-A" command-line option still work.  This is accomplished
using of the zipfile extension.
Hence, the following commands are roughly equivalent,
differing only in output formatting:


  Traditional CommandEquivalent sqlite3.exe Command
  unzip archive.zipsqlite3 -Axf archive.zip
  unzip -l archive.zipsqlite3 -Atvf archive.zip
  zip -r archive2.zip dirsqlite3 -Acf archive2.zip dir


15.7.  SQL Used To Implement SQLite Archive Operations 

The various SQLite Archive Archive commands are implemented using SQL statements.
Application developers can easily add SQLite Archive Archive reading and writing
support to their own projects by running the appropriate SQL.

To see what SQL statements are used to implement an SQLite Archive
operation, add the --dryrun or -n option.  This causes the SQL to be
displayed but inhibits the execution of the SQL.

The SQL statements used to implement SQLite Archive operations make use of
various loadable extensions.  These extensions are all available in
the SQLite source tree in the
ext/misc/ subfolder.
The extensions needed for full SQLite Archive support include:



fileio.c &mdash;
This extension adds SQL functions readfile() and writefile() for
reading and writing content from files on disk.  The fileio.c
extension also includes fsdir() table-valued function for listing
the contents of a directory and the lsmode() function for converting
numeric st_mode integers from the stat() system call into human-readable
strings after the fashion of the "ls -l" command.


sqlar.c &mdash;
This extension adds the sqlar_compress() and sqlar_uncompress()
functions that are needed to compress and uncompress file content
as it is inserted and extracted from an SQLite Archive.


zipfile.c &mdash;
This extension implements the "zipfile(FILE)" table-valued function
which is used to read ZIP archives.  This extension is only needed
when reading ZIP archives instead of SQLite archives.


appendvfs.c &mdash;
This extension implements a new VFS that allows an SQLite database
to be appended to some other file, such as an executable.  This
extension is only needed if the --append option to the .archive
command is used.




16. SQL Parameters

SQLite allows bound parameters to appear in an SQL statement anywhere
that a literal value is allowed.  The values for these parameters are set
using the sqlite3_bind_...() family of APIs.

Parameters can be either named or unnamed.  An unnamed parameter is a single
question mark ("?").  Named parameters are a "?" followed immediately by a number
(ex: "?15" or "?123") or one of the characters "$", ":", or "@" followed by an
alphanumeric name (ex: "$var1", ":xyz", "@bingo").

This command-line shell leaves unnamed parameters unbound, meaning that they
will have a value of an SQL NULL, but named parameters might be assigned values.
If there exists a TEMP table named "sqlite_parameters" with a schema like this:

CREATE TEMP TABLE sqlite_para¯meters(
  key TEXT PRIMARY KEY,
  value
) WITHOUT ROWID;


And if there is an entry in that table where the key column exactly matches
the name of parameter (including the initial "?", "$", ":", or "@" character)
then the parameter is assigned the value of the value column.  If no entry exists,
the parameter defaults to NULL.

The ".parameter" command exists to simplify managing this table.  The
".parameter init" command (often abbreviated as just ".param init") creates
the temp.sqlite_parameters table if it does not already exist.  The ".param list"
command shows all entries in the temp.sqlite_parameters table.  The ".param clear"
command drops the temp.sqlite_parameters table.  The ".param set KEY VALUE" and
".param unset KEY" commands create or delete entries from the 
temp.sqlite_parameters table.

The VALUE passed to ".param set KEY VALUE" can be either a SQL literal
or any other SQL expression or query which can be evaluated to yield a value.
This allows values of differing types to be set.
If such evaluation fails, the provided VALUE is instead quoted and inserted
as text.
Because such initial evaluation may or may not fail depending upon
the VALUE content, the reliable way to get a text value is to enclose it
with single-quotes protected from the above-described command-tail parsing.
For example, (unless one intends a value of -1365):
.parameter init
.parameter set @phoneNumber "'202-456-1111'"

Note that the double-quotes serve to protect the single-quotes
and ensure that the quoted text is parsed as one argument.

The temp.sqlite_parameters table only provides values for parameters in the
command-line shell.  The temp.sqlite_parameter table has no effect on queries
that are run directly using the SQLite C-language API.  Individual applications
are expected to implement their own parameter binding.  You can search for 
"sqlite_parameters" in the 
command-line shell source code
to see how the command-line shell does parameter binding, and use that as
a hint for how to implement it yourself.



17. Index Recommendations (SQLite Expert)

Note: This command is experimental. It may be removed or the 
interface modified in incompatible ways at some point in the future.

For most non-trivial SQL databases, the key to performance is creating
the right SQL indexes. In this context "the right SQL indexes" means those
that cause the queries that an application needs to optimize run fast. The
".expert" command can assist with this by proposing indexes that might
assist with specific queries, were they present in the database.

The ".expert" command is issued first, followed by the SQL query 
on a separate line. For example, consider the following session:

sqlite&gt; CREATE TABLE x1(a, b, c);                  -- Create table in database 
sqlite&gt; .expert
sqlite&gt; SELECT * FROM x1 WHERE a=? AND b&gt;?;        -- Analyze this SELECT 
CREATE INDEX x1_idx_000123a7 ON x1(a, b);

0|0|0|SEARCH TABLE x1 USING INDEX x1_idx_000123a7 (a=? AND b&gt;?)

sqlite&gt; CREATE INDEX x1ab ON x1(a, b);             -- Create the recommended index 
sqlite&gt; .expert
sqlite&gt; SELECT * FROM x1 WHERE a=? AND b&gt;?;        -- Re-analyze the same SELECT 
(no new indexes)

0|0|0|SEARCH TABLE x1 USING INDEX x1ab (a=? AND b&gt;?)


In the above, the user creates the database schema (a single table - "x1"),
and then uses the ".expert" command to analyze a query, in this case 
"SELECT * FROM x1 WHERE a=? AND b&gt;?". The shell tool recommends that the
user create a new index (index "x1_idx_000123a7") and outputs the plan
that the query would use in EXPLAIN QUERY PLAN format. The user then creates
an index with an equivalent schema and runs the analysis on the same query
again. This time the shell tool does not recommend any new indexes, and 
outputs the plan that SQLite will use for the query given the existing 
indexes.

The ".expert" command accepts the following options:


 Option  Purpose
 &#8209;&#8209;verbose
     If present, output a more verbose report for each query analyzed.
 &#8209;&#8209;sample&nbsp;PERCENT 
     This parameter defa°ults to 0, causing the ".expert" command to
         recommend indexes based on the query and database schema alone.
         This is similar to the way the SQLite query planner selects
         indexes for queries if the user has not run the ANALYZE command
         on the database to generate data distribution statistics. 
         
         If this option is passed a non-zero argument, the ".expert" command
         generates similar data distribution statistics for all indexes
         considered based on PERCENT percent of the rows currently stored in
         each database table. For databases with unusual data distributions,
         this may lead to better index recommendations, particularly if the
         application intends to run ANALYZE.
         
         For small databases and modern CPUs, there is usually no reason not
         to pass "--sample 100". However, gathering data distribution
         statistics can be expensive for large database tables. If the
         operation is too slow, try passing a smaller value for the --sample
         option.


The functionality described in this section may be integrated into other
applications or tools using the 

SQLite expert extension code.

A database schema which incorporate SQL custom functions made available
via the extension load mechanism may need special provision to work with
the .expert feature. Because the feature uses additional connections to
implement its functionality, those custom functions must be made available
to those additional connections. This can be done by means of the extension
load/usage options described at 

Automatically Load Statically Linked Extensions
and 
Persistent Loadable Extensions.



18. Working With Multiple Database Connections


Beginning with version 3.37.0 (2021-11-27), the CLI has the ability to
hold multiple database connections open at once.  Only one database connection
is active at a time.  The inactive connections are still open but are idle.


Use the ".connection" dot-command (often abbreviated as just ".conn") to see a
list of database connections and an indication of which one is currently active.
Each database connection is identified by an integer between 0 and 9.  (There
can be at most 10 simultaneously open connections.)  Change to another database
connection, creating it if it does not already exist, by typing the ".conn"
command followed by its number.  Close a database connection by typing
".conn close N" where N is the connection number.


Though the underlying SQLite database connections are completely independent
of one another, many of the CLI settings, such as the output format, are
shared across all database connections.  Thus, changing the output mode in
one connection will change it in them all.  On the other hand, some
dot-commands such as .open only affect the current connection.



19. Miscellaneous Extension Features


The CLI is built with several SQLite extensions that are not
included with the SQLite library. A few add features
not described in the preceding sections, namely:

the UINT collating sequence which treats
unsigned integers embedded in text according to
their value, along with other text, for ordering;
decimal arithmetic as provided by the decimal extension;
the generate_series() table-valued function; and
support for POSIX extended regular expressions
bound to the REGEXP operator.




20. Other Dot Commands

There are many other dot-commands available in the command-line
shell.  See the ".help" command for a complete list for any particular
version and build of SQLite.



21. Using sqlite3 in a shell script


One way to use sqlite3 in a shell script is to use "echo" or
"cat" to generate a sequence of commands in a file, then invoke sqlite3
while redirecting input from the generated command file.  This
works fine and is appropriate in many circumstances.  But as
an added convenience, sqlite3 allows a single SQL command to be
entered on the command line as a second argument after the
database name.  When the sqlite3 program is launched with two
arguments, the second argu±ment is passed to the SQLite library
for processing, the query results are printed on standard output
in list mode, and the program exits.  This mechanism is designed
to make sqlite3 easy to use in conjunction with programs like
"awk".  For example:

$ sqlite3 ex1 'select * from tbl1' \
&gt;  | awk '{printf "&lt;tr&gt;&lt;td&gt;%s&lt;td&gt;%s\n",$1,$2 }'
&lt;tr&gt;&lt;td&gt;hello&lt;td&gt;10
&lt;tr&gt;&lt;td&gt;goodbye&lt;td&gt;20
$




22. Marking The End Of An SQL Statement


SQLite commands are normally terminated by a semicolon.  In the CLI
you can also use the word "GO" (case-insensitive) or a slash character 
"/" on a line by itself to end a command.  These are used by SQL Server 
and Oracle, respectively, and are supported by the SQLite CLI for
compatibility.  These won't work in sqlite3_exec(), 
because the CLI translates these inputs into a semicolon before passing 
them down into the SQLite core.



23. Command-line Options


There are many command-line options available to the CLI.  Use the --help
command-line option to see a list:

$ sqlite3 --help
Usage: ./sqlite3 &#91;OPTIONS&#93; FILENAME &#91;SQL&#93;
FILENAME is the name of an SQLite database. A new database is created
if the file does not previously exist.
OPTIONS include:
   -A ARGS...           run ".archive ARGS" and exit
   -append              append the database to the end of the file
   -ascii               set output mode to 'ascii'
   -bail                stop after hitting an error
   -batch               force batch I/O
   -box                 set output mode to 'box'
   -column              set output mode to 'column'
   -cmd COMMAND         run "COMMAND" before reading stdin
   -csv                 set output mode to 'csv'
   -deserialize         open the database using sqlite3_deserialize()
   -echo                print commands before execution
   -init FILENAME       read/process named file
   -&#91;no&#93;header          turn headers on or off
   -help                show this message
   -html                set output mode to HTML
   -interactive         force interactive I/O
   -json                set output mode to 'json'
   -line                set output mode to 'line'
   -list                set output mode to 'list'
   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory
   -markdown            set output mode to 'markdown'
   -maxsize N           maximum size for a --deserialize database
   -memtrace            trace all memory allocations and deallocations
   -mmap N              default mmap size set to N
   -newline SEP         set output row separator. Default: '\n'
   -nofollow            refuse to open symbolic links to database files
   -nonce STRING        set the safe-mode escape nonce
   -nullvalue TEXT      set text string for NULL values. Default ''
   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory
   -quote               set output mode to 'quote'
   -readonly            open the database read-only
   -safe                enable safe-mode
   -separator SEP       set output column separator. Default: '|'
   -stats               print memory stats before each finalize
   -table               set output mode to 'table'
   -tabs                set output mode to 'tabs'
   -version             show SQLite version
   -vfs NAME            use NAME as the default VFS
   -zip                 open the file as a ZIP Archive


The CLI is flexible regarding command-line option formatting.
Either one or two leading "-" characters are permitted.
Thus "-box" and "--box" mean the same thing.
Command-line options are processed from left to right.
Hence a "--box" option will override a prior "--quote" option.


Most of the command-line options are self-explanatory, but a few merit additional
discussion below.



23.1. The --safe command-line option

The --safe command-line option attempts to disable all features of the CLI that
might cause any changes to the host computer other than changes to the specific database
file named on the command-line.  The idea is that if you receive a large SQL script
from an unknown or untrusted source, you can run that script to see what it does without
risking an exploit by using the --safe option.  The --safe option disables (among other
things):


 The .open command, unless the --hexdb option is used or the filename is ":memory:".
     This prevents the script from reading or writing any database files not named on
     the original command-line.
 The ATTACH SQL command.
 SQL functions that have potentially harmful side-effects, such as
     edit(), fts3_tokenizer(), load_extension(), readfile() and writefile().
 The .archive command.
 The .backup and .save commands.
 The .import command.
 The .load command.
 The .log command.
 The .shell and .system commands.
 The .excel, .once and .output commands.
 Other commands that can have deleterious side effects.



Basically, any feature of the CLI that reads or writes from a file on disk other
than the main database file is disabled.

23.1.1. Bypassing --safe restrictions for specific commands

If the "--nonce NONCE" option is also included on the command-line, for some
large and arbitrary NONCE string, then the ".nonce NONCE" command (with the
same large nonce string) will permit the next SQL statement or dot-command
to bypass the --safe restrictions.

Suppose you want to run a suspicious script and the script requires one or
two of the features that --safe normally disables.  For example, suppose it
needs to ATTACH one additional database.  Or suppose the script needs to load
a specific extension. This can be accomplished by preceding the (carefully
audited) ATTACH statement or the ".load" command with an appropriate ".nonce"
command and supplying the same nonce value using the "--nonce" command-line
option.  Those specific commands will then be allowed to execute normally,
but all other unsafe commands will still be restricted.

The use of ".nonce" is dangerous in the sense that a mistake can allow a
hostile script to damage your system.  Therefore, use ".nonce" carefully,
sparingly, and as a last resort when there are no other ways to get a
script to run under --safe mode.



24. Compiling the sqlite3 program from sources


To compile the command-line shell on unix systems and on Windows with MinGW,
the usual configure-make command works:

sh configure; make



The configure-make works whether you are building from the canonical sources
from the source tree, or from an amalgamated bundle.  There are few
dependencies.  When building from canonical sources, a working 
tclsh is required.
If using an amalgamation bundle, all the preprocessing work normally 
done by tclsh will have already been carried out and only normal build
tools are required.


A working zlib compression library is
needed in order for the .archive command to operate.


On Windows with MSVC, use nmake with the Makefile.msc:

nmake /f Makefile.msc



For correct operation of the .archive command, make a copy of the
zlib source code into the compat/zlib subdirectory 
of the source tree and compile this way:

nmake /f Makefile.msc USE_ZLIB=1


24.1.  Do-It-Yourself Builds 


The source code to the sqlite3 command line interface is in a single
file named "shell.c".  The shell.c source file is generated from other
sources, but most of the code for shell.c can be found in
src/shell.c.in.
(Regenerate shell.c by typing "make shell.c" from the canonical source tree.)
Compile the shell.c file (together
with the sqlite3 library source code) to generate
the executable.  For example:

gcc -o sqlite3 shell.c sqlite3.c -ldl -lpthread -lz -lm



The following additional compile-time options are recommended in order to
provide a full-featured command-line shell:


 -DSQLITE_THREADSAFE=0
 -DSQLITE_ENABLE_EXPLAIN_COMMENTS
 -DSQLITE_HAVE_ZLIB
 -DSQLITE_INTROSPECTION_PRAGMAS
 -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
 -DSQLITE_ENABLE_STMTVTAB
 -DSQLITE_ENABLE_DBPAGE_VTAB
 -DSQLITE_ENABLE_DBSTAT_VTAB
 -DSQLITE_ENABLE_OFFSET_SQL_FUNC
 -DSQLITE_ENABLE_JSON1
 -DSQLITE_ENABLE_RTREE
 -DSQLITE_ENABLE_FTS4
 -DSQLITE_ENABLE_FTS5

This page last modified on  2022-12-27 16:51:24 UTCcli.html
\\„œ[ƒ
Gˆ¸eCommand Line Shell For SQLite1. Getting Started

The SQLite project provides a simple command-line program named
sqlite3 (or sqlite3.exe on Windows)
that allows the user to manually enter and execute SQL
statements against an SQLite database or against a
ZIP archive.  This document provides a brief
introduction on how to use the sqlite3 program.

Start the sqlite3 program by typing "sqlite3" at the
command prompt, optionally followed 
by the name of the file that holds the SQLite database
(or ZIP archive).  If the named
file does not exist, a new database file with the given name will be
created automatically.  If no database file is specified on the
command-line, a temporary database is created and automatically deleted when 
the "sqlite3" program exits.

On startup, the sqlite3 program will show a brief banner
message then prompt you to enter SQL.  Type in SQL statements (terminated
by a semicolon), press "Enter" and the SQL will be executed.

For example, to create a new SQLite database named "ex1" 
with a single table named "tbl1", you might do this:

$ sqlite3 ex1
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
sqlite&gt; create table tbl1(one text, two int);
sqlite&gt; insert into tbl1 values('hello!',10);
sqlite&gt; insert into tbl1 values('goodbye', 20);
sqlite&gt; select * from tbl1;
hello!|10
goodbye|20
sqlite&gt;


Terminate the sqlite3 program by typing your system
End-Of-File character (usually a Control-D).  Use the interrupt
character (usually a Control-C) to stop a long-running SQL statement.

Make sure you type a semicolon at the end of each SQL command!
The sqlite3 program looks for a semicolon to know when your SQL command is
complete.  If you omit the semicolon, sqlite3 will give you a
continuation prompt and wait for you to enter more text to 
complete the SQL command.  This feature allows you to
enter SQL commands that span multiple lines.  For example:


sqlite&gt; CREATE TABLE tbl2 (
   ...&gt;   f1 varchar(30) primary key,
   ...&gt;   f2 text,
   ...&gt;   f3 real
   ...&gt; );
sqlite&gt;




2. Double-click Startup On Windows

Windows users can double-click on the sqlite3.exe icon to cause
the command-line shell to pop-up a terminal window running SQLite.  However,
because double-clicking starts the sqlite3.exe without command-line arguments,
no database file will have been specified, so SQLite will use a temporary
database that is deleted when the session exits.
To use a persistent disk file as the database, enter the ".open" command
immediately after the terminal window starts up:

SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite&gt; .open ex1.db
sqlite&gt;


The example above causes the database file named "ex1.db" to be opened
and used.  The "ex1.db" file is created if it does not previously exist.
You might want to
use a full pathname to ensure that the file is in the directory that you
think it is in.  Use forward-slashes as the directory separator character.
In other words use "c:/work/ex1.db", not "c:\work\ex1.db".

Alternatively, you can create a new database using the default temporary
storage, then save that database into a disk file using the ".save" command:

SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite&gt; ... many SQL commands omitted ...
sqlite&gt; .save ex1.db
sqlite&gt;


Be careful when using the ".save" command as it will overwrite any
preexisting database files having the same name without prompting for
confirmation.  As wit¢erm support


SQLite is an in-process library that implements a
self-contained, 
serverless,
zero-configuration,
transactional
SQL database engine.
The code for SQLite is in the
public domain and is thus free for
use for any purpose, commercial or private.
SQLite is the most widely deployed database in the world
with more applications than we can
count, including several high-profile projects.

SQLite is an embedded SQL database engine.
Unlike most other SQL databases, SQLite does not have a separate
server process.  SQLite reads and writes directly to ordinary disk
files.  A complete SQL database with multiple tables, indices,
triggers, and views, is contained in a single disk file.
The database file format is cross-platform - you can freely copy a database
between 32-bit and 64-bit systems or between 
big-endian and
little-endian
architectures.  These features make SQLite a popular choice as
an Application File Format.  SQLite database files are a
recommended storage format by the US Library of Congress.
Think of SQLite not as a replacement for 
Oracle but
as a replacement for fopen()

SQLite is a compact library.
With all features enabled, the library size can be less than 750KiB,
depending on the target platform and compiler optimization settings.
(64-bit code is larger.  And some compiler optimizations
such as aggressive function inlining and loop unrolling can cause the
object code to be much larger.)
There is a tradeoff between memory usage and speed.  
SQLite generally runs faster the more memory
you give it.  Nevertheless, performance is usually quite good even
in low-memory environments.  Depending on how it is used, SQLite can be
faster than direct filesystem I/O.

SQLite is 
very carefully tested prior to every
release and has a reputation for being very reliable.
Most of the SQLite source code is devoted purely to testing and
verification.  An automated test suite runs millions and millions of
test cases involving hundreds of millions of individual SQL statements
and achieves 100% branch test coverage.  
SQLite responds gracefully to memory
allocation failures and disk I/O errors.  Transactions are
ACID
even if interrupted by system crashes or power failures.  
All of this is verified by
the automated tests using special test harnesses which simulate 
system failures.
Of course, even with all this testing, there are still bugs.
But unlike some similar projects (especially commercial competitors)
SQLite is open and honest about all bugs and provides
bugs lists and
minute-by-minute 
chronologies of code changes.

The SQLite code base is supported by an
international team of developers who work on
SQLite full-time.
The developers continue to expand the capabilities of SQLite
and enhance its reliability and performance while maintaining
backwards compatibility with the 
published interface spec,
SQL syntax, and database file format.
The source code is absolutely free to anybody who wants it,
but professional support is also available.

The SQLite project was started on 
2000-05-09.
The future is always hard to predict, but the intent of the developers
is to support SQLite through the year 2050.  Design decisions are made
with that objective in mind.

We the developers hope that you find SQLite useful and we
entreat you to use it well: to make good and beautiful products that
are fast, reliable, and simple to use.  Seek forgiveness for yourself
as you forgive others.  And just as you have received SQLite for free,
so also freely give, paying the debt forward.
This page last modified on  2021-10-06 14:45:14 UTCabout.html
!
L
!‚¿dƒ
S„þe#Dynamic Memory Allocation In SQLiteOverview 

SQLite uses dynamic memory allocation to obtain
memory for storing various objects
(ex: database connections and prepared statements) and to build
a memory cache of the database file and to hold the results of queries.
Much effort has gone into making the dynamic memory allocation subsystem
of SQLite reliable, predictable, robust, secure, and efficient.

This document provides an overview of dynamic memory allocation within 
SQLi¹† ƒ
I‚‹[/35% Faster Than The Filesystem1. Summary

SQLite reads and writes small blobs (for example, thumbnail images)
35% faster&sup1; than the same blobs
can be read from or written to individual files on disk using
fread() or fwrite().

Furthermore, a single SQLite database holding
10-kilobyte blobs uses about 20% less disk space than
storing the blobs in individual files.

The performance difference arises (we believe) because when
working from an SQLite database, the open() and close() system calls
are invoked only once, whereas
open() and close() are invoked once for each blob
when using blobs stored in individual files.  It appears that the
overhead of calling open() and close() is greater than the overhead
of using the database.  The size reduction arises from the fact that
individual files are pµ?ƒ  3‚CJavascript RequiredNote:
The hyperlinks on the download page only work if you have Javascript
enabled in your web browser.
This page last modified on  2013-08-29 16:19:32 UTChp1.htmlŸrƒ %¿3!About SQLiteAbout SQLite


Executive Summary

 Full-featured SQL
 Billions and billions of deployments
 Single-file database
 Public domain source code
 All source code in one file (sqlite3.c)
 Small footprint
 Max DB size: 281 terabytes
     (248 bytes)
 Max row size: 1 gigabyte
 Faster than direct file I/O
 Aviation-grade quality and testing
 Zero-configuration
 ACID transactions, even after power loss
 Stable, enduring file format
 Extensive, detailed documentation
 Long-t³¶added out to the next multiple of the filesystem
block size, whereas the blobs are packed more tightly into an SQLite
database.


The measurements in this article were made during the week of 2017-06-05
using a version of SQLite in between 3.19.2 and 3.20.0.  You may expect
future versions of SQLite to perform even better.

1.1. Caveats



&sup1;The 35% figure above is approximate.  Actual timings vary
depending on hardware, operating system, and the
details of the experiment, and due to random performance fluctuations
on real-world hardware.  See the text below for more detail.
Try the experiments yourself.  Report significant deviations on
the SQLite forum.



The 35% figure is based on running tests on every machine
that the author has easily at hand.
Some reviewers of this article report that SQLite has higher 
latency than direct I/O on their systems.  We do not yet understand
the difference.  We also see indications that SQLite does not
perform as well as direct I/O when experiments are run using
a cold filesystem cache.


So let your take-away be this: read/write latency for
SQLite is competitive with read/write latency of individual files on
disk.  Often SQLite is faster.  Sometimes SQLite is almost
as fast.  Either way, this article disproves the common
assumption that a relational database must be slower than direct
filesystem I/O.

1.2. Related Studies


Jim Gray
and others studied the read performance of BLOBs
versus file I/O for Microsoft SQL Server and found that reading BLOBs 
out of the 
database was faster for BLOB sizes less than between 250KiB and 1MiB.
(Paper).
In that study, the database still stores the filename of the content even
if the content is held in a separate file.  So the database is consulted
for every BLOB, even if it is only to extract the filename.  In this
article, the key for the BLOB is the filename, so no preliminary database
access is required.  Because the database is never used at all when
reading content from individual files in this article, the threshold
at which direct file I/O becomes faster is smaller than it is in Gray's
paper.


The Internal Versus External BLOBs article on this website is an
earlier investigation (circa 2011) that uses the same approach as the
Jim Gray paper &mdash; storing the blob filenames as entries in the
database &mdash; but for SQLite instead of SQL Server.



2. How These Measurements Are Made

I/O performance is measured using the
kvtest.c program
from the SQLite source tree.
To compile this test program, first gather the kvtest.c source file
into a directory with the SQLite amalgamation source
files "sqlite3.c" and "sqlite3.h".  Then on unix, run a command like
the following:

gcc -Os -I. -DSQLITE_DIRECT_OVERFLOW_READ &#92;
  kvtest.c sqlite3.c -o kvtest -ldl -lpthread


Or on Windows with MSVC:

cl -I. -DSQLITE_DIRECT_OVERFLOW_READ kvtest.c sqlite3.c


Instructions for compiling for Android
are shown below.


Use the resulting "kvtest" program to
generate a test database with 100,000 random uncompressible
blobs, each with a random
size between 8,000 and 12,000 bytes
using a command like this:

./kvtest init test1.db --count 100k --size 10k --variance 2k



If desired, you can verify the new database by running this command:

./kvtest stat test1.db



Next, make copies of all the blobs into individual files in a directory
using a command like this:

./kvtest export test1.db test1.dir



At this point, you can measure the amount of disk space used by
the test1.db database and the space used by the test1.dir directory
and all of its content.  On a standard Ubuntu Linux desktop, the
database file will be 1,024,512,000 bytes in size and the test1.dir
directory will use 1,228,800,000 bytes of space (according to "du -k"),
about 20% more than the database.


The "test1.dir" directory created above puts all the blobs into a single
folder.  It was conjectured that some operating systems would perform 
poorly when a single directory contains 100,000 objects.  To test this,
the kvtest program can also store the blobs in a hierarchy of folders with n·o
more than 100 files and/or subdirectories per folder.  The alternative
on-disk representation of the blobs can be created using the --tree
command-line option to the "export" command, like this:

./kvtest export test1.db test1.tree --tree



The test1.dir directory will contain 100,000 files
with names like "000000", "000001", "000002" and so forth but the
test1.tree directory will contain the same files in subdirectories like
"00/00/00", "00/00/01", and so on.  The test1.dir and test1.test
directories take up approximately the same amount of space, though
test1.test is very slightly larger due to the extra directory entries.


All of the experiments that follow operate the same with either 
"test1.dir" or "test1.tree".  Very little performance difference is
measured in either case, regardless of operating system.


Measure the performance for reading blobs from the database and from
individual files using these commands:

./kvtest run test1.db --count 100k --blob-api
./kvtest run test1.dir --count 100k --blob-api
./kvtest run test1.tree --count 100k --blob-api



Depending on your hardware and operating system, you should see that reads 
from the test1.db database file are about 35% faster than reads from 
individual files in the test1.dir or test1.tree folders.  Results can vary
significantly from one run to the next due to caching, so it is advisable
to run tests multiple times and take an average or a worst case or a best
case, depending on your requirements.

The --blob-api option on the database read test causes kvtest to use
the sqlite3_blob_read() feature of SQLite to load the content of the
blobs, rather than running pure SQL statements.  This helps SQLite to run
a little faster on read tests.  You can omit that option to compare the
performance of SQLite running SQL statements.
In that case, the SQLite still out-performs direct reads, though
by not as much as when using sqlite3_blob_read().
The --blob-api option is ignored for tests that read from individual disk
files.


Measure write performance by adding the --update option.  This causes
the blobs are overwritten in place with another random blob of
exactly the same size.

./kvtest run test1.db --count 100k --update
./kvtest run test1.dir --count 100k --update
./kvtest run test1.tree --count 100k --update



The writing test above is not completely fair, since SQLite is doing
power-safe transactions whereas the direct-to-disk writing is not.
To put the tests on a more equal footing, add either the --nosync
option to the SQLite writes to disable calling fsync() or
FlushFileBuffers() to force content to disk, or using the --fsync option
for the direct-to-disk tests to force them to invoke fsync() or
FlushFileBuffers() when updating disk files.


By default, kvtest runs the database I/O measurements all within
a single transaction.  Use the --multitrans option to run each blob
read or write in a separate transaction.  The --multitrans option makes
SQLite much slower, and uncompetitive with direct disk I/O.  This
option proves, yet again, that to get the most performance out of
SQLite, you should group as much database interaction as possible within
a single transaction.


There are many other testing options, which can be seen by running
the command:

./kvtest help


2.1. Read Performance Measurements

The chart below shows data collected using 
kvtest.c on five different
systems:


Win7: A circa-2009 Dell Inspiron laptop, Pentium dual-core
    at 2.30GHz, 4GiB RAM, Windows7.
Win10: A 2016 Lenovo YOGA 910, Intel i7-7500 at 2.70GHz,
    16GiB RAM, Windows10.
Mac: A 2015 MacBook Pro, 3.1GHz intel Core i7, 16GiB RAM,
    MacOS 10.12.5
Ubuntu: Desktop built from Intel i7-4770K at 3.50GHz, 32GiB RAM,
    Ubuntu 16.04.2 LTS
Android: Galaxy S3, ARMv7, 2GiB RAM


All machines use SSD except Win7 which has a
hard-drive. The test database is 100K blobs with sizes uniformly
distributed between 8K and 12K, for a total of about 1 gigabyte
of content.  The database page size
is 4KiB.  The -DSQLITE_DIRECT_OVERFLOW_READ compile-time option was
used for all of these tests¸.
Tests were run multiple times.
The first run was used to warm up the cache and its timings were discarded.


The chart below shows average time to read a blob directly from the
filesystem versus the time needed to read the same blob from the SQLite 
database.
The actual timings vary considerably from one system to another 
(the Ubuntu desktop is much
faster than the Galaxy S3 phone, for example).  
This chart shows the ratio of the
times needed to read blobs from a file divided by the time needed to
from the database.  The left-most column in the chart is the normalized
time to read from the database, for reference.


In this chart, an SQL statement ("SELECT v FROM kv WHERE k=?1") 
is prepared once.  Then for each blob, the blob key value is bound 
to the ?1 parameter and the statement is evaluated to extract the
blob content.


The chart shows that on Windows10, content can be read from the SQLite
database about 5 times faster than it can be read directly from disk.
On Android, SQLite is only about 35% faster than reading from disk.






Chart 1:  SQLite read latency relative to direct filesystem reads.
100K blobs, avg 10KB each, random order using SQL



The performance can be improved slightly by bypassing the SQL layer
and reading the blob content directly using the
sqlite3_blob_read() interface, as shown in the next chart:






Chart 2:  SQLite read latency relative to direct filesystem reads.
100K blobs, avg size 10KB, random order
using sqlite3_blob_read().



Further performance improves can be made by using the
memory-mapped I/O feature of SQLite.  In the next chart, the
entire 1GB database file is memory mapped and blobs are read
(in random order) using the sqlite3_blob_read() interface.
With these optimizations, SQLite is twice as fast as Android
or MacOS-X and over 10 times faster than Windows.






Chart 3:  SQLite read latency relative to direct filesystem reads.
100K blobs, avg size 10KB, random order
using sqlite3_blob_read() from a memory-mapped database.



The third chart shows that reading blob content out of SQLite can be
twice as fast as reading from individual files on disk for Mac and
Android, and an amazing ten times faster for Windows.

2.2. Write Performance Measurements


Writes are slower.
On all systems, using both direct I/O and SQLite, write performance is
between 5 and 15 times slower than reads.


Write performance measurements were made by replacing (overwriting)
an entire blob with a different blob.  All of the blobs in these
experiment are random and incompressible.  Because writes are so much
slower than reads, only 10,000 of the 100,000 blobs in the database
are replaced.  The blobs to be replaced are selected at random and
are in no particular order.


The direct-to-disk writes are accomplished using fopen()/fwrite()/fclose().
By default, and in all the results shown below, the OS filesystem buffers are
never flushed to persistent storage using fsync() or
FlushFileBuffers().  In other words, there is no attempt to make the
direct-to-disk writes transactional or power-safe.
We found that invoking fsync() or FlushFileBuffers() on each file
written causes direct-to-disk storage
to be about 10 times or more slower than writes to SQLite.


The next chart compares SQLite database updates in WAL mode
against raw direct-to-disk overwrites of separate files on disk.
The PRAGMA synchronous setting is NORMAL.
All database writes are in a single transaction.
The timer for the database writes is stopped after the transaction
commits, but before a checkpoint is run.
Note that the SQLite writes, unlike the direct-to-disk writes,
are transactional and power-safe, though because the synchronous
setting is NORMAL instead of FULL, the transactions are not durable.






Chart 4:  SQLite write latency relative to direct filesystem writes.
10K blobs, avg size 10KB, random order,
WAL mode with synchronous NORMAL,
exclusive of checkpoint time



The android performance numbers for the write experiments are omitted
because the performance tests on the Galaxy S3 are so random.  Two
consecutive runs of the exact same experiment would give wildly different
times.  And, to be fair, the performance of SQLite on android is slightly
slower than writing directly to disk.


The next chart shows the performance of SQLite versus direct-to-disk
when transactions are disabled (PRAGMA journal_mode=OFF)
and PRAGMA synchronous is set to OFF.  These settings put SQLite on an
equal footing with direct-to-disk writes, which is to say they make the
data prone to corruption due to system crashes and power failures.






Chart 5:  SQLite write latency relative to direct filesystem writes.
10K blobs, avg size 10KB, random order,
journaling disabled, synchronous OFF.



In all of the write tests, it is important to disable anti-virus software
prior to running the direct-to-disk performance tests.  We found that
anti-virus software slows down direct-to-disk by an order of magnitude
whereas it impacts SQLite writes very little.  This is probably due to the
fact that direct-to-disk changes thousands of separate files which all need
to be checked by anti-virus, whereas SQLite writes only changes the single
database file.

2.3. Variations

The -DSQLITE_DIRECT_OVERFLOW_READ compile-time option causes SQLite
to bypass its page cache when reading content from overflow pages.  This
helps database reads of 10K blobs run a little faster, but not all that much
faster.  SQLite still holds a speed advantage over direct filesystem reads
without the SQLITE_DIRECT_OVERFLOW_READ compile-time option.

Other compile-time options such as using -O3 instead of -Os or
using -DSQLITE_THREADSAFE=0 and/or some of the other
recommended compile-time options might help SQLite to run even faster
relative to direct filesystem reads.

The size of the blobs in the test data affects performance.
The filesystem will generally be faster for larger blobs, since
the overhead of open() and close() is amortized over more bytes of I/O,
whereas the database will be more efficient in both speed and space
as the average blob size decreases.


3. General Findings



SQLite is competitive with, and usually faster than, blobs stored in
separate files on disk, for both reading and writing.


SQLite is much faster than direct writes to disk on Windows
when anti-virus protection is turned on.  Since anti-virus software
is and should be on by default in Windows, that means that SQLite
is generally much faster than direct disk writes on Windows.


Reading is about an order of magnitude faster than writing, for all
systems and for both SQLite and direct-to-disk I/O.


I/O performance varies widely depending on operating system and hardware.
Make your own measurements before drawing conclusions.


Some other SQL database engines advise developers to store blobs in separate
files and then store the filename in the database.  In that case, where
the database must first be consulted to find the filename before opening
and reading the file, simply storing the entire blob in the database
gives much faster read and write performance with SQLite.
See the Internal Versus External BLOBs article for more information.



4. Additional Notes


4.1. Compiling And Testing on Android


The kvtest program is compiled and run on Android as follows.
First install the Android SDK and NDK.  Then prepare a script
named "android-gcc" that looks approximately like this:

#!/bin/sh
#
NDK=/home/drh/Android/Sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-16/arch-arm
ABIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
GCC=$ABIN/arm-linux-androideabi-gcc
$GCC --sysroot=$SYSROOT -fPIC -pie $*


Make that script executable and put it on your $PATH.  Then
compile the kvtest program as follows:

android-gcc -Os -I. kvtest.c sqlite3.c -o kvtest-android


Next, move the resulting kvtest-android executable to the Android
device:

adb push kvtest-android /data/local/tmp


Finally use "adb shell" to get a shell prompt on the Android device,
cd into the /data/local/tmp directory, and begin running the tests
as with any other unix host.
This page last modified on  2021-03-01 12:55:48 UTCfasterthanfs.htmlºte.  The target audience is software engineers who are tuning their
use of SQLite for peak performance in demanding environments.
Nothing in this document is required knowledge for using SQLite.  The
default settings and configuration for SQLite will work well in most
applications.  However, the information contained in this document may
be useful to engineers who are tuning SQLite to comply with special
requirements or to run under unusual circumstances.


1.  Features

The SQLite core and its memory allocation subsystem provides the 
following capabilities:



Robust against allocation failures.
If a memory allocation ever fails (that is to say, 
if malloc() or realloc() ever return NULL)
then SQLite will recover gracefully.   SQLite will first attempt
to free memory from unpinned cache pages then retry the allocation
request.  
Failing that, SQLite will either stop what
it is doing and return the
SQLITE_NOMEM error code back up to the application or it will
make do without the requested memory.



No memory leaks.
The application is responsible for destroying any objects it allocates.
(For example, the application must use sqlite3_finalize() on 
every prepared statement and sqlite3_close() on every 
database connection.)   But as long as
the application cooperates, SQLite will never leak memory.  This is
true even in the face of memory allocation failures or other system
errors.



Memory usage limits.
The sqlite3_soft_heap_limit64() mechanism allows the application to
set a memory usage limit that SQLite strives to stay below.  SQLite
will attempt to reuse memory from its caches rather than allocating new
memory as it approaches the soft limit.



Zero-malloc option.
The application can optionally provide SQLite with several buffers of bulk memory
at startup and SQLite will then use those provided buffers for all of
its memory allocation needs and never call system malloc() or free().



Application-supplied memory allocators.
The application can provide SQLite with pointers to alternative 
memory allocators at start-time.  The alternative memory allocator
will be used in place of system malloc() and free().



Proof against breakdown and fragmentation.
SQLite can be configured so that, subject to certain usage constraints
detailed below, it is guaranteed to never fail a memory allocation
or fragment the heap.
This property is important to long-running, high-reliability
embedded systems where a memory allocation error could contribute
to an overall system failure.



Memory usage statistics.
Applications can see how much memory they are using and detect when
memory usage is approaching or exceeding design boundaries.




Plays well with memory debuggers.
Memory allocation in SQLite is structured so that standard
third-party memory debuggers (such as dmalloc or 
valgrind) can be used to verify correct
memory allocation behavior.


Minimal calls to the allocator.
The system malloc() and free() implementations are inefficient
on many systems.  SQLite strives to reduce overall processing time
by minimizing its use of malloc() and free().



Open access.
Pluggable SQLite extensions or even the application itself can 
access to the same underlying memory allocation
routines used by SQLite through the
sqlite3_malloc(), sqlite3_realloc(), and sqlite3_free() interfaces.





2.  Testing

Most of the code in the SQLite source tree is devoted purely to 
testing and verification.  Reliability is important to SQLite.
Among the tasks of the test infrastructure is to ensure that
SQLite does not misuse dynamically allocated memory, that SQLite
does not leak memory, and that SQLite responds
correctly to a dynamic memory allocation failure.

The test infrastructure verifies that SQLite does not misuse
dynamically allocated memory by using a specially instrumented
memory allocator.  The instrumented memory allocator is enabled
at compile-time using the SQLITE_MEMDEBUG option.  The instrumented
memory allocator is much slower than the default memory allocator and
so its use is not recommended in production.  But when
enabled during »testing, 
the instrumented memory allocator performs the following checks:


Bounds checking.
The instrumented memory allocator places sentinel values at both ends
of each memory allocation to verify that nothing within SQLite writes
outside the bounds of the allocation.

Use of memory after freeing.
When each block of memory is freed, every byte is overwritten with a
nonsense bit pattern.  This helps to ensure that no memory is ever
used after having been freed.

Freeing memory not obtained from malloc.
Each memory allocation from the instrumented memory allocator contains
sentinels used to verify that every allocation freed came
from prior malloc.

Uninitialized memory.
The instrumented memory allocator initializes each memory allocation
to a nonsense bit pattern to help ensure that the user makes no
assumptions about the content of allocation memory.


Regardless of whether or not the instrumented memory allocator is
used, SQLite keeps track of how much memory is currently checked out.
There are hundreds of test scripts used for testing SQLite.  At the
end of each script, all objects are destroyed and a test is made to
ensure that all  memory has been freed.  This is how memory
leaks are detected.  Notice that memory leak detection is in force at
all times, during test builds and during production builds.  Whenever
one of the developers runs any individual test script, memory leak
detection is active.  Hence memory leaks that do arise during development
are quickly detected and fixed.


The response of SQLite to out-of-memory (OOM) errors is tested using
a specialized memory allocator overlay that can simulate memory failures.
The overlay is a layer that is inserted in between the memory allocator
and the rest of SQLite.  The overlay passes most memory allocation
requests straight through to the underlying allocator and passes the
results back up to the requester.  But the overlay can be set to 
cause the Nth memory allocation to fail.  To run an OOM test, the overlay
is first set to fail on the first allocation attempt.  Then some test
script is run and verification that the allocation was correctly caught
and handled is made.  Then the overlay is set to fail on the second
allocation and the test repeats.  The failure point continues to advance
one allocation at a time until the entire test procedure runs to
completion without hitting a memory allocation error.  This whole
test sequence run twice.  On the first pass, the
overlay is set to fail only the Nth allocation.  On the second pass,
the overlay is set to fail the Nth and all subsequent allocations.

Note that the memory leak detection logic continues to work even
when the OOM overlay is being used.  This verifies that SQLite
does not leak memory even when it encounters memory allocation errors.
Note also that the OOM overlay can work with any underlying memory
allocator, including the instrumented memory allocator that checks
for memory allocation misuse.  In this way it is verified that 
OOM errors do not induce other kinds of memory usage errors.

Finally, we observe that the instrumented memory allocator and the
memory leak detector both work over the entire SQLite test suite and
the TCL test suite provides over 99% statement test coverage and that
the TH3 test harness provides 100% branch test coverage
with no leak leaks. This is
strong evidence that dynamic memory allocation is used correctly
everywhere within SQLite.


2.1.  Use of reallocarray()

The reallocarray() interface is a recent innovation (circa 2014)
from the OpenBSD community that grow out of efforts to prevent the
next "heartbleed" bug by avoiding 32-bit integer
arithmetic overflow on memory allocation size computations.  The
reallocarray() function has both unit-size and count parameters.
To allocate memory sufficient to hold an array of N elements each X-bytes
in size, one calls "reallocarray(0,X,N)".  This is preferred over
the traditional technique of invoking "malloc(X*N)" as reallocarray()
eliminates the risk that the X*N multiplication will overflow and
cause malloc() to return a b¼uffer that is a different size from what
the application expected.

SQLite does not use reallocarray().  The reason is that reallocarray()
is not useful to SQLite.  It turns out that SQLite never does memory
allocations that are the simple product of two integers.  Instead, SQLite
does allocations of the form "X+C" or "N*X+C" or "M*N*X+C" or
"N*X+M*Y+C", and so forth.  The reallocarray() interface is not helpful
in avoiding integer overflow in those cases.

Nevertheless, integer overflow in the computation of memory allocation
sizes is a concern that SQLite would like to deal with.  To prevent
problems, all SQLite internal memory allocations occur using thin wrapper
functions that take a signed 64-bit integer size parameter.  The SQLite 
source code is audited to ensure that all size computations are carried 
out using 64-bit signed integers as well.  SQLite will
refuse to allocate more than about 2GB of memory at one go.  (In common
use, SQLite seldom ever allocates more than about 8KB of memory at a time
so a 2GB allocation limit is not a burden.)  So the 64-bit size parameter
provides lots of headroom for detecting overflows.  The same audit that
verifies that all size computations are done as 64-bit signed integers
also verifies that it is impossible to overflow a 64-bit integer
during the computation.

The code audits used to ensure that memory allocation size computations
do not overflow in SQLite are repeated prior to every SQLite release.


3.  Configuration

The default memory allocation settings in SQLite are appropriate
for most applications.  However, applications with unusual or particularly
strict requirements may want to adjust the configuration to more closely
align SQLite to their needs.
Both compile-time and start-time configuration options are available.



3.1.  Alternative low-level memory allocators

The SQLite source code includes several different memory allocation
modules that can be selected at compile-time, or to a limited extent
at start-time.



3.1.1. The default memory allocator

By default, SQLite uses the malloc(), realloc(), and free() routines
from the standard C library for its memory allocation needs.  These routines
are surrounded by a thin wrapper that also provides a "memsize()" function
that will return the size of an existing allocation.  The memsize() function
is needed to keep an accurate count of the number of bytes of outstanding
memory; memsize() determines how many bytes to remove from the outstanding
count when an allocation is freed.  The default allocator implements
memsize() by always allocating 8 extra bytes on each malloc() request and
storing the size of the allocation in that 8-byte header.

The default memory allocator is recommended for most applications.
If you do not have a compelling need to use an alternative memory
allocator, then use the default.



3.1.2. The debugging memory allocator

If SQLite is compiled with the SQLITE_MEMDEBUG compile-time option,
then a different, heavy wrapper is used around system malloc(), realloc(), 
and free().
The heavy wrapper allocates around 100 bytes of extra space
with each allocation.  The extra space is used to place sentinel values 
at both ends of the allocation returned to the SQLite core.  When an
allocation is freed,
these sentinels are checked to make sure the SQLite core did not overrun
the buffer in either direction.  When the system library is GLIBC, the 
heavy wrapper also makes use of the GNU backtrace() function to examine
the stack and record the ancestor functions of the malloc() call.  When
running the SQLite test suite, the heavy wrapper also records the name of
the current test case.  These latter two features are useful for
tracking down the source of memory leaks detected by the test suite.

The heavy wrapper that is used when SQLITE_MEMDEBUG is set also
makes sure each new allocation is filled with nonsense data prior to
returning the allocation to the caller.  And as soon as an allocation
is free, it is again filled with nonsense data.  These two actions help
to ensure that the SQLite core does n½ot make assumptions about the state
of newly allocated memory and that memory allocations are not used after
they have been freed.

The heavy wrapper employed by SQLITE_MEMDEBUG is intended for use
only during testing, analysis, and debugging of SQLite.  The heavy wrapper
has a significant performance and memory overhead and probably should not
be used in production.



3.1.3. The Win32 native memory allocator

If SQLite is compiled for Windows with the SQLITE_WIN32_MALLOC
compile-time option, then a different, thin wrapper is used around
HeapAlloc(), HeapReAlloc(), and HeapFree().  The thin wrapper uses the
configured SQLite heap, which will be different from the default process
heap if the SQLITE_WIN32_HEAP_CREATE compile-time option is used.  In
addition, when an allocation is made or freed, HeapValidate() will be
called if SQLite is compiled with assert() enabled and the
SQLITE_WIN32_MALLOC_VALIDATE compile-time option.



3.1.4. Zero-malloc memory allocator

When SQLite is compiled with the SQLITE_ENABLE_MEMSYS5 option, an
alternative memory allocator that does not use malloc() is included in the
build.  The SQLite developers refer to this alternative memory allocator
as "memsys5".  Even when it is included in the build, memsys5 is 
disabled by default.
To enable memsys5, the application must invoke the following SQLite 
interface at start-time:


sqlite3_config(SQLITE_CONFIG_HEAP, pBuf, szBuf, mnReq);


In the call above, pBuf is a pointer to a large, contiguous chunk
of memory space that SQLite will use to satisfy all of its memory
allocation needs.   pBuf might point to a static array or it might
be memory obtained from some other application-specific mechanism.
szBuf is an integer that is the number of bytes of memory space
pointed to by pBuf.  mnReq is another integer that is the
minimum size of an allocation.  Any call to sqlite3_malloc(N) where
N is less than mnReq will be rounded up to mnReq.  mnReq must be
a power of two.  We shall see later that the mnReq parameter is
important in reducing the value of n and hence the minimum memory
size requirement in the Robson proof.

The memsys5 allocator is designed for use on embedded systems, 
though there is nothing to prevent its use on workstations.
The szBuf is typically between a few hundred kilobytes up to a few
dozen megabytes, depending on system requirements and memory budget.

The algorithm used by memsys5 can be called "power-of-two,
first-fit".  The sizes of all memory allocation 
requests are rounded up to a power of two and the request is satisfied
by the first free slot in pBuf that is large enough.  Adjacent freed
allocations are coalesced using a buddy system. When used appropriately,
this algorithm provides mathematical guarantees against fragmentation and
breakdown, as described further below.



3.1.5. Experimental memory allocators

The name "memsys5" used for the zero-malloc memory allocator implies
that there are several additional memory allocators available, and indeed
there are.  The default memory allocator is "memsys1".  The debugging
memory allocator is "memsys2".  Those have already been covered.

If SQLite is compiled with SQLITE_ENABLE_MEMSYS3 then another
zero-malloc memory allocator, similar to memsys5, is included in the
source tree.  The memsys3 allocator, like memsys5, must be activated
by a call to sqlite3_config(SQLITE_CONFIG_HEAP,...).  Memsys3
uses the memory buffer supplied as its source for all memory allocations.
The difference between memsys3 and memsys5 is that memsys3 uses a
different memory allocation algorithm that seems to work well in
practice, but which does not provide mathematical
guarantees against memory fragmentation and breakdown.  Memsys3 was
a predecessor to memsys5.  The SQLite developers now believe that 
memsys5 is superior to
memsys3 and that all applications that need a zero-malloc memory
allocator should use memsys5 in preference to memsys3.  Memsys3 is
considered both experimental and deprecated and will likely be removed 
from the source tree in a future release of SQLite.

Memsys4 and memsys6 w¾ere experimental memory allocators
introduced in around 2007 and subsequently removed from the
source tree in around 2008, after it became clear that they
added no new value.

Other experimental memory allocators might be added in future releases
of SQLite.  One may anticipate that these will be called memsys7, memsys8,
and so forth.


3.1.6. Application-defined memory allocators

New memory allocators do not have to be part of the SQLite source tree
nor included in the sqlite3.c amalgamation.  Individual applications can
supply their own memory allocators to SQLite at start-time.

To cause SQLite to use a new memory allocator, the application
simply calls:


sqlite3_config(SQLITE_CONFIG_MALLOC, pMem);


In the call above, pMem is a pointer to an sqlite3_mem_methods object
that defines the interface to the application-specific memory allocator.
The sqlite3_mem_methods object is really just a structure containing
pointers to functions to implement the various memory allocation primitives.


In a multi-threaded application, access to the sqlite3_mem_methods
is serialized if and only if SQLITE_CONFIG_MEMSTATUS is enabled.
If SQLITE_CONFIG_MEMSTATUS is disabled then the methods in
sqlite3_mem_methods must take care of their own serialization needs.


3.1.7. Memory allocator overlays

An application can insert layers or "overlays" in between the
SQLite core and the underlying memory allocator.
For example, the out-of-memory test logic
for SQLite uses an overlay that can simulate memory allocation
failures.

An overlay can be created by using the


sqlite3_config(SQLITE_CONFIG_GETMALLOC, pOldMem);


interface to obtain pointers to the existing memory allocator.
The existing allocator is saved by the overlay and is used as
a fallback to do real memory allocation.  Then the overlay is
inserted in place of the existing memory allocator using
the sqlite3_config(SQLITE_CONFIG_MALLOC,...) as described
above.


3.1.8. No-op memory allocator stub

If SQLite is compiled with the SQLITE_ZERO_MALLOC option, then
the default memory allocator is omitted and replaced by a stub
memory allocator that never allocates any memory.  Any calls to the
stub memory allocator will report back that no memory is available.

The no-op memory allocator is not useful by itself.  It exists only
as a placeholder so that SQLite has a memory allocator to link against
on systems that may not have malloc(), free(), or realloc() in their
standard library.
An application that is compiled with SQLITE_ZERO_MALLOC will need to
use sqlite3_config() together with SQLITE_CONFIG_MALLOC or
SQLITE_CONFIG_HEAP to specify a new alternative memory allocator
before beginning to use SQLite.



3.2.  Page cache memory

In most applications, the database page cache subsystem within 
SQLite uses more dynamically allocated memory than all other parts
of SQLite combined.  It is not unusual to see the database page cache
consume over 10 times more memory than the rest of SQLite combined.

SQLite can be configured to make page cache memory allocations from
a separate and distinct memory pool of fixed-size
slots.  This can have two advantages:



Because allocations are all the same size, the memory allocator can
operate much faster.  The allocator need not bother with coalescing 
adjacent free slots or searching for a slot
of an appropriate size.  All unallocated memory slots can be stored on
a linked list.  Allocating consists of removing the first entry from the
list.  Deallocating is simply adding an entry to the beginning of the list.



With a single allocation size, the n parameter in the
Robson proof is 1, and the total memory space required by the allocator
(N) is exactly equal to maximum memory used (M).  
No additional memory is required to cover fragmentation overhead, thus 
reducing memory requirements.  This is particularly important for the
page cache memory since the page cache constitutes the largest component
of the memory needs of SQLite.



The page-cache memory allocator is disabled by default.
An application can enable it at start-time as follows:


sqlite3_co¿nfig(SQLITE_CONFIG_PAGECACHE, pBuf, sz, N);


The pBuf parameter is a pointer to a contiguous range of bytes that
SQLite will use for page-cache memory allocations.  The buffer must be
at least sz*N bytes in size.  The "sz" parameter
is the size of each page-cache allocation.  N is the maximum 
number of available allocations.

If SQLite needs a page-cache entry that is larger than "sz" bytes or
if it needs more than N entries, it falls back to using the
general-purpose memory allocator.



3.3.  Lookaside memory allocator

SQLite database connections make many
small and short-lived memory allocations.
This occurs most commonly when compiling SQL statements using
sqlite3_prepare_v2() but also to a lesser extent when running
prepared statements using sqlite3_step().  These small memory
allocations are used to hold things such as the names of tables
and columns, parse tree nodes, individual query results values,
and B-Tree cursor objects.  There are consequently
many calls to malloc() and free() - so many calls that malloc() and
free() end up using a significant fraction of the CPU time assigned
to SQLite.

SQLite version 3.6.1 (2008-08-06)
introduced the lookaside memory allocator to
help reduce the memory allocation load.  In the lookaside allocator,
each database connection preallocates a single large chunk of memory
(typically in the range of 60 to 120 kilobytes) and divides that chunk
up into small fixed-size "slots" of around 100 to 1000 byte each.  This
becomes the lookaside memory pool.  Thereafter, memory allocations
associated with the database connection and that are not too large
are satisfied using one of the lookaside pool slots rather than by calling
the general-purpose memory allocator.  Larger allocations continue to
use the general-purpose memory allocator, as do allocations that occur
when the lookaside pool slots are all checked out.  
But in many cases, the memory
allocations are small enough and there are few enough outstanding that
the new memory requests can be satisfied from the lookaside
pool.

Because lookaside allocations are always the same size, the allocation
and deallocation algorithms are very quick.  There is no
need to coalesce adjacent free slots or search for a slot
of a particular size.  Each database connection maintains a singly-linked
list of unused slots.  Allocation requests simply pull the first
element of this list.  Deallocations simply push the element back onto
the front of the list.
Furthermore, each database connection is assumed to already be
running in a single thread (there are mutexes already in
place to enforce this) so no additional mutexing is required to 
serialize access to the lookaside slot freelist.
Consequently, lookaside memory
allocations and deallocations are very fast.  In speed tests on
Linux and Mac OS X workstations, SQLite has shown overall performance
improvements as high as 10% and 15%, depending on the workload how
and lookaside is configured.

The size of the lookaside memory pool has a global default value
but can also be configured on a connection-by-connection basis.
To change the default size of the lookaside memory pool at
compile-time, use the 
-DSQLITE_DEFAULT_LOOKASIDE=SZ,N
option.
To change the default size of the lookaside memory pool at
start-time, use the sqlite3_config() interface:


sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, cnt);


The "sz" parameter is the size in bytes of each lookaside slot.
The "cnt" parameter is
the total number of lookaside memory slots per database connection.
The total amount
of lookaside memory allocated to each database connection is
sz*cnt bytes. 


The lookaside pool can be changed for an individual
database connection "db" using this call:


sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE, pBuf, sz, cnt);


The "pBuf" parameter is a pointer to memory space that will be
used for the lookaside memory pool.  If pBuf is NULL, then SQLite
will obtain its own space for the memory pool using sqlite3_malloc().
The "sz" and "cnt" parameters are the size of each lookaside slot
and the number of slots, respectiÀvely.  If pBuf is not NULL, then it
must point to at least sz*cnt bytes of memory.

The lookaside configuration can only be changed while there are
no outstanding lookaside allocations for the database connection.
Hence, the configuration should be set immediately after creating the 
database connection using sqlite3_open() (or equivalent) and before
evaluating any SQL statements on the connection.

3.3.1. Two-Size Lookaside


Beginning with SQLite version 3.31.0 (2020-01-22),
lookaside supports two memory pools, each with a different size
slot.  The small-slot pool uses 128-byte slots and the large-slot
pool uses whatever size is specified by SQLITE_DBCONFIG_LOOKASIDE
(defaulting to 1200 bytes).  Splitting the pool in two like this
allows memory allocations to be covered by lookaside more often
while at the same time reducing per-database-connection heap usage
from 120KB down to 48KB.


Configuration continues to use the SQLITE_DBCONFIG_LOOKASIDE or
SQLITE_CONFIG_LOOKASIDE configuration options, as described above,
with parameters "sz" and "cnt".  The total heap space used for
lookaside continues to be sz*cnt bytes.  But the space is allocated
between the small-slot lookaside and big-slot lookaside, with
preference given to small-slot lookaside.  The total number of
slots will usually exceed "cnt", since "sz" is typically much
larger than the small-slot size of 128 bytes.


The default lookaside configuration has changed from 100 slots
of 1200 bytes each (120KB) to be 40 slots of 1200 bytes each
(48KB).  This space ends up being allocated as 93 slots of
128 bytes each and 30 slots of 1200 bytes each.  So more lookaside
slots are available but much less heap space is used.


The default lookaside configuration, the size of the small-slots,
and the details of how heap space is allocated between small-slots
and big-slots, are all subject to change from one release to the
next.




3.4.  Memory status

By default, SQLite keeps statistics on its memory usage.  These
statistics are useful in helping to determine how much memory an
application really needs.  The statistics can also be used in
high-reliability system to determine
if the memory usage is coming close to or exceeding the limits 
of the Robson proof and hence that the memory allocation subsystem is 
liable to breakdown.

Most memory statistics are global, and therefore the tracking of
statistics must be serialized with a mutex.  Statistics are turned 
on by default, but an option exists to disable them.  By disabling 
memory statistics,
SQLite avoids entering and leaving a mutex on each memory allocation
and deallocation.  That savings can be noticeable on systems where
mutex operations are expensive.  To disable memory statistics, the
following interface is used at start-time:


sqlite3_config(SQLITE_CONFIG_MEMSTATUS, onoff);


The "onoff" parameter is true to enable the tracking of memory
statistics and false to disable statistics tracking.

Assuming statistics are enabled, the following routine can be used
to access them:


sqlite3_status(verb, &amp;current, &amp;highwater, resetflag);


The "verb" argument determines what statistic is accessed.
There are various verbs defined.  The
list is expected to grow as the sqlite3_status() interface matures.
The current value the selected parameter is written into integer 
"current" and the highest historical value
is written into integer "highwater".  If resetflag is true, then
the high-water mark is reset down to the current value after the call
returns.

A different interface is used to find statistics associated with a
single database connection:


sqlite3_db_status(db, verb, &amp;current, &amp;highwater, resetflag);


This interface is similar except that it takes a pointer to
a database connection as its first argument and returns statistics about
that one object rather than about the entire SQLite library.
The sqlite3_db_status() interface currently only recognizes a
single verb SQLITE_DBSTATUS_LOOKASIDE_USED, though additional verbs
may be added in the future.

The per-connection statistics do not use global Ávariables and hence
do not require mutexes to update or access.  Consequently the
per-connection statistics continue to function even if
SQLITE_CONFIG_MEMSTATUS is turned off.


3.5.  Setting memory usage limits

The sqlite3_soft_heap_limit64() interface can be used to set an
upper bound on the total amount of outstanding memory that the
general-purpose memory allocator for SQLite will allow to be outstanding
at one time.  If attempts are made to allocate more memory than specified
by the soft heap limit, then SQLite will first attempt to free cache
memory before continuing with the allocation request.  The soft heap
limit mechanism only works if memory statistics are enabled and
it works best
if the SQLite library is compiled with the SQLITE_ENABLE_MEMORY_MANAGEMENT
compile-time option.

The soft heap limit is "soft" in this sense:  If SQLite is not able
to free up enough auxiliary memory to stay below the limit, it goes
ahead and allocates the extra memory and exceeds its limit.  This occurs
under the theory that it is better to use additional memory than to fail
outright.

As of SQLite version 3.6.1 (2008-08-06), 
the soft heap limit only applies to the
general-purpose memory allocator.  The soft heap limit does not know
about or interact with
the pagecache memory allocator or the lookaside memory allocator.
This deficiency will likely be addressed in a future release.



4.  Mathematical Guarantees Against Memory Allocation Failures

The problem of dynamic memory allocation, and specifically the
problem of a memory allocator breakdown, has been studied by
J. M. Robson and the results published as:


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 us use the following notation (similar but not identical to
Robson's notation):



N

The amount of raw memory needed by the memory allocation system
in order to guarantee that no memory allocation will ever fail.

M

The maximum amount of memory that the application ever has checked out
at any point in time.

n

The ratio of the largest memory allocation to the smallest.  We assume
that every memory allocation size is an integer multiple of the smallest memory
allocation size.




Robson proves the following result:


N = M*(1 + (log2 n)/2) - n + 1


Colloquially, the Robson proof shows that in order to guarantee
breakdown-free operation, any memory allocator must use a memory pool
of size N which exceeds the maximum amount of memory ever
used M by a multiplier that depends on n, 
the ratio of the largest to the smallest allocation size.  In other
words, unless all memory allocations are of exactly the same size
(n=1) then the system needs access to more memory than it will
ever use at one time.  Furthermore, we see that the amount of surplus
memory required grows rapidly as the ratio of largest to smallest
allocations increases, and so there is strong incentive to keep all
allocations as near to the same size as possible.

Robson's proof is constructive. 
He provides an algorithm for computing a sequence of allocation
and deallocation operations that will lead to an allocation failure due to
memory fragmentation if available memory is as much as one byte
less than N.
And, Robson shows that a power-of-two first-fit memory allocator
(such as implemented by memsys5) will never fail a memory allocation
provided that available memory is N or more bytes.

The values M and n are properties of the application.
If an application is constructed in such a way that both M and
n are known, or at least have known upper bounds, and if the
application uses
the memsys5 memory allocator and is provided with N bytes of
available memory space using SQLITE_CONFIG_HEAP
then Robson proves that no memory allocation request will ever fail
within the application.
To put this another way, the application developer can select a value
for N that will guarantee that no call to any SQLite interface
will ever return SQLITE_NOMEM.  The memory pool will never becomÂe
so fragmented that a new memory allocation request cannot be satisfied.
This is an important property for
applications where a software fault could cause injury, physical harm, or
loss of irreplaceable data.

4.1.  Computing and controlling parameters M and n

The Robson proof applies separately to each of the memory allocators
used by SQLite:


The general-purpose memory allocator (memsys5).
The pagecache memory allocator.
The lookaside memory allocator.


For allocators other than memsys5,
all memory allocations are of the same size.  Hence, n=1
and therefore N=M.  In other words, the memory pool need
be no larger than the largest amount of memory in use at any given moment.

The usage of pagecache memory is somewhat harder to control in
SQLite version 3.6.1, though mechanisms are planned for subsequent
releases that will make controlling pagecache memory much easier.
Prior to the introduction of these new mechanisms, the only way
to control pagecache memory is using the cache_size pragma.

Safety-critical applications will usually want to modify the
default lookaside memory configuration so that when the initial
lookaside memory buffer is allocated during sqlite3_open() the
resulting memory allocation is not so large as to force the n
parameter to be too large.  In order to keep n under control,
it is best to try to keep the largest memory allocation below 2 or 4
kilobytes.  Hence, a reasonable default setup for the lookaside
memory allocator might any one of the following:


sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 32, 32);  /* 1K */
sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 64, 32);  /* 2K */
sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 32, 64);  /* 2K */
sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 64, 64);  /* 4K */


Another approach is to initially disable the lookaside memory
allocator:


sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 0, 0);


Then let the application maintain a separate pool of larger
lookaside memory buffers that it can distribute to database connections
as they are created.  In the common case, the application will only
have a single database connection and so the lookaside memory pool
can consist of a single large buffer.


sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE, aStatic, 256, 500);


The lookaside memory allocator is really intended as performance
optimization, not as a method for assuring breakdown-free memory allocation,
so it is not unreasonable to completely disable the lookaside memory
allocator for safety-critical operations.

The general purpose memory allocator is the most difficult memory pool
to manage because it supports allocations of varying sizes.  Since 
n is a multiplier on M we want to keep n as small
as possible.  This argues for keeping the minimum allocation size for
memsys5 as large as possible.  In most applications, the
lookaside memory allocator is able to handle small allocations.  So
it is reasonable to set the minimum allocation size for memsys5 to
2, 4 or even 8 times the maximum size of a lookaside allocation.  
A minimum allocation size of 512 is a reasonable setting.

Further to keeping n small, one desires to keep the size of
the largest memory allocations under control.
Large requests to the general-purpose memory allocator
might come from several sources:


SQL table rows that contain large strings or BLOBs.
Complex SQL queries that compile down to large prepared statements.
SQL parser objects used internally by sqlite3_prepare_v2().
Storage space for database connection objects.
Page cache memory allocations that overflow into the general-purpose
    memory allocator.
Lookaside buffer allocations for new database connections.


The last two allocations can be controlled and/or eliminated by
configuring the pagecache memory allocator,
and lookaside memory allocator appropriately, as described above.
The storage space required for database connection objects depends
to some extent on the length of the filename of the database file, but
rarely exceeds 2KB on 32-bit systems.  (More space is required on
64-bit systems due to the increased size of pointers.)
Each parser object uses about 1.6KB of memory.  Thus, elements 3 through 6
above can easily be controlled to keep the maximum memory allocation
size below 2KB.

If the application is designed to manage data in small pieces,
then the database should never contain any large strings or BLOBs
and hence element 1 above should not be a factor.  If the database
does contain large strings or BLOBs, they should be read using
incremental BLOB I/O and rows that contain the
large strings or BLOBs should never be update by any means other
than incremental BLOB I/O.  Otherwise, the 
sqlite3_step() routine will need to read the entire row into
contiguous memory at some point, and that will involve at least
one large memory allocation.

The final source of large memory allocations is the space to hold
the prepared statements that result from compiling complex SQL
operations.  Ongoing work by the SQLite developers is reducing the
amount of space required here.  But large and complex queries might
still require prepared statements that are several kilobytes in
size.  The only workaround at the moment is for the application to
break complex SQL operations up into two or more smaller and simpler 
operations contained in separate prepared statements.

All things considered, applications should normally be able to
hold their maximum memory allocation size below 2K or 4K.  This
gives a value for log2(n) of 2 or 3.  This will
limit N to between 2 and 2.5 times M.

The maximum amount of general-purpose memory needed by the application
is determined by such factors as how many simultaneous open 
database connection and prepared statement objects the application
uses, and on the complexity of the prepared statements.  For any
given application, these factors are normally fixed and can be
determined experimentally using SQLITE_STATUS_MEMORY_USED.
A typical application might only use about 40KB of general-purpose
memory.  This gives a value of N of around 100KB.

4.2.  Ductile failure

If the memory allocation subsystems within SQLite are configured
for breakdown-free operation but the actual memory usage exceeds
design limits set by the Robson proof, SQLite will usually continue 
to operate normally.
The pagecache memory allocator
and the lookaside memory allocator automatically failover
to the memsys5 general-purpose memory allocator.  And it is usually the
case that the memsys5 memory allocator will continue to function
without fragmentation even if M and/or n exceeds the limits
imposed by the Robson proof.  The Robson proof shows that it is 
possible for a memory allocation to break down and fail in this 
circumstance, but such a failure requires an especially
despicable sequence of allocations and deallocations - a sequence that
SQLite has never been observed to follow.  So in practice it is usually
the case that the limits imposed by Robson can be exceeded by a
considerable margin with no ill effect.

Nevertheless, application developers are admonished to monitor
the state of the memory allocation subsystems and raise alarms when
memory usage approaches or exceeds Robson limits.  In this way,
the application will provide operators with abundant warning well
in advance of failure.
The memory statistics interfaces of SQLite provide the application with
all the mechanism necessary to complete the monitoring portion of
this task.


5.  Stability Of Memory Interfaces

Update: As of SQLite version 3.7.0 (2010-07-21), 
all of SQLite memory allocation interfaces
are considered stable and will be supported in future releases.
This page last modified on  2022-01-28 19:28:24 UTCmalloc.html
½½?  I '#The dbhash.exe Utility Program1. Overview

The dbhash (or dbhash.exe on Windows) utility is a
command-line program that computes the SHA1 hash of the schema and content 
for an SQLite database.

Dbhash ignores extraneous formatting details and hashes only the database
schema and content.  Hence the hash is constant even if the database file
is modified by:


 VACUUM
 PRAGMA page_size
 PRAGMA journal_mode
 REINDEX
 ANALYZE
 copied via the backup API
 ... and so forth


The operations above can potentially cause vast changes the raw database file,
and hence cause very different SHA1 hashes at the file level.
But since the content represented in the database file is unchanged by these
operations, the hash computed by dbhash is also unchanged.

Dbhash can be used to compare two databases to confirm that they
are equivalent, even though their representation on disk is quite different.
Dbhash might also be used to verify the content of a remote database without having
to transmit the entire content of the remote database over a slow link.

2. Usage

Dbhash is a command-line utility.
To run it, type "dbhash" on a command-line prompt followed by the names of
one or more SQLite database files that are to be hashed.
The database hashes will be displayed on standard output.
For example:

drh@bella:~/sqlite/bld$ dbhash ~/Fossils/sqlite.fossil
8d3da9ff87196312aaa33076627ccb7943ef79e3 /home/drh/Fossils/sqlite.fossil


Dbhash supports command-line options that can restrict the tables of the
database file that are hashed, or restrict the hash to only content or only
the schema.  Run "dbhash --help" for further information.

3. Building

To build a copy of the dbhash utility program on unix, get a copy of the
canonical SQLite source code and enter:

./configure
make dbhash


On Windows, enter:

nmake /f makefile.msc dbhash.exe


The dbhash program is implemented by a single file of C-code
called dbhash.c.
To build the dbhash program manually, simply compile the dbhash.c source file
and link it against the SQLite library.
This page last modified on  2016-07-13 13:57:06 UTCdbhash.htmlÅaction.  Must be 64.
221
Minimum embedded payload fraction.  Must be 32.
231
Leaf payload fraction.  Must be 32.
244
File change counter.
284
Size of the database file in pages.  The "in-header database size".
324
Page number of the first freelist trunk page.
364
Total number of freelist pages.
404
The schema cookie.
444
The schema format number.  Supported schema formats are 1, 2, 3, and 4.
484
Default page cache size.
524
The page number of the largest root b-tree page when in auto-vacuum or
incremental-vacuum modes, or zero otherwise.
564
The database text encoding.  A value of 1 means UTF-8.  A value of 2
means UTF-16le.  A value of 3 means UTF-16be.
604
The "user version" as read and set by the user_version pragma.
644
True (non-zero) for incremental-vacuum mode.  False (zero) otherwise.
684
The "Application ID" set by PRAGMA application_id.
7220
Reserved for expansion.  Must be zero.
924
The version-valid-for number.
964
SQLITE_VERSION_NUMBER


1.3.1. Magic Header String

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.  This byte sequence
corresponds to the UTF-8 string "SQLite format 3" including the nul
terminator character at the end.

1.3.2. Page Size

The two-byte value beginning at offset 16 determines the page size of 
the database.  For SQLite versions 3.7.0.1 (2010-08-04)
and earlier, this value is 
interpreted as a big-endian integer and must be a power of two between
512 and 32768, inclusive.  Beginning with SQLite version 3.7.1
(2010-08-23), a page
size of 65536 bytes is supported.  The value 65536 will not fit in a
two-byte integer, so to specify a 65536-byte page size, the value
at offset 16 is 0x00 0x01.
This value can be interpreted as a big-endian
1 and thought of as a magic number to represent the 65536 page size.
Or one can view the two-byte field as a little endian number and say
that it represents the page size divided by 256.  These two 
interpretations of the page-size field are equivalent.



1.3.3. File format version numbers

The file format write version and file format read version at offsets
18 and 19 are intended to allow for enhancements of the file format
in future versions of SQLite.  In current versions of SQLite, both of
these values are 1 for rollback journalling modes and 2 for WAL
journalling mode.  If a version of SQLite coded to the current
file format specification encounters a database file where the read
version is 1 or 2 but the write version is greater than 2, then the database
file must be treated as read-only.  If a database file with a read version
greater than 2 is encountered, then that database cannot be read or written.



1.3.4. Reserved bytes per page

SQLite has the ability to set aside a small number of extra bytes at
the end of every page for use by extensions.  These extra bytes are
used, for example, by the SQLite Encryption Extension to store a nonce
and/or cryptographic checksum associated with each page.  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.
This value is usually 0.  The value can be odd.



The "usable size" of a database page is the page size specified by the
2-byte integer at offset 16 in the header less the "reserved" space size
recorded in the 1-byte integer at offset 20 in the header.  The usable
size of a page might be an odd number.  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.

1.3.5. Payload fractions

The maximum and minimum embedded payload fractions and the leaf
payload fraction values must be 64, 32, and 32.  These values were
originally intended to be tunable parameters that could be used to
modify the storage format of the b-tree algorithm.  However, that
functionality is not supported and there are no current plans to add
support in the future.  Hence, these three bytes are fixed at the
values specified.

1.3.6. File change counter



The file chÆange counter is a 4-byte big-endian integer at
offset 24 that is incremented whenever the database file is unlocked
after having been modified.
When two or more processes are reading the same database file, each 
process can detect database changes from other processes by monitoring 
the change counter.
A process will normally want to flush its database page cache when
another process modified the database, since the cache has become stale.
The file change counter facilitates this.

In WAL mode, changes to the database are detected using the wal-index
and so the change counter is not needed.  Hence, the change counter might
not be incremented on each transaction in WAL mode.

1.3.7. In-header database size



The 4-byte big-endian integer at offset 28 into the header 
stores the size of the database file in pages.  If this in-header
datasize size is not valid (see the next paragraph), then the database 
size is computed by looking
at the actual size of the database file. Older versions of SQLite
ignored the in-header database size and used the actual file size
exclusively.  Newer versions of SQLite use the in-header database
size if it is available but fall back to the actual file size if
the in-header database size is not valid.

The in-header database size is only considered to be valid if
it is non-zero and if the 4-byte change counter at offset 24
exactly matches the 4-byte version-valid-for number at offset 92.
The in-header database size is always valid 
when the database is only modified using recent versions of SQLite,
versions 3.7.0 (2010-07-21) and later.
If a legacy version of SQLite writes to the database, it will not
know to update the in-header database size and so the in-header
database size could be incorrect.  But legacy versions of SQLite
will also leave the version-valid-for number at offset 92 unchanged
so it will not match the change-counter.  Hence, invalid in-header
database sizes can be detected (and ignored) by observing when
the change-counter does not match the version-valid-for number.

1.3.8. Free page list

Unused pages in the database file are stored on a freelist.  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.
The 4-byte big-endian integer at offset 36 stores the total 
number of pages on the freelist.

1.3.9. Schema cookie

The schema cookie is a 4-byte big-endian integer at offset 40
that is incremented whenever the database schema changes.  A 
prepared statement is compiled against a specific version of the
database schema.  When the database schema changes, the statement
must be reprepared.  When a prepared statement runs, it first checks
the schema cookie to ensure the value is the same as when the statement
was prepared and if the schema cookie has changed, the statement either
automatically reprepares and reruns or it aborts with an SQLITE_SCHEMA 
error.



1.3.10. Schema format number

The schema format number is a 4-byte big-endian integer at offset 44.
The schema format number is similar to the file format read and write
version numbers at offsets 18 and 19 except that the schema format number
refers to the high-level SQL formatting rather than the low-level b-tree
formatting.  Four schema format numbers are currently defined:


Format 1 is understood by all versions of SQLite back to
version 3.0.0 (2004-06-18).
Format 2 adds the ability of rows within the same table
to have a varying number of columns, in order to support the
ALTER TABLE ... ADD COLUMN functionality.  Support for
reading and writing format 2 was added in SQLite 
version 3.1.3 on 2005-02-20.
Format 3 adds the ability of extra columns added by
ALTER TABLE ... ADD COLUMN to have non-NULL default
values.  This capability was added in SQLite version 3.1.4
on 2005-03-11.
Format 4 causes SQLite to respect the
DESC keyword on
index declarations.  (The DESC keyword is ignored in indexes for 
formats 1, 2, and 3.)
Format 4 also adds two new boolean record type values (serial types
8 and 9).  Support for format 4 was added in SQLitÇe 3.3.0 on
2006-01-10.


New database files created by SQLite use format 4 by default.
The legacy_file_format pragma can be used to cause SQLite
to create new database files using format 1.
The format version number can be made to default to 1 instead of 4 by
setting SQLITE_DEFAULT_FILE_FORMAT=1 at compile-time.


1.3.11. Suggested cache size

The 4-byte big-endian signed integer at offset 48 is the suggested
cache size in pages for the database file.  The value is a suggestion
only and SQLite is under no obligation to honor it.  The absolute value
of the integer is used as the suggested size.  The suggested cache size
can be set using the default_cache_size pragma.

1.3.12. Incremental vacuum settings

The two 4-byte big-endian integers at offsets 52 and 64 are used
to manage the auto_vacuum and incremental_vacuum modes.  If
the integer at offset 52 is zero then pointer-map (ptrmap) pages are
omitted from the database file and neither auto_vacuum nor
incremental_vacuum are supported.  If the integer at offset 52 is
non-zero then it is the page number of the largest root page in the
database file, the database file will contain ptrmap pages, and the
mode must be either auto_vacuum or incremental_vacuum.  In this latter
case, the integer at offset 64 is true for incremental_vacuum and
false for auto_vacuum.  If the integer at offset 52 is zero then
the integer at offset 64 must also be zero.



1.3.13. Text encoding

The 4-byte big-endian integer at offset 56 determines the encoding
used for all text strings stored in the database.  
A value of 1 means UTF-8.
A value of 2 means UTF-16le.
A value of 3 means UTF-16be.
No other values are allowed.
The sqlite3.h header file defines C-preprocessor macros SQLITE_UTF8 as 1,
SQLITE_UTF16LE as 2, and SQLITE_UTF16BE as 3, to use in place of
the numeric codes for the text encoding.

1.3.14. User version number

The 4-byte big-endian integer at offset 60 is the user version which
is set and queried by the user_version pragma.  The user version is
not used by SQLite.



1.3.15. Application ID

The 4-byte big-endian integer at offset 68 is an "Application ID" that
can be set by the PRAGMA application_id command in order to identify the
database as belonging to or associated with a particular application.
The application ID is intended for database files used as an
application file-format.  The application ID can be used by utilities 
such as file(1) to determine the specific
file type rather than just reporting "SQLite3 Database".  A list of
assigned application IDs can be seen by consulting the
magic.txt
file in the SQLite source repository.



1.3.16. Write library version number and version-valid-for number

The 4-byte big-endian integer at offset 96 stores the 
SQLITE_VERSION_NUMBER value for the SQLite library that most
recently modified the database file.  The 4-byte big-endian integer at
offset 92 is the value of the change counter when the version number
was stored.  The integer at offset 92 indicates which transaction
the version number is valid for and is sometimes called the
"version-valid-for number".

1.3.17. Header space reserved for expansion

All other bytes of the database file header are reserved for
future expansion and must be set to zero.



1.4. The Lock-Byte Page

The lock-byte page is the single page of the database file
that contains the bytes at offsets between 1073741824 and 1073742335,
inclusive.  A database file that is less than or equal to 1073741824 bytes 
in size contains no lock-byte page.  A database file larger than
1073741824 contains exactly one lock-byte page.


The lock-byte page is set aside for use by the operating-system specific
VFS implementation in implementing the database file locking primitives.
SQLite does not use the lock-byte page.  The SQLite core 
will never read or write the lock-byte page,
though operating-system specific VFS 
implementations may choose to read or write bytes on the lock-byte 
page according to the 
needs and proclivities of the underlying system.  The unix and win32
VFS implementations that come built into SQÈLite do not write to the
lock-byte page, but third-party VFS implementations for
other operating systems might.

The lock-byte page arose from the need to support Win95 which was the
predominant operating system when this file format was designed and which 
only supported mandatory file locking.  All modern operating systems that
we know of support advisory file locking, and so the lock-byte page is
not really needed any more, but is retained for backwards compatibility.



1.5. The Freelist

A database file might contain one or more pages that are not in
active use.  Unused pages can come about, for example, when information
is deleted from the database.  Unused pages are stored on the freelist
and are reused when additional pages are required.

The freelist is organized as a linked list of freelist trunk pages
with each trunk page containing page numbers for zero or more freelist
leaf pages.

A freelist trunk page consists of an array of 4-byte big-endian integers.
The size of the array is as many integers as will fit in the usable space
of a page.  The minimum usable space is 480 bytes so the array will always
be at least 120 entries in length.  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.  The second integer on a freelist
trunk page is the number of leaf page pointers to follow.  
Call the second integer on a freelist trunk page L.
If L is greater than zero then integers with array indexes between 2 and
L+1 inclusive contain page numbers for freelist leaf pages.

Freelist leaf pages contain no information.  SQLite avoids reading or
writing freelist leaf pages in order to reduce disk I/O.

A bug in SQLite versions prior to 3.6.0 (2008-07-16)
caused the database to be
reported as corrupt if any of the last 6 entries in the freelist trunk page 
array contained non-zero values.  Newer versions of SQLite do not have
this problem.  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.

The number of freelist pages is stored as a 4-byte big-endian integer
in the database header at an offset of 36 from the beginning of the file.
The database header also stores the page number of the first freelist trunk
page as a 4-byte big-endian integer at an offset of 32 from the beginning
of the file.



1.6. B-tree Pages

The b-tree algorithm provides key/data storage with unique and
ordered keys on page-oriented storage devices.
For background information on b-trees, see
Knuth, The Art Of Computer Programming, Volume 3 "Sorting
and Searching", pages 471-479.  Two variants of b-trees are used by
SQLite.  "Table b-trees" use a 64-bit signed integer key and store
all data in the leaves.  "Index b-trees" use arbitrary keys and store no
data at all.

A b-tree page is either an interior page or a leaf page.
A leaf page contains keys and in the case of a table b-tree each
key has associated data.  An interior page contains
K keys together with K+1 pointers to child b-tree pages.
A "pointer" in an interior b-tree page is just the 32-bit 
unsigned integer page number of the child page.

The number of keys on an interior b-tree page, K,
is almost always at least 2 and is usually much more than 2.
The only exception is when page 1 is an interior b-tree page.
Page 1 has 100 fewer bytes of storage space available,
due to the presence of the database header at the beginning of that page,
and so sometimes (rarely) if page 1 is an interior b-tree page, it can
end up holding just a a single key.  In all other cases, K is 2 or more.
The upper bound on K is as many keys as will fit on the page. Large keys
on index b-trees are split up into overflow pages so that no single key
uses more than one fourth of the available storage space on the page
and hence every internal page is able to store at least 4 keys.
The integer keys of table b-trees are never large enough to
require overflow, soÉ key overflow only occurs on index b-trees.

Define the depth
of a leaf b-tree to be 1 and the depth of any interior b-tree to be one
more than the maximum depth of any of its children.  In a well-formed
database, all children of an interior b-tree have the same depth.

In an interior b-tree page, the pointers and keys logically alternate 
with a pointer on both ends. (The previous sentence is to be understood
conceptually - the actual layout of the keys and
pointers within the page is more complicated and will be described in
the sequel.)  All keys within the same page are unique and are logically
organized in ascending order from left to right.  (Again, this ordering
is logical, not physical.  The actual location of keys within the page
is arbitrary.) For any key X, pointers to the left
of a X refer to b-tree pages on which all keys are less than or equal to X.
Pointers to the right of X refer to pages where all keys are 
greater than X.

Within an interior b-tree page, each key and the pointer to its
immediate left are combined into a structure called a "cell".  The
right-most pointer is held separately.  A leaf b-tree page has no
pointers, but it still uses the cell structure to hold keys for
index b-trees or keys and content for table b-trees.  Data is also
contained in the cell.


Every b-tree page has at most one parent b-tree page.
A b-tree page without a parent is called a root page.  A root b-tree page
together with the closure of its children form a complete b-tree.
It is possible (and in fact rather common) to have a complete b-tree
that consists of a single page that is both a leaf and the root.
Because there are pointers from parents to children, every page of a
complete b-tree can be located if only the root page is known.  Hence,
b-trees are identified by their root page number.



A b-tree page is either a table b-tree page or an index b-tree page.
All pages within each complete b-tree are of the same type: either table
or index.  There is one table b-trees in the database file
for each rowid table in the database schema, including system tables
such as sqlite_schema.  There is one index b-tree
in the database file for each index in the schema, including implied indexes
created by uniqueness constraints.  There are no b-trees associated with
virtual tables.  Specific virtual table implementations might make use
of shadow tables for storage, but those shadow tables will have separate
entries in the database schema.  WITHOUT ROWID tables use index b-trees
rather than a table b-trees, so there is one
index b-tree in the database file for each WITHOUT ROWID table.
The b-tree corresponding to the sqlite_schema table is always a table
b-tree and always has a root page of 1.
The sqlite_schema table contains the root page number for every other 
table and index in the database file.

Each entry in a table b-tree consists of a 64-bit signed integer key
and up to 2147483647 bytes of arbitrary data.  (The key of a table b-tree
corresponds to the rowid of the SQL table that the b-tree implements.)
Interior table b-trees hold only keys and pointers to children.
All data is contained in the table b-tree leaves.

Each entry in an index b-tree consists of an arbitrary key of up
to 2147483647 bytes in length and no data.



Define the "payload" of a cell to be the arbitrary length section
of the cell.  For an index b-tree, the key is always arbitrary in length
and hence the payload is the key.  There are no arbitrary length elements
in the cells of interior table b-tree pages and so those cells have no
payload.  Table b-tree leaf pages contain arbitrary length content and
so for cells on those pages the payload is the content.
When the size of payload for a cell exceeds a certain threshold (to
be defined later) then only the first few bytes of the payload
are stored on the b-tree page and the balance is stored in a linked list
of content overflow pages.

A b-tree page is divided into regions in the following order:


The 100-byte database file header (found on page 1 only)
The 8 or 12 byte b-tree page header
The cellÊ pointer array
Unallocated space
The cell content area
The reserved region.



The 100-byte database file header is found only on page 1, which is
always a table b-tree page.  All other b-tree pages in the database file
omit this 100-byte header.

The reserved region is an area of unused space at the end of every
page (except the locking page) that extensions can use to hold per-page
information.  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.
The size of the reserved region is usually zero.

The b-tree page header is 8 bytes in size for leaf pages and 12
bytes for interior pages.  All multibyte values in the page header
are big-endian.
The b-tree page header is composed of the following fields:


B-tree Page Header Format

OffsetSizeDescription
01
The one-byte flag at offset 0 indicating the b-tree page type.
A value of 2 (0x02) means the page is an interior index b-tree page.
A value of 5 (0x05) means the page is an interior table b-tree page.
A value of 10 (0x0a) means the page is a leaf index b-tree page.
A value of 13 (0x0d) means the page is a leaf table b-tree page.
Any other value for the b-tree page type is an error.
12
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.
32
The two-byte integer at offset 3 gives the number of cells on the page.
52
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.
71
The one-byte integer at offset 7 gives the number of fragmented free
bytes within the cell content area.
84
The four-byte page number at offset 8 is the right-most pointer.  This
value appears in the header of interior b-tree pages only and is omitted from
all other pages.


The cell pointer array of a b-tree page immediately follows the b-tree
page header.  Let K be the number of cells on the btree.  The cell pointer
array consists of K 2-byte integer offsets to the cell contents.  The
cell pointers are arranged in key order with left-most cell (the cell with the
smallest key) first and the right-most cell (the cell with the largest
key) last.

Cell content is stored in the cell content region of the b-tree page.
SQLite strives to place cells as far toward the end of the b-tree page as
it can, in order to leave space for future growth of the cell pointer array.
The area in between the last cell pointer array entry and the beginning of
the first cell is the unallocated region.


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.
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.

A freeblock is a structure used to identify unallocated space within
a b-tree page.  Freeblocks are organized as a chain.  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.  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.  Freeblocks are always connected in order 
of increasing offset.  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.  In a well-formed b-tree page, there will always be at least one cell
before the first freeblock.

A freeblock requires at least 4 bytes of space.  If there is an isolated
group of 1, 2, or 3 unused bytes within the cell content area, those bytes
comprise a fragment.  The total number of bytes in all fragments is stored
in the fifth field of the b-tree page header.  In a wËell-formed b-tree page,
the total number of bytes in fragments may not exceed 60.

The total amount of free space on a b-tree page consists of the size
of the unallocated region plus the total size of all freeblocks plus the
number of fragmented free bytes.  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.  This is called 
"defragmenting" the b-tree page.




A variable-length integer or "varint" is a static Huffman encoding
of 64-bit twos-complement integers that uses less space for small positive 
values. 
A varint is between 1 and 9 bytes in length.  The varint consists of either
zero or more bytes which have the high-order bit set followed by a single byte
with the high-order bit clear, or nine bytes, whichever is shorter.
The lower seven bits of each of the first eight bytes and all 8 bits of
the ninth byte are used to reconstruct the 64-bit twos-complement integer.
Varints are big-endian: bits taken from the earlier byte of the varint
are more significant than bits taken from the later bytes. 

The format of a cell depends on which kind of b-tree page the cell
appears on.  The following table shows the elements of a cell, in
order of appearance, for the various b-tree page types.


Table B-Tree Leaf Cell (header 0x0d):

A varint which is the total number of bytes of payload, including any
overflow
A varint which is the integer key, a.k.a. "rowid"
The initial portion of the payload that does not spill to overflow
pages.
A 4-byte big-endian integer page number for the first page of the
overflow page list - omitted if all payload fits on the b-tree page.


Table B-Tree Interior Cell (header 0x05):

A 4-byte big-endian page number which is the left child pointer.
A varint which is the integer key


Index B-Tree Leaf Cell (header 0x0a):

A varint which is the total number of bytes of key payload, including any
overflow
The initial portion of the payload that does not spill to overflow
pages.
A 4-byte big-endian integer page number for the first page of the
overflow page list - omitted if all payload fits on the b-tree page.


Index B-Tree Interior Cell (header 0x02):

A 4-byte big-endian page number which is the left child pointer.
A varint which is the total number of bytes of key payload, including any
overflow
The initial portion of the payload that does not spill to overflow
pages.
A 4-byte big-endian integer page number for the first page of the
overflow page list - omitted if all payload fits on the b-tree page.



The information above can be recast into a table format as follows:




B-tree Cell Format

Datatype
    Appears in...
    Description
Table Leaf (0x0d)
    Table Interior (0x05)
    Index Leaf (0x0a)
    Index Interior (0x02)
4-byte integer
    &nbsp;
    &#x2714;
    &nbsp;
    &#x2714;
    Page number of left child
varint
    &#x2714;
    &nbsp;
    &#x2714;
    &#x2714;
    Number of bytes of payload
varint
    &#x2714;
    &#x2714;
    &nbsp;
    &nbsp;
    Rowid
byte array
    &#x2714;
    &nbsp;
    &#x2714;
    &#x2714;
    Payload
4-byte integer
    &#x2714;
    &nbsp;
    &#x2714;
    &#x2714;
    Page number of first overflow page



The amount of payload that spills onto overflow pages also depends on
the page type.  For the following computations, let U be the usable size
of a database page, the total page size less the reserved space at the
end of each page.  And let P be the payload size.  In the following,
symbol X represents the maximum amount of payload that can be stored directly
on the b-tree page without spilling onto an overflow page and symbol M
represents the minimum amount of payload that must be stored on the btree
page before spilling is allowed.


Table B-Tree Leaf Cell:

Let X be U-35.  If the payload size P is less than or equal to X then
the entire payload is stored on the b-tree leaf page.
Let M be ((U-12)*32/255)-23 and let K be M+((P-M)%(U-4)).
If P is greater than X
then the number of bytes Ìstored on the table b-tree leaf page is K
if K is less or equal to X or M otherwise.
The number of bytes stored on the leaf page is never less than M.


Table B-Tree Interior Cell:

Interior pages of table b-trees have no payload and so there is never
any payload to spill.


Index B-Tree Leaf Or Interior Cell:

Let X be ((U-12)*64/255)-23.  If the payload size P is less than
or equal to X then the entire payload is stored on the b-tree page.
Let M be ((U-12)*32/255)-23 and let K be M+((P-M)%(U-4)).
If P is greater than X then the number
of bytes stored on the index b-tree page is K if K is less than or
equal to X or M otherwise.
The number of bytes stored on the index page is never less than M.



Here is an alternative description of the same computation:


X is U-35 for table btree leaf pages or
    ((U-12)*64/255)-23 for index pages.
M is always ((U-12)*32/255)-23.
Let K be M+((P-M)%(U-4)).
If P&lt;=X then all P bytes of payload are stored directly on the 
    btree page without overflow.
If P&gt;X and K&lt;=X then the first K bytes of P are stored on the 
    btree page and the remaining P-K bytes are stored on overflow pages.
If P&gt;X and K&gt;X then the first M bytes of P are stored on the
    btree page and the remaining P-M bytes are stored on overflow pages.


The overflow thresholds are designed to give a minimum fanout of
4 for index b-trees and to make sure enough of the payload
is on the b-tree page that the record header can usually be accessed
without consulting an overflow page.  In hindsight, the designer of
the SQLite b-tree logic realized that these thresholds could have been
made much simpler.  However, the computations cannot be changed
without resulting in an incompatible file format.  And the current computations
work well, even if they are a little complex.



1.7. Cell Payload Overflow Pages

When the payload of a b-tree cell is too large for the b-tree page,
the surplus is spilled onto overflow pages.  Overflow pages form a linked
list.  The first four bytes of each overflow page are a big-endian
integer which is the page number of the next page in the chain, or zero
for the final page in the chain.  The fifth byte through the last usable
byte are used to hold overflow content.

1.8. Pointer Map or Ptrmap Pages

Pointer map or ptrmap pages are extra pages inserted into the database
to make the operation of auto_vacuum and incremental_vacuum modes
more efficient.  Other page types in the database typically have pointers
from parent to child.  For example, an interior b-tree page contains pointers
to its child b-tree pages and an overflow chain has a pointer
from earlier to later links in the chain.  A ptrmap page contains linkage
information going in the opposite direction, from child to parent.

Ptrmap pages must exist in any database file which has a non-zero
largest root b-tree page value at offset 52 in the database header.
If the largest root b-tree page value is zero, then the database must not
contain ptrmap pages.

In a database with ptrmap pages, the first ptrmap page is page 2.
A ptrmap page consists of an array of 5-byte entries.  Let J be the
number of 5-byte entries that will fit in the usable space of a page.
(In other words, J=U/5.)  The first ptrmap page will contain back pointer
information for pages 3 through J+2, inclusive.  The second pointer map
page will be on page J+3 and that ptrmap page will provide back pointer
information for pages J+4 through 2*J+3 inclusive.  And so forth for
the entire database file.

In a database that uses ptrmap pages, all pages at locations identified
by the computation in the previous paragraph must be ptrmap page and no
other page may be a ptrmap page.  Except, if the byte-lock page happens to
fall on the same page number as a ptrmap page, then the ptrmap is moved
to the following page for that one case.

Each 5-byte entry on a ptrmap page provides back-link information about 
one of the pages that immediately follow the pointer map.  If page B is a
ptrmap page then back-link information about page B+1 is provided by
the first entry on theÍ pointer map.  Information about page B+2 is
provided by the second entry.  And so forth.

Each 5-byte ptrmap entry consists of one byte of "page type" information
followed by a 4-byte big-endian page number.  Five page types are recognized:



A b-tree root page.  The
page number should be zero.
A freelist page.  The page number should be
zero.
The first page of a
cell payload overflow chain.  The page number is the b-tree page that
contains the cell whose content has overflowed.
A page in an overflow chain
other than the first page.  The page number is the prior page of the
overflow chain.
A non-root b-tree page.  The
page number is the parent b-tree page.


In any database file that contains ptrmap pages, all b-tree root pages 
must come before any non-root b-tree page, cell payload overflow page, or
freelist page.  This restriction ensures that a root page will never
be moved during an auto-vacuum or incremental-vacuum.  The auto-vacuum
logic does not know how to update the root_page field of the sqlite_schema
table and so it is necessary to prevent root pages from being moved
during an auto-vacuum in order to preserve the integrity of the
sqlite_schema table.  Root pages are moved to the beginning of the
database file by the CREATE TABLE, CREATE INDEX, DROP TABLE, and
DROP INDEX operations.

2. Schema Layer

The foregoing text describes low-level aspects of the SQLite file
format.  The b-tree mechanism provides a powerful and efficient means of
accessing a large data set.  This section will describe how the
low-level b-tree layer is used to implement higher-level SQL
capabilities.



2.1. Record Format

The data for a table b-tree leaf page and the key
of an index b-tree page was characterized above
as an arbitrary sequence of bytes.
The prior discussion mentioned one key being less than another, but
did not define what "less than" meant.  The current section will address
these omissions.

Payload, either table b-tree data or index b-tree keys, 
is always in the "record format".
The record format defines a sequence of values corresponding
to columns in a table or index.  The record format specifies the number
of columns, the datatype of each column, and the content of each column.

The record format makes extensive use of the 
variable-length integer or varint
representation of 64-bit signed integers defined above.



A record contains a header and a body, in that order.  
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.  Following the size varint are
one or more additional varints, one per column.  These additional varints
are called "serial type" numbers and
determine the datatype of each column, according to the following chart:


Serial Type Codes Of The Record Format

Serial TypeContent SizeMeaning
00
Value is a NULL.
11
Value is an 8-bit twos-complement integer.
22
Value is a big-endian 16-bit twos-complement integer.
33
Value is a big-endian 24-bit twos-complement integer.
44
Value is a big-endian 32-bit twos-complement integer.
56
Value is a big-endian 48-bit twos-complement integer.
68
Value is a big-endian 64-bit twos-complement integer.
78
Value is a big-endian IEEE 754-2008 64-bit floating point number.
80
Value is the integer 0. (Only available for schema format 4 and higher.)
90
Value is the integer 1. (Only available for schema format 4 and higher.)
10,11
    variable
Reserved for internal use.  These serial type codes will
   never appear in a well-formed database file, but they
   might be used in transient and temporary database files
   that SQLite sometimes generates for its own use.
   The meanings of these codes can shift from one release
   of SQLite to the next.
N&#x2265;12 and even
    (N-12)/2
Value is a BLOB that is (N-12)/2 bytes in length.
N&#x2265;13 and odd
    (N-13)/2
Value is a string in the text encoding and (N-13)/2 bytes in length.
The nul terminator is not stored.


The header size varint
and serial type varints will usually consist of a singÎle byte.  The
serial type varints for large strings and BLOBs might extend to two or three
byte varints, but that is the exception rather than the rule. 
The varint format is very efficient at coding the record header.

The values for each column in the record immediately follow the header.
For serial types 0, 8, 9, 12, and 13, the value is zero bytes in
length.  If all columns are of these types then the body section of the
record is empty.

A record might have fewer values than the number of columns in the
corresponding table.  This can happen, for example, after an
ALTER TABLE ... ADD COLUMN SQL statement has increased
the number of columns in the table schema without modifying preexisting rows
in the table.
Missing values at the end of the record are filled in using the
default value for the corresponding columns defined in the table schema.



2.2. Record Sort Order

The order of keys in an index b-tree is determined by the sort order of
the records that the keys represent.  Record comparison progresses column
by column.  Columns of a record are examined from left to right.  The
first pair of columns that are not equal determines the relative order
of the two records.  The sort order of individual columns is as
follows:


NULL values (serial type 0) sort first.
Numeric values (serial types 1 through 9) sort after NULLs
      and in numeric order.
Text values (odd serial types 13 and larger) sort after numeric
    values in the order determined by the columns collating function.
BLOB values (even serial types 12 and larger) sort last and in the order 
    determined by memcmp().


A collating function for each column is necessary in order to compute
the order of text fields.
SQLite defines three built-in collating functions:



BINARY
     The built-in BINARY collation compares strings byte by byte
        using the memcmp() function
        from the standard C library.
NOCASE
     The NOCASE collation is like BINARY except that uppercase
        ASCII characters ('A' through 'Z')
        are folded into their lowercase equivalents prior to running the
        comparison.  Only ASCII characters are case-folded.
        NOCASE
        does not implement a general purpose unicode caseless comparison.
RTRIM
     RTRIM is like BINARY except that extra spaces at the end of either
         string do not change the result.  In other words, strings will
         compare equal to one another as long as they
         differ only in the number of spaces at the end.


Additional application-specific collating functions can be added to
SQLite using the sqlite3_create_collation() interface.

The default collating function for all strings is BINARY.
Alternative collating functions for table columns can be specified in the
CREATE TABLE statement using the COLLATE clause on the column definition.
When a column is indexed, the same collating function specified in the
CREATE TABLE statement is used for the column in the index, by default,
though this can be overridden using a COLLATE clause in the 
CREATE INDEX statement.



2.3. Representation Of SQL Tables

 Each ordinary SQL table in the database schema is represented on-disk
by a table b-tree.  Each entry in the table b-tree corresponds to a row
of the SQL table.  The rowid of the SQL table is the 64-bit signed
integer key for each entry in the table b-tree.

 The content of each SQL table row is stored in the database file by
first combining the values in the various columns into a byte array
in the record format, then storing that byte array as the payload in
an entry in the table b-tree.  The order of values in the record is
the same as the order of columns in the SQL table definition.
When an SQL table includes an
INTEGER PRIMARY KEY column (which aliases the rowid) then that
column appears in the record as a NULL value.  SQLite will always use
the table b-tree key rather than the NULL value when referencing the
INTEGER PRIMARY KEY column.

 If the affinity of a column is REAL and that column contains a
value that can be converted to an integer without loss of information
(Ïif the value contains no fractional part and is not too large to be
represented as an integer) then the column may be stored in the record
as an integer.  SQLite will convert the value back to floating
point when extracting it from the record.

2.4. Representation of WITHOUT ROWID Tables

If an SQL table is created using the "WITHOUT ROWID" clause at the
end of its CREATE TABLE statement, then that table is a WITHOUT ROWID
table and uses a different on-disk representation.  A WITHOUT ROWID
table uses an index b-tree rather than a table b-tree for storage.
The key for each entry in the WITHOUT ROWID b-tree is a record composed
of the columns of the PRIMARY KEY followed by all remaining columns of
the table.  The primary key columns appear in the order that they were
declared in the PRIMARY KEY clause and the remaining columns appear in
the order they occur in the CREATE TABLE statement.

Hence, the content encoding for a WITHOUT ROWID table is the same
as the content encoding for an ordinary rowid table, except that the
order of the columns is rearranged so that PRIMARY KEY columns come
first, and the content is used as the key in an index b-tree rather
than as the data in a table b-tree.
The special encoding rules for columns with REAL affinity
apply to WITHOUT ROWID tables the same as they do with rowid tables.

2.4.1. Suppression of redundant columns in the PRIMARY KEY
    of WITHOUT ROWID tables

If the PRIMARY KEY of a WITHOUT ROWID tables uses the same columns
with the same collating sequence more than once, then the second and
subsequent occurrences of that column in the PRIMARY KEY definition are
ignored.  For example, the following CREATE TABLE statements all specify
the same table, which will have the exact same representation on disk:


CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,c)) WITHOUT ROWID);
CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,c,a,c)) WITHOUT ROWID);
CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,A,a,C)) WITHOUT ROWID);
CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,a,a,a,c)) WITHOUT ROWID);


The first example above is the preferred definition of the table,
of course.  All of the examples create a WITHOUT ROWID table with
two PRIMARY KEY columns, "a" and "c", in that order, followed by
two data columns "b" and "d", also in that order.

2.5. Representation Of SQL Indices

Each SQL index, whether explicitly declared via a CREATE INDEX statement
or implied by a UNIQUE or PRIMARY KEY constraint, corresponds to an 
index b-tree in the database file.
Each entry in the index b-tree corresponds to a single row in the 
associated SQL table.
The key to an index b-tree is
a record composed of the columns that are being indexed followed by the
key of the corresponding table row.  For ordinary tables, the row key is
the rowid, and for WITHOUT ROWID tables the row key is the PRIMARY KEY.
Because every row in the table has a unique row key,
all keys in an index are unique.

In a normal index, there is a one-to-one mapping between rows in a 
table and entries in each index associated with that table.
However, in a partial index, the index b-tree only contains entries
corresponding to table rows for which the WHERE clause expression on the
CREATE INDEX statement is true.
Corresponding rows in the index and table b-trees share the same rowid
or primary key values and contain the same value for all indexed columns.

2.5.1. Suppression of redundant columns in WITHOUT ROWID secondary indexes


 In an index on a WITHOUT ROWID table, if a column of the PRIMARY KEY
is also a column in the index and has a matching collating sequence, then the
indexed column is not repeated in the table-key suffix on the
end of the index record.  As an example, consider the following SQL:


CREATE TABLE ex25(a,b,c,d,e,PRIMARY KEY(d,c,a)) WITHOUT rowid;
CREATE INDEX ex25ce ON ex25(c,e);
CREATE INDEX ex25acde ON ex25(a,c,d,e);
CREATE INDEX ex25ae ON ex25(a COLLATE nocase,e);


Each row in the ex25ce index is a record
with these columns: c, e, d, a.  The first two columns are
the columns being indexed, c and e.  The remaining columns are the primary
key of the corrÐesponding table row.  Normally, the primary key would be
columns d, c, and a, but because column c already appears earlier in the
index, it is omitted from the key suffix.

In the extreme case where the columns being indexed cover all columns
of the PRIMARY KEY, the index will consist of only the columns being
indexed.  The ex25acde example above demonstrates this.  Each entry in
the ex25acde index consists of only the columns a, c, d, and e, in that
order.

Each row in ex25ae contains five columns: a, e, d, c, a.  The "a"
column is repeated since the first occurrence of "a" has a collating
function of "nocase" and the second has a collating sequence of "binary".
If the "a" column is not repeated and if the table contains two or more
entries with the same "e" value and where "a" differs only in case, then
all of those table entries would correspond to a single entry in the
index, which would break the one-to-one correspondence between the table
and the index.

 The suppression of redundant columns in the key suffix of an index
entry only occurs in WITHOUT ROWID tables.  In an ordinary rowid table,
the index entry always ends with the rowid even if the INTEGER PRIMARY KEY
column is one of the columns being indexed.



2.6. Storage Of The SQL Database Schema

Page 1 of a database file is the root page of a table b-tree that
holds a special table named "sqlite_schema".  This b-tree is known
as the "schema table" since it stores the complete
database schema.  The structure of the sqlite_schema table is as
if it had been created using the following SQL:


CREATE TABLE sqlite_schema(
  type text,
  name text,
  tbl_name text,
  rootpage integer,
  sql text
);


The sqlite_schema table contains one row for each table, index, view,
and trigger (collectively "objects") in the database schema, except there
is no entry for the sqlite_schema table itself.  The sqlite_schema table
contains entries for internal schema objects in addition to application-
and programmer-defined objects.


The sqlite_schema.type column will be one
of the following text strings:  'table', 'index', 'view', or 'trigger'
according to the type of object defined.  The 'table' string is used
for both ordinary and virtual tables.

The sqlite_schema.name column will hold the name of the object.
UNIQUE and PRIMARY KEY constraints on tables cause SQLite to create
internal indexes with names of the form "sqlite_autoindex_TABLE_N"
where TABLE is replaced by the name of the table that contains the
constraint and N is an integer beginning with 1 and increasing by one
with each constraint seen in the table definition.
In a WITHOUT ROWID table, there is no sqlite_schema entry for the
PRIMARY KEY, but the "sqlite_autoindex_TABLE_N" name is set aside
for the PRIMARY KEY as if the sqlite_schema entry did exist.  This
will affect the numbering of subsequent UNIQUE constraints.
The "sqlite_autoindex_TABLE_N" name is never allocated for an
INTEGER PRIMARY KEY, either in rowid tables or WITHOUT ROWID tables.


The sqlite_schema.tbl_name column holds the name of a table or view
that the object is associated with.  For a table or view, the
tbl_name column is a copy of the name column.  For an index, the tbl_name
is the name of the table that is indexed.  For a trigger, the tbl_name
column stores the name of the table or view that causes the trigger 
to fire.

The sqlite_schema.rootpage column stores the page number of the root
b-tree page for tables and indexes.  For rows that define views, triggers,
and virtual tables, the rootpage column is 0 or NULL.

The sqlite_schema.sql column stores SQL text that describes the
object.  This SQL text is a CREATE TABLE, CREATE VIRTUAL TABLE,
CREATE INDEX,
CREATE VIEW, or CREATE TRIGGER statement that if evaluated against
the database file when it is the main database of a database connection
would recreate the object.  The text is usually a copy of the original
statement used to create the object but with normalizations applied so
that the text conforms to the following rules:


The CREATE, TABLE, VIEW, TRIGGER, and INDEX keywords at theÑ beginning
of the statement are converted to all upper case letters.
The TEMP or TEMPORARY keyword is removed if it occurs after the 
initial CREATE keyword.
Any database name qualifier that occurs prior to the name of the
object being created is removed.
Leading spaces are removed.
All spaces following the first two keywords are converted into a single
space.


The text in the sqlite_schema.sql column is a copy of the original
CREATE statement text that created the object, except normalized as
described above and as modified by subsequent ALTER TABLE statements.
The sqlite_schema.sql is NULL for the internal indexes that are
automatically created by UNIQUE or PRIMARY KEY constraints.

2.6.1. Alternative Names For The Schema Table

The name "sqlite_schema" does not appear anywhere in the file format.
That name is just a convention used by the database implementation.
Due to historical and operational considerations, the
"sqlite_schema" table can also sometimes be called by one of the
following aliases:


 sqlite_master
 sqlite_temp_schema
 sqlite_temp_master


Because the name of the schema table does not appear anywhere in
the file format, the meaning of the database file is not changed if
the application chooses to refer to the schema table by one of
these alternative names.



2.6.2. Internal Schema Objects

In addition to the tables, indexes, views, and triggers created by
the application and/or the developer using CREATE statements SQL, the
sqlite_schema table may contain zero or more entries for 
internal schema objects that are created by SQLite for its 
own internal use.  The names of internal schema objects
always begin with "sqlite_" and any table, index, view, or trigger
whose name begins with "sqlite_" is an internal schema object.
SQLite prohibits applications from creating objects whose names begin
with "sqlite_".  

Internal schema objects used by SQLite may include the following:


Indices with names of the form "sqlite_autoindex_TABLE_N" that
       are used to implement UNIQUE and PRIMARY KEY constraints on
       ordinary tables.

A table with the name "sqlite_sequence" that is used to keep track
       of the maximum historical INTEGER PRIMARY KEY for a table
       using AUTOINCREMENT.

Tables with names of the form "sqlite_statN" where N is an integer.
       Such tables store database statistics gathered by the ANALYZE
       command and used by the query planner to help determine the best
       algorithm to use for each query.


New internal schema objects names, always beginning with "sqlite_",
may be added to the SQLite file format in future releases.



2.6.3. The sqlite_sequence table

The sqlite_sequence table is an internal table used to help implement
AUTOINCREMENT.  The sqlite_sequence table is created automatically
whenever any ordinary table with an AUTOINCREMENT integer primary
key is created.  Once created, the sqlite_sequence table exists in the
sqlite_schema table forever; it cannot be dropped.
The schema for the sqlite_sequence table is:


CREATE TABLE sqlite_sequence(name,seq);


There is a single row in the sqlite_sequence table for each ordinary
table that uses AUTOINCREMENT.  The name of the table (as it appears in
sqlite_schema.name) is in the sqlite_sequence.name field and the largest
INTEGER PRIMARY KEY ever inserted into that table is 
in the sqlite_sequence.seq field.  
New automatically generated integer primary keys for AUTOINCREMENT
tables are guaranteed to be larger than the sqlite_sequence.seq field for
that table.
If the sqlite_sequence.seq field of an AUTOINCREMENT table is already at
the largest integer value (9223372036854775807) then attempts to add new
rows to that table with an automatically generated integer primary will fail
with an SQLITE_FULL error.
The sqlite_sequence.seq field is automatically updated if required when
new entries are inserted to an AUTOINCREMENT table.  
The sqlite_sequence row for an AUTOINCREMENT table is automatically deleted
when the table is dropped.
If the sqlite_sequence row for an AUTOINCREMENT table does not exist when
the AUÒTOINCREMENT table is updated, then a new sqlite_sequence row is created.
If the sqlite_sequence.seq value for an AUTOINCREMENT table is manually 
set to something other than an integer and there is a subsequent attempt to
insert the or update the AUTOINCREMENT table, then the behavior is undefined.

Application code is allowed to modify the sqlite_sequence table, to add
new rows, to delete rows, or to modify existing rows.  However, application
code cannot create the sqlite_sequence table if it does not already exist.
Application code can delete all entries from the sqlite_sequence table,
but application code cannot drop the sqlite_sequence table.



2.6.4. The sqlite_stat1 table

The sqlite_stat1 is an internal table created by the ANALYZE command
and used to hold supplemental information about tables and indexes that the
query planner can use to help it find better ways of performing queries.
Applications can update, delete from, insert into or drop the sqlite_stat1
table, but may not create or alter the sqlite_stat1 table.
The schema of the sqlite_stat1 table is as follows:


CREATE TABLE sqlite_stat1(tbl,idx,stat);


 There is normally one row per index, with the index identified by the
name in the sqlite_stat1.idx column.  The sqlite_stat1.tbl column is
the name of the table to which the index belongs.  In each such row, 
the sqlite_stat.stat column will be
a string consisting of a list of integers followed by zero or more 
arguments.  The first integer in this
list is the approximate number of rows in the index.  (The number of
rows in the index is the same as the number of rows in the table,
except for partial indexes.)
The second integer is the approximate number of rows in the index
that have the same value in the first column of the index.  The third 
integer is the 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 estimated 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 arguments, each of which is a sequence of non-space characters.
All arguments are preceded by a single space.
Unrecognized arguments are silently ignored.

If the "unordered" argument is present, then the query planner assumes
that the index is unordered and will not use the index for a range query
or for sorting.

The "sz=NNN" argument (where NNN represents a sequence of 1 or more digits)
means that the average row size over all records of the table or
index is NNN bytes per row.  The SQLite query planner might use the
estimated row size information provided by the "sz=NNN" token
to help it choose smaller tables and indexes that require less disk I/O.

The presence of the "noskipscan" token on the sqlite_stat1.stat field
of an index prevents that index from being used with the
skip-scan optimization.

New text tokens may be added to the end of the stat column in future
enhancements to SQLite.  For compatibility, unrecognized tokens at the end
of the stat column are silently ignored.

If the sqlite_stat1.idx column is NULL, then the sqlite_stat1.stat
column contains a single integer which is the approximate number of
rows in the table identified by sqlite_stat1.tbl.
If the sqlite_stat1.idx column is the same as the sqlite_stat1.tbl
column, then the table is a WITHOUT ROWID table and the sqlite_stat1.stat
field contains information about the index btree that implements the
WITHOUT ROWID table.



2.6.5. The sqlite_stat2 table

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 (2009-09-11) and 3.7.8 (2011-09-19).
The sqlite_stat2 table is neither read nor written by any
version of SQLite before 3.6.18 nor after 3.7.8.
The sqlite_stat2 table contains additional information
about the distribution of keys within an index.
The schema of the sqliteÓ_stat2 table is as follows:


CREATE TABLE sqlite_stat2(tbl,idx,sampleno,sample);


The sqlite_stat2.idx column and the sqlite_stat2.tbl column in each 
row of the sqlite_stat2 table identify an index described by that row.
There are usually 10 rows in the sqlite_stat2
table for each index.

The sqlite_stat2 entries for an index that have sqlite_stat2.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 C be the number of rows in the index.
Then the sampled rows are given by


     rownumber = (i*C*2 + C)/20


The variable i in the previous expression varies between 0 and 9.
Conceptually, the index space is divided into
10 uniform buckets and the samples are the middle row from each bucket.

The format for sqlite_stat2 is recorded here for legacy reference.  
Recent versions of SQLite no longer support sqlite_stat2 and the
sqlite_stat2 table, if is exists, is simply ignored.



2.6.6. The sqlite_stat3 table

The sqlite_stat3 is only used if SQLite is compiled
with SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4
and if the SQLite version number is 3.7.9 (2011-11-01) or greater.
The sqlite_stat3 table is neither read nor written by any
version of SQLite before 3.7.9.
If the SQLITE_ENABLE_STAT4 compile-time option is used and the
SQLite version number is 3.8.1 (2013-10-17) or greater,
then sqlite_stat3 might be read but not written.
The sqlite_stat3 table contains additional information
about the distribution of keys within an index, information that the
query planner can use to devise better and faster query algorithms.
The schema of the sqlite_stat3 table is as follows:


CREATE TABLE sqlite_stat3(tbl,idx,nEq,nLt,nDLt,sample);


There are usually multiple entries in the sqlite_stat3 table for each index.
The sqlite_stat3.sample column holds the value of the left-most field of an
index identified by sqlite_stat3.idx and sqlite_stat3.tbl.
The sqlite_stat3.nEq column holds the approximate
number of entries in the index whose left-most column exactly matches
the sample.
The sqlite_stat3.nLt holds the approximate number of entries in the
index whose left-most column is less than the sample.
The sqlite_stat3.nDLt column holds the approximate
number of distinct left-most entries in the index that are less than
the sample.

There can be an arbitrary number of sqlite_stat3 entries per index.
The ANALYZE command will typically generate sqlite_stat3 tables
that contain between 10 and 40 samples that are distributed across
the key space and with large nEq values.

In a well-formed sqlite_stat3 table, the samples for any single
index must appear in the same order that they occur in the index.  
In other words, if the entry with left-most column S1 is earlier in
the index b-tree than the
entry with left-most column S2, then in the sqlite_stat3 table, 
sample S1 must have a smaller rowid than sample S2.



2.6.7. The sqlite_stat4 table

The sqlite_stat4 is only created and is only used if SQLite is compiled
with SQLITE_ENABLE_STAT4 and if the SQLite version number is
3.8.1 (2013-10-17) or greater.
The sqlite_stat4 table is neither read nor written by any
version of SQLite before 3.8.1.
The sqlite_stat4 table contains additional information
about the distribution of keys within an index or the distribution of
keys in the primary key of a WITHOUT ROWID table.
The query planner can sometimes use the additional information in
the sqlite_stat4 table to devise better and faster query algorithms.
The schema of the sqlite_stat4 table is as follows:


CREATE TABLE sqlite_stat4(tbl,idx,nEq,nLt,nDLt,sample);


There are typically between 10 to 40 entries in the sqlite_stat4 table for
each index for which statistics are available, however these limits are
not hard bounds.
The meanings of the columns in the sqlite_stat4 table are as follows:



tbl:
    The sqlite_stat4.tbl column holds name of the table that owns
    the index that the row describes

idx:
    The sqlite_stat4.idx column holds name of the index that the
    row describes, or in the case of
    an sqlÔite_stat4 entry for a WITHOUT ROWID table, the
    name of the table itself.

sample:
    The sqlite_stat4.sample column holds a BLOB
    in the record format that encodes the indexed columns followed by
    the rowid for a rowid table or by the columns of the primary key 
    for a WITHOUT ROWID table.
    The sqlite_stat4.sample BLOB for the WITHOUT ROWID table itself 
    contains just the columns of the primary key.
    Let the number of columns encoded by the sqlite_stat4.sample blob be N.
    For indexes on an ordinary rowid table, N will be one more than the number 
    of columns indexed.
    For indexes on WITHOUT ROWID tables, N will be the number of columns
    indexed plus the number of columns in the primary key.
    For a WITHOUT ROWID table, N will be the number of columns in the
    primary key.

nEq:
    The sqlite_stat4.nEq column holds a list of N integers where 
    the K-th integer is the approximate number of entries in the index
    whose left-most K columns exactly match the K left-most columns
    of the sample.

nLt:
    The sqlite_stat4.nLt column holds a list of N integers where
    the K-th integer is the approximate number of entries in the
    index whose K left-most columns are collectively less than the 
    K left-most columns of the sample.

nDLt:
    The sqlite_stat4.nDLt column holds a list of N integers where
    the K-th integer is the approximate
    number of entries in the index that are distinct in the first K columns and
    where the left-most K columns are collectively less than the left-most
    K columns of the sample.



The sqlite_stat4 is a generalization of the sqlite_stat3 table.  The
sqlite_stat3 table provides information about the left-most column of an
index whereas the sqlite_stat4 table provides information about all columns
of the index.

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 that are distributed across
the key space and with large nEq values.

In a well-formed sqlite_stat4 table, the samples for any single
index must appear in the same order that they occur in the index.  
In other words, if entry S1 is earlier in the index b-tree than 
entry S2, then in the sqlite_stat4 table, sample S1 must have a
smaller rowid than sample S2.



3. The Rollback Journal

The rollback journal is a file associated with each SQLite database
file that holds information used to restore the database file to its initial
state during the course of a transaction.
The rollback journal file is always located in the same 
directory as the database
file and has the same name as the database file but with the string
"-journal" appended.  There can only be a single rollback journal
associated with a give database and hence there can only be one write
transaction open against a single database at one time.

If a transaction is aborted due to an application crash, an operating
system crash, or a hardware power failure or crash, then the database may
be left in an inconsistent state.  The next time SQLite attempts to open
the database file, the presence of the rollback journal file will be 
detected and the journal will be automatically played back to restore the
database to its state at the start of the incomplete transaction.

A rollback journal is only considered to be valid if it exists and
contains a valid header.  Hence a transaction can be committed in one
of three ways:

The rollback journal file can be deleted,
The rollback journal file can be truncated to zero length, or
The header of the rollback journal can be overwritten with
invalid header text (for example, all zeros).


These three ways of committing a transaction correspond to the DELETE,
TRUNCATE, and PERSIST settings, respectively, of the journal_mode pragma.



A valid rollback journal begins with a header in the following format:


Rollback Journal Header Format

OffsetSizeDescription
0
    8
    Header string:  0xd9, 0xd5, 0x05, 0xf9, 0x20, 0xa1, 0x63, 0xd7
8
    4
    The "Page Count" -Õ The number of pages in the next segment of the 
        journal, or -1 to
        mean all content to the end of the file
12
    4
    A random nonce for the checksum
16
    4
    Initial size of the database in pages
20
    4
    Size of a disk sector assumed by the process that wrote this
        journal.
24
    4
    Size of pages in this journal.



A rollback journal header is padded with zeros out to the size of a 
single sector (as defined by the sector size integer at offset 20).
The header is in a sector by itself so that if a power loss occurs while
writing the sector, information that follows the header will be
(hopefully) undamaged.

After the header and zero padding are zero or more page records.  Each
page record stores a copy of the content of a page from the database file
before it was changed.  The same page may not appear more than once
within a single rollback journal.
To rollback an incomplete transaction, a process
has merely to read the rollback journal from beginning to end and
write pages found in the journal back into the database file at the
appropriate location.

Let the database page size (the value of the integer at offset 24 
in the journal header) be N.
Then the format of a page record is as follows:


Rollback Journal Page Record Format

OffsetSizeDescription
0
    4
    The page number in the database file
4
    N
    Original content of the page prior to the start of the transaction
N+4
    4
    Checksum




The checksum is an unsigned 32-bit integer computed as follows:


Initialize the checksum to the checksum nonce value found in the
journal header at offset 12.
Initialize index X to be N-200 (where N is the size of a database page
in bytes.
Interpret the byte at offset X into the page as an 8-bit unsigned integer
 and add the value of that integer to the checksum.
Subtract 200 from X.
If X is greater than or equal to zero, go back to step 3.


The checksum value is used to guard against incomplete writes of
a journal page record following a power failure.  A different random nonce
is used each time a transaction is started in order to minimize the risk
that unwritten sectors might by chance contain data from the same page
that was a part of prior journals.  By changing the nonce for each
transaction, stale data on disk will still generate an incorrect checksum
and be detected with high probability.  The checksum only uses a sparse sample
of 32-bit words from the data record for performance reasons - design studies 
during the planning phases of SQLite 3.0.0 showed
a significant performance hit in checksumming the entire page.

Let the page count value at offset 8 in the journal header be M.
If M is greater than zero then after M page records the journal file
may be zero padded out to the next multiple of the sector size and another
journal header may be inserted.  All journal headers within the same
journal must contain the same database page size and sector size.

If M is -1 in the initial journal header, then the number of page records
that follow is computed by computing how many page records will fit in
the available space of the remainder of the journal file.



4. The Write-Ahead Log

Beginning with version 3.7.0 (2010-07-21), 
SQLite supports a new transaction
control mechanism called "write-ahead log" or "WAL".
When a database is in WAL mode, all connections to that database must
use the WAL.  A particular database will use either a rollback journal
or a WAL, but not both at the same time.
The WAL is always located in the same directory as the database
file and has the same name as the database file but with the string
"-wal" appended.

4.1. 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 bacÖk into the database file in an operation called a
"checkpoint".

A single WAL file can be reused 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:


WAL Header Format

OffsetSizeDescription
04
    Magic number.  0x377f0682 or 0x377f0683
44
    File format version.  Currently 3007000.
84
    Database page size.  Example: 1024
124
    Checkpoint sequence number
164
    Salt-1: random integer incremented with each checkpoint
204
    Salt-2: a different random number for each checkpoint
244
    Checksum-1: First part of a checksum on the first 24 bytes of header
284
    Checksum-2: Second part of the checksum on the 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 page-size bytes
of page data. The frame-header is six big-endian 32-bit unsigned 
integer values, as follows:


WAL Frame Header Format

OffsetSizeDescription
04
    Page number
44
    For commit records, the size of the database file in pages
        after the commit.  For all other records, zero.
84
    Salt-1 copied from the WAL header
124
    Salt-2 copied from the WAL header
164
    Checksum-1:  Cumulative checksum up through and including this page
204
    Checksum-2:  Second half of the cumulative checksum.



A frame is considered valid if and only if the following conditions are
true:


The salt-1 and salt-2 values in the frame-header match
       salt values in the wal-header

The checksum values in the final 8 bytes of the frame-header
       exactly match the checksum computed consecutively on the
       first 24 bytes of the WAL header and the first 8 bytes and
       the content of all frames
       up to and including the current frame.




4.2. Checksum Algorithm

The checksum is computed by interpreting the input as
an even number of unsigned 32-bit integers: x(0) through x(N).
The 32-bit integers are big-endian if the
magic number in the first 4 bytes of the WAL header is 0x377f0683 and
the integers are 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 algorithm only works for content which is a multiple of
8 bytes in length.  In other words, if the inputs are x(0) through x(N)
then N must be odd.
The checksum algorithm is as follows:

 
s0 = s1 = 0
for i from 0 to n-1 step 2:
   s0 += x(i) + s1;
   s1 += x(i+1) + s0;
endfor
# result in s0 and s1


The outputs 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 integer
terms of the sequence whereas s0 omits the final term.

4.3. Checkpoint Algorithm

On a checkpoint, the WAL is first flushed to persistent storage using
the xSync method of the VFS. 
Then valid content of the WAL is transferred into the database file.
Finally, the database is flushed to persistent storage using another
xSync method call.
The xSync operations serve as write barriers - all writes launched
before the xSync must complete before any write that launches after the
xSync begins.

A checkpoint need not run to completion.  It might be that some
readers are still using older transactions with data that is contained
in the database file.  In that case, transferring content for newer
transactions from the WAL file into the database would delete the content
out from under readers still using the older transactions.  To avoid that,
checkpoints only run to completion if all reader are using the
last transaction in the WAL.



4.4. WAL Reset

After a complete checkpoint, if no other connections are in transactions
that use the WAL, then subsequent write transactions can
overwrite the WAL file from the beginning.  This is called "resetting the
WAL".  At the start of the first new
write transaction, the WAL header salt-1 value is incremented
and the salt-2 value is randomized.  These changes to the salts invalidate
old frames in the WAL that have already been checkpointed but not yet
overwritten, and prevent them from being checkpointed again.

The WAL file can optionally be truncated on a reset, but it need not be.
Performance is usually a little better if the WAL is not truncated, since
filesystems generally will overwrite an existing file faster than they
will grow a file.



4.5. 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 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 number of value
frames in the WAL as "mxFrame".  (More detail)
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 subsequently appended content, the reader 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.



4.6. WAL-Index Format

Conceptually, the wal-index is shared memory, though the current
VFS implementations use a memory-mapped file for operating-system
portability.  The memory-mapped
file is in the same directory as the database and has the same name
as the database with a "-shm" suffix appended.  Because
the wal-index is shared memory, SQLite does not support 
journal_mode=WAL 
on a network filesystem when clients are on different machines, as
all clients of the database must be able to share the same memory.

The purpose of the wal-index is to answer this question quickly:


Given a page number P and a maximum WAL frame index M,
return the largest WAL frame index for page P that does not exceed M, 
or return NULL if there are no frames for page P that do not exceed M.


The M value in the previous paragraph is the "mxFrame" value
defined in section 4.4 that is read at the start 
of a transaction and which defines the maximum frame from the WAL that 
the reader will use.

The wal-index is transient.  After a crash, the wal-index is
reconstructed from the original WAL file.  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 stores multi-byte values in the native
byte order of the host computer.

This document is concerned with the persistent state of the database
file, and since the wal-index is a transient structure, no further 
information about the format of the wal-index will be provided here.
Additional details on the format of the wal-index are contained in
the separate WAL-index File Format document.
This page last modified on  2022-08-10 18:45:48 UTCfileformat.html
##„ƒ 
5‰ýC+Database File FormatThis document describes and defines the on-disk database file
format used by all releases of SQLite since 
version 3.0.0 (2004-06-18).

1. The Database File

The complete state of an SQLite database is usually
contained in a single file on disk called the "main database file".

During a transaction, SQLite stores additional information 
in a second file called the "rollback journal", or if SQLite is in
WAL mode, a write-ahead log file.



1.1. Hot Journals
If the application or
host computer crashes before the transaction completes, then the rollback
journal or write-ahead log contains information needed 
to restore the main database file to a consistent state.  When a rollback 
journal or write-ahead log contains information necessary for recovering 
the state of the database, they are called a "hot journal" or "hot WAL file".
Hot journals and WAL files are only a factor during error recovery
scenarios and so are uncommon, but they are part of the state of an SQLite
database and so cannot be ignored.  This document defines the format
of a rollback journal and the write-ahead log file, but the focus is
on the main database file.

1.2. Pages

The main database file consists of one or more pages.  The size of a
page is a power of two between 512 and 65536 inclusive.  All pages within
the same database are the same size.  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.

Pages are numbered beginning with 1.  The maximum page number is
4294967294 (232 - 2).  The minimum size
SQLite database is a single 512-byte page.
The maximum size database would be 2147483646 pages at 65536 bytes per
page or 281,474,976,579,584 bytes (about 281 terabytes).  Usually SQLite will
hit the maximum file size limit of the underlying filesystem or disk
hardware long before it hits its own internal size limit.

In common use, SQLite databases tend to range in size from a few kilobytes
to a few gigabytes, though terabyte-size SQLite databases are known to exist
in production.

At any point in time, every page in the main database has a single
use which is one of the following:

The lock-byte page
A freelist page

A freelist trunk page
A freelist leaf page

A b-tree page

A table b-tree interior page
A table b-tree leaf page
An index b-tree interior page
An index b-tree leaf page

A payload overflow page
A pointer map page



All reads from and writes to the main database file begin at a page
boundary and all writes are an integer number of pages in size.  Reads
are also usually an integer number of pages in size, with the one exception
that when the database is first opened, the first 100 bytes of the
database file (the database file header) are read as a sub-page size unit.

Before any information-bearing page of the database is modified, 
the original unmodified content of that page is written into the 
rollback journal.  If a transaction is interrupted and needs to be 
rolled back, the rollback journal can then be used to restore the
database to its original state.  Freelist leaf pages bear no
information that would need to be restored on a rollback and so they
are not written to the journal prior to modification, in order to
reduce disk I/O.



1.3. The Database Header

The first 100 bytes of the database file comprise the database file 
header.  The database file header is divided into fields as shown by
the table below.  All multibyte fields in the database file header are
stored with the most significant byte first (big-endian).


Database Header Format

OffsetSizeDescription
016
The header string: "SQLite format 3\000"
162
The database page size in bytes.  Must be a power of two between 512
and 32768 inclusive, or the value 1 representing a page size of 65536.
181
File format write version.  1 for legacy; 2 for WAL.
191
File format read version.  1 for legacy; 2 for WAL.
201
Bytes of unused "reserved" space at the end of each page.  Usually 0.
211
Maximum embedded payload frÄng that ".eqp full" does
and also turns on VDBE tracing.



Use compile-time options to enable debugging features.

Suggested compile-time options include:

-DSQLITE_DEBUG
-DSQLITE_ENABLE_EXPLAIN_COMMENTS
-DSQLITE_ENABLE_TREETRACE
-DSQLITE_ENABLE_WHERETRACE



The SQLITE_ENABLE_TREETRACE and SQLITE_ENABLE_WHERETRACE options
are not documented in compile-time options document because they
are not officially supported.  What they do is activate the
".treetrace" and ".wheretrace" dot-commands in the command-line
shell, which provide low-level tracing output for the logic that
generates code for SELECT and DML statements and WHERE clauses, respectively.


Call sqlite3ShowExpr() and similar from the debugger.

When compiled with SQLITE_DEBUG, SQLite includes routines that will
print out various internal abstract syntax tree structures as ASCII-art graphs.
This can be very useful in a debugging in order to understand the variables
that SQLite is working with.  The following routines are available:


  void sqlite3ShowExpr(const Expr*);
  void sqlite3ShowExprList(const ExprList*);
  void sqlite3ShowIdList(const IdList*);
  void sqlite3ShowSrcList(const SrcList*);
  void sqlite3ShowSelect(const Select*);
  void sqlite3ShowWith(const With*);
  void sqlite3ShowUpsert(const Upsert*);
  void sqlite3ShowTrigger(const Trigger*);
  void sqlite3ShowTriggerList(const Trigger*);
  void sqlite3ShowTriggerStep(const TriggerStep*);
  void sqlite3ShowTriggerStepList(const TriggerStep*);
  void sqlite3ShowWindow(const Window*);
  void sqlite3ShowWinFunc(const Window*);


These routines are not APIs and are subject to change.  They are
for interactive debugging use only.



Breakpoints on test_addoptrace

When debugging the bytecode generator, it is often useful to know
where a particular opcode is being generated.  To find this easily,
run the script in a debugger.  Set a breakpoint on the "test_addoptrace"
routine.  Then run the "PRAGMA vdbe_addoptrace=ON;" followed by the
SQL statement in question.  Each opcode will be displayed as it is
appended to the VDBE program, and the breakpoint will fire immediately
thereafter.  Step until reaching the opcode then look backwards
in the stack to see where and how it was generated.

This only works when compiled with SQLITE_DEBUG.



Using the ".treetrace" and ".wheretrace" shell commands

When the command-line shell and the core SQLite library are
both compiled with SQLITE_DEBUG and
SQLITE_ENABLE_TREETRACE and SQLITE_ENABLE_WHERETRACE, then the
shell has two commands used to turn on debugging facilities for the
most intricate parts of the code generator - the logic dealing with
SELECT statements and WHERE clauses, respectively.
The ".treetrace" and ".wheretrace" commands each take a numeric
argument which can be expressed in hexadecimal.  Each bit turns on
various parts of debugging.  Values of "0xfff" and "0xff" are commonly
used.  Use an argument of "0" to turn all tracing output back off.



Using the ".breakpoint" shell command

The ".breakpoint" command in the CLI does nothing but invoke the
procedure named "test_breakpoint()", which is a no-op.

If you have a script and you want to start debugging at some point
half-way through that script, simply set a breakpoint in gdb (or whatever
debugger you are using) on the test_breakpoint() function, and add a
".breakpoint" command where you want to stop.  When you reach that first
breakpoint, set whatever additional breakpoints are variable traces you
need.


Disable the lookaside memory allocator

When looking for memory allocation problems (memory leaks, use-after-free
errors, buffer overflows, etc) it is sometimes useful to disable the
lookaside memory allocator then run the test under valgrind or MSAN or
some other heap memory debugging tool.
The lookaside memory allocator can 
be disabled at start-time using the SQLITE_CONFIG_LOOKASIDE
interface.  The command-line shell will use that interface to
disable lookaside if it is started with the "--lookaside 0 0"
command line option.


This page last modified on  2022-04-06 18:55:14 UTCdebugging.html
  X£    Xæ7ƒ
EÌ%Run-Time Loadable Extensions1. Overview

SQLite has the ability to load extensions (including new
application-defined SQL functions,
collating sequences, virtual tables, and VFSes) at run-time.
This feature allows the code for extensions to be developed and
tested separately from the application and then loaded
on an as-needed basis.

Extensions can also be statically linked with the application.
The code template shown below will work just as well as a statically
linked extension as it does as a run-time loadable extension except that
you should give the entry point function ("sqlite3_extension_init")
a different name to avoid name collisions if your application contains
two or more extensions.

2. Loading An Extension

An SQLite extension is a shared library or DLL.  To load it, you
need to supply SQLite with thÚ¦Qƒ
        AÌM)Hints for Debugging SQLiteDebugging Hints


The following is a random assortment of techniques used by the
SQLite developers to trace, examine, and understand the behavior of the
core SQLite library.


These techniques are designed to aid in understanding the
core SQLite library itself, not applications that merely use SQLite.



Use the ".eqp full" option on the command-line shell

When you have a SQL script that you are debugging or trying
to understand, it is often useful to run it in the command-line shell
with the ".eqp full" setting.  When ".eqp" is set to FULL, the shell
automatically shows the EXPLAIN and EXPLAIN QUERY PLAN output for
each command prior to actually running that command.

For added readability, also set ".echo on" so that the output contains
the original SQL text.

The newer ".eqp trace" command does everythiØÛe name of the file containing the
shared library or DLL and an entry point to initialize the extension.
In C code, this information is supplied using the
sqlite3_load_extension() API.  See the documentation on that
routine for additional information.

Note that different operating systems use different filename
suffixes for their shared libraries.  Windows uses ".dll", Mac uses
".dylib", and most unixes other than mac use ".so".  If you want to
make your code portable, you can omit the suffix from the shared
library filename and the appropriate suffix will be added automatically
by the sqlite3_load_extension() interface.

There is also an SQL function that can be used to load extensions:
load_extension(X,Y).  It works just like the sqlite3_load_extension()
C interface.

Both methods for loading an extension allow you to specify
the name of an entry point for the extension.  
You can leave this argument blank - passing in
a NULL pointer for the sqlite3_load_extension() C-language interface
or omitting the second argument for the load_extension() SQL interface -
and the extension loader logic will attempt to figure out the entry point
on its own.  It will first try the generic extension name
"sqlite3_extension_init".  If that does not work, it constructs a
entry point using the template "sqlite3_X_init" where the X is replaced
by the lowercase equivalent of every ASCII character in the filename
after the last "/" and before the first following "." omitting the
first three characters if they happen to be "lib".  So, for example,
if the filename is "/usr/lib/libmathfunc-4.8.so" the entry point name
would be "sqlite3_mathfunc_init".  Or if the filename is 
"./SpellFixExt.dll" then the entry point would be called
"sqlite3_spellfixext_init".

For security reasons, extension loading is turned off by default.
In order to use either the C-language or SQL extension loading functions,
one must first enable extension loading using the
sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION,1,NULL)
C-language API in your application.

From the command-line shell, extensions can be loaded using the
".load" dot-command.  For example:


.load ./YourCode


Note that the command-line shell program has already enabled
extension loading for you (by calling the sqlite3_enable_load_extension()
interface as part of its setup) so the command above works without
any special switches, setup, or other complications.

The ".load" command with one argument invokes sqlite3_load_extension()
with the zProc parameter set to NULL, causing SQLite to first look for
an entry point named "sqlite3_extension_init" and then "sqlite3_X_init"
where "X" is derived from the filename.  If your extension has an entry
point with a different name, simply supply that name as the second
argument.  For example:


.load ./YourCode nonstandard_entry_point




3. Compiling A Loadable Extension

Loadable extensions are C-code.  To compile them on
most unix-like operating
systems, the usual command is something like this:


gcc -g -fPIC -shared YourCode.c -o YourCode.so


Macs are unix-like, but they do not follow the usual shared library
conventions.  To compile a shared library on a Mac, use a command like
this:


gcc -g -fPIC -dynamiclib YourCode.c -o YourCode.dylib


If when you try to load your library you get back an error message
that says "mach-o, but wrong architecture" then you might need to add
command-line options "-arch i386" or "arch x86_64" to gcc, depending
on how your application is built.

To compile on Windows using MSVC, a command similar to the following
will usually work:


cl YourCode.c -link -dll -out:YourCode.dll


To compile for Windows using MinGW, the command line is just like it
is for unix except that the output file suffix is changed to ".dll" and
the -fPIC argument is omitted:


gcc -g -shared YourCode.c -o YourCode.dll




4. Programming Loadable Extensions

A template loadable extension contains the following three elements:



Use "#include &lt;sqlite3ext.h&gt;" at the top of your source
code files instead of "#include &lt;sqlite3.h&gt;Ü".



Put the macro "SQLITE_EXTENSION_INIT1" on a line by itself 
right after the "#include &lt;sqlite3ext.h&gt;" line.



Add an extension loading entry point routine that looks like 
something the following:

#ifdef _WIN32
__declspec(dllexport)
#endif
int sqlite3_extension_init( /* &lt;== Change this name, maybe */
  sqlite3 *db, 
  char **pzErrMsg, 
  const sqlite3_api_routines *pApi
){
  int rc = SQLITE_OK;
  SQLITE_EXTENSION_INIT2(pApi);
  /* insert code to initialize your extension here */
  return rc;
}


You will do well to customize the name of your entry point to
correspond to the name of the shared library you will be generating,
rather than using the generic "sqlite3_extension_init" name.  Giving
your extension a custom entry point name will enable you to statically
link two or more extensions into the same program without a linker
conflict, if you later decide to use static linking rather than run-time
linking.
If your shared library ends up being named "YourCode.so" or
"YourCode.dll" or "YourCode.dylib" as shown in the compiler examples
above, then the correct entry point name would be
"sqlite3_yourcode_init".


Here is a complete template extension that you can copy/paste 
to get started:

/* Add your header comment here */
#include &lt;sqlite3ext.h&gt; /* Do not use &lt;sqlite3.h&gt;! */
SQLITE_EXTENSION_INIT1

/* Insert your extension code here */

#ifdef _WIN32
__declspec(dllexport)
#endif
/* TODO: Change the entry point name so that "extension" is replaced by
** text derived from the shared library filename as follows:  Copy every
** ASCII alphabetic character from the filename after the last "/" through
** the next following ".", converting each character to lowercase, and
** discarding the first three characters if they are "lib".
*/
int sqlite3_extension_init(
  sqlite3 *db, 
  char **pzErrMsg, 
  const sqlite3_api_routines *pApi
){
  int rc = SQLITE_OK;
  SQLITE_EXTENSION_INIT2(pApi);
  /* Insert here calls to
  **     sqlite3_create_function_v2(),
  **     sqlite3_create_collation_v2(),
  **     sqlite3_create_module_v2(), and/or
  **     sqlite3_vfs_register()
  ** to register the new features that your extension adds.
  */
  return rc;
}


4.1. Example Extensions

Many examples of complete and working loadable extensions can be 
seen in the SQLite source tree in the
ext/misc subdirectory.
Each file in that directory is a separate extension.  Documentation
is provided by a header comment on the file.
Here are brief notes on a few of the extensions in 
the ext/misc subdirectory:



carray.c &mdash;
Implementation of the carray table-valued function.

compress.c &mdash;
Implementation of application-defined SQL functions compress() and
uncompress() that do zLib compression of text or blob content.

json1.c &mdash;
Implementation of JSON SQL functions and table-valued functions.
This is a larger and more complex extension.

memvfs.c &mdash;
Implementation of a new VFS that stores all content in-memory.

rot13.c &mdash;
Implementation of a rot13() 
SQL function.  This is a very simple example of an extension function
and is useful as a template for creating new extensions.

series.c &mdash;
Implementation of the generate_series virtual table and
table-valued function.  This is a relatively simple example of a
virtual table implementation which can serve as a template for writing
new virtual tables.


Other and more complex extensions can be found in subfolders
under ext/ other than ext/misc/.



5. Persistent Loadable Extensions

The default behavior for a loadable extension is that it is unloaded
from process memory when the database connection that originally invoked
sqlite3_load_extension() closes.  (In other words, the xDlClose method
of the sqlite3_vfs object is called for all extensions when a database
connection closes.)  However, if the initialization procedure returns
SQLITE_OK_LOAD_PERMANENTLY instead of SQLITE_OK, then the extension will
not be unloaded (xDlClose will not be invoked) and the extension will remain
in process memory indefinitely.  The SQLITE_OK_LOAD_PERMANENTLY return
value is useful for extensions that want to register new VFSes.

To clarify: an extension for which the initialization function returns
SQLITE_OK_LOAD_PERMANENTLY continues to exist in memory after the database
connection closes.  However, the extension is not automatically
registered with subsequent database connections.  This makes it possible
to load extensions that implement new VFSes.
To persistently load and register an extension that implements new SQL
functions, collating sequences, and/or virtual tables, such that those
added capabilities are available to all subsequent database connections,
then the initialization routine should also invoke sqlite3_auto_extension()
on a subfunction that will register those services.

The vfsstat.c extension
show an example of a loadable extension that persistently registers both
a new VFS and a new virtual table.  The
sqlite3_vfsstat_init()
initialization routine in that extension is called only once, when the
extension is first loaded.  It registers the new "vfslog" VFS just that
one time, and it returns SQLITE_OK_LOAD_PERMANENTLY so that the code used
to implement the "vfslog" VFS will remain in memory. The initialization routine
also invokes sqlite3_auto_extension() on a pointer to the "vstatRegister()"
function so that all subsequent database connections will invoke the
"vstatRegister()" function as they start up, and hence register the
"vfsstat" virtual table.  

6. Statically Linking A Run-Time Loadable Extension

The exact same source code can be used for both a run-time loadable
shared library or DLL and as a module that is statically linked with your
application.  This provides flexibility and allows you to reuse the same
code in different ways.

To statically link your extension, simply add the -DSQLITE_CORE
compile-time option.  The SQLITE_CORE macro causes the SQLITE_EXTENSION_INIT1
and SQLITE_EXTENSION_INIT2 macros to become no-ops.  Then modify your
application to invoke the entry point directly, passing in a NULL pointer
as the third "pApi" parameter.

It is particularly important to use an entry point name that is
based on the extension filename, rather than the generic
"sqlite3_extension_init" entry point name, if you will be statically
linking two or more extensions.  If you use the generic name, there
will be multiple definitions of the same symbol and the link will fail.

If you will be opening multiple database connections in your application,
rather than invoking the extension entry points for each database
connection separately, you might want to consider using the
sqlite3_auto_extension() interface to register your extensions and
to cause them to be automatically started as each database connection
is opened.  You only have to register each extension once, and you can
do so near the beginning of your main() routine.  Using the
sqlite3_auto_extension() interface to register your extensions makes
your extensions work as if they were built into the core SQLite - they
automatically exist whenever you open a new database connection
without needing to be initialized.  Just be sure to complete any
configuration you need to accomplish using sqlite3_config() before
registering your extensions, since the sqlite3_auto_extension()
interface implicitly calls sqlite3_initialize().

7. Implementation Details

SQLite implements run-time extension loading using the
xDlOpen(), xDlError(), xDlSym(), and xDlClose() methods of the
sqlite3_vfs object.  These methods are implemented using
the dlopen() library on unix (which explains why SQLite commonly
needs to be linked against the "-ldl" library on unix systems)
and using LoadLibrary() API on Windows.  In a custom VFS for
unusual systems, these methods can all be omitted, in which case
the run-time extension loading mechanism will not work (though
you will still be able to statically link the extension code, assuming
the entry pointers are uniquely named).
SQLite can be compiled with
SQLITE_OMIT_LOAD_EXTENSION to omit the extension loading code
from the build.
This page last modified on  2022-03-08 04:52:03 UTCloadext.htmln choice) making a change to a single page in the database
now requires SQLite to backup three other adjacent pages to the rollback
journal, whereas formerly it only had to backup the one page that was
changing.  In WAL mode, each transaction had to be padded out to the
next 4096-byte boundary in the WAL file, rather than the next 512-byte
boundary, resulting in thousands of extra bytes being written
per transaction.

The extra write overhead prompted a reexamination of assumptions about
powersafe overwrite.  With modern disk drives, the capacity has become
so large and the data density so great that a single sector is very
small and writing a single sector takes very little time.  We know that
disk drives can detect an impending power loss and continue
to operate for some small amount of time on residual energy because those
drives are able to park their heads before spinning down.  And
so if an impending power loss is detectable by the disk controller, it
seems reasonable that the controller will finish writing
whatever sector it is current working on when the imminent power loss 
is first detected, prior to parking the heads, as long as doing so
does not take too long, which it should not with
small and dense sectors.  Hence it seems reasonable
to assume powersafe overwrite for modern disks.  Indeed, BerkeleyDB has
made this assumption for decades, we are told.  Caution is advised
though. As Roger Binns noted on the SQLite developers mailing list:
"'poorly written' should be the main assumption about drive firmware."



Torn Pages

A torn page occurs when a database page is larger than a disk sector,
the database page is written to disk, but a power loss occurs prior to
all sectors of the database page being written.  Then, upon recovery, part of
the database page will have the old content while some other parts of the
page will have the new content.  Some database engines assume that 
page writes are atomic and hence a torn page is an unrecoverable error.


SQLite never assumes that database page writes are atomic,
regardless of the PSOW setting.(1)
And hence SQLite is always able to automatically recover from torn pages
induced by a crash.  Enabling PSOW does not decrease SQLite's ability
to recover from a torn page.

Changes In SQLite Version 3.7.10

The VFS for SQLite version 3.7.10 (2012-01-16)
adds a new device characteristic 
named SQLITE_IOCAP_POWERSAFE_OVERWRITE.  Database files that report this
characteristic are assumed to reside on storage systems that have the
powersafe overwrite property.
The default unix and windows VFSes now report
SQLITE_IOCAP_POWERSAFE_OVERWRITE if SQLite is compiled with
-DSQLITE_POWERSAFE_OVERWRITE=1 or they
make the legacy assumption that storage does not have the powersafe
overwrite property if compiled with
-DSQLITE_POWERSAFE_OVERWRITE=0.
For now, the default is for powersafe overwrite to be turned on, though
we may revisit this in the future and default it off.

The powersafe overwrite property for individual databases can be
specified as the database is opened using the "psow" query parameter
with a URI filename.  For example, to always assume powersafe
overwrite for a file (perhaps to ensure maximum write performance), 
open it as


   file:somefile.db?psow=1


Or to be extra safe with a database and to force SQLite to assume the
database lacks powersafe overwrite, open it using


   file:somefile.db?psow=0


There is also a new SQLITE_FCNTL_POWERSAFE_OVERWRITE opcode for
the sqlite3_file_control() that allows
an application to query the powersafe overwrite property for a database
file.


Notes:

SQLite never assumes atomic page writes in its default configurations.
But a custom VFS can set one of the 
SQLITE_IOCAP_ATOMIC bits in the result of the xDeviceCharacteristic()
method and then SQLite will assume that page writes are atomic.  The
application must supply a custom VFS to accomplish this, however, since
none of the standard VFSes will ever set any of the atomic bits in the
xDeviceCharacteristics() vector.

This page last modified on  2016-09-14 18:40:10 UTCpsow.html
çç¼
ƒ        3÷]Powersafe OverwritePowersafe Overwrite

"Powersafe overwrite" is a term used by the SQLite team to describe
a behavior of some filesystems and disk-controllers related to
data preservation during a power loss.  Powersafe overwrite
is a boolean property: either the storage system has it or it does not.

We say that a system has the powersafe overwrite property if the following
statement is true:


  When an application writes a range of bytes in a file, no
  bytes outside of that range will change, even if the write occurs
  just before a crash or power failure.


The powersafe overwrite property says nothing about the state of the
bytes that were written.  Those bytes might contain their old values,
their new values, random values, or some combination of these.  The powersafe
overwrite property merely states that writes cannot change bytes outside
of the range of bytes written.

In other words, powersafe overwrite means that there is no "collateral
damage" when a power loss occurs while writing.  Only those bytes actually
being written might be damaged.

In practical terms, what the powersafe write property means is that when
the disk controller detects an impending power loss, it finishes writing
whatever sector it is working on prior to parking the heads.  It means that
individual sector writes will complete once started, even if
there is a power loss.

Consider what would happen if disk sector writes are interrupted
by a power loss.  If an application writes two or three bytes in the middle
of some file, the operating system will implement this by first reading
the entire sector containing those bytes, making the change to the
sector in memory, then writing the entire sector back to the disk.  If a power
loss occurs during the writeback and the sector was not completely written,
then on the next read after reboot, error correcting codes
in the sector will probably detect irreparable damage and the disk 
controller will read out the sector as all zeros or all ones.  Thus
values will have changed outside of the range of the two or three bytes 
that were written at the application level - a violation of the powersafe
overwrite property.

SQLite Assumptions About Powersafe Overwrite

All versions of SQLite up to and including version 3.7.9
(2011-11-01) assume that
the filesystem does not provide powersafe overwrite.  SQLite 
has traditionally assumed that when any one byte of a file changes, all
other bytes within the same sector of that byte have the potential of
being corrupted on a power loss.  When writing, SQLite has made sure
to journal all bytes in the same sector of any modifications
and it pads journal files out to the next sector boundary so that
subsequent appends to that journal cannot damage prior records.
SQLite understands the sector size to be the value returned by the
xSectorSize method in the VFS.  The SQLite team has often referred
to the value returned by xSectorSize as the "blast radius" of a write,
since it expresses the range of bytes that might be damaged if a power
loss occurs during the write.
The default VFSes for unix and windows have always returned 512 as 
the sector size (or blast radius) for all versions of SQLite up to
and including version 3.7.9.

Newer disk drives have begun using 4096 byte sectors however.  Beginning
with SQLite version 3.7.10 (2012-01-16), 
the SQLite development team experimented with 
changes xSectorSize to report 4096 bytes as the blast radius.
This had the effect of increasing write overhead on
many databases.  For a database with a PRAGMA page_size of 1024
(a very commoÝào 
sqlite3_open_v2() so that the file descriptor used for the
repository database file was 2.  Later, an application 
bug caused an assert() statement to emit
an error message by invoking write(2,...).  But since file descriptor 2 was 
now connected to a database file, the error message
overwrote part of the database.  To guard against this kind of problem,
SQLite version 3.8.1 (2013-10-17)
and later refuse to use low-numbered file descriptors
for database files. 
(See SQLITE_MINIMUM_FILE_DESCRIPTOR for additional information.)

Another example of corruption caused by using a closed file
descriptor was 
reported by facebook engineers in a blog post on 2014-08-12.

Another example of this error was reported against
Fossil on 2019-07-11.  A file descriptor would
be opened for debugging output, but then closed and reopened by SQLite.
But the debugging logic continued to write into the original file
descriptor. See the
forum discussion
for the bug report and a link to the fix.

1.2.  Backup or restore while a transaction is active

Systems that run automatic backups in the background might try to
make a backup copy of an SQLite database file while it is in the middle
of a transaction.  The backup copy then might contain some old and some
new content, and thus be corrupt.

The best approach to make reliable backup copies of an SQLite database
is to make use of the backup API that is part of the SQLite library.
Failing that, it is safe to make a copy of an SQLite database file as long
as there are no transactions in progress by any process.  If the previous
transaction failed, then it is important that any rollback journal
(the *-journal file) or write-ahead log (the *-wal file)
be copied together with the database file itself.



1.3.  Deleting a hot journal

SQLite normally stores all content in a single disk file.  However,
while performing a transaction, information necessary to recover the
database following a crash or power failure is stored in auxiliary
journal files.  Such journal files are described as "hot".
The journal files have the same name as the
original database file with the addition
of -journal or -wal suffix.

SQLite must see the journal files in order to recover from a crash
or power failure.  If the hot journal files are moved, deleted, or renamed
after a crash or power failure, then automatic recovery will not work
and the database may go corrupt.

Another manifestation of this problem is
database corruption caused by inconsistent use of 8+3 filenames.



1.4.  Mispairing database files and hot journals 

 The previous example is a specific case of a more general problem:
The state of an SQLite database is controlled by both the
database file and the journal file.  In a quiescent state, the journal
file does not exist and only the database file matters.
But if the journal file does exist, it must be
kept together with the database to avoid corruption.  The following
actions are all likely to lead to corruption:

 Swapping journal files between two different databases.
 Overwritting a journal file with a different journal file.
 Moving a journal file from one database to another.
 Copying a database file without also copying its journal.
 Overwriting a database file with another without also
     deleting any hot journal associated with the original database.


2.  File locking problems

SQLite uses file locks on the database file, and on the 
write-ahead log or WAL file, to coordinate access between concurrent
processes.  Without coordination, two threads or processes might try
to make incompatible changes to a database file at the same time,
resulting in database corruption.

2.1.  Filesystems with broken or missing lock implementations

SQLite depends on the underlying filesystem to do locking as the
documentation says it will.  But some filesystems contain bugs in their
locking logic such that the locks do not always behave as advertised.
This is especially true of network filesystems and NFS in particular.
If SQLite is used on a filesystem where the locking primitives contain
bugs, and if two or ámore threads or processes try to access the same
database at the same time, then database corruption might result.



2.2.  Posix advisory locks canceled by a separate thread doing close()

The default locking mechanism used by SQLite on unix platforms is
POSIX advisory locking.  Unfortunately, POSIX advisory locking has design
quirks that make it prone to misuse and failure. In particular, any
thread in the same process with a file descriptor that is holding a POSIX
advisory lock can override that lock using a different file descriptor.
One particularly pernicious problem is that the close() system
call will cancel all POSIX advisory locks on the same file for all
threads and all file descriptors in the process.

So, for example, suppose a multi-thread process has
two or more threads with separate SQLite database connections to the
same database file.  Then a third thread comes along and wants to read
something out of that same database file on its own, without using the 
SQLite library.
The third thread does an open(), a read() and then
a close().
One would think this would be harmless.
But the close() system call caused the
locks held on the database by all the other threads to be dropped.  Those
other threads have no way of knowing that their locks have just been
trashed (POSIX does not provide any mechanism to determine this) and so
they keep on running under the assumption that their locks are still valid.
This can lead to two or more threads or processes trying to write to the
database at the same time, resulting in database corruption.

Note that it is perfectly safe for two or more threads to access the
same SQLite database file using the SQLite library.  The unix drivers for
SQLite know about the POSIX advisory locking quirks and work around them.
This problem only arises when a thread tries to bypass the SQLite library
and read the database file directly.

2.2.1. Multiple copies of SQLite linked into the same application

As pointed out in the previous paragraph, SQLite takes steps to work
around the quirks of POSIX advisory locking.  Part of that work-around involves
keeping a global list (mutex protected) of open SQLite database files.
But, if multiple copies of SQLite are linked into the same application,
then there will be multiple instances of this global list.
Database connections opened using one copy of the SQLite library
will be unaware of database connections opened using the other copy,
and will be unable to work around the POSIX advisory locking quirks.
A close() operation on one connection might unknowingly 
clear the locks on a different database connection, leading to database
corruption.

The scenario above sounds far-fetched.
But the SQLite developers are aware of at 
least one commercial product that was released
with exactly this bug.  The vendor came to the SQLite developers seeking
help in tracking down some infrequent database corruption issues they were
seeing on Linux and Mac.  The problem was eventually traced to the
fact that the application was linking against two separate copies of SQLite.
The solution was to change the application build procedures to link against
just one copy of SQLite instead of two.

2.3.  Two processes using different locking protocols

The default locking mechanism used by SQLite on unix platforms is
POSIX advisory locking, but there are other options.  By selecting an
alternative sqlite3_vfs using the sqlite3_open_v2() interface, an
application can make use of other locking protocols that might be more
appropriate to certain filesystems.  For example, dot-file locking might
be select for use in an application that has to run on an NFS filesystem
that does not support POSIX advisory locking.

It is important that all connections to the same database file use 
the same locking protocol.
If one application is using POSIX advisory locks and another application
is using dot-file locking, then the two applications will not see each
other's locks and will not be able to coordinate database access, possibly
leading to database corruption.



2.4.  Unlinking or reânaming a database file while in use

If two processes have open connections to the same database file and
one process closes its connection, unlinks the file, then creates a new
database file in its place with the same name and reopens the new file,
then the two processes will be talking to different database files with 
the same name.  (Note that this is only possible on Posix and Posix-like
systems that permit a file to be unlinked while it is still open for
reading and writing.  Windows does not allow this to occur.)
Since rollback journals and WAL files are based on the name of the database
file, the two different database files will share the same rollback
journal or WAL file.  A rollback or recovery for one of the databases
might use content from the other database, resulting in corruption.
A similar problem occurs if a database file is renamed while it is
opened and a new file is created with the old name.

In other words, unlinking or renaming an open database file 
results in behavior that is undefined and probably undesirable.

Beginning with SQLite version 3.7.17 (2013-05-20),
the unix OS interface will
send SQLITE_WARNING messages to the error log if a database file is unlinked
while it is still in use.



2.5.  Multiple links to the same file

If a single database file has multiple links (either hard or soft links)
then that is just another way of saying that the file has multiple names.
If two or more processes open the database using different names, then
they will use different rollback journals and WAL files.  That means that
if one process crashes, the other process will be unable to recover the
transaction in progress because it will be looking in the wrong place
for the appropriate journal.

In other words, opening and using a database file that has two or
more names results in behavior that is undefined and probably undesirable.

Beginning with SQLite version 3.7.17 (2013-05-20),
the unix OS interface will
send SQLITE_WARNING messages to the error log if a database file has 
multiple hard links.

Beginning with SQLite version 3.10.0 (2016-01-06), 
the unix OS interface will
attempt to resolve symbolic links and open the database file by its
canonical name.  Prior to version 3.10.0, opening a database file 
through a symbolic link was similar to opening a database file
that had multiple hard links and resulted in undefined behavior.



2.6.  Carrying an open database connection across a fork() 

 Do not open an SQLite database connection, then fork(), then try
to use that database connection in the child process.  All kinds of
locking problems will result and you can easily end up with a corrupt
database.  SQLite is not designed to support that kind of behavior.
Any database connection that is used in a child process must be opened
in the child process, not inherited from the parent.

 Do not even call sqlite3_close() on a database connection from a
child process if the connection was opened in the parent.  It is safe
to close the underlying file descriptor, but the sqlite3_close()
interface might invoke cleanup activities that will delete content out
from under the parent, leading to errors and perhaps even database
corruption.

3.  Failure to sync

In order to guarantee that database files are always consistent, SQLite
will occasionally ask the operating system to flush all pending writes to
persistent storage then wait for that flush to complete.  This is 
accomplished using the fsync() system call under unix and
FlushFileBuffers() under Windows.  We call this flush of
pending writes a "sync".

Actually, if one is only concerned with atomic and consistent writes and
is willing to forego durable writes, the sync operation does not need
to wait until the content is completely stored on persistent media.  Instead,
the sync operation can be thought of as an I/O barrier.  As long as all
writes that occur before the sync are completed before any write that happens
after the sync, no database corruption will occur.  If sync is operating as
an I/O barrier and not as a true sync, then a power failure orã system crash
might cause one or more previously committed transactions to roll back
(in violation of the "durable" property of "ACID") but the database will at
least continue to be consistent, and that is what most people care about.

3.1.  Disk drives that do not honor sync requests

Unfortunately, most consumer-grade mass storage devices lie about
syncing.  Disk drives will report that content is safely on persistent
media as soon as it reaches the track buffer and before actually being
written to oxide.  This makes the disk drives seem to operate faster
(which is vitally important to the manufacturer so that they can show
good benchmark numbers in trade magazines).  And in fairness, the lie
normally causes no harm, as long as there is no power loss or hard reset
prior to the track buffer actually being written to oxide.  But if a
power loss or hard reset does occur, and if that results in content that
was written after a sync reaching oxide while content written before
the sync is still in a track buffer, then database corruption can occur.

USB flash memory sticks seem to be especially pernicious liars 
regarding sync requests.  One can easily see this by committing a large
transaction to an SQLite database on a USB memory stick.  The COMMIT
command will return relatively quickly, indicating that the memory stick
has told the operating system and the operating system has told SQLite that
all content is safely in persistent storage, and yet the LED on the end
of the memory stick will continue flashing for several more seconds. 
Pulling out the memory stick while the LED is still flashing will frequently
result in database corruption.

Note that SQLite must believe whatever the operating system and hardware
tell it about the status of sync requests.  There is no way for SQLite to
detect that either is lying and that writes might be occurring out-of-order.
However, SQLite in WAL mode is far more forgiving of
out-of-order writes than in the default rollback journal modes.  In WAL
mode, the only time that a failed sync operation can cause database corruption
is during a checkpoint operation.  A sync failure during a COMMIT might
result in loss of durability but not in a corrupt database file.  Hence,
one line of defense against database corruption due to failed sync operations
is to use SQLite in WAL mode and to checkpoint as infrequently as possible.

3.2.  Disabling sync using PRAGMAs

The sync operations that SQLite performs to help ensure integrity
can be disabled at run-time using the synchronous pragma.  By setting
PRAGMA synchronous=OFF, all sync operations are omitted.  This makes
SQLite seem to run faster, but it also allows the operating system to freely
reorder writes, which could result in database corruption if a power failure
or hard reset occurs prior to all content reaching persistent storage.

For maximum reliability and for robustness against database corruption,
SQLite should always be run with its default synchronous setting of FULL.



4.  Disk Drive and Flash Memory Failures

An SQLite database can become corrupt if the file content changes 
due to a disk drive or flash memory failure.  It is very rare, but disks 
will occasionally flip a bit in the middle of a sector.

4.1.  Non-powersafe flash memory controllers

We are told that in some flash memory controllers the wear-leveling logic
can cause random filesystem damage if power is interrupted during a write.
This can manifest, for example, as random changes in the middle of a file
that was not even open at the time of the power loss.  So, for example,
a device would be writing content into an MP3 file in flash memory when a
power loss occurs, and that could result in an SQLite database being
corrupted even though the database was not even in use at the time of the
power loss.



4.2.  Fake capacity USB sticks

There are many fraudulent USB sticks in circulation that report to have
a high capacity (ex: 8GB) but are really only capable of storing a much
smaller amount (ex: 1GB).   Attempts to write on these devices will
often result in unrelateäd files being overwritten.  Any use of a fraudulent
flash memory device can easily lead to database corruption, therefore.
Internet searches such as "fake capacity usb" will turn up lots of
disturbing information about this problem.

5.  Memory corruption

SQLite is a C-library that runs in the same address space as the 
application that it serves.  That means that stray pointers, buffer
overruns, heap corruption, or other malfunctions in the application can
corrupt internal SQLite data structure and ultimately result in a
corrupt database file.  Normally these kinds of problems manifest themselves
as segfaults prior to any database corruption occurring, but there have
been instances where application code errors have caused SQLite to
malfunction subtly so as to corrupt the database file rather than
panicking.

The memory corruption problem becomes more acute when
using memory-mapped I/O.
When all or part of the database file is mapped into the application's
address space, then a stray pointer that overwrites any part of that
mapped space will immediately corrupt the database file, without
requiring the application to do a subsequent write() system call.

6.  Other operating system problems

Sometimes operating systems will exhibit non-standard behavior which
can lead to problems.  Sometimes this non-standard behavior is deliberate,
and sometimes it is a mistake in the implementation.  But in any event,
if the operating performs differently from they way SQLite expects it to
perform, the possibility of database corruption exists.

6.1.  Linux Threads

Some older versions of Linux used the LinuxThreads library for thread
support.  LinuxThreads is similar to Pthreads, but is subtly different
with respect to handling of POSIX advisory locks.  SQLite versions
2.2.3 through 3.6.23 recognized that LinuxThreads were being used at
runtime and took appropriate action to work around the non-standard
behavior of LinuxThreads.  But most modern Linux implementations make
use of the newer, and correct, NPTL implementation of Pthreads.  Beginning
with SQLite version 3.7.0 (2010-07-21), the use of NPTL is assumed.
No checks are 
made.  Hence, recent versions of SQLite will subtly malfunction and may 
corrupt database files if used in multi-threaded application that run
on older linux systems that make use of LinuxThreads.

6.2.  Failures of mmap() on QNX

There exists some subtle problem with mmap() on QNX such that making
a second mmap() call against a single file descriptor can cause
the memory obtained from the first mmap() call to be zeroed.  SQLite on
unix uses mmap() to create a shared memory region for transaction 
coordination in WAL mode, and it will call mmap() multiple times
for large transactions.  The QNX mmap() has been demonstrated to corrupt
database file under that scenario.  QNX engineers are aware of this problem
and are working on a solution; the problem may have already been fixed by
the time you read this.

When running on QNX, it is recommended that memory-mapped I/O never
be used.  Furthermore, to use WAL mode, it is recommended that applications
employ the exclusive locking mode in order to 
use WAL without shared memory.




6.3.  Filesystem Corruption

Since SQLite databases are ordinary disk files, any malfunction in the
filesystem can corrupt the database.  Filesystems in modern operating systems
are very reliable, but errors do still occur.  For example, on 2013-10-01
the SQLite database that holds the
Wiki for Tcl/Tk went corrupt a few days
after the host computer was moved to a dodgy build of the (linux) kernel
that had issues in the filesystem layer.  In that event, the filesystem
eventually became so badly corrupted that the machine was unusable, but
the earliest symptom of trouble was the corrupted SQLite database.



7. SQLite Configuration Errors

SQLite has many built-in protections against database corruption.
But many of these protections can be disabled by configuration options.
If protections are disabled, database corruption may occur.

The following are examples of disabling the built-in pårotection
mechanisms of SQLite:


Setting PRAGMA synchronous=OFF can cause the database to
go corrupt if there is an operating-system crash or power failure,
though this setting is safe from damage due to application crashes.

Changing the PRAGMA schema_version while other database
connections are open.

Using PRAGMA journal_mode=OFF or PRAGMA journal_mode=MEMORY
and taking an application crash in the middle of a write transaction.

Setting PRAGMA writable_schema=ON and then changing the
database schema using DML statements can render the database completely
unreadable, if not done carefully.


8.  Bugs in SQLite

SQLite is very carefully tested to help ensure that it is
as bug-free as possible.  Among the many tests that are carried out for
every SQLite version are tests that simulate power failures, I/O errors,
and out-of-memory (OOM) errors and verify that no database corruption occurs
during any of these events.  SQLite is also field-proven with approximately
two billion active deployments with no serious problems.

Nevertheless, no software is 100% perfect.  There have been a few
historical bugs in SQLite (now fixed) that could cause database corruption.
And there may be yet a few more that remain undiscovered.  Because of the
extensive testing and widespread use of SQLite, bugs that result in
database corruption tend to be very obscure.  The likelihood
of an application encountering an SQLite bug is small.  To illustrate this,
an account is given below 
of all database-corruption bugs found in SQLite during the
four-year period from 2009-04-01 to 2013-04-15.
This account should give the reader an intuitive sense of the
kinds of bugs in SQLite that manage to slip through testing procedures
and make it into a release.


8.1.  False corruption reports due to database shrinkage

If a database is written by SQLite version 3.7.0 or later and then
written again by SQLite version 3.6.23 or earlier in such a way as to
make the size of the database file decrease, then the next time that
SQLite version 3.7.0 access the database file, it might report that the
database file is corrupt.  The database file is not really corrupt, however.
Version 3.7.0 was simply being overly zealous in its corruption detection.

The problem was fixed on 2011-02-20.  The fix first appears in
SQLite version 3.7.6 (2011-04-12).

8.2.  Corruption following switches between rollback and WAL modes

Repeatedly switching an SQLite database in and out of WAL mode
and running the VACUUM command in between switches, in one process or
thread, can cause another process or thread that has the database file
open to miss the fact that the database has changed.  That second process
or thread might then try to modify the database using a stale cache and
cause database corruption.

This problem was discovered during internal testing and has never been
observed in the wild.  The problem was fixed on 2011-01-27 and in version
3.7.5.

8.3.  I/O error while obtaining a lock leads to corruption

If the operating system returns an I/O error while attempting to obtain
a certain lock on shared memory in WAL mode then SQLite might fail 
to reset its cache,
which could lead to database corruption if subsequent writes are attempted.

Note that this problem only occurs if the attempt to acquire the lock
resulted in an I/O error.  If the lock is simply not granted (because some
other thread or process is already holding a conflicting lock) then no
corruption will ever occur.  We are not aware of any operating systems that
will fail with an I/O error while attempting to get a file lock on shared
memory.  So this is a theoretical problem rather than a real problem.
Needless to say, this problem has never been observed in the wild.  The
problem was discovered while doing stress testing of SQLite in a test
harness that simulates I/O errors.

This problem was fixed on 2010-09-20 for SQLite version 3.7.3.

8.4.  Database pages leak from the free page list

When content is deleted from an SQLite database, pages that are no
longer used are added to a free list and are reused to hold content
added by subsequent inserts.  A bug in SQLite that was present in
version 3.6.16 through 3.7.2 might cause pages to go missing out of
the free list when incremental_vacuum was used.  This would not cause
data loss.  But it would result in the database file being larger than
necessary.  And it would cause the integrity_check pragma to report
pages missing from the free list.

This problem was fixed on 2010-08-23 for SQLite version 3.7.2.

8.5.  Corruption following alternating writes from 3.6 and 3.7.

SQLite version 3.7.0 introduced a number of new enhancements to
the SQLite database file format (such as but not limited to WAL).
The 3.7.0 release was a shake-out release for these new features. 
We expected to find problems and were not disappointed.

If a database were originally created using SQLite version 3.7.0,
then written by SQLite version 3.6.23.1 such that the size of the database
file increased, then written again by SQLite version 3.7.0, the database
file could go corrupt.

This problem was fixed on 2010-08-04 for SQLite version 3.7.1.

8.6.  Race condition in recovery on windows system.

SQLite version 3.7.16.2 fixes a subtle race condition in the locking
logic on Windows systems.  When a database file is in need
of recovery because the previous process writing to it crashed in the
middle of a transaction and two or more processes try to open the 
that database at the same time, then the race condition might cause
one of those processes to get a false indication that the recovery 
has already completed, allowing that process to continue using the
database file without running recovery first.  If that process writes
to the file, then the file might go corrupt.  This race condition
had apparently existed in all prior versions of SQLite for Windows going
back to 2004.  But the race was very tight.  Practically speaking, you
need a fast multi-core machine in which you launch two processes to run
recovery at the same moment on two separate cores.  This defect was
on Windows systems only and did not affect the posix OS interface.



8.7.  Boundary value error in the secondary journals used by nested transactions.

When a nested transaction is started using SAVEPOINT, SQLite uses
a secondary rollback journal to track the changes for the nested
transaction, in case the inner transaction needs to be rolled back.  Secondary
journals are not involved in protecting the database from corruption due
to program crashes or power outages.  The secondary journals only come into
play when rolling back an inner transaction of a nested transaction.

These secondary journals can be held either in memory or as temporary
files on disk.  The default behavior is to store them on disk.  But that 
can be changed using the -DSQLITE_TEMP_STORE compile-time option,
or at run-time using the PRAGMA temp_store statement.  The bug
only arises when secondary journals are held in memory.

In SQLite version 3.35.0 (2021-03-12), a new optimization was
added so that when SQLite is holding secondary journals in memory,
less memory will be used. Unfortunately, an boundary check in
the new logic was coded incorrectly.
What should have been a "&lt;" operator was coded as "&lt;=".  This
error might cause the secondary journal to enter an inconsistent state
if it is ever rolled back.  If additional changes are made and the
outer transaction eventually commits, the database might be left in
an inconsistent state.

This problem was discovered by an 
independent researcher
who was attempting to find bugs in SQLite using a fuzzer.  The fuzzer found a
failure in an assert() statement that is used
to help verify the internal state of the secondary journal.  The bug was a
sufficiently obscure corner-case that it might have gone unnoticed for many
years, had it not been for the intensive use of assert() statements in SQLite,
the persistence and tenacity of the security researchers, and their
customized state-of-the-art fuzzer.

This problem was fixed
in version 3.37.2 (2022-01-06).
This page last modified on  2022-02-12 22:18:19 UTChowtocorrupt.html
             ìLƒ
Yį#/How To Corrupt An SQLite Database FileOverview 

An SQLite database is highly resistant to corruption.
If an application crash, or an operating-system crash, or even
a power failure occurs in the middle of a transaction, the partially
written transaction should be automatically rolled back the next time
the database file is accessed.  The recovery process is fully
automatic and does not require any action on the part of the user
or the application.


Though SQLite is resistant to database corruption, it is not immune.
This document describes the various ways that an SQLite database might
go corrupt.

1.  File overwrite by a rogue thread or process

SQLite database files are ordinary disk files.
That means that any process can open the file and 
overwrite it with garbage.  There is nothing that the SQLite
library can do to defend against this.



1.1.  Continuing to use a file descriptor after it has been closed

We have seen multiple cases where a file descriptor was open on a file,
then that file descriptor was closed and reopened on an SQLite database.
Later, some other thread continued to write into the
old file descriptor, not realizing that the original file had been closed
already.  But because the file descriptor had been reopened by SQLite,
the information that was intended to go into the original file ended up
overwriting parts of the SQLite database, leading to corruption of the
database.

One example of this occurred circa 2013-08-30 on the canonical repository
for the Fossil DVCS.  In that event,
file descriptor 2 (standard error) was being erroneously closed (by
stunnel, we suspect) prior tß
ÑÑœ+ƒ   Q·w#The Carray() Table-Valued Function1. Overview

Carray() is a table-valued function with a single column (named
"value") and zero or more rows.
The "value" of each row in the carray() is taken from a C-language array
supplied by the application via parameter binding.
In this way, the carray() function provides a convenient mechanism to
bind C-language arrays to SQL queries.

2. Availability

The carray() function is not compiled into SQLite by default.
It is available as a loadable extension in the
ext/misc/carray.c
source file.

The carray() function was first added to SQLite in version 3.14
(2016-08-08).  The sqlite3_carray_bind() interface and the
single-argument variant of carray() was added in SQLite version 3.34.0
(2020-12-01).

3. Details

The carray() function takes one, two, or three arguments.

For the two- and three-argument versions of carray(),
the first argument is a pointer to an array.  Since pointer values cannot
be specified directly in SQL, the first argument must be a parameter that
is bound to a pointer value using the sqlite3_bind_pointer() interface
using a pointer-type of "carray".
The second argument is the number of elements in the array.  The optional
third argument is a string that determines the datatype of the elements
in the C-language array.  Allowed values for the third argument are:


 'int32'
 'int64'
 'double'
 'char*'


The default datatype is 'int32'.



3.1. Single-Argument CARRAY

The single-argument form of carray() requires a special C-language
interface named "sqlite3_carray_bind()" in order to attach values:


  int sqlite3_carray_bind(
    sqlite3_stmt *pStmt,         /* Statement containing the CARRAY */
    int idx,                     /* Parameter number for CARRAY argument */
    void *aData,                 /* Data array */
    int nData,                   /* Number of entries in the array */
    int mFlags,                  /* Datatype flag */
    void (*xDestroy)(void*)      /* Destructor for aData */
  );


The mFlags parameter to sqlite3_carray_bind() must be one of:


  #define CARRAY_INT32   0
  #define CARRAY_INT64   1
  #define CARRAY_DOUBLE  2
  #define CARRAY_TEXT    3


Higher order bits of the mFlags parameter must all be zero for now,
though they may be used in future enhancements.  The definitions for the
constants that specify the datatype and a prototype for the
sqlite3_carray_bind() function are both available in the auxiliary
header file
ext/misc/carray.h.

The xDestroy argument to sqlite3_carray_bind() routine is a pointer
to a function that frees the input array.  SQLite will invoke this
function after it has finished with the data.  The xDestroy argument
may optionally be one of the following constants defined in
"sqlite3.h":



     SQLITE_STATIC &rarr;  This means that the application that invokes
     sqlite3_carray_bind() maintains ownership of the data array and that
     the application promises SQLite that it will not change or deallocate
     the data until after the prepared statement is finialized.


     SQLITE_TRANSIENT &rarr;  This special value instructs SQLite to make
     its own private copy of the data before the 
     sqlite3_carray_bind() interface returns.



4. Usage

The carray() function can be used in the FROM clause of a query.
For example, to query two entries from the OBJ table using rowids
taken from a C-language array at address $PTR.

SELECT obj.* FROM obj, carray($PTR, 10) AS x
 WHERE obj.rowid=x.value;


This query gives the same result:

SELECT * FROM obj WHERE rowid IN carray($PTR, 10);

This page last modified on  2020-11-18 14:36:04 UTCcarray.html
yyƒ     /¹OLong Term SupportThe intent of the developers is to support SQLite through
the year 2050.


At this writing, 2050 is still 34 years in the future.
Nobody knows what will happen in that time, and we cannot
absolutely promise that SQLite will be viable or useful that
far out.
But we can promise this: we plan as if we will be
supporting SQLite until 2050.
That long-term outlook affects our
decisions in important ways.



Cross-platform Code &rarr;
SQLite runs on any platform with an 8-bit byte,
two's complement 32-bit and 64-bit integers, 
and a C compiler.  It is actively
tested on all currently popular CPUs and operating
systems.
The extreme portability of the SQLite code and file
format will help it remain viable on future platforms.


Stable, Cross-platform Database Files &rarr;
SQLite database files are bit-for-bit identical on
32-bit, 64-bit, big-endian, and little-endian platforms.  You
can copy an SQLite database file from one system to another
without having to translate or convert the database.
Furthermore, the file format is well documented and stable.
Database files created today will be readable and writable by
future versions of SQLite decades in the future.


Aviation-grade testing &rarr;
Every machine-code branch instruction is tested in both
directions.  Multiple times.  On multiple platforms and with
multiple compilers.  This helps make the code robust for
future migrations.  The intense testing also means that new
developers can make experimental enhancements to SQLite and,
assuming legacy tests all pass, be reasonably sure that the
enhancement does not break legacy.


Extensive, detailed documentation &rarr;
SQLite has candid, developer-friendly,
and open-source documentation.  Docs are written by and
for programmers.
(A few examples:
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8])
The extensive documentation helps new developers
come up to speed on SQLite very quickly.


Heavily commented source code &rarr;
The SQLite source code is over 35% comment.  Not boiler-plate
comments, but useful comments that explain the meaning of variables
and objects and the intent of methods and procedures.  
The code is designed
to be accessible to new programmers and maintainable over a span
of decades.


Disaster planning &rarr;
Every byte of source-code history for SQLite is cryptographically
protected and is automatically replicated to multiple
geographically separated servers, in datacenters 
owned by different companies.
Thousands of additional clones exist on private servers around the
world.
The primary developers of SQLite live in different regions of the world.
SQLite can survive a continental catastrophe.


Old school &rarr;
Nobody is completely immune to trends and fads, but the SQLite
developers work hard to avoid being sucked into the latest programming
fashion.  Our aim is to produce timeless code that will be
readable, understandable, and maintainable by programmers 
who have not yet been born.



In addition to "supporting" SQLite through the year 2050, the developers
also promise to keep the SQLite 
C-language API and on-disk format 
fully backwards compatible.
This means that application written to use SQLite today should be able to
link against and use future versions of SQLite released decades in the
future.


Our goal is to make the content you store in SQLite today as 
easily accessible to your grandchildren as it is to you.


Update on 2018-05-31:
Our goal of supporting SQLite long-term have apparently come to the
notice of the preservationist at the 
US Library Of Congress who have identified
SQLite as a recommended storage format for the preservation of
digital content.
This page last modified on  2020-12-01 19:58:42 UTClts.html, 'hello');



If no ROWID is specified on the insert, or if the specified ROWID has a value
of NULL, then an appropriate ROWID is created
automatically.  The usual algorithm is to give the newly created row
a ROWID that is one larger than the largest ROWID in the table prior
to the insert.  If the table is initially empty, then a ROWID of 1 is
used.  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.
If no unused ROWID can be found after a reasonable number of attempts,
the insert operation fails with an SQLITE_FULL error.
If no negative ROWID values are inserted explicitly, then automatically 
generated ROWID values will always be greater than zero.



The normal ROWID selection algorithm described above
will generate monotonically increasing
unique ROWIDs as long as you never use the maximum ROWID value and you never
delete the entry in the table with the largest ROWID. 
If you ever delete rows or if you ever create a row with the maximum possible
ROWID, then ROWIDs from previously deleted rows might be reused when creating
new rows and newly created ROWIDs might not be in strictly ascending order.



3. The AUTOINCREMENT Keyword


If a column has the type INTEGER PRIMARY KEY AUTOINCREMENT then a slightly
different ROWID selection algorithm is used.  
The ROWID chosen for the new row is at least one larger than the largest ROWID
that has ever before existed in that same table.  If the table has never
before contained any data, then a ROWID of 1 is used.  If the largest possible
ROWID has previously been inserted, then
new INSERTs are not allowed and any attempt to insert a new row will
fail with an SQLITE_FULL error.  
Only ROWID values from previous transactions that
were committed are considered.  ROWID values that were rolled back
are ignored and can be reused.



SQLite keeps track of the largest ROWID
using an internal table named "sqlite_sequence".
The sqlite_sequence table is created
and initialized automatically whenever a normal table that contains an
AUTOINCREMENT column is created.  The content of the sqlite_sequence table
can be modified using ordinary UPDATE, INSERT, and DELETE statements.
But making modifications to this table will likely perturb the AUTOINCREMENT
key generation algorithm.  Make sure you know what you are doing before
you undertake such changes.
The sqlite_sequence table does not track ROWID changes associated with
UPDATE statement, only INSERT statements.



The behavior implemented by the AUTOINCREMENT keyword is subtly different
from the default behavior.  With AUTOINCREMENT, rows with automatically
selected ROWIDs are guaranteed to have ROWIDs that have never been used
before by the same table in the same database.  And the automatically generated
ROWIDs are guaranteed to be monotonically increasing.  These are important
properties in certain applications.  But if your application does not
need these properties, you should probably stay with the default behavior
since the use of AUTOINCREMENT requires additional work to be done
as each row is inserted and thus causes INSERTs to run a little slower.


Note that "monotonically increasing" does not imply that the ROWID always
increases by exactly one.  One is the usual increment.  However, if an
insert fails due to (for example) a uniqueness constraint, the ROWID of
the failed insertion attempt might not be reused on subsequent inserts,
resulting in gaps in the ROWID sequence.  AUTOINCREMENT guarantees that
automatically chosen ROWIDs will be increasing but not that they will be
sequential.

Because AUTOINCREMENT keyword changes the behavior of the ROWID selection
algorithm, AUTOINCREMENT is not allowed on WITHOUT ROWID tables or on any
table column other than INTEGER PRIMARY KEY.  Any attempt to use 
AUTOINCREMENT on a WITHOUT ROWID table or on a column other than the
INTEGER PRIMARY KEY column results in an error.
This page last modified on  2017-02-02 23:55:23 UTCautoinc.html
¦¦°Nƒ    5àW%SQLite Autoincrement1. Summary



  The AUTOINCREMENT keyword imposes extra CPU, memory, disk space,
  and disk I/O overhead and should be avoided if not strictly needed.
  It is usually not needed.

  In SQLite, a column with type INTEGER PRIMARY KEY is an alias for the ROWID
  (except in WITHOUT ROWID tables) which is always a 64-bit signed integer.

  On an INSERT, if the ROWID or INTEGER PRIMARY KEY column is not 
  explicitly given a value, then it
  will be filled automatically with an unused integer, usually
  one more than the largest ROWID currently in use.
  This is true regardless of whether or not the AUTOINCREMENT keyword is used.

  If the AUTOINCREMENT keyword appears after INTEGER PRIMARY KEY, that
  changes the automatic ROWID assignment algorithm to prevent
  the reuse of ROWIDs over the lifetime of the database.  In other words,
  the purpose of AUTOINCREMENT is to prevent the reuse of ROWIDs from
  previously deleted rows.


2. Background


In SQLite, table rows normally have a 64-bit signed integer ROWID
which is unique among all rows in the same table.
(WITHOUT ROWID tables are the exception.)



You can access the ROWID of an SQLite table using one of the special column
names ROWID, _ROWID_, or OID.
Except if you declare an ordinary table column to use one of those special
names, then the use of that name will refer to the declared column not
to the internal ROWID.



If a table contains a column of type INTEGER PRIMARY KEY, then that
column becomes an alias for the ROWID.  You can then access the ROWID
using any of four different names, the original three names described above
or the name given to the INTEGER PRIMARY KEY column.  All these names are
aliases for one another and work equally well in any context.



When a new row is inserted into an SQLite table, the ROWID can either
be specified as part of the INSERT statement or it can be assigned
automatically by the database engine.  To specify a ROWID manually,
just include it in the list of values to be inserted.  For example:


CREATE TABLE test1(a INT, b TEXT);
INSERT INTO test1(rowid, a, b) VALUES(123, 5é
L{Lª#ƒ        9Ó{'List Of Virtual Tables1. Introduction

A virtual table is an object that presents an SQL table
interface but which is not stored in the database file, at least
not directly.  The virtual table mechanism is a feature
of SQLite that allows SQLite to access and manipulate resources
other than bits in the database file using the powerful SQL
query language.


The table below lists a few of the virtual tables implementations
available for SQLite.  Developers can deploy these virtual tables
in their own applications, or use the implementations shown below
as templates for writing their own virtual tables.


The list below is not exhaustive.
Other virtual table implementation exist in the SQLite source tree
and elsewhere.
The list below tries to capture the more interesting virtual table
implementations.



2. Virtual Tables


NameDescription
approximate_match
A demonstration of how to use a virtual table to implement
    approximate string matching.
bytecode
A table-valued function that shows the bytecodes of a prepared
    statement.
carray
A table-valued function that allows a C-language array of integers,
    doubles, or strings to be used as table in a query.
closure
Compute the transitive closure of a set.
completion
Suggests completions for partially-entered words during interactive
    SQ앃  5©;'SQLite Download PageSQLite Download Page











Build Product Names and Info


Build products are named using one of the following templates:


 sqlite-product-version.zip
 sqlite-product-version.tar.gz
 sqlite-product-os-cpu-version.zip
 sqlite-product-date.zip


Templates (1) and (2) are used for source-code products.  Template (1) is
used for generic source-code products and templates (2) is used for source-code
products that are generally only useful on unix-like platforms.  Template (3)
is used for precompiled binaries products.  Template (4) is used for
unofficial pre-release "snapshots" of source code.

The version is encoded so that filenames sort in order of
increasing version number when viewed using "ls".  For version 3.X.Y the
filename encoding is 3XXYY00.  For branch version 3.X.Y.Z, the encoding is
3XXYYZZ.

The date in template (4) is of the form: YYYYMMDDHHMM

For convenient, script-driven extraction of the downloadable
file URLs and associated information, an HTML comment is embedded
in this page's source. Its first line (sans leading tag) reads:
Download product data for scripts to read
Its subsequent lines comprise a CSV table with this column header:
PRODUCT,VERSION,RELATIVE-URL,SIZE-IN-BYTES,SHA3-HASH
The column header and following data lines have no leading space.
The PRODUCT column is a constant value ("PRODUCT") for convenient
regular expression matching. Other columns are self-explanatory.
This format will remain stable except for possible new columns
appended to the right of older columns.





Source Code Repositories


The SQLite source code is maintained in three geographically-dispersed
self-synchronizing
Fossil repositories that are
available for anonymous read-only access.  Anyone can 
view the repository contents and download historical versions
of individual files or ZIP archives of historical check-ins.
You can also clone the entire repository.

See the How To Compile SQLite page for additional information
on how to use the raw SQLite source code.
Note that a recent version of Tcl
is required in order to build from the repository sources. 
The amalgamation source code files
(the "sqlite3.c" and "sqlite3.h" files) build products and are
not contained in raw source code tree.


https://www.sqlite.org/cgi/src (Dallas)
https://www2.sqlite.org/cgi/src (Newark)
https://www3.sqlite.org/cgi/src (San Francisco)


There is a GitHub mirror at


https://github.com/sqlite/sqlite/


The documentation is maintained in separate
Fossil repositories located
at:


https://www.sqlite.org/cgi/docsrc (Dallas)
https://www2.sqlite.org/cgi/docsrc (Newark)
https://www3.sqlite.org/cgi/docsrc (San Francisco)download.htmlL input.  Used by the CLI to help implement tab-completion.
csv
A virtual table that represents a comma-separated-value or CSV file
    (RFC 4180) as a read-only
    table so that it can be used as part of a larger query.
dbstat
Provides information about the purpose and use of each page in a
    database file.  Used in the implementation of the
    sqlite3_analyzer utility program.
files_of_checkin
Provides information about all files in a single check-in in the
    Fossil version control system.  This
    virtual table is not part of the SQLite project but is included because
    it provides an example of how to use virtual tables and because it is
    used to help version control the SQLite sources.
fsdir
A table-valued function returning one row for each file in a
    selected file hierarchy of the host computer.  Used by the
    CLI to help implement the .archive command.
FTS3
A high-performance full-text search index.
FTS5
A higher-performance full-text search index
generate_series
A table-valued function returning a sequence of increasing
    integers, modeled after the table-valued function by the same
    name in PostgreSQL.
json_each
A table-valued function for decomposing a JSON string.
json_tree
A table-valued function for decomposing a JSON string.
OsQuery
Hundreds of virtual tables that publish various aspects of the
    host computer, such as the process table, user lists, active network
    connections, and so forth.
    OsQuery is a separate project, started by Facebook, hosted on
    GitHub, and intended for
    security analysis and intrusion detection
    OsQuery is not a part of the SQLite project, but is included in this
    list because it demonstrates how the SQL language and the
    SQLite virtual table mechanism
    can be leveraged to provide elegant solutions
    to important real-world problems.
pragma
Built-in table-valued functions that return the results of PRAGMA
    statements for use within ordinary SQL queries.
RTree
An implementation of the Guttmann R*Tree spatial index idea.
spellfix1
A virtual table that implements a spelling correction engine.
sqlite_btreeinfo
This experimental table-valued function provides information about
    a single B-tree in a database file, such as the depth, and estimated
    number of pages and number of entries, and so forth.
sqlite_dbpage
Key/value store for the raw database file content.  The key is the
    page number and the value is binary page content.
sqlite_memstat
Provides SQL access to the sqlite3_status64() and
    sqlite3_db_status() interfaces.
sqlite_stmt
A table-valued function containing one row for each
    prepared statement associated with an open database connection.
swarmvtab
An experimental module providing on-demand read-only access to
    multiple tables spread across multiple databases, via a single
    virtual table abstraction.
tables_used
A table-valued function that shows the tables and indexes that
    are accessed by a prepared statement.
tclvar
Represents the global variables of a 
    TCL Interpreter as an SQL
    table. Used as part of the SQLite test suite.
templatevtab
A template virtual table implementation useful as a starting point
    for developers who want to write their own virtual tables
unionvtab
An experimental module providing on-demand read-only access to
    multiple tables spread across multiple databases, via a single
    virtual table abstraction.
vfsstat
A table-valued function which, in combination with a
    co-packaged VFS shim provides information on the number of
    system calls performed by SQLite.
vtablog
A virtual table that prints diagnostic information
    on stdout when its key methods are invoked.  Intended for
    interactive analysis and debugging of virtual table interfaces.
wholenumber
A virtual table returns all integers between 1 and 4294967295.
zipfile
Represent a
    ZIP Archive
    as an SQL table.  Works for both reading and writing.  Used by
    the CLI to implement the ability to read and write ZIP Archives.


This page last modified on  2022-06-15 10:18:44 UTCvtablist.htmlremain independent and open-source.  Consortium 
members have direct access to
the SQLite developers and receive priority consideration for
any bug fixes or feature requests.  However, technical control
and direction of SQLite remains with the SQLite architect and
developers.  An important goal of the SQLite Consortium, after
all, is to make sure that SQLite does not fall under the governance
of any single company but remains independent and fully under the
control of the SQLite developers.



Companies that use SQLite as a critical component in their
products or infrastructure may want to consider becoming
SQLite Consortium Members as inexpensive insurance
in the future vitality and independence of SQLite.  The SQLite Consortium 
membership fee is a fraction of the cost of devoting internal
staff to supporting the SQLite code base.  Benefits of
membership include:




Consortium members have the guaranteed, undivided attention of the SQLite
developers for 23 staff-days per year and for as much additional time 
above and beyond that amount that the core developers have available.
There are no arbitrary limits on contact time.
The consortium will never be over-subscribed.  New SQLite developers
will be recruited and trained as necessary to cover the 23 day/year
support commitment.



Consortium members can call any developer at any time, day or
night, and expect to get their full and immediate attention.
Consortium members have access to the home telephone numbers
and cellphone numbers and work schedules of the core developers
so that the developers can be tracked down quickly in a crisis.



The SQLite developers are eager and happy to write new code
or debug existing code for consortium members.
Consortium members can request and expect to receive significant
new enhancements to the public SQLite code base.  Consortium
members can also request their own private, proprietary extensions
and enhancements.



Consortium members can receive support for any
version of SQLite no matter how old.
Bug fixes will be back ported to older versions of SQLite upon
request.



Consortium members can receive private
email and/or telephone notifications and briefings covering
new bugs or recently added features.
The core developers are constantly watching out for the
interests of consortium members and will attempt to protect
those interests in every way possible and alert members
when their interests are threatened in any way.



The SQLite developers will set up customized regression tests
to fully and completely test SQLite as configured by consortium
members.  Normally, only the standard SQLite configuration is fully
tested at each release.  Consortium members that use a non-standard 
configuration can request that their configuration be tested to the 
same level of detail.



Support requests are accepted from any employee or contractor working
for a consortium member.
Support is not limited to a single development
team as it is with a maintenance subscription or technical support
agreement.



Support requests, comments, and suggestions for future
changes to SQLite coming from consortium members take priority 
over requests from all other sources.
Consortium members go to the front of the line.



We will be happy to 
recognize consortium members
 on the SQLite website
with a logo and/or a brief acknowledgement of their contribution to the
project.  This is an opportunity for companies to build good will by
demonstrating that they are giving back to the community.  Or, members 
can remain anonymous.





How To Become A Consortium Member


Membership in the SQLite Consortium is via
contract with Hipp, Wyrick &amp; Company, Inc..
Send email to drh@sqlite.org or phone
+1.704.948.4565 during US east-coast business hours
for additional information.consortium.html
ôåôÀaƒ
G€e)Datatypes In SQLite version 2Datatypes In SQLite Version 2

1.0 &nbsp; Typelessness

SQLite is "typeless".  This means that you can store any
kind of data you want in any column of any table, regardless of the
declared datatype of that column.  
(See the one exception to this rule in section 2.0 below.)
This behavior is a feature, not
a bug.  A database is supposed to store and retrieve data and it 
should not matter to the database what format that data is in.
The strong tyòŒ5ƒ   C˜'The UINT Collating Sequence1. Overview

 The UINT collating sequences is a loadable extension for
SQLite that implements a new collating sequence that compares text
containing unsigned integers in numeric order.

 The UINT collating sequence is not a standard part of SQLite.
It must be loaded as a separate extension.  The source code to
UINT is in the uint.c source file
in the ext/misc/ folder of the
SQLite source tree.

 The UINT collating sequence is not included in standard builds of
the SQLite library, but it is loaded by default in the CLI.  This
is typical of the CLI which loads various extensions above and beyond
what are available in the standard SQLite library.

 The UINT collating sequence works just like the default
BINARY collating sequence 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 to integers that can be expressed as a
64-bit machine integer.


2. Example:



COLLATE binaryCOLLATE uint

'0000123457'
'123456'
'abc0000000010xyz'
'abc0010xyy'
'abc10xzz'
'abc674xyz'
'abc87xyz'
'abc9xyz'

'123456'
'0000123457'
'abc9xyz'
'abc0010xyy'
'abc0000000010xyz'
'abc10xzz'
'abc87xyz'
'abc674xyz'


This page last modified on  2020-05-14 00:36:17 UTCuintcseq.htmláƒ
KÁ?'Automatic Undo/Redo With SQLiteAutomatic Undo/Redo Using SQLite



This page demonstrates how to use triggers to implement undo/redo 
logic for an application that uses SQLite as its 
application file format.

Object-Oriented Design


This design note considers the database to be a collection of objects.
Each SQL table is a class.
Each row is an instance of that class.
There are, of course, other ways to interpret an SQL database schema,
and the techniques described here worï¡Sƒ   /Âa+SQLite ConsortiumThe SQLite Consortium


The SQLite Consortium is a membership association dedicated to
insuring the continuing vitality and independence of SQLite.
SQLite is high-quality, public domain software.  The goal of
the SQLite Consortium is to make sure it stays that way.



Consortium members contribute funding to support the ongoing
development and maintenance of SQLite and in return receive
enterprise-level technical support and legal assurances that
SQLite will íðk equally well under alternative
interpretations, but an object-oriented view seems be more natural
to most contemporary programmers.

Capture Changes Using Triggers


The core idea is to create a special table (named "UNDOLOG" in the example)
that holds information needed to undo/redo changes to the database. 
For each class (table) in the database that wants to participate in 
the undo/redo, triggers are created that cause entries to be made in 
the UNDOLOG table for each DELETE, INSERT, and UPDATE of the participating
class.
The UNDOLOG entries consist of ordinary SQL statements the can be
played back to reverse the changes.


For example, suppose you wanted undo/redo on a class (table)
that looks like this:


CREATE TABLE ex1(a,b,c);



Triggers to record changes to table EX1 might look like this:


CREATE TEMP TRIGGER ex1_it AFTER INSERT ON ex1 BEGIN
  INSERT INTO undolog VALUES(NULL,'DELETE FROM ex1 WHERE rowid='||new.rowid);
END;
CREATE TEMP TRIGGER ex1_ut AFTER UPDATE ON ex1 BEGIN
  INSERT INTO undolog VALUES(NULL,'UPDATE ex1
     SET a='||quote(old.a)||',b='||quote(old.b)||',c='||quote(old.c)||'
   WHERE rowid='||old.rowid);
END;
CREATE TEMP TRIGGER ex1_dt BEFORE DELETE ON ex1 BEGIN
  INSERT INTO undolog VALUES(NULL,'INSERT INTO ex1(rowid,a,b,c)
    VALUES('||old.rowid||','||quote(old.a)||','||quote(old.b)||
           ','||quote(old.c)||')');
END;



After each INSERT on ex1, the ex1_it trigger constructs text of a 
DELETE statement that will undo the INSERT. The ex1_ut trigger constructs 
an UPDATE statement that will undo the effects of an UPDATE. 
And the ex1_dt trigger constructs a statement that will undo the 
effects of a DELETE.


Note the use of the quote() SQL function in these triggers.
The quote() function converts its argument into a form 
that is appropriate for inclusion in an SQL statement. Numeric values 
come through unchanged. Single quotes are added before and after 
strings and any internal single quotes are escaped.  BLOB values
are rendered using SQL-standard hexadecimal BLOB notation.  The
use of the quote() function ensures that the SQL statements used to
undo and redo are always safe from SQL injection.

Automatic Creation Of Triggers


Triggers such as the above could be entered manually, but that is tedious.
An important feature of the technique demonstrated below is 
that the triggers are generated automatically.


The implementation language for the example code is 
TCL, though you can easily do the same thing 
in another programming language.
Remember that the code here is a demonstration of the technique,
not a drop-in module that will automatically do everything for you.
The demonstration code shown below is derived from actual code 
in production use. But you will need to make changes to tailor it 
to your application.


To activate the undo/redo logic, invoke the undo::activate command 
with all classes (tables) that are to participate in the undo/redo 
as arguments. Use undo::deactivate, undo::freeze, and undo::unfreeze 
to control the state of the undo/redo mechanism.


The undo::activate command creates temporary triggers in the database
that record all changes made to the tables named in the arguments.

Application Interface


After a sequence of changes that define a single undo/redo step, 
invoke the undo::barrier command to define the limit of that step. 
In an interactive program, you can call undo::event after any change 
and undo::barrier will be called automatically as an idle callback.


When the user presses the Undo button, invoke undo::undo. 
Invoke undo::redo when the user presses the Redo button.


On each call to undo::undo or undo::redo, the undo/redo module 
automatically invokes methods status_refresh and reload_all in 
all toplevel namespaces. These methods should be defined to 
reconstruct the display or otherwise update the state of the 
program based on the undone/redone changes to the database.


The demonstration code below includes a status_refresh method 
that grays-out or activates the Undo and Redo buttons and menu 
entries depending on whetheñr or not there is anything to be 
undone or redone. You will need to redefine this method to 
control the Undo and Redo buttons in your application.


The demonstration code assumes that the SQLite database is 
opened used as a database object named "db".

Example Code



# Everything goes in a private namespace
namespace eval ::undo {

# proc:  ::undo::activate TABLE ...
# title: Start up the undo/redo system
#
# Arguments should be one or more database tables (in the database associated
# with the handle "db") whose changes are to be recorded for undo/redo
# purposes.
#
proc activate {args} {
  variable _undo
  if {$_undo(active)} return
  eval _create_triggers db $args
  set _undo(undostack) {}
  set _undo(redostack) {}
  set _undo(active) 1
  set _undo(freeze) -1
  _start_interval
}

# proc:  ::undo::deactivate
# title: Halt the undo/redo system and delete the undo/redo stacks
#
proc deactivate {} {
  variable _undo
  if {!$_undo(active)} return
  _drop_triggers db
  set _undo(undostack) {}
  set _undo(redostack) {}
  set _undo(active) 0
  set _undo(freeze) -1
}

# proc:  ::undo::freeze
# title: Stop accepting database changes into the undo stack
#
# From the point when this routine is called up until the next unfreeze,
# new database changes are rejected from the undo stack.
#
proc freeze {} {
  variable _undo
  if {!&#91;info exists _undo(freeze)&#93;} return
  if {$_undo(freeze)>=0} {error "recursive call to ::undo::freeze"}
  set _undo(freeze) &#91;db one {SELECT coalesce(max(seq),0) FROM undolog}&#93;
}

# proc:  ::undo::unfreeze
# title: Begin accepting undo actions again.
#
proc unfreeze {} {
  variable _undo
  if {!&#91;info exists _undo(freeze)&#93;} return
  if {$_undo(freeze)$_undo(freeze)"
  set _undo(freeze) -1
}

# proc:  ::undo::event
# title: Something undoable has happened
#
# This routine is called whenever an undoable action occurs.  Arrangements
# are made to invoke ::undo::barrier no later than the next idle moment.
#
proc event {} {
  variable _undo
  if {$_undo(pending)==""} {
    set _undo(pending) &#91;after idle ::undo::barrier&#93;
  }
}

# proc:  ::undo::barrier
# title: Create an undo barrier right now.
#
proc barrier {} {
  variable _undo
  catch {after cancel $_undo(pending)}
  set _undo(pending) {}
  if {!$_undo(active)} {
    refresh
    return
  }
  set end &#91;db one {SELECT coalesce(max(seq),0) FROM undolog}&#93;
  if {$_undo(freeze)>=0 && $end>$_undo(freeze)} {set end $_undo(freeze)}
  set begin $_undo(firstlog)
  _start_interval
  if {$begin==$_undo(firstlog)} {
    refresh
    return
  }
  lappend _undo(undostack) &#91;list $begin $end&#93;
  set _undo(redostack) {}
  refresh
}

# proc:  ::undo::undo
# title: Do a single step of undo
#
proc undo {} {
  _step undostack redostack
}

# proc:  ::undo::redo
# title: Redo a single step
#
proc redo {} {
  _step redostack undostack
}

# proc:   ::undo::refresh
# title:  Update the status of controls after a database change
#
# The undo module calls this routine after any undo/redo in order to
# cause controls gray out appropriately depending on the current state
# of the database.  This routine works by invoking the status_refresh
# module in all top-level namespaces.
#
proc refresh {} {
  set body {}
  foreach ns &#91;namespace children ::&#93; {
    if {&#91;info proc ${ns}::status_refresh&#93;==""} continue
    append body ${ns}::status_refresh\n
  }
  proc ::undo::refresh {} $body
  refresh
}

# proc:   ::undo::reload_all
# title:  Redraw everything based on the current database
#
# The undo module calls this routine after any undo/redo in order to
# cause the screen to be completely redrawn based on the current database
# contents.  This is accomplished by calling the "reload" module in
# every top-level namespace other than ::undo.
#
proc reload_all {} {
  set body {}
  foreach ns &#91;namespace children ::&#93; {
    if {&#91;info proc ${ns}::reload&#93;==""} continue
    append body ${ns}::reload\n
  }
  proc ::undo::reload_all {} $body
  reload_all
}

##############################################################################
# The public interface to this module is above.  Routines and variables that
# follow (and whose names begin with "_") are private to this module.
##############################################################################

# state information
#
set _undo(active) 0
set _undo(undostack) {}
set _undo(redostack) {}
set _undo(pending) {}
set _undo(firstlog) 1
set _undo(startstate) {}


# proc:  ::undo::status_refresh
# title: Enable and/or disable menu options a buttons
#
proc status_refresh {} {
  variable _undo
  if {!$_undo(active) || &#91;llength $_undo(undostack)&#93;==0} {
    .mb.edit entryconfig Undo -state disabled
    .bb.undo config -state disabled
  } else {
    .mb.edit entryconfig Undo -state normal
    .bb.undo config -state normal
  }
  if {!$_undo(active) || &#91;llength $_undo(redostack)&#93;==0} {
    .mb.edit entryconfig Redo -state disabled
    .bb.redo config -state disabled
  } else {
    .mb.edit entryconfig Redo -state normal
    .bb.redo config -state normal
  }
}

# xproc:  ::undo::_create_triggers DB TABLE1 TABLE2 ...
# title:  Create change recording triggers for all tables listed
#
# Create a temporary table in the database named "undolog".  Create
# triggers that fire on any insert, delete, or update of TABLE1, TABLE2, ....
# When those triggers fire, insert records in undolog that contain
# SQL text for statements that will undo the insert, delete, or update.
#
proc _create_triggers {db args} {
  catch {$db eval {DROP TABLE undolog}}
  $db eval {CREATE TEMP TABLE undolog(seq integer primary key, sql text)}
  foreach tbl $args {
    set collist &#91;$db eval "pragma table_info($tbl)"&#93;
    set sql "CREATE TEMP TRIGGER _${tbl}_it AFTER INSERT ON $tbl BEGIN\n"
    append sql "  INSERT INTO undolog VALUES(NULL,"
    append sql "'DELETE FROM $tbl WHERE rowid='||new.rowid);\nEND;\n"

    append sql "CREATE TEMP TRIGGER _${tbl}_ut AFTER UPDATE ON $tbl BEGIN\n"
    append sql "  INSERT INTO undolog VALUES(NULL,"
    append sql "'UPDATE $tbl "
    set sep "SET "
    foreach {x1 name x2 x3 x4 x5} $collist {
      append sql "$sep$name='||quote(old.$name)||'"
      set sep ","
    }
    append sql " WHERE rowid='||old.rowid);\nEND;\n"

    append sql "CREATE TEMP TRIGGER _${tbl}_dt BEFORE DELETE ON $tbl BEGIN\n"
    append sql "  INSERT INTO undolog VALUES(NULL,"
    append sql "'INSERT INTO ${tbl}(rowid"
    foreach {x1 name x2 x3 x4 x5} $collist {append sql ,$name}
    append sql ") VALUES('||old.rowid||'"
    foreach {x1 name x2 x3 x4 x5} $collist {append sql ,'||quote(old.$name)||'}
    append sql ")');\nEND;\n"

    $db eval $sql
  }
}

# xproc:  ::undo::_drop_triggers DB
# title:  Drop all of the triggers that _create_triggers created
#
proc _drop_triggers {db} {
  set tlist &#91;$db eval {SELECT name FROM sqlite_temp_schema
                       WHERE type='trigger'}&#93;
  foreach trigger $tlist {
    if {!&#91;regexp {_.*_(i|u|d)t$} $trigger&#93;} continue
    $db eval "DROP TRIGGER $trigger;"
  }
  catch {$db eval {DROP TABLE undolog}}
}

# xproc: ::undo::_start_interval
# title: Record the starting conditions of an undo interval
#
proc _start_interval {} {
  variable _undo
  set _undo(firstlog) &#91;db one {SELECT coalesce(max(seq),0)+1 FROM undolog}&#93;
}

# xproc: ::undo::_step V1 V2
# title: Do a single step of undo or redo
#
# For an undo V1=="undostack" and V2=="redostack".  For a redo,
# V1=="redostack" and V2=="undostack".
#
proc _step {v1 v2} {
  variable _undo
  set op &#91;lindex $_undo($v1) end&#93;
  set _undo($v1) &#91;lrange $_undo($v1) 0 end-1&#93;
  foreach {begin end} $op break
  db eval BEGIN
  set q1 "SELECT sql FROM undolog WHERE seq>=$begin AND seq=$begin AND seq
This page last modified on  2022-02-17 17:47:49 UTCundoredo.htmlóping system found in most other SQL engines and
codified in the SQL language spec is a misfeature -
it is an example of the implementation showing through into the
interface.  SQLite seeks to overcome this misfeature by allowing
you to store any kind of data into any kind of column and by
allowing flexibility in the specification of datatypes.



A datatype to SQLite is any sequence of zero or more names
optionally followed by a parenthesized lists of one or two
signed integers.  Notice in particular that a datatype may
be zero or more names.  That means that an empty
string is a valid datatype as far as SQLite is concerned.
So you can declare tables where the datatype of each column
is left unspecified, like this:



CREATE TABLE ex1(a,b,c);



Even though SQLite allows the datatype to be omitted, it is
still a good idea to include it in your CREATE TABLE statements,
since the data type often serves as a good hint to other
programmers about what you intend to put in the column. And
if you ever port your code to another database engine, that
other engine will probably require a datatype of some kind.
SQLite accepts all the usual datatypes.  For example:



CREATE TABLE ex2(
  a VARCHAR(10),
  b NVARCHAR(15),
  c TEXT,
  d INTEGER,
  e FLOAT,
  f BOOLEAN,
  g CLOB,
  h BLOB,
  i TIMESTAMP,
  j NUMERIC(10,5)
  k VARYING CHARACTER (24),
  l NATIONAL VARYING CHARACTER(16)
);



And so forth.  Basically any sequence of names optionally followed by 
one or two signed integers in parentheses will do.


2.0 &nbsp; The INTEGER PRIMARY KEY


One exception to the typelessness of SQLite is a column whose type
is INTEGER PRIMARY KEY.  (And you must use "INTEGER" not "INT".
A column of type INT PRIMARY KEY is typeless just like any other.)
INTEGER PRIMARY KEY columns must contain a 32-bit signed integer.  Any
attempt to insert non-integer data will result in an error.



INTEGER PRIMARY KEY columns can be used to implement the equivalent
of AUTOINCREMENT.  If you try to insert a NULL into an INTEGER PRIMARY
KEY column, the column will actually be filled with an integer that is
one greater than the largest key already in the table.  Or if the
largest key is 2147483647, then the column will be filled with a
random integer.  Either way, the INTEGER PRIMARY KEY column will be
assigned a unique integer.  You can retrieve this integer using
the sqlite_last_insert_rowid() API function or using the
last_insert_rowid() SQL function in a subsequent SELECT statement.


3.0 &nbsp; Comparison and Sort Order


SQLite is typeless for the purpose of deciding what data is allowed
to be stored in a column.  But some notion of type comes into play
when sorting and comparing data.  For these purposes, a column or
an expression can be one of two types: numeric and text.
The sort or comparison may give different results depending on which
type of data is being sorted or compared.



If data is of type text then the comparison is determined by
the standard C data comparison functions memcmp() or
strcmp().  The comparison looks at bytes from two inputs one
by one and returns the first non-zero difference.
Strings are '\000' terminated so shorter
strings sort before longer strings, as you would expect.



For numeric data, this situation is more complex.  If both inputs
look like well-formed numbers, then they are converted
into floating point values using atof() and compared numerically.
If one input is not a well-formed number but the other is, then the
number is considered to be less than the non-number.  If neither inputs
is a well-formed number, then strcmp() is used to do the
comparison.



Do not be confused by the fact that a column might have a "numeric"
datatype.  This does not mean that the column can contain only numbers.
It merely means that if the column does contain a number, that number
will sort in numerical order.



For both text and numeric values, NULL sorts before any other value.
A comparison of any value against NULL using operators like "&lt;" or
"&gt;=" is always false.


4.0 &nbsp; How SQLite Determines Datatypes


For SQLite version 2.6.3 and earlier, all values used the numeric datatype.
The text datatype appears in version 2.7.0 and later.  In the sequel it
is assumed that you are using version 2.7.0 or later of SQLite.



For an expression, the datatype of the result is often determined by
the outermost operator.  For example, arithmetic operators ("+", "*", "%")
always return a numeric results.  The string concatenation operator
("||") returns a text result.  And so forth.  If you are ever in doubt
about the datatype of an expression you can use the special typeof()
SQL function to determine what the datatype is.  For example:



sqlite&gt; SELECT typeof('abc'+123);
numeric
sqlite&gt; SELECT typeof('abc'||123);
text



For table columns, the datatype is determined by the type declaration
of the CREATE TABLE statement.  The datatype is text if and only if
the type declaration contains one or more of the following strings:



BLOB
CHAR
CLOB
TEXT



The search for these strings in the type declaration is case insensitive,
of course.  If any of the above strings occur anywhere in the type
declaration, then the datatype of the column is text.  Notice that
the type "VARCHAR" contains "CHAR" as a substring so it is considered
text.

If none of the strings above occur anywhere in the type declaration,
then the datatype is numeric.  Note in particular that the datatype for columns
with an empty type declaration is numeric.


5.0 &nbsp; Examples


Consider the following two command sequences:



CREATE TABLE t1(a INTEGER UNIQUE);        CREATE TABLE t2(b TEXT UNIQUE);
INSERT INTO t1 VALUES('0');               INSERT INTO t2 VALUES(0);
INSERT INTO t1 VALUES('0.0');             INSERT INTO t2 VALUES(0.0);


In the sequence on the left, the second insert will fail.  In this case,
the strings '0' and '0.0' are treated as numbers since they are being 
inserted into a numeric column but 0==0.0 which violates the uniqueness
constraint.  However, the second insert in the right-hand sequence works.  In
this case, the constants 0 and 0.0 are treated a strings which means that
they are distinct.

SQLite always converts numbers into double-precision (64-bit) floats
for comparison purposes.  This means that a long sequence of digits that
differ only in insignificant digits will compare equal if they
are in a numeric column but will compare unequal if they are in a text
column.  We have:


INSERT INTO t1                            INSERT INTO t2
   VALUES('12345678901234567890');           VALUES(12345678901234567890);
INSERT INTO t1                            INSERT INTO t2
   VALUES('12345678901234567891');           VALUES(12345678901234567891);


As before, the second insert on the left will fail because the comparison
will convert both strings into floating-point number first and the only
difference in the strings is in the 20-th digit which exceeds the resolution
of a 64-bit float.  In contrast, the second insert on the right will work
because in that case, the numbers being inserted are strings and are
compared using memcmp().


Numeric and text types make a difference for the DISTINCT keyword too:



CREATE TABLE t3(a INTEGER);               CREATE TABLE t4(b TEXT);
INSERT INTO t3 VALUES('0');               INSERT INTO t4 VALUES(0);
INSERT INTO t3 VALUES('0.0');             INSERT INTO t4 VALUES(0.0);
SELECT DISTINCT * FROM t3;                SELECT DISTINCT * FROM t4;



The SELECT statement on the left returns a single row since '0' and '0.0'
are treated as numbers and are therefore indistinct.  But the SELECT 
statement on the right returns two rows since 0 and 0.0 are treated
a strings which are different.
This page last modified on  2016-02-17 04:59:42 UTCdatatypes.html
dd™Žú             3#±K/Write-Ahead Logging1. OverviewThe default method by which SQLite implements
atomic commit and rollback is a rollback journal.
Beginning with version 3.7.0 (2010-07-21), a new "Write-Ahead Log" option
(hereafter referred to as "WAL") is available.

There are advantages and disadvantages to using WAL instead of
a rollback journal.  Advantages include:




WAL is significantly faster in most scenarios.
WAL provides more concurrency as readers do not block writers and 
    a writer does not block readers.  Reading and writing can proceed 
    concurrently.
Disk I/O operations tends to be more sequential using WAL.
WAL uses many fewer fsync() operations and is thus less vulnerable to
    problems on systems where the fsync() system call is broken.


But there are also disadvantages:


WAL normally requires that the VFS 
    support shared-memory primitives.
    (Exception: WAL without shared memory)
    The built-in unix and windows VFSes
    support this but third-party extension VFSes for custom operating
    systems might not.
All processes using a database must be on the same host computer;
    WAL does not work over a network filesystem.
Transactions that involve changes against multiple ATTACHed
    databases are atomic for each individual database, but are not
    atomic across all databases as a set.
It is not possible to change the page_size after entering WAL
    mode, either on an empty database or by using VACUUM or by restoring
    from a backup using the backup API.  You must be in a rollback journal
    mode to change the page size.
It is not possible to open read-only WAL databases.
    The opening process must have write privileges for "-shm"
    wal-index shared memory file associated with the database, if that
    file exists, or else write access on the directory containing
    the database file if the "-shm" file does not exist.
    Beginning with version 3.22.0 (2018-01-22), a read-only 
    WAL-mode database file can be opened if
    the -shm and -wal files
    already exists or those files can be created or the
    database is immutable.
WAL might be very slightly slower (perhaps 1% or 2% slower)
    than the traditional rollback-journal approach
    in applications that do mostly reads and seldom write.
There is an additional quasi-persistent "-wal" file and
    "-shm" shared memory file associated with each
    database, which can make SQLite less appealing for use as an 
    application file-format.
There is the extra operation of checkpointing which, though automatic
    by default, is still something that application developers need to
    be mindful of.
WAL works best with smaller transactions.  WAL does
    not work well for very large transactions.  For transactions larger than
    about 100 megabytes, traditional rollback journal modes will likely
    be faster.  For transactions in excess of a gigabyte, WAL mode may 
    fail with an I/O or disk-full error.
    It is recommended that one of the rollback journal modes be used for
    transactions larger than a few dozen megabytes.
    Beginning with version 3.11.0 (2016-02-15), 
    WAL mode works as efficiently with
    large transactions as does rollback mode.wal.html#overview
¾¾ˆBŽú   31  9Write-Ahead Logging2.1. CheckpointingOf course, one wants to eventually transfer all the transactions that
are appended in the WAL file back into the original database.  Moving
the WAL file transactions back into the database is called a
"checkpoint".

Another way to think about the difference between rollback and 
write-ahead log is that in the rollback-journal
approach, there are two primitive operations, reading and writing,
whereas with a write-ahead log
there are now three primitive operations:  reading, writing, and
checkpointing.

By default, SQLite does a checkpoint automatically when the WAL file
reaches a threshold size of 1000 pages.  (The
SQLITE_DEFAULT_WAL_AUTOCHECKPOINT compile-time option can be used to
specify a different default.) Applications using WAL do
not have to do anything in order to for these checkpoints to occur.  
But if they want to, applications can adjust the automatic checkpoint
threshold.  Or they can turn off the automatic checkpoints and run 
checkpoints during idle moments or in a separate thread or process.wal.html#checkpointing‡vŽú
        3-Žu9Write-Ahead Logging2. How WAL WorksThe traditional rollback journal works by writing a copy of the
original unchanged database content into a separate rollback journal file
and then writing changes directly into the database file.  In the
event of a crash or ROLLBACK, the original content contained in the
rollback journal is played back into the database file to
revert the database file to its original state.  The COMMIT occurs
when the rollback journal is deleted.

The WAL approach inverts this.  The original content is preserved
in the database file and the changes are appended into a separate
WAL file.  A COMMIT occurs when a special record indicating a commit
is appended to the WAL.  Thus a COMMIT can happen without ever writing
to the original database, which allows readers to continue operating
from the original unaltered database while changes are simultaneously being
committed into the WAL.  Multiple transactions can be appended to the
end of a single WAL file.wal.html#how_wal_works
dd—Žú      3--;5Write-Ahead Logging2.2. ConcurrencyWhen a read operation begins on a WAL-mode database, it first
remembers the location of the last valid commit record in the WAL.
Call this point the "end mark".  Because the WAL can be growing and
adding new commit records while various readers connect to the database,
each reader can potentially have its own end mark.  But for any
particular reader, the end mark is unchanged for the duration of the
transaction, thus ensuring that a single read transaction only sees
the database content as it existed at a single point in time.

When a reader needs a page of content, it first checks the WAL to
see if that page appears there, and if so it pulls in the last copy
of the page that occurs in the WAL prior to the reader's end mark.
If no copy of the page exists in the WAL prior to the reader's end mark,
then the page is read from the original database file.  Readers can
exist in separate processes, so to avoid forcing every reader to scan
the entire WAL looking for pages (the WAL file can grow to
multiple megabytes, depending on how often checkpoints are run), a
data structure called the "wal-index" is maintained in shared memory
which helps readers locate pages in the WAL quickly and with a minimum
of I/O.  The wal-index greatly improves the performance of readers,
but the use of shared memory means that all readers must exist on the
same machine.  This is why the write-ahead log implementation will not
work on a network filesystem.

Writers merely append new content to the end of the WAL file.
Because writers do nothing that would interfere with the actions of
readers, writers and readers can run at the same time.  However,
since there is only one WAL file, there can only be one writer at
a time.

A checkpoint operation takes content from the WAL file
and transfers it back into the original database file.
A checkpoint can run concurrently with readers, however the checkpoint
must stop when it reaches a page in the WAL that is past the end mark
of any current reader.  The checkpoint has to stop at that point because
otherwise it might overwrite part of the database file that the reader
is actively using.  The checkpoint remembers (in the wal-index) how far
it got and will resume transferring content from the WAL to the database
from where it left off on the next invocation.

Thus a long-running read transaction can prevent a checkpointer from
making progress.  But presumably every read transaction will eventually
end and the checkpointer will be able to continue.

Whenever a write operation occurs, the writer checks how much progress
the checkpointer has made, and if the entire WAL has been transferred into
the database and synced and if no readers are making use of the WAL, then
the writer will rewind the WAL back to the beginning and start putting new
transactions at the beginning of the WAL.  This mechanism prevents a WAL
file from growing without bound.wal.html#concurrency
RRŸ)Žú
     3K½#SWrite-Ahead Logging2.3. Performance ConsiderationsWrite transactions are very fast since they only involve writing
the content once (versus twice for rollback-journal transactions)
and because the writes are all sequential.  Further, syncing the
content to the disk is not required, as long as the application is
willing to sacrifice durability following a power loss or hard reboot.
(Writers sync the WAL on every transaction commit if
PRAGMA synchronous is set to FULL but omit this sync if
PRAGMA synchronous is set to NORMAL.)

On the other hand, read performance deteriorates as the WAL file
grows in size since each reader must check the WAL file for the content
and the time needed to check the WAL file is proportional
to the size of the WAL file.  The wal-index helps find content
in the WAL file much faster, but performance still falls off with
increasing WAL file size.  Hence, to maintain good read performance 
it is important to keep the WAL file size down by
running checkpoints at regular intervals.

Checkpointing does require sync operations in order to avoid
the possibility of database corruption following a power loss
or hard reboot.  The WAL must be synced to persistent storage
prior to moving content from the WAL into the database and the
database file must by synced prior to resetting the WAL.
Checkpoint also requires more seeking.
The checkpointer makes an effort to
do as many sequential page writes to the database as it can (the pages
are transferred from WAL to database in ascending order) but even
then there will typically be many seek operations interspersed among
the page writes.  These factors combine to make checkpoints slower than
write transactions.

The default strategy is to allow successive write transactions to
grow the WAL until the WAL becomes about 1000 pages in size, then to
run a checkpoint operation for each subsequent COMMIT until the WAL
is reset to be smaller than 1000 pages.  By default, the checkpoint will be
run automatically by the same thread that does the COMMIT that pushes
the WAL over its size limit.  This has the effect of causing most
COMMIT operations to be very fast but an occasional COMMIT (those that trigger
a checkpoint) to be much slower.  If that effect is undesirable, then
the application can disable automatic checkpointing and run the
periodic checkpoints in a separate thread, or separate process.
(Links to commands and interfaces to accomplish this are
shown below.)


Note that with PRAGMA synchronous set to NORMAL, the checkpoint
is the only operation to issue an I/O barrier or sync operation
(fsync() on unix or FlushFileBuffers() on windows).  If an application
therefore runs checkpoint in a separate thread or process, the main
thread or process that is doing database queries and updates will never
block on a sync operation.  This helps to prevent "latch-up" in applications
running on a busy disk drive.  The downside to
this configuration is that transactions are no longer durable and
might rollback following a power failure or hard reset.


Notice too that there is a tradeoff between average read performance
and average write performance.  To maximize the read performance,
one wants to keep the WAL as small as possible and hence run checkpoints
frequently, perhaps as often as every COMMIT.  To maximize
write performance, one wants to amortize the cost of each checkpoint
over as many writes as possible, meaning that one wants to run checkpoints
infrequently and let the WAL grow as large as possible before each 
checkpoint.  The decision of how often to run checkpoints may therefore
vary from one application to another depending on the relative read
and write performance requirements of the application.
The default strategy is to run a checkpoint once the WAL
reaches 1000 pages and this strategy seems to work well in test applications on 
workstations, but other strategies might work better on different 
platforms or for different workloads.wal.html#performance_considerations
í
m      ;zíŽú  3EŒmMWrite-Ahead Logging3.3. Persistence of WAL modeUnlike the other journaling modes, 
PRAGMA journal_mode=WAL is
persistent.  If a process sets WAL mode, then closes and reopens the
database, the database will come back in WAL mode.  In contrast, if
a process sets (for example) PRAGMA journal_mode=TRUNCATE and then closes and
reopens the database will come back up in the default rollback mode of
DELETE rather than the previous TRUNCATE setting.

The persistence of WAL mode means that applications can be converted
to using SQLite in WAL mode without making any changes to the application
itself.  One has merely to run "PRAGMA journal_mode=WAL;" on the
database file(s) using the command-line shell or other utility, then
restart the application.

The WAL journal mode will be set on all
connections to the same database file if it is set on any one connection.wal.html#persistence_of_wal_mode‡<Žú  3Y-aWrite-Ahead Logging3.2. Application-Initiated CheckpointsAn application can initiate a checkpoint using any writable database
connection on the database simply by invoking
sqlite3_wal_checkpoint() or sqlite3_wal_checkpoint_v2().
There are three subtypes of checkpoints that vary in their aggressiveness:
PASSIVE, FULL, and RESTART.  The default checkpoint style is PASSIVE, which
does as much work as it can without interfering with other database
connections, and which might not run to completion if there are
concurrent readers or writers.
All checkpoints initiated by sqlite3_wal_checkpoint() and
by the automatic checkpoint mechanism are PASSIVE.  FULL and RESTART
checkpoints try harder to run the checkpoint to completion and can only
be initiated by a call to sqlite3_wal_checkpoint_v2().  See the
sqlite3_wal_checkpoint_v2() documentation for additional information
on FULL and RESET checkpoints.wal.html#application_initiated_checkpointsˆ-Žú   3?CGWrite-Ahead Logging3.1. Automatic CheckpointBy default, SQLite will automatically checkpoint whenever a COMMIT
occurs that causes the WAL file to be 1000 pages or more in size, or when the 
last database connection on a database file closes.  The default 
configuration is intended to work well for most applications.
But programs that want more control can force a checkpoint
using the wal_checkpoint pragma or by calling the
sqlite3_wal_checkpoint() C interface.  The automatic checkpoint
threshold can be changed or automatic checkpointing can be completely
disabled using the wal_autocheckpoint pragma or by calling the
sqlite3_wal_autocheckpoint() C interface.  A program can also 
use sqlite3_wal_hook() to register a callback to be invoked whenever
any transaction commits to the WAL.  This callback can then invoke
sqlite3_wal_checkpoint() or sqlite3_wal_checkpoint_v2() based on whatever
criteria it thinks is appropriate.  (The automatic checkpoint mechanism
is implemented as a simple wrapper around sqlite3_wal_hook().)wal.html#automatic_checkpoint…Žú        3YˆMeWrite-Ahead Logging3. Activating And Configuring WAL ModeAn SQLite database connection defaults to 
journal_mode=DELETE.  To convert to WAL mode, use the
following pragma:


PRAGMA journal_mode=WAL;


The journal_mode pragma returns a string which is the new journal mode.
On success, the pragma will return the string "wal".  If 
the conversion to WAL could not be completed (for example, if the VFS
does not support the necessary shared-memory primitives) then the
journaling mode will be unchanged and the string returned from the
primitive will be the prior journaling mode (for example "delete").wal.html#activating_and_configuring_wal_mode
»
…»‡EŽú      39{EWrite-Ahead Logging5. Read-Only DatabasesOlder versions of SQLite could not read a WAL-mode database that was
read-only.  In other words, write access was required in order to read a
WAL-mode database.  This constraint was relaxed beginning with
SQLite version 3.22.0 (2018-01-22).

On newer versions of SQLite,
a WAL-mode database on read-only media, or a WAL-mode database that lacks
write permission, can still be read as long as one or more of the following
conditions are met:

The -shm and -wal files already exists and are readable
There is write permission on the directory containing the database so
    that the -shm and -wal files can be created.
The database connection is opened using the
    immutable query parameter.


Even though it is possible to open a read-only WAL-mode database,
it is good practice to converted to 
PRAGMA journal_mode=DELETE prior to burning an
SQLite database image onto read-only media.wal.html#read_only_databasesŠvŽú    3+”y7Write-Ahead Logging4. The WAL FileWhile a database connection is open on a WAL-mode database, SQLite
maintains an extra journal file called a "Write Ahead Log" or "WAL File".
The name of this file on disk is usually the name of the database file
with an extra "-wal" suffix, though different naming rules may
apply if SQLite is compiled with SQLITE_ENABLE_8_3_NAMES.

The WAL file exists for as long as any database connection has the
database open.  Usually, the WAL file is deleted automatically when the
last connection to the database closes.  However, if the last process to
have the database open exits without cleanly
shutting down the database connection, or if the 
SQLITE_FCNTL_PERSIST_WAL file control is used, then the WAL file
might be retained on disk after all connections to the database have
been closed.  The WAL file is part of the persistent state of the
database and should be kept with the database if the database is copied
or moved.  If a database file is separated from its WAL file, then
transactions that were previously committed to the database might be lost,
or the database file might become corrupted.
The only safe way to remove a WAL file is
to open the database file using one of the sqlite3_open() interfaces
then immediately close the database using sqlite3_close().

The WAL file format is precisely defined and is cross-platform.wal.html#the_wal_file
OO,Žú        3[¹gWrite-Ahead Logging6. Avoiding Excessively Large WAL FilesIn normal cases, new content is appended to the WAL file until the
WAL file accumulates about 1000 pages (and is thus about 4MB 
in size) at which point a checkpoint is automatically run and the WAL file
is recycled.  The checkpoint does not normally truncate the WAL file
(unless the journal_size_limit pragma is set).  Instead, it merely
causes SQLite to start overwriting the WAL file from the beginning.
This is done because it is normally faster to overwrite an existing file
than to append.  When the last connection to a database closes, that
connection does one last checkpoint and then deletes the WAL and its
associated shared-memory file, to clean up the disk.

So in the vast majority of cases, applications need not worry about
the WAL file at all.  SQLite will automatically take care of it.  But
it is possible to get SQLite into a state where the WAL file will grow
without bound, causing excess disk space usage and slow queries speeds.
The following bullets enumerate some of the ways that this can happen
and how to avoid them.



Disabling the automatic checkpoint mechanism.
In its default configuration, SQLite will checkpoint the WAL file at the
conclusion of any transaction when the WAL file is more than 1000 pages
long.  However, compile-time and run-time options exist that can disable
or defer this automatic checkpoint.  If an application disables the
automatic checkpoint, then there is nothing to prevent the WAL file
from growing excessively.


Checkpoint starvation.
A checkpoint is only able to run to completion, and reset the WAL file,
if there are no other database connections using the WAL file.  If another
connection has a read transaction open,
then the checkpoint cannot reset the WAL file because
doing so might delete content out from under the reader.
The checkpoint will do as much work as it can without upsetting the
reader, but it cannot run to completion.
The checkpoint will start up again where it left off after the next
write transaction.  This repeats until some checkpoint is able to complete.

However, if a database has many concurrent overlapping readers
and there is always at least one active reader, then
no checkpoints will be able to complete
and hence the WAL file will grow without bound.

This scenario can be avoided by ensuring that there are "reader gaps":
times when no processes are reading from the 
database and that checkpoints are attempted during those times.
In applications with many concurrent readers, one might also consider 
running manual checkpoints with the SQLITE_CHECKPOINT_RESTART or
SQLITE_CHECKPOINT_TRUNCATE option which will ensure that the checkpoint
runs to completion before returning.  The disadvantage of using
SQLITE_CHECKPOINT_RESTART and SQLITE_CHECKPOINT_TRUNCATE is that
readers might block while the checkpoint is running.


Very large write transactions.
A checkpoint can only complete when no other transactions are running, 
which means the WAL file cannot be reset in the middle of a write
transaction.  So a large change to a large database
might result in a large WAL file.  The WAL file will be checkpointed
once the write transaction completes (assuming there are no other readers
blocking it) but in the meantime, the file can grow very big.

As of SQLite version 3.11.0 (2016-02-15), 
the WAL file for a single transaction
should be proportional in size to the transaction itself.  Pages that
are changed by the transaction should only be written into the WAL file
once.  However, with older versions of SQLite, the same page might be
written into the WAL file multiple times if the transaction grows larger
than the page cache.wal.html#avoiding_excessively_large_wal_files
ŽìŽŽYŽú      3S›o_Write-Ahead Logging8. Use of WAL Without Shared-MemoryBeginning in SQLite version 3.7.4 (2010-12-07), 
WAL databases can be created, read, and
written even if shared memory is unavailable as long as the
locking_mode is set to EXCLUSIVE before the first attempted access.
In other words, a process can interact with
a WAL database without using shared memory if that
process is guaranteed to be the only process accessing the database.
This feature allows WAL databases to be created, read, and written
by legacy VFSes that lack the "version 2" shared-memory
methods xShmMap, xShmLock, xShmBarrier, and xShmUnmap on the
sqlite3_io_methods object.

If EXCLUSIVE locking mode
is set prior to the first WAL-mode 
database access, then SQLite never attempts to call any of the
shared-memory methods and hence no shared-memory
wal-index is ever created.
In that case, the database connection remains in EXCLUSIVE mode
as long as the journal mode is WAL; attempts to change the locking
mode using "PRAGMA locking_mode=NORMAL;" are no-ops.
The only way to change out of EXCLUSIVE locking mode is to first
change out of WAL journal mode.

If NORMAL locking mode is in effect for the first WAL-mode database
access, then the shared-memory wal-index is created.  This means that the
underlying VFS must support the "version 2" shared-memory.
If the VFS does not support shared-memory methods, then the attempt to
open a database that is already in WAL mode, or the attempt convert a
database into WAL mode, will fail.
As long as exactly one connection is using a shared-memory wal-index, 
the locking mode can be changed freely between NORMAL and EXCLUSIVE.  
It is only when the shared-memory wal-index is omitted, when the locking 
mode is EXCLUSIVE prior to the first WAL-mode database access, that the 
locking mode is stuck in EXCLUSIVE.wal.html#use_of_wal_without_shared_memoryŽŽú
3ušWrite-Ahead Logging7. Implementation Of Shared-Memory For The WAL-IndexThe wal-index is implemented using an ordinary file that is
mmapped for robustness.  Early (pre-release) implementations of WAL mode
stored the wal-index in volatile shared-memory, such as files created in
/dev/shm on Linux or /tmp on other unix systems.  The problem
with that approach is that processes with a different root directory
(changed via chroot)
will see different files and hence use different shared memory areas,
leading to database corruption.  Other methods for creating nameless
shared memory blocks are not portable across the various flavors of
unix.  And we could not find any method to create nameless shared
memory blocks on windows.  The only way we have found to guarantee
that all processes accessing the same database file use the same shared
memory is to create the shared memory by mmapping a file in the same
directory as the database itself.

Using an ordinary disk file to provide shared memory has the 
disadvantage that it might actually do unnecessary disk I/O by
writing the shared memory to disk.  However, the developers do not
think this is a major concern since the wal-index rarely exceeds
32 KiB in size and is never synced.  Furthermore, the wal-index 
backing file is deleted when the last database connection disconnects,
which often prevents any real disk I/O from ever happening.

Specialized applications for which the default implementation of
shared memory is unacceptable can devise alternative methods via a
custom VFS.  
For example, if it is known that a particular database
will only be accessed by threads within a single process, the wal-index
can be implemented using heap memory instead of true shared memory.wal.html#implementation_of_shared_memory_for_the_wal_index
m   ÙmˆgŽú     3C-MWrite-Ahead Logging10. Backwards CompatibilityThe database file format is unchanged for WAL mode.  However, the
WAL file and the wal-index are new concepts and so older versions of 
SQLite will not know
how to recover a crashed SQLite database that was operating in WAL mode
when the crash occurred.
To prevent older versions of SQLite (prior to version 3.7.0, 2010-07-22)
from trying to recover
a WAL-mode database (and making matters worse) the database file format
version numbers (bytes 18 and 19 in the database header)
are increased from 1 to 2 in WAL mode.
Thus, if an older version of SQLite attempts to connect to an SQLite
database that is operating in WAL mode, it will report an error along
the lines of "file is encrypted or is not a database".

One can explicitly change out of WAL mode using a pragma such as
this:


PRAGMA journal_mode=DELETE;



Deliberately changing out of WAL mode changes the database file format
version numbers back to 1 so that older versions of SQLite can once again 
access the database file.
This page last modified on  2018-11-26 12:01:01 UTCwal.html#backwards_compatibilityŒ"Žú        3s–AWrite-Ahead Logging9. Sometimes Queries Return SQLITE_BUSY In WAL ModeThe second advantage of WAL-mode is that
writers do not block readers and readers to do not block writers.
This is mostly true.
But there are some obscure cases where a query against a WAL-mode
database can return SQLITE_BUSY, so applications should be prepared
for that happenstance.

Cases where a query against a WAL-mode database can return SQLITE_BUSY
include the following:


If another database connection has the database mode open
in exclusive locking mode then all queries against the
database will return SQLITE_BUSY.  Both Chrome and Firefox open their
database files in exclusive locking mode, so attempts to read Chrome or
Firefox databases while the applications are running will run into this
problem, for example.


When the last connection to a particular database is closing, that
connection will acquire an exclusive lock for a short time while it
cleans up the WAL and shared-memory files.  If a second database tries
to open and query the database while the first connection
is still in the middle
of its cleanup process, the second connection might get an SQLITE_BUSY
error.


If the last connection to a database crashed, then the first new
connection to open the database will start a recovery process.  An
exclusive lock is held during recovery.  So if a third database connection
tries to jump in and query while the second connection is running recovery,
the third connection will get an SQLITE_BUSY error.wal.html#sometimes_queries_return_sqlite_busy_in_wal_mode
hh•q     C#©';The Spellfix1 Virtual Table1. OverviewThis spellfix1 virtual table can be used to search
a large vocabulary for close matches.  For example, spellfix1
can be used to suggest corrections to misspelled words.  Or,
it could be used with FTS4 to do full-text search using potentially
misspelled words.

The implementation for the spellfix1 virtual table is held in the
SQLite source tree in the miscellaneous extensions folder and in
particular in the file 
ext/misc/spellfix1.c.
The spellfix1 virtual table is not included in the SQLite amalgamation
and is not a part of any standard SQLite build.  It is a loadable extension.

Once the spellfix1 extension is loaded, an instance of the spellfix1 
virtual table is created like this:


CREATE VIRTUAL TABLE demo USING spellfix1;


The "spellfix1" term is the name of the spellfix module and must be 
entered as shown.  The "demo" term is the
name of the virtual table you will be creating and can be altered
to suit the needs of your application.  The virtual table is initially
empty.  In order for the virtual table to be useful, you will need to
populate it with your vocabulary.  Suppose you
have a list of words in a table named "big_vocabulary".  Then do this:


INSERT INTO demo(word) SELECT word FROM big_vocabulary;


If you intend to use this virtual table in cooperation with an FTS4
table (for spelling correction of search terms) then you might extract
the vocabulary using an fts4aux table:


INSERT INTO demo(word) SELECT term FROM search_aux WHERE col='*';


You can also provide the virtual table with a "rank" for each word.
The "rank" is an estimate of how common the word is.  Larger numbers
mean the word is more common.  If you omit the rank when populating
the table, then a rank of 1 is assumed.  But if you have rank 
information, you can supply it and the virtual table will show a
slight preference for selecting more commonly used terms.  To
populate the rank from an fts4aux table "search_aux" do something
like this:


INSERT INTO demo(word,rank)
   SELECT term, documents FROM search_aux WHERE col='*';


To query the virtual table, include a MATCH operator in the WHERE
clause.  For example:


SELECT word FROM demo WHERE word MATCH 'kennasaw';


Using a dataset of American place names (derived from
http://geonames.usgs.gov/domestic/download_data.htm) the query above
returns 20 results beginning with:


kennesaw
kenosha
kenesaw
kenaga
keanak


If you append the character '*' to the end of the pattern, then
a prefix search is performed.  For example:


SELECT word FROM demo WHERE word MATCH 'kennes*';


Yields 20 results beginning with:


kennesaw
kennestone
kenneson
kenneys
keanes
keenesspellfix1.html#overview
      9      9Br       C7™]OThe Spellfix1 Virtual Table2. Search RefinementsBy default, the spellfix1 table returns no more than 20 results.
(It might return less than 20 if there were fewer good matches.)
You can change the upper bound on the number of returned rows by
adding a "top=N" term to the WHERE clause of your query, where N
is the new maximum.  For example, to see the 5 best matches:


SELECT word FROM demo WHERE word MATCH 'kennes*' AND top=5;


Each entry in the spellfix1 virtual table is associated with
a particular language, identified by the integer "langid" column.
The default langid is 0 and if no other actions are taken, the
entire vocabulary is a part of the 0 language.  But if your application
needs to operate in multiple languages, then you can specify different
vocabulary items for each language by specifying the langid field
when populating the table.  For example:


INSERT INTO demo(word,langid) SELECT word, 0 FROM en_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 1 FROM de_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 2 FROM fr_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 3 FROM ru_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 4 FROM cn_vocabulary;


After the virtual table has been populated with items from multiple
languages, specify the language of interest using a "langid=N" term
in the WHERE clause of the query:


SELECT word FROM demo WHERE word MATCH 'hildes*' AND langid=1;


Note that if you do not include the "langid=N" term in the WHERE clause,
the search will be against language 0 (English in the example above.)
All spellfix1 searches are against a single language id.  There is no
way to search all languages at once.spellfix1.html#search_refinements
B4B¢st    C%Äc=The Spellfix1 Virtual Table4. AlgorithmThe spellfix1 virtual table creates a single
shadow table named "%_vocab" (where the % is replaced by the name of
the virtual table; Ex: "demo_vocab" for the "demo" virtual table).  
the shadow table contains the following columns:


id
The unique id (INTEGER PRIMARY KEY)

rank
The rank of word.

langid
The language id for this entry.

word
The original UTF8 text of the vocabulary word

k1
The word transliterated into lower-case ASCII.  ™Gs       C=±[UThe Spellfix1 Virtual Table3. Virtual Table DetailsEach row in the spellfix1 virtual table has a unique rowid 
with seven columns plus five extra hidden columns.
The columns are as follows:


rowid
A unique integer number associated with each
vocabulary item in the table.  This can be used
as a foreign key on other tables in the database.

word
The text of the word that matches the pattern.
Both word and pattern can contain unicode characters
and can be mixed case.

rank
This is the rank of the word, as specified in the
original INSERT statement.


distance
This is an edit distance or Levenshtein distance going
from the pattern to the word.

langid
This is the language-id of the word.  All queries are
against a single language-id, which defaults to 0.
For any given query this value is the same on all rows.

score
The score is a combination of rank and distance.  The
idea is that a lower score is better.  The virtual table
attempts to find words with the lowest score and 
by default (unless overridden by ORDER BY) returns
results in order of increasing score.

matchlen
In a prefix search, the matchlen is the number of characters in
the string that match against the prefix.  For a non-prefix search,
this is the same as length(word).

phonehash
This column shows the phonetic hash prefix that was used to restrict
the search.  For any given query, this column should be the same for
every row.  This information is available for diagnostic purposes and
is not normally considered useful in real applications.

top
(HIDDEN)  For any query, this value is the same on all
rows.  It is an integer which is the maximum number of
rows that will be output.  The actually number of rows
output might be less than this number, but it will never
be greater.  The default value for top is 20, but that
can be changed for each query by including a term of
the form "top=N" in the WHERE clause of the query.

scope
(HIDDEN)  For any query, this value is the same on all
rows.  The scope is a measure of how widely the virtual
table looks for matching words.  Smaller values of
scope cause a broader search.  The scope is normally
chosen automatically and is capped at 4.  Applications
can change the scope by including a term of the form
"scope=N" in the WHERE clause of the query.  Increasing
the scope will make the query run faster, but will reduce
the possible corrections.

srchcnt
(HIDDEN)  For any query, this value is the same on all
rows.  This value is an integer which is the number of
words examined using the edit-distance algorithm to
find the top matches that are ultimately displayed.  This
value is for diagnostic use only.

soundslike
(HIDDEN)  When inserting vocabulary entries, this field
can be set to a spelling that matches what the word
sounds like.  See the DEALING WITH UNUSUAL AND DIFFICULT
SPELLINGS section below for details.

command
(HIDDEN)  The value of the "command" column is always NULL.  However,
applications can insert special strings into the "command" column in order
to provoke certain behaviors in the spellfix1 virtual table.
For example, inserting the string 'reset' into the "command" column
will cause the virtual table to reread its edit distance weights
(if there are any).spellfix1.html#virtual_table_details
There is a standard table of mappings from non-ASCII
characters into ASCII.  Examples: "æ" -> "ae",
"þ" -> "th", "ß" -> "ss", "á" -> "a", ...  The
accessory function spellfix1_translit(X) will do
the non-ASCII to ASCII mapping.  The built-in lower(X)
function will convert to lower-case.  Thus:
k1 = lower(spellfix1_translit(word)).

If the word is already all lower-case ASCII, then the k1 column
will contain a NULL.  This reduces the storage requirements for
the %_vocab table and helps spellfix to run a little faster.
Therefore, it is advantageous to populate as much of the spellfix
table as possible using lower-case ASCII vocabulary.

k2
This field holds a phonetic code derived from coalesce(k1,word).
Letters that have similar sounds are mapped into the same symbol.
For example, all vowels and vowel clusters become the
single symbol "A".  And the letters "p", "b", "f", and
"v" all become "B".  All nasal sounds are represented
as "N".  And so forth.  The mapping is based on
ideas found in Soundex, Metaphone, and other
long-standing phonetic matching systems.  This key can
be generated by the function spellfix1_phonehash(X).  
Hence: k2 = spellfix1_phonehash(coalesce(k1,word))


There is also a function for computing the Wagner edit distance or the
Levenshtein distance between a pattern and a word.  This function
is exposed as spellfix1_editdist(X,Y).  The edit distance function
returns the "cost" of converting X into Y.  Some transformations
cost more than others.  Changing one vowel into a different vowel,
for example is relatively cheap, as is doubling a constant, or
omitting the second character of a double-constant.  Other transformations
or more expensive.  The idea is that the edit distance function returns
a low cost for words that are similar and a higher cost for words
that are further apart.  In this implementation, the maximum cost
of any single-character edit (delete, insert, or substitute) is 100,
with lower costs for some edits (such as transforming vowels).

The "score" for a comparison is the edit distance between the pattern
and the word, adjusted down by the base-2 logarithm of the word rank.
For example, a match with distance 100 but rank 1000 would have a
score of 122 (= 100 - log2(1000) + 32) whereas a match with distance
100 with a rank of 1 would have a score of 131 (100 - log2(1) + 32).
(NB:  The constant 32 is added to each score to keep it from going
negative in case the edit distance is zero.)  In this way, frequently
used words get a slightly lower cost which tends to move them toward
the top of the list of alternative spellings.

A straightforward implementation of a spelling corrector would be
to compare the search term against every word in the vocabulary
and select the 20 with the lowest scores.  However, there will 
typically be hundreds of thousands or millions of words in the
vocabulary, and so this approach is not fast enough.

Suppose the term that is being spell-corrected is X.  To limit
the search space, X is converted to a k2-like key using the
equivalent of:


   key = spellfix1_phonehash(lower(spellfix1_translit(X)))


This key is then limited to "scope" characters.  The default scope
value is 4, but an alternative scope can be specified using the
"scope=N" term in the WHERE clause.  After the key has been truncated,
the edit distance is run against every term in the vocabulary that
has a k2 value that begins with the abbreviated key.

For example, suppose the input word is "Paskagula".  The phonetic 
key is "BACACALA" which is then truncated to 4 characters "BACA".
The edit distance is then run on the 4980 entries (out of
272,597 entries total) of the vocabulary whose k2 values begin with
BACA, yielding "Pascagoula" as the best match.

Only terms of the vocabulary with a matching langid are searched.
Hence, the same table can contain entries from multiple languages
and only the requested language will be used.  The default langid
is 0.spellfix1.html#algorithm
Q ¬QVv
CkŸThe Spellfix1 Virtual Table6. Dealing With Unusual And Difficult SpellingsThe algorithm above works quite well for most cases, but there are
exceptions.  These exceptions can be dealt with by making additional
entries in the virtual table using the "soundslike" column.

For example, many words of Greek origin begin with letters "ps" where
the "p" is silent.  Ex:  psalm, pseudonym, psoriasis, psyche.  In
another example, many Scottish surnames can be spelled with an
initial "Mac" or "Mc".  Thus, "MacKay" and "McKay" are both pronounced
the same.

Accommodation can be made for words that are not spelled as they
sound by making additional entries into the virtual table for the
same word, but adding an alternative spelling in the "soundslike"
column.  For example, the canonical entry for "psalm" would be this:


  INSERT INTO demo(word) VALUES('psalm');


To enhance the ability to correct the spelling of "salm" into
"psalm", make an addition entry like this:


  INSERT INTO demo(word,soundslike) VALUES('psalm','salm');


It is ok to make multiple entries for the same word as long as
each entry has a different soundslike value.  Note that if no
soundslike value is specified, the soundslike defaults to the word
itself.

Listed below are some cases where it might make sense to add additional
soundslike entries.  The specific entries will depend on the application
and the target language.


Silent "p" in words beginning with "ps":  psalm, psyche
Silent "p" in words beginning with "pn":  pneumonia, pneumatic
Silent "p" in words beginning with "pt":  pterodactyl, ptolemaic
Silent "d" in words beginning with "dj":  djinn, Djikarta
Silent "k" in words beginning with "kn":  knight, Knuthson
Silent "g" in words beginning with "gn":  gnarly, gnome, gnat
"Mac" versus "Mc" beginning Scottish surnames
"Tch" sounds in Slavic words:  Tchaikovsky vs. Chaykovsky
The letter "j" pronounced like "h" in Spanish:  LaJolla
Words beginning with "wr" versus "r":  write vs. rite
Miscellaneous problem words such as "debt", "tsetse",
      "Nguyen", "Van Nuyes".spellfix1.html#dealing_with_unusual_and_difficult_spellingsŒOu    CG—W_The Spellfix1 Virtual Table5. Configurable Edit DistanceThe built-in Wagner edit-distance function with fixed weights can be
replaced by the editdist3() edit-distance function
with application-defined weights and support for unicode, by specifying
the "edit_cost_table=TABLENAME" parameter to the spellfix1 module
when the virtual table is created.
For example:


CREATE VIRTUAL TABLE demo2 USING spellfix1(edit_cost_table=APPCOST);


The editdist3() edit-distance function can also be selected or 
deselected at run-time by inserting an appropriate string into the
"command" column of the virtual table:


INSERT INTO demo2(command) VALUES('edit_cost_table=APPCOST');



In the examples above, the APPCOST table would be interrogated to find
the edit distance coefficients.  It is the presence of the "edit_cost_table="
parameter to the spellfix1 module name that causes editdist3() to be used
in place of the built-in edit distance function.  If APPCOST is an empty
string, then the built-in Wagner edit-distance function is used.

The edit distance coefficients are normally read from the APPCOST table
once and there after stored in memory.  Hence, run-time changes to the
APPCOST table will not normally affect the edit distance results.
However, inserting the special string 'reset' into the "command" column of the
virtual table causes the edit distance coefficients to be reread the
APPCOST table.  Hence, applications should run a SQL statement similar
to the following when changes to the APPCOST table occur:


INSERT INTO demo2(command) VALUES("reset");spellfix1.html#configurable_edit_distance
ýgý„ex C?ˆWThe Spellfix1 Virtual Table8. The editdist3 functionThe editdist3 algorithm is a function that computes the minimum edit 
distance (a.k.a. the Levenshtein distance) between two input strings.
The editdist3 algorithm is a configurable alternative to the default
edit distance function of spellfix1.
Features of editdist3 include:


It works with unicode (UTF8) text.

A table of insertion, deletion, and substitution costs can be 
       provided by the application.

Multi-character insertions, deletions, and substitutions can be
       enumerated in the cost table.spellfix1.html#the_editdist3_functionw  C9œ}QThe Spellfix1 Virtual Table7. Auxiliary FunctionsThe source code module that implements the spellfix1 virtual table also
implements several SQL functions that might be useful to applications
that employ spellfix1 or for testing or diagnostic work while developing
applications that use spellfix1.  The following auxiliary functions are
available:


editdist3(P,W)editdist3(P,W,L)editdist3(T)
These routines provide direct access to the version of the Wagner
edit-distance function that allows for application-defined weights
on edit operations.  The first two forms of this function compare
pattern P against word W and return the edit distance.  In the first
function, the langid is assumed to be 0 and in the second, the
langid is given by the L parameter.  The third form of this function
reloads edit distance coefficients from the table named by T.

spellfix1_editdist(P,W)
This routine provides access to the built-in Wagner edit-distance
function that uses default, fixed costs.  The value returned is
the edit distance needed to transform W into P.

spellfix1_phonehash(X)
This routine constructs a phonetic hash of the pure ascii input word X
and returns that hash.  This routine is used internally by spellfix1 in
order to transform the K1 column of the shadow table into the K2
column.

spellfix1_scriptcode(X)
Given an input string X, this routine attempts to determine the dominant
script of that input and returns the ISO-15924 numeric code for that
script.  The current implementation understands the following scripts:

 215 - Latin
 220 - Cyrillic
 200 - Greek

Additional language codes might be added in future releases.

spellfix1_translit(X)
This routine transliterates unicode text into pure ascii, returning
the pure ascii representation of the input text X.  This is the function
that is used internally to transform vocabulary words into the K1
column of the shadow table.spellfix1.html#auxiliary_functions
—py CC®![The Spellfix1 Virtual Table9. The editdist3 COST tableTo program the costs of editdist3, create a table such as the following:


CREATE TABLE editcost(
  iLang INT,   -- The language ID
  cFrom TEXT,  -- Convert text from this
  cTo   TEXT,  -- Convert text into this
  iCost INT    -- The cost of doing the conversion
);


The cost table can be named anything you want - it does not have to be
called "editcost".  And the table can contain additional columns.
The only requirement is that the
table must contain the four columns show above, with exactly the names shown.

The iLang column is a non-negative integer that identifies a set of costs
appropriate for a particular language.  The editdist3 function will only use
a single iLang value for any given edit-distance computation.  The default
value is 0.  It is recommended that applications that only need to use a
single language always use iLang==0 for all entries.

The iCost column is the numeric cost of transforming cFrom into cTo.  This
value should be a non-negative integer, and should probably be less than 100.
The default single-character insertion and deletion costs are 100 and the
default single-character to single-character substitution cost is 150.  A
cost of 10000 or more is considered "infinite" and causes the rule to be
ignored.

The cFrom and cTo columns show edit transformation strings.  Either or both
columns may contain more than one character.  Or either column (but not both)
may hold an empty string.  When cFrom is empty, that is the cost of inserting
cTo.  When cTo is empty, that is the cost of deleting cFrom.

In the spellfix1 algorithm, cFrom is the text as the user entered it and
cTo is the correctly spelled text as it exists in the database.  The goal
of the editdist3 algorithm is to determine how close the user-entered text is
to the dictionary text.

There are three special-case entries in the cost table:


cFromcToMeaning
'''?'The default insertion cost
'?'''The default deletion cost
'?''?'The default substitution cost


If any of the special-case entries shows above are omitted, then the
value of 100 is used for insertion and deletion and 150 is used for
substitution.  To disable the default insertion, deletion, and/or substitution
set their respective cost to 10000 or more.

Other entries in the cost table specific transforms for particular 
characters.
The cost of specific transforms should be less than the default costs, or else
the default costs will take precedence and the specific transforms will never 
be used.

Some example, cost table entries:


INSERT INTO editcost(iLang, cFrom, cTo, iCost)
VALUES(0, 'a', 'ä', 5);


The rule above says that the letter "a" in user input can be matched against
the letter "ä" in the dictionary with a penalty of 5.


INSERT INTO editcost(iLang, cFrom, cTo, iCost)
VALUES(0, 'ss', 'ß', 8);


The number of characters in cFrom and cTo do not need to be the same.  The
rule above says that "ss" on user input will match "ß" with a penalty of 8.spellfix1.html#the_editdist3_cost_table

H
Œ6‰Y 5;—IUSQLite Is Serverless1. SQLite Is ServerlessMost SQL database engines are implemented as a separate server process.
Programs that want to access the database communicate with the server
using some kind of interprocess communication (typically TCP/IP) to send 
requests to the server and to receive back results. 
SQLite does not work this way. 
With SQLite, the process that wants to access the database reads and 
writes directly from the database files on disk. 
There is no intermediary server process.



There are advantages and disadvantages to being serverless.
The main advantage is that there is no separate server process
to install, setup, configure, initialize, manage, and troubleshoot. 
This is one reason why SQLite is a 
"zero-configuration" database engine. 
Programs that use SQLite require no administrative support for 
setting up the database engine before they are run.
Any program that is able to access the disk is able to use an SQLite database.



On the other hand, a database engine that uses a server can 
provide better protection from bugs in the client 
application - stray pointers in a client cannot corrupt memory 
on the server. 
And because a server is a single persistent process,
it is able to control database access with more precision, 
allowing for finer-grained locking and better concurrency.



Most SQL database engines are client/server based. 
Of those that are serverless, SQLite is the only one
known to this author that allows multiple applications
to access the same database at the same time.serverless.html#sqlite_is_serverless‰3z  Ck]}The Spellfix1 Virtual Table10. Experimenting with the editcost3() functionThe spellfix1 virtual table
uses editdist3 if the "edit_cost_table=TABLE" option
is specified as an argument when the spellfix1 virtual table is created.  
But editdist3 can also be tested directly using the built-in "editdist3()"
SQL function.  The editdist3() SQL function has 3 forms:


 editdist3('TABLENAME');
 editdist3('string1', 'string2');
 editdist3('string1', 'string2', langid);


The first form loads the edit distance coefficients from a table called
'TABLENAME'.  Any prior coefficients are discarded.  So when experimenting
with weights and the weight table changes, simply rerun the single-argument
form of editdist3() to reload revised coefficients.  Note that the 
edit distance
weights used by the editdist3() SQL function are independent from the
weights used by the spellfix1 virtual table.

The second and third forms return the computed edit distance between strings
'string1' and "string2'.  In the second form, a language id of 0 is used.
The language id is specified in the third form.
This page last modified on  2018-02-14 14:14:05 UTCspellfix1.html#experimenting_with_the_editcost3_function
00K‰Z        5]1uSQLite Is Serverless2. Classic Serverless Vs. Neo-Serverless(This section was added on 2018-04-02)


Recently, folks have begun to use the
word "serverless" to mean something subtly different from its intended
meaning in this document.  Here are two possible definitions of "serverless":



Classic Serverless:
The database engine runs within the same process, thread, and address space
as the application.  There is no message passing or network activity.


Neo-Serverless:
The database engine runs in a separate namespace from the application,
probably on a separate machine, but the database is provided as a
turn-key service by the hosting provider, requires no management or
administration by the application owners, and is so easy to use
that the developers can think of the database as being serverless
even if it really does use a server under the covers.



SQLite is an example of a classic serverless database engine.
With SQLite, there are no other processes, threads, machines, or
other mechanisms (apart from host computer OS and filesystem)
to help provide database services or implementation.  There really
is no server.


Microsoft Azure Cosmo DB
and
Amazon S3
are examples of a neo-serverless databases.
These database are implemented by server processes running separately
in the cloud.
But the servers are maintained and administered by the ISP, not by
the application developer.
Application developers just use the service.  Developers do not have to
provision, configure, or manage database server instances, as all of that
work is handled automatically by the service provider.  Database servers
do in fact exist, they are just hidden from the developers.


It is important to understand these two different definitions for
"serverless".
When a database claims to be "serverless",
be sure to discern whether they mean "classic serverless"
or "neo-serverless".
This page last modified on  2018-04-02 15:25:54 UTCserverless.html#classic_serverless_vs_neo_serverless
{{™‘A        =#±
5The DBSTAT Virtual Table1. OverviewThe DBSTAT virtual table is a read-only eponymous virtual table that returns
information about the amount of disk space used to store the content
of an SQLite database.
Example use cases for the
DBSTAT virtual table include the sqlite3_analyzer.exe
utility program and the
table size pie-chart in
the Fossil-implemented version control system
for SQLite.



The DBSTAT virtual table is available on all 
database connections when SQLite is built using the
SQLITE_ENABLE_DBSTAT_VTAB compile-time option.


The DBSTAT virtual table is an eponymous virtual table, meaning
that is not necessary to run CREATE VIRTUAL TABLE to create an
instance of the dbstat virtual table before using it.  The "dbstat"
module name can be used as if it were a table name to query the
dbstat virtual table directly.  For example:

SELECT * FROM dbstat;



If a named virtual table that uses the dbstat module is desired,
then the recommended way to create an instance of the dbstat
virtual table is as follows:

CREATE VIRTUAL TABLE temp.stat USING dbstat(main);



Note the "temp." qualifier before the virtual table name ("stat").  This
qualifier causes the virtual table to be temporary - to only exist for
the duration of the current database connection.  This is the
recommended approach.


The "main" argument to dbstat is default schema
for which information is to be provided.  The default is "main", and
so the use of "main" in the example above is redundant.  For any
particular query, the schema can be changed by specifying the
alternative schema as a function argument to the virtual table
name in the FROM clause of the query.  (See further discussion of
table-valued functions in the FROM clause for more details.)


The schema for the DBSTAT virtual table looks like this:
CREATE TABLE dbstat(
  name       TEXT,        -- Name of table or index
  path       TEXT,        -- Path to page from root
  pageno     INTEGER,     -- Page number, or page count
  pagetype   TEXT,        -- 'internal', 'leaf', 'overflow', or NULL
  ncell      INTEGER,     -- Cells on page (0 for overflow pages)
  payload    INTEGER,     -- Bytes of payload on this page or btree
  unused     INTEGER,     -- Bytes of unused space on this page or btree
  mx_payload INTEGER,     -- Largest payload size of all cells on this row
  pgoffset   INTEGER,     -- Byte offset of the page in the database file
  pgsize     INTEGER,     -- Size of the page, in bytes
  schema     TEXT HIDDEN, -- Database schema being analyzed
  aggregate  BOOL HIDDEN  -- True to enable aggregate mode
);



The DBSTAT table only reports on the content of btrees within the database file.
Freelist pages, pointer-map pages, and the lock page are omitted from
the analysis.


By default, there is a single row in the DBSTAT table for each
btree page the database file.  Each row provides
information about the space utilization of that one page of the
database.  However, if the hidden column "aggregate" is TRUE, then
results are aggregated and there is a single row in the DBSTAT table
for each btree in the database, providing information about space
utilization across the entire btree.dbstat.html#overview
õ
ZõŠ`‘C     =1”1CThe DBSTAT Virtual Table3. Aggregated DataBeginning with SQLite version 3.31.0 (2020-01-22), the DBSTAT table
has a new hidden column named "aggregate", which if constrained to be
TRUE will cause DBSTAT to generate one row per btree in the database,
rather than one row per page.  When running in aggregated mode, the 
"path", "pagetype", and "pgoffset" columns are always NULL and the
"pageno" column holds the number of pages in the entire btree, rather
than the number of the page that corresponds to the row.


The following table shows the meanings of the (non-hidden) columns of
DBSTAT in both normal and aggregated mode:




Column
Normal meaning
Aggregate-mode meaning


name

The name of the table or index that is implemented by
the btree of the current row

path
See description above
Always NULL

pageno
The page number of the database page for the current row
The total number of pages in the btree for the current row

pagetype
'leaf' or 'interior'
Always NULL

ncell
Number of cells on the current page or btree

payload
Bytes of useful payload on the current page or btree

unused
Unused bytes of on the current page or btree

mx_payload
The largest payload found anywhere in the current page
or btree.

pgoffset
Byte offset to the start of the page
Always NULL

pgsize
Total storage space used by the current page or btree.dbstat.html#aggregated_data‹!‘B  =m”?{The DBSTAT Virtual Table2. The "path" column of the dbstat virtual tableThe "path" column describes the path taken from the 
root node of the btree structure to each page.  The
"path" of the root node itself is '/'.
The "path" is NULL when "aggregate" is TRUE.

The "path" for the left-most child page of the root of
a btree page is '/000/'. (Btrees store content ordered from left to right
so the pages to the left have smaller keys than the pages to the right.)
The next to left-most child of the root page is '/001', and so on,
each sibling page identified by a 3-digit hex  value.
The children of the 451st left-most sibling have paths such
as '/1c2/000/, '/1c2/001/' etc.

Overflow pages are specified by appending a '+' character and a 
six-digit hexadecimal value to the path to the cell they are linked
from. For example, the three overflow pages in a chain linked from 
the left-most cell of the 450th child of the root page are identified
by the paths:

'/1c2/000+000000'         // First page in overflow chain
'/1c2/000+000001'         // Second page in overflow chain
'/1c2/000+000002'         // Third page in overflow chain



If the paths are sorted using the BINARY collation sequence, then
the overflow pages associated with a cell will appear earlier in the
sort-order than its child page:

'/1c2/000/'               // Left-most child of 451st child of rootdbstat.html#the_path_column_of_the_dbstat_virtual_table
@ãm›@ˆV™+   a5{=Measuring and Reducing CPU Usage in SQLite2.1. Compile OptionsFor performance measurement, SQLite is compiled in approximately the same
way as it would be for use in production systems.  The compile-time configuration
is "approximate" in the sense that every production use of SQLite is 
different. Compile-time options used by one system are not necessarily
the same as those used by others.  The key point is that options that 
significantly impact the generated machine code are avoided.  For example,
the -DSQLITE_DEBUG option is omitted because that option inserts thousands
of assert() statements in the middle of performance critical sections of the
SQLite library.  The -pg option (on GCC) is omitted because it causes the
compiler to emit extra probabilistic performance measuring code which interferes
with actual performance measurements.


For performance measurements,
the -Os option is used (optimize for size) rather than -O2 because the
-O2 option creates so much code movement that it is difficult to associate
specific CPU instructions to C source code lines.cpu.html#compile_optionsƒM™*  a=…UIMeasuring and Reducing CPU Usage in SQLite2. Measuring PerformanceIn brief, the CPU performance of SQLite is measured as follows:


 Compile SQLite in an as-delivered configuration, without any special
     telemetry or debugging options.
 Link SQLite against a test program that runs approximately 30,000
     SQL statements representing a typical workload.
 Count the number of CPU cycles consumed using
     cachegrind.cpu.html#measuring_performance„q™)     a#ˆQ/Measuring and Reducing CPU Usage in SQLite1. OverviewThe graph below shows the number of CPU cycles used by SQLite on a
standard workload, for versions of SQLite going back about 10 years.
Recent versions of SQLite use about one third as many the CPU cycles
compared to older versions.


This article describes how the SQLite developers measure CPU usage,
what those measurements actually mean, and the techniques used by
SQLite developers on their continuing quest to further reduce the
CPU usage of the SQLite library.






Measured using cachegrind on Ubuntu 16.04 on x64 with gcc 5.4.0 and -Os.cpu.html#overviewŽ‘D  =cš=uThe DBSTAT Virtual Table4. Example uses of the dbstat virtual tableTo find the total number of pages used to store table "xyz" in schema "aux1",
use either of the following two queries (the first is the traditional way,
and the second shows the use of the aggregated feature):

SELECT count(*) FROM dbstat('aux1') WHERE name='xyz';
SELECT pageno FROM dbstat('aux1',1) WHERE name='xyz';



To see how efficiently the content of a table is stored on disk,
compute the amount of space used to hold actual content divided
by the total amount of disk space used.  The closer this number
is to 100%, the more efficient the packing.  (In this example, the
'xyz' table is assumed to be in the 'main' schema.  Again, there
are two different versions that show the use of DBSTAT both without
and with the new aggregated feature, respectively.)

SELECT sum(pgsize-unused)*100.0/sum(pgsize) FROM dbstat WHERE name='xyz';
SELECT (pgsize-unused)*100.0/pgsize FROM dbstat
 WHERE name='xyz' AND aggregate=TRUE;



To find the average fan-out for a table, run:

SELECT avg(ncell) FROM dbstat WHERE name='xyz' AND pagetype='internal';




Modern filesystems operate faster when disk accesses are sequential.
Hence, SQLite will run faster if the content of the database file
is on sequential pages.  To find out what fraction of the pages in
a database are sequential (and thus obtain a measurement that might
be useful in determining when to VACUUM), run a query like the following:

CREATE TEMP TABLE s(rowid INTEGER PRIMARY KEY, pageno INT);
INSERT INTO s(pageno) SELECT pageno FROM dbstat ORDER BY path;
SELECT sum(s1.pageno+1==s2.pageno)*1.0/count(*)
  FROM s AS s1, s AS s2
 WHERE s1.rowid+1=s2.rowid;
DROP TABLE s;

This page last modified on  2020-01-22 17:49:40 UTCdbstat.html#example_uses_of_the_dbstat_virtual_table
ºTº„E™.  a;‡MCMeasuring and Reducing CPU Usage in SQLite2.4. MicrooptimizationsThe high repeatability of cachegrind allows the SQLite developers to
implement and measure "microoptimizations".  A microoptimization is
a change to the code that results in a very small performance increase.
Typical micro-optimizations reduce the number of CPU cycles by 0.1% or
0.05% or even less.  Such improvements are impossible to measure with
real-world timings.  But hundreds or thousands of microoptimizations
add up, resulting in measurable real-world performance gains.cpu.html#microoptimizations‚K™-   aEƒEMMeasuring and Reducing CPU Usage in SQLite2.3. Performance MeasurementCachegrind is used to
measure performance because it gives answers that are repeatable to 
7 or more significant digits.  In comparison, actual (wall-clock)
run times are scarcely repeatable beyond one significant digit.cpu.html#performance_measurement‡'™,    a'9/Measuring and Reducing CPU Usage in SQLite2.2. WorkloadThe "typical" workload is generated by the
speedtest1.c
program in the canonical SQLite source tree.  This program strives to
exercise the SQLite library in a way that is typical of real-world
applications.  Of course, every application is different, and so
no test program can exactly mirror the behavior of all applications.


The speedtest1.c program is updated from time to time as the SQLite
developers' understanding of what constitutes "typical" usage evolves.


The 
speed-check.sh shell
script, also in the canonical source tree, is used to run the speedtest1.c
program.  To replicate the performance measurements, collect the following
files into a single directory:

 the "speed-check.sh" script,
 the "speedtest1.c" test program, and
 the SQLite amalgamation source files "sqlite3.c" and
     "sqlite3.h"


Then run "sh speed-check.sh trunk".cpu.html#workload
))™R™/     aS±3_Measuring and Reducing CPU Usage in SQLite3. Performance Measurement WorkflowAs SQLite developers edit the SQLite source code, they run the
speed-check.sh
shell script to track the performance impact of changes.  This
script compiles the speedtest1.c program, runs it under cachegrind,
processes the cachegrind output using the
cg_anno.tcl TCL
script, then saves the results in a series of text files.
Typical output from the speed-check.sh script looks like this:


==8683== 
==8683== I   refs:      1,060,925,768
==8683== I1  misses:       23,731,246
==8683== LLi misses:            5,176
==8683== I1  miss rate:          2.24%
==8683== LLi miss rate:          0.00%
==8683== 
==8683== D   refs:        557,686,925  (361,828,925 rd   + 195,858,000 wr)
==8683== D1  misses:        5,067,063  (  3,544,278 rd   +   1,522,785 wr)
==8683== LLd misses:           57,958  (     16,067 rd   +      41,891 wr)
==8683== D1  miss rate:           0.9% (        1.0%     +         0.8%  )
==8683== LLd miss rate:           0.0% (        0.0%     +         0.0%  )
==8683== 
==8683== LL refs:          28,798,309  ( 27,275,524 rd   +   1,522,785 wr)
==8683== LL misses:            63,134  (     21,243 rd   +      41,891 wr)
==8683== LL miss rate:            0.0% (        0.0%     +         0.0%  )
   text    data     bss     dec     hex filename
 523044    8240    1976  533260   8230c sqlite3.o
 220507 1007870 7769352 sqlite3.c


The important parts of the output (the parts that the developers pay
the most attention to) are shown in red.
Basically, the developers want to know the size of the compiled SQLite
library and how many CPU cycles were needed to run the performance test.

The output from the 
cg_anno.tcl script
shows the number of CPU cycles spent on each line of code.
The report is approximately 80,000 lines long.  The following is a brief
snippet taken from the middle of the report to show what it looks like:


         .  SQLITE_PRIVATE int sqlite3BtreeNext(BtCursor *pCur, int *pRes){
         .    MemPage *pPage;
         .    assert( cursorOwnsBtShared(pCur) );
         .    assert( pRes!=0 );
         .    assert( *pRes==0 || *pRes==1 );
         .    assert( pCur-&gt;skipNext==0 || pCur-&gt;eState!=CURSOR_VALID );
   369,648    pCur-&gt;info.nSize = 0;
   369,648    pCur-&gt;curFlags &amp;= ~(BTCF_ValidNKey|BTCF_ValidOvfl);
   369,648    *pRes = 0;
   739,296    if( pCur-&gt;eState!=CURSOR_VALID ) return btreeNext(pCur, pRes);
 1,473,580    pPage = pCur-&gt;apPage&#91;pCur-&gt;iPage&#93;;
 1,841,975    if( (++pCur-&gt;aiIdx&#91;pCur-&gt;iPage&#93;)&gt;=pPage-&gt;nCell ){
     4,340      pCur-&gt;aiIdx&#91;pCur-&gt;iPage&#93;--;
     5,593      return btreeNext(pCur, pRes);
         .    }
   728,110    if( pPage-&gt;leaf ){
         .      return SQLITE_OK;
         .    }else{
     3,117      return moveToLeftmost(pCur);
         .    }
   721,876  }



The numbers on the left are the CPU cycle counts for that line of code,
of course.


The cg_anno.tcl script removes extraneous details from the default 
cachegrind annotation
output so that before-and-after reports can be compared using a 
side-by-side diff to view specific details of how a
micro-optimization attempt affected performance.cpu.html#performance_measurement_workflow
!
—Ú!…4¨z  g+‰;=An Introduction To The SQLite C/C++ Interface2. IntroductionSQLite has more than 225 APIs.
  However, most of the APIs are optional and very specialized
  and can be ignored by beginners.
  The core API is small, simple, and easy to learn.
  This article summarizes the core API.



  A separate document, The SQLite C/C++ Interface,
  provides detailed
  specifications for all C/C++ APIs for SQLite.  Once
  the reader
  understands the basic principles of operation for SQLite, 
  that document should be used as a reference
  guide.  This article is intended as introduction only and is neither a
  complete nor authoritative reference for the SQLite API.cintro.html#introduction‰8¨y g!‘W3An Introduction To The SQLite C/C++ Interface1. SummaryThe following two objects and eight methods comprise the essential
elements of the SQLite interface:


sqlite3 &rarr;
The database connection object.  Created by
sqlite3_open() and destroyed by sqlite3_close().

sqlite3_stmt &rarr;
The prepared statement object.  Created by
sqlite3_prepare() and destroyed by sqlite3_finalize().


sqlite3_open() &rarr;
Open a connection to a new or existing SQLite database.
The constructor for sqlite3.

sqlite3_prepare() &rarr;
Compile SQL text into
byte-code that will do the work of querying or updating the database. 
The constructor for sqlite3_stmt.

sqlite3_bind() &rarr;
Store application data into
parameters of the original SQL.


sqlite3_step() &rarr;
Advance an sqlite3_stmt to the next result row or to completion.

sqlite3_column() &rarr;
Column values in the current result row for an sqlite3_stmt.

sqlite3_finalize() &rarr;
Destructor for sqlite3_stmt.

sqlite3_close() &rarr;
Destructor for sqlite3.

sqlite3_exec() &rarr;
A wrapper function that does sqlite3_prepare(), sqlite3_step(),
sqlite3_column(), and sqlite3_finalize() for
a string of one or more SQL statements.cintro.html#summaryŠd™0 a)”+5Measuring and Reducing CPU Usage in SQLite4. LimitationsThe use of the standardized speedtest1.c workload and cachegrind has
enabled significant performance improvement.
However, it is important to recognize the limitations of this approach:



Performance measurements are done with a single compiler (gcc 5.4.0),
optimization setting (-Os), and
on a single platform (Ubuntu 16.04 LTS on x64).  The performance of
other compilers and processors may vary.


The speedtest1.c workload that is being measured tries to be representative
of a wide range of typical uses of SQLite.  But every application is
different.  The speedtest1.c workload might not be a good proxy for the
kinds of activities performed by some applications.  The SQLite developers
are constantly working to improve the speedtest1.c program, to make it
a better proxy for actual SQLite usage.  Community feedback is welcomed.


The cycle counts provided by cachegrind are a good proxy for actual
performance, but they are not 100% accurate.


Only CPU cycle counts are being measured here. 
CPU cycle counts are a good proxy for energy consumption,
but do not necessary correlate well with real-world timings.
Time spent doing I/O is not reflected in the CPU cycle counts,
and I/O time predominates in many SQLite usage scenarios.

This page last modified on  2018-11-24 19:14:44 UTCcpu.html#limitations
  Note that the list of routines above is conceptual rather than actual.
  Many of these routines come in multiple versions.
  For example, the list above shows a single routine
  named sqlite3_open() when in fact there are three separate routines
  that accomplish the same thing in slightly different ways:
  sqlite3_open(), sqlite3_open16() and sqlite3_open_v2().
  The list mentions sqlite3_column()
  when in fact no such routine exists.
  The "sqlite3_column()" shown in the list is a placeholder for
  an entire family of routines that extra column
  data in various datatypes.



  Here is a summary of what the core interfaces do:




sqlite3_open()

  This routine 
  opens a connection to an SQLite database file and returns a
  database connection object.  This is often the first SQLite API
  call that an application makes and is a prerequisite for most other
  SQLite APIs.  Many SQLite interfaces require a pointer to
  the database connection object as their first parameter and can
  be thought of as methods on the database connection object.
  This routine is the constructor for the database connection object.


sqlite3_prepare()

  This routine
  converts SQL text into a prepared statement object and returns a pointer
  to that object.  This interface requires a database connection pointer
  created by a prior call to sqlite3_open() and a text string containing
  the SQL statement to be prepared.  This API does not actually evaluate
  the SQL statement.  It merely prepares the SQL statement for evaluation.

  Think of each SQL statement as a small computer program.  The purpose
  of sqlite3_prepare() is to compile that program into object code.
  The prepared statement is the object code.  The sqlite3_step() interface
  then runs the object code to get a result.

  New applications should always invoke sqlite3_prepare_v2() instead
  of sqlite3_prepare().  The older sqlite3_prepare() is retained for
  backwards compatibility.  But sqlite3_prepare_v2() provides a much
  better interface.

sqlite3_step()

  This routine is used to evaluate a prepared statement that has been
  previously created by the sqlite3_prepare() interface.  The statement
  is evaluated up to the point where the first row of results are available.
  To advance to the second row of results, invoke sqlite3_step() again.
  Continue invoking sqlite3_step() until the statement is complete.
  Statements that do not return results (ex: INSERT, UPDATE, or DELETE
  statements) run to completion on a single call to sqlite3_step().

sqlite3_column()

  This routine returns a single column from the current row of a result
  set for a prepared statement that is being evaluated by sqlite3_step().
  Each time sqlite3_step() stops with a new result set row, this routine
  can be called multiple times to find the values of all columns in that row.
  
  As noted above, there really is no such thing as a "sqlite3_column()"
  function in the SQLite API.  Instead, what we here call "sqlite3_column()"
  is a place-holder for an entire family of functions that return
  a value from the result set in various data types.  There are also routines
  in this family that return the size of the result (if it is a string or
  BLOB) and the number of columns in the result set.  

  
     sqlite3_column_blob() 
     sqlite3_column_bytes() 
     sqlite3_column_bytes16() 
     sqlite3_column_count() 
     sqlite3_column_double() 
     sqlite3_column_int() 
     sqlite3_column_int64() 
     sqlite3_column_text() 
     sqlite3_column_text16() 
     sqlite3_column_type() 
     sqlite3_column_value() 
  


sqlite3_finalize()

  This routine destroys a prepared statement created by a prior call
  to sqlite3_prepare().  Every prepared statement must be destroyed using
  a call to this routine in order to avoid memory leaks.

sqlite3_close()

  This routine closes a database connection previously opened by a call
  to sqlite3_open().  All prepared statements associated with the
  connection should be finalized prior to closing the
  connection.cintro.html#core_objects_and_interfaces
Ö[=Ö†b¨}        ge‹#wAn Introduction To The SQLite C/C++ Interface5. Convenience Wrappers Around Core RoutinesThe sqlite3_exec() interface is a convenience wrapper that carries out
  all four of the above steps with a single function call.  A callback
  function passed into sqlite3_exec() is used to process each row of
  the result set.  The sqlite3_get_table() is another convenience wrapper
  that does all four of the above steps.  The sqlite3_get_table() interface
  differs from sqlite3_exec() in that it stores the results of queries
  in heap memory rather than invoking a callback.



  It is important to realize that neither sqlite3_exec() nor
  sqlite3_get_table() do anything that cannot be accomplished using
  the core routines.  In fact, these wrappers are implemented purely in
  terms of the core routines.cintro.html#convenience_wrappers_around_core_routinesŽ¨| ggš
yAn Introduction To The SQLite C/C++ Interface4. Typical Usage Of Core Routines And ObjectsAn application will typically use
  sqlite3_open() to create a single database connection
  during initialization.
  Note that sqlite3_open() can be used to either open existing database
  files or to create and open new database files.
  While many applications use only a single database connection, there is
  no reason why an application cannot call sqlite3_open() multiple times
  in order to open multiple database connections - either to the same
  database or to different databases.  Sometimes a multi-threaded application
  will create separate database connections for each thread.
  Note that a single database connection can access two or more
  databases using the ATTACH SQL command, so it is not necessary to
  have a separate database connection for each database file.



  Many applications destroy their database connections using calls to
  sqlite3_close() at shutdown.  Or, for example, an application that
  uses SQLite as its application file format might
  open database connections in response to a File/Open menu action
  and then destroy the corresponding database connection in response
  to the File/Close menu.



  To run an SQL statement, the application follows these steps:



   Create a prepared statement using sqlite3_prepare(). 
   Evaluate the prepared statement by calling sqlite3_step() one
       or more times. 
   For queries, extract results by calling 
       sqlite3_column() in between
       two calls to sqlite3_step(). 
   Destroy the prepared statement using sqlite3_finalize(). 



  The foregoing is all one really needs to know in order to use SQLite
  effectively.  All the rest is optimization and detail.cintro.html#typical_usage_of_core_routines_and_objects§¨{     gIÌG[An Introduction To The SQLite C/C++ Interface3. Core Objects And InterfacesThe principal task of an SQL database engine is to evaluate SQL statements
  of SQL.  To accomplish this, the developer needs two objects:



   The database connection object: sqlite3 
   The prepared statement object: sqlite3_stmt 



  Strictly speaking, the prepared statement object is not required since
  the convenience wrapper interfaces, sqlite3_exec or
  sqlite3_get_table, can be used and these convenience wrappers
  encapsulate and hide the prepared statement object.
  Nevertheless, an understanding of
  prepared statements is needed to make full use of SQLite.



  The database connection and prepared statement objects are controlled
  by a small set of C/C++ interface routine listed below.



   sqlite3_open() 
   sqlite3_prepare() 
   sqlite3_step() 
   sqlite3_column() 
   sqlite3_finalize() 
   sqlite3_close() 



™™–b¨~
gwª}        An Introduction To The SQLite C/C++ Interface6. Binding Parameters and Reusing Prepared StatementsIn prior discussion, it was assumed that each SQL statement is prepared
  once, evaluated, then destroyed.  However, SQLite allows the same
  prepared statement to be evaluated multiple times.  This is accomplished
  using the following routines:



   sqlite3_reset() 
   sqlite3_bind() 



  After a prepared statement has been evaluated by one or more calls to
  sqlite3_step(), it can be reset in order to be evaluated again by a
  call to sqlite3_reset().
  Think of sqlite3_reset() as rewinding the prepared statement program
  back to the beginning.
  Using sqlite3_reset() on an existing prepared statement rather than
  creating a new prepared statement avoids unnecessary calls to
  sqlite3_prepare().
  For many SQL statements, the time needed
  to run sqlite3_prepare() equals or exceeds the time needed by
  sqlite3_step().  So avoiding calls to sqlite3_prepare() can give
  a significant performance improvement.



  It is not commonly useful to evaluate the exact same SQL
  statement more than once.  More often, one wants to evaluate similar
  statements.  For example, you might want to evaluate an INSERT statement
  multiple times with different values.  Or you might want to evaluate
  the same query multiple times using a different key in the WHERE clause.
  To accommodate
  this, SQLite allows SQL statements to contain parameters
  which are "bound" to values prior to being evaluated.  These values can
  later be changed and the same prepared statement can be evaluated
  a second time using the new values.



  SQLite allows a parameter wherever
  a string literal, numeric constant, or NULL is allowed.
  (Parameters may not be used for column or table names.)
  A parameter takes one of the following forms:



   ? 
   ?NNN 
   :AAA 
   $AAA 
   @AAA 



  In the examples above, NNN is an integer value and
  AAA is an identifier.
  A parameter initially has a value of NULL.
  Prior to calling sqlite3_step() for the first time or immediately
  after sqlite3_reset(), the application can invoke the
  sqlite3_bind() interfaces to attach values
  to the parameters.  Each call to sqlite3_bind()
  overrides prior bindings on the same parameter.



  An application is allowed to prepare multiple SQL statements in advance
  and evaluate them as needed.
  There is no arbitrary limit to the number of outstanding
  prepared statements.
  Some applications call sqlite3_prepare() multiple times at start-up to
  create all of the prepared statements they will ever need.  Other
  applications keep a cache of the most recently used prepared statements
  and then reuse prepared statements out of the cache when available.
  Another approach is to only reuse prepared statements when they are
  inside of a loop.cintro.html#binding_parameters_and_reusing_prepared_statements
A1ŸOAˆ     ¸I     39ŽwQDatatypes In SQLite1. Datatypes In SQLiteMost SQL database engines (every SQL database engine other than SQLite,
as far as we know) uses static, rigid typing.  With static typing, the datatype
of a value is determined by its container - the particular column in
which the value is stored.

SQLite uses a more general dynamic type system.  In SQLite, the datatype
of a value is associated with the value itself, not with its container.
The dynamic type system of SQLite is backwards
compatible with the more common static type systems of other database engines
in the sense that SQL statements that work on statically typed databases
work the same way in SQLite.  However, the dynamic typing in SQLite allows
it to do things which are not possible in traditional rigidly typed
databases.  Flexible typing is a feature of SQLite, not a bug.

Update:
As of version 3.37.0 (2021-11-27), SQLite provides STRICT tables
that do rigid type enforcement, for developers who prefer that kind of thing.datatype3.html#datatypes_in_sqlite„K©    g3‡YEAn Introduction To The SQLite C/C++ Interface9. Other InterfacesThis article only mentions the most important and most commonly
  used SQLite interfaces.
  The SQLite library includes many other APIs implementing useful
  features that are not described here.  
  A complete list of functions that form the SQLite
  application programming interface is found at the
  C/C++ Interface Specification.
  Refer to that document for complete and authoritative information about
  all SQLite interfaces.

This page last modified on  2017-09-29 12:11:33 UTCcintro.html#other_interfaces‰
©    g3]EAn Introduction To The SQLite C/C++ Interface8. Extending SQLiteSQLite includes interfaces that can be used to extend its functionality.
  Such routines include:



   sqlite3_create_collation() 
   sqlite3_create_function() 
   sqlite3_create_module() 
   sqlite3_vfs_register() 



  The sqlite3_create_collation() interface is used to create new
  collating sequences for sorting text.
  The sqlite3_create_module() interface is used to register new
  virtual table implementations.
  The sqlite3_vfs_register() interface creates new VFSes.



  The sqlite3_create_function() interface creates new SQL functions - 
  either scalar or aggregate.  The new function implementation typically
  makes use of the following additional interfaces:



   sqlite3_aggregate_context() 
   sqlite3_result() 
   sqlite3_user_data() 
   sqlite3_value() 



  All of the built-in SQL functions of SQLite are created using exactly
  these same interfaces.  Refer to the SQLite source code, and in particular
  the 
  date.c and
  func.c source files
  for examples.



  Shared libraries or DLLs can be used as loadable extensions to SQLite.cintro.html#extending_sqlite‰J¨       g7‘OIAn Introduction To The SQLite C/C++ Interface7. Configuring SQLiteThe default configuration for SQLite works great for most applications.
  But sometimes developers want to tweak the setup to try to squeeze out
  a little more performance, or take advantage of some obscure feature.

  The sqlite3_config() interface is used to make global, process-wide
  configuration changes for SQLite.  The sqlite3_config() interface must
  be called before any database connections are created.  The
  sqlite3_config() interface allows the programmer to do things like:

Adjust how SQLite does memory allocation, including setting up
    alternative memory allocators appropriate for safety-critical
    real-time embedded systems and application-defined memory allocators.
Set up a process-wide error log.
Specify an application-defined page cache.
Adjust the use of mutexes so that they are appropriate for various
    threading models, or substitute an 
    application-defined mutex system.
 

  After process-wide configuration is complete and database connections
  have been created, individual database connections can be configured using
  calls to sqlite3_limit() and sqlite3_db_config().cintro.html#configuring_sqlite
R       /R…X¸L  3CŠWDatatypes In SQLite2.2. Date and Time DatatypeSQLite does not have a storage class set aside for storing
dates and/or times.
Instead, the built-in Date And Time Functions of SQLite are capable of 
storing dates and times as TEXT, REAL, or INTEGER values:


TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
REAL as Julian day numbers, the number of days since
noon in Greenwich on November 24, 4714 B.C. according to the
proleptic Gregorian calendar.
INTEGER as Unix Time, the number of seconds since
1970-01-01 00:00:00 UTC.


Applications can choose to store dates and times in any of these
formats and freely convert between formats using the built-in
date and time functions.datatype3.html#date_and_time_datatypeƒ¸K      37…KDatatypes In SQLite2.1. Boolean DatatypeSQLite does not have a separate Boolean storage class.
Instead, Boolean values are stored as integers 0 (false) and 1 (true).

SQLite recognizes the keywords "TRUE" and "FALSE",
as of version 3.23.0 (2018-04-02) but those keywords are
really just alternative spellings for the integer literals 1 and 0
respectively.datatype3.html#boolean_datatypeŒ<¸J       3M—5eDatatypes In SQLite2. Storage Classes and DatatypesEach value stored in an SQLite database (or manipulated by the
database engine) has one of the following storage classes:

  NULL.
  The value is a NULL value.

  INTEGER. The value is a signed integer, stored in 0, 1,
  2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.

  REAL. The value is a floating point value, stored as
  an 8-byte IEEE floating point number.

  TEXT. The value is a text string, stored using the
  database encoding (UTF-8, UTF-16BE or UTF-16LE).

  BLOB. The value is a blob of data, stored exactly as
  it was input.


A storage class is more general than a datatype.
The INTEGER storage class, for example, includes 7 different integer
datatypes of different lengths.
This makes a difference on disk. 
But as soon as INTEGER values are read off of disk and into memory for
processing, they are converted to the most general datatype
(8-byte signed integer).
And so for the most part, "storage class" is indistinguishable from 
"datatype" and the two terms can be used interchangeably.

Any column in an SQLite version 3 database,
except an INTEGER PRIMARY KEY column, may be used to store a value 
of any storage class.

All values in SQL statements, whether they are literals embedded in SQL
statement text or parameters bound to 
precompiled SQL statements
have an implicit storage class.
Under circumstances described below, the
database engine may convert values between numeric storage classes
(INTEGER and REAL) and TEXT during query execution.datatype3.html#storage_classes_and_datatypes
BBŸ9¸M  3-½oEDatatypes In SQLite3. Type AffinitySQL database engines that use rigid typing will usually try to
automatically convert values to the appropriate datatype.  Consider this:


CREATE TABLE t1(a INT, b VARCHAR(10));
INSERT INTO t1(a,b) VALUES('123',456);



Rigidly-typed database will convert the string '123' into an
integer 123 and the integer 456 into a string '456' prior to
doing the insert.


In order to maximize compatibility between SQLite and other database
engines, and so that the example above will work on SQLite as it does
on other SQL database engines,
SQLite supports the concept of "type affinity" on columns.
The type affinity of a column is the recommended type for data stored
in that column.  The important idea here is that the type is recommended, not
required.  Any column can still store any type of data.
It is just that some columns, given the choice, will prefer to use
one storage class over another.  The preferred storage class for
a column is called its "affinity".


Each column in an SQLite 3 database is assigned one of the
following type affinities:

        TEXT
        NUMERIC
        INTEGER
        REAL
        BLOB


(Historical note:  The "BLOB" type affinity used to be called "NONE".
But that term was easy to confuse with "no affinity" and so it was
renamed.)

A column with TEXT affinity stores all data using storage classes
NULL, TEXT or BLOB. If numerical data is inserted into a column with
TEXT affinity it is converted into text form before being stored.

A column with NUMERIC affinity may contain values using all five
storage classes.  When text data is inserted into a NUMERIC column, the
storage class of the text is converted to INTEGER or REAL (in order of
preference) if the text is a well-formed integer or real literal, respectively.
If the TEXT value is a well-formed integer literal that is too large
to fit in a 64-bit signed integer, it is converted to REAL.
For conversions between TEXT and REAL storage classes, only the first
15 significant decimal digits of the number are preserved.
If the TEXT value is not a well-formed integer or real literal,
then the value is stored as TEXT.
For the purposes of this paragraph, hexadecimal integer
literals are not considered well-formed and are stored as TEXT.
(This is done for historical compatibility with versions of SQLite
prior to version 3.8.6 2014-08-15 where hexadecimal integer
literals were first introduced into SQLite.)
If a floating point value that can be represented exactly as an integer
is inserted into a column with NUMERIC affinity, the value is
converted into an integer.
No attempt is made to convert NULL or BLOB values.

A string might look like a floating-point literal with
a decimal point and/or exponent notation but as long as
the value can be expressed as an integer, the NUMERIC affinity will convert
it into an integer. Hence, the string '3.0e+5' is stored in a
column with NUMERIC affinity as the integer 300000, not as the floating
point value 300000.0.

A column that uses INTEGER affinity behaves the same as a column
with NUMERIC affinity.  The difference between INTEGER and NUMERIC affinity
is only evident in a CAST expression:  The expression
"CAST(4.0 AS INT)" returns an integer 4, whereas
"CAST(4.0 AS NUMERIC)" leaves the value as a floating-point 4.0.

A column with REAL affinity behaves like a column with NUMERIC
affinity except that it forces integer values into floating point
representation.  (As an internal optimization, small floating point
values with no fractional component and stored in columns with REAL
affinity are written to disk as integers in order to take up less 
space and are automatically converted back into floating point as
the value is read out.
This optimization is completely invisible at the SQL level and can only
be detected by examining the raw bits of the database file.)

A column with affinity BLOB does not prefer one storage class over
another and no attempt is made to coerce data from one storage class into
another.datatype3.html#type_affinity
ΕAΊn¸P 3E”-YDatatypes In SQLite3.2. Affinity Of ExpressionsEvery table column has a type affinity (one of BLOB, TEXT, INTEGER,
REAL, or NUMERIC) but expressions do not necessarily have an affinity.

Expression affinity is determined by the following rules:


  The right-hand operand of an IN or NOT IN
  operator has no affinity if the operand is a list, or has the same
  affinity as the affinity of the result set expression if the operand
  is a SELECT.

  When an expression is a simple reference to a column of a
  real table (not a VIEW or subquery) then the expression
  has the same affinity as the table column.
  
  Parentheses around the column name are ignored.  Hence if
  X and Y.Z are column names, then (X) and (Y.Z) are also considered
  column names and have the affinity of the corresponding columns.
  
  Any operators applied to column names, including the no-op 
   unary "+" operator, convert the column name into an expression which
   always has no affinity.  Hence even if X and Y.Z are column names, the
   expressions +X and +Y.Z are not column names and have no affinity.
  

  An expression of the form "CAST(expr AS type)"
  has an affinity that is the same as a column with a declared
  type of "type".

  A COLLATE operator has the same affinity as its left-hand side operand.

  Otherwise, an expression has no affinity.datatype3.html#affinity_of_expressionsŠO¸O  3G“oWDatatypes In SQLite3.1.1. Affinity Name ExamplesThe following table shows how many common datatype names from
more traditional SQL implementations are converted into affinities by the five rules of the
previous section.  This table shows only a small subset of the
datatype names that SQLite will accept.  Note that numeric arguments
in parentheses that following the type name (ex: "VARCHAR(255)") are
ignored by SQLite - SQLite does not impose any length restrictions
(other than the large global SQLITE_MAX_LENGTH limit) on the length of
strings, BLOBs or numeric values.

 

Example Typenames From TheCREATE TABLE Statement
        or CAST Expression
    Resulting Affinity
    Rule Used To Determine Affinity


  INT
  INTEGER
  TINYINT
  SMALLINT
  MEDIUMINT
  BIGINT
  UNSIGNED BIG INT
  INT2
  INT8
INTEGER
1


  CHARACTER(20)
  VARCHAR(255)
  VARYING CHARACTER(255)
  NCHAR(55)
  NATIVE CHARACTER(70)
  NVARCHAR(100)
  TEXT
  CLOB
TEXT
2


  BLOB
  no datatype specified
BLOB
3


  REAL
  DOUBLE
  DOUBLE PRECISION
  FLOAT
REAL
4


  NUMERIC
  DECIMAL(10,5)
  BOOLEAN
  DATE
  DATETIME
NUMERIC
5



Note that a declared type of "FLOATING POINT" would give INTEGER
affinity, not REAL affinity, due to the "INT" at the end of "POINT".
And the declared type of "STRING" has an affinity of NUMERIC, not TEXT.datatype3.html#affinity_name_examplesˆf¸N       3WykDatatypes In SQLite3.1. Determination Of Column AffinityFor tables not declared as STRICT,
the affinity of a column is determined by the declared type
of the column, according to the following rules in the order shown:


  If the declared type contains the string "INT" then it
  is assigned INTEGER affinity.

  If the declared type of the column contains any of the strings
  "CHAR", "CLOB", or "TEXT" then that
  column has TEXT affinity.  Notice that the type VARCHAR contains the
  string "CHAR" and is thus assigned TEXT affinity.

  If the declared type for a column
  contains the string "BLOB" or if
  no type is specified then the column has affinity BLOB.

  If the declared type for a column
  contains any of the strings "REAL", "FLOA",
  or "DOUB" then the column has REAL affinity.

  Otherwise, the affinity is NUMERIC.


Note that the order of the rules for determining column affinity
is important.  A column whose declared type is "CHARINT" will match
both rules 1 and 2 but the first rule takes precedence and so the 
column affinity will be INTEGER.datatype3.html#determination_of_column_affinity
¬»¬‚
¸T     3?‚mWDatatypes In SQLite4. Comparison ExpressionsSQLite version 3 has the usual set of SQL comparison operators
including "=", "==", "&lt;", "&lt;=", "&gt;", "&gt;=", "!=", "",
"IN", "NOT IN", "BETWEEN", "IS", and "IS NOT", .datatype3.html#comparison_expressionsŒ\¸S      3W—ekDatatypes In SQLite3.4. Column Affinity Behavior ExampleThe following SQL demonstrates how SQLite uses column affinity
to do type conversions when values are inserted into a table.



CREATE TABLE t1(
    t  TEXT,     -- text affinity by rule 2
    nu NUMERIC,  -- numeric affinity by rule 5
    i  INTEGER,  -- integer affinity by rule 1
    r  REAL,     -- real affinity by rule 4
    no BLOB      -- no affinity by rule 3
);

-- Values stored as TEXT, INTEGER, INTEGER, REAL, TEXT.
INSERT INTO t1 VALUES('500.0', '500.0', '500.0', '500.0', '500.0');
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|text

-- Values stored as TEXT, INTEGER, INTEGER, REAL, REAL.
DELETE FROM t1;
INSERT INTO t1 VALUES(500.0, 500.0, 500.0, 500.0, 500.0);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|real

-- Values stored as TEXT, INTEGER, INTEGER, REAL, INTEGER.
DELETE FROM t1;
INSERT INTO t1 VALUES(500, 500, 500, 500, 500);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
text|integer|integer|real|integer

-- BLOBs are always stored as BLOBs regardless of column affinity.
DELETE FROM t1;
INSERT INTO t1 VALUES(x'0500', x'0500', x'0500', x'0500', x'0500');
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
blob|blob|blob|blob|blob

-- NULLs are also unaffected by affinity
DELETE FROM t1;
INSERT INTO t1 VALUES(NULL,NULL,NULL,NULL,NULL);
SELECT typeof(t), typeof(nu), typeof(i), typeof(r), typeof(no) FROM t1;
null|null|null|null|nulldatatype3.html#column_affinity_behavior_example‰N¸R    3_‘=oDatatypes In SQLite3.3.1. Column Affinity For Compound ViewsWhen the SELECT statement that implements a VIEW or 
FROM-clause subquery is a compound SELECT then the affinity of 
each column of the VIEW or subquery will
be the affinity of the corresponding result column for
one of the individual SELECT statements that make up 
the compound.  
However, it is indeterminate which of the SELECT statements will 
be used to determine affinity.
Different constituent SELECT statements might be used to determine 
affinity at different times during query evaluation.  The choice
might vary across different versions of SQLite.  The choice might
change between one query and the next in the same version of SQLite.
The choice might be different at different times within the same
query.  Hence, you can never be sure what affinity will be used
for columns of a compound SELECT that have different affinities in
the constituent subqueries.

Best practice is to avoid mixing affinities in a compound SELECT
if you care about the datatype of the result.  Mixing affinities in
a compound SELECT can lead to surprising and unintuitive results.
See, for example, forum post 02d7be94d7.datatype3.html#column_affinity_for_compound_views†¸Q  3gŠ%{Datatypes In SQLite3.3. Column Affinity For Views And SubqueriesThe "columns" of a VIEW or FROM-clause subquery are really
the expressions
in the result set of the SELECT statement that implements the VIEW
or subquery.  Thus, the affinity for columns of a VIEW or subquery
are determined by the expression affinity rules above.
Consider an example:


CREATE TABLE t1(a INT, b TEXT, c REAL);
CREATE VIEW v1(x,y,z) AS SELECT b, a+c, 42 FROM t1 WHERE b!=11;


The affinity of the v1.x column will be the same as the affinity
of t1.b (TEXT), since v1.x maps directly into t1.b.  But
columns v1.y and v1.z both have no affinity, since those columns
map into expression a+c and 42, and expressions always have no
affinity.datatype3.html#column_affinity_for_views_and_subqueries
Œ
8Œ'¸V     3_œksDatatypes In SQLite4.2. Type Conversions Prior To ComparisonSQLite may attempt to convert values between the storage classes
INTEGER, REAL, and/or TEXT before performing a comparison.
Whether or not any conversions are attempted before the comparison takes
place depends on the type affinity of the operands.

To "apply affinity" means to convert an operand to a particular storage
class if and only if the conversion does not lose essential information.
Numeric values can always be converted into TEXT.  TEXT values 
can be converted into numeric values if the text content is a well-formed 
integer or real literal, but not a hexadecimal integer literal.
BLOB values are converted into TEXT values by simply interpreting
the binary BLOB content as a text string in the current database
encoding.

Affinity is applied to operands of a comparison operator prior to
the comparison according to the following rules in the order shown:


If one operand has INTEGER, REAL or NUMERIC affinity
and the other operand has TEXT or BLOB or no affinity
then NUMERIC affinity is applied to other operand.

If one operand has TEXT affinity and the other has no affinity,
then TEXT affinity is applied to the other operand.

Otherwise, no affinity is applied and both operands are compared
as is.


The expression "a BETWEEN b AND c" is treated as two separate
binary comparisons "a &gt;= b AND a &lt;= c", even if that means
different affinities are applied to 'a' in each of the comparisons.
Datatype conversions in comparisons of the
form "x IN (SELECT y ...)" are handled as if
the comparison were really "x=y".
The expression "a IN (x, y, z, ...)" is equivalent to "a = +x OR
a = +y OR a = +z OR ...".  
In other words, the values to the right of the IN operator (the "x", "y",
and "z" values in this example) are considered to have no affinity, 
even if they happen to be column values or CAST expressions.datatype3.html#type_conversions_prior_to_comparison…C¸U    3+Š?Datatypes In SQLite4.1. Sort OrderThe results of a comparison depend on the storage classes of the
operands, according to the following rules:

  A value with storage class NULL is considered less than any
  other value (including another value with storage class NULL).

  An INTEGER or REAL value is less than any TEXT or BLOB value.
  When an INTEGER or REAL is compared to another INTEGER or REAL, a
  numerical comparison is performed.

  A TEXT value is less than a BLOB value.  When two TEXT values
  are compared an appropriate collating sequence is used to determine 
  the result.  

  When two BLOB values are compared, the result is
  determined using memcmp().datatype3.html#sort_order
^=^‹Z¸X        3%–A=Datatypes In SQLite5. OperatorsMathematical operators (+, -, *, /, %, &lt;&lt;, &gt;&gt;,
&amp;, and |) interpret both operands as if they were numbers.
STRING or BLOB operands automatically convert into REAL or INTEGER values.
If the STRING or BLOB looks like a real number (if it has a decimal point
or an exponent) or if the value is outside the range that can be represented
as a 64-bit signed integer, then it converts to REAL.  Otherwise the operand
converts to INTEGER.
The implied type conversion of mathematical operands is slightly different
from CAST to NUMERIC in that string and BLOB values that
look like real numbers but have no fractional part are kept as REAL
instead of being converted into INTEGER as they would be for CAST to NUMERIC.
The conversion from STRING or BLOB into REAL or INTEGER is performed
even if it is lossy and irreversible.
Some mathematical operators (%, &lt;&lt;, &gt;&gt;, &amp;, and |) expect
INTEGER operands.  For those operators, REAL operands are converted into INTEGER
in the same way as a CAST to INTEGER.
The &lt;&lt;, &gt;&gt;, &amp;, and | operators always return an INTEGER (or NULL)
result, but the % operator returns either INTEGER or REAL (or NULL)
depending on the type of its operands.
A NULL operand on a mathematical operator yields a NULL result.
An operand on a mathematical operator that does not look in any way
numeric and is not NULL is converted to 0 or 0.0.
Division by zero gives a result of NULL.datatype3.html#operators‘>¸W   3;¡aODatatypes In SQLite4.3. Comparison ExampleCREATE TABLE t1(
    a TEXT,      -- text affinity
    b NUMERIC,   -- numeric affinity
    c BLOB,      -- no affinity
    d            -- no affinity
);

-- Values will be stored as TEXT, INTEGER, TEXT, and INTEGER respectively
INSERT INTO t1 VALUES('500', '500', '500', 500);
SELECT typeof(a), typeof(b), typeof(c), typeof(d) FROM t1;
text|integer|text|integer

-- Because column "a" has text affinity, numeric values on the
-- right-hand side of the comparisons are converted to text before
-- the comparison occurs.
SELECT a &lt; 40,   a &lt; 60,   a &lt; 600 FROM t1;
0|1|1

-- Text affinity is applied to the right-hand operands but since
-- they are already TEXT this is a no-op; no conversions occur.
SELECT a &lt; '40', a &lt; '60', a &lt; '600' FROM t1;
0|1|1

-- Column "b" has numeric affinity and so numeric affinity is applied
-- to the operands on the right.  Since the operands are already numeric,
-- the application of affinity is a no-op; no conversions occur.  All
-- values are compared numerically.
SELECT b &lt; 40,   b &lt; 60,   b &lt; 600 FROM t1;
0|0|1

-- Numeric affinity is applied to operands on the right, converting them
-- from text to integers.  Then a numeric comparison occurs.
SELECT b &lt; '40', b &lt; '60', b &lt; '600' FROM t1;
0|0|1

-- No affinity conversions occur.  Right-hand side values all have
-- storage class INTEGER which are always less than the TEXT values
-- on the left.
SELECT c &lt; 40,   c &lt; 60,   c &lt; 600 FROM t1;
0|0|0

-- No affinity conversions occur.  Values are compared as TEXT.
SELECT c &lt; '40', c &lt; '60', c &lt; '600' FROM t1;
0|1|1

-- No affinity conversions occur.  Right-hand side values all have
-- storage class INTEGER which compare numerically with the INTEGER
-- values on the left.
SELECT d &lt; 40,   d &lt; 60,   d &lt; 600 FROM t1;
0|0|1

-- No affinity conversions occur.  INTEGER values on the left are
-- always less than TEXT values on the right.
SELECT d &lt; '40', d &lt; '60', d &lt; '600' FROM t1;
1|1|1



All of the results in the example are the same if the comparisons are
commuted - if expressions of the form "a&lt;40" are rewritten
as "40&gt;a".datatype3.html#comparison_example
4Š¸Z   39“QDatatypes In SQLite7. Collating SequencesWhen SQLite compares two strings, it uses a collating sequence or
collating function (two terms for the same thing) to determine which
string is greater or if the two strings are equal.
SQLite has three built-in collating functions:  BINARY, NOCASE, and 
RTRIM.


BINARY - Compares string data using memcmp(), regardless
                   of text encoding.
NOCASE - Similar to binary, except that it uses
     sqlite3_strnicmp() for the comparison.  Hence the 26 upper case
     characters of ASCII are folded to their lower case equivalents before
     the comparison is performed.  Note that only ASCII characters
     are case folded.  SQLite does not attempt to do full
     UTF case folding due to the size of the tables required.
     Also note that any U+0000 characters in the string are considered
     string terminators for comparison purposes.

RTRIM - The same as binary, except that trailing space
     characters are ignored.


An application can register additional collating functions using
the sqlite3_create_collation() interface.

Collating functions only matter when comparing string values.
Numeric values are always compared numerically, and BLOBs are always
compared byte-by-byte using memcmp().datatype3.html#collating_sequences‡G¸Y    3_)uDatatypes In SQLite6. Sorting, Grouping and Compound SELECTsWhen query results are sorted by an ORDER BY clause, values with storage
class NULL come first, followed by INTEGER and REAL values
interspersed in numeric order, followed by TEXT values in collating
sequence order, and finally BLOB values in memcmp() order.  No storage
class conversions occur before the sort.

When grouping values with the GROUP BY clause values with
different storage classes are considered distinct, except for INTEGER
and REAL values which are considered equal if they are numerically
equal. No affinities are applied to any values as the result of a
GROUP by clause.

The compound SELECT operators UNION,
INTERSECT and EXCEPT perform implicit comparisons between values.
No affinity is applied to comparison operands for the implicit
comparisons associated with UNION, INTERSECT, or EXCEPT - the values
are compared as is.datatype3.html#sorting_grouping_and_compound_selects
ÛÛ– ¸[       3cªUwDatatypes In SQLite7.1. Assigning Collating Sequences from SQLEvery column of every
table has an associated collating function.  If no collating function
is explicitly defined, then the collating function defaults to BINARY.
The COLLATE clause of the column definition is used
to define alternative collating functions for a column.






The rules for determining which collating function to use for a
binary comparison operator (=, &lt;, &gt;, &lt;=, &gt;=, !=, IS, and
IS NOT) are as follows:


If either operand has an explicit collating function assignment
using the postfix COLLATE operator, then the explicit collating function
is used for comparison, with precedence to the collating function of the
left operand.

If either operand is a column, then the collating function of
that column is used with precedence to the left operand.
For the purposes of the previous sentence, a column name
preceded by one or more unary "+" operators and/or CAST operators
is still considered a column name.


Otherwise, the BINARY collating function is used for comparison.




An operand of a comparison is considered to have an explicit
collating function assignment (rule 1 above) 
if any subexpression of the operand uses
the postfix COLLATE operator.  Thus, if a COLLATE operator is used
anywhere in a comparison expression, the collating function defined
by that operator is used for string comparison regardless of what 
table columns might be a part of that expression.  If two or more
COLLATE operator subexpressions appear anywhere in a comparison, the 
left most explicit collating function is used regardless of how deeply the
COLLATE operators are nested in the expression and regardless of
how the expression is parenthesized.



The expression "x BETWEEN y and z" is logically
equivalent to two comparisons "x &gt;= y AND x &lt;= z" and works with
respect to collating functions as if it were two separate comparisons.
The expression "x IN (SELECT y ...)" is handled in the same way as the
expression "x = y" for the purposes of determining the collating sequence.
The collating sequence used for expressions of the form 
"x IN (y, z, ...)" is the collating sequence of x.
If an explicit collating sequence is required on an IN operator
it should be applied to the left operand, like this: 
"x COLLATE nocase IN (y,z, ...)".
  


Terms of the ORDER BY clause that is part of a SELECT
statement may be assigned a collating sequence using the 
COLLATE operator, in which case the specified collating function is
used for sorting.
Otherwise, if the expression sorted by an ORDER BY clause is
a column, then the collating sequence of the column is used to
determine sort order. If the expression is not a column and has no
COLLATE clause, then the BINARY collating sequence is used.datatype3.html#assigning_collating_sequences_from_sql
•æ*•…À2      7UˆW_SQLite FTS5 Extension2.1. Building FTS5 as part of SQLiteAs of version 3.9.0 (2015-10-14),
FTS5 is included as part of the SQLite amalgamation.
If using one of the two autoconf build system, FTS5 is
enabled by specifying the "--enable-fts5" option when running the configure
script.  (FTS5 is currently disabled by default for the
source-tree configure script and enabled by default for
the amalgamation configure script, but these defaults might
change in the future.)

Or, if sqlite3.c is compiled using some other build system, by arranging for
the SQLITE_ENABLE_FTS5 pre-processor symbol to be defined.fts5.html#building_fts5_as_part_of_sqlite¥/À1        73ÉUASQLite FTS5 Extension1. Overview of FTS5FTS5 is an SQLite virtual table module that provides 
full-text search
functionality to database applications. In their most elementary form, 
full-text search engines allow the user to efficiently search a large 
collection of documents for the subset that contain one or more instances of a
search term. The search functionality provided to world wide web users by
Google is, among other things, a full-text search
engine, as it allows users to search for all documents on the web that contain,
for example, the term "fts5".

To use FTS5, the user creates an FTS5 virtual table with one or more
columns. For example:

CREATE VIRTUAL TABLE e”¸\ 3M¦kaDatatypes In SQLite7.2. Collation Sequence ExamplesThe examples below identify the collating sequences that would be used to
determine the results of text comparisons that may be performed by various
SQL statements. Note that a text comparison may not be required, and no
collating sequence used, in the case of numeric, blob or NULL values.



CREATE TABLE t1(
    x INTEGER PRIMARY KEY,
    a,                 /* collating sequence BINARY */
    b COLLATE BINARY,  /* collating sequence BINARY */
    c COLLATE RTRIM,   /* collating sequence RTRIM  */
    d COLLATE NOCASE   /* collating sequence NOCASE */
);
                   /* x   a     b     c       d */
INSERT INTO t1 VALUES(1,'abc','abc', 'abc  ','abc');
INSERT INTO t1 VALUES(2,'abc','abc', 'abc',  'ABC');
INSERT INTO t1 VALUES(3,'abc','abc', 'abc ', 'Abc');
INSERT INTO t1 VALUES(4,'abc','abc ','ABC',  'abc');
 
/* Text comparison a=b is performed using the BINARY collating sequence. */
SELECT x FROM t1 WHERE a = b ORDER BY x;
--result 1 2 3

/* Text comparison a=b is performed using the RTRIM collating sequence. */
SELECT x FROM t1 WHERE a = b COLLATE RTRIM ORDER BY x;
--result 1 2 3 4

/* Text comparison d=a is performed using the NOCASE collating sequence. */
SELECT x FROM t1 WHERE d = a ORDER BY x;
--result 1 2 3 4

/* Text comparison a=d is performed using the BINARY collating sequence. */
SELECT x FROM t1 WHERE a = d ORDER BY x;
--result 1 4

/* Text comparison 'abc'=c is performed using the RTRIM collating sequence. */
SELECT x FROM t1 WHERE 'abc' = c ORDER BY x;
--result 1 2 3

/* Text comparison c='abc' is performed using the RTRIM collating sequence. */
SELECT x FROM t1 WHERE c = 'abc' ORDER BY x;
--result 1 2 3

/* Grouping is performed using the NOCASE collating sequence (Values
** 'abc', 'ABC', and 'Abc' are placed in the same group). */
SELECT count(*) FROM t1 GROUP BY d ORDER BY 1;
--result 4

/* Grouping is performed using the BINARY collating sequence.  'abc' and
** 'ABC' and 'Abc' form different groups */
SELECT count(*) FROM t1 GROUP BY (d || '') ORDER BY 1;
--result 1 1 2

/* Sorting or column c is performed using the RTRIM collating sequence. */
SELECT x FROM t1 ORDER BY c, x;
--result 4 1 2 3

/* Sorting of (c||'') is performed using the BINARY collating sequence. */
SELECT x FROM t1 ORDER BY (c||''), x;
--result 4 2 3 1

/* Sorting of column c is performed using the NOCASE collating sequence. */
SELECT x FROM t1 ORDER BY c COLLATE NOCASE, x;
--result 2 4 3 1


This page last modified on  2022-04-12 00:22:10 UTCdatatype3.html#collation_sequence_examplesmail USING fts5(sender, title, body);


It is an error to add types, constraints or PRIMARY KEY declarations to 
a CREATE VIRTUAL TABLE statement used to create an FTS5 table. Once created,
an FTS5 table may be populated using INSERT, UPDATE or DELETE statements
like any other table. Like any other table with no PRIMARY KEY declaration, an
FTS5 table has an implicit INTEGER PRIMARY KEY field named rowid. 

Not shown in the example above is that there are also 
various options that may be provided to FTS5 as
part of the CREATE VIRTUAL TABLE statement to configure various aspects of the
new table. These may be used to modify the way in which the FTS5 table extracts
terms from documents and queries, to create extra indexes on disk to speed up
prefix queries, or to create an FTS5 table that acts as an index on content
stored elsewhere.

Once populated, there are three ways to execute a full-text query against
the contents of an FTS5 table:

 Using a MATCH operator in the WHERE clause of a SELECT statement, or
     Using an equals ("=") operator in the WHERE clause of a SELECT statement, or
     using the table-valued function syntax.


If using the MATCH or = operators, the expression to the left of the MATCH
   operator is usually the name of the FTS5 table (the exception is when 
   specifying a column-filter). The expression on the right
   must be a text value specifying the term to search for. For the table-valued
   function syntax, the term to search for is specified as the first table argument.
   For example:

-- Query for all rows that contain at least once instance of the term
-- "fts5" (in any column). The following three queries are equivalent.
SELECT * FROM email WHERE email MATCH 'fts5';
SELECT * FROM email WHERE email = 'fts5';
SELECT * FROM email('fts5');


 By default, FTS5 full-text searches are case-independent. Like any other
SQL query that does not contain an ORDER BY clause, the example above returns
results in an arbitrary order. To sort results by relevance (most to least
relevant), an ORDER BY may be added to a full-text query as follows:

-- Query for all rows that contain at least once instance of the term
-- "fts5" (in any column). Return results in order from best to worst
-- match.  
SELECT * FROM email WHERE email MATCH 'fts5' ORDER BY rank;


 As well as the column values and rowid of a matching row, an application
may use FTS5 auxiliary functions to retrieve extra information regarding
the matched row. For example, an auxiliary function may be used to retrieve
a copy of a column value for a matched row with all instances of the matched
term surrounded by html &lt;b&gt;&lt;/b&gt; tags. Auxiliary functions are
invoked in the same way as SQLite scalar functions, except that the name
of the FTS5 table is specified as the first argument. For example:

-- Query for rows that match "fts5". Return a copy of the "body" column
-- of each row with the matches surrounded by &lt;b&gt;&lt;/b&gt; tags.
SELECT highlight(email, 2, '&lt;b&gt;', '&lt;/b&gt;') FROM email('fts5');


A description of the available auxiliary functions, and more details
regarding configuration of the special "rank" column, are 
available below. Custom auxiliary functions may also be implemented in C and registered with
FTS5, just as custom SQL functions may be registered with the SQLite core.

 As well as searching for all rows that contain a term, FTS5 allows 
the user to search for rows that contain:


   any terms that begin with a specified prefix,
   "phrases" - sequences of terms or prefix terms that must feature in a
       document for it to match the query, 
   sets of terms, prefix terms or phrases that appear within a specified
       proximity of each other (these are called "NEAR queries"), or
   boolean combinations of any of the above.


 Such advanced searches are requested by providing a more complicated 
FTS5 query string as the text to the right of the MATCH operator (or =
operator, or as the first argument to a table-valued function syntax). The 
full query syntax is described here.fts5.html#overview_of_fts5
6
÷Á6‹À5     7/•9SQLite FTS5 Extension3.1. FTS5 StringsWithin an FTS expression a string may be specified in one of two ways:


   By enclosing it in double quotes ("). Within a string, any embedded
       double quote characters may be escaped SQL-style - by adding a second
       double-quote character.

   As an FTS5 bareword that is not "AND", "OR" or "NOT" (case sensitive). 
       An FTS5 bareword is a string of one or more consecutive characters that
       are all either:
       
       
          Non-ASCII range characters (i.e. unicode codepoints greater 
              than 127), or 
          One of the 52 upper and lower case ASCII characters, or
          One of the 10 decimal digit ASCII characters, or
          The underscore character (unicode codepoint 96).
          The substitute character (unicode codepoint 26).
       

       Strings that include any other characters must be quoted. Characters
       that are not currently allowed in barewords, are not quote characters and
       do not currently serve any special purpose in FTS5 query expressions may
       at some point in the future be allowed in barewords or used to implement
       new query functionality. This means that queries that are currently
       syntax errors because they include such a character outside of a quoted
       string may be interpreted differently by some future version of FTS5.fts5.html#fts5_strings†1À4 7?‹AMSQLite FTS5 Extension3. Full-text Query SyntaxThe following block contains a summary of the FTS query syntax in BNF form.
A detailed explanation follows.

&lt;phrase&gt;    := string &#91;*]
&lt;phrase&gt;    := &lt;phrase&gt; + &lt;phrase&gt;
&lt;neargroup&gt; := NEAR ( &lt;phrase&gt; &lt;phrase&gt; ... &#91;, N] )
&lt;query&gt;     := &#91; &#91;-] &lt;colspec&gt; :] &#91;&#94;] &lt;phrase&gt;
&lt;query&gt;     := &#91; &#91;-] &lt;colspec&gt; :] &lt;neargroup&gt;
&lt;query&gt;     := &#91; &#91;-] &lt;colspec&gt; :] ( &lt;query&gt; )
&lt;query&gt;     := &lt;query&gt; AND &lt;query&gt;
&lt;query&gt;     := &lt;query&gt; OR &lt;query&gt;
&lt;query&gt;     := &lt;query&gt; NOT &lt;query&gt;
&lt;colspec&gt;   := colname
&lt;colspec&gt;   := { colname1 colname2 ... }fts5.html#full_text_query_syntaxŠÀ3     7Q’G[SQLite FTS5 Extension2.2. Building a Loadable ExtensionAlternatively, FTS5 may be built as a loadable extension.

The canonical FTS5 source code consists of a series of *.c and other files
in the "ext/fts5" directory of the SQLite source tree. A build process reduces
this to just two files - "fts5.c" and "fts5.h" - which may be used to build an
SQLite loadable extension.


   Obtain the latest SQLite code from fossil.
   Create a Makefile as described in How To Compile SQLite.
   Build the "fts5.c" target. Which also creates fts5.h.


$ wget -c http://www.sqlite.org/src/tarball/SQLite-trunk.tgz?uuid=trunk -O SQLite-trunk.tgz
.... output ...
$ tar -xzf SQLite-trunk.tgz
$ cd SQLite-trunk
$ ./configure && make fts5.c
... lots of output ...
$ ls fts5.&#91;ch]
fts5.c        fts5.h



  The code in "fts5.c" may then be compiled into a loadable extension or
  statically linked into an application as described in 
  Compiling Loadable Extensions. There are two entry points defined, both
  of which do the same thing:


   sqlite3_fts_init
   sqlite3_fts5_init



  The other file, "fts5.h", is not required to compile the FTS5 extension. 
  It is used by applications that implement custom FTS5 tokenizers or auxiliary functions.fts5.html#building_a_loadable_extension
å
     Aå†WÀ8      7K‹yUSQLite FTS5 Extension3.4. FTS5 Initial Token QueriesIf a "&#94;" character appears immediately before a phrase that is not part of a
NEAR query, then that phrase only matches a document only if it starts at the
first token in a column. The "&#94;" syntax may be combined with a 
column filter, but may not be inserted into the middle of
a phrase.

... MATCH '&#94;one'              -- first token in any column must be "one"
... MATCH '&#94; one + two'       -- phrase "one two" must appear at start of a column
... MATCH '&#94; "one two"'       -- same as previous 
... MATCH 'a : &#94;two'          -- first token of column "a" must be "two"
... MATCH 'NEAR(&#94;one, two)'   -- syntax error! 
... MATCH 'one + &#94;two'        -- syntax error! 
... MATCH '"&#94;one two"'        -- May not work as expected!fts5.html#fts5_initial_token_queries‡=À7 7=aGSQLite FTS5 Extension3.3. FTS5 Prefix QueriesIf a "*" character follows a string within an FTS expression, then the final
token extracted from the string is marked as a prefix token. As you
might expect, a prefix token matches any document token of which it is a 
prefix. For example, the first two queries in the following block will match
any document that contains the token "one" immediately followed by the token
"two" and then any token that begins with "thr".

... MATCH '"one two thr" * '
... MATCH 'one + two + thr*'
... MATCH '"one two thr*"'      -- May not work as expected!


The final query in the block above may not work as expected. Because the
"*" character is inside the double-quotes, it will be passed to the tokenizer,
which will likely discard it (or perhaps, depending on the specific tokenizer
in use, include it as part of the final token) instead of recognizing it as
a special FTS character.fts5.html#fts5_prefix_queries…xÀ6      7/Šs9SQLite FTS5 Extension3.2. FTS5 PhrasesFTS queries are made up of phrases. A phrase is an ordered list of 
one or more tokens. A string is transformed into a phrase by passing it to
the FTS table tokenizer. Two phrases can be concatenated into a single 
large phrase using the "+" operator. For example, assuming the tokenizer
module being used tokenizes the input "one.two.three" to three separate
tokens, the following four queries all specify the same phrase:

... MATCH '"one two three"'
... MATCH 'one + two + three'
... MATCH '"one two" + three'
... MATCH 'one.two.three'



A phrase matches a document if the document contains at least one sub-sequence
of tokens that matches the sequence of tokens that make up the phrase.fts5.html#fts5_phrases


’À:        7=¢oGSQLite FTS5 Extension3.6. FTS5 Column FiltersA single phrase or NEAR group may be restricted to matching text within a
specified column of the FTS table by prefixing it with the column name 
followed by a colon character. Or to a set of columns by prefixing it
with a whitespace separated list of column names enclosed in parenthesis
("curly brackets") followed by a colon character. Column names may be specified
using either of the two forms described for strings above. Unlike strings that
are part of phrases, column names are not passed to the tokenizer module.
Column names are case-insensitive in the usual way for SQLite column names -
upper/lower case equivalence is understood for ASCII-range characters only.

... MATCH 'colname : NEAR("one two" "three four", 10)'
... MATCH '"colname" : one + two + three'

... MATCH '{col1 col2} : NEAR("one two" "three four", 10)'
... MATCH '{col2 col1 col3} : one + two + three'



If a column filter specification is preceded by a "-" character, then
it is interpreted as a list of column not to match against. For example:

-- Search for matches in all columns except "colname"
... MATCH '- colname : NEAR("one two" "three four", 10)'

-- Search for matches in all columns except "col1", "col2" and "col3"
... MATCH '- {col2 col1 col3} : one + two + three'



Column filter specifications may also be applied to arbitrary expressions
enclosed in parenthesis. In this case the column filter applies to all 
phrases within the expression. Nested column filter operations may only 
further restrict the subset of columns matched, they can not be used to 
re-enable filtered columns. For example:

-- The following are equivalent:
... MATCH '{a b} : ( {b c} : "hello" AND "world" )'
... MATCH '(b : "hello") AND ({a b} : "world")'



Finally, a column filter for a single column may be specified by using
the column name as the LHS of a MATCH operator (instead of the usual
table name). For example:

-- Given the following table
CREATE VIRTUAL TABLE ft USING fts5(a, b, c);

-- The following are equivalent
SELECT * FROM ft WHERE b MATCH 'uvw AND xyz';
SELECT * FROM ft WHERE ft MATCH 'b : (uvw AND xyz)';

-- This query cannot match any rows (since all columns are filtered out): 
SELECT * FROM ft WHERE b MATCH 'a : xyz';fts5.html#fts5_column_filters‹nÀ9     79–KCSQLite FTS5 Extension3.5. FTS5 NEAR QueriesTwo or more phrases may be grouped into a NEAR group. A NEAR group
is specified by the token "NEAR" (case sensitive) followed by an open
parenthesis character, followed by two or more whitespace separated phrases, optionally followed by a comma and the numeric parameter N, followed by
a close parenthesis. For example:

... MATCH 'NEAR("one two" "three four", 10)'
... MATCH 'NEAR("one two" thr* + four)'


If no N parameter is supplied, it defaults to 10. A NEAR group
matches a document if the document contains at least one clump of tokens that: 

 
   contains at least one instance of each phrase, and 
   for which the number of tokens between the end of the first phrase 
       and the beginning of the last phrase in the clump is less than or equal to N.


For example:

CREATE VIRTUAL TABLE f USING fts5(x);
INSERT INTO f(rowid, x) VALUES(1, 'A B C D x x x E F x');

... MATCH 'NEAR(e d, 4)';                      -- Matches!
... MATCH 'NEAR(e d, 3)';                      -- Matches!
... MATCH 'NEAR(e d, 2)';                      -- Does not match!

... MATCH 'NEAR("c d" "e f", 3)';              -- Matches!
... MATCH 'NEAR("c"   "e f", 3)';              -- Does not match!

... MATCH 'NEAR(a d e, 6)';                    -- Matches!
... MATCH 'NEAR(a d e, 5)';                    -- Does not match!

... MATCH 'NEAR("a b c d" "b c" "e f", 4)';    -- Matches!
... MATCH 'NEAR("a b c d" "b c" "e f", 3)';    -- Does not match!fts5.html#fts5_near_queries
ÑÚÑÀ<        7_ž'mSQLite FTS5 Extension4. FTS5 Table Creation and InitializationEach argument specified as part of a "CREATE VIRTUAL TABLE ... USING fts5 
..." statement is either a column declaration or a configuration option. A
column declaration consists of one or more whitespace separated FTS5
barewords or string literals quoted in any manner acceptable to SQLite.

The first string or bareword in a column declaration is the column name. It
is an error to attempt to name an fts5 table column "rowid" or "rank", or to
assign the same name to a column as is used by the table itself. This is not
supported.

Each subsequent string or bareword in a column declaration is a column
option that modifies the behaviour of that column. Column options are
case-independent. Unlike the SQLite core, FTS5 considers unrecognized column
options to be errors. Currently, the only option recognized is 
"UNINDEXED" (see below).

A configuration option consists of an FTS5 bareword - the option name -
followed by an "=" character, followed by the option value. The option value is
specified using either a single FTS5 bareword or a string literal, again quoted
in any manner acceptable to the SQLite core. For example:

CREATE VIRTUAL TABLE mail USING fts5(sender, title, body, tokenize = 'porter ascii');


 There are currently the following configuration options:


   The "tokenize" option, used to configure a custom tokenizer.
   The "prefix" option, used to add prefix indexes
       to an FTS5 table.
   The "content" option, used to make the FTS5 table an 
       external content or contentless table.
   The "content_rowid" option, used to set the rowid field of an 
       external content table.
   The "columnsize" option, used to configure
       whether or not the size in tokens of each value in the FTS5 table is
       stored separately within the database.
   The "detail" option. This option may be used 
       to reduce the size of the FTS index on disk by omitting some information
       from it.fts5.html#fts5_table_creation_and_initializationŽ!À;    7C›MSQLite FTS5 Extension3.7. FTS5 Boolean OperatorsPhrases and NEAR groups may be arranged into expressions using boolean
operators. In order of precedence, from highest (tightest grouping) to
lowest (loosest grouping), the operators are:


  Operator Function

  &lt;query1&gt; NOT &lt;query2&gt; 
      Matches if query1 matches and query2 does not match.

  &lt;query1&gt; AND &lt;query2&gt; 
      Matches if both query1 and query2 match.

  &lt;query1&gt; OR &lt;query2&gt; 
      Matches if either query1 or query2 match.




Parenthesis may be used to group expressions in order to modify operator
precedence in the usual ways. For example:

-- Matches documents that contain at least one instance of either "one"
-- or "two", but do not contain any instances of token "three".
... MATCH 'one OR two NOT three'

-- Match all documents that contain the token "two" but not "three", or
-- contain the token "one".
... MATCH 'one OR (two NOT three)'



Phrases and NEAR groups may also be connected by implicit AND operators.
For simplicity, these are not shown in the BNF grammar above. Essentially, any
sequence of phrases or NEAR groups (including those restricted to matching
specified columns) separated only by whitespace are handled as if there were an
implicit AND operator between each pair of phrases or NEAR groups. Implicit
AND operators are never inserted after or before an expression enclosed in
parenthesis. For example:

... MATCH 'one two three'         -- 'one AND two AND three'
... MATCH 'three "one two"'       -- 'three AND "one two"'
... MATCH 'NEAR(one two) three'   -- 'NEAR(one two) AND three'
... MATCH 'one OR two three'      -- 'one OR two AND three'

... MATCH '(one OR two) three'    -- Syntax error!
... MATCH 'func(one two)'         -- Syntax error!fts5.html#fts5_boolean_operators
?Ì?À?     7+™5SQLite FTS5 Extension4.3. TokenizersThe CREATE VIRTUAL TABLE "tokenize" option is used to configure the
specific tokenizer used by the FTS5 table. The option argument must be either
an FTS5 bareword, or an SQL text literal. The text of the argument is itself
treated as a white-space series of one or more FTS5 barewords or SQL text
literals. The first of these is the name of the tokenizer to use. The second
and subsequent list elements, if they exist, are arguments passed to the
tokenizer implementation.

 Unlike option values and column names, SQL text literals intended as
tokenizers must be quoted using single quote characters. For example:

-- The following are all equivalent
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'porter ascii');
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = "porter ascii");
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = "'porter' 'ascii'");
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = '''porter'' ''ascii''');

-- But this will fail:
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = '"porter" "ascii"');

-- This will fail too:
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'porter' 'ascii');




FTS5 features three built-in tokenizer modules, described in subsequent
sections:


   The unicode61 tokenizer, based on the Unicode 6.1 standard. This
       is the default.

   The ascii tokenizer, which assumes all characters outside of
  the ASCII codepoint range (0-127) are to be treated as token characters.

   The porter tokenizer, which implements the 
porter stemming algorithm.


 It is also possible to create custom tokenizers for FTS5. The API for doing so is described here.fts5.html#tokenizersŠSÀ>     73”!=SQLite FTS5 Extension4.2. Prefix IndexesBy default, FTS5 maintains a single index recording the location of each
token instance within the document set. This means that querying for complete
tokens is fast, as it requires a single lookup, but querying for a prefix 
token can be slow, as it requires a range scan. For example, to query for
the prefix token "abc*" requires a range scan of all tokens greater than
or equal to "abc" and less than "abd".

 A prefix index is a separate index that records the location of all
instances of prefix tokens of a certain length in characters used to speed
up queries for prefix tokens. For example, optimizing a query for prefix
token "abc*" requires a prefix index of three-character prefixes.

 To add prefix indexes to an FTS5 table, the "prefix" option is set to
either a single positive integer or a text value containing a white-space
separated list of one or more positive integer values. A prefix index is
created for each integer specified. If more than one "prefix" option is
specified as part of a single CREATE VIRTUAL TABLE statement, all apply.

-- Two ways to create an FTS5 table that maintains prefix indexes for
-- two and three character prefix tokens.
CREATE VIRTUAL TABLE ft USING fts5(a, b, prefix='2 3');
CREATE VIRTUAL TABLE ft USING fts5(a, b, prefix=2, prefix=3);fts5.html#prefix_indexesƒWÀ=      7M…uWSQLite FTS5 Extension4.1. The UNINDEXED column optionThe contents of columns qualified with the UNINDEXED column option are not
added to the FTS index. This means that for the purposes of MATCH queries and
FTS5 auxiliary functions, the column contains no matchable tokens. 

For example, to avoid adding the contents of the "uuid" field to the FTS
index:
CREATE VIRTUAL TABLE customers USING fts5(name, addr, uuid UNINDEXED);fts5.html#the_unindexed_column_option
vv›À@ 7A´mGSQLite FTS5 Extension4.3.1. Unicode61 TokenizerThe unicode tokenizer classifies all unicode characters as either 
"separator" or "token" characters. By default all space and punctuation
characters, as defined by Unicode 6.1, are considered separators, and all 
other characters as token characters. More specifically, all unicode 
characters assigned to a 

general category beginning with "L" or "N" (letters and numbers,
specifically) or to category "Co" ("other, private use") are considered tokens.
All other characters are separators.
 
Each contiguous run of one or more token characters is considered to be a
token. The tokenizer is case-insensitive according to the rules defined by
Unicode 6.1.

 By default, diacritics are removed from all Latin script characters. This
means, for example, that "A", "a", "&#192;", "&#224;", "&#194;" and "&#226;"
are all considered to be equivalent.

 Any arguments following "unicode61" in the token specification are treated
as a list of alternating option names and values. Unicode61 supports the
following options:


   Option  Usage
   remove_diacritics
  This option should be set to "0", "1" or "2". The default value is "1".
  If it is set to "1" or "2", then diacritics are removed from Latin script
  characters as described above. However, if it is set to "1", then diacritics
  are not removed in the fairly uncommon case where a single unicode codepoint
  is used to represent a character with more that one diacritic. For example,
  diacritics are not removed from codepoint 0x1ED9 ("LATIN SMALL LETTER O WITH
  CIRCUMFLEX AND DOT BELOW"). This is technically a bug, but cannot be fixed
  without creating backwards compatibility problems. If this option is set to
  "2", then diacritics are correctly removed from all Latin characters.

   categories
  This option may be used to modify the set of Unicode general categories
  that are considered to correspond to token characters. The argument must
  consist of a space separated list of two-character general category
  abbreviations (e.g. "Lu" or "Nd"), or of the same with the second character
  replaced with an asterisk ("*"), interpreted as a glob pattern. The default
  value is "L* N* Co".

   tokenchars
   This option is used to specify additional unicode characters that 
  should be considered token characters, even if they are white-space or
  punctuation characters according to Unicode 6.1. All characters in the
  string that this option is set to are considered token characters.

   separators
   This option is used to specify additional unicode characters that 
  should be considered as separator characters, even if they are token
  characters according to Unicode 6.1. All characters in the string that 
  this option is set to are considered separators.


 For example:

-- Create an FTS5 table that does not remove diacritics from Latin
-- script characters, and that considers hyphens and underscore characters
-- to be part of tokens. 
CREATE VIRTUAL TABLE ft USING fts5(a, b, 
    tokenize = "unicode61 remove_diacritics 0 tokenchars '-_'"
);


 or:

-- Create an FTS5 table that, as well as the default token character classes,
-- considers characters in class "Mn" to be token characters.
CREATE VIRTUAL TABLE ft USING fts5(a, b, 
    tokenize = "unicode61 categories 'L* N* Co Mn'"
);


 The fts5 unicode61 tokenizer is byte-for-byte compatible with the fts3/4
unicode61 tokenizer.fts5.html#unicode61_tokenizer
æææ‰{ÀB        7;’eASQLite FTS5 Extension4.3.3. Porter TokenizerThe porter tokenizer is a wrapper tokenizer. It takes the output of some
other tokenizer and applies the 
porter stemming algorithm
to each token before it returns it to FTS5. This allows search terms like
"correction" to match similar words such as "corrected" or "correcting". The
porter stemmer algorithm is designed for use with English language terms 
only - using it with other languages may or may not improve search utility.

 By default, the porter tokenizer operates as a wrapper around the default
tokenizer (unicode61). Or, if one or more extra arguments are added to the
"tokenize" option following "porter", they are treated as a specification for
the underlying tokenizer that the porter stemmer uses. For example:

-- Two ways to create an FTS5 table that uses the porter tokenizer to
-- stem the output of the default tokenizer (unicode61). 
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = porter); 
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'porter unicode61');

-- A porter tokenizer used to stem the output of the unicode61 tokenizer,
-- with diacritics removed before stemming.
CREATE VIRTUAL TABLE t1 USING fts5(x, tokenize = 'porter unicode61 remove_diacritics 1');fts5.html#porter_tokenizer†ÀA        79‹?SQLite FTS5 Extension4.3.2. Ascii TokenizerThe Ascii tokenizer is similar to the Unicode61 tokenizer, except that:


   All non-ASCII characters (those with codepoints greater than 127) are
  always considered token characters. If any non-ASCII characters are specified
  as part of the separators option, they are ignored.  

   Case-folding is only performed for ASCII characters. So while "A" and
  "a" are considered to be equivalent, "&#195;" and "&#227;" are distinct.

   The remove_diacritics option is not supported.


 For example:

-- Create an FTS5 table that uses the ascii tokenizer, but does not
-- consider numeric characters to be part of tokens.
CREATE VIRTUAL TABLE ft USING fts5(a, b, 
    tokenize = "ascii separators '0123456789'"
);fts5.html#ascii_tokenizer
ÜÜŒ1ÀD      7e–yoSQLite FTS5 Extension4.4. External Content and Contentless TablesNormally, when a row is inserted into an FTS5 table, as well as the various
full-text index entries and other data a copy of the row is stored in a private
table managed by the FTS5 module. When column values are requested from the
FTS5 table by the user or by an auxiliary function implementation, they are
read from this private table. The "content" option may be used to create an
FTS5 table that stores only FTS full-text index entries. Because the column
values themselves are usually much larger than the associated full-text index
entries, this can save significant database space.


There are two ways to use the "content" option:

   By setting it to an empty string to create a contentless FTS5 table. In
       this case FTS5 assumes that the original column values are unavailable
       to it when processing queries. Full-text queries and some auxiliary
       functions can still be used, but no column values apart from the rowid
       may be read from the table.

   By setting it to the name of a database object (table, virtual table or
       view) that may be queried by FTS5 at any time to retrieve the column
       values. This is known as an "external content" table. In this case all
       FTS5 functionality may be used, but it is the responsibility of the user
       to ensure that the contents of the full-text index are consistent with
       the named database object. If they are not, query results may be
       unpredictable.fts5.html#external_content_and_contentless_tablesiÀC     7_yeSQLite FTS5 Extension4.3.4. The Experimental Trigram TokenizerThe experimental trigram tokenizer extends FTS5 to support substring
matching in general, instead of the usual token matching. When using the
trigram tokenizer, a query or phrase token may match any sequence of characters
within a row, not just a complete token. For example:

CREATE VIRTUAL TABLE tri USING fts5(a, tokenize="trigram");
INSERT INTO tri VALUES('abcdefghij KLMNOPQRST uvwxyz');

-- The following queries all match the single row in the table
SELECT * FROM tri('cdefg');
SELECT * FROM tri('cdefg AND pqr');
SELECT * FROM tri('"hij klm" NOT stuv');



The trigram tokenizer supports a single option - "case_sensitive". With the default 
value, 0, matching is case-insensitive. If this value is set to 1, then all matches
are case-sensitive.

-- A case-sensitive trigram index
CREATE VIRTUAL TABLE tri USING fts5(a, tokenize="trigram case_sensitive 1");



FTS5 tables that use the trigram tokenizer also support indexed GLOB and LIKE
pattern matching. For example:

SELECT * FROM tri WHERE a LIKE '%cdefg%';
SELECT * FROM tri WHERE a GLOB '*ij klm*xyz';



If an FTS5 trigram tokenizer is created with the case_sensitive option set to 1,
it may only index GLOB queries, not LIKE.


Notes:


   Substrings consisting of fewer than 3 unicode characters do not match any
       rows when used with a full-text query. If a LIKE or GLOB pattern does not
       contain at least one sequence of non-wildcard unicode characters, FTS5
       falls back to a linear scan of the entire table.

   If the FTS5 table is created with the detail=none or detail=column option
       specified, full-text queries may not contain any tokens longer than 3
       unicode characters. LIKE and GLOB pattern matching may be slightly slower,
       but still works. If the index is to be used only for LIKE and/or GLOB
       pattern matching, these options are worth experimenting with to reduce
       the index size.fts5.html#the_experimental_trigram_tokenizer
‹
)‹“ÀF     7I¥OSQLite FTS5 Extension4.4.2. External Content TablesAn external content FTS5 table is created by setting the content 
option to the name of a table, virtual table or view (hereafter the "content
table") within the same database. Whenever column values are required by
FTS5, it queries the content table as follows, with the rowid of the row
for which values are required bound to the SQL variable:

SELECT &lt;content_rowid&gt;, &lt;cols&gt; FROM &lt;content&gt; WHERE &lt;content_rowid&gt; = ?;


 In the above, &lt;content&gt; is replaced by the name of the content table.
By default, &lt;content_rowid&gt; is replaced by the literal text "rowid". Or,
if the "content_rowid" option is set within the CREATE VIRTUAL TABLE statement,
by the value of that option. &lt;cols&gt; is replaced by a comma-separated list
of the FTS5 table column names. For example:

-- If the database schema is: 
CREATE TABLE tbl (a, b, c, d INTEGER PRIMARY KEY);
CREATE VIRTUAL TABLE fts USING fts5(a, c, content=tbl, content_rowid=d);

-- Fts5 may issue queries such as:
SELECT d, a, c FROM tbl WHERE d = ?;


 The content table may also be queried as follows:

SELECT &lt;content_rowid&gt;, &lt;cols&gt; FROM &lt;content&gt; ORDER BY &lt;content_rowid&gt; ASC;
SELECT &lt;content_rowid&gt;, &lt;cols&gt; FROM &lt;content&gt; ORDER BY &lt;content_rowid&gt; DESC;


 It is still the responsibility of the user to ensure that the contents of
an external content FTS5 table are kept up to date with the content table. 
One way to do this is with triggers. For example:

-- Create a table. And an external content fts5 table to index it.
CREATE TABLE tbl(a INTEGER PRIMARY KEY, b, c);
CREATE VIRTUAL TABLE fts_idx USING fts5(b, c, content='tbl', content_rowid='a');

-- Triggers to keep the FTS index up to date.
CREATE TRIGGER tbl_ai AFTER INSERT ON tbl BEGIN
  INSERT INTO fts_idx(rowid, b, c) VALUES (new.a, new.b, new.c);
END;
CREATE TRIGGER tbl_ad AFTER DELETE ON tbl BEGIN
  INSERT INTO fts_idx(fts_idx, rowid, b, c) VALUES('delete', old.a, old.b, old.c);
END;
CREATE TRIGGER tbl_au AFTER UPDATE ON tbl BEGIN
  INSERT INTO fts_idx(fts_idx, rowid, b, c) VALUES('delete', old.a, old.b, old.c);
  INSERT INTO fts_idx(rowid, b, c) VALUES (new.a, new.b, new.c);
END;


 Like contentless tables, external content tables do not support REPLACE
conflict handling. Any operations that specify REPLACE conflict handling are
handled using ABORT.fts5.html#external_content_tables…RÀE      7?ŠESQLite FTS5 Extension4.4.1. Contentless TablesA contentless FTS5 table is created by setting the "content" option to
an empty string. For example:

CREATE VIRTUAL TABLE f1 USING fts5(a, b, c, content='');


 Contentless FTS5 tables do not support UPDATE or DELETE statements, or
INSERT statements that do not supply a non-NULL value for the rowid field.
Contentless tables do not support REPLACE conflict handling. REPLACE 
and INSERT OR REPLACE statements are treated as regular INSERT statements.
Rows may be deleted from a contentless table using an FTS5 delete command.

 Attempting to read any column value except the rowid from a contentless
FTS5 table returns an SQL NULL value.fts5.html#contentless_tables
SS“(ÀG    7A¥/KSQLite FTS5 Extension4.5. The Columnsize OptionNormally, FTS5 maintains a special backing table within the database that
stores the size of each column value in tokens inserted into the main FTS5
table in a separate table. This backing table is used by the
xColumnSize API function, which is in turn used by
the built-in bm25 ranking function (and is likely to be useful 
to other ranking functions as well).

In order to save space, this backing table may be omitted by setting the
columnsize option to zero. For example:

-- A table without the xColumnSize() values stored on disk:
CREATE VIRTUAL TABLE ft USING fts5(a, b, c, columnsize=0);

-- Three equivalent ways of creating a table that does store the
-- xColumnSize() values on disk:
CREATE VIRTUAL TABLE ft USING fts5(a, b, c);
CREATE VIRTUAL TABLE ft USING fts5(a, b, c, columnsize=1);
CREATE VIRTUAL TABLE ft USING fts5(a, b, columnsize='1', c);


 It is an error to set the columnsize option to any value other than
0 or 1.

 If an FTS5 table is configured with columnsize=0 but is not a
contentless table, the xColumnSize API function
still works, but runs much more slowly. In this case, instead of reading
the value to return directly from the database, it reads the text value
itself and count the tokens within it on demand.

Or, if the table is also a contentless table,
then the following apply:


   The xColumnSize API always returns -1. There is no way to determine 
       the number of tokens in a value stored within a contentless FTS5 table
       configured with columnsize=0.

   Each inserted row must be accompanied by an explicitly specified rowid
       value. If a contentless table is configured with columnsize=0,
       attempting to insert a NULL value into the rowid is an SQLITE_MISMATCH
       error.

   All queries on the table must be full-text queries. In other words,
       they must use the MATCH or = operator with the table-name column as the
       left-hand operand, or else use the table-valued function syntax. Any
       query that is not a full-text query results in an error.


 The name of the table in which the xColumnSize values are stored
(unless columnsize=0 is specified) is "&lt;name&gt;_docsize", where 
&lt;name&gt; is the name of the FTS5 table itself. The 
sqlite3_analyzer
tool may be used on an existing database in order to determine how much
space might be saved by recreating an FTS5 table using columnsize=0.fts5.html#the_columnsize_option
¸5¸ˆxÀI       7=SKSQLite FTS5 Extension5.  Auxiliary Functions Auxiliary functions are similar to SQL scalar functions,
except that they may only be used within full-text queries (those that use
the MATCH operator) on an FTS5 table. Their results are calculated based not
only on the arguments passed to them, but also on the current match and 
matched row. For example, an auxiliary function may return a numeric value
indicating the accuracy of the match (see the bm25() function), 
or a fragment of text from the matched row that contains one or more 
instances of the search terms (see the snippet() function).

To invoke an auxiliary function, the name of the FTS5 table should be
specified as the first argument. Other arguments may follow the first,
depending on the specific auxiliary function being invoked. For example, to
invoke the "highlight" function:

SELECT highlight(email, 2, '&lt;b&gt;', '&lt;/b&gt;') FROM email WHERE email MATCH 'fts5'


The built-in auxiliary functions provided as part of FTS5 are described in
the following section. Applications may also implement 
custom auxiliary functions in C.fts5.html#_auxiliary_functions_“FÀH    79¥{CSQLite FTS5 Extension4.6. The Detail OptionFor each term in a document, the FTS index maintained by FTS5 
stores the rowid of the document, the column number of the column that contains
the term and the offset of the term within the column value. The "detail"
option may be used to omit some of this information. This reduces the space
that the index consumes within the database file, but also reduces the
capability and efficiency of the system.

 The detail option may be set to "full" (the default value), "column" or
"none". For example:

-- The following two lines are equivalent (because the default value
-- of "detail" is "full". 
CREATE VIRTUAL TABLE ft1 USING fts5(a, b, c);
CREATE VIRTUAL TABLE ft1 USING fts5(a, b, c, detail=full);

CREATE VIRTUAL TABLE ft2 USING fts5(a, b, c, detail=column);
CREATE VIRTUAL TABLE ft3 USING fts5(a, b, c, detail=none);


If the detail option is set to column, then for each term the FTS
index records the rowid and column number only, omitting the term offset
information. This results in the following restrictions:


   NEAR queries are not available.
   Phrase queries are not available.
   Assuming the table is not also a 
  contentless table, the 
  xInstCount, xInst, 
  xPhraseFirst and xPhraseNext
  are slower than usual. This is because instead of reading the required data
  directly from the FTS index they have to load and tokenize the document text 
  on demand.
   If the table is also a contentless table, the xInstCount, xInst, 
  xPhraseFirst and xPhraseNext APIs behave as if the current row contains no
  phrase matches at all (i.e. xInstCount() returns 0).

  
If the detail option is set to none, then for each term the FTS
index records just the rowid is stored. Both column and offset information
are omitted. As well as the restrictions itemized above for detail=column
mode, this imposes the following extra limitations:


   Column filter queries are not available.
   Assuming the table is not also a contentless table, the 
  xPhraseFirstColumn and 
  xPhraseNextColumn are slower than usual. 

   If the table is also a contentless table, the xPhraseFirstColumn and
  xPhraseNextColumn APIs behave as if the current row contains no phrase
  matches at all (i.e. xPhraseFirstColumn() sets the iterator to EOF).


 In one test that indexed a large set of emails (1636 MiB on disk), the FTS
index was 743 MiB on disk with detail=full, 340 MiB with detail=column and 134
MiB with detail=none.fts5.html#the_detail_option
DSD˜
ÀK     7A®{CSQLite FTS5 Extension5.1.1. The bm25() functionThe built-in auxiliary function bm25() returns a real value indicating
how well the current row matches the full-text query. The better the match,
the numerically smaller the value returned. A query such as the following may
be used to return matches in order from best to worst match:

SELECT * FROM fts WHERE fts MATCH ? ORDER BY bm25(fts)


 In order to calculate a documents score, the full-text query is separated
    into its component phrases. The bm25 score for document D and 
    query Q is then calculated as follows:

 

 In the above, nPhrase is the number of phrases in the query.
    |D| is the number of tokens in the current document, and
    avgdl is the average number of tokens in all documents within the
    FTS5 table.  k1 and b are both constants,
    hard-coded at 1.2 and 0.75 respectively.

 The "-1" term at the start of the formula is not found in most
implementations of the BM25 algorithm. Without it, a better match is assigned
a numerically higher BM25 score. Since the default sorting order is
"ascending", this means that appending "ORDER BY bm25(fts)" to a query would
cause results to be returned in order from worst to best. The "DESC" keyword
would be required in order to return the best matches first. In order to
avoid this pitfall, the FTS5 implementation of BM25 multiplies the result
by -1 before returning it, ensuring that better matches are assigned
numerically lower scores.

 IDF(qi) is the inverse-document-frequency of query 
    phrase i. It is calculated as follows, where N is the total
    number of rows in the FTS5 table and n(qi) is the total
    number of rows that contain at least one instance of phrase i:

 

 Finally, f(qi,D) is the phrase frequency of phrase 
i. By default, this is simply the number of occurrences of the phrase
within the current row. However, by passing extra real value arguments to 
the bm25() SQL function, each column of the table may be assigned a different
weight and the phrase frequency calculated as follows:

 

 where wc is the weight assigned to column c and
n(qi,c) is the number of occurrences of phrase i in
column c of the current row. The first argument passed to bm25()
following the table name is the weight assigned to the leftmost column of
the FTS5 table. The second is the weight assigned to the second leftmost
column, and so on. If there are not enough arguments for all table columns,
remaining columns are assigned a weight of 1.0. If there are too many 
trailing arguments, the extras are ignored. For example:

-- Assuming the following schema:
CREATE VIRTUAL TABLE email USING fts5(sender, title, body);

-- Return results in bm25 order, with each phrase hit in the "sender"
-- column considered the equal of 10 hits in the "body" column, and
-- each hit in the "title" column considered as valuable as 5 hits in
-- the "body" column.
SELECT * FROM email WHERE email MATCH ? ORDER BY bm25(email, 10.0, 5.0);


Refer to wikipedia for 
more information regarding
BM25 and its variants.fts5.html#the_bm25_function‡(ÀJ  7OYSQLite FTS5 Extension5.1. Built-in Auxiliary FunctionsFTS5 provides three built-in auxiliary functions:


   The bm25() auxiliary function returns a real value
       reflecting the accuracy of the current match. Better matches are
       assigned numerically lower values.

   The highlight() auxiliary function returns a copy
       of the text from one of the columns of the current match with each
       instance of a queried term within the result surrounded by specified
       markup (for example "&lt;b&gt;" and "&lt;/b&gt;").

   The snippet() auxiliary function selects a short
       fragment of text from one of the columns of the matched row and returns
       it with each instance of a queried term surrounded by markup in
       the same manner as the highlight() function. The fragment of text is
       selected so as to maximize the number of queried terms it contains.fts5.html#built_in_auxiliary_functions

Eˆ1ÀM  7G=ISQLite FTS5 Extension5.1.3. The snippet() functionThe snippet() function is similar to highlight(), except that instead of
returning entire column values, it automatically selects and extracts a
short fragment of document text to process and return. The snippet() function
must be passed five parameters following the table name argument:


   An integer indicating the index of the FTS table column to select
       the returned text from. Columns are numbered from left to right 
       starting at zero. A negative value indicates that the column should
       be automatically selected.

   The text to insert before each phrase match within the returned text.

   The text to insert after each phrase match within the returned text.

   The text to add to the start or end of the selected text to indicate
       that the returned text does not occur at the start or end of its column,
       respectively.

   The maximum number of tokens in the returned text. This must be greater
       than zero and equal to or less than 64.fts5.html#the_snippet_function‹6ÀL       7K•?MSQLite FTS5 Extension5.1.2. The highlight() functionThe highlight() function returns a copy of the text from a specified 
column of the current row with extra markup text inserted to mark the start 
and end of phrase matches. 

The highlight() must be invoked with exactly three arguments following 
the table name. To be interpreted as follows:


   An integer indicating the index of the FTS table column to read the 
       text from. Columns are numbered from left to right starting at zero.

   The text to insert before each phrase match.

   The text to insert after each phrase match.


For example:

-- Return a copy of the text from the leftmost column of the current
-- row, with phrase matches marked using html "b" tags.
SELECT highlight(fts, 0, '&lt;b&gt;', '&lt;/b&gt;') FROM fts WHERE fts MATCH ?


In cases where two or more phrase instances overlap (share one or more
tokens in common), a single open and close marker is inserted for each set
of overlapping phrases. For example:

-- Assuming this:
CREATE VIRTUAL TABLE ft USING fts5(a);
INSERT INTO ft VALUES('a b c x c d e');
INSERT INTO ft VALUES('a b c c d e');
INSERT INTO ft VALUES('a b c d e');

-- The following SELECT statement returns these three rows:
--   '&#91;a b c&#93; x &#91;c d e&#93;'
--   '&#91;a b c&#93; &#91;c d e&#93;'
--   '&#91;a b c d e&#93;'
SELECT highlight(ft, 0, '&#91;', '&#93;') FROM ft WHERE ft MATCH 'a+b+c AND c+d+e';fts5.html#the_highlight_function
––”eÀN       7a§ikSQLite FTS5 Extension5.2. Sorting by Auxiliary Function ResultsAll FTS5 tables feature a special hidden column named "rank". If the
current query is not a full-text query (i.e. if it does not include a MATCH
operator), the value of the "rank" column is always NULL. Otherwise, in a
full-text query, column rank contains by default the same value as would be
returned by executing the bm25() auxiliary function with no trailing 
arguments.

 The difference between reading from the rank column and using the bm25()
function directly within the query is only significant when sorting by the
returned value. In this case, using "rank" is faster than using bm25().

-- The following queries are logically equivalent. But the second may
-- be faster, particularly if the caller abandons the query before
-- all rows have been returned (or if the queries were modified to 
-- include LIMIT clauses).
SELECT * FROM fts WHERE fts MATCH ? ORDER BY bm25(fts);
SELECT * FROM fts WHERE fts MATCH ? ORDER BY rank;


 Instead of using bm25() with no trailing arguments, the specific auxiliary
function mapped to the rank column may be configured either on a per-query
basis, or by setting a different persistent default for the FTS table.

 In order to change the mapping of the rank column for a single query, 
a term similar to either of the following is added to the WHERE clause of a 
query:

rank MATCH 'auxiliary-function-name(arg1, arg2, ...)'
rank = 'auxiliary-function-name(arg1, arg2, ...)'


 The right-hand-side of the MATCH or = operator must be a constant
expression that evaluates to a string consisting of the auxiliary function to
invoke, followed by zero or more comma separated arguments within parenthesis.
Arguments must be SQL literals. For example:

-- The following queries are logically equivalent. But the second may
-- be faster. See above. 
SELECT * FROM fts WHERE fts MATCH ? ORDER BY bm25(fts, 10.0, 5.0);
SELECT * FROM fts WHERE fts MATCH ? AND rank MATCH 'bm25(10.0, 5.0)' ORDER BY rank;


 The table-valued function syntax may also be used to specify an alternative
ranking function. In this case the text describing the ranking function should
be specified as the second table-valued function argument. The following three
queries are equivalent:

SELECT * FROM fts WHERE fts MATCH ? AND rank MATCH 'bm25(10.0, 5.0)' ORDER BY rank;
SELECT * FROM fts WHERE fts = ? AND rank = 'bm25(10.0, 5.0)' ORDER BY rank;
SELECT * FROM fts WHERE fts(?, 'bm25(10.0, 5.0)') ORDER BY rank;


 The default mapping of the rank column for a table may be modified 
using the FTS5 rank configuration option.fts5.html#sorting_by_auxiliary_function_results
‰|‰‰nÀP   7c‘{iSQLite FTS5 Extension6.2. The 'crisismerge' Configuration OptionThe 'crisismerge' option is similar to 'automerge', in that it determines
how and how often the component b-trees that make up the full-text index are
merged together. Once there exist C or more b-trees on a single level
within the full-text index, where C is the value of the 'crisismerge'
option, all b-trees on the level are immediately merged into a single b-tree.

The difference between this option and the 'automerge' option is that when
the 'automerge' limit is reached FTS5 only begins to merge the b-trees
together. Most of the work is performed as part of subsequent INSERT, 
UPDATE or DELETE operations. Whereas when the 'crisismerge' limit is reached,
the offending b-trees are all merged immediately. This means that an INSERT,
UPDATE or DELETE that triggers a crisis-merge may take a long time to 
complete.

The default 'crisismerge' value is 16. There is no maximum limit. Attempting
to set the 'crisismerge' parameter to a value of 0 or 1 is equivalent to
setting it to the default value (16). It is an error to attempt to set the
'crisismerge' option to a negative value.

INSERT INTO ft(ft, rank) VALUES('crisismerge', 16);fts5.html#the_crisismerge_configuration_optionŽÀO  7_œ%eSQLite FTS5 Extension6.1. The 'automerge' Configuration OptionInstead of using a single data structure on disk to store the full-text
  index, FTS5 uses a series of b-trees. Each time a new transaction is
  committed, a new b-tree containing the contents of the committed transaction
  is written into the database file. When the full-text index is queried, each
  b-tree must be queried individually and the results merged before being
  returned to the user.


  In order to prevent the number of b-trees in the database from becoming too
  large (slowing down queries), smaller b-trees are periodically merged into
  single larger b-trees containing the same data. By default, this happens
  automatically within INSERT, UPDATE or DELETE statements that modify the
  full-text index. The 'automerge' parameter determines how many smaller
  b-trees are merged together at a time. Setting it to a small value can
  speed up queries (as they have to query and merge the results from fewer 
  b-trees), but can also slow down writing to the database (as each INSERT,
  UPDATE or DELETE statement has to do more work as part of the automatic
  merging process).


  Each of the b-trees that make up the full-text index is assigned to a "level"
  based on its size. Level-0 b-trees are the smallest, as they contain the
  contents of a single transaction. Higher level b-trees are the result of
  merging two or more level-0 b-trees together and so they are larger. FTS5
  begins to merge b-trees together once there exist M or more b-trees 
  with the same level, where M is the value of the 'automerge' 
  parameter.


  The maximum allowed value for the 'automerge' parameter is 16. The default
  value is 4. Setting the 'automerge' parameter to 0 disables the automatic 
  incremental merging of b-trees altogether.

INSERT INTO ft(ft, rank) VALUES('automerge', 8);fts5.html#the_automerge_configuration_option
)ØÑ)‰#ÀS       7Q‘  WSQLite FTS5 Extension6.5. The 'integrity-check' CommandThis command is used to verify that the full-text index is internally
consistent, and, optionally, that it is consistent with any 
external content table.

The integrity-check command is invoked by inserting the text value
'integrity-check' into the special column with the same name as the FTS5
table. If a value is supplied for the "rank" column, it must be either
0 or 1. For example:

INSERT INTO ft(ft) VALUES('integrity-check');
INSERT INTO ft(ft, rank) VALUES('integrity-check', 0);
INSERT INTO ft(ft, rank) VALUES('integrity-check', 1);


The three forms above are equivalent for all FTS tables that are
not external content tables. They check that the index data structures are 
not corrupt, and, if the FTS table is not contentless, that the contents of
the index match the contents of the table itself.

For an external content table, the contents of the index are only
compared to the contents of the external content table if the value 
specified for the rank column is 1.

In all cases, if any discrepancies are found, the command fails 
with an SQLITE_CORRUPT_VTAB error.fts5.html#the_integrity_check_command‚ÀR    7G‚[MSQLite FTS5 Extension6.4. The 'delete-all' CommandThis command is only available with external content and contentless tables. It
deletes all entries from the full-text index.

INSERT INTO ft(ft) VALUES('delete-all');fts5.html#the_delete_all_commandŽ#ÀQ   7?›-ESQLite FTS5 Extension6.3. The 'delete' CommandThis command is only available with external content and contentless tables. It
is used to delete the index entries associated with a single row from the
full-text index. This command and the delete-all
command are the only ways to remove entries from the full-text index of a
contentless table.

 In order to use this command to delete a row, the text value 'delete' 
must be inserted into the special column with the same name as the table.
The rowid of the row to delete is inserted into the rowid column. The
values inserted into the other columns must match the values currently
stored in the table. For example:

-- Insert a row with rowid=14 into the fts5 table.
INSERT INTO ft(rowid, a, b, c) VALUES(14, $a, $b, $c);

-- Remove the same row from the fts5 table.
INSERT INTO ft(ft, rowid, a, b, c) VALUES('delete', 14, $a, $b, $c);


 If the values "inserted" into the text columns as part of a 'delete'
command are not the same as those currently stored within the table, the
results may be unpredictable.

 The reason for this is easy to understand: When a document is inserted
into the FTS5 table, an entry is added to the full-text index to record the
position of each token within the new document. When a document is removed,
the original data is required in order to determine the set of entries that
need to be removed from the full-text index. So if the data supplied to FTS5
when a row is deleted using this command is different from that used to
determine the set of token instances when it was inserted, some full-text 
index entries may not be correctly deleted, or FTS5 may try to remove index 
entries that do not exist. This can leave the full-text index in an
unpredictable state, making future query results unreliable.fts5.html#the_delete_command
'€'ŠTÀU    7C”ISQLite FTS5 Extension6.7. The 'optimize' CommandThis command merges all individual b-trees that currently make up the
full-text index into a single large b-tree structure. This ensures that the
full-text index consumes the minimum space within the database and is in the
fastest form to query.

Refer to the documentation for the FTS5 automerge option for more details
regarding the relationship between the full-text index and its component
b-trees.

INSERT INTO ft(ft) VALUES('optimize');


Because it reorganizes the entire FTS index, the optimize command can 
take a long time to run. The FTS5 merge command can be used to divide
the work of optimizing the FTS index into multiple steps. To do this:


   Invoke the 'merge' command once with the parameter set to -N, then
   Invoke the 'merge' command zero or more times with the parameter set to N.


where N is the number of pages of data to merge within each invocation of
the merge command. The application should stop invoking merge when the
difference in the value returned by the sqlite3_total_changes() function before
and after the merge command drops to below two. The merge commands may be
issued as part of the same or separate transactions, and by the same or
different database clients. Refer to the documentation for the 
merge command for further details.fts5.html#the_optimize_command’{ÀT   7=¤aCSQLite FTS5 Extension6.6. The 'merge' CommandINSERT INTO ft(ft, rank) VALUES('merge', 500);


 This command merges b-tree structures together until roughly N pages
of merged data have been written to the database, where N is the absolute
value of the parameter specified as part of the 'merge' command. The size of
each page is as configured by the FTS5 pgsz option.

 If the parameter is a positive value, B-tree structures are only eligible
for merging if one of the following is true:


   There are U or more such b-trees on a
       single level (see the documentation for the FTS5 automerge option
       for an explanation of b-tree levels), where U is the value assigned
       to the FTS5 usermerge option option.
   A merge has already been started (perhaps by a 'merge' command that
       specified a negative parameter).


 It is possible to tell whether or not the 'merge' command found any 
b-trees to merge together by checking the value returned by the
sqlite3_total_changes() API before and after the command is executed. If
the difference between the two values is 2 or greater, then work was performed.
If the difference is less than 2, then the 'merge' command was a no-op. In this
case there is no reason to execute the same 'merge' command again, at least
until after the FTS table is next updated.

 If the parameter is negative, and there are B-tree structures on more than
one level within the FTS index, all B-tree structures are assigned to the same
level before the merge operation is commenced. Additionally, if the parameter
is negative, the value of the usermerge configuration option is not 
respected - as few as two b-trees from the same level may be merged together.

 The above means that executing the 'merge' command with a negative
parameter until the before and after difference in the return value of
sqlite3_total_changes() is less than two optimizes the FTS index in the
same way as the FTS5 optimize command. However, if a new b-tree is added
to the FTS index while this process is ongoing, FTS5 will move the new 
b-tree to the same level as the existing b-trees and restart the merge. To
avoid this, only the first call to 'merge' should specify a negative parameter.
Each subsequent call to 'merge' should specify a positive value so that the
merge started by the first call is run to completion even if new b-trees are
added to the FTS index.fts5.html#the_merge_command
è
ñ6
è„ÀY      7a†_eSQLite FTS5 Extension6.11. The 'usermerge' Configuration OptionThis command is used to set the persistent "usermerge" option.

 The usermerge option is similar to the automerge and crisismerge options.
It is the minimum number of b-tree segments that will be merged together by
a 'merge' command with a positive parameter. For example:

INSERT INTO ft(ft, rank) VALUES('usermerge', 4);


 The default value of the usermerge option is 4. The minimum allowed value
is 2, and the maximum 16.fts5.html#the_usermerge_configuration_option‚'ÀX      7Cƒ/GSQLite FTS5 Extension6.10. The 'rebuild' CommandThis command first deletes the entire full-text index, then rebuilds it
based on the contents of the table or content
table.  It is not available with contentless
tables.

INSERT INTO ft(ft) VALUES('rebuild');fts5.html#the_rebuild_commandƒ6ÀW 7U…'[SQLite FTS5 Extension6.9. The 'rank' Configuration OptionThis command is used to set the persistent "rank" option.

 The rank option is used to change the default auxiliary function mapping
for the rank column. The option should be set to a text value in the same
format as described for "rank MATCH ?" terms 
above. For example:

INSERT INTO ft(ft, rank) VALUES('rank', 'bm25(10.0, 5.0)');fts5.html#the_rank_configuration_option„
ÀV     7U†O[SQLite FTS5 Extension6.8. The 'pgsz' Configuration OptionThis command is used to set the persistent "pgsz" option.

 The full-text index maintained by FTS5 is stored as a series of fixed-size
blobs in a database table. It is not strictly necessary for all blobs that make
up a full-text index to be the same size. The pgsz option determines the size
of all blobs created by subsequent index writers. The default value is 1000.

INSERT INTO ft(ft, rank) VALUES('pgsz', 4072);fts5.html#the_pgsz_configuration_option
jj—ÀZ  7/-!=SQLite FTS5 Extension7. Extending FTS5FTS5 features APIs allowing it to be extended by:


   Adding new auxiliary functions implemented in C, and
   Adding new tokenizers, also implemented in C.


 The built-in tokenizers and auxiliary functions described in this
document are all implemented using the publicly available API described
below.

 Before a new auxiliary function or tokenizer implementation may be 
registered with FTS5, an application must obtain a pointer to the "fts5_api"
structure. There is one fts5_api structure for each database connection with
which the FTS5 extension is registered. To obtain the pointer, the application
invokes the SQL user-defined function fts5() with a single argument.  That
argument must be set to a pointer to a pointer to an fts5_api object
using the sqlite3_bind_pointer() interface.
The following example code demonstrates the technique:

/*
** Return a pointer to the fts5_api pointer for database connection db.
** If an error occurs, return NULL and leave an error in the database 
** handle (accessible using sqlite3_errcode()/errmsg()).
*/
fts5_api *fts5_api_from_db(sqlite3 *db){
  fts5_api *pRet = 0;
  sqlite3_stmt *pStmt = 0;

  if( SQLITE_OK==sqlite3_prepare(db, "SELECT fts5(?1)", -1, &pStmt, 0) ){
    sqlite3_bin_pointer(pStmt, (void*)&pRet, "fts5_api_ptr", NULL);
    sqlite3_step(pStmt);
  }
  sqlite3_finalize(pStmt);
  return pRet;
}


Backwards Compatibility Warning:
Prior to SQLite version 3.20.0 (2017-08-01), the fts5() worked slightly
differently.  Older applications that extend FTS5 must be revised to use 
the new technique shown above.

 The fts5_api structure is defined as follows. It exposes three methods, 
one each for registering new auxiliary functions and tokenizers, and one for
retrieving existing tokenizer. The latter is intended to facilitate the
implementation of "tokenizer wrappers" similar to the built-in
porter tokenizer.

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*)
  );
};


 To invoke a method of the fts5_api object, the fts5_api pointer itself
should be passed as the methods first argument followed by the other, method
specific, arguments. For example:

rc = pFts5Api->xCreateTokenizer(pFts5Api, ... other args ...);


 The fts5_api structure methods are described individually in the following
sections.fts5.html#extending_fts5table uses the custom tokenizer, the FTS5 core calls xCreate()
once to create a tokenizer, then xTokenize() zero or more times to tokenize
strings, then xDelete() to free any resources allocated by xCreate(). More
specifically:


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.fts5.html#custom_tokenizers
Â{©,À\ 79ÑK?SQLite FTS5 Extension7.1.1. Synonym SupportCustom 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:

    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.

        By querying the index for all synonyms of each query te/°xÀ[        79à_CSQLite FTS5 Extension7.1. Custom TokenizersTo create a custom tokenizer, an application must implement three
functions: a tokenizer constructor (xCreate), a destructor (xDelete) and a
function to do the actual tokenization (xTokenize). The type of each
function is as for the member variables of the fts5_tokenizer struct:

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 */


 The implementation is registered with the FTS5 module by calling the
xCreateTokenizer() method of the fts5_api object. If there is already a
tokenizer with the same name, it is replaced.  If a non-NULL xDestroy parameter
is passed to xCreateTokenizer(), it is invoked with a copy of the pContext
pointer passed as the only argument when the database handle is closed or when
the tokenizer is replaced.

 If successful, xCreateTokenizer() returns SQLITE_OK. Otherwise, it
returns an SQLite error code. In this case the xDestroy function is not 
invoked.

 When an FTS5 -rm
            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.

        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.fts5.html#synonym_support
»»–@À]      7K«KUSQLite FTS5 Extension7.2. Custom Auxiliary FunctionsImplementing a custom auxiliary function is similar to implementing a
scalar SQL function. The implementation
should be a C function of type fts5_extension_function, defined as follows:

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 */
);


 The implementation is registered with the FTS5 module by calling the
xCreateFunction() method of the fts5_api object. If there is already an
auxiliary function with the same name, it is replaced by the new function.
If a non-NULL xDestroy parameter is passed to xCreateFunction(), it is invoked
with a copy of the pContext pointer passed as the only argument when the
database handle is closed or when the registered auxiliary function is
replaced.

 If successful, xCreateFunction() returns SQLITE_OK. Otherwise, it
returns an SQLite error code. In this case the xDestroy function is not 
invoked.

 The final three arguments passed to the auxiliary function callback are
similar to the three arguments passed to the implementation of a scalar SQL
function. All arguments except the first passed to the auxiliary function are
available to the implementation in the apVal&#91;&#93; array. The
implementation should return a result or error via the content handle pCtx.

 The first argument passed to an auxiliary function callback is a pointer
to a structure containing methods that may be invoked in order to obtain
information regarding the current query or row. The second argument is an
opaque handle that should be passed as the first argument to any such method 
invocation. For example, the following auxiliary function definition returns
the total number of tokens in all columns of the current row:

/*
** Implementation of an auxiliary function that returns the number
** of tokens in the current row (including all columns).
*/
static void column_size_imp(
  const Fts5ExtensionApi *pApi,
  Fts5Context *pFts,
  sqlite3_context *pCtx,
  int nVal,
  sqlite3_value **apVal
){
  int rc;
  int nToken;
  rc = pApi->xColumnSize(pFts, -1, &nToken);
  if( rc==SQLITE_OK ){
    sqlite3_result_int(pCtx, nToken);
  }else{
    sqlite3_result_error_code(pCtx, rc);
  }
}


The following section describes the API offered to auxiliary function
implementations in detail. Further examples may be found in the "fts5_aux.c"
file of the source code.fts5.html#custom_auxiliary_functions2essful, (*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.



int (*xPhraseCount)(Fts5Context*)

Returns the number of phrases in the current query expression.



int (*xPhraseSize)(Fts5Context*, int iPhrase)

Returns the number of tokens in phrase iPhrase of the query. Phrases
   are numbered starting from zero.



int (*xInstCount)(Fts5Context*, int *pnInst)

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.



int (*xInst)(Fts5Context*, int iIdx, int *piPhrase, int *piCol, int *piOff)

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.



sqlite3_int64 (*xRowid)(Fts5Context*)

Returns the rowid of the current row.



int (*xTokenize)(Fts5Context*, 
    const char *pText, int nText, 
    void *pCtx,                   
    int (*xToken)(void*, int, const char*, int, int, int)       
)

Tokenize text using the tokenizer belonging to the FTS5 table.



int (*xQueryPhrase)(Fts5Context*, int iPhrase, void *pUserData,
    int(*)(const Fts5ExtensionApi*,Fts5Context*,void*)
)

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.



int (*xSetAuxdata)(Fts5Context*, void *pAux, void(*xDelete)(void*))

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.



void *(*xGetAuxdata)(Fts5Context*, int 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.



int (*xRowCount)(Fts5Context*, sqlite3_int64 *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;



int (*xPhraseFirst)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*, int*)

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).



void (*xPhraseNext)(Fts5Context*, Fts5PhraseIter*, int *piCol, int *piOff)

See xPhraseFirst above.



int (*xPhraseFirstColumn)(Fts5Context*, int iPhrase, Fts5PhraseIter*, int*)

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.



void (*xPhraseNextColumn)(Fts5Context*, Fts5PhraseIter*, int *piCol)

See xPhraseFirstColumn above.fts5.html#_custom_auxiliary_functions_api_reference_
\\ÙÀ^
7s°'uSQLite FTS5 Extension7.2.1. 
  Custom Auxiliary Functions API Reference
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);
};




void *(*xUserData)(Fts5Context*)

Return a copy of the context pointer the extension function was 
   registered with.



int (*xColumnTotalSize)(Fts5Context*, int iCol, sqlite3_int64 *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.



int (*xColumnCount)(Fts5Context*)

Return the number of columns in the table.



int (*xColumnSize)(Fts5Context*, int iCol, int *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.



int (*xColumnText)(Fts5Context*, int iCol, const char **pz, int *pn)

This function attempts to retrieve the text of column iCol of the
   current document. If succ1n a database other than "temp", the name of the
database is inserted before the FTS5 table name in the CREATE VIRTUAL TABLE 
arguments. For example:

-- Create an fts5vocab "row" table to query the full-text index belonging
-- to FTS5 table "ft1" in database "main".
CREATE VIRTUAL TABLE temp.ft1_v USING fts5vocab(main, 'ft1', 'row');

-- Create an fts5vocab "col" table to query the full-text index belonging
-- to FTS5 table "ft2" in attached database "aux".
CREATE VIRTUAL TABLE temp.ft2_v USING fts5vocab('aux', ft2, col);

-- Create an fts5vocab "instance" table to query the full-text index 
-- belonging to FTS5 table "ft3" in attached database "other".
CREATE VIRTUAL TABLE temp.ft2_v USING fts5vocab('aux', ft3, 'instance');


 Specifying three arguments when creating an fts5vocab table in any database
other than "temp" results in an error.

 An fts5vocab table of type "row" contains one row for each distinct term
in the associated FTS5 table. The table columns are as follows:


  ColumnContents
  term The term, as stored in the FTS5 index.
  doc  The number of rows that contain at least one instance of the term.
  cnt  The total number of instances of the term in the entire FTS5 table.


 An fts5vocab table of type "col" contains one row for each distinct term/column
combination in the associated FTS5 table. Table columns are as follows:


  ColumnContents
  term The term, as stored in the FTS5 index.
  col  The name of the FTS5 table column that contains the term.
  doc  The number of rows in the FTS5 table for which column $col
                   contains at least one instance of the term.
  cnt  The total number of instances of the term that appear in
                   column $col of the FTS5 table (considering all rows). 


 An fts5vocab table of type "instance" contains one row for each term
instance stored in the associated FTS index. Assuming the FTS5 table is
created with the 'detail' option set to 'full', table columns are as follows:


  ColumnContents
  term   The term, as stored in the FTS5 index.
  doc    The rowid of the document that contains the term instance.
  col    The name of the column that contains the term instance.
  offset The index of the term instance within its column. Terms 
                     are numbered in order of occurrence starting from 0.


 If the FTS5 table is created with the 'detail' option set to 'col', then
the offset column of an instance virtual table always contains NULL.
In this case there is one row in the table for each unique term/doc/col 
combination. Or, if the FTS5 table is created with 'detail' set to 'none',
then both offset and col always contain NULL values. For
detail=none FTS5 tables, there is one row in the fts5vocab table for each
unique term/doc combination.

Example:

-- Assuming a database created using:
CREATE VIRTUAL TABLE ft1 USING fts5(c1, c2);
INSERT INTO ft1 VALUES('apple banana cherry', 'banana banana cherry');
INSERT INTO ft1 VALUES('cherry cherry cherry', 'date date date');

-- Then querying the following fts5vocab table (type "col") returns:
--
--    apple  | c1 | 1 | 1
--    banana | c1 | 1 | 1
--    banana | c2 | 1 | 2
--    cherry | c1 | 2 | 4
--    cherry | c2 | 1 | 1
--    date   | c3 | 1 | 3
--
CREATE VIRTUAL TABLE ft1_v_col USING fts5vocab(ft1, col);

-- Querying an fts5vocab table of type "row" returns:
--
--    apple  | 1 | 1
--    banana | 1 | 3
--    cherry | 2 | 5
--    date   | 1 | 3
--
CREATE VIRTUAL TABLE ft1_v_row USING fts5vocab(ft1, row);

-- And, for type "instance"
INSERT INTO ft1 VALUES('apple banana cherry', 'banana banana cherry');
INSERT INTO ft1 VALUES('cherry cherry cherry', 'date date date');
--
--    apple  | 1 | c1 | 0
--    banana | 1 | c1 | 1
--    banana | 1 | c2 | 0
--    banana | 1 | c2 | 1
--    cherry | 1 | c1 | 2
--    cherry | 1 | c2 | 2
--    cherry | 2 | c1 | 0
--    cherry | 2 | c1 | 1
--    cherry | 2 | c1 | 2
--    date   | 2 | c2 | 0
--    date   | 2 | c2 | 1
--    date   | 2 | c2 | 2
--
CREATE VIRTUAL TABLE ft1_v_instance USING fts5vocab(ft1, instance);fts5.html#the_fts5vocab_virtual_table_module
3
…3MÀ`        7; ISQLite FTS5 Extension9. FTS5 Data StructuresThis section describes at a high-level the way the FTS module stores its
index and content in the database. It is not necessary to read or understand
the material in this section in order to use FTS in an application. However, it
may be useful to application developers attempting to analyze and understand
FTS performance characteristics, or to developers contemplating enhancements to
the existing FTS feature set.


When an FTS5 virtual table is created in a database, between 3 and 5 real
tables are created in the database. These are known as "shadow tables", and
are used by the virtual table module to store persistent data. They should not
be accessed directly by the user. Many other virtual table modules, including
FTS3 and rtree, also create and use shadow tables.

FTS5 creates the following shadow tables. In each case the actual table name
is based on the name of the FTS5 virtual table (in the following, replace
% with the name of the virtual table to find the actual shadow table name).

-- This table contains most of the full-text index data. 
CREATE TABLE %_data(id INTEGER PRIMARY KEY, block BLOB);

-- This table contains the remainder of the full-text index data. 
-- It is almost always much smaller than the %_data table. 
CREATE TABLE %_idx(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID;

-- Contains the values of persistent configuration parameters.
CREATE TABLE %_config(k PRIMARY KEY, v) WITHOUT ROWID;

-- Contains the size of each column of each row in the virtual table
-- in tokens. This shadow table is not present if the "columnsize"
-- option is set to 0.
CREATE TABLE %_docsize(id INTEGER PRIMARY KEY, sz BLOB);

-- Contains the actual data inserted into the FTS5 table. There
-- is one "cN" column for each indexed column in the FTS5 table.
-- This shadow table is not present for contentless or external 
-- content FTS5 tables. 
CREATE TABLE %_content(id INTEGER PRIMARY KEY, c0, c1...);


The following sections describe in more detail how these five tables are
used to store FTS5 data.fts5.html#fts5_data_structuresªnÀ_     7WÔeSQLite FTS5 Extension8. The fts5vocab Virtual Table ModuleThe fts5vocab virtual table module allows users to extract information from
an FTS5 full-text index directly. The fts5vocab module is a part of FTS5 - it 
is available whenever FTS5 is.

 Each fts5vocab table is associated with a single FTS5 table. An fts5vocab
table is usually created by specifying two arguments in place of column names
in the CREATE VIRTUAL TABLE statement - the name of the associated FTS5 table
and the type of fts5vocab table. Currently there are three types of fts5vocab
table; "row", "col" and "instance". Unless the fts5vocab table is created
within the "temp" database, it must be part of the same database as the
associated FTS5 table.

-- Create an fts5vocab "row" table to query the full-text index belonging
-- to FTS5 table "ft1".
CREATE VIRTUAL TABLE ft1_v USING fts5vocab('ft1', 'row');

-- Create an fts5vocab "col" table to query the full-text index belonging
-- to FTS5 table "ft2".
CREATE VIRTUAL TABLE ft2_v USING fts5vocab(ft2, col);

-- Create an fts5vocab "instance" table to query the full-text index
-- belonging to FTS5 table "ft3".
CREATE VIRTUAL TABLE ft3_v USING fts5vocab(ft3, instance);


 If an fts5vocab table is created in the temp database, it may be associated
with an FTS5 table in any attached database. In order to attach the fts5vocab
table to an FTS5 table located i4
      
&    ˜Àb      7e®QeSQLite FTS5 Extension9.2. The FTS Index (%_idx and %_data tables)The FTS index is an ordered key-value store where the keys are document
terms or term prefixes and the associated values are "doclists". A doclist is a
packed array of varints that encodes the position of each instance of the term
within the FTS5 table. The position of a single term instance is defined as the
combination of:


   The rowid of the FTS5 table row it appears in,
   The index of the column the term instance appears in (columns are
       numbered from left to right starting from zero), and
   The offset of the term within the column value (i.e. the number of 
       tokens that appear within the column value before this one).


The FTS index contains up to (nPrefix+1) entries for each token in the 
data set, where nPrefix is the number of defined 
prefix indexes.

Keys associated with the main FTS index (the one that is not a prefix
index) are prefixed with the character "0". Keys for the first prefix 
index are prefixed with "1". Keys for the second prefix index are
prefixed with "2", and so on. For example, if the token "document" is 
inserted into an FTS5 table with prefix indexes
specified by prefix="2 4", then the keys added to the FTS index would be 
"0document", "1do" and "2docu".

The FTS index entries are not stored in a single tree or hash table
structure. Instead, they are stored in a series of immutable b-tree like
structures referred to as "segment b-trees". Each time a write to the FTS5
table is committed, one or more (but usually just one) new segment b-trees
are added containing both the new entries and tombstones for any deleted
entries. When the FTS index is queried, the reader queries each segment 
b-tree in turn and merges the results, giving priority to newer data.

Each segment b-tree is assigned a numerical level. When a new segment 
b-tree is written to the database as part of committing a transaction,
it is assigned to level 0. Segment b-trees belonging to a single level are
periodically merged together to create a single, larger segment b-tree
that is assigned to the next level (i.e. level 0 segment b-trees are 
merged to become a single level 1 segment b-tree). Thus the numerically
larger levels contain older data in (usually) larger segment b-trees. 
Refer to the 
'automerge',
'crisismerge' and
'usermerge' options, along
with the 
'merge' and
'optimize' commands for details on how to
control the merging.

In cases where the doclist associated with a term or term prefix is very
large, there may be an associated doclist
index. A doclist index is similar to the set of internal nodes of a b-tree.
It allows a large doclist to be efficiently queried for rowids or ranges of
rowids. For example, when processing a query like:

SELECT ... FROM fts_table('term') WHERE rowid BETWEEN ? AND ?


FTS5 uses the segment b-tree index to locate the doclist for term "term",
then uses its doclist index (assuming it is present) to efficiently identify
the subset of matches with rowids in the required range.fts5.html#the_fts_index_idx_and_data_tables_…UÀa       71Š);SQLite FTS5 Extension9.1. Varint FormatThe sections below refer to 64-bit signed integers stored in "varint" form.
FTS5 uses the same varint format as used in various places by the SQLite core.

A varint is between 1 and 9 bytes in length. The varint consists of either
zero or more bytes which have the high-order bit set followed by a single byte
with the high-order bit clear, or nine bytes, whichever is shorter. The lower
seven bits of each of the first eight bytes and all 8 bits of the ninth byte
are used to reconstruct the 64-bit twos-complement integer. Varints are
big-endian: bits taken from the earlier byte of the varint are more significant
than bits taken from the later bytes.fts5.html#varint_format
_úó_…Àe        7GˆuMSQLite FTS5 Extension9.2.3. Averages Record FormatThe averages record, which is always stored with id=10 in the %_data table,
does not store the average of anything. Instead, it contains a vector of
(nCol+1) packed varint values, where nCol is the number of columns in the FTS5
table, including unindexed columns. The first varint contains the total 
number of rows in the FTS5 table. The second contains the total number of
tokens in all values stored in the leftmost FTS5 table column. The third the
number of tokens in all values for the next leftmost, and so on. The value for
unindexed columns is always zero.fts5.html#averages_record_formatŠÀd  7I’WOSQLite FTS5 Extension9.2.2. Structure Record FormatThe structure record identifies the set of segment b-trees that make up the 
current FTS index, along with details of any ongoing incremental merge
operations. It is stored in the %_data table with id=1.

A structure record begins with a single 32-bit unsigned value - the cookie
value.  This value is incremented each time the structure is modified.
Following the cookie value are three varint values, as follows:


   The number of levels in the index (i.e. the maximum level associated
       with any segment b-tree plus one).
   The total number of segment b-trees in the index.
   The total number of segment b-tree leaves written to level 0 trees
       since the FTS5 table was created.


Then, for each level from 0 to nLevel:


   The number of input segments from the previous level being used as
       inputs for the current incremental merge, or zero if there is no
       ongoing incremental merge to create a new segment b-tree for this level.
   The total number of segment b-trees on the level.
   Then, for each segment b-tree, from oldest to newest:
  
     The segment id.
     Page number of first leaf (often 1, always >0).
     Page number of last leaf (always >0).fts5.html#structure_record_formatÀc        7Sž]=SQLite FTS5 Extension9.2.1. The %_data Table Rowid SpaceCREATE TABLE %_data(
  id INTEGER PRIMARY KEY, 
  block BLOB
);


The %_data table is used to store three types of records:


   The special structure record, 
       stored with id=1.
   The special averages record, 
       stored with id=10.
   A record to store each segment b-tree
       leaf and doclist index leaf and
       internal node. See below for how id values are calculated for these
       records.


Each segment b-tree in the system is assigned a unique 16-bit segment id.
Segment ids may only be reused after the original owner segment b-tree is
completely merged into a higher level segment b-tree. Within a segment b-tree,
each leaf page is assigned a unique page number - 1 for the first leaf page, 2
for the second, and so on.

Each doclist index leaf page is also assigned a page number. The first
(leftmost) leaf page in a doclist index is assigned the same page number as 
the segment b-tree leaf page on which its term appears (because doclist indexes
are only created for terms with very long doclists, at most one term per
segment b-tree leaf has an associated doclist index). Call this page number P.
If the doclist is so large that it requires a second leaf, the second leaf is
assigned page number P+1. The third leaf P+2. Each tier of a doclist index
b-tree (leaves, parents of leaves, grandparents etc.) is assigned page numbers
in this fashion, starting with page number P.

The "id" value used in the %_data table to store any given segment b-tree
leaf or doclist index leaf or node is composed as follows:


Rowid&nbsp;Bits Contents
38..43  (16 bit) Segment b-tree id value.
37  (1 bit) Doclist index flag. Set for doclist index pages, clear
                for segment b-tree leaves.
32..36  (5 bits) Height in tree. This is set to 0 for segment b-tree
                    and doclist index leaves, to 1 for the parents of doclist
                    index leaves, 2 for the grandparents, etc.
0..31  (32 bits) Page numberfts5.html#data_structure stored as is, just as
       if it were the first rowid of its doclist (which it may or may not be).


Each page also has fixed-size 4-byte header and a variably-sized footer.
The header is divided into 2 16-bit big-endian integer fields. They
contain:


   The byte offset of the first rowid value on the page, if it occurs
       before the first key, or 0 otherwise.
   The byte offset of the page footer.


The page footer consists of a series of varints containing the byte offset
of each key that appears on the page. The page footer is zero bytes in size
if there are no keys on the page.



Figure 4 - Page Format


9.2.4.3. Segment Index Format

The result of formatting the contents of the segment b-tree in the 
key/doclist format and then splitting it into pages is something very
similar to the leaves of a b+tree. Instead of creating a format for
the internal nodes of this b+tree and storing them in the %_data table
alongside the leaves, the keys that would have been stored on such nodes are
added to the %_idx table, defined as:

CREATE TABLE %_idx(
  segid INTEGER,              -- segment id
  term TEXT,                  -- prefix of first key on page
  pgno INTEGER,               -- (2*pgno + bDoclistIndex)
  PRIMARY KEY(segid, term)
);


For each "leaf" page that contains at least one key, an entry is added
to the %_idx table. Fields are set as follows:


  ColumnContents
  segid   The integer segment id.
  term    The smallest prefix of the first key on the page that
                      is larger than all keys on the previous page. For the
                      first page in a segment, this prefix is zero bytes in
                      size.
  pgno    This field encodes both the page number (within the
                      segment - starting from 1) and the doclist index flag.
                      The doclist index flag is set if the final key on the
                      page has an associated 
                      doclist index. The value of this field is:
                      
       (pgno*2 + bDoclistIndexFlag)



Then, to find the leaf for segment i that may contain term t, instead of
searching through internal nodes, FTS5 runs the query:

SELECT pgno FROM %_idx WHERE segid=$i AND term>=$t ORDER BY term LIMIT 1


9.2.4.4. Doclist Index Format

The segment index described in the previous
section allows a segment b-tree to be efficiently queried by term or,
assuming there is a prefix index of the required size, a term prefix. The data
structure described in this section, doclist indexes, allows FTS5 to
efficiently search for a rowid or range or rowids within the doclist associated
with a single term or term prefix.

Not all keys have associated doclists indexes. By default, a doclist index
is only added for a key if its doclist spans more than 4 segment b-tree leaf
pages. Doclist indexes are themselves b-trees, with both leaves and internal
nodes stored as entries in the %_data table, but in practice most doclists are
small enough to fit on a single leaf. FTS5 uses the same rough size for doclist
index node and leaves as it does for segment b-tree leaves (by default 4000
bytes).

Doclist index leaves and internal nodes use the same page format. The first
byte is a "flags" byte. This is set to 0x00 for the root page of the doclist
index b-tree, and 0x01 for all other pages. The remainder of the page is a
series of tightly packed varints, as follows:


   page number of leftmost child page, followed by
   the smallest rowid value on the left most child page, followed by
   one varint for each subsequent child page, containing the value:
  
     0x00 if there are no rowids on the child page (this can only happen
         when the "child" page is actually a segment b-tree leaf), or
     the difference between the smallest rowid on the child page and
         the previous rowid value stored on the doclist index page.
  


For the leftmost doclist index leaf in a doclist index, the leftmost child
page is the first segment b-tree leaf after the one that contains the key
itself.fts5.html#segment_b_tree_format
&&¿MÀf       7EýuKSQLite FTS5 Extension9.2.4. Segment B-Tree Format9.2.4.1. The Key/Doclist Format

The key/doclist format is a format used to store a series of keys (document
terms or term prefixes prefixed by a single character to indentify the specific
index to which they belong) in sorted order, each with their associated
doclist. The format consists of alternating keys and doclists packed together.

The first key is stored as:

   A varint indicating the number of bytes in the key (N), followed by
   The key data itself (N bytes).


Each subsequent key is stored as:

   A varint indicating the size of the prefix that the key has in common
       with the previous key in bytes,
   A varint indicating the number of bytes in the key following the
       common prefix (N), followed by
   The key suffix data itself (N bytes).


For example, if the first two keys in an FTS5 key/doclist record are
"0challenger" and "0chandelier", then the first key is stored as varint 11
followed by the 11 bytes "0challenger", and the second key is stored as varints
4 and 7, followed by the 7 bytes "ndelier".



Figure 1 - Term/Doclist Format


Each doclist identifies the rows (by their rowid values) that contain at
least one instance of the term or term prefix and an associated position list,
or "poslist" enumerating the position of each term instance within the row. In
this sense a "position" is defined as a column number and term offset within
the column value. 

Within a doclist, documents are always stored in order sorted by rowid.  The
first rowid in a doclist is stored as is, as a varint. It is immediately
followed by its associated position list. Following this, the difference
between the first rowid and the second, as a varint, followed by the doclist
associated with the second rowid in the doclist. And so on.

There is no way to determine the size of a doclist by parsing it. This must
be stored externally. See the section below for
details of how this is accomplished in FTS5.



Figure 2 - Doclist Format


A position list - often shortened to "poslist" - identifies the column
and token offset within the row of each instance of the token in question.
The format of a poslist is:


   Varint set to twice the size of the poslist, not including this field,
       plus one if the "delete" flag is set on the entry.
   A (possibly empty) list of offsets for column 0 (the leftmost column) of
       the row. Each offset is stored as a varint. The first varint contains
       the value of the first offset, plus 2. The second variant contains the
       difference between the second and first offsets, plus 2. etc. For
       example, if the offset list is to contain offsets 0, 10, 15 and 16, it
       is encoded by packing the following values, encoded as varints, end to
       end:
       
           2, 12, 7, 3

   For each column other than column 0 that contains one of more instances
       of the token:
  
     Byte value 0x01.
     The column number, as a varint.
     An offset list, in the same format as the offset list for column 0.
  




Figure 3 - Position List (poslist) With Offsets in Columns 0 and i


9.2.4.2. Pagination

If it is small enough (by default this means smaller than 4000 bytes), the
entire contents of a segment b-tree may be stored in the key/doclist format
described in the previous section as a single blob within the %_data table.
Otherwise, the key/doclist is split into pages (by default, of approximately
4000 bytes each) and stored in a contiguous set of entries in the %_data table
(see above for details).

When a key/doclist is divided into pages, the following modifications are
made to the format:


   A single varint or key data field never spans two pages.
   The first key on each page is not prefix-compressed. It is stored in
       the format described above for the first key of a doclist - its size as
       a varint followed by the key data.
   If there are one or more rowids on a page before the first key, then
       the first of them is not delta compressed. It is8
c~§<cƒTÀk        7C…yWSQLite FTS5 Extension Application Porting Guide In order to use FTS5 instead of FTS3 or FTS4, applications usually require
minimal modifications. Most of these fall into three categories - changes
required to the CREATE VIRTUAL TABLE statement used to create the FTS table,
changes required to SELECT queries used to execute queries against the table,
and changes required to applications that use FTS auxiliary functions.fts5.html#_application_porting_guide_‚fÀj        7Y„)5SQLite FTS5 Extension
  Appendix A: Comparison with FTS3/4
Also available is the similar but more mature FTS3/4 module. 
FTS5 is a new version of FTS4 that includes various fixes and solutions for 
problems that could not be fixed in FTS4 without sacrificing backwards 
compatibility. Some of these problems are 
described below.fts5.html#appendix_a…RÀi       7c‰EgSQLite FTS5 Extension9.5. Configuration Options (%_config table)CREATE TABLE %_config(k PRIMARY KEY, v) WITHOUT ROWID;


This table stores the values of any persistent configuration options. 
Column "k" stores the name of the option (text) and column "v" the value.
Example contents:

sqlite> SELECT * FROM fts_tbl_config;
┌─────────────┬──────â”
│      k      │  v   │
├─────────────┼──────┤
│ crisismerge │ 8    │
│ pgsz        │ 8000 │
│ usermerge   │ 4    │
│ version     │ 4    │
└─────────────┴──────┘fts5.html#configuration_options_config_table_…Àh    7_ˆ3cSQLite FTS5 Extension9.4. The Table Contents (%_content table)CREATE TABLE %_content(id INTEGER PRIMARY KEY, c0, c1...);


The actual table content - the values inserted into the FTS5 table, is
stored in the %_content table. This table is created with one "c*" column for
each column of the FTS5 table, including any unindexed columns. The values for
the leftmost FTS5 table column are stored in column "c0" of the %_content
table, the values from the next FTS5 table column in column "c1", and so on.

This table is omitted completely for 
external content or contentless FTS5 tables.
tables.fts5.html#the_table_contents_content_table_‰sÀg 7c’gSQLite FTS5 Extension9.3. Document Sizes Table (%_docsize table)CREATE TABLE %_docsize(
    id INTEGER PRIMARY KEY,   -- id of FTS5 row this record pertains to
    sz BLOB                   -- blob containing nCol packed varints
);


Many common search result ranking functions require as an input the size 
in tokens of the result document (as a search term hit in a short document is
considered more significant than one in a long document). To provide fast
access to this information, for each row in the FTS5 table there exists a 
corresponding record (with the same rowid) in the %_docsize shadow table
that contains the size of each column value in the row, in tokens.

The column value sizes are stored in a blob containing one packed varint for
each column of the FTS5 table, from left to right. The varint contains, of
course, the total number of tokens in the corresponding column value. Unindexed
columns are included in this vector of varints; for them the value is always
set to zero.

This table is used by the xColumnSize API. It can
be omitted altogether by specifying the 
columnsize=0 option. In that case the
xColumnSize API is still available to auxiliary functions, but runs much more
slowly.fts5.html#document_sizes_table_docsize_table_
B„ŸƒÀo       7'…;SQLite FTS5 Extension Other IssuesThe functionality provided by the fts4aux module is now provided
          by fts5vocab. The schema of these two tables is slightly different.

   The FTS3/4 "merge=X,Y" command has been replaced by the 
          FTS5 merge command.

   The FTS3/4 "automerge=X" command has been replaced by the 
          FTS5 automerge option.fts5.html#_other_issuesƒ`Àn    7E†
YSQLite FTS5 Extension Auxiliary Function Changes FTS5 has no matchinfo() or offsets() function, and the snippet() function
is not as fully-featured as in FTS3/4. However, since FTS5 does provide 
an API allowing applications to create custom auxiliary functions, any
required functionality may be implemented within the application code.

 The set of built-in auxiliary functions provided by FTS5 may be 
improved upon in the future.fts5.html#_auxiliary_function_changes_‰9Àm 7I‘7]SQLite FTS5 Extension Changes to SELECT statements The "docid" alias does not exist. Applications must use "rowid"
          instead.

   The behaviour of queries when a column-filter is specified both as
          part of the FTS query and by using a column as the LHS of a MATCH
          operator is slightly different. For a table with columns "a" and "b"
          and a query similar to:
... a MATCH 'b: string'

       FTS3/4 searches for matches in column "b". However, FTS5 always
          returns zero rows, as results are first filtered for column "b", then
          for column "a", leaving no results. In other words, in FTS3/4 the
          inner filter overrides the outer, in FTS5 both filters are applied.

   The FTS query syntax (right hand side of the MATCH operator) has
          changed in some ways. The FTS5 syntax is quite close to the FTS4
          "enhanced syntax". The main difference is that FTS5 is fussier 
          about unrecognized punctuation characters and similar within query
          strings. Most queries that work with FTS3/4 should also work with
          FTS5, and those that do not should return parse errors.fts5.html#_changes_to_select_statements_‰9Àl  7eySQLite FTS5 Extension Changes to CREATE VIRTUAL TABLE statements The module name must be changed from "fts3" or "fts4" to "fts5".

 All type information or constraint specifications must be removed from
     column definitions. FTS3/4 ignores everything following the column name in
     a column definition, FTS5 attempts to parse it (and will report an error
     if it fails to).

 The "matchinfo=fts3" option is not available. The 
     "columnsize=0" option is equivalent.

 The notindexed= option is not available. Adding UNINDEXED
     to the column definition is equivalent.

 The ICU tokenizer is not available.

 The compress=, uncompress= and languageid= options are not available.
     There is as of yet no equivalent for their functionality.


 -- FTS3/4 statement 
CREATE VIRTUAL TABLE t1 USING fts4(
  linkid INTEGER,
  header CHAR(20),
  text VARCHAR,
  notindexed=linkid,
  matchinfo=fts3,
  tokenizer=unicode61
);

 -- FTS5 equivalent (note - the "tokenizer=unicode61" option is not
 -- required as this is the default for FTS5 anyway)
CREATE VIRTUAL TABLE t1 USING fts5(
  linkid UNINDEXED,
  header,
  text,
  columnsize=0
);fts5.html#_changes_to_create_virtual_table_statements_
ssÀp  7Y¸=eSQLite FTS5 Extension 
  Summary of Technical Differences 
FTS5 is similar to FTS3/4 in that the primary task of each is to maintain
an index mapping from each unique token to a list of instances of that token 
within a set of documents, where each instance is identified by the document 
in which it appears and its position within that document. For example:

-- Given the following SQL:
CREATE VIRTUAL TABLE ft USING fts5(a, b);
INSERT INTO ft(rowid, a, b) VALUES(1, 'X Y', 'Y Z');
INSERT INTO ft(rowid, a, b) VALUES(2, 'A Z', 'Y Y');

-- The FTS5 module creates the following mapping on disk:
A --&gt; (2, 0, 0)
X --&gt; (1, 0, 0)
Y --&gt; (1, 0, 1) (1, 1, 0) (2, 1, 0) (2, 1, 1)
Z --&gt; (1, 1, 1) (2, 0, 1)


In the example above, each triple identifies the location of a token
instance by rowid, column number (columns are numbered sequentially
starting at 0 from left to right) and position within the column value (the
first token in a column value is 0, the second is 1, and so on). Using this
index, FTS5 is able to provide timely answers to queries such as "the set
of all documents that contain the token 'A'", or "the set of all documents
that contain the sequence 'Y Z'". The list of instances associated with a
single token is called an "instance-list".

The principle difference between FTS3/4 and FTS5 is that in FTS3/4,
each instance-list is stored as a single large database record, whereas
in FTS5 large instance-lists are divided between multiple database records.
This has the following implications for dealing with large databases that
contain large lists:


   FTS5 is able to load instance-lists into memory incrementally in
       order to reduce memory usage and peak allocation size. FTS3/4 very
       often loads entire instance-lists into memory.

   When processing queries that feature more than one token, FTS5 is
       sometimes able to determine that the query can be answered by
       inspecting a subset of a large instance-list. FTS3/4 almost always
       has to traverse entire instance-lists.

   If an instance-list grows so large that it exceeds
       the SQLITE_MAX_LENGTH limit, FTS3/4 is unable to handle it. FTS5
       does not have this problem. 


For these reasons, many complex queries may use less memory and run faster 
using FTS5.

Some other ways in which FTS5 differs from FTS3/4 are:


   FTS5 supports "ORDER BY rank" for returning results in order of
       decreasing relevancy.

   FTS5 features an API allowing users to create custom auxiliary 
       functions for advanced ranking and text processing applications. The
       special "rank" column may be mapped to a custom auxiliary function
       so that adding "ORDER BY rank" to a query works as expected.

   FTS5 recognizes unicode separator characters and case equivalence by
       default. This is also possible using FTS3/4, but must be explicitly
       enabled.

   The query syntax has been revised where necessary to remove
       ambiguities and to make it possible to escape special characters
       in query terms.

   By default, FTS3/4 occasionally merges together two or more of the
       b-trees that make up its full-text index within an INSERT, UPDATE or
       DELETE statement executed by the user. This means that any operation
       on an FTS3/4 table may turn out to be surprisingly slow, as FTS3/4 
       may unpredictably choose to merge together two or more large b-trees
       within it. FTS5 uses incremental merging by default, which limits
       the amount of processing that may take place within any given 
       INSERT, UPDATE or DELETE operation.

This page last modified on  2022-09-24 16:31:11 UTCfts5.html#_summary_of_technical_differences_
ÛÛ˜ È       /5¯=AThe RBU Extension1. The RBU ExtensionThe RBU extension is an add-on for SQLite designed for use with large 
SQLite database files on low-power devices at the edge of a network. RBU
may be used for two separate tasks:


   RBU Update operations. An RBU Update is a bulk update of a
          database file that may include many insert, update and delete
          operations on one or more tables.
   RBU Vacuum operations. An RBU Vacuum optimizes and rebuilds an
          entire database file, with results similar to SQLite's native VACUUM
          command.  


The acronym RBU stands for "Resumable Bulk Update".

Both of the RBU functions may be accomplished using SQLite's built-in 
SQL commands - RBU update via a series of INSERT, DELETE and 
UPDATE commands within a single transaction, and RBU vacuum by a single
VACUUM command.  The RBU module provides the following advantages over
these simpler approaches:



RBU may be more efficient

The most efficient way to apply changes to a B-Tree (the data structure
that SQLite uses to store each table and index on disk) is to make the
changes in key order. But if an SQL table has one or more indexes, the key
order for each index may be different from the main table and the other
auxiliary indexes. As a result, when executing a series of INSERT,
UPDATE and DELETE statements it is not generally possible to order the
operations so that all b-trees are updated in key order. The RBU update
process works around this by applying all changes to the main table in one 
pass, then applying changes to each index in separate passes, ensuring each
B-Tree is updated optimally. For a large database file (one that does not
fit in the OS disk cache) this procedure can result in two orders of
magnitude faster updates.

An RBU Vacuum operation requires less temporary disk space and writes
less data to disk than an SQLite VACUUM. An SQLite VACUUM requires roughly
twice the size of the final database file in temporary disk space to run.
The total amount of data written is around three times the size of the
final database file. By contrast, an RBU Vacuum requires roughly the size
of the final database file in temporary disk space and writes a total of
twice that to disk.

On the other hand, an RBU Vacuum uses more CPU than a regular SQLite
VACUUM - in one test as much as five times as much. For this reason, an RBU
Vacuum is often significantly slower than an SQLite VACUUM under the same
conditions.

RBU runs in the background

An ongoing RBU operation (either an update or a vacuum) does not
interfere with read access to the database file.

RBU runs incrementally

RBU operations may be suspended and then later resumed, perhaps with
intervening power outages and/or system resets. For an RBU update, the
original database content remains visible to all database readers until 
the entire update has been applied - even if the update is suspended and
then later resumed.



The RBU extension is not enabled by default. To enable it, compile the
amalgamation with the SQLITE_ENABLE_RBU compile-time option.rbu.html#the_rbu_extension
¸¸…KÈ     /O‰cWThe RBU Extension2.2. Preparing an RBU Update FileAll changes to be applied by RBU are stored in a separate SQLite database
called the "RBU database".  The database that is to be modified is called
the "target database".

For each table in the target database that will be modified by the update,
a corresponding table is created within the RBU database. The RBU database
table schema is not the same as that of the target database, but is derived
from it as described below.

The RBU database table contains a single row for each target database 
row inserted, updated or deleted by the update. Populating the RBU database
tables is described in the following section.rbu.html#preparing_an_rbu_update_fileˆsÈ /CKKThe RBU Extension2.1. RBU Update LimitationsThe following limitations apply to RBU updates:


The changes must consist of INSERT, UPDATE, and DELETE
    operations only.  CREATE and DROP operations are not
    supported.
INSERT statements may not use default values.
UPDATE and DELETE statements must identify the target rows
    by rowid or by non-NULL PRIMARY KEY values.
UPDATE statements may not modify PRIMARY KEY or rowid values.
    
RBU updates cannot be applied to any tables that contain a column
       named "rbu_control".
The RBU update will not fire any triggers.
The RBU update will not detect or prevent foreign key or
       CHECK constraint violations.
All RBU updates use the "OR ROLLBACK" constraint handling mechanism.
    
The target database may not be in WAL mode.
The target database may not contain indexes on expressions.
    Indexes on expressions are supported beginning with SQLite 3.30.0
    (2019-10-04).
No other writes may occur on the target database while the
       RBU update is being applied.  A read-lock is held on the target
       database to prevent this.rbu.html#rbu_update_limitations
¾¾¨5È     /EÏOIThe RBU Extension2.2.2. RBU Database ContentsFor 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. 

The "rbu_control" column may also be set to integer value 2 for 
an INSERT. In this case, the new row silently replaces any existing row that
has the same primary key values. This is equivalent to a DELETE followed by an
INSERT with the same primary key values. It is not the same as an SQL REPLACE
command, as in that case the new row may replace any conflicting rows (i.e.
those that conflict due to UNIQUE constraints or indexes), not just those with
conflicting primary keys.

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, th@“{È     /I¦SMThe RBU Extension2.2.1. The RBU Database SchemaFor each table in the target database, the RBU database should contain a table
named "data&lt;integer&gt;_&lt;target-table-name&gt;" where
&lt;target-table-name&gt; is the name of the table in the target
database and &lt;integer&gt; is any sequence of zero or more numeric
characters (0-9). Tables within the RBU database are processed in order by 
name (from smallest to largest according to the BINARY collation sequence),
so the order in which target tables are updated is influenced by the selection 
of the &lt;integer&gt; portion of the data_% table name. While this can
be useful when using RBU to update 
certain types of virtual tables, there is normally no
reason to use anything other than an empty string in place of
&lt;integer&gt;.

The data_% table must have all the same columns as the target table, plus
one additional column named "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.

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". The rbu_rowid column is mapped to the tables ROWID.
For example, if the target database 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);


Virtual tables for which the "rowid" column does 
not function like a primary key value cannot be updated using RBU.


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);rbu.html#the_rbu_database_schemae 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');


If RBU is used to update a large BLOB value within a target database, it
may be more efficient to store a patch or delta that can be used to modify
the existing BLOB instead of an entirely new value within the RBU database. 
RBU allows deltas to be specified in two ways:


   In the "fossil delta" format - the format used for blob deltas by the 
  Fossil source-code management system, or

   In a custom format defined by the RBU application.


 The fossil delta format may only be used to update BLOB values. Instead
of storing the new BLOB within the data_% table, the fossil delta is stored
instead. And instead of specifying an 'x' as part of the rbu_control string
for the column to be updated, an 'f' character is stored. When processing
an 'f' update, RBU loads the original BLOB data from disk, applies the fossil
delta to it and stores the results back into the database file. The RBU
databases generated by sqldiff --rbu make use of fossil deltas wherever
doing so would save space in the RBU database.

 To use a custom delta format, the RBU application must register a
user-defined SQL function named "rbu_delta" before beginning to process the
update. rbu_delta() will be invoked with two arguments - the original value
stored in the target table column and the delta value provided as part of
the RBU update. It should return the result of applying the delta to the
original value. To use the custom delta function, the character of the
rbu_control value corresponding to the target column to update must be
set to 'd' instead of 'x'. Then, instead of updating the target table with the
value stored in the corresponding data_% column, RBU invokes the user-defined
SQL function "rbu_delta()" and the store in the target table column.

For example, this row:

INSERT INTO data_t1(a, b, c, rbu_control) VALUES(4, NULL, 'usa', '..d');


causes RBU to update the target database table in a way similar to:

UPDATE t1 SET c = rbu_delta(c, 'usa') WHERE a = 4;


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_% tables themselves should have no PRIMARY KEY declarations.
However, RBU is more efficient if reading the rows in from each data_%
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_% tables.rbu.html#rbu_database_contents
¸¸šCÈ     /S³OWThe RBU Extension2.2.3. Using RBU with FTS3/4 TablesUsually, an FTS3 or FTS4 table is an example of a virtual table 
with a rowid that works like a PRIMARY KEY. So, for the following FTS4 tables:

CREATE VIRTUAL TABLE ft1 USING fts4(addr, text);
CREATE VIRTUAL TABLE ft2 USING fts4;             -- implicit "content" column


The data_% tables may be created as follows:

CREATE TABLE data_ft1 USING fts4(addr, text, rbu_rowid, rbu_control);
CREATE TABLE data_ft2 USING fts4(content, rbu_rowid, rbu_control);


And populated as if the target table were an ordinary SQLite table with no
explicit PRIMARY KEY columns.

Contentless FTS4 tables are handled similarly,
except that any attempt to update or delete rows will cause an error when
applying the update.

External content FTS4 tables may also be 
updated using RBU. In this case the user is required to configure the RBU
database so that the same set of UPDATE, DELETE and INSERT operations are
applied to the FTS4 index as to the underlying content table. As for all
updates of external content FTS4 tables, the user is also required to ensure
that any UPDATE or DELETE operations are applied to the FTS4 index before
they are applied to the underlying content table (refer to FTS4 documentation
for a detailed explanation). In RBU, this is done by ensuring that the name
of the data_% table used to write to the FTS4 table sorts before the name
of the data_% table used to update the underlying content table using the
BINARY collation sequence. In order to avoid duplicating data within the
RBU database, an SQL view may be used in place of one of the data_% tables.
For example, for the target database schema:

CREATE TABLE ccc(addr, text);
CREATE VIRTUAL TABLE ccc_fts USING fts4(addr, text, content=ccc);



  The following RBU database schema may be used: 

CREATE TABLE data_ccc(addr, text, rbu_rowid, rbu_control);
CREATE VIEW data0_ccc_fts AS SELECT * FROM data_ccc;

 

  The data_ccc table may then be populated as normal with the updates intended
  for target database table ccc. The same updates will be read by RBU from
  the data0_ccc_fts view and applied to FTS table ccc_fts. Because
  "data0_ccc_fts" is smaller than "data_ccc", the FTS table will be updated
  first, as required.


  Cases in which the underlying content table has an explicit INTEGER PRIMARY
  KEY column are slightly more difficult, as the text values stored in the
  rbu_control column are slightly different for the FTS index and its
  underlying content table. For the underlying content table, a character
  must be included in any rbu_control text values for the explicit IPK, but
  for the FTS table itself, which has an implicit rowid, it should not. This
  is inconvenient, but can be solved using a more complicated view, as follows:

-- Target database schema
CREATE TABLE ddd(i INTEGER PRIMARY KEY, k TEXT);
CREATE VIRTUAL TABLE ddd_fts USING fts4(k, content=ddd);

-- RBU database schema
CREATE TABLE data_ccc(i, k, rbu_control);
CREATE VIEW data0_ccc_fts AS SELECT i AS rbu_rowid, k, CASE 
  WHEN rbu_control IN (0,1) THEN rbu_control ELSE substr(rbu_control, 2) END
FROM data_ccc;



  The substr() function in the SQL view above returns the text of the
  rbu_control argument with the first character (the one corresponding to
  column "i", which is not required by the FTS table) removed.rbu.html#using_rbu_with_fts3_4_tables
=     ”=’RÈ        /O£uSThe RBU Extension2.3. RBU Update C/C++ ProgrammingThe RBU extension interface allows an application to apply an RBU update 
stored in an RBU database to an existing target database.
The procedure is as follows:



Open an RBU handle using the sqlite3rbu_open(T,A,S) function.

The T argument is the name of the target database file.
The A argument is the name of the RBU database file.
The S argument is the name of a "state database" used to store
state information needed to resume the update after an interruption.
The S argument can be NULL in which case the state information
is stored in the RBU database in various tables whose names all
begin with "rbu_".

The sqlite3rbu_open(T,A,S) function returns a pointer to
an "sqlite3rbu" object, which is then passed into the subsequent
interfaces.



Register any required virtual table modules with the database
handle returned by sqlite3rbu_db(X) (where argument X is the sqlite3rbu
pointer returned from sqlite3rbu_open()).  Also, if required, register
the rbu_delta() SQL function using 
sqlite3_create_function_v2().


Invoke the sqlite3rbu_step(X) function one or more times on
the sqlite3rbu object pointer X. Each call to sqlite3rbu_step() 
performs a single b-tree operation, so thousands of calls may be 
required to apply a complete update.  The sqlite3rbu_step() 
interface will return SQLITE_DONE when the update has been
completely applied.


Call sqlite3rbu_close(X) to destroy the sqlite3rbu object pointer.
If sqlite3rbu_step(X) 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 state database (or in the RBU
database if the name of the state database file in sqlite3rbu_open()
is NULL) for later resumption of the update.


If an update is only partially applied to the target database by the
time sqlite3rbu_close() is called, state information is saved 
within the state database if it exists, or otherwise in the RBU database. 
This allows subsequent processes to automatically
resume the RBU update from where it left off.
If state information is stored in the RBU database, it can be removed
by dropping all tables whose names begin with "rbu_".

For more details, refer to the comments in 
header file
sqlite3rbu.h.rbu.html#rbu_update_c_c_programmingŒgÈ
/}—AThe RBU Extension2.2.4. Automatically Generating RBU Updates with sqldiffAs of SQLite version 3.9.0 (2015-10-14), 
  the sqldiff utility is able to generate
  RBU databases representing the difference between two databases with
  identical schemas. For example, the following command:

sqldiff --rbu t1.db t2.db



  Outputs an SQL script to create an RBU database which, if used to update
  database t1.db, patches it so that its contents are identical to that of
  database t2.db.


  By default, sqldiff attempts to process all non-virtual tables within
  the two databases provided to it. If any table appears in one database
  but not the other, or if any table has a slightly different schema in
  one database it is an error. The "--table" option may be useful if this
  causes a problem
  

  Virtual tables are ignored by default by sqldiff. However, it is possible 
  to explicitly create an RBU data_% table for a virtual table that features
  a rowid that functions like a primary key using a command such as:

sqldiff --rbu --table &lt;virtual-table-name&gt; t1.db t2.db



  Unfortunately, even though virtual tables are ignored by default, any
  underlying database tables that they create in order to
  store data within the database are not, and sqldiff will include add these
  to any RBU database. For this reason, users attempting to use sqldiff to
  create RBU updates to apply to target databases with one or more virtual
  tables will likely have to run sqldiff using the --table option separately
  for each table to update in the target database.rbu.html#automatically_generating_rbu_updates_with_sqldiff
ÌÈç̉0Ð  =[wsSQLite Shared-Cache Mode1.1. Use of shared-cache is discouragedShared-cache mode is an obsolete feature.  The use of shared-cache mode
is discouraged.  Most use cases for shared-cache are better served by
WAL mode.

Shared-cache mode was invented in 2006 at the request of developers
of Symbian.  Their problem was that
if the contacts database on the phone was being synced, that would lock the
database file.  Then if a call came in, the database lock would prevent them
from querying the contacts database in order to find the appropriate 
ring-tone for the incoming call, or a photo of the caller to show on screen,
and so forth.
WAL mode (circa 2010) is a better solution to this problem as it permits 
simultaneous access without breaking transaction isolation.

Applications that build their own copy of SQLite from source code
are encouraged to use the -DSQLITE_OMIT_SHARED_CACHE compile-time option,
as the resulting binary will be both smaller and faster.

The shared-cache interfaces described here will continue to be supported
in SQLite, to insure full backwards compatibility.  However, the use of
shared-cache is discouraged.sharedcache.html#use_of_shared_cache_is_discouragedˆaÐ    =C_SQLite Shared-Cache Mode1. SQLite Shared-Cache ModeStarting with version 3.3.0 (2006-01-11), 
SQLite includes a special "shared-cache"
mode (disabled by default) intended for use in embedded servers. If
shared-cache mode is enabled and a thread establishes multiple connections
to the same database, the connections share a single data and schema cache.
This can significantly reduce the quantity of memory and IO required by
the system.

In version 3.5.0 (2007-09-04), 
shared-cache mode was modified so that the same
cache can be shared across an entire process rather than just within
a single thread.  Prior to this change, there were restrictions on
passing database connections between threads.  Those restrictions were
dropped in 3.5.0 update.  This document describes shared-cache mode
as of version 3.5.0.

Shared-cache mode changes the semantics
of the locking model in some cases. The details are described by
this document. A basic understanding of the normal SQLite locking model (see
File Locking And Concurrency In SQLite Version 3
for details) is assumed.sharedcache.html#sqlite_shared_cache_mode¥TÈ"  /OÉySThe RBU Extension3.2. RBU Vacuum C/C++ ProgrammingThis section provides an overview of and example code demonstrating the
    integration of RBU Vacuum into an application program.  For full details,
    refer to the comments in 
    header file
    sqlite3rbu.h.

 RBU Vacuum applications all implement some variation of the following
procedure:


   An RBU handle is created by calling sqlite3rbu_vacuum(T, S).

       Argument T is the name of the database file to vacuum. Argument S is
      the name of a database in which the RBU module will save its state if the
      vacuum operation is suspended.

       If state database S does not exist when sqlite3rbu_vacuum() is
      invoked, it is automatically createD‚3È!      /CƒKKThe RBU Extension3.1. RBU Vacuum LimitationsWhen compared with SQLite's built-in VACUUM command, RBU Vacuum has the
following limitations:


  It may not be used on a database that contains indexes on expressions.
  The database being vacuumed may not be in WAL mode.rbu.html#rbu_vacuum_limitationsd and populated with the single table
      used to store the state of an RBU vacuum - "rbu_state". If an ongoing RBU
      vacuum is suspended, this table is populated with state data. The next
      time sqlite3rbu_vacuum() is called with the same S parameter, it detects
      this data and attempts to resume the suspended vacuum operation. When
      an RBU vacuum operation is completed or encounters an error, RBU 
      automatically deletes the contents of the rbu_state table. In this case,
      the next call to sqlite3rbu_vacuum() starts an entirely new vacuum
      operation from scratch.

       It is a good idea to establish a convention for determining the RBU
      vacuum state database name based on the target database name. The
      example code below uses "&lt;target&gt;-vacuum", where &lt;target&gt; is
      the name of the database being vacuumed.

   Any custom collation sequences used by indexes within the database
      being vacuumed are registered with both of the database handles returned
      by the sqlite3rbu_db() function.

   Function sqlite3rbu_step() is called on the RBU handle until either
      the RBU vacuum is finished, an error occurs or the application wishes to
      suspend the RBU vacuum.

       Each call to sqlite3rbu_step() does a small amount of work towards
      completing the vacuum operation. Depending on the size of the database, a
      single vacuum may require thousands of calls to sqlite3rbu_step().
      sqlite3rbu_step() returns SQLITE_DONE if the vacuum operation has
      finished, SQLITE_OK if the vacuum operation has not finished but no error
      has occurred, and an SQLite error code if an error is encountered. If
      an error does occur, all subsequent calls to sqlite3rbu_step() immediately
      return the same error code.

   Finally, sqlite3rbu_close() is called to close the RBU handle. If the
      application stopped calling sqlite3rbu_step() before either the vacuum
      finished or an error occurred, the state of the vacuum is saved in the
      state database so that it may be resumed later on.

       Like sqlite3rbu_step(), if the vacuum operation has finished,
      sqlite3rbu_close() returns SQLITE_DONE. If the vacuum has not finished
      but no error has occurred, SQLITE_OK is returned. Or, if an error has
      occurred, an SQLite error code is returned. If an error occurred as part
      of a prior call to sqlite3rbu_step(), sqlite3rbu_close() returns the
      same error code.


The following example code illustrates the techniques described above.  

/*
** Either start a new RBU vacuum or resume a suspended RBU vacuum on 
** database zTarget. Return when either an error occurs, the RBU 
** vacuum is finished or when the application signals an interrupt
** (code not shown).
**
** If the RBU vacuum is completed successfully, return SQLITE_DONE.
** If an error occurs, return SQLite error code. Or, if the application
** signals an interrupt, suspend the RBU vacuum operation so that it
** may be resumed by a subsequent call to this function and return
** SQLITE_OK.
**
** This function uses the database named "&lt;zTarget&gt;-vacuum" for
** the state database, where &lt;zTarget&gt; is the name of the database 
** being vacuumed.
*/
int do_rbu_vacuum(const char *zTarget){
  int rc;
  char *zState;                   /* Name of state database */
  sqlite3rbu *pRbu;               /* RBU vacuum handle */

  zState = sqlite3_mprintf("%s-vacuum", zTarget);
  if( zState==0 ) return SQLITE_NOMEM;
  pRbu = sqlite3rbu_vacuum(zTarget, zState);
  sqlite3_free(zState);

  if( pRbu ){
    sqlite3 *dbTarget = sqlite3rbu_db(pRbu, 0);
    sqlite3 *dbState = sqlite3rbu_db(pRbu, 1);

    /* Any custom collation sequences used by the target database must
    ** be registered with both database handles here.  */

    while( sqlite3rbu_step(pRbu)==SQLITE_OK ){
      if( &lt;application has signaled interrupt&gt; ) break;
    }
  }
  rc = sqlite3rbu_close(pRbu);
  return rc;
}

This page last modified on  2019-09-26 19:34:22 UTCrbu.html#rbu_vacuum_c_c_programming
©Å        Å-©ŠÐ     =Y”mSQLite Shared-Cache Mode2.2.1. Read-Uncommitted Isolation ModeThe behaviour described above may be modified slightly by using the 
read_uncommitted pragma to change the isolation level from serialized 
(the default), to read-uncommitted.

 A database connection in read-uncommitted mode does not attempt 
to obtain read-locks before reading from database tables as described 
above. This can lead to inconsistent query results if another database
connection modifies a table while it is being read, but it also means that
a read-transaction opened by a connection in read-uncommitted mode can
neither block nor be blocked by any other connection.

Read-uncommitted mode has no effect on the locks required to write to
database tables (i.e. read-uncommitted connections must still obtain 
write-locks and hence database writes may still block or be blocked). 
Also, read-uncommitted mode has no effect on the sqlite_schema
locks required by the rules enumerated below (see section 
"Schema (sqlite_schema) Level Locking").



  /* Set the value of the read-uncommitted flag:
  **
  **   True  -> Set the connection to read-uncommitted mode.
  **   False -> Set the connection to serialized (the default) mode.
  */
  PRAGMA read_uncommitted = &lt;boolean&gt;;

  /* Retrieve the current value of the read-uncommitted flag */
  PRAGMA read_uncommitted;sharedcache.html#read_uncommitted_isolation_mode‡Ð ==ŒyUSQLite Shared-Cache Mode2.2. Table Level LockingWhen two or more connections use a shared-cache, locks are used to 
serialize concurrent access attempts on a per-table basis. Tables support 
two types of locks, "read-locks" and "write-locks". Locks are granted to
connections - at any one time, each database connection has either a
read-lock, write-lock or no lock on each database table.


At any one time, a single table may have any number of active read-locks
or a single active write lock. To read data from a table, a connection must 
first obtain a read-lock. To write to a table, a connection must obtain a 
write-lock on that table. If a required table lock cannot be obtained,
the query fails and SQLITE_LOCKED is returned to the caller.
 

Once a connection obtains a table lock, it is not released until the
current transaction (read or write) is concluded.sharedcache.html#table_level_lockingƒ{Ð      =I†1aSQLite Shared-Cache Mode2.1. Transaction Level LockingSQLite connections can open two kinds of transactions, read and write
transactions. This is not done explicitly, a transaction is implicitly a
read-transaction until it first writes to a database table, at which point
it becomes a write-transaction.

At most one connection to a single shared cache may open a 
write transaction at any one time. This may co-exist with any number of read 
transactions.sharedcache.html#transaction_level_lockingˆ6Ð    =G'cSQLite Shared-Cache Mode2. Shared-Cache Locking ModelExternally, from the point of view of another process or thread, two
or more database connections using a shared-cache appear as a single 
connection. The locking protocol used to arbitrate between multiple 
shared-caches or regular database users is described elsewhere.







Figure 1

Figure 1 depicts an example runtime configuration where three 
database connections have been established. Connection 1 is a normal
SQLite database connection. Connections 2 and 3 share a cache 
The normal locking
protocol is used to serialize database access between connection 1 and
the shared cache. The internal protocol used to serialize (or not, see
"Read-Uncommitted Isolation Mode" below) access to the shared-cache by
connections 2 and 3 is described in the remainder of this section.


There are three levels to the shared-cache locking model, 
transaction level locking, table level locking and schema level locking. 
They are described in the following three sub-sections.sharedcache.html#shared_cache_locking_model
Îâ/
ÎŒBÐ
        =G—?cSQLite Shared-Cache Mode5. Enabling Shared-Cache ModeShared-cache mode is enabled on a per-process basis. Using the C 
interface, the following API can be used to globally enable or disable
shared-cache mode:



int sqlite3_enable_shared_cache(int);


Each call to sqlite3_enable_shared_cache() affects subsequent database
connections created using sqlite3_open(), sqlite3_open16(), or
sqlite3_open_v2().  Database connections that already exist are
unaffected.  Each call to sqlite3_enable_shared_cache() overrides
all previous calls within the same process.


Individual database connections created using sqlite3_open_v2() can
choose to participate or not participate in shared cache mode by using
the SQLITE_OPEN_SHAREDCACHE or SQLITE_OPEN_PRIVATECACHE flags the
third parameter.  The use of either of these flags overrides the
global shared cache mode setting established by sqlite3_enable_shared_cache().
No more than one of the flags should be used; if both SQLITE_OPEN_SHAREDCACHE
and SQLITE_OPEN_PRIVATECACHE flags are used in the third argument to
sqlite3_open_v2() then the behavior is undefined.

When URI filenames are used, the "cache" query parameter can be used
to specify whether or not the database will use shared cache.  Use
"cache=shared" to enable shared cache and "cache=private" to disable
shared cache.   The ability to use URI query parameters to specify the
cache sharing behavior of a database connection allows cache sharing to
be controlled in ATTACH statements.  For example:


ATTACH 'file:aux.db?cache=shared' AS aux;sharedcache.html#enabling_shared_cache_mode‚Ð                =Q‚QmSQLite Shared-Cache Mode4. Shared Cache And Virtual TablesIn older versions of SQLite,
shared cache mode could not be used together with virtual tables.
This restriction was removed in SQLite version 3.6.17 (2009-08-10).sharedcache.html#shared_cache_and_virtual_tablesƒ.  ==…+YSQLite Shared-Cache Mode3. Thread Related IssuesIn SQLite versions 3.3.0 through 3.4.2 when shared-cache mode is enabled, 
a database connection may only be
used by the thread that called sqlite3_open() to create it.
And a connection could only share cache with another connection in the
same thread.
These restrictions were dropped beginning with SQLite 
version 3.5.0 (2007-09-04).sharedcache.html#thread_related_issues†Ð  =_ŠEsSQLite Shared-Cache Mode2.3. Schema (sqlite_schema) Level LockingThe sqlite_schema table supports shared-cache read and write 
locks in the same way as all other database tables (see description 
above). The following special rules also apply:



A connection must obtain a read-lock on sqlite_schema before 
accessing any database tables or obtaining any other read or write locks.
Before executing a statement that modifies the database schema (i.e. 
a CREATE or DROP TABLE statement), a connection must obtain a write-lock on 
sqlite_schema.

A connection may not compile an SQL statement if any other connection
is holding a write-lock on the sqlite_schema table of any attached
database (including the default database, "main").sharedcache.html#schema_sqlite_schema_level_locking
h1 bfh‡yßS      A7ŽWEThe SQLite Bytecode Engine2.1. VDBE Source CodeThe source code to the bytecode engine is in the 
vdbe.c source
file.  The opcode definitions in this document are derived
from comments in that source file. The 
source code comments are the canonical source of information
about the bytecode engine.  When in doubt, refer to the source code.

In addition to the primary vdbe.c source code file, there are 
other helper code files in the source tree, all of whose names
begin with "vdbe" - short for "Virtual DataBase Engine".

Remember that the names and meanings of opcodes often change from
one release of SQLite to the next.  So if you are studying the EXPLAIN
output from SQLite, you should reference the version of this document
(or the vdbe.c source code)
that corresponds to the version of SQLite that ran the EXPLAIN.
Otherwise, the description of the opcodes may not be accurate.
This document is derived from SQLite
 version 3.40.1 check-in
df5c253c0b3dd dated 2022-12-28.opcode.html#vdbe_source_code‡wßR        A+Žg=The SQLite Bytecode Engine2. IntroductionSQLite works by translating each SQL statement into bytecode and
then running that bytecode.
A prepared statement in SQLite is mostly just the bytecode needed to
implement the corresponding SQL.  The sqlite3_prepare_v2() interface
is a compiler that translates SQL into bytecode.
The sqlite3_step() interface is the virtual machine that runs the
bytecode contained within the prepared statement.

The bytecode virtual machine is the heart of SQLite.
Programmers who want to understand how SQLite operates internally
must be familiar with the bytecode engine.

Historically, the bytecode engine in SQLite is called the
"Virtual DataBase Engine" or "VDBE".  This website uses the terms
"bytecode engine", "VDBE", "virtual machine", and "bytecode virtual
machine" interchangeably, as they all mean the same thing.


This article also uses the terms "bytecode program" and
"prepared statement" interchangeably, as they are mostly the same thing.opcode.html#introduction…JßQ   A5‰yGThe SQLite Bytecode Engine1. Executive SummarySQLite works by translating SQL statements into bytecode and
then running that bytecode in a virtual machine.  This document
describes how the bytecode engine works.

This document describes SQLite internals.  The information provided
here is not needed for routine application development using SQLite.
This document is intended for people who want to delve more deeply into
the internal operation of SQLite.

The bytecode engine is not an API of SQLite.  Details
about the bytecode engine change from one release of SQLite to the next.
Applications that use SQLite should not depend on any of the details
found in this document.opcode.html#executive_summary‡JÐ       =['wSQLite Shared-Cache Mode6. Shared Cache And In-Memory DatabasesBeginning with SQLite version 3.7.13 (2012-06-11), 
shared cache can be used on
in-memory databases, provided that the database is created using
a URI filename.  For backwards compatibility, shared cache is always
disabled for in-memory
databases if the unadorned name ":memory:" is used to open the database.
Prior to version 3.7.13, shared cache was always
disabled for in-memory databases regardless of the database name used,
current system shared cache setting, or query parameters or flags.



Enabling shared-cache for an in-memory database allows two or more
database connections in the same process to have access to the same
in-memory database.  An in-memory database in shared cache is automatically
deleted and memory is reclaimed when the last connection to that database
closes.

This page last modified on  2022-08-15 11:37:22 UTCsharedcache.html#shared_cache_and_in_memory_databases
MjMŠßU     A)“17The SQLite Bytecode Engine2.3. RegistersEvery bytecode program has a fixed (but potentially large) number of
registers.  A single register can hold a variety of objects:

 A NULL value
 A signed 64-bit integer
 An IEEE double-precision (64-bit) floating point number
 An arbitrary length strings
 An arbitrary length BLOB
 A RowSet object (See the RowSetAdd, RowSetRead, and
                      RowSetTest opcodes)
 A Frame object (Used by subprograms - see Program)



A register can also be "Undefined" meaning that it holds no value
at all.  Undefined is different from NULL.  Depending on compile-time
options, an attempt to read an undefined register will usually cause
a run-time error.  If the code generator (sqlite3_prepare_v2())
ever generates a prepared statement that reads an Undefined register,
that is a bug in the code generator.


Registers are numbered beginning with 0.
Most opcodes refer to at least one register.

The number of registers in a single prepared statement is fixed
at compile-time.  The content of all registers is cleared when
a prepared statement is reset or
finalized.

The internal Mem object stores the value for a single register.
The abstract sqlite3_value object that is exposed in the API is really
just a Mem object or register.opcode.html#registers‘ßT        A; IThe SQLite Bytecode Engine2.2. Instruction FormatA bytecoded program in SQLite consists of one or more instructions.
Each instruction has an opcode and
five operands named P1, P2  P3, P4, and P5.  The P1, P2, and P3 
operands are 32-bit signed integers.  These operands often refer to 
registers.  For instructions that operate on b-tree cursors,
the P1 operand is usually the cursor number.
For jump instructions, P2 is usually the jump destination.
P4 may be a 32-bit signed integer, a 64-bit signed integer, a
64-bit floating point value, a string literal, a Blob literal,
a pointer to a collating sequence comparison function, or a
pointer to the implementation of an application-defined SQL
function, or various other things.  P5 is an 16-bit unsigned integer
normally used to hold flags.  Bits of the P5 flag can sometimes affect
the opcode in subtle ways.  For example, if the 
SQLITE_NULLEQ (0x0080) bit of the P5 operand
is set on the Eq opcode, then the NULL values compare
equal to one another.  Otherwise NULL values compare different
from one another.


Some opcodes use all five operands.  Some opcodes use
one or two.  Some opcodes use none of the operands.


The bytecode engine begins execution on instruction number 0.
Execution continues until a Halt instruction is seen, or until
the program counter becomes greater than the address of
last instruction, or until there is an error.
When the bytecode engine halts, all memory
that it allocated is released and all database cursors it may
have had open are closed.  If the execution stopped due to an
error, any pending transactions are terminated and changes made
to the database are rolled back.



The ResultRow opcode causes the
bytecode engine to pause and the corresponding sqlite3_step()
call to return SQLITE_ROW.  Before invoking
ResultRow, the bytecoded program will
have loaded the results for a single row of a query into a series
of registers.  C-language APIs such as sqlite3_column_int()
or sqlite3_column_text() extract the query results from those
registers.  The bytecode engine resumes with the next instruction
after the ResultRow on the next call
to sqlite3_step().opcode.html#instruction_format
ùä@ù„BßX        A;‡aIThe SQLite Bytecode Engine2.6. Self-Altering CodeSome opcodes are self-altering.
For example, the Init opcode (which is always the first opcode
in every bytecode program) increments its P1 operand.  Subsequent
Once opcodes compare their P1 operands to the P1 value for
the Init opcode in order to determine if the one-time initialization
code that follows should be skipped.
Another example is the String8 opcode which converts its P4
operand from UTF-8 into the correct database string encoding, then
converts itself into a String opcode.opcode.html#self_altering_code‹ßW        Ag”GqThe SQLite Bytecode Engine2.5. Subroutines, Coroutines, and SubprogramsThe bytecode engine has no stack on which to store the return address
of a subroutine.  Return addresses must be stored in registers.
Hence, bytecode subroutines are not reentrant.


The Gosub opcode stores the current program counter into
register P1 then jumps to address P2.  The Return opcode jumps
to address P1+1.  Hence, every subroutine is associated with two integers:
the address of the entry point in the subroutine and the register number
that is used to hold the return address.

The Yield opcode swaps the value of the program counter with
the integer value in register P1.  This opcode is used to implement
coroutines.  Coroutines are often used to implement subqueries from
which content is pulled on an as-needed basis.


Triggers need to be reentrant.


Since bytecode
subroutines are not reentrant a different mechanism must be used to
implement triggers.  Each trigger is implemented using a separate bytecode
program with its own opcodes, program counter, and register set.  The
Program opcode invokes the trigger subprogram.  The Program instruction
allocates and initializes a fresh register set for each invocation of the
subprogram, so subprograms can be reentrant and recursive.  The
Param opcode is used by subprograms to access content in registers
of the calling bytecode program.opcode.html#subroutines_coroutines_and_subprograms†ßV A3‹AThe SQLite Bytecode Engine2.4. B-Tree CursorsA prepared statement can have
zero or more open cursors.  Each cursor is identified by a
small integer, which is usually the P1 parameter to the opcode
that uses the cursor.
There can be multiple cursors open on the same index or table.
All cursors operate independently, even cursors pointing to the same
indices or tables.
The only way for the virtual machine to interact with a database
file is through a cursor.
Instructions in the virtual machine can create a new cursor 
(ex: OpenRead or OpenWrite),
read data from a cursor (Column),
advance the cursor to the next entry in the table
(ex: Next or Prev), and so forth.
All cursors are automatically
closed when the prepared statement is reset or
finalized.opcode.html#b_tree_cursorsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;r[4]=rowid&nbsp;&nbsp;&nbsp;
7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Once&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tbl1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
10&nbsp;&nbsp;&nbsp;&nbsp;Noop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
11&nbsp;&nbsp;&nbsp;&nbsp;Halt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
12&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;01&nbsp;&nbsp;usesStmtJournal=0
13&nbsp;&nbsp;&nbsp;&nbsp;TableLock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tbl1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;iDb=0&nbsp;root=2&nbsp;write=1
14&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;r[3]=20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
15&nbsp;&nbsp;&nbsp;&nbsp;Goto&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00

Any application can run an EXPLAIN query to get output similar to 
the above.
However, indentation to show the loop structure is not generated
by the SQLite core.  The command-line shell contains extra logic
for indenting loops.
Also, the "comment" column in the EXPLAIN output
is only provided if SQLite is compiled with the
-DSQLITE_ENABLE_EXPLAIN_COMMENTS options.

When SQLite is compiled with the SQLITE_DEBUG compile-time option,
extra PRAGMA commands are available that are useful for debugging and
for exploring the operation of the VDBE.  For example the vdbe_trace
pragma can be enabled to cause a disassembly of each VDBE opcode to be
printed on standard output as the opcode is executed.  These debugging
pragmas include:

 PRAGMA parser_trace
 PRAGMA vdbe_addoptrace
 PRAGMA vdbe_debug
 PRAGMA vdbe_listing
 PRAGMA vdbe_traceopcode.html#viewing_the_bytecode
ãã¸ßY    A;îyMThe SQLite Bytecode Engine3. Viewing The BytecodeEvery SQL statement that SQLite interprets results in a program
for the virtual machine.  But if the SQL statement begins with
the keyword EXPLAIN the virtual machine will not execute the
program.  Instead, the instructions of the program will be returned,
one instruction per row,
like a query result.  This feature is useful for debugging and
for learning how the virtual machine operates.  For example:


$&nbsp;sqlite3&nbsp;ex1.db
sqlite&gt;&nbsp;explain&nbsp;delete&nbsp;from&nbsp;tbl1&nbsp;where&nbsp;two&lt;20;
addr&nbsp;&nbsp;opcode&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;&nbsp;&nbsp;&nbsp;p3&nbsp;&nbsp;&nbsp;&nbsp;p4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p5&nbsp;&nbsp;comment&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
----&nbsp;&nbsp;-------------&nbsp;&nbsp;----&nbsp;&nbsp;----&nbsp;&nbsp;----&nbsp;&nbsp;-------------&nbsp;&nbsp;--&nbsp;&nbsp;-------------
0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Init&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;Start&nbsp;at&nbsp;12&nbsp;&nbsp;
1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Null&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;r[1]=NULL&nbsp;&nbsp;&nbsp;&nbsp;
2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenWrite&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;root=2&nbsp;iDb=0;&nbsp;tbl1
3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rewind&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Column&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00&nbsp;&nbsp;r[2]=tbl1.two
5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ge&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(BINARY)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;51&nbsp;&nbsp;if&nbsp;r[2]&gt;=r[3]&nbsp;goto&nbsp;9
6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rowid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsJM that specifies the function.  Register P3 is the
accumulator.

The P5 arguments are taken from register P2 and its
successors.

AggStep
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.

AggStep1
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.

AggValue
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.

And
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.

AutoCommit
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.

BeginSubrtn
Mark the beginning of a subroutine that can be entered in-line
or that can be called using Gosub.  The subroutine should
be terminated by an Return instruction that has a P1 operand that
is the same as the P2 operand to this opcode and that has P3 set to 1.
If the subroutine is entered in-line, then the Return will simply
fall through.  But if the subroutine is entered using Gosub, then
the Return will jump back to the first instruction after the Gosub.

This routine works by loading a NULL into the P2 register.  When the
return address register contains a NULL, the Return instruction is
a no-op that simply falls through to the next instruction (assuming that
the Return opcode has a P3 value of 1).  Thus if the subroutine is
entered in-line, then the Return will cause in-line execution to
continue.  But if the subroutine is entered via Gosub, then the
Return will cause a return to the address following the Gosub.

This opcode is identical to Null.  It has a different name
only to make the byte code easier to read and verify.

BitAnd
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.

BitNot
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.

BitOr
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.

Blob
P4 points to a blob of data P1 bytes long.  Store this
blob in register P2.  If P4 is a NULL pointer, then construct
a zero-filled blob that is P1 bytes long in P2.

Cast
Force the value in register P1 to be the type defined by P2.


 P2=='A' &rarr; BLOB
 P2=='B' &rarr; TEXT
 P2=='C' &rarr; NUMERIC
 P2=='D' &rarr; INTEGER
 P2=='E' &rarr; REAL


A NULL value is not changed by this routine.  It remains NULL.

Checkpoint
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&#91;P3&#93; if the checkpoint returNns
SQLITE_BUSY or not, respectively.  Write the number of pages in the
WAL after the checkpoint into mem&#91;P3+1&#93; and the number of pages
in the WAL that have been checkpointed after the checkpoint
completes into mem&#91;P3+2&#93;.  However on an error, mem&#91;P3+1&#93; and
mem&#91;P3+2&#93; are initialized to -1.

Clear
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 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

Close
Close a cursor previously opened as P1.  If P1 is not
currently open, this instruction is a no-op.

ClrSubtype
Clear the subtype from register P1.

CollSeq
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.

Column
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 than (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 bit is set in P5 then the result is guaranteed
to only be used by the length() function or the equivalent.  The content
of large blobs is not loaded, thus saving CPU cycles.  If the
OPFLAG_TYPEOFARG bit is set then the result will only be used by the
typeof() function or the IS NULL or IS NOT NULL operators or the
equivalent.  In this case, all content loading can be omitted.

ColumnsUsed
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.

Compare
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 Jump instruct.

If P5 has the OPFLAG_PERMUTE bit set, then the order of comparison is
determined by the most recent 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.

This opcode must be immediately followed by an Jump opcode.

Concat
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 || PO1

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().

Copy
Make a copy of registers P1..P1+P3 into registers P2..P2+P3.

If the 0x0002 bit of P5 is set then also clear the MEM_Subtype flag in the
destination.  The 0x0001 bit of P5 indicates that this Copy opcode cannot
be merged.  The 0x0001 bit is used by the query planner and does not
come into play during query execution.

This instruction makes a deep copy of the value.  A duplicate
is made of any string or blob constant.  See also SCopy.

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.

CreateBtree
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&gt;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.

CursorHint
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.

CursorLock
Lock the btree to which cursor P1 is pointing so that the btree cannot be
written by an other cursor.

CursorUnlock
Unlock the btree to which cursor P1 is pointing so that it can be
written by other cursors.

DecrJumpZero
Register P1 must hold an integer.  Decrement the value in P1
and jump to P2 if the new value is exactly zero.

DeferredSeek
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.

Delete
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 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 conPtains the address
of the memory cell that contains the value that the rowid of the row will
be set to by the update.

Destroy
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

Divide
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.

DropIndex
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.

DropTable
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.

DropTrigger
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.

ElseEq
This opcode must follow an Lt or 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
Lt or Gt.

If result of an Eq comparison on the same two operands as the
prior Lt or Gt would have been true, then jump to P2.
If the result of an Eq comparison on the two previous
operands would have been false or NULL, then fall through.

EndCoroutine
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

Eq
Compare the values in register P1 and P3.  If reg(P3)==reg(P1) then
jump to address 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 Qconsidered 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.

This opcode saves the result of comparison for use by the new
Jump opcode.

Expire
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.

Filter
Compute a hash on the key contained in the P4 registers starting
with r&#91;P3&#93;.  Check to see if that hash is found in the
bloom filter hosted by register P1.  If it is not present then
maybe jump to P2.  Otherwise fall through.

False negatives are harmless.  It is always safe to fall through,
even if the value is in the bloom filter.  A false negative causes
more CPU cycles to be used, but it should still yield the correct
answer.  However, an incorrect answer may well arise from a
false positive - if the jump is taken when it should fall through.

FilterAdd
Compute a hash on the P4 registers starting with r&#91;P3&#93; and
add that hash to the bloom filter contained in r&#91;P1&#93;.

FinishSeek
If cursor P1 was previously moved via DeferredSeek, complete that
seek operation now, without further delay.  If the cursor seek has
already occurred, this instruction is a no-op.

FkCheck
Halt with an SQLITE_CONSTRAINT error if there are any unresolved
foreign key constraint violations.  If there are no foreign key
constraint violations, this is a no-op.

FK constraint violations are also checked when the prepared statement
exits.  This opcode is used to raise foreign key constraint errors prior
to returning results such as a row change count or the result of a
RETURNING clause.

FkCounter
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).

FkIfZero
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).

Found
If P4==0 then register P3 holds a blob constructed by MakeRecord.  If
P4&gt;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

Function
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 bRitmask 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

Ge
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.

Gosub
Write the current address onto register P1
and then jump to address P2.

Goto
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.

Gt
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.

Halt
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.

HaltIfNull
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.

IdxDelete
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.  Also, do not raise
this (self-correcting and non-critical) error if in writable_schema mode.

IdxGE
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.

IdxGT
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.

IdxInsert
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 iSt 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 Insert.

IdxLE
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.

IdxLT
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.

IdxRowid
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.

If
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.

IfNoHope
Register P3 is the first of P4 registers that form an unpacked
record.  Cursor P1 is an index btree.  P2 is a jump destination.
In other words, the operands to this opcode are the same as the
operands to NotFound and IdxGT.

This opcode is an optimization attempt only.  If this opcode always
falls through, the correct answer is still obtained, but extra works
is performed.

A value of N in the seekHit flag of cursor P1 means that there exists
a key P3:N that will match some record in the index.  We want to know
if it is possible for a record P3:P4 to match some record in the
index.  If it is not possible, we can skips some work.  So if seekHit
is less than P4, attempt to find out if a match is possible by running
NotFound.

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

IfNot
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.

IfNotOpen
If cursor P1 is not open or if P1 is set to a NULL row using the
NullRow opcode, then jump to instruction P2. Otherwise, fall through.

IfNotZero
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.

IfNullRow
Check the cursor P1 to see if it is currently pTointing 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.

If P1 is not an open cursor, then this opcode is a no-op.

IfPos
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.

IfSmaller
Estimate the number of rows in the table P1.  Jump to P2 if that
estimate is less than approximately 2**(0.1*P3).

IncrVacuum
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.

Init
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 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.

InitCoroutine
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

Insert
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 IdxInsert.

Int64
P4 is a pointer to a 64-bit integer value.
Write that value into register P2.

IntCopy
Transfer the integer value held in register P1 into register P2.

This is an optimized version of SCopy that works only for integer
values.

Integer
The 32-bit integer value P1 is written into register P2.

IntegrityCk
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 Umain database file.

This opcode is used to implement the integrity_check pragma.

IsNull
Jump to P2 if the value in register P1 is NULL.

IsTrue
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&#91;P2&#93; := r&#91;P1&#93; IS TRUE
 If P3==1 and P4==1  then  r&#91;P2&#93; := r&#91;P1&#93; IS FALSE
 If P3==0 and P4==1  then  r&#91;P2&#93; := r&#91;P1&#93; IS NOT TRUE
 If P3==1 and P4==0  then  r&#91;P2&#93; := r&#91;P1&#93; IS NOT FALSE


IsType
Jump to P2 if the type of a column in a btree is one of the types specified
by the P5 bitmask.

P1 is normally a cursor on a btree for which the row decode cache is
valid through at least column P3.  In other words, there should have been
a prior Column for column P3 or greater.  If the cursor is not valid,
then this opcode might give spurious results.
The the btree row has fewer than P3 columns, then use P4 as the
datatype.

If P1 is -1, then P3 is a register number and the datatype is taken
from the value in that register.

P5 is a bitmask of data types.  SQLITE_INTEGER is the least significant
(0x01) bit. SQLITE_FLOAT is the 0x02 bit. SQLITE_TEXT is 0x04.
SQLITE_BLOB is 0x08.  SQLITE_NULL is 0x10.

Take the jump to address P2 if and only if the datatype of the
value determined by P1 and P3 corresponds to one of the bits in the
P5 bitmask.

JournalMode
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.

Jump
Jump to the instruction at address P1, P2, or P3 depending on whether
in the most recent Compare instruction the P1 vector was less than
equal to, or greater than the P2 vector, respectively.

This opcode must immediately follow an Compare opcode.

Last
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&gt;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.

Le
This works just like the Lt opcode except that the jump is taken if
the content of register P3 is less than or equal to the content of
register P1.  See the Lt opcode for additional information.

LoadAnalysis
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.

Lt
Compare the values in register P1 and P3.  If reg(P3)&lt;reg(P1) then
jump to address P2.

If the SQLITE_JUMPIFNULL bit of P5 is set and either reg(P1) or
reg(P3) is NULL then the take the jump.  If the SQLITE_JUMPIFNULL
bit is clear then fall through if either operand is NULL.

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 collatinVg 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.

This opcode saves the result of comparison for use by the new
Jump opcode.

MakeRecord
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 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.

The meaning of P5 depends on whether or not the SQLITE_ENABLE_NULL_TRIM
compile-time option is enabled:

* If SQLITE_ENABLE_NULL_TRIM is enabled, then the P5 is the index
of the right-most table that can be null-trimmed.

* If SQLITE_ENABLE_NULL_TRIM is omitted, then P5 has the value
OPFLAG_NOCHNG_MAGIC if the MakeRecord opcode is allowed to
accept no-change records with serial_type 10.  This value is
only used inside an assert() and does not affect the end result.

MaxPgcnt
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.

MemMax
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.

Move
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.

Multiply
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.

MustBeInt
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.

Ne
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.

NewRowid
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&gt;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.

Next
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
Rewind opcode used to position the cursor.  Next is not allowed
to follow SeekLT, SeekLE, or 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 iWnstruction could have been
omitted if that index had been unique.  P3 is usually 0.  P3 is
always either 0 or 1.

If P5 is positive and the jump is taken, then event counter
number P5-1 in the prepared statement is incremented.

See also: Prev

NoConflict
If P4==0 then register P3 holds a blob constructed by MakeRecord.  If
P4&gt;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 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

Noop
Do nothing.  This instruction is often useful as a jump
destination.

Not
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.

NotExists
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 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 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

NotFound
If P4==0 then register P3 holds a blob constructed by MakeRecord.  If
P4&gt;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

NotNull
Jump to P2 if the value in register P1 is not NULL.

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
Ne or Eq.

NullRow
Move the cursor P1 to a null row.  Any Column operations
that occur while the cursor is on the null row will always
write a NULL.

If cursor P1 is not previously opened, open it now to a special
pseudo-cursor that always returns NULL for every column.

Offset
Store in register r&#91;P3&#93; 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 Column.

This opcodXe is only available if SQLite is compiled with the
-DSQLITE_ENABLE_OFFSET_SQL_FUNC option.

OffsetLimit
This opcode performs a commonly used computation associated with
LIMIT and OFFSET processing.  r&#91;P1&#93; holds the limit counter.  r&#91;P3&#93;
holds the offset counter.  The opcode computes the combined value
of the LIMIT and OFFSET and stores that value in r&#91;P2&#93;.  The r&#91;P2&#93;
value computed is the total number of rows that will need to be
visited in order to complete the query.

If r&#91;P3&#93; is zero or negative, that means there is no OFFSET
and r&#91;P2&#93; is set to be the value of the LIMIT, r&#91;P1&#93;.

if r&#91;P1&#93; is zero or negative, that means there is no LIMIT
and r&#91;P2&#93; is set to -1.

Otherwise, r&#91;P2&#93; is set to the sum of r&#91;P1&#93; and r&#91;P3&#93;.

Once
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 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 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.

OpenAutoindex
This opcode works the same as 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.

OpenDup
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 OpenEphemeral
opcode.  Only ephemeral cursors may be duplicated.

Duplicate ephemeral cursors are used for self-joins of materialized views.

OpenEphemeral
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.

If P3 is positive, then reg&#91;P3&#93; is modified slightly so that it
can be used as zero-length data for Insert.  This is an optimization
that avoids an extra Blob opcode to initialize that register.

OpenPseudo
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 Column opcode.  The 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.

OpenRead
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&gt;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 Yused for
equality lookups (implemented as a pair of opcodes SeekGE/IdxGT
of SeekLE/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

OpenWrite
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 SeekGE/IdxGT
of SeekLE/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: OpenRead, ReopenIdx

Or
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.

Pagecount
Write the current number of pages in database P1 to memory cell P2.

Param
This opcode is only ever present in sub-programs called via the
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 Program instruction.

ParseSchema
Read and parse all entries from the schema 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.

Permutation
Set the permutation used by the Compare operator in the next
instruction.  The permutation is stored in the P4 operand.

The permutation is only valid for the next opcode which must be
an Compare that has the OPFLAG_PERMUTE bit set in P5.

The first integer in the P4 integer array is the length of the array
and does not become part of the permutation.

Prev
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
Last opcode used to position the cursor.  Prev is not allowed
to follow SeekGT, SeekGE, or 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.

If P5 is positive and the jump is taken, then event counter
number P5-1 inZ the prepared statement is incremented.

Program
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.

PureFunc
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 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 PureFunc instead of Function, and
if they were, they throw an error.

See also: AggStep, AggFinal, Function

ReadCookie
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.

Real
P4 is a pointer to a 64-bit floating point value.
Write that value into register P2.

RealAffinity
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.

ReleaseReg
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 SCopy,
a change to the value of the source register for the 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.

Remainder
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.

ReopenIdx
The ReopenIdx opcode works like 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 SeekGE/IdxGT
of SeekLE/IdxLT)


See also: OpenRead, OpenWrite

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.

ResetSorter
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 OpenEphemeral or SorterOpen.

ResultRow
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.

Return
Jump to the address stored in register P1.  If P1 is a return address
register, then this accomplishes a return from a subroutine.

If P3 is 1, then the jump is only taken if register P1 holds an integer
values, otherwise execution falls through to the next opcode, and the
Return becomes a no-op. If P3 is 0, then register P1 must hold an
integer or else an assert() is raised.  P3 should be set to 1 when
this opcode is used in combination with BeginSubrtn, and set to 0
otherwise.

The value in register P1 is unchanged by this opcode.

P2 is not used by the byte-code engine.  However, if P2 is positive
and also less than the current address, then the "EXPLAIN" output
formatter in the CLI will indent all opcodes from the P2 opcode up
to be not including the current Return.   P2 should be the first opcode
in the subroutine from which this opcode is returning.  Thus the P2
value is a byte-code indentation hint.  See tag-20220407a in
wherecode.c and shell.c.

Rewind
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.

RowCell
P1 and P2 are both open cursors. Both must be opened on the same type
of table - intkey or index. This opcode is used as part of copying
the current row from P2 into P1. If the cursors are opened on intkey
tables, register P3 contains the rowid to use with the new record in
P1. If they are opened on index tables, P3 is not used.

This opcode must be followed by either an Insert or InsertIdx opcode
with the OPFLAG_PREFORMAT flag set to complete the insert operation.

RowData
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 Function or
by any use of another cursor pointing to the same table.

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.

RowSetAdd
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.

RowSetRead
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.

RowSetTest
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&gt;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).

Savepoint
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).

SCopy
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 Copy to make a complete
copy.

SeekEnd
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.

SeekGE
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

SeekGT
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

SeekHit
Increase or decrease the seekHit value for cursor P1, if necessary,
so that it is no less than P2 and no greater than P3.

The seekHit integer represents the maximum of terms in an index for which
there is known to be at least one match.  If the seekHit value is smaller
than the total number of equality terms in an index lookup, then the
IfNoHope opcode might run to see if the IN loop can be abandoned
early, thus saving work.  This is part of the IN-early-out optimization.

P1 must be a valid b-tree cursor.

SeekLE
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

SeekLT
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

SeekRowid
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 NotExists opcode performs the same operation, but with NotExists
the P3 register must be guaranteed to contain an integer value.  With this
opcode, register P3 might not contain an integer.

The 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

SeekScan
This opcode is a prefix opcode to^ SeekGE.  In other words, this
opcode must be immediately followed by SeekGE. This constraint is
checked by assert() statements.

This opcode uses the P1 through P4 operands of the subsequent
SeekGE.  In the text that follows, the operands of the subsequent
SeekGE opcode are denoted as SeekOP.P1 through SeekOP.P4.   Only
the P1, P2 and P5 operands of this opcode are also used, and  are called
This.P1, This.P2 and This.P5.

This opcode helps to optimize IN operators on a multi-column index
where the IN operator is on the later terms of the index by avoiding
unnecessary seeks on the btree, substituting steps to the next row
of the b-tree instead.  A correct answer is obtained if this opcode
is omitted or is a no-op.

The SeekGE.P3 and SeekGE.P4 operands identify an unpacked key which
is the desired entry that we want the cursor SeekGE.P1 to be pointing
to.  Call this SeekGE.P3/P4 row the "target".

If the SeekGE.P1 cursor is not currently pointing to a valid row,
then this opcode is a no-op and control passes through into the SeekGE.

If the SeekGE.P1 cursor is pointing to a valid row, then that row
might be the target row, or it might be near and slightly before the
target row, or it might be after the target row.  If the cursor is
currently before the target row, then this opcode attempts to position
the cursor on or after the target row by invoking sqlite3BtreeStep()
on the cursor between 1 and This.P1 times.

The This.P5 parameter is a flag that indicates what to do if the
cursor ends up pointing at a valid row that is past the target
row.  If This.P5 is false (0) then a jump is made to SeekGE.P2.  If
This.P5 is true (non-zero) then a jump is made to This.P2.  The P5==0
case occurs when there are no inequality constraints to the right of
the IN constraing.  The jump to SeekGE.P2 ends the loop.  The P5!=0 case
occurs when there are inequality constraints to the right of the IN
operator.  In that case, the This.P2 will point either directly to or
to setup code prior to the IdxGT or IdxGE opcode that checks for
loop terminate.

Possible outcomes from this opcode:

 If the cursor is initally not pointed to any valid row, then
fall through into the subsequent SeekGE opcode.

 If the cursor is left pointing to a row that is before the target
row, even after making as many as This.P1 calls to
sqlite3BtreeNext(), then also fall through into SeekGE.

 If the cursor is left pointing at the target row, either because it
was at the target row to begin with or because one or more
sqlite3BtreeNext() calls moved the cursor to the target row,
then jump to This.P2..,

 If the cursor started out before the target row and a call to
to sqlite3BtreeNext() moved the cursor off the end of the index
(indicating that the target row definitely does not exist in the
btree) then jump to SeekGE.P2, ending the loop.

 If the cursor ends up on a valid row that is past the target row
(indicating that the target row does not exist in the btree) then
jump to SeekOP.P2 if This.P5==0 or to This.P2 if This.P5&gt;0.


Sequence
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.

SequenceTest
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.

SetCookie
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.

If P2 is the SCHEMA_VERSION cookie (cookie number 1) then the internal
schema version is set to P3-P5.  The "PRAGMA schema_version=N" statement
has P5 set to 1, so that the internal schema version will be different
from the database schema version, resulting in a schema reset.

ShiftLeft
Shift the integer value in register P2 to the left by the
n_umber of bits specified by the integer in register P1.
Store the result in register P3.
If either input is NULL, the result is NULL.

ShiftRight
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.

SoftNull
Set register P1 to have the value NULL as seen by the 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 SCopy, the copies will continue to be valid.

Sort
This opcode does exactly the same thing as 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 Sort opcode instead of 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.

SorterCompare
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&#91;P3&#93; 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.

SorterData
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.

SorterInsert
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.

SorterNext
This opcode works just like Next except that P1 must be a
sorter object for which the 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.

SorterOpen
This opcode works like 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.

SorterSort
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 Sort and Rewind that is used
for Sorter objects.

SqlExec
Run the SQL statement or statements specified in the P4 string.

String
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&#91;P3&#93;==P5 ) reg&#91;P2&#93; := CAST(reg&#91;P2&#93; as BLOB)

String8
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.

Subtract
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.

TableLock
O`btain 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.

Trace
Write P4 on the statement trace output if statement tracing is
enabled.

Operand P1 must be 0x7fffffff and P2 must positive.

Transaction
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.  If P2 is 2 or more
then an exclusive 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.

TypeCheck
Apply affinities to the range of P2 registers beginning with P1.
Take the affinities from the Table object in P4.  If any value
cannot be coerced into the correct type, then raise an error.

This opcode is similar to Affinity except that this opcode
forces the register type to the Table column type.  This is used
to implement "strict affinity".

GENERATED ALWAYS AS ... STATIC columns are only checked if P3
is zero.  When P3 is non-zero, no type checking occurs for
static generated columns.  Virtual columns are computed at query time
and so they are never checked.

Preconditions:


 P2 should be the number of non-virtual columns in the
table of P4.
 Table P4 should be a STRICT table.


If any precondition is false, an assertion fault occurs.

Vacuum
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.

Variable
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().

VBegin
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.

VColumn
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 VColumn.

VCreate
P2 is a register that holds the name of a virtual table in database
P1. Call the xCreate method for that table.

VDestroy
P4 is the name of a virtual table in database P1.  Call the xDestroy method
of that table.

VFilter
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.

VInitIn
Set register P2 to be a pointer to a ValueList object for cursor P1
with cache register P3 and output register P3+1.  This ValueList object
can be used as the first argument to sqlite3_vtab_in_first() and
sqlite3_vtab_in_next() to extract all of the values stored in the P1
cursor.  Register P3 is used to hold the values returned by
sqlite3_vtab_in_first() and sqlite3_vtab_in_next().

VNext
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.

VOpen
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.

VRename
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.

VUpdate
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.

Yield
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

ZeroOrNull
If all both registers P1 and P3 are NOT NULL, then store a zero in
register P2.  If either registers P1 or P3 are NULL then put
a NULL in register P2.

  
  

This page last modified on  2022-08-10 18:45:48 UTCopcode.html#the_opcodes
EEƒ9ï!   O+…QIThe Advantages Of Flexible Typing1. IntroductionSQLite provides developers with the freedom to store content in
any desired format, regardless of the declared datatype of the column.
Some people find this feature troublesome.  Some developers are shocked
to discover that it is possible to insert text into a column marked INTEGER.

This article advocates in favor of the flexible type rules
in SQLite.flextypegood.html#introduction…¯ßZ
A)ŠÝ9;The SQLite Bytecode Engine4. The OpcodesThere are currently 186
opcodes defined by the virtual machine.
All currently defined opcodes are described in the table below.
This table was generated automatically by scanning the source code
from the file
vdbe.c.


Remember: The VDBE opcodes are not part of the interface 
definition for SQLite.  The number of opcodes and their names and meanings
change from one release of SQLite to the next.
The opcodes shown in the table below are valid for SQLite
 version 3.40.1 check-in
df5c253c0b3dd dated 2022-12-28.



  
  
  
  
  Opcode NameDescription

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.

Add
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.

AddImm
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.

Affinity
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.

AggFinal
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.

AggInverse
Execute the xInverse function for an aggregate.
The function has P5 arguments.  P4 is a pointer to the
FuncDef structureL
\¡v\Šï$   O7’uQThe Advantages Of Flexible Typing3.1. Attribute tablesMany applications, especially those that use SQLite as an
application file format, need a place to store miscellaneous attributes
such as thumbnail images (as BLOB values), short pieces of text (such
as the user's name), as well as numeric, date, and JSON values.  It is
convenient to create a single table to handle this storage:

CREATE TABLE attribute(name TEXT PRIMARY KEY, value) WITHOUT ROWID;


Without flexible typing, such a table would need to be more complex,
with separate columns for each possible type of data.  Flexible typing
of the "value" column makes the table conceptually simpler, more
space-efficient, and easier to access and update.

In the Fossil version control system, each
repository has a CONFIG table that is used to store all kinds of settings
with every possible datatype.  The user-specific configuration file
for Fossil (the ~/.fossil file) is a separate SQLite database that contains
a single attribute table hold the user-specific state across all
repositories.

 Some applications use an SQLite database as a pure key-value store
The database schema contains a single table that looks something like this:

CREATE TABLE storage(name TEXT PRIMARY KEY, value ANYTHING);flextypegood.html#attribute_tables‚&ï#     O]‚G{The Advantages Of Flexible Typing3. Cases Where Flexible Typing Is UsefulSome readers, upon first encountering flexible typing in SQLite, ask
themselves "how could this ever be useful?"  Here is an
attempt to answer that question:flextypegood.html#cases_where_flexible_typing_is_usefulŽZï"    O=›o[The Advantages Of Flexible Typing2. About Flexible TypingDetails regarding the flexible type system of SQLite are found
in the separate Datatypes In SQLite document.  Here is a quick
summary:


 Datatype names on column definitions are optional.  A column definition
        can consist of just the column name and nothing else.
 When datatype names are provided, they can be just about any text.
        SQLite attempts to deduce the preferred datatype for the column based
        on the datatype name in the column definition, but that preferred
        datatype is advisory, not mandatory.  The preferred datatype is
        call the "column affinity".
 An attempt is made to transform incoming data into the preferred
        datatype of the column.  (All SQL database engines do this, not
        just SQLite.)  If this transformation is successful, all is well.
        But if unsuccessful, instead of raising an error, SQLite just stores
        the content using its original datatype.
 The above can lead to situations that advocates of rigid typing
        find incommodious:
        
        Column DatatypeTypes Allowed In That Column
        INTEGERINTEGER, REAL, TEXT, BLOB
        REALREAL, TEXT, BLOB
        TEXTTEXT, BLOB
        BLOBINTEGER, REAL, TEXT, BLOB
        
 Note that an INTEGER or REAL value will never end up being stored
        in a TEXT column, since an INTEGER or REAL value can and always will
        be converted into its equivalent TEXT representation.  Similarly,
        and INTEGER will never be stored in a REAL column because it will
        always be converted into a REAL.  But TEXT does not always look like
        and INTEGER or REAL value and so cannot always be converted.  And a
        BLOB cannot be converted into anything and nothing else can be
        converted into a BLOB.flextypegood.html#about_flexible_typing
u
²
Õcu…iï)O   ˆu#The Advantages Of Flexible Typing3.6. Repurposing unused or disused columns in legacy databasesBecause an SQLite database file is a single file on disk, some
applications use SQLite as an application file format.  This means
that a single instance of the application might, over the course of its
life, talk to hundreds or thousands of separate databases, each in a separate
file.  When such applications evolve over years, some columns in the
underlying database will have their meanings altered subtly.  Or, it might
be desirable to repurpose an existing column to serve two or more purposes.
This is much easier to do if the column has a flexible datatype.flextypegood.html#repurposing_unused_or_disused_columns_in_legacy_databases„mï(        OY‡asThe Advantages Of Flexible Typing3.5. Data typename cross-compatibilityEvery SQL database engine seems to have its own unique set of supported
datatype names:


 BIGINT
 UNSIGNED SMALL INT
 TEXT
 VARCHAR
 VARYING CHARACTER
 NATIONAL VARYING CHARACTER
 NVARCHAR
 JSON
 REAL
 FLOAT
 DOUBLE PRECISION
  ... and so forth ...


The fact that SQLite will accept any of these names as a valid typename,
and let you store any kind of content into the column, increases the chances
that a script written to run on some other SQL database engine will also
work in SQLite.flextypegood.html#data_typename_cross_compatibility†&ï' OQŠckThe Advantages Of Flexible Typing3.4. Dynamic programming languagesSQLite began as a TCL extension that later escaped into the wild.
TCL is a dynamic language in the sense that the programmer does not need
to be aware of datatypes.  Under the hood, TCL keeps careful track of the
datatype of every value, but to the developer and user of a TCL program,
everything looks like a string.  Flexible typing is a natural fit for
use with dynamic programming languages like TCL and others, since with
a dynamic programming language, you can not always predict in advance what
datatype a variable will hold.  So when you need to store the value of that
variable into the database, having a database that is supports flexible
typing makes storage much easier.flextypegood.html#dynamic_programming_languages‡-ï&   OC
]The Advantages Of Flexible Typing3.3. Storage for dirty dataAnalysts sometimes encounter CSV files where some columns contain
a mixture of integer, real, and text data.  CSV file that are obtained
from Excel spreadsheet exports commonly have this trait, for example.
When importing such "dirty data" into an SQL database, it is convenient
to have flexible columns to import into.

 Dirty data is not restricted to CSV files coming out of Excel, of
course.  There are many data sources in which a single field might
contain a mix of types.  For example, a data column might the number
of seconds since 1970 sometimes, or as a text date string in other cases.
It is desirable to clean up these inconsistent representations,
but at the same time it is convenient to be able to store all the different
representations in the same column of the intermediate database while the
cleanup is underway.flextypegood.html#storage_for_dirty_data„Iï%O
†1#The Advantages Of Flexible Typing3.2. The "value" column output from the json_tree virtual tablesThe json_tree and json_each table-valued functions that are
built into SQLite both have a "value" column that can hold values of
type INTEGER, REAL, or TEXT depending on the type of the corresponding
JSON field.  For example:

SELECT typeof(value) FROM json_each('{"a":1,"b":2.5,"c":"hello"}');


The query above returns three rows of one column with values
"integer", "real", and "text", respectively.flextypegood.html#the_value_column_output_from_the_json_tree_virtual_tables
    ¼
®    ¼‡mï+     O]YwThe Advantages Of Flexible Typing4.1. We've never done it that way beforeMany skeptics of flexible typing simply express
shock and disbelief, without offering any rationale for why they think
flexible typing is a bad idea.  Without supporting arguments, one must
assume their reason for not liking flexible typing is that it is different
from what they are used to.

 Presumably, many developers who are aghast at SQLite's flexible
typing feel this way because they have just never encountered anything
like it before.  All prior exposure to databases and especially SQL
databases has involved rigid typing, and the readers mental model of
SQL includes rigid typing as a fundamental feature.  Flexible typing
upsets their world-view.

 Yes, flexible typing is a new way of thinking about data in an
SQL database.  But new is not necessary bad.  Sometimes, and I think
especially in the case of flexible typing, innovation leads to improvement.flextypegood.html#we_ve_never_done_it_that_way_before„Mï*O     †;%The Advantages Of Flexible Typing4. Perceived Disadvantages of Flexible Typing (With Rebuttals)The following perceived disadvantages of flexible typing were
    gleaned and compiled from countless posts on Hacker News and
    Reddit and similar forums where developers discuss these sorts of
    things.  If you can think of other reasons why flexible typing
    is a bad idea, please contact the SQLite developers or leave a
    post on the SQLite Forum so
    that your idea can be added to the list.flextypegood.html#perceived_disadvantages_of_flexible_typing_with_rebuttals_
ðð˜ï,O-IThe Advantages Of Flexible Typing4.2. Rigid type enforcement helps prevent application bugsIt has become a point of doctrine among many programmers that the
best way to prevent application bugs is strict type enforcement.  But I
find no evidence in support of this.

 To be sure, strict type enforcement does help prevent some kinds of
bugs in lower-level languages like C and C++ that present a model that is
close to machine hardware.  But this does not seem to
be the case for higher-abstraction languages in which all data is 
passed around in a "Value" superclass of some kind which is subclassed
for the various lower-level data types.  When everything is a Value
object, specific datatypes cease to be important.

 This technical note is being writing by the original author of SQLite.
I having been writing TCL programs for 27 years.  TCL has no type enforcement
whatsoever.  The "Value" class in TCL (called Tcl_Obj) can hold many
different datatypes, but it presents the content to the program and to
the application user as a string.  And I've had a lot of bugs in
those TCL programs over the years.  But I do not recall a single instance
where the bugs might have been caught by a rigid type system.  I have
also written a lot of C code over a span of 35 years, not the
least of which is SQLite itself.  I have found the type system in C
to be very helpful at finding and preventing problems.  For the
Fossil Version Control System, which is written
in C, I have even implemented supplemental static analysis programs that
scan the Fossil source code prior to compilation, looking for problems
that compilers miss.  This works well for compiled programs.

 The SQL language model is a higher-level abstraction that C/C++.
In SQLite, every data item is stored in memory as an "sqlite3_value" object.
There are subclasses of this object for strings, integer, floating-point
numbers, blobs, and other representations.  Everything is passed around
inside the SQL language implemented by SQLite as "sqlite3_value" objects
so the underlying datatype does not really matter.  I have never found
rigid type enforcement to be helpful in languages like TCL and SQLite
that have a single "Value" superclass used to represent any data element.
Fossil makes extensive use of SQLite in its implementation.  There have
been many bugs in Fossil over its 14-years history, but I cannot recall
a single bug that might have been prevented by rigid type enforcement in
the SQLite.  C-language bugs might have been caught by better type enforcement
(which is why I wrote the supplemental source code scanners), but no
SQL bugs.

 Based on decades of experience, I reject the thesis that rigid
type enforcement helps prevent application bugs.  I will accept and
believe a slightly modified thesis:  Rigid type enforcement helps to
prevent applications bugs in languages that lack a single
top-level "Value" superclass.  But SQLite does have the
single "sqlite3_value" superclass, so that proverb does not apply.flextypegood.html#rigid_type_enforcement_helps_prevent_application_bugs
OˆOƒ?ï/
Og„gThe Advantages Of Flexible Typing5. If You Insist On Rigid Type Enforcement...As of SQLite version 3.37.0 (2021-11-27), SQLite supports this
development style using STRICT tables.

If you find a real-world case where STRICT tables prevented or
would have prevented a bug in an application, please post a message to the
SQLite Forum so that we can add your story
to this document.flextypegood.html#if_you_insist_on_rigid_type_enforcement_ˆpï.
Os1
The Advantages Of Flexible Typing4.4. Other SQL database engines don't work this wayBecause SQLite is less restrictive and allows you to do more things,
SQL scripts that work on other database engines will also usually work
on SQLite, but script written initially for SQLite might not work
on more restrictive database engines.  This can cause problems when
developers user SQLite for prototyping and testing and then migrate their
application to a more restrictive SQL engine for deployment.  If the
application was (unintentionally) taking advantage of the flexible
typing available in SQLite, then it will fail when migrated.

 People use this problem to argue that SQLite should be more
restrictive about datatypes.  But you could just as easily turn
that argument around and say that other database engines should be
more flexible with regard to datatypes.  The application was working
correctly under SQLite, prior to be migrated, after all.  If rigid
type enforcement is really all that useful, why did it break an
application that was previously working?flextypegood.html#other_sql_database_engines_don_t_work_this_way’sï-
Os£7
The Advantages Of Flexible Typing4.3. Rigid type enforcement prevents data pollutionSome people contend that if you have rigorous constraints on the
schema, and especially strict enforcement of column datatypes, this
will help prevent incorrect data from being added to the database.
This is not true.  It is true that type enforcement might help prevent
egregiously incorrect data from getting into the system.
But type enforcement is no help in prevent subtly incorrect data
from being recorded.

 So, for example, rigid type enforcement can successfully prevent
the customer name (text) from being inserted into integer
Customer.creditScore column.  On the other hand, if that mistake occurs,
it is very easy to spot the problem and find all affected rows.
But type enforcement is no help in preventing a bug where the customer
family name and given name are reversed, since both are text fields.

 (Aside:  Decades ago, I worked on a team where there was a woman
named "Merritt Tracy".  "Merritt" was her given name and "Tracy" was
her family name.  She reported that she spend an inordinate amount of
time and energy trying to correct databases that had "Tracy" has her 
given name and "Merritt" as her family name.)

 By suppressing easy-to-detect errors and passing through only the
hard-to-detect errors, rigid type enforcement can actually make it more
difficult to find and fix bugs.  Data errors tend to cluster.  If you have
20 different data sources, most of the data errors will usually come
from just 2 or 3 of those sources.  The presence of egregious
errors (such as text in an integer column) is a convenient early warning
signal that something is amiss.  The source of the problem can be 
tracked quickly and extra scrutiny applied to the source of the
egregious errors, thus hopefully also fixing the subtle errors too.
When egregious errors are suppressed, you lose an important signal
that helps you to detect and fix the subtle errors.

 Data errors are inevitable.  They will happen regardless of how
much type checking is done.  Rigid type enforcement can catch only
a small subset of those cases - the most obvious cases.  It does
nothing to help find and fix the more subtle cases.  And, by suppressing
the signal of which data sources are problematic, it can sometimes
make the subtle errors more difficult to locate.flextypegood.html#rigid_type_enforcement_prevents_data_pollution

|
„f÷         ;5ˆ+SThe SQLite Amalgamation1. Executive SummaryOver 100 separate source files are concatenated into a
single large file of C-code named "sqlite3.c" and
referred to as "the amalgamation". The amalgamation
contains everything an application needs to embed SQLite.

Combining all the code for SQLite into one big file makes SQLite
easier to deploy &mdash; there is just one file to keep track of.
And because all code is in
a single translation unit, compilers can do
better inter-procedure and inlining optimization
resulting in machine code that is between 5% and 10% faster.amalgamation.html#executive_summary†ï0    O1ŒQOThe Advantages Of Flexible Typing6. Embrace FreedomIf flexible typing in an SQL database is a new concept to you,
I encourage you to give it a try.  It probably will not cause you
any problems and it might make your program simpler and easier to
write and maintain.  I think that even if you are skeptical at first,
if you will just give flexible typing a try, you will eventually
come to realize that it is a better approach and will start
encouraging other database vendors to support at least an ANY
datatype if not complete SQLite-style type flexibility.

Most of the time, flexible typing does not matter because a column
stores a single well-defined type.  But occasionally you will run
across situations where having a flexible type system makes the
solution to your problem cleaner and easier.
This page last modified on  2021-08-24 21:13:00 UTCflextypegood.html#embrace_freedom
•z÷
        ;Aª;_The SQLite Amalgamation2. The SQLite AmalgamationThe SQLite library consists of 111 files of C code
(as of Version 3.37.0 - 2021-11-27)
in the core with 22 additional files that
implement certain commonly used extensions.

Of the 133
main source files, about 75% are C code and about 25% are C header files.
Most of these are "source" files in the sense that they are stored
in the SQLite version control system
and are edited manually in an ordinary text editor.
But some of the C-language files are generated using scripts
or auxiliary programs.  For example, the
parse.y
file contains an LALR(1) grammar of the SQL language which is compiled,
by the Lemon parser generator, to produce a parser contained in the file
"parse.c" accompanied by token identifiers in "parse.h".


The makefiles for SQLite have an "sqlite3.c" target for building the
amalgamation, to contain all C code for the core SQLite library and the
FTS3, FTS5, RTREE, DBSTAT, JSON1,
RBU and SESSION
extensions.
This file contains about 238K lines of code
(or 145K if you omit blank lines and comments) and is over 8.4 megabytes
in size (as of 2021-12-29).

Though the various extensions are included in the
"sqlite3.c" amalgamation file, they are disabled using #ifdef statements.
Activate the extensions using compile-time options like:


 -DSQLITE_ENABLE_FTS3
 -DSQLITE_ENABLE_FTS5
 -DSQLITE_ENABLE_RTREE
 -DSQLITE_ENABLE_DBSTAT_VTAB
 -DSQLITE_ENABLE_JSON1
 -DSQLITE_ENABLE_RBU
 -DSQLITE_ENABLE_SESSION


The amalgamation contains everything you need to integrate SQLite 
into a larger project.  Just copy the amalgamation into your source 
directory and compile it along with the other C code files in your project.
(A more detailed discussion of the compilation process is
available.)
You may also want to make use of the "sqlite3.h" header file that 
defines the programming API for SQLite. 
The sqlite3.h header file is available separately. 
The sqlite3.h file is also contained within the amalgamation, in
the first few thousand lines. So if you have a copy of 
sqlite3.c but cannot seem to locate sqlite3.h, you can always 
regenerate the sqlite3.h by copying and pasting from the amalgamation.

In addition to making SQLite easier to incorporate into other
projects, the amalgamation also makes it run faster. Many
compilers are able to do additional optimizations on code when 
it is contained with in a single translation unit such as it 
is in the amalgamation. We have measured performance improvements
of between 5 and 10% when we use the amalgamation to compile 
SQLite rather than individual source files.  The downside of this
is that the additional optimizations often take the form of 
function inlining which tends to make the size of the resulting
binary image larger.amalgamation.html#the_sqlite_amalgamation
ƒ
Å       Ž³Bnƒ‡fþq   KŽS1SQLite FTS3 and FTS4 Extensions OverviewFTS3 and FTS4 are SQLite virtual table modules that allows users to perform 
  full-text searches on a set of documents. The most common (and effective) 
  way to describe full-text searches is "what Google, Yahoo, and Bing do
  with documents placed on the World Wide Web". Users input a term, or series 
  of terms, perhaps connected by a binary operator or grouped together into a 
  phrase, and the full-text query system finds the set of documents that best 
  matches those terms considering the operators and groupings the user has 
  specified. This article describes the deployment and usage of FTS3 and FTS4.


  FTS1 and FTS2 are obsolete full-text search modules for SQLite.  There are known
  issues with these older modules and their use should be avoided.
  Portions of the original FTS3 code were contributed to the SQLite project 
  by Scott Hess of Google. It is now 
  developed and maintained as part of SQLite.fts3.html#overviewO÷    ;'‚AThe SQLite Amalgamation5.2. See AlsoAdditional notes on compiling SQLite can be found on the
How To Compile SQLite page.
This page last modified on  2022-04-25 03:42:01 UTCamalgamation.html#see_also‚l÷      ;/„GIThe SQLite Amalgamation5.1. DependenciesThe build process makes extensive use of the 
Tcl scripting language.  You will need to have a
copy of TCL installed in order for the make targets above to work.
Easy-to-use installers can be obtained from http://www.tcl-lang.org/.
Many unix workstations have Tcl installed by default.amalgamation.html#dependencies…V÷
;{ˆ}The SQLite Amalgamation5. Building The Amalgamation From Canonical Source CodeTo build the amalgamation (either the full amalgamation or the
split amalgamation), first
get the canonical source code from one of the three servers.
Then, on both unix-like systems and on Windows systems that have the
free MinGW development environment
installed, the amalgamation can be built using the
following commands:

sh configure
make sqlite3.c


To build using Microsoft Visual C++, run this command:

nmake /f makefile.msc sqlite3.c


In both cases, the split amalgamation can be obtained by
substituting "sqlite3-all.c" for "sqlite3.c" as the make target.amalgamation.html#building_the_amalgamation_from_canonical_source_code‚2÷     ;Y‚{wThe SQLite Amalgamation4. Download Copies Of The AmalgamationThe amalgamation and
the sqlite3.h header file are available on
the download page as a file 
named sqlite-amalgamation-X.zip
where the X is replaced by the appropriate version number.amalgamation.html#download_copies_of_the_amalgamationŠ6÷    ;?“7]The SQLite Amalgamation3. The Split AmalgamationDevelopers sometimes experience trouble debugging the
quarter-million line amalgamation source file because some debuggers
are only able to handle source code line numbers less than 32,768.
The amalgamation source code runs fine.  One just cannot single-step
through it in a debugger.

To circumvent this limitation, the amalgamation is also available in
a split form, consisting of files "sqlite3-1.c", "sqlite3-2.c", and
so forth, where each file is less than 32,768 lines in length and
where the concatenation of the files contain all of the code for the
complete amalgamation.  Then there is a separate source file named
"sqlite3-all.c" which basically consists of code like this:

#include "sqlite3-1.c"
#include "sqlite3-2.c"
#include "sqlite3-3.c"
#include "sqlite3-4.c"
#include "sqlite3-5.c"
#include "sqlite3-6.c"
#include "sqlite3-7.c"


Applications using the split amalgamation simply compile against
"sqlite3-all.c" instead of "sqlite3.c".  The two files work exactly
the same.  But with "sqlite3-all.c", no single source file contains more
than 32,767 lines of code, and so it is more convenient to use some
debuggers.  The downside of the split amalgamation is that it consists
of 6 C source code files instead of just 1.amalgamation.html#the_split_amalgamation
hhþr        KMœU[SQLite FTS3 and FTS4 Extensions1. Introduction to FTS3 and FTS4The FTS3 and FTS4 extension modules allows users to create special tables with a 
  built-in full-text index (hereafter "FTS tables"). The full-text index
  allows the user to efficiently query the database for all rows that contain
  one or more words (hereafter "tokens"), even if the table
  contains many large documents.


  For example, if each of the 517430 documents in the 
  "Enron E-Mail Dataset"
  is inserted into both an FTS table and an ordinary SQLite table
  created using the following SQL script:

CREATE VIRTUAL TABLE enrondata1 USING fts3(content TEXT);     /* FTS3 table */
CREATE TABLE enrondata2(content TEXT);                        /* Ordinary table */



  Then either of the two queries below may be executed to find the number of
  documents in the database that contain the word "linux" (351). Using one
  desktop PC hardware configuration, the query on the FTS3 table returns in
  approximately 0.03 seconds, versus 22.5 for querying the ordinary table.

SELECT count(*) FROM enrondata1 WHERE content MATCH 'linux';  /* 0.03 seconds */
SELECT count(*) FROM enrondata2 WHERE content LIKE '%linux%'; /* 22.5 seconds */



  Of course, the two queries above are not entirely equivalent. For example
  the LIKE query matches rows that contain terms such as "linuxophobe"
  or "EnterpriseLinux" (as it happens, the Enron E-Mail Dataset does not
  actually contain any such terms), whereas the MATCH query on the FTS3 table
  selects only those rows that contain "linux" as a discrete token. Both 
  searches are case-insensitive. The FTS3 table consumes around 2006 MB on
  disk compared to just 1453 MB for the ordinary table. Using the same
  hardware configuration used to perform the SELECT queries above, the FTS3
  table took just under 31 minutes to populate, versus 25 for the ordinary
  table.fts3.html#introduction_to_fts3_and_fts4
DD‘7þs     KY¡  cSQLite FTS3 and FTS4 Extensions1.1. Differences between FTS3 and FTS4FTS3 and FTS4 are nearly identical. They share most of their code in common,
  and their interfaces are the same. The differences are:


   FTS4 contains query performance optimizations that may significantly
       improve the performance of full-text queries that contain terms that are
       very common (present in a large percentage of table rows).

   FTS4 supports some additional options that may used with the matchinfo()
       function. 

   Because it stores extra information on disk in two new 
       shadow tables in order to support the performance
       optimizations and extra matchinfo() options, FTS4 tables may consume more
       disk space than the equivalent table created using FTS3. Usually the overhead
       is 1-2% or less, but may be as high as 10% if the documents stored in the
       FTS table are very small. The overhead may be reduced by specifying the
       directive "matchinfo=fts3" as part of the FTS4 table
       declaration, but this comes at the expense of sacrificing some of the
       extra supported matchinfo() options.

   FTS4 provides hooks (the compress and uncompress 
       options) allowing data to be stored in a compressed 
       form, reducing disk usage and IO.



  FTS4 is an enhancement to FTS3. 
  FTS3 has been available since SQLite version 3.5.0 (2007-09-04)
  The enhancements for FTS4 were added with SQLite version 3.7.4
  (2010-12-07).


  Which module, FTS3 or FTS4, should you use in your application?  FTS4 is
  sometimes significantly faster than FTS3, even orders of magnitude faster
  depending on the query, though in the common case the performance of the two
  modules is similar. FTS4 also offers the enhanced matchinfo() outputs which
  can be useful in ranking the results of a MATCH operation.  On the
  other hand, in the absence of a matchinfo=fts3 directive FTS4 requires a little
  more disk space than FTS3, though only a percent of two in most cases.


  For newer applications, FTS4 is recommended; though if compatibility with older 
  versions of SQLite is important, then FTS3 will usually serve just as well.fts3.html#differences_between_fts3_and_fts4
FF—5þt   K[-eSQLite FTS3 and FTS4 Extensions1.2. Creating and Destroying FTS TablesLike other virtual table types, new FTS tables are created using a 
  CREATE VIRTUAL TABLE statement. The module name, which follows
  the USING keyword, is either "fts3" or "fts4". The virtual table module arguments may
  be left empty, in which case an FTS table with a single user-defined 
  column named "content" is created. Alternatively, the module arguments
  may be passed a list of comma separated column names. 


  If column names are explicitly provided for the FTS table as part of
  the CREATE VIRTUAL TABLE statement, then a datatype name may be optionally 
  specified for each column. This is pure syntactic sugar, the
  supplied typenames are not used by FTS or the SQLite core for any
  purpose. The same applies to any constraints specified along with an
  FTS column name - they are parsed but not used or recorded by the system
  in any way.

-- Create an FTS table named "data" with one column - "content":
CREATE VIRTUAL TABLE data USING fts3();

-- Create an FTS table named "pages" with three columns:
CREATE VIRTUAL TABLE pages USING fts4(title, keywords, body);

-- Create an FTS table named "mail" with two columns. Datatypes
-- and column constraints are specified along with each column. These
-- are completely ignored by FTS and SQLite. 
CREATE VIRTUAL TABLE mail USING fts3(
  subject VARCHAR(256) NOT NULL,
  body TEXT CHECK(length(body)&lt;10240)
);



  As well as a list of columns, the module arguments passed to a CREATE
  VIRTUAL TABLE statement used to create an FTS table may be used to specify
  a tokenizer. This is done by specifying a string of the form
  "tokenize=&lt;tokenizer name&gt; &lt;tokenizer args&gt;" in place of a column
  name, where &lt;tokenizer name&gt; is the name of the tokenizer to use and
  &lt;tokenizer args&gt; is an optional list of whitespace separated qualifiers
  to pass to the tokenizer implementation. A tokenizer specification may be
  placed anywhere in the column list, but at most one tokenizer declaration is
  allowed for each CREATE VIRTUAL TABLE statement. See below for a 
  detailed description of using (and, if necessary, implementing) a tokenizer.

-- Create an FTS table named "papers" with two columns that uses
-- the tokenizer "porter".
CREATE VIRTUAL TABLE papers USING fts3(author, document, tokenize=porter);

-- Create an FTS table with a single column - "content" - that uses
-- the "simple" tokenizer.
CREATE VIRTUAL TABLE data USING fts4(tokenize=simple);

-- Create an FTS table with two columns that uses the "icu" tokenizer.
-- The qualifier "en_AU" is passed to the tokenizer implementation
CREATE VIRTUAL TABLE names USING fts3(a, b, tokenize=icu en_AU);



  FTS tables may be dropped from the database using an ordinary DROP TABLE
  statement. For example:

-- Create, then immediately drop, an FTS4 table.
CREATE VIRTUAL TABLE data USING fts4();
DROP TABLE data;fts3.html#creating_and_destroying_fts_tables
kkŸþu    KA¼kKSQLite FTS3 and FTS4 Extensions1.3. Populating FTS TablesFTS tables are populated using INSERT, UPDATE and DELETE
    statements in the same way as ordinary SQLite tables are.

  
    As well as the columns named by the user (or the "content" column if no
    module arguments were specified as part of the CREATE VIRTUAL TABLE 
    statement), each FTS table has a "rowid" column. The rowid of an FTS
    table behaves in the same way as the rowid column of an ordinary SQLite 
    table, except that the values stored in the rowid column of an FTS table 
    remain unchanged if the database is rebuilt using the VACUUM command. 
    For FTS tables, "docid" is allowed as an alias along with the usual "rowid",
    "oid" and "_oid_" identifiers. Attempting to insert or update a row with a 
    docid value that already exists in the table is an error, just as it would 
    be with an ordinary SQLite table.

  
    There is one other subtle difference between "docid" and the normal SQLite
    aliases for the rowid column. Normally, if an INSERT or UPDATE statement 
    assigns discrete values to two or more aliases of the rowid column, SQLite 
    writes the rightmost of such values specified in the INSERT or UPDATE
    statement to the database. However, assigning a non-NULL value to both
    the "docid" and one or more of the SQLite rowid aliases when inserting or
    updating an FTS table is considered an error. See below for an example.

-- Create an FTS table
CREATE VIRTUAL TABLE pages USING fts4(title, body);

-- Insert a row with a specific docid value.
INSERT INTO pages(docid, title, body) VALUES(53, 'Home Page', 'SQLite is a software...');

-- Insert a row and allow FTS to assign a docid value using the same algorithm as
-- SQLite uses for ordinary tables. In this case the new docid will be 54,
-- one greater than the largest docid currently present in the table.
INSERT INTO pages(title, body) VALUES('Download', 'All SQLite source code...');

-- Change the title of the row just inserted.
UPDATE pages SET title = 'Download SQLite' WHERE rowid = 54;

-- Delete the entire table contents.
DELETE FROM pages;

-- The following is an error. It is not possible to assign non-NULL values to both
-- the rowid and docid columns of an FTS table.
INSERT INTO pages(rowid, docid, title, body) VALUES(1, 2, 'A title', 'A document body');


  
    To support full-text queries, FTS maintains an inverted index that maps
    from each unique term or word that appears in the dataset to the locations
    in which it appears within the table contents. For the curious, a 
    complete description of the data structure used to store
    this index within the database file appears below. A feature of
    this data structure is that at any time the database may contain not
    one index b-tree, but several different b-trees that are incrementally
    merged as rows are inserted, updated and deleted. This technique improves 
    performance when writing to an FTS table, but causes some overhead for
    full-text queries that use the index. Evaluating the special "optimize" command, 
    an SQL statement of the
    form "INSERT INTO &lt;fts-table&gt;(&lt;fts-table&gt;) VALUES('optimize')",
    causes FTS to merge all existing index b-trees into a single large
    b-tree containing the entire index. This can be an expensive operation,
    but may speed up future queries. 

  
    For example, to optimize the full-text index for an FTS table named
    "docs":

-- Optimize the internal structure of FTS table "docs".
INSERT INTO docs(docs) VALUES('optimize');


  
    The statement above may appear syntactically incorrect to some. Refer to
    the section describing the simple fts queries for an explanation.

  
    There is another, deprecated, method for invoking the optimize 
    operation using a SELECT statement. New code should use statements
    similar to the INSERT above to optimize FTS structures.fts3.html#populating_fts_tablesMATCH 'search';       -- Fast. Full-text query.
SELECT * FROM mail WHERE rowid BETWEEN 15 AND 20;   -- Fast. Rowid lookup.
SELECT * FROM mail WHERE subject = 'database';      -- Slow. Linear scan.
SELECT * FROM mail WHERE subject MATCH 'database';  -- Fast. Full-text query.



  In all of the full-text queries above, the right-hand operand of the MATCH
  operator is a string consisting of a single term. In this case, the MATCH
  expression evaluates to true for all documents that contain one or more 
  instances of the specified word ("sqlite", "search" or "database", depending 
  on which example you look at). Specifying a single term as the right-hand
  operand of the MATCH operator results in the simplest and most common type 
  of full-text query possible. However more complicated queries are possible,
  including phrase searches, term-prefix searches and searches for documents 
  containing combinations of terms occurring within a defined proximity of each
  other. The various ways in which the full-text index may be queried are
  described below.


  Normally, full-text queries are case-insensitive. However, this
  is dependent on the specific tokenizer used by the FTS table
  being queried. Refer to the section on tokenizers for details.


  The paragraph above notes that a MATCH operator with a simple term as the
  right-hand operand evaluates to true for all documents that contain the
  specified term. In this context, the "document" may refer to either the 
  data stored in a single column of a row of an FTS table, or to the contents
  of all columns in a single row, depending on the identifier used as the
  left-hand operand to the MATCH operator. If the identifier specified as
  the left-hand operand of the MATCH operator is an FTS table column name,
  then the document that the search term must be contained in is the value
  stored in the specified column. However, if the identifier is the name
  of the FTS table itself, then the MATCH operator evaluates to true
  for each row of the FTS table for which any column contains the search 
  term. The following example demonstrates this:

-- Example schema
CREATE VIRTUAL TABLE mail USING fts3(subject, body);

-- Example table population
INSERT INTO mail(docid, subject, body) VALUES(1, 'software feedback', 'found it too slow');
INSERT INTO mail(docid, subject, body) VALUES(2, 'software feedback', 'no feedback');
INSERT INTO mail(docid, subject, body) VALUES(3, 'slow lunch order',  'was a software problem');

-- Example queries
SELECT * FROM mail WHERE subject MATCH 'software';    -- Selects rows 1 and 2
SELECT * FROM mail WHERE body    MATCH 'feedback';    -- Selects row 2
SELECT * FROM mail WHERE mail    MATCH 'software';    -- Selects rows 1, 2 and 3
SELECT * FROM mail WHERE mail    MATCH 'slow';        -- Selects rows 1 and 3

  

  At first glance, the final two full-text queries in the example above seem
  to be syntactically incorrect, as there is a table name ("mail") used as
  an SQL expression. The reason this is acceptable is that each FTS table
  actually has a HIDDEN column with the same name
  as the table itself (in this case, "mail"). The value stored in this
  column is not meaningful to the application, but can be used as the 
  left-hand operand to a MATCH operator. This special column may also be
  passed as an argument to the FTS auxiliary functions.


  The following example illustrates the above. The expressions "docs", 
  "docs.docs" and "main.docs.docs" all refer to column "docs". However, the 
  expression "main.docs" does not refer to any column. It could be used to 
  refer to a table, but a table name is not allowed in the context in which
  it is used below.

-- Example schema
CREATE VIRTUAL TABLE docs USING fts4(content);

-- Example queries
SELECT * FROM docs WHERE docs MATCH 'sqlite';              -- OK.
SELECT * FROM docs WHERE docs.docs MATCH 'sqlite';         -- OK.
SELECT * FROM docs WHERE main.docs.docs MATCH 'sqlite';    -- OK.
SELECT * FROM docs WHERE main.docs MATCH 'sqlite';         -- Error.fts3.html#simple_fts_queries
,
,Qþw       K%š%/SQLite FTS3 and FTS4 Extensions1.5. SummaryFrom the users point of view, FTS tables are similar to ordinary SQLite
  tables in many ways. Data may be added to, modified within and removed 
  from FTS tables using the INSERT, UPDATE and DELETE commands just as 
  it may be with ordinary tables. Similarly, the SELECT command may be used 
  to query data. The following list summarizes the differences between FTS
  and ordinary tables:


   
    As with all virtual table types, it is not possible to create indices or
    triggers attached to FTS tables. Nor is it possible to use the ALTER TABLE
    command to add extra columns to FTS tables (although it is possible to use
    ALTER TABLE to rename an FTS table).

   
    Data-types specified as part of the "CREATE VIRTUAL TABLE" statement
    used to create an FTS table are ignored completely. Instead of the
    normal rules for applying type affinity to inserted values, all
    values inserted into FTS table columns (except the special rowid
    column) are converted to type TEXT before being stored.

   
    FTS tables permit the special alias "docid" to be used to refer to the
    rowid column supported by all virtual tables.

   
    The FTS MATCH operator is supported for queries based on the built-in
    full-text index. 

   
    The FTS auxiliary functions, snippet(), offsets(), and matchinfo() are 
    available to support full-text queries.

  
    

    Every FTS table has a hidden column with the 
    same name as the table itself. The value contained in each row for the
    hidden column is a blob that is only useful as the left operand of a
    MATCH operator, or as the left-most argument to one
    of the FTS auxiliary functions.fts3.html#summary«qþv       K;Ö9ESQLite FTS3 and FTS4 Extensions1.4. Simple FTS QueriesAs for all other SQLite tables, virtual or otherwise, data is retrieved
  from FTS tables using a SELECT statement.


  FTS tables can be queried efficiently using SELECT statements of two
  different forms:


  
    Query by rowid. If the WHERE clause of the SELECT statement
    contains a sub-clause of the form "rowid = ?", where ? is an SQL expression,
    FTS is able to retrieve the requested row directly using the equivalent 
    of an SQLite INTEGER PRIMARY KEY index.

  
    Full-text query. If the WHERE clause of the SELECT statement contains
    a sub-clause of the form "&lt;column&gt; MATCH ?", FTS is able to use 
    the built-in full-text index to restrict the search to those documents 
    that match the full-text query string specified as the right-hand operand
    of the MATCH clause.



  If neither of these two query strategies can be used, all
  queries on FTS tables are implemented using a linear scan of the entire
  table. If the table contains large amounts of data, this may be an 
  impractical approach (the first example on this page shows that a linear
  scan of 1.5 GB of data takes around 30 seconds using a modern PC).

-- The examples in this block assume the following FTS table:
CREATE VIRTUAL TABLE mail USING fts3(subject, body);

SELECT * FROM mail WHERE rowid = 15;                -- Fast. Rowid lookup.
SELECT * FROM mail WHERE body MATCH 'sqlite';       -- Fast. Full-text query.
SELECT * FROM mail WHERE mail n

ü
þy
KA‚UOSQLite FTS3 and FTS4 Extensions3. Full-text Index QueriesThe most useful thing about FTS tables is the queries that may be 
  performed using the built-in full-text index. Full-text queries are 
  performed by specifying a clause of the form 
  "&lt;column&gt; MATCH &lt;full-text query expression&gt;" as part of the WHERE 
  clause of a SELECT statement that reads data from an FTS table. 
  Simple FTS queries that return all documents that 
  contain a given term are describqþx     K[žiSQLite FTS3 and FTS4 Extensions2. Compiling and Enabling FTS3 and FTS4Although FTS3 and FTS4 are included with the SQLite core source code, they are not
  enabled by default. To build SQLite with FTS functionality enabled, define
  the preprocessor macro SQLITE_ENABLE_FTS3 when compiling. New applications
  should also define the SQLITE_ENABLE_FTS3_PARENTHESIS macro to enable the
  enhanced query syntax (see below). Usually, this is done by adding the 
  following two switches to the compiler command line:

-DSQLITE_ENABLE_FTS3
-DSQLITE_ENABLE_FTS3_PARENTHESIS



  Note that enabling FTS3 also makes FTS4 available.  There is not a separate
  SQLITE_ENABLE_FTS4 compile-time option.  A build of SQLite either supports
  both FTS3 and FTS4 or it supports neither.


  If using the amalgamation autoconf based build system, setting the CPPFLAGS
  environment variable while running the 'configure' script is an easy
  way to set these macros. For example, the following command:

CPPFLAGS="-DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS" ./configure &lt;configure options&gt;



  where &lt;configure options&gt; are those options normally passed to
  the configure script, if any.


  Because FTS3 and FTS4 are virtual tables, The SQLITE_ENABLE_FTS3 compile-time option
  is incompatible with the SQLITE_OMIT_VIRTUALTABLE option.


  If a build of SQLite does not include the FTS modules, then any attempt to prepare an
  SQL statement to create an FTS3 or FTS4 table or to drop or access an existing 
  FTS table in any way will fail. The error message returned will be similar 
  to "no such module: ftsN" (where N is either 3 or 4).


  If the C version of the ICU library
  is available, then FTS may also be compiled with the SQLITE_ENABLE_ICU
  pre-processor macro defined. Compiling with this macro enables an FTS
  tokenizer that uses the ICU library to split a document into terms
  (words) using the conventions for a specified language and locale.

-DSQLITE_ENABLE_ICUfts3.html#compiling_and_enabling_fts3_and_fts4red above. In that discussion the right-hand
  operand of the MATCH operator was assumed to be a string consisting of a
  single term. This section describes the more complex query types supported 
  by FTS tables, and how they may be utilized by specifying a more
  complex query expression as the right-hand operand of a MATCH operator.


  FTS tables support three basic query types:


  

  Token or token prefix queries. 
    An FTS table may be queried for all documents that contain a specified
    term (the simple case described above), or for
    all documents that contain a term with a specified prefix. As we have
    seen, the query expression for a specific term is simply the term itself.
    The query expression used to search for a term prefix is the prefix
    itself with a '*' character appended to it. For example:


-- Virtual table declaration
CREATE VIRTUAL TABLE docs USING fts3(title, body);

-- Query for all documents containing the term "linux":
SELECT * FROM docs WHERE docs MATCH 'linux';

-- Query for all documents containing a term with the prefix "lin". This will match
-- all documents that contain "linux", but also those that contain terms "linear",
--"linker", "linguistic" and so on.
SELECT * FROM docs WHERE docs MATCH 'lin*';



  
    Normally, a token or token prefix query is matched against the FTS table 
    column specified as the left-hand side of the MATCH operator. Or, if the
    special column with the same name as the FTS table itself is specified,
    against all columns. This may be overridden by specifying a column-name
    followed by a ":" character before a basic term query. There may be space
    between the ":" and the term to query for, but not between the column-name
    and the ":" character. For example:

   
-- Query the database for documents for which the term "linux" appears in
-- the document title, and the term "problems" appears in either the title
-- or body of the document.
SELECT * FROM docs WHERE docs MATCH 'title:linux problems';

-- Query the database for documents for which the term "linux" appears in
-- the document title, and the term "driver" appears in the body of the document
-- ("driver" may also appear in the title, but this alone will not satisfy the
-- query criteria).
SELECT * FROM docs WHERE body MATCH 'title:linux driver';



  
    If the FTS table is an FTS4 table (not FTS3), a token may also be prefixed
    with a "&#94;" character. In this case, in order to match the token must
    appear as the very first token in any column of the matching row. Examples:


-- All documents for which "linux" is the first token of at least one
-- column.
SELECT * FROM docs WHERE docs MATCH '&#94;linux';

-- All documents for which the first token in column "title" begins with "lin".
SELECT * FROM docs WHERE body MATCH 'title: &#94;lin*';





  Phrase queries.
    A phrase query is a query that retrieves all documents that contain a
    nominated set of terms or term prefixes in a specified order with no
    intervening tokens. Phrase queries are specified by enclosing a space
    separated sequence of terms or term prefixes in double quotes (").
    For example:


-- Query for all documents that contain the phrase "linux applications".
SELECT * FROM docs WHERE docs MATCH '"linux applications"';

-- Query for all documents that contain a phrase that matches "lin* app*". As well as
-- "linux applications", this will match common phrases such as "linoleum appliances"
-- or "link apprentice".
SELECT * FROM docs WHERE docs MATCH '"lin* app*"';





  NEAR queries. 
    A NEAR query is a query that returns documents that contain a two or
    more nominated terms or phrases within a specified proximity of each 
    other (by default with 10 or less intervening terms). A NEAR query is 
    specified by putting the keyword "NEAR" between two phrase, token or 
    token prefix queries. To specify a proximity other than the default,
    an operator of the form "NEAR/&lt;N&gt;" may be used, where
    &lt;N&gt; is the maximum number of intervening terms allowed.
    For example:


-- Virtual table declaration.
CREATE VIRTUAL TABLE docs USING fts4();

-- Virtual table data.
INSERT INTO docs VALUES('SQLite is an ACID compliant embedded relational database management system');

-- Search for a document that contains the terms "sqlite" and "database" with
-- not more than 10 intervening terms. This matches the only document in
-- table docs (since there are only six terms between "SQLite" and "database" 
-- in the document).
SELECT * FROM docs WHERE docs MATCH 'sqlite NEAR database';

-- Search for a document that contains the terms "sqlite" and "database" with
-- not more than 6 intervening terms. This also matches the only document in
-- table docs. Note that the order in which the terms appear in the document
-- does not have to be the same as the order in which they appear in the query.
SELECT * FROM docs WHERE docs MATCH 'database NEAR/6 sqlite';

-- Search for a document that contains the terms "sqlite" and "database" with
-- not more than 5 intervening terms. This query matches no documents.
SELECT * FROM docs WHERE docs MATCH 'database NEAR/5 sqlite';

-- Search for a document that contains the phrase "ACID compliant" and the term
-- "database" with not more than 2 terms separating the two. This matches the
-- document stored in table docs.
SELECT * FROM docs WHERE docs MATCH 'database NEAR/2 "ACID compliant"';

-- Search for a document that contains the phrase "ACID compliant" and the term
-- "sqlite" with not more than 2 terms separating the two. This also matches
-- the only document stored in table docs.
SELECT * FROM docs WHERE docs MATCH '"ACID compliant" NEAR/2 sqlite';



  
    More than one NEAR operator may appear in a single query. In this case each
    pair of terms or phrases separated by a NEAR operator must appear within the
    specified proximity of each other in the document. Using the same table and
    data as in the block of examples above:



-- The following query selects documents that contains an instance of the term 
-- "sqlite" separated by two or fewer terms from an instance of the term "acid",
-- which is in turn separated by two or fewer terms from an instance of the term
-- "relational".
SELECT * FROM docs WHERE docs MATCH 'sqlite NEAR/2 acid NEAR/2 relational';

-- This query matches no documents. There is an instance of the term "sqlite" with
-- sufficient proximity to an instance of "acid" but it is not sufficiently close
-- to an instance of the term "relational".
SELECT * FROM docs WHERE docs MATCH 'acid NEAR/2 sqlite NEAR/2 relational';



  Phrase and NEAR queries may not span multiple columns within a row.


  The three basic query types described above may be used to query the full-text
  index for the set of documents that match the specified criteria. Using the
  FTS query expression language it is possible to perform various set 
  operations on the results of basic queries. There are currently three 
  supported operations:


   The AND operator determines the intersection of two sets of documents.

   The OR operator calculates the union of two sets of documents.

   The NOT operator (or, if using the standard syntax, a unary "-" operator)
       may be used to compute the relative complement of one set of
       documents with respect to another.



  The FTS modules may be compiled to use one of two slightly different versions
  of the full-text query syntax, the "standard" query syntax and the "enhanced" 
  query syntax. The basic term, term-prefix, phrase and NEAR queries described 
  above are the same in both versions of the syntax. The way in which set 
  operations are specified is slightly different. The following two sub-sections 
  describe the part of the two query syntaxes that pertains to set operations. 
  Refer to the description of how to compile fts for compilation notes.fts3.html#full_text_index_queries
‚‚žyþz        Ky»QSQLite FTS3 and FTS4 Extensions3.1. 
  Set Operations Using The Enhanced Query SyntaxThe enhanced query syntax supports the AND, OR and NOT binary set operators.
  Each of the two operands to an operator may be a basic FTS query, or the
  result of another AND, OR or NOT set operation. Operators must be entered
  using capital letters. Otherwise, they are interpreted as basic term queries
  instead of set operators.


  The AND operator may be implicitly specified. If two basic queries appear 
  with no operator separating them in an FTS query string, the results are
  the same as if the two basic queries were separated by an AND operator.
  For example, the query expression "implicit operator" is a more succinct
  version of "implicit AND operator".

-- Virtual table declaration
CREATE VIRTUAL TABLE docs USING fts3();

-- Virtual table data
INSERT INTO docs(docid, content) VALUES(1, 'a database is a software system');
INSERT INTO docs(docid, content) VALUES(2, 'sqlite is a software system');
INSERT INTO docs(docid, content) VALUES(3, 'sqlite is a database');

-- Return the set of documents that contain the term "sqlite", and the
-- term "database". This query will return the document with docid 3 only.
SELECT * FROM docs WHERE docs MATCH 'sqlite AND database';

-- Again, return the set of documents that contain both "sqlite" and
-- "database". This time, use an implicit AND operator. Again, document
-- 3 is the only document matched by this query. 
SELECT * FROM docs WHERE docs MATCH 'database sqlite';

-- Query for the set of documents that contains either "sqlite" or "database".
-- All three documents in the database are matched by this query.
SELECT * FROM docs WHERE docs MATCH 'sqlite OR database';

-- Query for all documents that contain the term "database", but do not contain
-- the term "sqlite". Document 1 is the only document that matches this criteria.
SELECT * FROM docs WHERE docs MATCH 'database NOT sqlite';

-- The following query matches no documents. Because "and" is in lowercase letters,
-- it is interpreted as a basic term query instead of an operator. Operators must
-- be specified using capital letters. In practice, this query will match any documents
-- that contain each of the three terms "database", "and" and "sqlite" at least once.
-- No documents in the example data above match this criteria.
SELECT * FROM docs WHERE docs MATCH 'database and sqlite';



  The examples above all use basic full-text term queries as both operands of 
  the set operations demonstrated. Phrase and NEAR queries may also be used,
  as may the results of other set operations. When more than one set operation
  is present in an FTS query, the precedence of operators is as follows:


  OperatorEnhanced Query Syntax Precedence
  NOT  Highest precedence (tightest grouping).
  AND 
  OR   Lowest precedence (loosest grouping).



  When using the enhanced query syntax, parenthesis may be used to override
  the default precedence of the various operators. For example:

-- Return the docid values associated with all documents that contain the
-- two terms "sqlite" and "database", and/or contain the term "library".
SELECT docid FROM docs WHERE docs MATCH 'sqlite AND database OR library';

-- This query is equivalent to the above.
SELECT docid FROM docs WHERE docs MATCH 'sqlite AND database'
  UNION
SELECT docid FROM docs WHERE docs MATCH 'library';

-- Query for the set of documents that contains the term "linux", and at least
-- one of the phrases "sqlite database" and "sqlite library".
SELECT docid FROM docs WHERE docs MATCH '("sqlite database" OR "sqlite library") AND linux';

-- This query is equivalent to the above.
SELECT docid FROM docs WHERE docs MATCH 'linux'
  INTERSECT
SELECT docid FROM (
  SELECT docid FROM docs WHERE docs MATCH '"sqlite library"'
    UNION
  SELECT docid FROM docs WHERE docs MATCH '"sqlite database"'
);fts3.html#_set_operations_using_the_enhanced_query_syntax
ååþ{       Ksž}SQLite FTS3 and FTS4 Extensions3.2. Set Operations Using The Standard Query SyntaxFTS query set operations using the standard query syntax are similar, but
  not identical, to set operations with the enhanced query syntax. There
  are four differences, as follows:


   Only the implicit version of the AND operator is supported.
    Specifying the string "AND" as part of a standard query syntax query is
    interpreted as a term query for the set of documents containing the term 
    "and".



   Parenthesis are not supported.



   The NOT operator is not supported. Instead of the NOT 
    operator, the standard query syntax supports a unary "-" operator that
    may be applied to basic term and term-prefix queries (but not to phrase
    or NEAR queries). A term or term-prefix that has a unary "-" operator
    attached to it may not appear as an operand to an OR operator. An FTS
    query may not consist entirely of terms or term-prefix queries with unary
    "-" operators attached to them.


-- Search for the set of documents that contain the term "sqlite" but do
-- not contain the term "database".
SELECT * FROM docs WHERE docs MATCH 'sqlite -database';



   The relative precedence of the set operations is different. 
   In particular, using the standard query syntax the "OR" operator has a
   higher precedence than "AND". The precedence of operators when using the
   standard query syntax is: 



  OperatorStandard Query Syntax Precedence
  Unary "-"  Highest precedence (tightest grouping).
  OR  
  AND  Lowest precedence (loosest grouping).



  The following example illustrates precedence of operators using the standard 
  query syntax:


-- Search for documents that contain at least one of the terms "database"
-- and "sqlite", and also contain the term "library". Because of the differences
-- in operator precedences, this query would have a different interpretation using
-- the enhanced query syntax.
SELECT * FROM docs WHERE docs MATCH 'sqlite OR database library';fts3.html#set_operations_using_the_standard_query_syntax
ÕÕ”&þ|
K{¦#SQLite FTS3 and FTS4 Extensions4. Auxiliary Functions - Snippet, Offsets and MatchinfoThe FTS3 and FTS4 modules provide three special SQL scalar functions that may be useful
  to the developers of full-text query systems: "snippet", "offsets" and
  "matchinfo". The purpose of the "snippet" and "offsets" functions is to allow
  the user to identify the location of queried terms in the returned documents.
  The "matchinfo" function provides the user with metrics that may be useful
  for filtering or sorting query results according to relevance.


  The first argument to all three special SQL scalar functions
  must be the FTS hidden column of the FTS table that the function is
  applied to.  The FTS hidden column is an automatically-generated column found on
  all FTS tables that has the same name as the FTS table itself.
  For example, given an FTS table named "mail":

SELECT offsets(mail) FROM mail WHERE mail MATCH &lt;full-text query expression&gt;;
SELECT snippet(mail) FROM mail WHERE mail MATCH &lt;full-text query expression&gt;;
SELECT matchinfo(mail) FROM mail WHERE mail MATCH &lt;full-text query expression&gt;;



  The three auxiliary functions are only useful within a SELECT statement that
  uses the FTS table's full-text index. If used within a SELECT that uses
  the "query by rowid" or "linear scan" strategies, then the snippet and
  offsets both return an empty string, and the matchinfo function returns
  a blob value zero bytes in size.


  All three auxiliary functions extract a set of "matchable phrases" from
  the FTS query expression to work with. The set of matchable phrases for
  a given query consists of all phrases (including unquoted tokens and
  token prefixes) in the expression except those that are prefixed with
  a unary "-" operator (standard syntax) or are part of a sub-expression 
  that is used as the right-hand operand of a NOT operator.


  With the following provisos, each series of tokens in the FTS table that
  matches one of the matchable phrases in the query expression is known as a
  "phrase match":


   If a matchable phrase is part of a series of phrases connected by
       NEAR operators in the FTS query expression, then each phrase match
       must be sufficiently close to other phrase matches of the relevant
       types to satisfy the NEAR condition.

   If the matchable phrase in the FTS query is restricted to matching
       data in a specified FTS table column, then only phrase matches that 
       occur within that column are considered.fts3.html#auxiliary_functions_snippet_offsets_and_matchinfo
ÿÚÿ©Nþ~ K?ÑkISQLite FTS3 and FTS4 Extensions4.2. The Snippet FunctionThe snippet function is used to create formatted fragments of document text
  for display as part of a full-text query results report. The snippet function 
  may be passed between one and six arguments, as follows:


  Argument Default Value Description
  0 N/A
       The first argument to the snippet function must always be the FTS hidden column
           of the FTS table being queried and from which the snippet is to be taken.  The
           FTS hidden column is an automatically generated column with the same name as the
           FTS table itself.
  1 "&lt;b&gt;"
       The "start match" text.
  2 "&lt;/b&gt;"
       The "end match" text.
  3 "&lt;b&gt;...&lt;/b&gt;"
       The "ellipses" text.
  4 -1
       The FTS table column number to extract the returned fragments of
           text from. Columns are numbered from left to right starting with
           zero. A negative value indicates that the text may be extracted
           from any column.
  5 -15
       The absolute value of this integer argument is used as the 
           (approximate) number of tokens to include in the returned text 
           value. The maximum allowable absolute vw’!þ}     K?£ISQLite FTS3 and FTS4 Extensions4.1. The Offsets FunctionFor a SELECT query that uses the full-text index, the offsets() function 
  returns a text value containing a series of space-separated integers. For
  each term in each phrase match of the current row, 
  there are four integers in the returned list. Each set of four integers is 
  interpreted as follows:


  Integer Interpretation
  0 
      The column number that the term instance occurs in (0 for the
          leftmost column of the FTS table, 1 for the next leftmost, etc.).
  1
      The term number of the matching term within the full-text query
          expression. Terms within a query expression are numbered starting
          from 0 in the order that they occur.
  2
      The byte offset of the matching term within the column.
  3
      The size of the matching term in bytes.



  The following block contains examples that use the offsets function.

CREATE VIRTUAL TABLE mail USING fts3(subject, body);
INSERT INTO mail VALUES('hello world', 'This message is a hello world message.');
INSERT INTO mail VALUES('urgent: serious', 'This mail is seen as a more serious mail');

-- The following query returns a single row (as it matches only the first
-- entry in table "mail". The text returned by the offsets function is
-- "0 0 6 5 1 0 24 5".
--
-- The first set of four integers in the result indicate that column 0
-- contains an instance of term 0 ("world") at byte offset 6. The term instance
-- is 5 bytes in size. The second set of four integers shows that column 1
-- of the matched row contains an instance of term 0 ("world") at byte offset
-- 24. Again, the term instance is 5 bytes in size.
SELECT offsets(mail) FROM mail WHERE mail MATCH 'world';

-- The following query returns also matches only the first row in table "mail".
-- In this case the returned text is "1 0 5 7 1 0 30 7".
SELECT offsets(mail) FROM mail WHERE mail MATCH 'message';

-- The following query matches the second row in table "mail". It returns the
-- text "1 0 28 7 1 1 36 4". Only those occurrences of terms "serious" and "mail"
-- that are part of an instance of the phrase "serious mail" are identified; the
-- other occurrences of "serious" and "mail" are ignored.
SELECT offsets(mail) FROM mail WHERE mail MATCH '"serious mail"';fts3.html#the_offsets_functionalue is 64. The value of
           this argument is referred to as N in the discussion below.



  The snippet function first attempts to find a fragment of text consisting
  of |N| tokens within the current row that contains at least one phrase 
  match for each matchable phrase matched somewhere in the current row, 
  where |N| is the absolute value of the sixth argument passed to the
  snippet function. If the text stored in a single column contains less than
  |N| tokens, then the entire column value is considered. Text fragments 
  may not span multiple columns.


  If such a text fragment can be found, it is returned with the following
  modifications:


   If the text fragment does not begin at the start of a column value,
       the "ellipses" text is prepended to it.
   If the text fragment does not finish at the end of a column value,
       the "ellipses" text is appended to it.
   For each token in the text fragment that is part of a phrase match,
       the "start match" text is inserted into the fragment before the token,
       and the "end match" text is inserted immediately after it.



  If more than one such fragment can be found, then fragments that contain
  a larger number of "extra" phrase matches are favored. The start of
  the selected text fragment may be moved a few tokens forward or backward
  to attempt to concentrate the phrase matches toward the center of the
  fragment.


  Assuming N is a positive value, if no fragments can be found that
  contain a phrase match corresponding to each matchable phrase, the snippet
  function attempts to find two fragments of approximately N/2 tokens
  that between them contain at least one phrase match for each matchable phrase
  matched by the current row. If this fails, attempts are made to find three
  fragments of N/3 tokens each and finally four N/4 token
  fragments. If a set of four fragments cannot be found that encompasses the
  required phrase matches, the four fragments of N/4 tokens that provide
  the best coverage are selected.


  If N is a negative value, and no single fragment can be found 
  containing the required phrase matches, the snippet function searches
  for two fragments of |N| tokens each, then three, then four. In
  other words, if the specified value of N is negative, the sizes
  of the fragments is not decreased if more than one fragment is required
  to provide the desired phrase match coverage.


  After the M fragments have been located, where M is between
  two and four as described in the paragraphs above, they are joined together
  in sorted order with the "ellipses" text separating them. The three 
  modifications enumerated earlier are performed on the text before it is 
  returned.

Note: In this block of examples, newlines and whitespace characters have
been inserted into the document inserted into the FTS table, and the expected
results described in SQL comments. This is done to enhance readability only,
they would not be present in actual SQLite commands or output.

-- Create and populate an FTS table.
CREATE VIRTUAL TABLE text USING fts4();
INSERT INTO text VALUES('
  During 30 Nov-1 Dec, 2-3oC drops. Cool in the upper portion, minimum temperature 14-16oC 
  and cool elsewhere, minimum temperature 17-20oC. Cold to very cold on mountaintops, 
  minimum temperature 6-12oC. Northeasterly winds 15-30 km/hr. After that, temperature 
  increases. Northeasterly winds 15-30 km/hr.     
');

-- The following query returns the text value:
--
--   "&lt;b&gt;...&lt;/b&gt;cool elsewhere, minimum temperature 17-20oC. &lt;b&gt;Cold&lt;/b&gt; to very 
--    &lt;b&gt;cold&lt;/b&gt; on mountaintops, minimum temperature 6&lt;b&gt;...&lt;/b&gt;".
--
SELECT snippet(text) FROM text WHERE text MATCH 'cold';

-- The following query returns the text value:
--
--   "...the upper portion, &#91;minimum&#93; &#91;temperature&#93; 14-16oC and cool elsewhere,
--    &#91;minimum&#93; &#91;temperature&#93; 17-20oC. Cold..."
--
SELECT snippet(text, '&#91;', '&#93;', '...') FROM text WHERE text MATCH '"min* tem*"'fts3.html#the_snippet_functiony the current row, the number of times the phrase appears in 
             the column.
         The total number of times the phrase appears in the column in
             all rows in the FTS table.
         The total number of rows in the FTS table for which the 
             column contains at least one instance of the phrase.
      
      The first set of three values corresponds to the left-most column
      of the table (column 0) and the left-most matchable phrase in the
      query (phrase 0). If the table has more than one column, the second
      set of three values in the output array correspond to phrase 0 and
      column 1. Followed by phrase 0, column 2 and so on for all columns of
      the table. And so on for phrase 1, column 0, then phrase 1, column 1
      etc. In other words, the data for occurrences of phrase p in
      column c may be found using the following formula:

          hits_this_row  = array&#91;3 * (c + p*cols) + 0&#93;
          hits_all_rows  = array&#91;3 * (c + p*cols) + 1&#93;
          docs_with_hits = array&#91;3 * (c + p*cols) + 2&#93;

  ycols * phrases 
    

      For each distinct combination of a phrase and table column, the
      number of usable phrase matches that appear in the column. This is
      usually identical to the first value in each set of three returned by the
      matchinfo 'x' flag. However, the number of hits reported by the
      'y' flag is zero for any phrase that is part of a sub-expression
      that does not match the current row. This makes a difference for
      expressions that contain AND operators that are descendants of OR
      operators. For example, consider the expression: 

          a OR (b AND c)

      and the document:

          "a c d"

      The matchinfo 'x' flag would report a single hit for the phrases "a" and "c".
      However, the 'y' directive reports the number of hits for "c" as zero, as
      it is part of a sub-expression that does not match the document - (b AND c).
      For queries that do not contain AND operators descended from OR
      operators, the result values returned by 'y' are always the same as
      those returned by 'x'.


      The first value in the array of integer values corresponds to the
      leftmost column of the table (column 0) and the first phrase in the query
      (phrase 0). The values corresponding to other column/phrase combinations
      may be located using the following formula:


          hits_for_phrase_p_column_c  = array&#91;c + p*cols&#93;

      For queries that use OR expressions, or those that use LIMIT or return
      many rows, the 'y' matchinfo option may be faster than 'x'.

b((cols+31)/32) * phrases 



  The matchinfo 'b' flag provides similar information to the
  matchinfo 'y' flag, but in a more
  compact form. Instead of the precise number of hits, 'b' provides a single
  boolean flag for each phrase/column combination. If the phrase is present in
  the column at least once (i.e. if the corresponding integer output of 'y' would
  be non-zero), the corresponding flag is set. Otherwise cleared.


  If the table has 32 or fewer columns, a single unsigned integer is output for
  each phrase in the query. The least significant bit of the integer is set if the
  phrase appears at least once in column 0. The second least significant bit is
  set if the phrase appears once or more in column 1. And so on.


  If the table has more than 32 columns, an extra integer is added to the output
  of each phrase for each extra 32 columns or part thereof. Integers
  corresponding to the same phrase are clumped together. For example, if a table
  with 45 columns is queried for two phrases, 4 integers are output. The first
  corresponds to phrase 0 and columns 0-31 of the table. The second integer
  contains data for phrase 0 and columns 32-44, and so on.


  For example, if nCol is the number of columns in the table, to determine if
  phrase p is present in column c:


    p_is_in_c = array&#91;p * ((nCol+31)/32)&#93; & (1 &lt;&lt; (c % 32))


  n 1 The number of rows in the FTS4 table. This value is
    only available when querying FTS4 tables, not FTS3.
  a cols For each column, the average number of
    tokens in the text values stored in the column (considering all rows in
    the FTS4 table). This value is only available when querying FTS4 tables,
    not FTS3.  
  l cols 
    For each column, the length of the value stored in the current row of the
    FTS4 table, in tokens.  This value is only available when querying
    FTS4 tables, not FTS3. And only if the "matchinfo=fts3" directive was not
    specified as part of the "CREATE VIRTUAL TABLE" statement used to create
    the FTS4 table.
  s cols For each column, the length of the longest 
    subsequence of phrase matches that the column value has in common
    with the query text. For example, if a table column contains the text
    'a b c d e' and the query is 'a c "d e"', then the length of the longest
    common subsequence is 2 (phrase "c" followed by phrase "d e").
    
    



  For example:

-- Create and populate an FTS4 table with two columns:
CREATE VIRTUAL TABLE t1 USING fts4(a, b);
INSERT INTO t1 VALUES('transaction default models default', 'Non transaction reads');
INSERT INTO t1 VALUES('the default transaction', 'these semantics present');
INSERT INTO t1 VALUES('single request', 'default data');

-- In the following query, no format string is specified and so it defaults
-- to "pcx". It therefore returns a single row consisting of a single blob
-- value 80 bytes in size (20 32-bit integers - 1 for "p", 1 for "c" and
-- 3*2*3 for "x"). If each block of 4 bytes in the blob is interpreted 
-- as an unsigned integer in machine byte-order, the values will be:
--
--     3 2  1 3 2  0 1 1  1 2 2  0 1 1  0 0 0  1 1 1
--
-- The row returned corresponds to the second entry inserted into table t1.
-- The first two integers in the blob show that the query contained three
-- phrases and the table being queried has two columns. The next block of
-- three integers describes column 0 (in this case column "a") and phrase
-- 0 (in this case "default"). The current row contains 1 hit for "default"
-- in column 0, of a total of 3 hits for "default" that occur in column
-- 0 of any table row. The 3 hits are spread across 2 different rows.
--
-- The next set of three integers (0 1 1) pertain to the hits for "default"
-- in column 1 of the table (0 in this row, 1 in all rows, spread across 
-- 1 rows).
--
SELECT matchinfo(t1) FROM t1 WHERE t1 MATCH 'default transaction "these semantics"';

-- The format string for this query is "ns". The output array will therefore
-- contain 3 integer values - 1 for "n" and 2 for "s". The query returns
-- two rows (the first two rows in the table match). The values returned are:
--
--     3  1 1
--     3  2 0
--
-- The first value in the matchinfo array returned for both rows is 3 (the 
-- number of rows in the table). The following two values are the lengths 
-- of the longest common subsequence of phrase matches in each column.
SELECT matchinfo(t1, 'ns') FROM t1 WHERE t1 MATCH 'default transaction';



  The matchinfo function is much faster than either the snippet or offsets
  functions. This is because the implementation of both snippet and offsets
  is required to retrieve the documents being analyzed from disk, whereas
  all data required by matchinfo is available as part of the same portions
  of the full-text index that are required to implement the full-text query
  itself. This means that of the following two queries, the first may be
  an order of magnitude faster than the second:

SELECT docid, matchinfo(tbl) FROM tbl WHERE tbl MATCH &lt;query expression&gt;;
SELECT docid, offsets(tbl) FROM tbl WHERE tbl MATCH &lt;query expression&gt;;



  The matchinfo function provides all the information required to calculate
  probabilistic "bag-of-words" relevancy scores such as 
  Okapi BM25/BM25F that may
  be used to order results in a full-text search application. Appendix A of this 
  document, "search application tips", contains an example of using the
  matchinfo() function efficiently.fts3.html#matchinfo
~Üp~£>ÿ K+Åo9SQLite FTS3 and FTS4 Extensions6. FTS4 OptionsIf the "CREATE VIRTUAL TABLE" statement specifies module FTS4 (not FTS3), 
  then special directives - FTS4 options - similar to the "tokenize=*" option
  may also appear in place of column names. An FTS4 option consists of the
  option name, followed by an "=" character, followed by the option value.
  The option value may optionally be enclosed in single or double quotes, with
  embedded quote characters escaped in the same way |ª_ÿ   KoÓw/SQLite FTS3 and FTS4 Extensions5. Fts4aux - Direct Access to the Full-Text IndexAs of version 3.7.6 (2011-04-12), 
  SQLite includes a new virtual table module called 
  "fts4aux", which can be used to inspect the full-text index of an existing
  FTS table directly. Despite its name, fts4aux works just as well with FTS3
  tables as it does with FTS4 tables. Fts4aux tables are read-only. The only
  way to modify the contents of an fts4aux table is by modifying the
  contents of the associated FTS table. The fts4aux module is automatically
  included in all builds that include FTS.


  An fts4aux virtual table is constructed with one or two arguments.  When
  used with a single argument, that argument is the unqualified name of the
  FTS table that it will be used to access.  To access a table in a different
  database (for example, to create a TEMP fts4aux table that will access an
  FTS3 table in the MAIN database) use the two-argument form and give the
  name of the target database (ex: "main") in the first argument and the name
  of the FTS3/4 table as the second argument.  (The two-argument form of 
  fts4aux was added for SQLite version 3.7.17 (2013-05-20)
  and will throw an error in prior releases.)
  For example:

-- Create an FTS4 table
CREATE VIRTUAL TABLE ft USING fts4(x, y);

-- Create an fts4aux table to access the full-text index for t{Îþ
KC›3SQLite FTS3 and FTS4 Extensions4.3. The Matchinfo FunctionThe matchinfo function returns a blob value. If it is used within a query
  that does not use the full-text index (a "query by rowid" or "linear scan"),
  then the blob is zero bytes in size. Otherwise, the blob consists of zero
  or more 32-bit unsigned integers in machine byte-order. The exact number
  of integers in the returned array depends on both the query and the value
  of the second argument (if any) passed to the matchinfo function.


  The matchinfo function is called with either one or two arguments. As for
  all auxiliary functions, the first argument must be the special 
  FTS hidden column. The second argument, if it is specified, must be a text value
  comprised only of the characters 'p', 'c', 'n', 'a', 'l', 's', 'x', 'y' and 'b'.
  If no second argument is explicitly supplied, it defaults to "pcx". The
  second argument is referred to as the "format string" below.


  Characters in the matchinfo format string are processed from left to right. 
  Each character in the format string causes one or more 32-bit unsigned
  integer values to be added to the returned array. The "values" column in
  the following table contains the number of integer values appended to the
  output buffer for each supported format string character. In the formula
  given, cols is the number of columns in the FTS table, and 
  phrases is the number of matchable phrases in 
  the query. 


  CharacterValuesDescription
  p 1 The number of matchable phrases in the query.
  c 1 The number of user defined columns in the FTS
    table (i.e. not including the docid or the FTS hidden column).
  x 3 * cols * phrases 
    

      For each distinct combination of a phrase and table column, the
      following three values:
      
         Inxable "ft"
CREATE VIRTUAL TABLE ft_terms USING fts4aux(ft);

-- Create a TEMP fts4aux table accessing the "ft" table in "main"
CREATE VIRTUAL TABLE temp.ft_terms_2 USING fts4aux(main,ft);



  For each term present in the FTS table, there are between 2 and N+1 rows
  in the fts4aux table, where N is the number of user-defined columns in
  the associated FTS table. An fts4aux table always has the same four columns, 
  as follows, from left to right:


  Column NameColumn Contents
  term 
    Contains the text of the term for this row.
  col 
    This column may contain either the text value '*' (i.e. a single 
    character, U+002a) or an integer between 0 and N-1, where N is
    again the number of user-defined columns in the corresponding FTS table.

  documents
    This column always contains an integer value greater than zero.
    
    If the "col" column contains the value '*', then this column
    contains the number of rows of the FTS table that contain at least one
    instance of the term (in any column). If col contains an integer
    value, then this column contains the number of rows of the FTS table that
    contain at least one instance of the term in the column identified by
    the col value. As usual, the columns of the FTS table are numbered
    from left to right, starting with zero.

  occurrences
    This column also always contains an integer value greater than zero.
    
    If the "col" column contains the value '*', then this column
    contains the total number of instances of the term in all rows of the 
    FTS table (in any column). Otherwise, if col contains an integer
    value, then this column contains the total number of instances of the
    term that appear in the FTS table column identified by the col
    value.

  languageid (hidden)
    

    This column determines which languageid is used to
    extract vocabulary from the FTS3/4 table.
    
    The default value for languageid is 0.  If an alternative language
    is specified in WHERE clause constraints, then that alternative is
    used instead of 0.  There can only be a single languageid per query.
    In other words, the WHERE clause cannot contain a range constraint
    or IN operator on the languageid.



  For example, using the tables created above:

INSERT INTO ft(x, y) VALUES('Apple banana', 'Cherry');
INSERT INTO ft(x, y) VALUES('Banana Date Date', 'cherry');
INSERT INTO ft(x, y) VALUES('Cherry Elderberry', 'Elderberry');

-- The following query returns this data:
--
--     apple       |  *  |  1  |  1
--     apple       |  0  |  1  |  1
--     banana      |  *  |  2  |  2
--     banana      |  0  |  2  |  2
--     cherry      |  *  |  3  |  3
--     cherry      |  0  |  1  |  1
--     cherry      |  1  |  2  |  2
--     date        |  *  |  1  |  2
--     date        |  0  |  1  |  2
--     elderberry  |  *  |  1  |  2
--     elderberry  |  0  |  1  |  1
--     elderberry  |  1  |  1  |  1
--
SELECT term, col, documents, occurrences FROM ft_terms;



  In the example, the values in the "term" column are all lower case, 
  even though they were inserted into table "ft" in mixed case. This is because
  an fts4aux table contains the terms as extracted from the document text
  by the tokenizer. In this case, since table "ft" uses the 
  simple tokenizer, this means all terms have been folded to
  lower case. Also, there is (for example) no row with column "term"
  set to "apple" and column "col" set to 1. Since there are no instances
  of the term "apple" in column 1, no row is present in the fts4aux table.


  During a transaction, some of the data written to an FTS table may be 
  cached in memory and written to the database only when the transaction is 
  committed. However the implementation of the fts4aux module is only able 
  to read data from the database. In practice this means that if an fts4aux 
  table is queried from within a transaction in which the associated 
  FTS table has been modified, the results of the query are likely to reflect 
  only a (possibly empty) subset of the changes made.fts3.html#fts4auxas for SQL literals. There
  may not be whitespace on either side of the "=" character. For example,
  to create an FTS4 table with the value of option "matchinfo" set to "fts3":

-- Create a reduced-footprint FTS4 table.
CREATE VIRTUAL TABLE papers USING fts4(author, document, matchinfo=fts3);



  FTS4 currently supports the following options:


  OptionInterpretation
  compress
    The compress option is used to specify the compress function. It is an error to
    specify a compress function without also specifying an uncompress
    function. See below for details.

  content
    The content allows the text being indexed to be
    stored in a separate table distinct from the FTS4 table,
    or even outside of SQLite.

  languageid
    The languageid option causes the FTS4 table to have an additional hidden
    integer column that identifies the language of the text contained in
    each row.  The use of the languageid option allows the same FTS4 table
    to hold text in multiple languages or scripts, each with different tokenizer
    rules, and to query each language independently of the others.
    
  matchinfo 
    When set to the value "fts3", the matchinfo option reduces the amount of
    information stored by FTS4 with the consequence that the "l" option of
    matchinfo() is no longer available.

  notindexed 
    This option is used to specify the name of a column for which data is
    not indexed. Values stored in columns that are not indexed are not
    matched by MATCH queries. Nor are they recognized by auxiliary functions.
    A single CREATE VIRTUAL TABLE statement may have any number of notindexed 
    options.

  order
    

    The "order" option may be set to either "DESC" or "ASC" (in upper or
    lower case). If it is set to "DESC", then FTS4 stores its data in such
    a way as to optimize returning results in descending order by docid.
    If it is set to "ASC" (the default), then the data structures are 
    optimized for returning results in ascending order by docid.  In other
    words, if many of the queries run against the FTS4 table use "ORDER BY
    docid DESC", then it may improve performance to add the "order=desc" 
    option to the CREATE VIRTUAL TABLE statement.

  prefix
    This option may be set to a comma-separated list of positive non-zero 
    integers. For each integer N in the list, a separate index is created
    in the database file to optimize prefix queries where
    the query term is N bytes in length, not including the '*' character,
    when encoded using UTF-8. See below for details.

  uncompress
    This option is used to specify the uncompress function. It is an error to
    specify an uncompress function without also specifying a compress
    function. See below for details.



  When using FTS4, specifying a column name that contains an "=" character
  and is not either a "tokenize=*" specification or a recognized FTS4 option
  is an error. With FTS3, the first token in the unrecognized directive is 
  interpreted as a column name. Similarly, specifying multiple "tokenize=*"
  directives in a single table declaration is an error when using FTS4, whereas
  the second and subsequent "tokenize=*" directives are interpreted as column
  names by FTS3. For example:

-- An error. FTS4 does not recognize the directive "xyz=abc".
CREATE VIRTUAL TABLE papers USING fts4(author, document, xyz=abc);

-- Create an FTS3 table with three columns - "author", "document"
-- and "xyz".
CREATE VIRTUAL TABLE papers USING fts3(author, document, xyz=abc);

-- An error. FTS4 does not allow multiple tokenize=* directives
CREATE VIRTUAL TABLE papers USING fts4(tokenize=porter, tokenize=simple);

-- Create an FTS3 table with a single column named "tokenize". The
-- table uses the "porter" tokenizer.
CREATE VIRTUAL TABLE papers USING fts3(tokenize=porter, tokenize=simple);

-- An error. Cannot create a table with two columns named "tokenize".
CREATE VIRTUAL TABLE papers USING fts3(tokenize=porter, tokenize=simple, tokenize=icu);fts3.html#fts4_options
æaæ„vÿ       K?ˆ=GSQLite FTS3 and FTS4 Extensions6.2. The content= option The content option allows FTS4 to forego storing the text being indexed.
  The content option can be used in two ways:


 The indexed documents are not stored within the SQLite database 
        at all (a "contentless" FTS4 table), or

 The indexed documents are stored in a database table created and
        managed by the user (an "external content" FTS4 table).



  Because the indexed documents themselves are usually much larger than 
  the full-text index, the content option can be used to achieve 
  significant space savings.fts3.html#the_content_option_‘ÿ  Ka CgSQLite FTS3 and FTS4 Extensions6.1. The compress= and uncompress= optionsThe compress and uncompress options allow FTS4 content to be stored in
  the database in a compressed form. Both options should be set to the name
  of an SQL scalar function registered using sqlite3_create_function()
  that accepts a single argument. 


  The compress function should return a compressed version of the value 
  passed to it as an argument. Each time data is written to the FTS4 table, 
  each column value is passed to the compress function and the result value 
  stored in the database. The compress function may return any type of SQLite 
  value (blob, text, real, integer or null).


  The uncompress function should uncompress data previously compressed by
  the compress function. In other words, for all SQLite values X, it should
  be true that uncompress(compress(X)) equals X. When data that has been
  compressed by the compress function is read from the database by FTS4, it
  is passed to the uncompress function before it is used.


  If the specified compress or uncompress functions do not exist, the table
  may still be created. An error is not returned until the FTS4 table is
  read (if the uncompress function does not exist) or written (if it is the 
  compress function that does not exist).

-- Create an FTS4 table that stores data in compressed form. This
-- assumes that the scalar functions zip() and unzip() have been (or
-- will be) added to the database handle.
CREATE VIRTUAL TABLE papers USING fts4(author, document, compress=zip, uncompress=unzip);



  When implementing the compress and uncompress functions it is important to
  pay attention to data types. Specifically, when a user reads a value from
  a compressed FTS table, the value returned by FTS is exactly the same
  as the value returned by the uncompress function, including the data type.
  If that data type is not the same as the data type of the original value as
  passed to the compress function (for example if the uncompress function is
  returning BLOB when compress was originally passed TEXT), then the users
  query may not function as expected.fts3.html#the_compress_and_uncompress_options
88Cÿ KM=SSQLite FTS3 and FTS4 Extensions6.2.1.  Contentless FTS4 Tables In order to create an FTS4 table that does not store a copy of the indexed
  documents at all, the content option should be set to an empty string.
  For example, the following SQL creates such an FTS4 table with three
  columns - "a", "b", and "c":

CREATE VIRTUAL TABLE t1 USING fts4(content="", a, b, c);



  Data can be inserted into such an FTS4 table using an INSERT statements.
  However, unlike ordinary FTS4 tables, the user must supply an explicit
  integer docid value. For example:

-- This statement is Ok:
INSERT INTO t1(docid, a, b, c) VALUES(1, 'a b c', 'd e f', 'g h i');

-- This statement causes an error, as no docid value has been provided:
INSERT INTO t1(a, b, c) VALUES('j k l', 'm n o', 'p q r');



  It is not possible to UPDATE or DELETE a row stored in a contentless FTS4
  table. Attempting to do so is an error.


  Contentless FTS4 tables also support SELECT statements. However, it is
  an error to attempt to retrieve the value of any table column other than
  the docid column. The auxiliary function matchinfo() may be used, but
  snippet() and offsets() may not. For example:

-- The following statements are Ok:
SELECT docid FROM t1 WHERE t1 MATCH 'xxx';
SELECT docid FROM t1 WHERE a MATCH 'xxx';
SELECT matchinfo(t1) FROM t1 WHERE t1 MATCH 'xxx';

-- The following statements all cause errors, as the value of columns
-- other than docid are required to evaluate them.
SELECT * FROM t1;
SELECT a, b FROM t1 WHERE t1 MATCH 'xxx';
SELECT docid FROM t1 WHERE a LIKE 'xxx%';
SELECT snippet(t1) FROM t1 WHERE t1 MATCH 'xxx';



  Errors related to attempting to retrieve column values other than docid
  are runtime errors that occur within sqlite3_step(). In some cases, for
  example if the MATCH expression in a SELECT query matches zero rows, there
  may be no error at all even if a statement does refer to column values 
  other than docid.fts3.html#_contentless_fts4_tables_ This is because the
-- full-text index still indicates that the row with docid=3 matches
-- the FTS4 query 'k', even though the documents stored in the content
-- table have been modified.
--
UPDATE t2 SET b = 'xxx', c = 'yyy' WHERE rowid = 3;
SELECT * FROM t3 WHERE t3 MATCH 'k';

-- Following the DELETE below, the query returns one row containing two
-- NULL values. NULL values are returned because FTS is unable to find
-- a row with rowid=3 within the content table.
--
DELETE FROM t2;
SELECT * FROM t3 WHERE t3 MATCH 'k';



  When a row is deleted from an external content FTS4 table, FTS4 needs to
  retrieve the column values of the row being deleted from the content table.
  This is so that FTS4 can update the full-text index entries for each token
  that occurs within the deleted row to indicate that row has been 
  deleted. If the content table row cannot be found, or if it contains values
  inconsistent with the contents of the FTS index, the results can be difficult
  to predict. The FTS index may be left containing entries corresponding to the
  deleted row, which can lead to seemingly nonsensical results being returned
  by subsequent SELECT queries. The same applies when a row is updated, as
  internally an UPDATE is the same as a DELETE followed by an INSERT.


  This means that in order to keep an FTS in sync with an external content
  table, any UPDATE or DELETE operations must be applied first to the FTS
  table, and then to the external content table. For example:

CREATE TABLE t1_real(id INTEGER PRIMARY KEY, a, b, c, d);
CREATE VIRTUAL TABLE t1_fts USING fts4(content="t1_real", b, c);

-- This works. When the row is removed from the FTS table, FTS retrieves 
-- the row with rowid=123 and tokenizes it in order to determine the entries 
-- that must be removed from the full-text index.
-- 
DELETE FROM t1_fts WHERE rowid = 123;
DELETE FROM t1_real WHERE rowid = 123;

-- This does not work. By the time the FTS table is updated, the row
-- has already been deleted from the underlying content table. As a result
-- FTS is unable to determine the entries to remove from the FTS index and
-- so the index and content table are left out of sync.
--
DELETE FROM t1_real WHERE rowid = 123;
DELETE FROM t1_fts WHERE rowid = 123;


  
  Instead of writing separately to the full-text index and the content table,
  some users may wish to use database triggers to keep the full-text index
  up to date with respect to the set of documents stored in the content table.
  For example, using the tables from earlier examples:

CREATE TRIGGER t2_bu BEFORE UPDATE ON t2 BEGIN
  DELETE FROM t3 WHERE docid=old.rowid;
END;
CREATE TRIGGER t2_bd BEFORE DELETE ON t2 BEGIN
  DELETE FROM t3 WHERE docid=old.rowid;
END;

CREATE TRIGGER t2_au AFTER UPDATE ON t2 BEGIN
  INSERT INTO t3(docid, b, c) VALUES(new.rowid, new.b, new.c);
END;
CREATE TRIGGER t2_ai AFTER INSERT ON t2 BEGIN
  INSERT INTO t3(docid, b, c) VALUES(new.rowid, new.b, new.c);
END;



  The DELETE trigger must be fired before the actual delete takes place
  on the content table. This is so that FTS4 can still retrieve the original
  values in order to update the full-text index. And the INSERT trigger must
  be fired after the new row is inserted, so as to handle the case where the
  rowid is assigned automatically within the system. The UPDATE trigger must
  be split into two parts, one fired before and one after the update of the
  content table, for the same reasons.


  The FTS4 "rebuild" command
  deletes the entire full-text index and rebuilds it based on the current
  set of documents in the content table. Assuming again that "t3" is the
  name of the external content FTS4 table, the rebuild command looks like this:

INSERT INTO t3(t3) VALUES('rebuild');



  This command may also be used with ordinary FTS4 tables, for example if
  the implementation of the tokenizer changes.  It is an
  error to attempt to rebuild the full-text index maintained by a contentless
  FTS4 table, since no content will be available to do the rebuilding.fts3.html#_external_content_fts4_tables_
ÿÿµtÿ    KWê]SQLite FTS3 and FTS4 Extensions6.2.2.  External Content FTS4 Tables An "external content" FTS4 table is similar to a contentless table, except
  that if evaluation of a query requires the value of a column other than 
  docid, FTS4 attempts to retrieve that value from a table (or view, or 
  virtual table) nominated by the user (hereafter referred to as the "content
  table"). The FTS4 module never writes to the content table, and writing
  to the content table does not affect the full-text index. It is the
  responsibility of the user to ensure that the content table and the 
  full-text index are consistent.


  An external content FTS4 table is created by setting the content option
  to the name of a table (or view, or virtual table) that may be queried by
  FTS4 to retrieve column values when required. If the nominated table does
  not exist, then an external content table behaves in the same way as
  a contentless table. For example:

CREATE TABLE t2(id INTEGER PRIMARY KEY, a, b, c);
CREATE VIRTUAL TABLE t3 USING fts4(content="t2", a, c);



  Assuming the nominated table does exist, then its columns must be the same 
  as or a superset of those defined for the FTS table.  The external table
  must also be in the same database file as the FTS table.  In other words,
  The external table cannot be in a different database file connected using
  ATTACH nor may one of the FTS table and the external content be in the
  TEMP database when the other is in a persistent database file such as MAIN.


  When a users query on the FTS table requires a column value other than
  docid, FTS attempts to read the requested value from the corresponding column of
  the row in the content table with a rowid value equal to the current FTS
  docid. Only the subset of content-table columns duplicated in the FTS/34
  table declaration can be queried for - to retrieve values from any other
  columns the content table must be queried directly. Or, if such a row cannot
  be found in the content table, a NULL value is used instead. For example:

CREATE TABLE t2(id INTEGER PRIMARY KEY, a, b, c);
CREATE VIRTUAL TABLE t3 USING fts4(content="t2", b, c);

INSERT INTO t2 VALUES(2, 'a b', 'c d', 'e f');
INSERT INTO t2 VALUES(3, 'g h', 'i j', 'k l');
INSERT INTO t3(docid, b, c) SELECT id, b, c FROM t2;
-- The following query returns a single row with two columns containing
-- the text values "i j" and "k l".
--
-- The query uses the full-text index to discover that the MATCH 
-- term matches the row with docid=3. It then retrieves the values
-- of columns b and c from the row with rowid=3 in the content table
-- to return.
--
SELECT * FROM t3 WHERE t3 MATCH 'k';

-- Following the UPDATE, the query still returns a single row, this
-- time containing the text values "xxx" and "yyy".
®˜B®‡ KCŒgKSQLite FTS3 and FTS4 Extensions6.5. The notindexed= optionNormally, the FTS module maintains an inverted index of all terms in
  all columns of the table. This option is used to specify the name of
  a column for which entries should not be added to the index. Multiple
  "notindexed" options may be used to specify that multiple columns should
  be omitted from the index. For example:

-- Create an FTS4 table for which only the contents of columns c2 and c4
-- are tokenized and added to the inverted index.
CREATE VIRTUAL TABLE t1 USING fts4(c1, c2, c3, c4, notindexed=c1, notindexed=c3);



  Values stored in unindexed columns are not eligible to match MATCH 
  operators. They do not influence the results of the offsets() or matchinfo()
  auxiliary functions. Nor will the snippet() function ever return a
  snippet based on a value stored in an unindexed column.fts3.html#the_notindexed_option„Qÿ   KA‡oISQLite FTS3 and FTS4 Extensions6.4. The matchinfo= optionThe matchinfo option may only be set to the value "fts3". 
  Attempting to set matchinfo to anything other than "fts3" is an error.
  If this option is specified, then some of the extra information stored by
  FTS4 is omitted. This reduces the amount of disk space consumed by
  an FTS4 table until it is almost the same as the amount that would
  be used by the equivalent FTS3 table, but also means that the data
  accessed by passing the 'l' flag to the matchinfo() function is
  not available.fts3.html#the_matchinfo_optionŽcÿ     KCœKSQLite FTS3 and FTS4 Extensions6.3. The languageid= optionWhen the languageid option is present, it specifies the name of
  another hidden column that is added to the FTS4
  table and which is used to specify the language stored in each row
  of the FTS4 table.  The name of the languageid hidden column must
  be distinct from all other column names in the FTS4 table.  Example:

CREATE VIRTUAL TABLE t1 USING fts4(x, y, languageid="lid")



  The default value of a languageid column is 0. Any value inserted
  into a languageid column is converted to a 32-bit (not 64) signed
  integer.


  By default, FTS queries (those that use the MATCH operator)
  consider only those rows with the languageid column set to 0. To
  query for rows with other languageid values, a constraint of the
  form " = " must be added to the queries
  WHERE clause. For example:

SELECT * FROM t1 WHERE t1 MATCH 'abc' AND lid=5;



  It is not possible for a single FTS query to return rows with
  different languageid values. The results of adding WHERE clauses
  that use other operators (e.g.  lid!=5, or lid&lt;=5) are undefined.


  If the content option is used along with the languageid option,
  then the named languageid column must exist in the content= table
  (subject to the usual rules - if a query never needs to read the
  content table then this restriction does not apply).


  When the languageid option is used, SQLite invokes the xLanguageid()
  on the sqlite3_tokenizer_module object immediately after the object
  is created in order to pass in the language id that the
  tokenizer should use.  The xLanguageid() method will never be called
  more than once for any single tokenizer object.  The fact that different
  languages might be tokenized differently is one reason why no single
  FTS query can return rows with different languageid values.fts3.html#the_languageid_option
s    ¤Æs„Nÿ KAˆ/SQLite FTS3 and FTS4 Extensions7.2. The "rebuild" commandThe "rebuild" command causes SQLite to discard the entire FTS3/4
  table and then rebuild it again from original text.  The concept
  is similar to REINDEX, only that it applies to an
  FTS3/4 table instead of an ordinary index.


  The "rebuild" command should be run whenever the implementation
  of a custom tokenizer changes, so that all content can be retokenized.
  The "rebuild" command is also useful when using the
  FTS4 content option after changes have been made to the original
  content table.fts3.html#rebuild†Nÿ  KC‹1SQLite FTS3 and FTS4 Extensions7.1. The "optimize" commandThe "optimize" command causes FTS3/4 to merge together all of its
  inverted index b-trees into one large and complete b-tree.  Doing
  an optimize will make subsequent queries run faster since there are
  fewer b-trees to search, and it may reduce disk usage by coalescing
  redundant entries.  However, for a large FTS table, running optimize
  can be as expensive as running VACUUM.  The optimize command
  essentially has to read and write the entire FTS table, resulting
  in a large transaction.


  In batch-mode operation, where an FTS table is initially built up
  using a large number of INSERT operations, then queried repeatedly
  without further changes, it is often a good idea
  to run "optimize" after the last INSERT and before the first query.fts3.html#optimize…ÿ
        KWˆ[1SQLite FTS3 and FTS4 Extensions7. Special Commands For FTS3 and FTS4Special INSERT operates can be used to issue commands to FTS3 and FTS4 tables.
  Every FTS3 and FTS4 has a hidden, read-only column which is the same name as
  the table itself.  INSERTs into this hidden column are interpreted as commands
  to the FTS3/4 table.  For a table with the name "xyz" the following commands
  are supported:


INSERT INTO xyz(xyz) VALUES('optimize');
INSERT INTO xyz(xyz) VALUES('rebuild');
INSERT INTO xyz(xyz) VALUES('integrity-check');
INSERT INTO xyz(xyz) VALUES('merge=X,Y');
INSERT INTO xyz(xyz) VALUES('automerge=N');fts3.html#commandsŒWÿ               K;˜CSQLite FTS3 and FTS4 Extensions6.6. The prefix= optionThe FTS4 prefix option causes FTS to index term prefixes of specified lengths
  in the same way that it always indexes complete terms.  The prefix option
  must be set to a comma separated list of positive non-zero integers. 
  For each value N in the list, prefixes of length N bytes (when encoded 
  using UTF-8) are indexed.  FTS4 uses term prefix indexes to speed up
  prefix queries. The cost, of course, is that indexing term prefixes as
  well as complete terms increases the database size and slows down write 
  operations on the FTS4 table.


  Prefix indexes may be used to optimize prefix queries in two cases.
  If the query is for a prefix of N bytes, then a prefix index created
  with "prefix=N" provides the best optimization. Or, if no "prefix=N"
  index is available, a "prefix=N+1" index may be used instead. 
  Using a "prefix=N+1" index is less
  efficient than a "prefix=N" index, but is better than no prefix index at all.

-- Create an FTS4 table with indexes to optimize 2 and 4 byte prefix queries.
CREATE VIRTUAL TABLE t1 USING fts4(c1, c2, prefix="2,4");

-- The following two queries are both optimized using the prefix indexes.
SELECT * FROM t1 WHERE t1 MATCH 'ab*';
SELECT * FROM t1 WHERE t1 MATCH 'abcd*';

-- The following two queries are both partially optimized using the prefix
-- indexes. The optimization is not as pronounced as it is for the queries
-- above, but still an improvement over no prefix indexes at all.
SELECT * FROM t1 WHERE t1 MATCH 'a*';
SELECT * FROM t1 WHERE t1 MATCH 'abc*';fts3.html#the_prefix_option
77Gÿ KEo1SQLite FTS3 and FTS4 Extensions7.4. The "merge=X,Y" commandThe "merge=X,Y" command (where X and Y are integers) causes SQLite
  to do a limited amount of work toward merging the various inverted
  index b-trees of an FTS3/4 table together into one large b-tree.
  The X value is the target number of "blocks" to be merged, and Y is
  the minimum number of b-tree segments on a level required before
  merging will be applied to that level.  The value of Y should
  be between 2 and 16 with a recommended value of 8.  The value of X
  can be any positive integer but values on the order of 100 to 300
  are recommended.


  When an FTS table accumulates 16 b-tree segments at the same level,
  the next INSERT into that table will cause all 16 segments to be
  merged into a single b-tree segment at the next higher level.  The
  effect of these level merges is that most INSERTs into an FTS table
  are very fast and take minimal memory, but an occasional INSERT is
  slow and generates a large transaction because of the need to
  do merging. This results in "spiky" performance of INSERTs.


  To avoid spiky INSERT performance, an application can run the
  "merge=X,Y" command periodically, possibly in an idle thread or
  idle process, to ensure that the FTS table never accumulates
  too many b-tree segments at the same level.  INSERT performance
  spikes can generally be avoided, and performance of FTS3/4 can be
  maximized, by running "merge=X,Y" after every few thousand
  document inserts.  Each "merge=X,Y" command will run in a separate
  transaction (unless they are grouped together using BEGIN...COMMIT,
  of course).  The transactions can be kept small by choosing a value
  for X in the range of 100 to 300.  The idle thread that is running
  the merge commands can know when it is done by checking the difference
  in sqlite3_total_changes() before and after each "merge=X,Y"
  command and stopping the loop when the difference drops below two.fts3.html#mergecmd‰xÿ
     KQ’A5SQLite FTS3 and FTS4 Extensions7.3. The "integrity-check" commandThe "integrity-check" command causes SQLite to read and verify
  the accuracy of all inverted indices in an FTS3/4 table by comparing
  those inverted indices against the original content. The 
  "integrity-check" command silently succeeds if the inverted
  indices are all ok, but will fail with an SQLITE_CORRUPT error
  if any problems are found.


  The "integrity-check" command is similar in concept to
 PRAGMA integrity_check.  In a working system, the "integrity-command"
 should always be successful.  Possible causes of integrity-check
 failures include:
  
   The application has made changes to the FTS shadow tables
       directly, without using the FTS3/4 virtual table, causing
       the shadow tables to become out of sync with each other.
   Using the FTS4 content option and failing to manually keep
       the content in sync with the FTS4 inverted indices.
   Bugs in the FTS3/4 virtual table.  (The "integrity-check"
       command was original conceived as part of the test suite
       for FTS3/4.)
   Corruption to the underlying SQLite database file.  (See
       documentation on how to corrupt and SQLite database for
       additional information.)fts3.html#integcheck
ýÂÿ
K'ƒ3SQLite FTS3 and FTS4 Extensions8. TokenizersAn FTS tokenizer is a set of rules for extracting terms from a document 
  or basic FTS full-text query. 


  Unless a specific tokenizer is specified as part of the CREATE 
  VIRTUAL TABLE statement used to create the FTS table, the default 
  tokenizer, "simple", is used. The simple tokenizer extracts tokens from
  a document or basic FTS full-text query according to the following 
  rules:


   A term is a contiguous sequence of…•~ÿ  KIªW3SQLite FTS3 and FTS4 Extensions7.5. The "automerge=N" commandThe "automerge=N" command (where N is an integer between 0 and 15,
  inclusive) is used to configure an FTS3/4 tables "automerge" parameter,
  which controls automatic incremental inverted index merging. The default 
  automerge value for new tables is 0, meaning that automatic incremental 
  merging is completely disabled. If the value of the automerge parameter
  is modified using the "automerge=N" command, the new parameter value is
  stored persistently in the database and is used by all subsequently
  established database connections.


  Setting the automerge parameter to a non-zero value enables automatic
  incremental merging. This causes SQLite to do a small amount of inverted 
  index merging after every INSERT operation. The amount of merging 
  performed is designed so that the FTS3/4 table never reaches a point 
  where it has 16 segments at the same level and hence has to do a large 
  merge in order to complete an insert.  In other words, automatic 
  incremental merging is designed to prevent spiky INSERT performance.


  The downside of automatic incremental merging is that it makes
  every INSERT, UPDATE, and DELETE operation on an FTS3/4 table run
  a little slower, since extra time must be used to do the incremental
  merge.  For maximum performance, it is recommended that applications
  disable automatic incremental merge and instead use the 
  "merge" command in an idle process to keep the inverted indices
  well merged.  But if the structure of an application does not easily
  allow for idle processes, the use of automatic incremental merge is
  a very reasonable fallback solution.


  The actual value of the automerge parameter determines the number of
  index segments merged simultaneously by an automatic inverted index
  merge. If the value is set to N, the system waits until there are at
  least N segments on a single level before beginning to incrementally
  merge them. Setting a lower value of N causes segments to be merged more
  quickly, which may speed up full-text queries and, if the workload 
  contains UPDATE or DELETE operations as well as INSERTs, reduce the space
  on disk consumed by the full-text index. However, it also increases the
  amount of data written to disk.


  For general use in cases where the workload contains few UPDATE or DELETE
  operations, a good choice for automerge is 8. If the workload contains
  many UPDATE or DELETE commands, 
  or if query speed is a concern, it may be advantageous to reduce automerge
  to 2.


  For reasons of backwards compatibility, the "automerge=1" command sets
  the automerge parameter to 8, not 1 (a value of 1 would make no sense 
  anyway, as merging data from a single segment is a no-op).fts3.html#automerge† eligible characters, where 
    eligible characters are all alphanumeric characters and all characters with
    Unicode codepoint values greater than or equal to 128.
    All other characters are
    discarded when splitting a document into terms. Their only contribution is
    to separate adjacent terms.

   All uppercase characters within the ASCII range (Unicode codepoints
    less than 128), are transformed to their lowercase equivalents as part
    of the tokenization process. Thus, full-text queries are
    case-insensitive when using the simple tokenizer.



  For example, when a document containing the text "Right now, they're very
  frustrated.", the terms extracted from the document and added to the 
  full-text index are, in order, "right now they re very frustrated". Such
  a document would match a full-text query such as "MATCH 'Frustrated'", 
  as the simple tokenizer transforms the term in the query to lowercase
  before searching the full-text index.


  As well as the "simple" tokenizer, the FTS source code features a tokenizer 
  that uses the Porter 
  Stemming algorithm. This tokenizer uses the same rules to separate
  the input document into terms including folding all terms into lower case,
  but also uses the Porter Stemming algorithm to reduce related English language
  words to a common root. For example, using the same input document as in the
  paragraph above, the porter tokenizer extracts the following tokens:
  "right now thei veri frustrat". Even though some of these terms are not even
  English words, in some cases using them to build the full-text index is more
  useful than the more intelligible output produced by the simple tokenizer.
  Using the porter tokenizer, the document not only matches full-text queries
  such as "MATCH 'Frustrated'", but also queries such as "MATCH 'Frustration'",
  as the term "Frustration" is reduced by the Porter stemmer algorithm to 
  "frustrat" - just as "Frustrated" is. So, when using the porter tokenizer,
  FTS is able to find not just exact matches for queried terms, but matches
  against similar English language terms. For more information on the 
  Porter Stemmer algorithm, please refer to the page linked above.


  Example illustrating the difference between the "simple" and "porter"
  tokenizers:

-- Create a table using the simple tokenizer. Insert a document into it.
CREATE VIRTUAL TABLE simple USING fts3(tokenize=simple);
INSERT INTO simple VALUES('Right now they''re very frustrated');

-- The first of the following two queries matches the document stored in
-- table "simple". The second does not.
SELECT * FROM simple WHERE simple MATCH 'Frustrated';
SELECT * FROM simple WHERE simple MATCH 'Frustration';

-- Create a table using the porter tokenizer. Insert the same document into it
CREATE VIRTUAL TABLE porter USING fts3(tokenize=porter);
INSERT INTO porter VALUES('Right now they''re very frustrated');

-- Both of the following queries match the document stored in table "porter".
SELECT * FROM porter WHERE porter MATCH 'Frustrated';
SELECT * FROM porter WHERE porter MATCH 'Frustration';



  If this extension is compiled with the SQLITE_ENABLE_ICU pre-processor
  symbol defined, then there exists a built-in tokenizer named "icu"
  implemented using the ICU library. The first argument passed to the
  xCreate() method (see fts3_tokenizer.h) of this tokenizer may be
  an ICU locale identifier. For example "tr_TR" for Turkish as used
  in Turkey, or "en_AU" for English as used in Australia. For example:

CREATE VIRTUAL TABLE thai_text USING fts3(text, tokenize=icu th_TH)



  The ICU tokenizer implementation is very simple. It splits the input
  text according to the ICU rules for finding word boundaries and discards
  any tokens that consist entirely of white-space. This may be suitable
  for some applications in some locales, but not all. If more complex
  processing is required, for example to implement stemming or
  discard punctuation, this can be done by creating a tokenizer
  implementation that uses the ICU tokenizer as part of its implementation.




  The "unicode61" tokenizer is available beginning with SQLite version 3.7.13
  (2012-06-11).
  Unicode61 works very much like "simple" except that it does simple unicode
  case folding according to rules in Unicode Version 6.1 and it recognizes
  unicode space and punctuation characters and uses those to separate tokens.
  The simple tokenizer only does case folding of ASCII characters and only
  recognizes ASCII space and punctuation characters as token separators.


  By default, "unicode61" attempts to remove diacritics from Latin script
  characters. This behaviour can be overridden by adding the tokenizer argument
  "remove_diacritics=0". For example:

-- Create tables that remove alldiacritics from Latin script characters
-- as part of tokenization.
CREATE VIRTUAL TABLE txt1 USING fts4(tokenize=unicode61);
CREATE VIRTUAL TABLE txt2 USING fts4(tokenize=unicode61 "remove_diacritics=2");

-- Create a table that does not remove diacritics from Latin script
-- characters as part of tokenization.
CREATE VIRTUAL TABLE txt3 USING fts4(tokenize=unicode61 "remove_diacritics=0");


The remove_diacritics option may be set to "0", "1" or "2". The default
   value is "1".  If it is set to "1" or "2", then diacritics are removed from
   Latin script characters as described above. However, if it is set to "1",
   then diacritics are not removed in the fairly uncommon case where a single
   unicode codepoint is used to represent a character with more that one
   diacritic. For example, diacritics are not removed from codepoint 0x1ED9
   ("LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW"). This is technically
   a bug, but cannot be fixed without creating backwards compatibility
   problems. If this option is set to "2", then diacritics are correctly
   removed from all Latin characters.


  It is also possible to customize the set of codepoints that unicode61 treats
  as separator characters. The "separators=" option may be used to specify one
  or more extra characters that should be treated as separator characters, and
  the "tokenchars=" option may be used to specify one or more extra characters
  that should be treated as part of tokens instead of as separator characters.
  For example:

-- Create a table that uses the unicode61 tokenizer, but considers "."
-- and "=" characters to be part of tokens, and capital "X" characters to
-- function as separators.
CREATE VIRTUAL TABLE txt3 USING fts4(tokenize=unicode61 "tokenchars=.=" "separators=X");

-- Create a table that considers space characters (codepoint 32) to be
-- a token character
CREATE VIRTUAL TABLE txt4 USING fts4(tokenize=unicode61 "tokenchars= ");



  If a character specified as part of the argument to "tokenchars=" is considered
  to be a token character by default, it is ignored. This is true even if it has
  been marked as a separator by an earlier "separators=" option. Similarly, if
  a character specified as part of a "separators=" option is treated as a separator
  character by default, it is ignored. If multiple "tokenchars=" or "separators="
  options are specified, all are processed. For example:

-- Create a table that uses the unicode61 tokenizer, but considers "."
-- and "=" characters to be part of tokens, and capital "X" characters to
-- function as separators. Both of the "tokenchars=" options are processed
-- The "separators=" option ignores the "." passed to it, as "." is by
-- default a separator character, even though it has been marked as a token
-- character by an earlier "tokenchars=" option.
CREATE VIRTUAL TABLE txt5 USING fts4(
    tokenize=unicode61 "tokenchars=." "separators=X." "tokenchars=="
);



  The arguments passed to the "tokenchars=" or "separators=" options are 
  case-sensitive. In the example above, specifying that "X" is a separator
  character does not affect the way "x" is handled.fts3.html#tokenizer
||œÿ        Ke¸kSQLite FTS3 and FTS4 Extensions8.1. Custom (Application Defined) TokenizersIn addition to providing built-in "simple", "porter" and (possibly) "icu" and
  "unicode61" tokenizers,
  FTS provides an interface for applications to implement and register custom
  tokenizers written in C.  The interface used to create a new tokenizer is defined
  and described in the fts3_tokenizer.h source file.


  Registering a new FTS tokenizer is similar to registering a new
  virtual table module with SQLite. The user passes a pointer to a
  structure containing pointers to various callback functions that
  make up the implementation of the new tokenizer type. For tokenizers,
  the structure (defined in fts3_tokenizer.h) is called
  "sqlite3_tokenizer_module".


  FTS does not expose a C-function that users call to register new
  tokenizer types with a database handle. Instead, the pointer must
  be encoded as an SQL blob value and passed to FTS through the SQL
  engine by evaluating a special scalar function, "fts3_tokenizer()".
  The fts3_tokenizer() function may be called with one or two arguments,
  as follows:

SELECT fts3_tokenizer(&lt;tokenizer-name&gt;);
SELECT fts3_tokenizer(&lt;tokenizer-name&gt;, &lt;sqlite3_tokenizer_module ptr&gt;);



  Where &lt;tokenizer-name&gt; is parameter to which a string is bound using
  sqlite3_bind_text() where the string identifies the tokenizer and
  &lt;sqlite3_tokenizer_module ptr&gt; is a parameter to which a BLOB is
  bound using sqlite3_bind_blob() where the value of the BLOB is a
  pointer to an sqlite3_tokenizer_module structure.
  If the second argument is present,
  it is registered as tokenizer &lt;tokenizer-name&gt; and a copy of it
  returned. If only one argument is passed, a pointer to the tokenizer
  implementation currently registered as &lt;tokenizer-name&gt; is returned,
  encoded as a blob. Or, if no such tokenizer exists, an SQL exception
  (error) is raised.


  Prior to SQLite version 3.11.0 (2016-02-15), the arguments to
  fts3_tokenizer() could be literal strings or BLOBs. They did not have to
  be bound parameters.  But that could lead to security problems in the
  event of an SQL injection.  Hence, the legacy behavior is now disabled
  by default.  But the old legacy behavior can be enabled, for backwards
  compatibility in applications that really need it, 
  by calling
  sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,1,0).


  The following block contains an example of calling the fts3_tokenizer()
  function from C code:

/*
** Register a tokenizer implementation with FTS3 or FTS4.
*/
int registerTokenizer(
  sqlite3 *db,
  char *zName,
  const sqlite3_tokenizer_module *p
){
  int rc;
  sqlite3_stmt *pStmt;
  const char *zSql = "SELECT fts3_tokenizer(?1, ?2)";

  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);
}

/*
** Query FTS for the tokenizer implementation named zName.
*/
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 ){
      memcpy(pp, sqlite3_column_blob(pStmt, 0), sizeof(*pp));
    }
  }

  return sqlite3_finalize(pStmt);
}fts3.html#custom_application_defined_tokenizers
±·±„ÿ K1†i?SQLite FTS3 and FTS4 Extensions9. Data StructuresThis section describes at a high-level the way the FTS module stores its
  index and content in the database. It is not necessary to read or 
  understand the material in this section in order to use FTS in an 
  application. However, it may be useful to application developers attempting 
  to analyze and understand FTS performance characteristics, or to developers 
  contemplating enhancements to the existing FTS feature set.fts3.html#data_structures”Dÿ     K=§[GSQLite FTS3 and FTS4 Extensions8.2. Querying TokenizersThe "fts3tokenize" virtual table can be used to directly access any
   tokenizer.  The following SQL demonstrates how to create an instance 
   of the fts3tokenize virtual table:

CREATE VIRTUAL TABLE tok1 USING fts3tokenize('porter');


The name of the desired tokenizer should be substituted in place of
   'porter' in the example, of course.  If the tokenizer requires one or
   more arguments, they should be separated by commas in the fts3tokenize
   declaration (even though they are separated by spaces in declarations
   of regular fts4 tables). The following creates fts4 and fts3tokenize
   tables that use the same tokenizer:
CREATE VIRTUAL TABLE text1 USING fts4(tokenize=icu en_AU);
CREATE VIRTUAL TABLE tokens1 USING fts3tokenize(icu, en_AU);

CREATE VIRTUAL TABLE text2 USING fts4(tokenize=unicode61 "tokenchars=@." "separators=123");
CREATE VIRTUAL TABLE tokens2 USING fts3tokenize(unicode61, "tokenchars=@.", "separators=123");

   

   Once the virtual table is created, it can be queried as follows:

SELECT token, start, end, position 
  FROM tok1
 WHERE input='This is a test sentence.';


The virtual table will return one row of output for each token in the
   input string.  The "token" column is the text of the token.  The "start"
   and "end" columns are the byte offset to the beginning and end of the
   token in the original input string.  
   The "position" column is the sequence number
   of the token in the original input string.  There is also an "input"
   column which is simply a copy of the input string that is specified in
   the WHERE clause.  Note that a constraint of the form "input=?" must
   appear in the WHERE clause or else the virtual table will have no input
   to tokenize and will return no rows.  The example above generates
   the following output:

thi|0|4|0
is|5|7|1
a|8|9|2
test|10|14|3
sentenc|15|23|4


Notice that the tokens in the result set from the fts3tokenize virtual
   table have been transformed according to the rules of the tokenizer.
   Since this example used the "porter" tokenizer, the "This" token was
   converted into "thi".  If the original text of the token is desired,
   it can be retrieved using the "start" and "end" columns with the
   substr() function.  For example:

SELECT substr(input, start+1, end-start), token, position
  FROM tok1
 WHERE input='This is a test sentence.';


The fts3tokenize virtual table can be used on any tokenizer, regardless
   of whether or not there exists an FTS3 or FTS4 table that actually uses
   that tokenizer.fts3.html#querying_tokenizershe total number of rows in the FTS table. The
  second and subsequent varints contain the total number of tokens stored in
  the corresponding column for all rows of the FTS table.


  The two remaining tables, %_segments and %_segdir, are used to store the 
  full-text index. Conceptually, this index is a lookup table that maps each 
  term (word) to the set of docid values corresponding to records in the 
  %_content table that contain one or more occurrences of the term. To
  retrieve all documents that contain a specified term, the FTS module
  queries this index to determine the set of docid values for records that
  contain the term, then retrieves the required documents from the %_content
  table. Regardless of the schema of the FTS virtual table, the %_segments
  and %_segdir tables are always created as follows:

CREATE TABLE %_segments(
  blockid INTEGER PRIMARY KEY,       -- B-tree node id
  block blob                         -- B-tree node data
);

CREATE TABLE %_segdir(
  level INTEGER,
  idx INTEGER,
  start_block INTEGER,               -- Blockid of first node in %_segments
  leaves_end_block INTEGER,          -- Blockid of last leaf node in %_segments
  end_block INTEGER,                 -- Blockid of last node in %_segments
  root BLOB,                         -- B-tree root node
  PRIMARY KEY(level, idx)
);



  The schema depicted above is not designed to store the full-text index 
  directly. Instead, it is used to store one or more b-tree structures. There
  is one b-tree for each row in the %_segdir table. The %_segdir table
  row contains the root node and various meta-data associated with the
  b-tree structure, and the %_segments table contains all other (non-root)
  b-tree nodes. Each b-tree is referred to as a "segment". Once it has
  been created, a segment b-tree is never updated (although it may be
  deleted altogether).


  The keys used by each segment b-tree are terms (words). As well as the
  key, each segment b-tree entry has an associated "doclist" (document list).
  A doclist consists of zero or more entries, where each entry consists of:


   A docid (document id), and
   A list of term offsets, one for each occurrence of the term within
       the document. A term offset indicates the number of tokens (words)
       that occur before the term in question, not the number of characters
       or bytes. For example, the term offset of the term "war" in the
       phrase "Ancestral voices prophesying war!" is 3.



  Entries within a doclist are sorted by docid. Positions within a doclist
  entry are stored in ascending order.


  The contents of the logical full-text index is found by merging the
  contents of all segment b-trees. If a term is present in more than one
  segment b-tree, then it maps to the union of each individual doclist. If,
  for a single term, the same docid occurs in more than one doclist, then only
  the doclist that is part of the most recently created segment b-tree is 
  considered valid. 


  Multiple b-tree structures are used instead of a single b-tree to reduce
  the cost of inserting records into FTS tables. When a new record is 
  inserted into an FTS table that already contains a lot of data, it is
  likely that many of the terms in the new record are already present in
  a large number of existing records. If a single b-tree were used, then
  large doclist structures would have to be loaded from the database,
  amended to include the new docid and term-offset list, then written back
  to the database. Using multiple b-tree tables allows this to be avoided
  by creating a new b-tree which can be merged with the existing b-tree
  (or b-trees) later on. Merging of b-tree structures can be performed as
  a background task, or once a certain number of separate b-tree structures
  have been accumulated. Of course, this scheme makes queries more expensive
  (as the FTS code may have to look up individual terms in more than one
  b-tree and merge the results), but it has been found that in practice this
  overhead is often negligible.fts3.html#shadow_tables
%k%ŒAÿ        Ke—  kSQLite FTS3 and FTS4 Extensions9.2. Variable Length Integer (varint) FormatInteger values stored as part of segment b-tree nodes are encoded using the
  FTS varint format. This encoding is similar, but not identical, to
  the SQLite varint format.


  An encoded FTS varint consumes between one and ten bytes of space. The
  number of bytes required is determined by the sign and magnitude of the
  integer value encoded. More accurately, the number of bytes used to store
  the encoded integer depends on the position of the most significant set bit
  in the 64-bit twos-complement representation of the integer value. Negative
  values always have the most significant bit set (the sign bit), and so are
  always stored using the full ten bytes. Positive integer values may be
  stored using less space.


  The final byte of an encoded FTS varint has its most significant bit 
  cleared. All preceding bytes have the most significant bit set. Data
  is stored in the remaining seven least significant bits of each byte.
  The first byte of the encoded representation contains the least significant
  seven bits of the encoded integer value. The second byte of the encoded
  representation, if it is present, contains the seven next least significant
  bits of the integer value, and so on. The following table contains examples
  of encoded integer values:


  DecimalHexadecimalEncoded Representation
  430x000000000000002B0x2B 
  2008150x000000000003106F0xEF 0xA0 0x0C
  -10xFFFFFFFFFFFFFFFF0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x01fts3.html#variable_length_integer_varint_formatÿ       K1ä{;SQLite FTS3 and FTS4 Extensions9.1. Shadow TablesFor each FTS virtual table in a database, three to five real (non-virtual) tables
  are created to store the underlying data.  These real tables are called "shadow tables".
  The real tables are named "%_content",
  "%_segdir", "%_segments", "%_stat", and "%_docsize", where "%" is replaced by the name
  of the FTS virtual table.


  The leftmost column of the "%_content" table is an INTEGER PRIMARY KEY field
  named "docid". Following this is one column for each column of the FTS
  virtual table as declared by the user, named by prepending the column name
  supplied by the user with "cN", where N is the index of the 
  column within the table, numbered from left to right starting with 0. Data
  types supplied as part of the virtual table declaration are not used as
  part of the %_content table declaration. For example:

-- Virtual table declaration
CREATE VIRTUAL TABLE abc USING fts4(a NUMBER, b TEXT, c);

-- Corresponding %_content table declaration
CREATE TABLE abc_content(docid INTEGER PRIMARY KEY, c0a, c1b, c2c);



  The %_content table contains the unadulterated data inserted by the user 
  into the FTS virtual table by the user. If the user does not explicitly
  supply a "docid" value when inserting records, one is selected automatically
  by the system.


  The %_stat and %_docsize tables are only created if the FTS table uses the
  FTS4 module, not FTS3. Furthermore, the %_docsize table is omitted if the
  FTS4 table is created with the "matchinfo=fts3" directive
  specified as part of the CREATE VIRTUAL TABLE statement. If they are created,
  the schema of the two tables is as follows:
CREATE TABLE %_stat(
  id INTEGER PRIMARY KEY, 
  value BLOB
);

CREATE TABLE %_docsize(
  docid INTEGER PRIMARY KEY,
  size BLOB
);



  For each row in the FTS table, the %_docsize table contains a corresponding
  row with the same "docid" value. The "size" field contains a blob consisting
  of N FTS varints, where N is the number of user-defined columns
  in the table. Each varint in the "size" blob is the number of tokens in the
  corresponding column of the associated row in the FTS table. The %_stat table
  always contains a single row with the "id" column set to 0. The "value" 
  column contains a blob consisting of N+1 FTS varints, where N
  is again the number of user-defined columns in the FTS table. The first
  varint in the blob is set to t‰
Ä…ÁÄxÿ   KU‚[SQLite FTS3 and FTS4 Extensions9.3.2. Segment B-Tree Interior NodesThe following diagram depicts the format of a segment b-tree interior 
  (non-leaf) node.


  
   Segment B-Tree Interior Node Formatfts3.html#segment_b_tree_interior_nodesƒ?ÿ      KM…5SSQLite FTS3 and FTS4 Extensions9.3.1. Segment B-Tree Leaf NodesThe following diagram depicts the format of a segment b-tree leaf node.


  
   Segment B-Tree Leaf Node Format



  The first term stored on each node ("Term 1" in the figure above) is
  stored verbatim. Each subsequent term is prefix-compressed with respect
  to its predecessor. Terms are stored within a page in sorted (memcmp)
  order.fts3.html#segment_b_tree_leaf_nodes˜vÿ        KA°7KSQLite FTS3 and FTS4 Extensions9.3. Segment B-Tree FormatSegment b-trees are prefix-compressed b+-trees. There is one segment b-tree
  for each row in the %_segdir table (see above). The root node of the segment
  b-tree is stored as a blob in the "root" field of the corresponding row
  of the %_segdir table. All other nodes (if any exist) are stored in the 
  "blob" column of the %_segments table. Nodes within the %_segments table are
  identified by the integer value in the blockid field of the corresponding
  row. The following table describes the fields of the %_segdir table:


  Column           Interpretation
  level             
    Between them, the contents of the "level" and "idx" fields define the
    relative age of the segment b-tree. The smaller the value stored in the
    "level" field, the more recently the segment b-tree was created. If two
    segment b-trees are of the same "level", the segment with the larger
    value stored in the "idx" column is more recent. The PRIMARY KEY constraint
    on the %_segdir table prevents any two segments from having the same value
    for both the "level" and "idx" fields.
  idx               See above.
  start_block      
    The blockid that corresponds to the node with the smallest blockid that 
    belongs to this segment b-tree. Or zero if the entire segment b-tree
    fits on the root node. If it exists, this node is always a leaf node.
  leaves_end_block 
    The blockid that corresponds to the leaf node with the largest blockid 
    that belongs to this segment b-tree. Or zero if the entire segment b-tree
    fits on the root node.
  end_block 
    This field may contain either an integer or a text field consisting of
    two integers separated by a space character (unicode codepoint 0x20).

    The first, or only, integer is the blockid that corresponds to the interior
    node with the largest blockid that belongs to this segment b-tree. Or zero
    if the entire segment b-tree fits on the root node. If it exists, this node
    is always an interior node.

    The second integer, if it is present, is the aggregate size of all data
    stored on leaf pages in bytes. If the value is negative, then the segment
    is the output of an unfinished incremental-merge operation, and the
    absolute value is current size in bytes.

  root             
    Blob containing the root node of the segment b-tree.



  Apart from the root node, the nodes that make up a single segment b-tree are
  always stored using a contiguous sequence of blockids. Furthermore, the
  nodes that make up a single level of the b-tree are themselves stored as
  a contiguous block, in b-tree order. The contiguous sequence of blockids
  used to store the b-tree leaves are allocated starting with the blockid
  value stored in the "start_block" column of the corresponding %_segdir row,
  and finishing at the blockid value stored in the "leaves_end_block"
  field of the same row. It is therefore possible to iterate through all the
  leaves of a segment b-tree, in key order, by traversing the %_segments 
  table in blockid order from "start_block" to "leaves_end_block".fts3.html#segment_b_tree_format
|       Cn|ã;ÿ
K[Å;5SQLite FTS3 and FTS4 Extensions
  Appendix A: Search Application Tips
FTS is primarily designed to support Boolean full-text queries - queries
  to find the set of documents that match a specified criteria. However, many 
  (most?) search applications require that results are somehow ranked in order
  of "relevance", where "relevance" is defined as the likelihood that the user
  who performed the search is interested in a specific element of the returned
  set of documents. Pÿ   KY™=aSQLite FTS3 and FTS4 Extensions10.1.  UTF-16 byte-order-mark problem For UTF-16 databases, when using the "simple" tokenizer, it is possible to use
malformed unicode strings to cause the 
integrity-check special command to falsely report
corruption, or for auxiliary functions to return
incorrect results. More specifically, the bug can be triggered by any of the following:


  A UTF-16 byte-order-mark (BOM) is embedded at the beginning of an SQL string
       literal value inserted into an FTS3 table. For example:

INSERT INTO fts_table(col) VALUES(char(0xfeff)||'text...');


  Malformed UTF-8 that SQLite converts to a UTF-16 byte-order-mark is
       embedded at the beginning of an SQL string literal value inserted 
       into an FTS3 table.

  A text value created by casting a blob that begins with the two
       bytes 0xFF and 0xFE, in either possible order, is inserted into an
       FTS3 table. For example:
       
INSERT INTO fts_table(col) VALUES(CAST(X'FEFF' AS TEXT));



Everything works correctly if any of the following are true:

 The database encoding is UTF-8.
 All text strings are insert using one of the
     sqlite3_bind_text() family of functions.
 Literal strings contain no byte-order-marks.
 A tokenizer is used that recognizes byte-order-marks
     as whitespace.  (The default "simple" tokenizer for
     FTS3/4 does not think that BOMs are whitespace, but
     the unicode tokenizer does.)

All of the above conditions must be false in order for problems
to occur.  And even if all of the conditiona above are false,
most things will still operator correctly.  Only the
integrity-check command and the
auxiliary functions might given
unexpected results.fts3.html#_utf_16_byte_order_mark_problem_8ÿ      K3™W=SQLite FTS3 and FTS4 Extensions9.4. Doclist FormatA doclist consists of an array of 64-bit signed integers, serialized using
  the FTS varint format. Each doclist entry is made up of a series of two 
  or more integers, as follows:


   The docid value. The first entry in a doclist contains the literal docid
       value. The first field of each subsequent doclist entry contains the 
       difference between the new docid and the previous one (always a positive 
       number).
   Zero or more term-offset lists. A term-offset list is present for each
       column of the FTS virtual table that contains the term. A term-offset
       list consists of the following:
     
        Constant value 1. This field is omitted for any term-offset list
            associated with column 0.
        The column number (1 for the second leftmost column, etc.). This
            field is omitted for any term-offset list associated with column 0.
        A list of term-offsets, sorted from smallest to largest. Instead
            of storing the term-offset value literally, each integer stored 
            is the difference between the current term-offset and the previous 
            one (or zero if the current term-offset is the first), plus 2.
     
   Constant value 0.



  
   FTS3 Doclist Format



  
   FTS Doclist Entry Format



  For doclists for which the term appears in more than one column of the FTS
  virtual table, term-offset lists within the doclist are stored in column 
  number order. This ensures that the term-offset list associated with 
  column 0 (if any) is always first, allowing the first two fields of the
  term-offset list to be omitted in this case.fts3.html#doclist_formatŽWhen using a search engine to find documents on the world
  wide web, the user expects that the most useful, or "relevant", documents 
  will be returned as the first page of results, and that each subsequent page 
  contains progressively less relevant results. Exactly how a machine can 
  determine document relevance based on a users query is a complicated problem
  and the subject of much ongoing research.


  One very simple scheme might be to count the number of instances of the 
  users search terms in each result document. Those documents that contain
  many instances of the terms are considered more relevant than those with
  a small number of instances of each term. In an FTS application, the 
  number of term instances in each result could be determined by counting
  the number of integers in the return value of the offsets function.
  The following example shows a query that could be used to obtain the
  ten most relevant results for a query entered by the user:

-- This example (and all others in this section) assumes the following schema
CREATE VIRTUAL TABLE documents USING fts3(title, content);

-- Assuming the application has supplied an SQLite user function named "countintegers"
-- that returns the number of space-separated integers contained in its only argument,
-- the following query could be used to return the titles of the 10 documents that contain
-- the greatest number of instances of the users query terms. Hopefully, these 10
-- documents will be those that the users considers more or less the most "relevant".
SELECT title FROM documents 
  WHERE documents MATCH &lt;query&gt;
  ORDER BY countintegers(offsets(documents)) DESC
  LIMIT 10 OFFSET 0



  The query above could be made to run faster by using the FTS matchinfo
  function to determine the number of query term instances that appear in each
  result. The matchinfo function is much more efficient than the offsets 
  function. Furthermore, the matchinfo function provides extra information
  regarding the overall number of occurrences of each query term in the entire
  document set (not just the current row) and the number of documents in which 
  each query term appears. This may be used (for example) to attach a higher
  weight to less common terms which may increase the overall computed relevancy 
  of those results the user considers more interesting.

-- If the application supplies an SQLite user function called "rank" that
-- interprets the blob of data returned by matchinfo and returns a numeric
-- relevancy based on it, then the following SQL may be used to return the
-- titles of the 10 most relevant documents in the dataset for a users query.
SELECT title FROM documents 
  WHERE documents MATCH &lt;query&gt;
  ORDER BY rank(matchinfo(documents)) DESC
  LIMIT 10 OFFSET 0



  The SQL query in the example above uses less CPU than the first example
  in this section, but still has a non-obvious performance problem. SQLite
  satisfies this query by retrieving the value of the "title" column and
  matchinfo data from the FTS module for every row matched by the users
  query before it sorts and limits the results. Because of the way SQLite's
  virtual table interface works, retrieving the value of the "title" column
  requires loading the entire row from disk (including the "content" field,
  which may be quite large). This means that if the users query matches
  several thousand documents, many megabytes of "title" and "content" data
  may be loaded from disk into memory even though they will never be used
  for any purpose. 


  The SQL query in the following example block is one solution to this 
  problem. In SQLite, when a sub-query 
  used in a join contains a LIMIT clause, the results of the sub-query are
  calculated and stored in temporary table before the main query is executed.
  This means that SQLite will load only the docid and matchinfo data for each
  row matching the users query into memory, determine the docid values
  corresponding to the ten most relevant documents, then load only the title
  and content information for those 10 documents only. Because both the matchinfo
  and docid values are gleaned entirely from the full-text index, this results
  in dramatically less data being loaded from the database into memory.

SELECT title FROM documents JOIN ( 
    SELECT docid, rank(matchinfo(documents)) AS rank 
    FROM documents
    WHERE documents MATCH &lt;query&gt;
    ORDER BY rank DESC 
    LIMIT 10 OFFSET 0
) AS ranktable USING(docid)
ORDER BY ranktable.rank DESC



  The next block of SQL enhances the query with solutions to two other problems
  that may arise in developing search applications using FTS:


   
       The snippet function cannot be used with the above query. Because
       the outer query does not include a "WHERE ... MATCH" clause, the snippet 
       function may not be used with it. One solution is to duplicate the WHERE
       clause used by the sub-query in the outer query. The overhead associated
       with this is usually negligible.
   
       The relevancy of a document may depend on something other than just
       the data available in the return value of matchinfo. For example
       each document in the database may be assigned a static weight based
       on factors unrelated to its content (origin, author, age, number
       of references etc.). These values can be stored by the application
       in a separate table that can be joined against the documents table
       in the sub-query so that the rank function may access them.



  This version of the query is very similar to that used by the 
  sqlite.org documentation search 
  application.

-- This table stores the static weight assigned to each document in FTS table
-- "documents". For each row in the documents table there is a corresponding row
-- with the same docid value in this table.
CREATE TABLE documents_data(docid INTEGER PRIMARY KEY, weight);

-- This query is similar to the one in the block above, except that:
--
--   1. It returns a "snippet" of text along with the document title for display. So
--      that the snippet function may be used, the "WHERE ... MATCH ..." clause from
--      the sub-query is duplicated in the outer query.
--
--   2. The sub-query joins the documents table with the document_data table, so that
--      implementation of the rank function has access to the static weight assigned
--      to each document.
SELECT title, snippet(documents) FROM documents JOIN ( 
    SELECT docid, rank(matchinfo(documents), documents_data.weight) AS rank
    FROM documents JOIN documents_data USING(docid)
    WHERE documents MATCH &lt;query&gt;
    ORDER BY rank DESC 
    LIMIT 10 OFFSET 0
) AS ranktable USING(docid)
WHERE documents MATCH &lt;query&gt;
ORDER BY ranktable.rank DESC



  All the example queries above return the ten most relevant query results.
  By modifying the values used with the OFFSET and LIMIT clauses, a query 
  to return (say) the next ten most relevant results is easy to construct. 
  This may be used to obtain the data required for a search applications second
  and subsequent pages of results.


  The next block contains an example rank function that uses matchinfo data 
  implemented in C. Instead of a single weight, it allows a weight to be 
  externally assigned to each column of each document. It may be registered
  with SQLite like any other user function using sqlite3_create_function.

 Security Warning: Because it is just an ordinary SQL function, 
  rank() may be invoked as part of any SQL query in any context. This means
  that the first argument passed may not be a valid matchinfo blob.
  Implementors should take care to handle this case without causing buffer
  overruns or other potential security problems.

/*
** SQLite user defined function to use with matchinfo() to calculate the
** relevancy of an FTS match. The value returned is the relevancy score
** (a real value greater than or equal to zero). A larger value indicates 
** a more relevant document.
**
** The overall relevancy returned is the sum of the relevancies of each 
** column value in the FTS table. The relevancy of a column value is the
** sum of the following for each reportable phrase in the FTS query:
**
**   (&lt;hit count&gt; / &lt;global hit count&gt;) * &lt;column weight&gt;
**
** where &lt;hit count&gt; is the number of instances of the phrase in the
** column value of the current row and &lt;global hit count&gt; is the number
** of instances of the phrase in the same column of all rows in the FTS
** table. The &lt;column weight&gt; is a weighting factor assigned to each
** column by the caller (see below).
**
** The first argument to this function must be the return value of the FTS 
** matchinfo() function. Following this must be one argument for each column 
** of the FTS table containing a numeric weight factor for the corresponding 
** column. Example:
**
**     CREATE VIRTUAL TABLE documents USING fts3(title, content)
**
** The following query returns the docids of documents that match the full-text
** query &lt;query&gt; sorted from most to least relevant. When calculating
** relevance, query term instances in the 'title' column are given twice the
** weighting of those in the 'content' column.
**
**     SELECT docid FROM documents 
**     WHERE documents MATCH &lt;query&gt; 
**     ORDER BY rank(matchinfo(documents), 1.0, 0.5) DESC
*/
static void rankfunc(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){
  int *aMatchinfo;                /* Return value of matchinfo() */
  int nMatchinfo;                 /* Number of elements in aMatchinfo&#x5B;&#x5D; */
  int nCol = 0;                   /* Number of columns in the table */
  int nPhrase = 0;                /* Number of phrases in the query */
  int iPhrase;                    /* Current phrase */
  double score = 0.0;             /* Value to return */

  assert( sizeof(int)==4 );

  /* Check that the number of arguments passed to this function is correct.
  ** If not, jump to wrong_number_args. Set aMatchinfo to point to the array
  ** of unsigned integer values returned by FTS function matchinfo. Set
  ** nPhrase to contain the number of reportable phrases in the users full-text
  ** query, and nCol to the number of columns in the table. Then check that the
  ** size of the matchinfo blob is as expected. Return an error if it is not.
  */
  if( nVal&lt;1 ) goto wrong_number_args;
  aMatchinfo = (unsigned int *)sqlite3_value_blob(apVal&#x5B;0&#x5D;);
  nMatchinfo = sqlite3_value_bytes(apVal&#x5B;0&#x5D;) / sizeof(int);
  if( nMatchinfo&gt;=2 ){
    nPhrase = aMatchinfo&#x5B;0&#x5D;;
    nCol = aMatchinfo&#x5B;1&#x5D;;
  }
  if( nMatchinfo!=(2+3*nCol*nPhrase) ){
    sqlite3_result_error(pCtx,
      "invalid matchinfo blob passed to function rank()", -1);
    return;
  }
  if( nVal!=(1+nCol) ) goto wrong_number_args;

  /* Iterate through each phrase in the users query. */
  for(iPhrase=0; iPhrase&lt;nPhrase; iPhrase++){
    int iCol;                     /* Current column */

    /* Now iterate through each column in the users query. For each column,
    ** increment the relevancy score by:
    **
    **   (&lt;hit count&gt; / &lt;global hit count&gt;) * &lt;column weight&gt;
    **
    ** aPhraseinfo&#x5B;&#x5D; points to the start of the data for phrase iPhrase. So
    ** the hit count and global hit counts for each column are found in 
    ** aPhraseinfo&#x5B;iCol*3&#x5D; and aPhraseinfo&#x5B;iCol*3+1&#x5D;, respectively.
    */
    int *aPhraseinfo = &aMatchinfo&#x5B;2 + iPhrase*nCol*3&#x5D;;
    for(iCol=0; iCol&lt;nCol; iCol++){
      int nHitCount = aPhraseinfo&#x5B;3*iCol&#x5D;;
      int nGlobalHitCount = aPhraseinfo&#x5B;3*iCol+1&#x5D;;
      double weight = sqlite3_value_double(apVal&#x5B;iCol+1&#x5D;);
      if( nHitCount>0 ){
        score += ((double)nHitCount / (double)nGlobalHitCount) * weight;
      }
    }
  }

  sqlite3_result_double(pCtx, score);
  return;

  /* Jump here if the wrong number of arguments are passed to this function */
wrong_number_args:
  sqlite3_result_error(pCtx, "wrong number of arguments to function rank()", -1);
}

This page last modified on  2022-08-10 18:11:15 UTCfts3.html#appendix_a
:     âç†R†\    E3Œ?JSON Functions And Operators3.1. JSON argumentsFor functions that accept JSON as their first argument, that argument
can be a JSON object, array, number, string, or null.  SQLite numeric
values and NULL values are interpreted as JSON numbers and nulls, respectively.
SQLite text values can be understood as JSON objects, arrays, or strings.
If an SQLite text value that is not a well-formed JSON object, array, or
string is passed into JSON function, that function will usually throw
an error.  (Exceptions to this rule are json_valid() and
json_quote().)


For the purposes of determining validity, leading and trailing whitespace
on JSON inputs is ignored.  Interior whitespace is also ignored, in accordance
with the JSON spec.  These routines accept exactly the 
rfc-7159 JSON syntax
&mdash; no more and no less.json1.html#json_arguments…v†[      E7ŠKGJSON Functions And Operators3. Interface OverviewSQLite stores JSON as ordinary text.
Backwards compatibility constraints mean that SQLite is only able to
store values that are NULL, integers, floating-point numbers, text,
and BLOBs.  It is not possible to add a sixth "JSON" type.


SQLite does not (currently) support a binary encoding
of JSON.  Experiments have been unable to find a binary encoding
that is significantly smaller or faster than a plain text encoding.
(The present implementation parses JSON text at over 1 GB/s.)
All JSON functions currently throw an error if any of their
arguments are BLOBs because BLOBs are reserved
for a future enhancement in which BLOBs will store the binary encoding
for JSON.json1.html#interface_overview„S†Z     EE‡iUJSON Functions And Operators2. Compiling in JSON SupportThe JSON functions and operators are built into SQLite by default,
as of SQLite version 3.38.0 (2022-02-22).  They can be omitted
by adding the -DSQLITE_OMIT_JSON compile-time option.  Prior to
version 3.38.0, the JSON functions were an extension that would only
be included in builds if the -DSQLITE_ENABLE_JSON1 compile-time option
was included.  In other words, the JSON functions went from being
opt-in with SQLite version 3.37.2 and earlier to opt-out with
SQLite version 3.38.0 and later.json1.html#compiling_in_json_support‡A†Y       E#Ž  3JSON Functions And Operators1. OverviewBy default, SQLite supports fifteen functions and two operators for
dealing with JSON values.  There are also two table-valued functions
that can be used to decompose a JSON string.


There are 15 scalar functions and operators:



json(json)



json_array(value1,value2,...)



json_array_length(json)json_array_length(json,path)



json_extract(json,path,...)



json -> path



json ->> path



json_insert(json,path,value,...)



json_object(label1,value1,...)



json_patch(json1,json2)



json_remove(json,path,...)



json_replace(json,path,value,...)



json_set(json,path,value,...)



json_type(json)json_type(json,path)



json_valid(json)



json_quote(value)





There are two aggregate SQL functions:



json_group_array(value)



json_group_object(name,value)





The two table-valued functions are:



json_each(json)json_each(json,path)



json_tree(json)json_tree(json,path)json1.html#overview
ø÷C¾øA†`    E3iCJSON Functions And Operators4. Function DetailsThe following sections provide additional detail on the operation of
the various JSON functions and operators:json1.html#function_detailsƒ†_       E1„o=JSON Functions And Operators3.4. CompatibilityThe current implementation of this JSON library uses a recursive descent
parser.  In order to avoid using excess stack space, any JSON input that has
more than 2000 levels of nesting is considered invalid.   Limits on nesting
depth are allowed for compatible implementations of JSON by
RFC-7159 section 9.json1.html#compatibility/†^        E5™EAJSON Functions And Operators3.3. VALUE argumentsFor functions that accept "value" arguments (also shown as
"value1" and "value2"),
those arguments are usually understood
to be literal strings that are quoted and become JSON string values
in the result.  Even if the input value strings look like 
well-formed JSON, they are still interpreted as literal strings in the
result.


However, if a value argument comes directly from the result of another
JSON function or from the -> operator (but not the ->> operator),
then the argument is understood to be actual JSON and
the complete JSON is inserted rather than a quoted string.


For example, in the following call to json_object(), the value
argument looks like a well-formed JSON array.  However, because it is just
ordinary SQL text, it is interpreted as a literal string and added to the
result as a quoted string:


json_object('ex','[52,3.14159]')
&rarr; '{"ex":"[52,3.14159]"}'

json_object('ex',('52,3.14159]'->>'$'))
&rarr; '{"ex":"[52,3.14159]"}'





But if the value argument in the outer json_object() call is the
result of another JSON function like json() or json_array(), then
the value is understood to be actual JSON and is inserted as such:


json_object('ex',json('[52,3.14159]'))
&rarr; '{"ex":[52,3.14159]}'

json_object('ex',json_array(52,3.14159))
&rarr; '{"ex":[52,3.14159]}'

json_object('ex','[52,3.14159]'->'$')
&rarr; '{"ex":[52,3.14159]}'





To be clear: "json" arguments are always interpreted as JSON
regardless of where the value for that argument comes from.  But
"value" arguments are only interpreted as JSON if those arguments
come directly from another JSON function or the -> operator.json1.html#value_argumentsˆ†]     E3Žs?JSON Functions And Operators3.2. PATH argumentsFor functions that accept PATH arguments, that PATH must be well-formed or
else the function will throw an error.
A well-formed PATH is a text value that begins with exactly one
'$' character followed by zero or more instances
of ".objectlabel" or "&#91;arrayindex&#93;".


The arrayindex is usually a non-negative integer N.  In
that case, the array element selected is the N-th element
of the array, starting with zero on the left.
The arrayindex can also be of the form "#-N"
in which case the element selected is the N-th from the
right.  The last element of the array is "#-1".  Think of
the "#" characters as the "number of elements in the array".  Then
the expression "#-1" evaluates to the integer that corresponds to 
the last entry in the array.  It is sometimes useful for the array
index to be just the # character, for example when appending
a value to an existing JSON array:


json_set('[0,1,2]','$[#]','new')
&rarr; '[0,1,2,"new"]'json1.html#path_arguments
†o†c     EWŒ_JSON Functions And Operators4.3. The json_array_length() functionThe json_array_length(X) function returns the number of elements
in the JSON array X, or 0 if X is some kind of JSON value other
than an array.  The json_array_length(X,P) locates the array at path P
within X and returns the length of that array, or 0 if path P locates
an element or X other than a JSON array, and NULL if path P does not
locate any element of X.  Errors are thrown if either X is not 
well-formed JSON or if P is not a well-formed path.

Examples:


json_array_length('[1,2,3,4]')
&rarr; 4

json_array_length('[1,2,3,4]', '$')
&rarr; 4

json_array_length('[1,2,3,4]', '$[2]')
&rarr; 0

json_array_length('{"one":[1,2,3]}')
&rarr; 0

json_array_length('{"one":[1,2,3]}', '$.one')
&rarr; 3

json_array_length('{"one":[1,2,3]}', '$.two')
&rarr; NULLjson1.html#the_json_array_length_function‡B†b       EIGQJSON Functions And Operators4.2. The json_array() functionThe json_array() SQL function accepts zero or more arguments and
returns a well-formed JSON array that is composed from those arguments.
If any argument to json_array() is a BLOB then an error is thrown.

An argument with SQL type TEXT is normally converted into a quoted 
JSON string.  However, if the argument is the output from another json1
function, then it is stored as JSON.  This allows calls to json_array()
and json_object() to be nested.  The json() function can also
be used to force strings to be recognized as JSON.

Examples:


json_array(1,2,'3',4)
&rarr; '[1,2,"3",4]'

json_array('[1,2]')
&rarr; '["[1,2]"]'

json_array(json_array(1,2))
&rarr; '[[1,2]]'

json_array(1,null,'3','[4,5]','{"six":7.7}')
&rarr; '[1,null,"3","[4,5]","{\"six\":7.7}"]'

json_array(1,null,'3',json('[4,5]'),json('{"six":7.7}'))
&rarr; '[1,null,"3",[4,5],{"six":7.7}]'json1.html#the_json_array_functionˆ1†a  E==EJSON Functions And Operators4.1. The json() functionThe json(X) function verifies that its argument X is a valid
JSON string and returns a minified version of that JSON string
(with all unnecessary whitespace removed).  If X is not a well-formed
JSON string, then this routine throws an error.

In other words, this function converts raw text that looks like
JSON into actual JSON so that it may be passed into the value argument
of some other json function and will be interpreted as JSON rather than
a string.  This function is not appropriate for testing whether or not
a particular string is well-formed JSON - use the json_valid() routine
below for that task.

If the argument X to json(X) contains JSON objects with duplicate
labels, then it is undefined whether or not the duplicates are
preserved.  The current implementation preserves duplicates.
However, future enhancements
to this routine may choose to silently remove duplicates.


Example:


json(' { "this" : "is", "a": [ "test" ] } ')
&rarr; '{"this":"is","a":["test"]}'json1.html#the_json_function
åå’†d    EM¢gUJSON Functions And Operators4.4. The json_extract() functionThe json_extract(X,P1,P2,...) extracts and returns one or more 
values from the
well-formed JSON at X.  If only a single path P1 is provided, then the
SQL datatype of the result is NULL for a JSON null, INTEGER or REAL
for a JSON numeric value, an INTEGER zero for a JSON false value,
an INTEGER one for a JSON true value, the dequoted text for a 
JSON string value, and a text representation for JSON object and array values.
If there are multiple path arguments (P1, P2, and so forth) then this
routine returns SQLite text which is a well-formed JSON array holding
the various values.

Examples:


json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$')
&rarr; '{"a":2,"c":[4,5,{"f":7}]}'

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c')
&rarr; '[4,5,{"f":7}]'

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2]')
&rarr; '{"f":7}'

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.c[2].f')
&rarr; 7

json_extract('{"a":2,"c":[4,5],"f":7}','$.c','$.a')
&rarr; '[[4,5],2]'

json_extract('{"a":2,"c":[4,5],"f":7}','$.c[#-1]')
&rarr; 5

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x')
&rarr; NULL

json_extract('{"a":2,"c":[4,5,{"f":7}]}', '$.x', '$.a')
&rarr; '[null,2]'

json_extract('{"a":"xyz"}', '$.a')
&rarr; 'xyz'

json_extract('{"a":null}', '$.a')
&rarr; NULL




There is a subtle incompatibility between the json_extract() function
in SQLite and the json_extract() function in MySQL.  The MySQL version
of json_extract() always returns JSON.  The SQLite version of
json_extract() only returns JSON if there are two or more PATH arguments
(because the result is then a JSON array) or if the single PATH argument
references an array or object.  In SQLite, if json_extract() has only
a single PATH argument and that PATH references a JSON null or a string
or a numeric value, then json_extract() returns the corresponding SQL
NULL, TEXT, INTEGER, or REAL value.

The difference between MySQL json_extract() and SQLite json_extract()
really only stands out when accessing individual values within the JSON
that are strings or NULLs.  The following table demonstrates the difference:



OperationSQLite ResultMySQL Result
json_extract('{"a":null,"b":"xyz"}','$.a')NULL'null'
json_extract('{"a":null,"b":"xyz"}','$.b')'xyz''"xyz"'json1.html#the_json_extract_function
ll“†e  EG¤oEJSON Functions And Operators4.5. The -> and ->> operatorsBeginning with SQLite version 3.38.0 (2022-02-22), the ->
and ->> operators are available for extracting subcomponents of JSON.
The SQLite implementation of the -> and ->> operators strive to be
compatible with both MySQL and PostgreSQL.
The -> and ->> operators take a JSON string
as their left operand and a PATH expression or object field
label or array index as their right operand.  The -> operator
returns a JSON representation of the selected subcomponent or NULL if that
subcomponent does not exist.  The ->> operator returns an SQL TEXT,
INTEGER, REAL, or NULL value that represents the selected subcomponent,
or NULL if the subcomponent does not exist.

Both the -> and ->> operators select the same subcomponent
of the JSON to their left.  The difference is that -> always returns a
JSON representation of that subcomponent and the ->> operator always
returns an SQL representation of that subcomponent.  Thus, these operators
are subtly different from a two-argument json_extract() function call.
A call to json_extract() with two arguments will return a JSON representation
of the subcomponent if and only if the subcomponent is a JSON array or
object, and will return an SQL representation of the subcomponent if the
subcomponent is a JSON null, string, or numeric value.

The right-hand operand to the -> and ->> operators can
be a well-formed JSON path expression.  This is the form used by MySQL.
For compatibility with PostgreSQL,
the -> and ->> operators also accept a text label or
integer as their right-hand operand.  If the right operand is a text
label X, then it is interpreted as the JSON path '$.X'.  If the right
operand is an integer value N, then it is interpreted as the JSON path '$[N]'.

Examples:


'{"a":2,"c":[4,5,{"f":7}]}' -> '$'
&rarr; '{"a":2,"c":[4,5,{"f":7}]}'

'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c'
&rarr; '[4,5,{"f":7}]'

'{"a":2,"c":[4,5,{"f":7}]}' -> 'c'
&rarr; '[4,5,{"f":7}]'

'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c[2]'
&rarr; '{"f":7}'

'{"a":2,"c":[4,5,{"f":7}]}' -> '$.c[2].f'
&rarr; '7'

'{"a":2,"c":[4,5],"f":7}' -> '$.c[#-1]'
&rarr; '5'

'{"a":2,"c":[4,5,{"f":7}]}' -> '$.x'
&rarr; NULL

'[11,22,33,44]' -> 3
&rarr; '44'

'[11,22,33,44]' ->> 3
&rarr; 44

'{"a":"xyz"}' -> '$.a'
&rarr; '"xyz"'

'{"a":"xyz"}' ->> '$.a'
&rarr; 'xyz'

'{"a":null}' -> '$.a'
&rarr; 'null'

'{"a":null}' ->> '$.a'
&rarr; NULLjson1.html#the_and_operators
ŸuŸ‰Q†g     EK‘aSJSON Functions And Operators4.7. The json_object() functionThe json_object() SQL function accepts zero or more pairs of arguments
and returns a well-formed JSON object that is composed from those arguments.
The first argument of each pair is the label and the second argument of
each pair is the value.
If any argument to json_object() is a BLOB then an error is thrown.

The json_object() function currently allows duplicate labels without
complaint, though this might change in a future enhancement.

An argument with SQL type TEXT it is normally converted into a quoted 
JSON string even if the input text is well-formed JSON.  
However, if the argument is the direct result from another JSON
function or the -> operator (but not the ->> operator), 
then it is treated as JSON and all of its JSON type information
and substructure is preserved.  This allows calls to json_object()
and json_array() to be nested.  The json() function can also
be used to force strings to be recognized as JSON.

Examples:


json_object('a',2,'c',4)
&rarr; '{"a":2,"c":4}'

json_object('a',2,'c','{e:5}')
&rarr; '{"a":2,"c":"{e:5}"}'

json_object('a',2,'c',json_object('e',5))
&rarr; '{"a":2,"c":{"e":5}}'json1.html#the_json_object_function•†fE      §S     JSON Functions And Operators4.6. The json_insert(), json_replace, and json_set() functionsThe json_insert(), json_replace, and json_set() functions all take
a single JSON value as their first argument followed by zero or more
pairs of path and value arguments, and return a new JSON string formed
by updating the input JSON by the path/value pairs.  The functions
differ only in how they deal with creating new values and overwriting
preexisting values.




FunctionOverwrite if already exists?Create if does not exist?

json_insert()NoYes

json_replace()YesNo

json_set()YesYes


The json_insert(), json_replace(), and json_set() functions always
take an odd number of arguments.  The first argument is always the original
JSON to be edited.  Subsequent arguments occur in pairs with the first
element of each pair being a path and the second element being the value
to insert or replace or set on that path.

Edits occur sequentially from left to right.  Changes caused by
prior edits can affect the path search for subsequent edits.

If the value of a path/value pair is an SQLite TEXT value, then it
is normally inserted as a quoted JSON string, even if the string looks
like valid JSON.  However, if the value is the result of another
json1 function (such as json() or json_array() or json_object())
or if it is the result of the -> operator,
then it is interpreted as JSON and is inserted as JSON retaining all
of its substructure.  Values that are the result of the ->> operator
are always interpreted as TEXT and are inserted as a JSON string even
if they look like valid JSON.

These routines throw an error if the first JSON argument is not
well-formed or if any PATH argument is not well-formed or if any
argument is a BLOB.

To append an element onto the end of an array, using json_insert()
with an array index of "#".  Examples:


json_insert('[1,2,3,4]','$[#]',99)
&rarr; '[1,2,3,4,99]'

json_insert('[1,[2,3],4]','$[1][#]',99)
&rarr; '[1,[2,3,99],4]'




Other examples:


json_insert('{"a":2,"c":4}', '$.a', 99)
&rarr; '{"a":2,"c":4}'

json_insert('{"a":2,"c":4}', '$.e', 99)
&rarr; '{"a":2,"c":4,"e":99}'

json_replace('{"a":2,"c":4}', '$.a', 99)
&rarr; '{"a":99,"c":4}'

json_replace('{"a":2,"c":4}', '$.e', 99)
&rarr; '{"a":2,"c":4}'

json_set('{"a":2,"c":4}', '$.a', 99)
&rarr; '{"a":99,"c":4}'

json_set('{"a":2,"c":4}', '$.e', 99)
&rarr; '{"a":2,"c":4,"e":99}'

json_set('{"a":2,"c":4}', '$.c', '[97,96]')
&rarr; '{"a":2,"c":"[97,96]"}'

json_set('{"a":2,"c":4}', '$.c', json('[97,96]'))
&rarr; '{"a":2,"c":[97,96]}'

json_set('{"a":2,"c":4}', '$.c', json_array(97,96))
&rarr; '{"a":2,"c":[97,96]}'json1.html#the_json_insert_json_replace_and_json_set_functions
ín1íŠ?†j    EI“COJSON Functions And Operators4.10. The json_type() functionThe json_type(X) function returns the "type" of the outermost element
of X.  The json_type(X,P) function returns the "type" of the element
in X that is selected by path P.  The "type" returned by json_type() is
one of the following SQL text values:
'null', 'true', 'false', 'integer', 'real', 'text', 'array', or 'object'.
If the path P in json_type(X,P) selects an element that does not exist
in X, then this function returns NULL.

The json_type() function throws an error if any of its arguments is
not well-formed or is a BLOB.

Examples:


json_type('{"a":[2,3.5,true,false,null,"x"]}')
&rarr; 'object'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$')
&rarr; 'object'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a')
&rarr; 'array'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[0]')
&rarr; 'integer'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[1]')
&rarr; 'real'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[2]')
&rarr; 'true'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[3]')
&rarr; 'false'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[4]')
&rarr; 'null'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[5]')
&rarr; 'text'

json_type('{"a":[2,3.5,true,false,null,"x"]}','$.a[6]')
&rarr; NULLjson1.html#the_json_type_functionŠ8†i       EK“/SJSON Functions And Operators4.9. The json_remove() functionThe json_remove(X,P,...) function takes a single JSON value as its
first argument followed by zero or more path arguments.
The json_remove(X,P,...) function returns
a copy of the X parameter with all the elements 
identified by path arguments removed.  Paths that select elements
not found in X are silently ignored.

Removals occurs sequentially from left to right.  Changes caused by
prior removals can affect the path search for subsequent arguments.

If the json_remove(X) function is called with no path arguments,
then it returns the input X reformatted, with excess whitespace
removed.

The json_remove() function throws an error if the first argument
is not well-formed JSON or if any later argument is not a well-formed
path, or if any argument is a BLOB.

Examples:


json_remove('[0,1,2,3,4]','$[2]')
&rarr; '[0,1,3,4]'

json_remove('[0,1,2,3,4]','$[2]','$[0]')
&rarr; '[1,3,4]'

json_remove('[0,1,2,3,4]','$[0]','$[2]')
&rarr; '[1,2,4]'

json_remove('[0,1,2,3,4]','$[#-1]','$[0]')
&rarr; '[1,2,3]'

json_remove('{"x":25,"y":42}')
&rarr; '{"x":25,"y":42}'

json_remove('{"x":25,"y":42}','$.z')
&rarr; '{"x":25,"y":42}'

json_remove('{"x":25,"y":42}','$.y')
&rarr; '{"x":25}'

json_remove('{"x":25,"y":42}','$')
&rarr; NULLjson1.html#the_json_remove_function‰
†h     EI]QJSON Functions And Operators4.8. The json_patch() functionThe json_patch(T,P) SQL function runs the
RFC-7396 MergePatch algorithm
to apply patch P against input T.  The patched copy of T is returned.

MergePatch can add, modify, or delete elements of a JSON Object,
and so for JSON Objects, the json_patch() routine is a generalized
replacement for json_set() and json_remove().  However, MergePatch
treats JSON Array objects as atomic.  MergePatch cannot append to an
Array nor modify individual elements of an Array.  It can only insert,
replace, or delete the whole Array as a single unit.  Hence, json_patch()
is not as useful when dealing with JSON that includes Arrays,
especially Arrays with lots of substructure.

Examples:


json_patch('{"a":1,"b":2}','{"c":3,"d":4}')
&rarr; '{"a":1,"b":2,"c":3,"d":4}'

json_patch('{"a":[1,2],"b":2}','{"a":9}')
&rarr; '{"a":9,"b":2}'

json_patch('{"a":[1,2],"b":2}','{"a":null}')
&rarr; '{"b":2}'

json_patch('{"a":1,"b":2}','{"a":9,"b":null,"c":8}')
&rarr; '{"a":9,"c":8}'

json_patch('{"a":{"x":1,"y":2},"b":3}','{"a":{"y":9},"c":8}')
&rarr; '{"a":{"x":1,"y":9},"b":3,"c":8}'json1.html#the_json_patch_function

þÇË
þƒH†mE%„'JSON Functions And Operators4.13. The json_group_array() and json_group_object()
aggregate SQL functionsThe json_group_array(X) function is an 
aggregate SQL function that returns a JSON array
comprised of all X values in the aggregation.
Similarly, the json_group_object(NAME,VALUE) function returns a JSON object
comprised of all NAME/VALUE pairs in the aggregation.json1.html#the_json_group_array_and_json_group_object_aggregate_sql_functionsƒw†l EK†/QJSON Functions And Operators4.12. The json_quote() functionThe json_quote(X) function converts the SQL value X (a number or a
string) into its corresponding JSON representation.  If X is a JSON value
returned by another JSON function, then this function is a no-op.

Examples:


json_quote(3.14159)
&rarr; 3.14159

json_quote('verdant')
&rarr; '"verdant"'

json_quote('[1]')
&rarr; '"[1]"'

json_quote(json('[1]'))
&rarr; '[1]'

json_quote('[1,')
&rarr; '"[1"'json1.html#the_json_quote_function‚4†k    EKƒ)QJSON Functions And Operators4.11. The json_valid() functionThe json_valid(X) function return 1 if the argument X is well-formed
JSON and return 0 if the argument X is not well-formed JSON.

Examples:


json_valid('{"x":35}')
&rarr; 1

json_valid('{"x":35')
&rarr; 0json1.html#the_json_valid_function
99™B†nE°QJSON Functions And Operators4.14. The json_each() and json_tree() table-valued functionsThe json_each(X) and json_tree(X) table-valued functions walk the
JSON value provided as their first argument and return one row for each
element.  The json_each(X) function only walks the immediate children
of the top-level array or object,
or just the top-level element itself if the top-level
element is a primitive value.
The json_tree(X) function recursively walks through the
JSON substructure starting with the top-level element.  

The json_each(X,P) and json_tree(X,P) functions work just like
their one-argument counterparts except that they treat the element
identified by path P as the top-level element.

The schema for the table returned by json_each() and json_tree() is
as follows:


CREATE TABLE json_tree(
    key ANY,             -- key for current element relative to its parent
    value ANY,           -- value for the current element
    type TEXT,           -- 'object','array','string','integer', etc.
    atom ANY,            -- value for primitive types, null for array & object
    id INTEGER,          -- integer ID for this element
    parent INTEGER,      -- integer ID for the parent of this element
    fullkey TEXT,        -- full path describing the current element
    path TEXT,           -- path to the container of the current row
    json JSON HIDDEN,    -- 1st input parameter: the raw JSON
    root TEXT HIDDEN     -- 2nd input parameter: the PATH at which to start
);



The "key" column is the integer array index for elements of a JSON array 
and the text label for elements of a JSON object.  The key column is
NULL in all other cases.


The "atom" column is the SQL value corresponding to primitive elements - 
elements other than JSON arrays and objects.  The "atom" column is NULL
for a JSON array or object.  The "value" column is the same as the
"atom" column for primitive JSON elements but takes on the text JSON value
for arrays and objects.


The "type" column is an SQL text value taken from ('null', 'true', 'false',
'integer', 'real', 'text', 'array', 'object') according to the type of
the current JSON element.


The "id" column is an integer that identifies a specific JSON element
within the complete JSON string.  The "id" integer is an internal housekeeping
number, the computation of which might change in future releases.  The
only guarantee is that the "id" column will be different for every row.


The "parent" column is always NULL for json_each().
For json_tree(),
the "parent" column is the "id" integer for the parent of the current
element, or NULL for the top-level JSON element or the element identified
by the root path in the second argument.


The "fullkey" column is a text path that uniquely identifies the current
row element within the original JSON string.  The complete key to the
true top-level element is returned even if an alternative starting point
is provided by the "root" argument.


The "path" column is the path to the array or object container that holds 
the current row, or the path to the current row in the case where the 
iteration starts on a primitive type and thus only provides a single
row of output.json1.html#the_json_each_and_json_tree_table_valued_functions
¥Î¥„$ŽA ++‡KIPartial Indexes1. IntroductionA partial index is an index over a subset of the rows of a table.



In ordinary indexes, there is exactly one entry in the index for every
row in the table.  In partial indexes, only some subset of the rows in the
table have corresponding index entries.  For example, a partial index might
omit entries for which the column being indexed is NULL.  When used 
judiciously, partial indexes can result in smaller database files and
improvements in both query and write performance.partialindex.html#introduction-†o    EqžUqJSON Functions And Operators4.14.1. Examples using json_each() and json_tree()Suppose the table "CREATE TABLE user(name,phone)" stores zero or
more phone numbers as a JSON array object in the user.phone field.
To find all users who have any phone number with a 704 area code:


SELECT DISTINCT user.name
  FROM user, json_each(user.phone)
 WHERE json_each.value LIKE '704-%';


Now suppose the user.phone field contains plain text if the user
has only a single phone number and a JSON array if the user has multiple
phone numbers.  The same question is posed: "Which users have a phone number
in the 704 area code?"  But now the json_each() function can only be called
for those users that have two or more phone numbers since json_each()
requires well-formed JSON as its first argument:


SELECT name FROM user WHERE phone LIKE '704-%'
UNION
SELECT user.name
  FROM user, json_each(user.phone)
 WHERE json_valid(user.phone)
   AND json_each.value LIKE '704-%';


Consider a different database with "CREATE TABLE big(json JSON)".
To see a complete line-by-line decomposition of the data:


SELECT big.rowid, fullkey, value
  FROM big, json_tree(big.json)
 WHERE json_tree.type NOT IN ('object','array');


In the previous, the "type NOT IN ('object','array')" term of the
WHERE clause suppresses containers and only lets through leaf elements.
The same effect could be achieved this way:


SELECT big.rowid, fullkey, atom
  FROM big, json_tree(big.json)
 WHERE atom IS NOT NULL;


Suppose each entry in the BIG table is a JSON object 
with a '$.id' field that is a unique identifier
and a '$.partlist' field that can be a deeply nested object.
You want to find the id of every entry that contains one
or more references to uuid '6fa5181e-5721-11e5-a04e-57f3d7b32808' anywhere
in its '$.partlist'.


SELECT DISTINCT json_extract(big.json,'$.id')
  FROM big, json_tree(big.json, '$.partlist')
 WHERE json_tree.key='uuid'
   AND json_tree.value='6fa5181e-5721-11e5-a04e-57f3d7b32808';

This page last modified on  2022-06-24 16:56:23 UTCjson1.html#examples_using_json_each_and_json_tree_
•bŽB   +CªaPartial Indexes2. Creating Partial IndexesCreate a partial index by adding a WHERE clause to the end of an 
ordinary CREATE INDEX statement.


create-index-stmt:
hide
 
 

expr:
show
 
 

filter-clause:
show
 
 


literal-value:
show
 
 


over-clause:
show
 
 

frame-spec:
show
 
 


ordering-term:
show
 
 



raise-function:
show
 
 


select-stmt:
show
 
 

common-table-expression:
show
 
 


compound-operator:
show
 
 


join-clause:
show
 
 

join-constraint:
show
 
 


join-operator:
show
 
 



ordering-term:
show
 
 


result-column:
show
 
 


table-or-subquery:
show
 
 


window-defn:
show
 
 

frame-spec:
show
 
 




type-name:
show
 
 

signed-number:
show
 
 




indexed-column:
show
 
 






Any index that includes the WHERE clause at the end is considered to be
a partial index.  Indexes that omit the WHERE clause (or indexes that
are created by UNIQUE or PRIMARY KEY constraints inside of CREATE TABLE
statements) are ordinary full indexes.



The expression following the WHERE clause may contain operators,
literal values, and names of columns in the table being indexed.
The WHERE clause may not contain subqueries, references to other
tables, non-deterministic functions, or bound parameters.


Only rows of the table for which the WHERE clause evaluates to true
are included in the index.  If the WHERE clause expression evaluates 
to NULL or to false for some rows of the table, then those rows are omitted 
from the index.



The columns referenced in the WHERE clause of a partial index can be
any of the columns in the table, not just columns that happen to be
indexed.  However, it is very common for the WHERE clause
expression of a partial index to be a simple expression on the column
being indexed.  The following is a typical example:

CREATE INDEX po_parent ON purchaseorder(parent_po) WHERE parent_po IS NOT NULL;


In the example above, if most purchase orders do not have a "parent"
purchase order, then most parent_po values will be NULL.  That means only
a small subset of the rows in the purchaseorder table will be indexed.
Hence the index will take up much less space.  And changes to the original
purchaseorder table will run faster since the po_parent index only needs
to be updated for those exceptional rows where parent_po is not NULL.
But the index is still useful for querying.  In particular, if one wants
to know all "children" of a particular purchase order "?1", the query
would be:

SELECT po_num FROM purchaseorder WHERE parent_po=?1;


The query above will use the po_parent index to help find the answer,
since the po_parent index contains entries for all rows of interest.
Note that since po_parent is smaller than a full index, the query will
likely run faster too.partialindex.html#creating_partial_indexes

Ê
ÊŠ1ŽC     +C“9]Partial Indexes2.1. Unique Partial IndexesA partial index definition may include the UNIQUE keyword.  If it
does, then SQLite requires every entry in the index to be unique.
This provides a mechanism for enforcing uniqueness across some subset of
the rows in a table.

For example, suppose you have a database of the members of a large
organization where each person is assigned to a particular "team".  
Each team has a "leader" who is also a member of that team.  The
table might look something like this:

CREATE TABLE person(
  person_id       INTEGER PRIMARY KEY,
  team_id         INTEGER REFERENCES team,
  is_team_leader  BOOLEAN,
  -- other fields elided
);


The team_id field cannot be unique because there are usually multiple people
on the same team.  One cannot make the combination of team_id and is_team_leader
unique since there are usually multiple non-leaders on each team.  The
solution to enforcing one leader per team is to create a unique index
on team_id but restricted to those entries for which is_team_leader is
true:

CREATE UNIQUE INDEX team_leader ON person(team_id) WHERE is_team_leader;


Coincidentally, that same index is useful for locating the team leader
of a particular team:

SELECT person_id FROM person WHERE is_team_leader AND team_id=?1;partialindex.html#unique_partial_indexes
:¼V:„¥y        a5†gSMany Small Queries Are Efficient In SQLite1. Executive Summary200 SQL statements per webpage is excessive for client/server database
engines like MySQL, PostgreSQL, or SQL Server.


But with SQLite, 200 or more SQL statement per webpage is not a problem.


SQLite can also do large and complex queries efficiently, just like
client/server databases.  But SQLite can do many smaller queries
efficiently too.  Application developers can use whichever technique
works best for the task at hand.np1queryprob.html#executive_summary„aŽE        +7ˆ-UPartial Indexes4. Supported VersionsPartial indexes have been supported in SQLite since version 3.8.0
(2013-08-26).


Database files that contain partial indices are not readable or writable
by versions of SQLite prior to 3.8.0.  However, a database file created
by SQLite 3.8.0 is still readable and writable by prior versions as long
as its schema contains no partial indexes.  A database that is unreadable
by legacy versions of SQLite can be made readable simply by running
DROP INDEX on the partial indexes.
This page last modified on  2022-01-20 21:38:08 UTCpartialindex.html#supported_versions–?ŽD    +M«=kPartial Indexes3. Queries Using Partial IndexesLet X be the expression in the WHERE clause of a partial
index, and let W be the WHERE clause of a query that uses the
table that is indexed.  Then, the query is permitted to use 
the partial index if W&#x21d2;X, where the &#x21d2; operator
(usually pronounced "implies") is the logic operator 
equivalent to "X or not W".
Hence, determining whether or not a partial index
is usable in a particular query reduces to proving a theorem in
first-order logic.

SQLite does not have a sophisticated theorem
prover with which to determine W&#x21d2;X.  Instead, SQLite uses 
two simple rules to find the common cases where W&#x21d2;X is true, and
it assumes all the other cases are false.  The rules used by SQLite
are these:


If W is AND-connected terms and X is
OR-connected terms and if any term of W
appears as a term of X, then the partial index is usable.

For example, let the index be
CREATE INDEX ex1 ON tab1(a,b) WHERE a=5 OR b=6;

And let the query be:
SELECT * FROM tab1 WHERE b=6 AND a=7; -- uses partial index

Then the index is usable by the query because the "b=6" term appears
in both the index definition and in the query.  Remember: terms in the
index should be OR-connected and terms in the query should be AND-connected.

The terms in W and X must match exactly.  SQLite does not
do algebra to try to get them to look the same.
The term "b=6" does not match "b=3+3" or "b-6=0" or "b BETWEEN 6 AND 6".
"b=6" will match to "6=b" as long as "b=6" is on the index and "6=b" is
in the query.  If a term of the form "6=b" appears in the index, it will
never match anything.

If a term in X is of the form "z IS NOT NULL" and if a term in
       W is a comparison operator on "z" other than "IS", then those
       terms match.

Example:  Let the index be
CREATE INDEX ex2 ON tab2(b,c) WHERE c IS NOT NULL;

Then any query that uses operators =, &lt;, &gt;, &lt;=, &gt;=, &lt;&gt;,
IN, LIKE, or GLOB on column "c" 
would be usable with the partial index because those
comparison operators are only true if "c" is not NULL.  So the following
query could use the partial index:
SELECT * FROM tab2 WHERE b=456 AND c&lt;&gt;0;  -- uses partial index

But the next query can not use the partial index:
SELECT * FROM tab2 WHERE b=456;  -- cannot use partial index

The latter query can not use the partial index because there might be
rows in the table with b=456 and where c is NULL.  But those rows would
not be in the partial index.


These two rules describe how the query planner for SQLite works as of
this writing (2013-08-01).  And the rules above will always be honored.
However, future versions of SQLite might incorporate a better theorem prover
that can find other cases where W&#x21d2;X is true and thus may
find more instances where partial indexes are useful.partialindex.html#queries_using_partial_indexes
Z
€g¥|as‚Many Small Queries Are Efficient In SQLite4. The Need For Over 200 SQL Statements Per WebpageThe dynamic webpages on the SQLite website are mostly generated by
the Fossil version control system.
A typical dynamic
page would be a timeline such as https://www.sqlite.org/src/timeline.
A log of all SQL used by the timeline is shown below.


The first group of queries in the log are extracting display options
from the "config" and "global_config" tables of the Fossil database.
Then there is a single complex query that extracts a list of all elements
to be displayed on the timeline.
This "timeline" query demonstrates that SQLite can easily process complex
relational database queries involving multiple tables, subqueries, and
complex WHERE clause constraints, and it can make effective use of indexes
to solve the queries with minimal disk I/O.


Following the single big "timeline" query, 
there are additional queries for each timeline element.
Fossil is using the "N+1 Query" pattern rather than trying
to grab all the information in as few queries as possible.
But that is ok because there is no unnecessary IPC overhead.
At the bottom of
each timeline page, Fossil shows approximately how long it took to generate
the page.  For a 50-entry timeline, the latency is usually less than
25 milliseconds.  Profiling shows that few of those milliseconds
were spent inside the database engine.


Using the N+1 Query pattern in Fossil does not harm the application.  
But the N+1 Query pattern does have benefits.  For one, the
section of the code that creates the timeline query can be
completely separate from the section that prepares each timeline
entry for display.
This provides a separation of responsibility that helps keep the code
simple and easy to maintain.  Secondly, the information
needed for display, and the queries needed to extract that information,
vary according to what type of objects to be shown.  Check-ins need one
set of queries.  Tickets need another set of queries.  Wiki pages need a
different queržƒU¥{
ae…Many Small Queries Are Efficient In SQLite3. N+1 Queries Are Not A Problem With SQLiteSQLite is not client/server, however.  The SQLite database runs
in the same process address space as the application.  Queries do not
involve message round-trips, only a function call.  The latency
of a single SQL query is far less in SQLite.  Hence, using a large number
of queries with SQLite is not the problem.np1queryprob.html#n_1_queries_are_not_a_problem_with_sqlite‡!¥z      a=Œk[Many Small Queries Are Efficient In SQLite2. The Perceived ProblemThe Appropriate Uses For SQLite page says that
dynamic pages on the SQLite website typically do about 200 SQL
statements each.
This has provoked criticism from readers.  Examples:



"200 SQL statements is a ridiculously high number for a single page"

"For most sites, 200 queries is way, way, way too much."

"&#91;This is&#93; bad design"



Such criticism would be well-founded for a traditional client/server
database engine, such as MySQL, PostgreSQL, or SQL Server.  In
a client/server database, each SQL statement requires a message
round-trip from the application to the database server and back to
the application.  Doing over 200 round-trip messages, sequentially,
can be a serious performance drag.  This is sometimes called the
"N+1 Query Problem" or the "N+1 Select Problem" and it is an anti-pattern.np1queryprob.html#the_perceived_problemŸy.  And so forth.  By implementing these queries on-demand
and in the part of the code dealing with the various entities, there is
further separation of responsibility and simplification of the overall 
code base.


So, SQLite is able to do one or two large and complex queries, or it can
do many smaller and simpler queries.  Both are efficient.  An application
can use either or both techniques, depending on what works best for the
situation at hand.


The following is a log of all SQL used to generate one particular
timeline (captured on 2016-09-16):

-- sqlite3_open: /home/drh/sqlite/sqlite/.fslckout
PRAGMA foreign_keys=OFF;
SELECT sql FROM localdb.sqlite_schema WHERE name=='vfile';
-- sqlite3_open: /home/drh/.fossil
PRAGMA foreign_keys=OFF;
SELECT value FROM vvar WHERE name='repository';
ATTACH DATABASE '/home/drh/www/repos/sqlite.fossil' AS 'repository' KEY '';
SELECT value FROM config WHERE name='allow-symlinks';
SELECT value FROM global_config WHERE name='allow-symlinks';
SELECT value FROM config WHERE name='aux-schema';
SELECT 1 FROM config WHERE name='baseurl:http://';
SELECT value FROM config WHERE name='ip-prefix-terms';
SELECT value FROM global_config WHERE name='ip-prefix-terms';
SELECT value FROM config WHERE name='localauth';
SELECT value FROM vvar WHERE name='default-user';
SELECT uid FROM user WHERE cap LIKE '%s%';
SELECT login FROM user WHERE uid=1;
SELECT cap FROM user WHERE login = 'nobody';
SELECT cap FROM user WHERE login = 'anonymous';
SELECT value FROM config WHERE name='public-pages';
SELECT value FROM global_config WHERE name='public-pages';
SELECT value FROM config WHERE name='header';
SELECT value FROM config WHERE name='project-name';
SELECT value FROM config WHERE name='th1-setup';
SELECT value FROM global_config WHERE name='th1-setup';
SELECT value FROM config WHERE name='redirect-to-https';
SELECT value FROM global_config WHERE name='redirect-to-https';
SELECT value FROM config WHERE name='index-page';
SELECT mtime FROM config WHERE name='css';
SELECT mtime FROM config WHERE name='logo-image';
SELECT mtime FROM config WHERE name='background-image';
CREATE TEMP TABLE IF NOT EXISTS timeline(
  rid INTEGER PRIMARY KEY,
  uuid TEXT,
  timestamp TEXT,
  comment TEXT,
  user TEXT,
  isleaf BOOLEAN,
  bgcolor TEXT,
  etype TEXT,
  taglist TEXT,
  tagid INTEGER,
  short TEXT,
  sortby REAL
)
;
INSERT OR IGNORE INTO timeline SELECT
  blob.rid AS blobRid,
  uuid AS uuid,
  datetime(event.mtime,toLocal()) AS timestamp,
  coalesce(ecomment, comment) AS comment,
  coalesce(euser, user) AS user,
  blob.rid IN leaf AS leaf,
  bgcolor AS bgColor,
  event.type AS eventType,
  (SELECT group_concat(substr(tagname,5), ', ') FROM tag, tagxref
    WHERE tagname GLOB 'sym-*' AND tag.tagid=tagxref.tagid
      AND tagxref.rid=blob.rid AND tagxref.tagtype&gt;0) AS tags,
  tagid AS tagid,
  brief AS brief,
  event.mtime AS mtime
 FROM event CROSS JOIN blob
WHERE blob.rid=event.objid
 AND NOT EXISTS(SELECT 1 FROM tagxref WHERE tagid=5 AND tagtype&gt;0 AND rid=blob.rid)
 ORDER BY event.mtime DESC LIMIT 50;
-- SELECT value FROM config WHERE name='timeline-utc';
SELECT count(*) FROM timeline WHERE etype!='div';
SELECT min(timestamp) FROM timeline;
SELECT julianday('2016-09-15 14:54:51',fromLocal());
SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob WHERE blob.rid=event.objid AND mtime&lt;=2457647.121412037);
SELECT max(timestamp) FROM timeline;
SELECT julianday('2016-09-24 17:42:43',fromLocal());
SELECT EXISTS (SELECT 1 FROM event CROSS JOIN blob WHERE blob.rid=event.objid AND mtime&gt;=2457656.238009259);
SELECT value FROM config WHERE name='search-ci';
SELECT value FROM vvar WHERE name='checkout';
SELECT value FROM config WHERE name='timeline-max-comment';
SELECT value FROM global_config WHERE name='timeline-max-comment';
SELECT value FROM config WHERE name='timeline-date-format';
SELECT value FROM config WHERE name='timeline-truncate-at-blank';
SELECT value FROM global_config WHERE name='timeline-truncate-at-blank';
SELECT * FROM timeline ORDER BY sortby DESC;
SELECT value FROM config WHERE name='hash-digits';
SEL ECT value FROM global_config WHERE name='hash-digits';
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68028;
SELECT pid FROM plink WHERE cid=68028 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM tagxref WHERE rid=68028 AND tagid=9 AND tagtype&gt;0;
SELECT value FROM config WHERE name='timeline-block-markup';
SELECT value FROM config WHERE name='timeline-plaintext';
SELECT value FROM config WHERE name='wiki-use-html';
SELECT value FROM global_config WHERE name='wiki-use-html';
SELECT 1 FROM private WHERE rid=68028;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68026;
SELECT pid FROM plink WHERE cid=68026 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68026;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68024;
SELECT pid FROM plink WHERE cid=68024 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68024;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68018;
SELECT pid FROM plink WHERE cid=68018 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68018;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68012;
SELECT pid FROM plink WHERE cid=68012 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68012;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68011;
SELECT value FROM config WHERE name='details';
SELECT pid FROM plink WHERE cid=68011 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM tagxref WHERE rid=68011 AND tagid=9 AND tagtype&gt;0;
SELECT 1 FROM private WHERE rid=68011;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68008;
SELECT pid FROM plink WHERE cid=68008 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68008;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68006;
SELECT pid FROM plink WHERE cid=68006 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68006;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=68000;
SELECT pid FROM plink WHERE cid=68000 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=68000;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67997;
SELECT pid FROM plink WHERE cid=67997 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67997;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67992;
SELECT pid FROM plink WHERE cid=67992 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67992;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67990;
SELECT pid FROM plink WHERE cid=67990 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67990;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67989;
SELECT pid FROM plink WHERE cid=67989 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67989;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67984;
SELECT pid FROM plink WHERE cid=67984 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67984;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67983;
SELECT pid FROM plink WHERE cid=67983 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67983;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67979;
SELECT pid FROM plink WHERE cid=67979 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67979;
SELECT value FROM config WHERE name='ticket-closed-expr';
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='1ec41379c9c1e400' AND tkt_uuid&lt;'1ec41379c9c1e401';
SELECT 1 FROM private WHERE rid=67980;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67977;
SELECT pid FROM plink WHERE cid=67977 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='1ec41379c9c1e400' AND tkt_uuid&lt;'1ec41379c9c1e401';
SELECT 1 F¡ROM private WHERE rid=67977;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='1ec41379c9c1e400' AND tkt_uuid&lt;'1ec41379c9c1e401';
SELECT 1 FROM private WHERE rid=67974;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67971;
SELECT pid FROM plink WHERE cid=67971 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67971;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67972;
SELECT pid FROM plink WHERE cid=67972 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67972;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67969;
SELECT pid FROM plink WHERE cid=67969 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67969;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67966;
SELECT pid FROM plink WHERE cid=67966 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67966;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67962;
SELECT pid FROM plink WHERE cid=67962 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67962;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67960;
SELECT pid FROM plink WHERE cid=67960 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67960;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67957;
SELECT pid FROM plink WHERE cid=67957 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67957;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67955;
SELECT pid FROM plink WHERE cid=67955 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67955;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67953;
SELECT pid FROM plink WHERE cid=67953 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='5990a1bdb4a073' AND tkt_uuid&lt;'5990a1bdb4a074';
SELECT 1 FROM blob WHERE uuid&gt;='5990a1bdb4a073' AND uuid&lt;'5990a1bdb4a074';
SELECT 1 FROM private WHERE rid=67953;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67941;
SELECT pid FROM plink WHERE cid=67941 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67941;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67940;
SELECT pid FROM plink WHERE cid=67940 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67940;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67938;
SELECT pid FROM plink WHERE cid=67938 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67938;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67935;
SELECT pid FROM plink WHERE cid=67935 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67935;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67934;
SELECT pid FROM plink WHERE cid=67934 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67934;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67932;
SELECT pid FROM plink WHERE cid=67932 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67932;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67930;
SELECT pid FROM plink WHERE cid=67930 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67930;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67928;
SELECT pid FROM plink WHERE cid=67928 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM tagxref WHERE rid=67928 AND tagid=9 AND tagtype&gt;0;
SELECT 1 FROM private WHERE rid=67928;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='0eab1ac7591f511d' AND tkt_uuid&lt;'0eab1ac7591f511e';
SELECT 1 FROM private WHERE rid=67919;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='01874d252ac44861' AND tkt_uuid&lt;'01874d252ac44862';
SELECT 1 FROM blob WHERE uuid&gt;='01874d252ac44861' AND uuid&lt;'01874d252ac44862';
SELECT 1 FROM private WHERE rid=67918;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67916;
SELECT pid FROM plink WHERE cid=67916 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='0eab1ac759' AND tkt_uuid&lt;'0eab1ac75:';
SELECT 1 FROM private WHERE rid=67916;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='a49bc0a8244feb08' AND tkt_uuid&lt;'a49bc0a8244feb09';
SELECT 1 FROM blob WHERE uuid&gt;='a49bc0a8244feb08' AND uuid&lt;'a49bc0a8244feb09';
SELECT 1 FROM private WHERE rid=67914;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67913;
SELECT pid FROM plink WHERE cid=67913 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='0eab1ac7591f' AND tkt_uuid&lt;'0eab1ac7591g';
SELECT 1 FROM private WHERE rid=67913;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67911;
SELECT pid FROM plink WHERE cid=67911 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67911;
SELECT status='Closed' OR status='Fixed' FROM ticket  WHERE tkt_uuid&gt;='0eab1ac7591f511d' AND tkt_uuid&lt;'0eab1ac7591f511e';
SELECT 1 FROM private WHERE rid=67909;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67907;
SELECT pid FROM plink WHERE cid=67907 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67907;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67899;
SELECT pid FROM plink WHERE cid=67899 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67899;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67897;
SELECT pid FROM plink WHERE cid=67897 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67897;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67895;
SELECT pid FROM plink WHERE cid=67895 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67895;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67893;
SELECT pid FROM plink WHERE cid=67893 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67893;
SELECT value FROM tagxref WHERE tagid=8 AND tagtype&gt;0 AND rid=67891;
SELECT pid FROM plink WHERE cid=67891 AND pid NOT IN phantom ORDER BY isprim DESC;
SELECT 1 FROM private WHERE rid=67891;
SELECT count(*) FROM plink
 WHERE pid=67928 AND isprim
   AND coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.pid), 'trunk')
      =coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.cid), 'trunk')
;
SELECT count(*) FROM plink
 WHERE pid=68011 AND isprim
   AND coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.pid), 'trunk')
      =coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.cid), 'trunk')
;
SELECT count(*) FROM plink
 WHERE pid=68028 AND isprim
   AND coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.pid), 'trunk')
      =coalesce((SELECT value FROM tagxref
                  WHERE tagid=8 AND rid=plink.cid), 'trunk')
;
SELECT value FROM config WHERE name='show-version-diffs';
SELECT value FROM config WHERE name='adunit-omit-if-admin';
SELECT value FROM global_config WHERE name='adunit-omit-if-admin';
SELECT value FROM config WHERE name='adunit-omit-if-user';
SELECT value FROM global_config WHERE name='adunit-omit-if-user';
SELECT value FROM config WHERE name='adunit';
SELECT value FROM global_config WHERE name='adunit';
SELECT value FROM config WHERE name='auto-hyperlink-delay';
SELECT value FROM global_config WHERE name='auto-hyperlink-delay';
SELECT value FROM config WHERE name='footer';
PRAGMA database_list;
PRAGMA database_list;
PRAGMA localdb.freelist_count;
PRAGMA localdb.page_count;

This page last modified on  2020-06-18 21:18:56 UTCnp1queryprob.html#the_need_for_over_200_sql_statements_per_webpage

r„
r‚
Ôj       ]3‚cIThe sqlite3_analyzer.exe Utility Program1.1. ImplementationThe sqlite3_analyzer.exe program is a
TCL program that uses the dbstat virtual table
to gather information about the database file and then format that
information neatly.sqlanalyze.html#implementationˆwÔi  ]cS}The sqlite3_analyzer.exe Utility Program1. The sqlite3_analyzer.exe Utility ProgramThe sqlite3_analyzer.exe binary is a command-line utility program
that measures and displays how much and how efficiently space is used by 
individual tables and indexes with an SQLite database file.
Example usage:


sqlite3_analyzer database.sqlite



The output is a human-readable ASCII text report that provides information
on the space utilization of the database file.  The report is intended to
be self-explanatory, though there is some 
additional explanation of the
various parameters reported toward the end of the report.


The output is also valid SQL.  Most of the report text is contained within
a header comment, with various SQL statements that create and initialize
a database at the
end of the report.  The constructed database contains
the raw data from which the report was extracted.  Hence the original
report can be read into an instance of the command-line shell and then
the raw data can be queried to dig deeper into the space utilization of
a particular database file.sqlanalyze.html#the_sqlite3_analyzer_exe_utility_program¤  0.45% 
MOZ_BOOKMARKS_PARENTINDEX......................... 1            0.45% 
MOZ_BOOKMARKS_ROOTS............................... 1            0.45% 
MOZ_HOSTS......................................... 1            0.45% 
MOZ_INPUTHISTORY.................................. 1            0.45% 
MOZ_ITEMS_ANNOS................................... 1            0.45% 
MOZ_ITEMS_ANNOS_ITEMATTRIBUTEINDEX................ 1            0.45% 
MOZ_KEYWORDS...................................... 1            0.45% 
MOZ_KEYWORDS_PLACEPOSTDATA_UNIQUEINDEX............ 1            0.45% 
SQLITE_AUTOINDEX_MOZ_ANNO_ATTRIBUTES_1............ 1            0.45% 
SQLITE_AUTOINDEX_MOZ_BOOKMARKS_ROOTS_1............ 1            0.45% 
SQLITE_AUTOINDEX_MOZ_HOSTS_1...................... 1            0.45% 
SQLITE_AUTOINDEX_MOZ_INPUTHISTORY_1............... 1            0.45% 
SQLITE_AUTOINDEX_MOZ_KEYWORDS_1................... 1            0.45% 
SQLITE_SCHEMA..................................... 1            0.45% 
SQLITE_SEQUENCE................................... 1            0.45% 
SQLITE_STAT1...................................... 1            0.45% 

*** All tables and indices ****************************************************

Percentage of total database...................... 100.0%    
Number of entries................................. 154969    
Bytes of storage consumed......................... 7241728   
Bytes of payload.................................. 4969404     68.6% 
Average payload per entry......................... 32.07     
Average unused bytes per entry.................... 11.15     
Average fanout.................................... 14.00     
Maximum payload per entry......................... 7640      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 14        
Primary pages used................................ 207       
Overflow pages used............................... 0         
Total pages used.................................. 221       
Unused bytes on index pages....................... 448010      97.7% 
Unused bytes on primary pages..................... 1280642     18.9% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 1728652     23.9% 

*** All tables ****************************************************************

Percentage of total database......................  44.8%    
Number of entries................................. 28530     
Bytes of storage consumed......................... 3244032   
Bytes of payload.................................. 2508257     77.3% 
Average payload per entry......................... 87.92     
Average unused bytes per entry.................... 20.13     
Average fanout.................................... 28.00     
Maximum payload per entry......................... 7640      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 3         
Primary pages used................................ 96        
Overflow pages used............................... 0         
Total pages used.................................. 99        
Unused bytes on index pages....................... 97551       99.23% 
Unused bytes on primary pages..................... 476741      15.2% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 574292      17.7% 

*** All indices ***************************************************************

Percentage of total database......................  55.2%    
Number of entries................................. 126439    
Bytes of storage consumed......................... 3997696   
Bytes of payload.................................. 2461147     61.6% 
Average payload per entry......................... 19.47     
Average unused bytes per entry.................... 9.13      
Average fanout.................................... 11.00     
Maximum payload per entry......................... 7259      
Entries ¥that use overflow......................... 0            0.0% 
Index pages used.................................. 11        
Primary pages used................................ 111       
Overflow pages used............................... 0         
Total pages used.................................. 122       
Unused bytes on index pages....................... 350459      97.2% 
Unused bytes on primary pages..................... 803901      22.1% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 1154360     28.9% 

*** Table MOZ_ANNO_ATTRIBUTES and all its indices *****************************

Percentage of total database......................   0.90%   
Number of entries................................. 24        
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 721          1.1% 
Average payload per entry......................... 30.04     
Average unused bytes per entry.................... 2696.46   
Maximum payload per entry......................... 43        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 64715       98.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 64715       98.7% 

*** Table MOZ_ANNO_ATTRIBUTES w/o any indices *********************************

Percentage of total database......................   0.45%   
Number of entries................................. 12        
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 355          1.1% 
B-tree depth...................................... 1         
Average payload per entry......................... 29.58     
Average unused bytes per entry.................... 2696.42   
Maximum payload per entry......................... 42        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32357       98.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32357       98.7% 

*** Index SQLITE_AUTOINDEX_MOZ_ANNO_ATTRIBUTES_1 of table MOZ_ANNO_ATTRIBUTES *

Percentage of total database......................   0.45%   
Number of entries................................. 12        
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 366          1.1% 
B-tree depth...................................... 1         
Average payload per entry......................... 30.50     
Average unused bytes per entry.................... 2696.50   
Maximum payload per entry......................... 43        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32358       98.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32358       98.7% 

*** Table MOZ_ANNOS and all its indices ***************************************

Percentage of total database......................   0.90%   
Number of entries................................. 390       
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 13986       21.3% 
Average payload per entry......................... 35.86     
Average unused bytes per entry..........¦.......... 128.22    
Maximum payload per entry......................... 127       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 50006       76.3% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 50006       76.3% 

*** Table MOZ_ANNOS w/o any indices *******************************************

Percentage of total database......................   0.45%   
Number of entries................................. 195       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 12115       37.0% 
B-tree depth...................................... 1         
Average payload per entry......................... 62.13     
Average unused bytes per entry.................... 101.04    
Maximum payload per entry......................... 127       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 19702       60.1% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 19702       60.1% 

*** Index MOZ_ANNOS_PLACEATTRIBUTEINDEX of table MOZ_ANNOS ********************

Percentage of total database......................   0.45%   
Number of entries................................. 195       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 1871         5.7% 
B-tree depth...................................... 1         
Average payload per entry......................... 9.59      
Average unused bytes per entry.................... 155.41    
Maximum payload per entry......................... 10        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 30304       92.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 30304       92.5% 

*** Table MOZ_BOOKMARKS and all its indices ***********************************

Percentage of total database......................   2.3%    
Number of entries................................. 1565      
Bytes of storage consumed......................... 163840    
Bytes of payload.................................. 37104       22.6% 
Average payload per entry......................... 23.71     
Average unused bytes per entry.................... 77.62     
Maximum payload per entry......................... 518       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 5         
Overflow pages used............................... 0         
Total pages used.................................. 5         
Unused bytes on primary pages..................... 121475      74.1% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 121475      74.1% 

*** Table MOZ_BOOKMARKS w/o any indices ***************************************

Percentage of total database......................   0.45%   
Number of entries................................. 313       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 21937       66.9% 
B-tree depth...................................... 1         
Average payload per entry......................... 70.09     
Average unused byt§es per entry.................... 29.90     
Maximum payload per entry......................... 518       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 9358        28.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 9358        28.6% 

*** Indices of table MOZ_BOOKMARKS ********************************************

Percentage of total database......................   1.8%    
Number of entries................................. 1252      
Bytes of storage consumed......................... 131072    
Bytes of payload.................................. 15167       11.6% 
Average payload per entry......................... 12.11     
Average unused bytes per entry.................... 89.55     
Maximum payload per entry......................... 17        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 4         
Overflow pages used............................... 0         
Total pages used.................................. 4         
Unused bytes on primary pages..................... 112117      85.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 112117      85.5% 

*** Index MOZ_BOOKMARKS_GUID_UNIQUEINDEX of table MOZ_BOOKMARKS ***************

Percentage of total database......................   0.45%   
Number of entries................................. 313       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 5207        15.9% 
B-tree depth...................................... 1         
Average payload per entry......................... 16.64     
Average unused bytes per entry.................... 85.03     
Maximum payload per entry......................... 17        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 26614       81.2% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 26614       81.2% 

*** Index MOZ_BOOKMARKS_ITEMINDEX of table MOZ_BOOKMARKS **********************

Percentage of total database......................   0.45%   
Number of entries................................. 313       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 2547         7.8% 
B-tree depth...................................... 1         
Average payload per entry......................... 8.14      
Average unused bytes per entry.................... 93.53     
Maximum payload per entry......................... 9         
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 29274       89.3% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 29274       89.3% 

*** Index MOZ_BOOKMARKS_ITEMLASTMODIFIEDINDEX of table MOZ_BOOKMARKS **********

Percentage of total database......................   0.45%   
Number of entries................................. 313       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 5020        15.3% 
B-tree depth...................................... 1         
Average payload per entry......................... 16.04  ¨   
Average unused bytes per entry.................... 85.63     
Maximum payload per entry......................... 17        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 26801       81.8% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 26801       81.8% 

*** Index MOZ_BOOKMARKS_PARENTINDEX of table MOZ_BOOKMARKS ********************

Percentage of total database......................   0.45%   
Number of entries................................. 313       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 2393         7.3% 
B-tree depth...................................... 1         
Average payload per entry......................... 7.65      
Average unused bytes per entry.................... 94.02     
Maximum payload per entry......................... 9         
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 29428       89.8% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 29428       89.8% 

*** Table MOZ_BOOKMARKS_ROOTS and all its indices *****************************

Percentage of total database......................   0.90%   
Number of entries................................. 10        
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 94           0.14% 
Average payload per entry......................... 9.40      
Average unused bytes per entry.................... 6539.10   
Maximum payload per entry......................... 11        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 65391       99.78% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 65391       99.78% 

*** Table MOZ_BOOKMARKS_ROOTS w/o any indices *********************************

Percentage of total database......................   0.45%   
Number of entries................................. 5         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 47           0.14% 
B-tree depth...................................... 1         
Average payload per entry......................... 9.40      
Average unused bytes per entry.................... 6538.60   
Maximum payload per entry......................... 11        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32693       99.77% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32693       99.77% 

*** Index SQLITE_AUTOINDEX_MOZ_BOOKMARKS_ROOTS_1 of table MOZ_BOOKMARKS_ROOTS *

Percentage of total database......................   0.45%   
Number of entries................................. 5         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 47           0.14% 
B-tree depth...................................... 1         
Average payload per entry....©..................... 9.40      
Average unused bytes per entry.................... 6539.60   
Maximum payload per entry......................... 11        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32698       99.79% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32698       99.79% 

*** Table MOZ_FAVICONS and all its indices ************************************

Percentage of total database......................   6.8%    
Number of entries................................. 941       
Bytes of storage consumed......................... 491520    
Bytes of payload.................................. 332765      67.7% 
Average payload per entry......................... 353.63    
Average unused bytes per entry.................... 164.00    
Average fanout.................................... 7.00      
Maximum payload per entry......................... 7640      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 2         
Primary pages used................................ 13        
Overflow pages used............................... 0         
Total pages used.................................. 15        
Unused bytes on index pages....................... 65340       99.70% 
Unused bytes on primary pages..................... 88980       20.9% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 154320      31.4% 

*** Table MOZ_FAVICONS w/o any indices ****************************************

Percentage of total database......................   5.4%    
Number of entries................................. 471       
Bytes of storage consumed......................... 393216    
Bytes of payload.................................. 297630      75.7% 
B-tree depth...................................... 2         
Average payload per entry......................... 631.91    
Average unused bytes per entry.................... 196.60    
Average fanout.................................... 11.00     
Non-sequential pages.............................. 6           54.5% 
Maximum payload per entry......................... 7640      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 11        
Overflow pages used............................... 0         
Total pages used.................................. 12        
Unused bytes on index pages....................... 32676       99.72% 
Unused bytes on primary pages..................... 59923       16.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 92599       23.5% 

*** Index SQLITE_AUTOINDEX_MOZ_FAVICONS_1 of table MOZ_FAVICONS ***************

Percentage of total database......................   1.4%    
Number of entries................................. 470       
Bytes of storage consumed......................... 98304     
Bytes of payload.................................. 35135       35.7% 
B-tree depth...................................... 2         
Average payload per entry......................... 74.76     
Average unused bytes per entry.................... 131.32    
Average fanout.................................... 3.00      
Non-sequential pages.............................. 1           50.0% 
Maximum payload per entry......................... 7259      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages useªd.................................. 3         
Unused bytes on index pages....................... 32664       99.68% 
Unused bytes on primary pages..................... 29057       44.3% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 61721       62.8% 

*** Table MOZ_HISTORYVISITS and all its indices *******************************

Percentage of total database......................  18.6%    
Number of entries................................. 63470     
Bytes of storage consumed......................... 1343488   
Bytes of payload.................................. 882233      65.7% 
Average payload per entry......................... 13.90     
Average unused bytes per entry.................... 3.76      
Average fanout.................................... 10.00     
Maximum payload per entry......................... 21        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 4         
Primary pages used................................ 37        
Overflow pages used............................... 0         
Total pages used.................................. 41        
Unused bytes on index pages....................... 130482      99.55% 
Unused bytes on primary pages..................... 108158       8.9% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 238640      17.8% 

*** Table MOZ_HISTORYVISITS w/o any indices ***********************************

Percentage of total database......................   5.9%    
Number of entries................................. 15873     
Bytes of storage consumed......................... 425984    
Bytes of payload.................................. 308447      72.4% 
B-tree depth...................................... 2         
Average payload per entry......................... 19.43     
Average unused bytes per entry.................... 2.40      
Average fanout.................................... 12.00     
Non-sequential pages.............................. 8           66.7% 
Maximum payload per entry......................... 21        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 12        
Overflow pages used............................... 0         
Total pages used.................................. 13        
Unused bytes on index pages....................... 32668       99.69% 
Unused bytes on primary pages..................... 5435         1.4% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 38103        8.9% 

*** Indices of table MOZ_HISTORYVISITS ****************************************

Percentage of total database......................  12.7%    
Number of entries................................. 47597     
Bytes of storage consumed......................... 917504    
Bytes of payload.................................. 573786      62.5% 
Average payload per entry......................... 12.06     
Average unused bytes per entry.................... 4.21      
Average fanout.................................... 9.00      
Maximum payload per entry......................... 17        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 3         
Primary pages used................................ 25        
Overflow pages used............................... 0         
Total pages used.................................. 28        
Unused bytes on index pages....................... 97814       99.50% 
Unused bytes on primary pages..................... 102723      12.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 200537      21.9% 

*** Index MOZ_HISTORYVISITS_DATEINDEX of table MOZ_HISTORYVISITS **************

Percentage of total databas«e......................   4.5%    
Number of entries................................. 15865     
Bytes of storage consumed......................... 327680    
Bytes of payload.................................. 206221      62.9% 
B-tree depth...................................... 2         
Average payload per entry......................... 13.00     
Average unused bytes per entry.................... 4.65      
Average fanout.................................... 10.00     
Non-sequential pages.............................. 6           66.7% 
Maximum payload per entry......................... 13        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 9         
Overflow pages used............................... 0         
Total pages used.................................. 10        
Unused bytes on index pages....................... 32596       99.48% 
Unused bytes on primary pages..................... 41128       13.9% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 73724       22.5% 

*** Index MOZ_HISTORYVISITS_FROMINDEX of table MOZ_HISTORYVISITS **************

Percentage of total database......................   2.7%    
Number of entries................................. 15869     
Bytes of storage consumed......................... 196608    
Bytes of payload.................................. 100292      51.0% 
B-tree depth...................................... 2         
Average payload per entry......................... 6.32      
Average unused bytes per entry.................... 3.06      
Average fanout.................................... 6.00      
Non-sequential pages.............................. 4           80.0% 
Maximum payload per entry......................... 7         
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 5         
Overflow pages used............................... 0         
Total pages used.................................. 6         
Unused bytes on index pages....................... 32702       99.80% 
Unused bytes on primary pages..................... 15927        9.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 48629       24.7% 

*** Index MOZ_HISTORYVISITS_PLACEDATEINDEX of table MOZ_HISTORYVISITS *********

Percentage of total database......................   5.4%    
Number of entries................................. 15863     
Bytes of storage consumed......................... 393216    
Bytes of payload.................................. 267273      68.0% 
B-tree depth...................................... 2         
Average payload per entry......................... 16.85     
Average unused bytes per entry.................... 4.93      
Average fanout.................................... 12.00     
Non-sequential pages.............................. 8           72.7% 
Maximum payload per entry......................... 17        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 11        
Overflow pages used............................... 0         
Total pages used.................................. 12        
Unused bytes on index pages....................... 32516       99.23% 
Unused bytes on primary pages..................... 45668       12.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 78184       19.9% 

*** Table MOZ_HOSTS and all its indices ***************************************

Percentage of total database......................   0.90%   
Number of entries................................. 1256      
Bytes of storage consumed......................... 65536     
Bytes ¬of payload.................................. 27640       42.2% 
Average payload per entry......................... 22.01     
Average unused bytes per entry.................... 26.18     
Maximum payload per entry......................... 49        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 32888       50.2% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32888       50.2% 

*** Table MOZ_HOSTS w/o any indices *******************************************

Percentage of total database......................   0.45%   
Number of entries................................. 628       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 14640       44.7% 
B-tree depth...................................... 1         
Average payload per entry......................... 23.31     
Average unused bytes per entry.................... 23.90     
Maximum payload per entry......................... 49        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 15012       45.8% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 15012       45.8% 

*** Index SQLITE_AUTOINDEX_MOZ_HOSTS_1 of table MOZ_HOSTS *********************

Percentage of total database......................   0.45%   
Number of entries................................. 628       
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 13000       39.7% 
B-tree depth...................................... 1         
Average payload per entry......................... 20.70     
Average unused bytes per entry.................... 28.46     
Maximum payload per entry......................... 47        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 17876       54.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 17876       54.6% 

*** Table MOZ_INPUTHISTORY and all its indices ********************************

Percentage of total database......................   0.90%   
Number of entries................................. 16        
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 642          0.98% 
Average payload per entry......................... 40.12     
Average unused bytes per entry.................... 4050.88   
Maximum payload per entry......................... 71        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 64814       98.9% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 64814       98.9% 

*** Table MOZ_INPUTHISTORY w/o any indices ************************************

Percentage of total database......................   0.45%   
Number of entries................................. 8         
Bytes of storage consumed......................... 32768     
Bytes of payload.............................-..... 341          1.0% 
B-tree depth...................................... 1         
Average payload per entry......................... 42.62     
Average unused bytes per entry.................... 4047.38   
Maximum payload per entry......................... 71        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32379       98.8% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32379       98.8% 

*** Index SQLITE_AUTOINDEX_MOZ_INPUTHISTORY_1 of table MOZ_INPUTHISTORY *******

Percentage of total database......................   0.45%   
Number of entries................................. 8         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 301          0.92% 
B-tree depth...................................... 1         
Average payload per entry......................... 37.62     
Average unused bytes per entry.................... 4054.38   
Maximum payload per entry......................... 65        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32435       99.0% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32435       99.0% 

*** Table MOZ_ITEMS_ANNOS and all its indices *********************************

Percentage of total database......................   0.90%   
Number of entries................................. 158       
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 9211        14.1% 
Average payload per entry......................... 58.30     
Average unused bytes per entry.................... 352.56    
Maximum payload per entry......................... 384       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 55704       85.0% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 55704       85.0% 

*** Table MOZ_ITEMS_ANNOS w/o any indices *************************************

Percentage of total database......................   0.45%   
Number of entries................................. 79        
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 8649        26.4% 
B-tree depth...................................... 1         
Average payload per entry......................... 109.48    
Average unused bytes per entry.................... 300.54    
Maximum payload per entry......................... 384       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 23743       72.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 23743       72.5% 

*** Index MOZ_ITEMS_ANNOS_ITEMATTRIBUTEINDEX of table MOZ_ITEMS_ANNOS *********

Percentage of total database......................   0.45%   
Number of entries................................. 79        
Bytes of storage consumed......................... 32768     
Bytes of payload......®............................ 562          1.7% 
B-tree depth...................................... 1         
Average payload per entry......................... 7.11      
Average unused bytes per entry.................... 404.57    
Maximum payload per entry......................... 9         
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 31961       97.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 31961       97.5% 

*** Table MOZ_KEYWORDS and all its indices ************************************

Percentage of total database......................   1.4%    
Number of entries................................. 0         
Bytes of storage consumed......................... 98304     
Bytes of payload.................................. 0            0.0% 
Average payload per entry......................... 0.0       
Average unused bytes per entry.................... 0.0       
Maximum payload per entry......................... 0         
Entries that use overflow......................... 0         
Primary pages used................................ 3         
Overflow pages used............................... 0         
Total pages used.................................. 3         
Unused bytes on primary pages..................... 98280       99.976% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 98280       99.976% 

*** Table MOZ_KEYWORDS w/o any indices ****************************************

Percentage of total database......................   0.45%   
Number of entries................................. 0         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 0            0.0% 
B-tree depth...................................... 1         
Average payload per entry......................... 0.0       
Average unused bytes per entry.................... 0.0       
Maximum payload per entry......................... 0         
Entries that use overflow......................... 0         
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32760       99.976% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32760       99.976% 

*** Indices of table MOZ_KEYWORDS *********************************************

Percentage of total database......................   0.90%   
Number of entries................................. 0         
Bytes of storage consumed......................... 65536     
Bytes of payload.................................. 0            0.0% 
Average payload per entry......................... 0.0       
Average unused bytes per entry.................... 0.0       
Maximum payload per entry......................... 0         
Entries that use overflow......................... 0         
Primary pages used................................ 2         
Overflow pages used............................... 0         
Total pages used.................................. 2         
Unused bytes on primary pages..................... 65520       99.976% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 65520       99.976% 

*** Index MOZ_KEYWORDS_PLACEPOSTDATA_UNIQUEINDEX of table MOZ_KEYWORDS ********

Percentage of total database......................   0.45%   
Number of entries................................. 0         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 0            0.0% 
B-tr¯ee depth...................................... 1         
Average payload per entry......................... 0.0       
Average unused bytes per entry.................... 0.0       
Maximum payload per entry......................... 0         
Entries that use overflow......................... 0         
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32760       99.976% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32760       99.976% 

*** Index SQLITE_AUTOINDEX_MOZ_KEYWORDS_1 of table MOZ_KEYWORDS ***************

Percentage of total database......................   0.45%   
Number of entries................................. 0         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 0            0.0% 
B-tree depth...................................... 1         
Average payload per entry......................... 0.0       
Average unused bytes per entry.................... 0.0       
Maximum payload per entry......................... 0         
Entries that use overflow......................... 0         
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32760       99.976% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32760       99.976% 

*** Table MOZ_PLACES and all its indices **************************************

Percentage of total database......................  64.3%    
Number of entries................................. 87087     
Bytes of storage consumed......................... 4653056   
Bytes of payload.................................. 3659043     78.6% 
Average payload per entry......................... 42.02     
Average unused bytes per entry.................... 7.93      
Average fanout.................................... 17.00     
Maximum payload per entry......................... 1867      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 8         
Primary pages used................................ 134       
Overflow pages used............................... 0         
Total pages used.................................. 142       
Unused bytes on index pages....................... 252188      96.2% 
Unused bytes on primary pages..................... 438258      10.0% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 690446      14.8% 

*** Table MOZ_PLACES w/o any indices ******************************************

Percentage of total database......................  28.5%    
Number of entries................................. 10894     
Bytes of storage consumed......................... 2064384   
Bytes of payload.................................. 1838131     89.0% 
B-tree depth...................................... 2         
Average payload per entry......................... 168.73    
Average unused bytes per entry.................... 14.10     
Average fanout.................................... 62.00     
Non-sequential pages.............................. 30          48.4% 
Maximum payload per entry......................... 1867      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 62        
Overflow pages used............................... 0         
Total pages used.................................. 63        
Unused bytes on index pages....................... 32207       98.3% 
Unused bytes on primary pages..................... 121406       6.0% 
Un°used bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 153613       7.4% 

*** Indices of table MOZ_PLACES ***********************************************

Percentage of total database......................  35.7%    
Number of entries................................. 76193     
Bytes of storage consumed......................... 2588672   
Bytes of payload.................................. 1820912     70.3% 
Average payload per entry......................... 23.90     
Average unused bytes per entry.................... 7.05      
Average fanout.................................... 11.00     
Maximum payload per entry......................... 1823      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 7         
Primary pages used................................ 72        
Overflow pages used............................... 0         
Total pages used.................................. 79        
Unused bytes on index pages....................... 219981      95.9% 
Unused bytes on primary pages..................... 316852      13.4% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 536833      20.7% 

*** Index MOZ_PLACES_FAVICONINDEX of table MOZ_PLACES *************************

Percentage of total database......................   2.3%    
Number of entries................................. 10891     
Bytes of storage consumed......................... 163840    
Bytes of payload.................................. 83178       50.8% 
B-tree depth...................................... 2         
Average payload per entry......................... 7.64      
Average unused bytes per entry.................... 4.40      
Average fanout.................................... 5.00      
Non-sequential pages.............................. 3           75.0% 
Maximum payload per entry......................... 8         
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 4         
Overflow pages used............................... 0         
Total pages used.................................. 5         
Unused bytes on index pages....................... 32711       99.83% 
Unused bytes on primary pages..................... 15213       11.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 47924       29.3% 

*** Index MOZ_PLACES_FRECENCYINDEX of table MOZ_PLACES ************************

Percentage of total database......................   2.3%    
Number of entries................................. 10891     
Bytes of storage consumed......................... 163840    
Bytes of payload.................................. 76772       46.9% 
B-tree depth...................................... 2         
Average payload per entry......................... 7.05      
Average unused bytes per entry.................... 4.99      
Average fanout.................................... 5.00      
Non-sequential pages.............................. 3           75.0% 
Maximum payload per entry......................... 9         
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 4         
Overflow pages used............................... 0         
Total pages used.................................. 5         
Unused bytes on index pages....................... 32714       99.84% 
Unused bytes on primary pages..................... 21616       16.5% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 54330       33.2% 

*** Index MOZ_PLACES_GUID_UNIQUEINDEX of table MOZ_PLACES *********************

Percentage of total database......................   4.1%    
Number of entries.......±.......................... 10887     
Bytes of storage consumed......................... 294912    
Bytes of payload.................................. 196000      66.5% 
B-tree depth...................................... 2         
Average payload per entry......................... 18.00     
Average unused bytes per entry.................... 6.07      
Average fanout.................................... 9.00      
Non-sequential pages.............................. 5           62.5% 
Maximum payload per entry......................... 18        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 8         
Overflow pages used............................... 0         
Total pages used.................................. 9         
Unused bytes on index pages....................... 32581       99.43% 
Unused bytes on primary pages..................... 33545       12.8% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 66126       22.4% 

*** Index MOZ_PLACES_HOSTINDEX of table MOZ_PLACES ****************************

Percentage of total database......................   5.0%    
Number of entries................................. 10885     
Bytes of storage consumed......................... 360448    
Bytes of payload.................................. 237383      65.9% 
B-tree depth...................................... 2         
Average payload per entry......................... 21.81     
Average unused bytes per entry.................... 8.29      
Average fanout.................................... 11.00     
Non-sequential pages.............................. 7           70.0% 
Maximum payload per entry......................... 49        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 10        
Overflow pages used............................... 0         
Total pages used.................................. 11        
Unused bytes on index pages....................... 32473       99.10% 
Unused bytes on primary pages..................... 57782       17.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 90255       25.0% 

*** Index MOZ_PLACES_LASTVISITDATEINDEX of table MOZ_PLACES *******************

Percentage of total database......................   3.2%    
Number of entries................................. 10889     
Bytes of storage consumed......................... 229376    
Bytes of payload.................................. 150784      65.7% 
B-tree depth...................................... 2         
Average payload per entry......................... 13.85     
Average unused bytes per entry.................... 4.21      
Average fanout.................................... 7.00      
Non-sequential pages.............................. 4           66.7% 
Maximum payload per entry......................... 14        
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 6         
Overflow pages used............................... 0         
Total pages used.................................. 7         
Unused bytes on index pages....................... 32651       99.64% 
Unused bytes on primary pages..................... 13179        6.7% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 45830       20.0% 

*** Index MOZ_PLACES_URL_UNIQUEINDEX of table MOZ_PLACES **********************

Percentage of total database......................  16.7%    
Number of entries................................. 10859     
Bytes of storage consumed......................... 1212416   
Bytes of payload.................................. 1010666     83².4% 
B-tree depth...................................... 2         
Average payload per entry......................... 93.07     
Average unused bytes per entry.................... 15.42     
Average fanout.................................... 37.00     
Non-sequential pages.............................. 16          44.4% 
Maximum payload per entry......................... 1823      
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 36        
Overflow pages used............................... 0         
Total pages used.................................. 37        
Unused bytes on index pages....................... 24134       73.7% 
Unused bytes on primary pages..................... 143261      12.1% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 167395      13.8% 

*** Index MOZ_PLACES_VISITCOUNT of table MOZ_PLACES ***************************

Percentage of total database......................   2.3%    
Number of entries................................. 10891     
Bytes of storage consumed......................... 163840    
Bytes of payload.................................. 66129       40.4% 
B-tree depth...................................... 2         
Average payload per entry......................... 6.07      
Average unused bytes per entry.................... 5.97      
Average fanout.................................... 5.00      
Non-sequential pages.............................. 3           75.0% 
Maximum payload per entry......................... 8         
Entries that use overflow......................... 0            0.0% 
Index pages used.................................. 1         
Primary pages used................................ 4         
Overflow pages used............................... 0         
Total pages used.................................. 5         
Unused bytes on index pages....................... 32717       99.84% 
Unused bytes on primary pages..................... 32256       24.6% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 64973       39.7% 

*** Table SQLITE_SCHEMA *******************************************************

Percentage of total database......................   0.45%   
Number of entries................................. 36        
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 5188        15.8% 
B-tree depth...................................... 1         
Average payload per entry......................... 144.11    
Average unused bytes per entry.................... 758.58    
Maximum payload per entry......................... 379       
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 27309       83.3% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 27309       83.3% 

*** Table SQLITE_SEQUENCE *****************************************************

Percentage of total database......................   0.45%   
Number of entries................................. 1         
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 15           0.046% 
B-tree depth...................................... 1         
Average payload per entry......................... 15.00     
Average unused bytes per entry.................... 32741.00  
Maximum payload per entry......................... 15        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used.........................³...... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 32741       99.918% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 32741       99.918% 

*** Table SQLITE_STAT1 ********************************************************

Percentage of total database......................   0.45%   
Number of entries................................. 15        
Bytes of storage consumed......................... 32768     
Bytes of payload.................................. 762          2.3% 
B-tree depth...................................... 1         
Average payload per entry......................... 50.80     
Average unused bytes per entry.................... 2128.20   
Maximum payload per entry......................... 62        
Entries that use overflow......................... 0            0.0% 
Primary pages used................................ 1         
Overflow pages used............................... 0         
Total pages used.................................. 1         
Unused bytes on primary pages..................... 31923       97.4% 
Unused bytes on overflow pages.................... 0         
Unused bytes on all pages......................... 31923       97.4% 

*** Definitions ***************************************************************

Page size in bytes

    The number of bytes in a single page of the database file.  
    Usually 1024.

Number of pages in the whole file

    The number of 32768-byte pages that go into forming the complete
    database

Pages that store data

    The number of pages that store data, either as primary B*Tree pages or
    as overflow pages.  The number at the right is the data pages divided by
    the total number of pages in the file.

Pages on the freelist

    The number of pages that are not currently in use but are reserved for
    future use.  The percentage at the right is the number of freelist pages
    divided by the total number of pages in the file.

Pages of auto-vacuum overhead

    The number of pages that store data used by the database to facilitate
    auto-vacuum. This is zero for databases that do not support auto-vacuum.

Number of tables in the database

    The number of tables in the database, including the SQLITE_SCHEMA table
    used to store schema information.

Number of indices

    The total number of indices in the database.

Number of defined indices

    The number of indices created using an explicit CREATE INDEX statement.

Number of implied indices

    The number of indices used to implement PRIMARY KEY or UNIQUE constraints
    on tables.

Size of the file in bytes

    The total amount of disk space used by the entire database files.

Bytes of user payload stored

    The total number of bytes of user payload stored in the database. The
    schema information in the SQLITE_SCHEMA table is not counted when
    computing this number.  The percentage at the right shows the payload
    divided by the total file size.

Percentage of total database

    The amount of the complete database file that is devoted to storing
    information described by this category.

Number of entries

    The total number of B-Tree key/value pairs stored under this category.

Bytes of storage consumed

    The total amount of disk space required to store all B-Tree entries
    under this category.  The is the total number of pages used times
    the pages size.

Bytes of payload

    The amount of payload stored under this category.  Payload is the data
    part of table entries and the key part of index entries.  The percentage
    at the right is the bytes of payload divided by the bytes of storage 
    consumed.

Average payload per entry

    The average amount of payload on each entry.  This is just the bytes of
    payload divided by the number of entries.

Average unused bytes per entry

    The average amount of free space remaining on all pages under this
    category on a per-entry basis.  This is the number ´of unused bytes on
    all pages divided by the number of entries.

Non-sequential pages

    The number of pages in the table or index that are out of sequence.
    Many filesystems are optimized for sequential file access so a small
    number of non-sequential pages might result in faster queries,
    especially for larger database files that do not fit in the disk cache.
    Note that after running VACUUM, the root page of each table or index is
    at the beginning of the database file and all other pages are in a
    separate part of the database file, resulting in a single non-
    sequential page.

Maximum payload per entry

    The largest payload size of any entry.

Entries that use overflow

    The number of entries that user one or more overflow pages.

Total pages used

    This is the number of pages used to hold all information in the current
    category.  This is the sum of index, primary, and overflow pages.

Index pages used

    This is the number of pages in a table B-tree that hold only key (rowid)
    information and no data.

Primary pages used

    This is the number of B-tree pages that hold both key and data.

Overflow pages used

    The total number of overflow pages used for this category.

Unused bytes on index pages

    The total number of bytes of unused space on all index pages.  The
    percentage at the right is the number of unused bytes divided by the
    total number of bytes on index pages.

Unused bytes on primary pages

    The total number of bytes of unused space on all primary pages.  The
    percentage at the right is the number of unused bytes divided by the
    total number of bytes on primary pages.

Unused bytes on overflow pages

    The total number of bytes of unused space on all overflow pages.  The
    percentage at the right is the number of unused bytes divided by the
    total number of bytes on overflow pages.

Unused bytes on all pages

    The total number of bytes of unused space on all primary and overflow 
    pages.  The percentage at the right is the number of unused bytes 
    divided by the total number of bytes.

*******************************************************************************
The entire text of this report can be sourced into any SQL database
engine for further analysis.  All of the text above is an SQL comment.
The data used to generate this report follows:
*/
BEGIN;
CREATE TABLE space_used(
   name clob,        -- Name of a table or index in the database file
   tblname clob,     -- Name of associated table
   is_index boolean, -- TRUE if it is an index, false for a table
   nentry int,       -- Number of entries in the BTree
   leaf_entries int, -- Number of leaf entries
   depth int,        -- Depth of the b-tree
   payload int,      -- Total amount of data stored in this table or index
   ovfl_payload int, -- Total amount of data stored on overflow pages
   ovfl_cnt int,     -- Number of entries that use overflow
   mx_payload int,   -- Maximum payload size
   int_pages int,    -- Number of interior pages used
   leaf_pages int,   -- Number of leaf pages used
   ovfl_pages int,   -- Number of overflow pages used
   int_unused int,   -- Number of unused bytes on interior pages
   leaf_unused int,  -- Number of unused bytes on primary pages
   ovfl_unused int,  -- Number of unused bytes on overflow pages
   gap_cnt int,      -- Number of gaps in the page layout
   compressed_size int  -- Total bytes stored on disk
);
INSERT INTO space_used VALUES('sqlite_schema','sqlite_schema',0,36,36,1,5188,0,0,379,0,1,0,0,27309,0,0,32768);
INSERT INTO space_used VALUES('moz_places','moz_places',0,10955,10894,2,1838131,0,0,1867,1,62,0,32207,121406,0,30,2064384);
INSERT INTO space_used VALUES('moz_historyvisits','moz_historyvisits',0,15884,15873,2,308447,0,0,21,1,12,0,32668,5435,0,8,425984);
INSERT INTO space_used VALUES('moz_inputhistory','moz_inputhistory',0,8,8,1,341,0,0,71,0,1,0,0,32379,0,0,32768);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_inputhistory_1','moz_inputhistory',1,8,8,1,301,0,0,65,0,1,0,0,32435,0,0,32768);
INSERT INTO space_used VALUES('moz_hosts','moz_hosts',0,628,628,1,14640,0,0,49,0,1,0,0,15012,0,0,32768);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_hosts_1','moz_hosts',1,628,628,1,13000,0,0,47,0,1,0,0,17876,0,0,32768);
INSERT INTO space_used VALUES('moz_bookmarks','moz_bookmarks',0,313,313,1,21937,0,0,518,0,1,0,0,9358,0,0,32768);
INSERT INTO space_used VALUES('moz_bookmarks_roots','moz_bookmarks_roots',0,5,5,1,47,0,0,11,0,1,0,0,32693,0,0,32768);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_bookmarks_roots_1','moz_bookmarks_roots',1,5,5,1,47,0,0,11,0,1,0,0,32698,0,0,32768);
INSERT INTO space_used VALUES('moz_keywords','moz_keywords',0,0,0,1,0,0,0,0,0,1,0,0,32760,0,0,32768);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_keywords_1','moz_keywords',1,0,0,1,0,0,0,0,0,1,0,0,32760,0,0,32768);
INSERT INTO space_used VALUES('sqlite_sequence','sqlite_sequence',0,1,1,1,15,0,0,15,0,1,0,0,32741,0,0,32768);
INSERT INTO space_used VALUES('moz_favicons','moz_favicons',0,481,471,2,297630,0,0,7640,1,11,0,32676,59923,0,6,393216);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_favicons_1','moz_favicons',1,471,470,2,35135,0,0,7259,1,2,0,32664,29057,0,1,98304);
INSERT INTO space_used VALUES('moz_anno_attributes','moz_anno_attributes',0,12,12,1,355,0,0,42,0,1,0,0,32357,0,0,32768);
INSERT INTO space_used VALUES('sqlite_autoindex_moz_anno_attributes_1','moz_anno_attributes',1,12,12,1,366,0,0,43,0,1,0,0,32358,0,0,32768);
INSERT INTO space_used VALUES('moz_annos','moz_annos',0,195,195,1,12115,0,0,127,0,1,0,0,19702,0,0,32768);
INSERT INTO space_used VALUES('moz_items_annos','moz_items_annos',0,79,79,1,8649,0,0,384,0,1,0,0,23743,0,0,32768);
INSERT INTO space_used VALUES('sqlite_stat1','sqlite_stat1',0,15,15,1,762,0,0,62,0,1,0,0,31923,0,0,32768);
INSERT INTO space_used VALUES('moz_places_faviconindex','moz_places',1,10894,10891,2,83178,0,0,8,1,4,0,32711,15213,0,3,163840);
INSERT INTO space_used VALUES('moz_places_hostindex','moz_places',1,10894,10885,2,237383,0,0,49,1,10,0,32473,57782,0,7,360448);
INSERT INTO space_used VALUES('moz_places_visitcount','moz_places',1,10894,10891,2,66129,0,0,8,1,4,0,32717,32256,0,3,163840);
INSERT INTO space_used VALUES('moz_places_frecencyindex','moz_places',1,10894,10891,2,76772,0,0,9,1,4,0,32714,21616,0,3,163840);
INSERT INTO space_used VALUES('moz_places_lastvisitdateindex','moz_places',1,10894,10889,2,150784,0,0,14,1,6,0,32651,13179,0,4,229376);
INSERT INTO space_used VALUES('moz_historyvisits_placedateindex','moz_historyvisits',1,15873,15863,2,267273,0,0,17,1,11,0,32516,45668,0,8,393216);
INSERT INTO space_used VALUES('moz_historyvisits_fromindex','moz_historyvisits',1,15873,15869,2,100292,0,0,7,1,5,0,32702,15927,0,4,196608);
INSERT INTO space_used VALUES('moz_historyvisits_dateindex','moz_historyvisits',1,15873,15865,2,206221,0,0,13,1,9,0,32596,41128,0,6,327680);
INSERT INTO space_used VALUES('moz_bookmarks_itemindex','moz_bookmarks',1,313,313,1,2547,0,0,9,0,1,0,0,29274,0,0,32768);
INSERT INTO space_used VALUES('moz_bookmarks_parentindex','moz_bookmarks',1,313,313,1,2393,0,0,9,0,1,0,0,29428,0,0,32768);
INSERT INTO space_used VALUES('moz_bookmarks_itemlastmodifiedindex','moz_bookmarks',1,313,313,1,5020,0,0,17,0,1,0,0,26801,0,0,32768);
INSERT INTO space_used VALUES('moz_places_url_uniqueindex','moz_places',1,10894,10859,2,1010666,0,0,1823,1,36,0,24134,143261,0,16,1212416);
INSERT INTO space_used VALUES('moz_places_guid_uniqueindex','moz_places',1,10894,10887,2,196000,0,0,18,1,8,0,32581,33545,0,5,294912);
INSERT INTO space_used VALUES('moz_bookmarks_guid_uniqueindex','moz_bookmarks',1,313,313,1,5207,0,0,17,0,1,0,0,26614,0,0,32768);
INSERT INTO space_used VALUES('moz_annos_placeattributeindex','moz_annos',1,195,195,1,1871,0,0,10,0,1,0,0,30304,0,0,32768);
INSERT INTO space_used VALUES('moz_items_annos_itemattributeindex','moz_items_annos',1,79,79,1,562,0,0,9,0,1,0,0,31961,0,0,32768);
INSERT INTO space_used VALUES('moz_keywords_placepostdata_uniqueindex','moz_keywords',1,0,0,1,0,0,0,0,0,1,0,0,32760,0,0,32768);
COMMIT;

This page last modified on  2020-06-18 21:18:56 UTCsqlanalyze.html#example_output
„ÝÔk
]3‰¹IThe sqlite3_analyzer.exe Utility Program1.2. Example OutputThe following is sqlite3_analyzer output for an example
places.sqlite database used by Firefox.


/** Disk-Space Utilization Report For &#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;/places.sqlite

Page size in bytes................................ 32768     
Pages in the whole file (measured)................ 221       
Pages in the whole file (calculated).............. 221       
Pages that store data............................. 221        100.0% 
Pages on the freelist (per header)................ 0            0.0% 
Pages on the freelist (calculated)................ 0            0.0% 
Pages of auto-vacuum overhead..................... 0            0.0% 
Number of tables in the database.................. 14        
Number of indices................................. 23        
Number of defined indices......................... 17        
Number of implied indices......................... 6         
Size of the file in bytes......................... 7241728   
Bytes of user payload stored...................... 2503069     34.6% 

*** Page counts for all tables with their indices *****************************

MOZ_PLACES........................................ 142         64.3% 
MOZ_HISTORYVISITS................................. 41          18.6% 
MOZ_FAVICONS...................................... 15           6.8% 
MOZ_BOOKMARKS..................................... 5            2.3% 
MOZ_KEYWORDS...................................... 3            1.4% 
MOZ_ANNO_ATTRIBUTES............................... 2            0.90% 
MOZ_ANNOS......................................... 2            0.90% 
MOZ_BOOKMARKS_ROOTS............................... 2            0.90% 
MOZ_HOSTS......................................... 2            0.90% 
MOZ_INPUTHISTORY.................................. 2            0.90% 
MOZ_ITEMS_ANNOS................................... 2            0.90% 
SQLITE_SCHEMA..................................... 1            0.45% 
SQLITE_SEQUENCE................................... 1            0.45% 
SQLITE_STAT1...................................... 1            0.45% 

*** Page counts for all tables and indices separately *************************

MOZ_PLACES........................................ 63          28.5% 
MOZ_PLACES_URL_UNIQUEINDEX........................ 37          16.7% 
MOZ_HISTORYVISITS................................. 13           5.9% 
MOZ_FAVICONS...................................... 12           5.4% 
MOZ_HISTORYVISITS_PLACEDATEINDEX.................. 12           5.4% 
MOZ_PLACES_HOSTINDEX.............................. 11           5.0% 
MOZ_HISTORYVISITS_DATEINDEX....................... 10           4.5% 
MOZ_PLACES_GUID_UNIQUEINDEX....................... 9            4.1% 
MOZ_PLACES_LASTVISITDATEINDEX..................... 7            3.2% 
MOZ_HISTORYVISITS_FROMINDEX....................... 6            2.7% 
MOZ_PLACES_FAVICONINDEX........................... 5            2.3% 
MOZ_PLACES_FRECENCYINDEX.......................... 5            2.3% 
MOZ_PLACES_VISITCOUNT............................. 5            2.3% 
SQLITE_AUTOINDEX_MOZ_FAVICONS_1................... 3            1.4% 
MOZ_ANNO_ATTRIBUTES............................... 1            0.45% 
MOZ_ANNOS......................................... 1            0.45% 
MOZ_ANNOS_PLACEATTRIBUTEINDEX..................... 1            0.45% 
MOZ_BOOKMARKS..................................... 1            0.45% 
MOZ_BOOKMARKS_GUID_UNIQUEINDEX.................... 1            0.45% 
MOZ_BOOKMARKS_ITEMINDEX........................... 1            0.45% 
MOZ_BOOKMARKS_ITEMLASTMODIFIEDINDEX............... 1          £
À
ÀˆxÜR Y]omQuirks, Caveats, and Gotchas In SQLite2. SQLite Is Embedded, Not Client-ServerWhenever comparing SQLite to other SQL database engines like
SQL Server, PostgreSQL, MySQL, or Oracle, it is important first of all
to realize that SQLite is not intended as a replacement or competitor to
any of those systems.  SQLite is serverless.  There is no separate
server process that manages the database.  An application interacts
with the database engine using function calls, not by sending messages
to a separate process or thread.


The fact that SQLite is embedded and serverless instead of being
client/server is a feature, not a bug.


Client/server databases like MySQL, PostgreSQL, SQL Server, Oracle, and
others are an important component of modern systems.  
These systems solve an important problem.  
But SQLite solves a different problem.
Both SQLite and client/server databases have their role.
Developers who are comparing SQLite against other SQL database engines need
to clearly understand this distinction.


See the Appropriate Uses For SQLite document for additional information.quirks.html#sqlite_is_embedded_not_client_server…>ÜQ   Y#‰m5Quirks, Caveats, and Gotchas In SQLite1. OverviewThe SQL language is a "standard".
Even so, no two SQL database engines work exactly alike.
Every SQL implementation has it own peculiarities and oddities,
and SQLite is no exception to this rule.


This document strives to highlight the principal differences
between SQLite and other SQL implementations, as an aid to developers
that are porting to or from SQLite or who are trying to build a
system that works across multiple database engines.


If you are an SQLite user whose has stumbled over some quirk of
SQLite that is not mentioned here, please let the developers know
by posting a brief message on the
SQLite Forum.quirks.html#overview
KxK†(ÜT      YOŠm]Quirks, Caveats, and Gotchas In SQLite3.1. No Separate BOOLEAN DatatypeUnlike most other SQL implementations,
SQLite does not have a separate BOOLEAN data type.
Instead, TRUE and FALSE are (normally) represented as integers 1 and 0,
respectively.
This does not seem to cause many problems, as we seldom get complaints
about it.  But it is important to recognize.


Beginning with SQLite version 3.23.0 (2018-04-02), SQLite also
recognizes TRUE and FALSE keywords as aliases for integer values 1 and 0,
respectively.
This provides better compatibility with other SQL implementations.
But for backwards compatibility, if there are columns named TRUE or
FALSE, then the keywords are treated as identifiers referencing those
columns, rather than BOOLEAN literals.quirks.html#no_separate_boolean_datatype•ÜS     Y1¨[CQuirks, Caveats, and Gotchas In SQLite3. Flexible TypingSQLite is flexible with regard to datatypes.  Datatypes are advisory
rather than mandatory.


Some commentators say that SQLite is "weakly typed" and that other
SQL databases are "strongly typed".  We consider these terms to be
inaccurate and even pejorative.  We prefer to say that SQLite is 
"flexibly typed" and that other SQL database engines are
"rigidly typed".


See the Datatypes in SQLite document for a detailed
discussion of the type system in SQLite.


The key point is that SQLite is very forgiving of the type of data that
you put into the database.  For example, if a column has a datatype of
"INTEGER" and the application inserts a text string into that column,
SQLite will first try to convert the text string into an integer, just like
every other SQL database engine.  Thus, if one inserts '1234' into
an INTEGER column, that value is converted into an integer 1234 and stored.
But, if you insert a non-numeric string like 'wxyz' into an INTEGER
column, unlike other SQL databases, SQLite does not throw an error.  Instead,
SQLite stores the actual string value in the column.


Similarly, SQLite allows you to store a 2000-character string into a
column of type VARCHAR(50).  Other SQL implementations would either throw
an error or truncate the string.  SQLite stores the entire 2000-character
string with no loss of information and without complaint.


Where this ends up causing problems is when developers do some initial
coding work using SQLite and get their application working, but then try
to convert to another database like PostgreSQL or SQL Server for deployment.
If the application is initially taking advantage of SQLite's flexible typing,
then it will fail when moved to another database that uses a more rigid
and unforgiving type enforcement policy.


Flexible typing is a feature of SQLite, not a bug.  Flexible typing
is about freedom.
Nevertheless, we recognize that this feature does sometimes cause
confusion for developers who are accustomed to working with
other databases that are more strict with regard to data type rules.
In retrospect, perhaps it would have been less confusing if SQLite had merely
implemented an ANY datatype so that developers could explicitly state
when they wanted to use flexible typing, rather than making flexible
typing the default.
As an accommodation for those who expect rigid typing, SQLite version 3.37.0
(2021-11-27) introduced the option of STRICT tables.
These either impose
the mandatory datatype constraints found in other SQL database engines,
or allow the explicit ANY datatype to retain SQLite's flexible typing.quirks.html#flexible_typing
s
Šps…xÜX       Yc‰auQuirks, Caveats, and Gotchas In SQLite5. PRIMARY KEYs Can Sometimes Contain NULLsUsually (the exceptions are INTEGER PRIMARY KEY tables and
WITHOUT ROWID tables) a PRIMARY KEY in an SQLite table is really
the same as a UNIQUE constraint.  Due to an historical oversight,
the column values of such a PRIMARY KEY are allowed to be NULL.
This is a bug, but by the time the problem was discovered there
where so many databases in circulation that depended on the bug that
the decision was made to support the buggy behavior moving forward.

The value of an INTEGER PRIMARY KEY column must always be a 
non-NULL integer.  The PRIMARY KEY columns of a WITHOUT ROWID
table are also required to be non-NULL.quirks.html#primary_keys_can_sometimes_contain_nulls†UÜW        Ye‹wQuirks, Caveats, and Gotchas In SQLite4. Foreign Key Enforcement Is Off By DefaultSQLite has parsed foreign key constraints for time out of mind,
but added the ability to actually enforce those constraints much later,
with version 3.6.19 (2009-10-14).  By the time foreign key constraint
enforcement was added, there were already countless millions of databases
in circulation that contained foreign key constraints, some of which
were not correct.  To avoid breaking those legacy databases, foreign key
constraint enforcement is turned off by default in SQLite.

Applications can activate foreign key enforcement at run-time using
the PRAGMA foreign_keys statement.  Or, foreign key enforcement can
be activated at compile-time using the
-DSQLITE_DEFAULT_FOREIGN_KEYS=1 compile-time option.quirks.html#foreign_key_enforcement_is_off_by_defaultƒ;ÜV  YG…#UQuirks, Caveats, and Gotchas In SQLite3.3. The datatype is optionalBecause SQLite is flexible and forgiving with regard to datatypes,
table columns can be created that have no specified datatype at all.
For example:
CREATE TABLE t1(a,b,c,d);

The table "t1" has four columns "a", "b", "c", and "d" that have
no particular datatype assigned.  You can store anything you want in
any of those columns.quirks.html#the_datatype_is_optional„qÜU  YQ‡{_Quirks, Caveats, and Gotchas In SQLite3.2. No Separate DATETIME DatatypeSQLite has no DATETIME datatype.
Instead, dates and times can be stored in any of these ways:


 As a TEXT string in the ISO-8601 format.  Example: '2018-04-02 12:13:46'.
 As an INTEGER number of seconds since 1970 (also known as "unix time").
 As a REAL value that is the fractional 
     Julian day number.



The built-in date and time functions of SQLite understand date/times in
all of the formats above, and can freely change between them.
Which format you use, is entirely up to your application.quirks.html#no_separate_datetime_datatype
‡ÜZ
Ys‹eQuirks, Caveats, and Gotchas In SQLite7. Does Not Do Full Unicode Case Folding By DefaultSQLite does not know about the upper-case/lower-case distinction
for all unicode characters.  SQL functions like
upper() and lower() only work on ASCII characters.  There are two
reasons for this:

 Though stable now, when SQLite was first designed, the rules for
     unicode case folding were still in flux.  That means that the
     behavior might have changed with each new unicode release, disrupting
     applications and corrupting indexes in the process.
 The tables necessary to do full and proper unicode case folding are
     larger than the whole SQLite library.


Full unicode case folding is supported in SQLite if it is compiled
with the -DSQLITE_ENABLE_ICU option and linked against the
International Components for Unicode
library.quirks.html#does_not_do_full_unicode_case_folding_by_defaultŽkÜYYO™kaQuirks, Caveats, and Gotchas In SQLite6. Aggregate Queries Can Contain Non-Aggregate Result Columns
That Are Not In The GROUP BY ClauseIn most SQL implementations, output columns of an aggregate query
may only reference aggregate functions or columns named in the
GROUP BY clause.  It does not make good sense to reference an ordinary
column in an aggregate query because each output row might be composed
from two or more rows in the input table(s).


SQLite does not enforce this restriction.
The output columns from an aggregate query can be arbitrary expressions
that include columns not found in GROUP BY clause.
This feature has two uses:



With SQLite (but not any other SQL implementation that we know of) if
an aggregate query contains a single min() or max() function, then the
values of columns used in the output are taken from the row where
the min() or max() value was achieved.  If two or more rows have the
same min() or max() value, then the columns values will be chosen arbitrarily
from one of those rows.

For example to find the highest paid employee:
SELECT max(salary), first_name, last_name FROM employee;


In the query above, the values for the first_name and last_name columns
will correspond to the row that satisfied the max(salary) condition.


If a query contains no aggregate functions at all, then a GROUP BY
clause can be added as a substitute for the DISTINCT ON clause.  In other words,
output rows are filtered so that only one row is shown for each distinct
set of values in the GROUP BY clause.  If two or more output rows would
have otherwise had the same set of values for the GROUP BY columns, then
one of the rows is chosen arbitrarily.  (SQLite supports DISTINCT but not
DISTINCT ON, whose functionality is provided instead by GROUP BY.)quirks.html#aggregate_queries_can_contain_non_aggregate_result_columns_that_are_not_in_the_group_by_clause
åå’Ü[       Yg¢yQuirks, Caveats, and Gotchas In SQLite8. Double-quoted String Literals Are AcceptedThe SQL standard requires double-quotes around identifiers
and single-quotes around string literals.  For example:

 "this is a legal SQL column name"
 'this is an SQL string literal'


SQLite accepts both of the above.  But, in an effort to be compatible
with MySQL 3.x (which was one of the most widely used RDBMSes
when SQLite was first being designed) SQLite will also interpret
a double-quotes string as
string literal if it does not match any valid identifier.

This misfeature means that a misspelled double-quoted
identifier will be interpreted as a string literal, rather than generating
an error.
It also lures developers who are new to the SQL language into the
bad habit of using double-quoted string literals when they
really need to learn to use the correct single-quoted string literal form.

In hindsight, we should not have tried to make SQLite accept MySQL 3.x
syntax, and should have never allowed double-quoted string literals.
However, there are countless applications that make use of
double-quoted string literals and so we continue to support
that capability to avoid breaking legacy.

As of SQLite 3.27.0 (2019-02-07) the use of a double-quoted
string literal causes a warning message to be sent to the error log.

As of SQLite 3.29.0 (2019-07-10) the use of double-quoted
string literals can be disabled at run-time using the
SQLITE_DBCONFIG_DQS_DDL and SQLITE_DBCONFIG_DQS_DML actions
to sqlite3_db_config().  The default settings can be altered
at compile-time using the -DSQLITE_DQS=N compile-time
option.  Application developers are encouraged to compile using
-DSQLITE_DQS=0 in order to disable the double-quoted string literal
misfeature by default.  If that is not possible, then disable
double-quoted string literals for individual database connections
using C-code like this:

sqlite3_db_config(db, SQLITE_DBCONFIG_DQS_DDL, 0, (void*)0);
sqlite3_db_config(db, SQLITE_DBCONFIG_DQS_DML, 0, (void*)0);

Or, if double-quoted string literals are disabled by default, but need
to be selectively enabled for some historical database connections,
that can be done using the same C-code as shown above except with the
third parameter changed from 0 to 1.quirks.html#double_quoted_string_literals_are_accepted
7      ÐÒ7ƒÜ_    Yi„yQuirks, Caveats, and Gotchas In SQLite12. NUL Characters Are Allowed In Text StringsNUL characters (ASCII code 0x00 and Unicode \u0000) may appear in
the middle of strings in SQLite.  This can lead to unexpected behavior.
See the "NUL characters in strings" document for further information.
This page last modified on  2022-11-16 22:21:04 UTCquirks.html#nul_characters_are_allowed_in_text_stringsƒyÜ^  Yo…MQuirks, Caveats, and Gotchas In SQLite11. AUTOINCREMENT Does Not Work The Same As MySQLThe AUTOINCREMENT feature in SQLite works differently than
it does in MySQL.  This often causes confusion for people who
initially learned SQL on MySQL and then start using SQLite, and
expect the two systems to work identically.

See the SQLite AUTOINCREMENT documentation for
detailed instructions on what AUTOINCREMENT does and does not do
in SQLite.quirks.html#autoincrement_does_not_work_the_same_as_mysql„BÜ]
Y{†EQuirks, Caveats, and Gotchas In SQLite10. Dubious SQL Is Allowed Without Any Error Or WarningThe original implementation of SQLite sought to follow
Postel's Law which
states in part "Be liberal in what you accept".
This used to be considered good design - that a system would accept
dodgy inputs and try to do the best it could without complaining too much.
But lately, people have come to realize that it is sometimes better to
be strict in what you accept, so as to more easily find errors in the
input.quirks.html#dubious_sql_is_allowed_without_any_error_or_warningdÜ\      Ye™5wQuirks, Caveats, and Gotchas In SQLite9. Keywords Can Often Be Used As IdentifiersThe SQL language is rich in keywords.
Most SQL implementations do not allow keywords to be used as identifiers
(names of tables or columns) unless they are enclosed in double-quotes.
But SQLite is more flexible.  Many keywords can be used as identifiers without
needing to be quoted, as long as those keywords are used in a context where
it is clear that they are intended to be an identifier.

For example, the following statement is valid in SQLite:
CREATE TABLE union(true INT, with BOOLEAN);


The same SQL statement will fail on every other SQL implementation that
we know of due to the use of keywords "union", "true", and "with" as
identifiers.

The ability to use keywords as identifiers promotes backwards compatibility.
As new keywords are added, legacy schemas that just happen to use those
keywords as table or column names continue to work.  However, the ability
to use a keyword as an identifier sometimes leads to surprising outcomes.
For example:
CREATE TRIGGER AFTER INSERT ON tableX BEGIN
  INSERT INTO tableY(b) VALUES(new.a);
END;

The trigger created by the previous statement is named "AFTER"
and it is a "BEFORE" trigger.  The "AFTER" token is used as an identifier
instead of as a keyword, as that is the only way to parse the statement.
Another example:
CREATE TABLE tableZ(INTEGER PRIMARY KEY);

The tableZ table has a single column named "INTEGER".  That column
has no datatype specified, but it is the PRIMARY KEY.
The column is not the INTEGER PRIMARY KEY for the table because
it has no datatype.  The "INTEGER" token is used as an identifier for the
column name, not as a datatype keyword.quirks.html#keywords_can_often_be_used_as_identifiers
@    ÿ@‡:ì" ]+O?sqldiff.exe: Database Difference Utility2. How It WorksThe sqldiff.exe utility works by finding rows in the source and
destination that are logical "pairs".  The default behavior is to
treat two rows as pairs if they are in tables with the same name
and they have the same rowid, or in the case of a WITHOUT ROWID
table if they have the same PRIMARY KEY.  Any differences in the
content of paired rows are output as UPDATEs.  Rows in the source
database that could not be paired are output as DELETEs.  Rows in
the destination database that could not be paired are output as
INSERTs.

The --primarykey flag changes the pairing algorithm slightly so
that the schema-declared PRIMARY KEY is always used for pairing,
even on tables that have a rowid.  This is often a better choice
for finding differences, however it can lead to missed differences in
the case of rows that have one or more PRIMARY KEY columns set to
NULL.sqldiff.html#how_it_works‹|ì!     ]–o1sqldiff.exe: Database Difference Utility1. UsageThe sqldiff.exe binary is a command-line utility program that
displays content differences between SQLite databases.  Example
usage:

sqldiff &#91;options&#93; database1.sqlite database2.sqlite



The usual output is an SQL script that will transform
database1.sqlite (the "source" database) into database2.sqlite
(the "destination" database).  This behavior can be
altered using command-line switches:


--changeset FILE
Do not write changes to standard output.  Instead, write a (binary)
       changeset file into FILE.  The changeset can be interpreted using
       the session extension to SQLite.
--lib LIBRARY
-L LIBRARY
Load the shared library or DLL file LIBRARY into SQLite prior to
       computing the differences.  This can be used to add application-defined
       collating sequences that are required by the schema.
--primarykey
Use the schema-defined PRIMARY KEY instead of the rowid to
       pair rows in the source and destination database.  (See additional
       explanation below.)
--schema
Show only column name and table differences in the schema,
       not the table content
--summary
Show how many rows have changed on each table, but do not show
       the actual changes
--table TABLE
Show only the differences in content for TABLE, not for the
       entire database
--transaction
Wrap SQL output in a single large transaction
--vtab
Add support for handling FTS3, FTS5 and rtree virtual tables. 
       See below for details.sqldiff.html#usage
—Ú—Œ>ô              Y-—KMMaintaining Private Branches Of SQLite1.  IntroductionSQLite is designed to meet most developer's needs without any 
changes or customization.  When changes are needed, they can normally
be accomplished using start-time (1)
or runtime
(2)
(3)
(4) configuration methods
or via compile-time options.  It is very rare that an application 
developer will need to edit the SQLite source code in order to 
incorporate SQLite into a product.

We call custom modifications to the SQLite source code that are held
for the use of a single application a "private branch".  When a private
branch becomes necessary, the application developer must take on the
task of keeping the private branch in synchronization with the public
SQLite sources.  This is tedious.  It can also be tricky, since while
the SQLite file format and published interfaces are very stable, the
internal implementation of SQLite changes quite rapidly.  Hundreds or
thousands of lines of code might change for any given SQLite point release.


This article outlines one possible method for keeping a private branch
of SQLite in sync with the public SQLite source code.
There are many ways of maintaining a private branch, of course.
Nobody is compelled to use the method describe here.
This article is not trying to impose a particular procedure on 
maintainers of private branches.  The point of this article is to offer
an example of one process for maintaining a private branch which can
be used as a template for designing processes best suited for the
circumstances of each individual project.privatebranch.html#_introduction’!ì#  ])£!=sqldiff.exe: Database Difference Utility3. LimitationsThe sqldiff.exe utility does not compute changesets for
either: rowid tables for which the rowid is inaccessible;
or tables which have no explicit primary key.
Given the --changeset option, sqldiff omits them from the comparison.
Examples of such tables are:

CREATE TABLE NilChangeset (
   -- inaccessible rowid due to hiding its aliases
   "rowid" TEXT,
   "oid" TEXT,
   "_rowid_" TEXT
);


and

CREATE TABLE NilChangeset (
   -- no explicit primary key
   "authorId" TEXT,
   "bookId" TEXT
);



When sqldiff is made to compare only such tables, no error occurs.
However, the result may be unexpected.
For example, the effect of this invocation:

sqldiff --changeset CHANGESET_OUT --table NilChangeset db1.sdb db2.sdb


will be to produce an empty file named "CHANGESET_OUT". See  session limitations for details.

The sqldiff.exe utility does not (currently) display differences in
TRIGGERs or VIEWs.


The sqldiff utility is not designed to support schema migrations
and is forgiving with respect to differing column definitions.
Normally, only the column names and their order are compared
for like-named tables before content comparison proceeds.

However, the single-table comparison option, with "sqlite_schema"
named, can be used to show or detect detailed schema differences
between a pair of databases.
When doing this, the output should not be used directly to modify a database.


By default, differences in the schema or content of virtual tables are
not reported on. 

However, if a virtual table implementation creates real tables (sometimes
referred to as "shadow" tables) within the database to store its data in, then
sqldiff.exe does calculate the difference between these. This can have
surprising effects if the resulting SQL script is then run on a database that
is not exactly the same as the source database. For several of SQLite's
bundled virtual tables (FTS3, FTS5, rtree and others), the surprising effects
may include corruption of the virtual table content.

 If the --vtab option is passed to sqldiff.exe, then it ignores all 
underlying shadow tables belonging to an FTS3, FTS5 or rtree virtual table
and instead includes the virtual table differences directly.


This page last modified on  2021-09-07 19:28:01 UTCsqldiff.html#limitations
&/ÿ&ƒTô Y?…W[Maintaining Private Branches Of SQLite3.1.  Obtain The SoftwareFossil is a computer program
that must be installed on your machine before you use it.
Fortunately, installing fossil is very easy.  Fossil is a single
"*.exe" file that you simply download and run.  To uninstall fossil,
simply delete the exe file.  
Detailed instructions for installing and getting started with
fossil are available on the 
fossil website.privatebranch.html#_obtain_the_software„+ô     Y/‡!OMaintaining Private Branches Of SQLite3.  The ProcedureThe remainder of this document will guide the reader through
the steps needed to maintain a private branch.  The general idea
is the same as outlined above.  This section merely provides more
detail.

We emphasize again that these steps are not intended to be the only
acceptable method for maintaining private branch.  This approach
is one of many.  Use this document as a baseline for preparing
project-specific procedures.  Do not be afraid to experiment.privatebranch.html#_the_procedure‘Lô
        Y1¡_QMaintaining Private Branches Of SQLite2.  The Basic IdeaWe propose to use the
fossil software configuration management
system to set up two branches.  One branch (the "public branch" or "trunk")
contains the published SQLite sources and the other branch is the 
private branch which contains the code that is customized for the project.
Whenever a new public release of SQLite is made, that release is added to
the public branch and then the changes are merged into the private branch.

This document proposes to use
fossil,
but any other distributed software configuration management system such as
monotone or
mercurial (a.k.a. "hg"), or
git could serve just as well.
The concept will be the same, 
though the specifics of the procedure will vary.

The diagram at the right illustrates the concept.
One begins with a standard SQLite release.  For the
sake of example, suppose that one intends to create a
private branch off of SQLite version 3.6.15.  In the
diagram this is version (1).  The
maintainer makes an exact copy of the baseline
SQLite into the branch space, shown as version (2).
Note that (1) and (2) are exactly the same.  Then
the maintainer applies the private changes to 
version (2) resulting in version (3).  In other words,
version (3) is SQLite version 3.6.15 plus edits.

Later, SQLite version 3.6.16 is released, as shown 
by circle (4) in the diagram.  At the point, the private
branch maintainer does a merge which takes all of the
changes going from (1) to (4) and applies those changes to
(3).  The result is version (5), which is SQLite 3.6.16
plus edits.

There might be merge conflicts.  In other words, it might
be that the changes from (2) to (3) are incompatible with the
changes from (1) to (4).  In that case, the maintainer will
have to manually resolve the conflicts.  Hopefully conflicts
will not come up that often.  Conflicts are less likely to
occur when the private edits are kept to a minimum.

The cycle above can be repeated many times.  The
diagram shows a third SQLite release, 3.6.17 in
circle (6).  The private branch maintainer can do
another merge in order to incorporate the changes
moving from (4) to (6) into the private branch, resulting
in version (7).privatebranch.html#_the_basic_idea
¥
u¥“Kô
Yi¤oMaintaining Private Branches Of SQLite3.3.  Installing The SQLite Baseline In FossilThe repository created in the previous step is initially empty.  The
next step is to load the baseline SQLite release - circle (1) in the diagram
above.

Begin by obtaining a copy of SQLite in whatever form you use it.
The public SQLite you obtain should be as close to your private edited
copy as possible.  If your project uses the SQLite amalgamation, then
get a copy of the amalgamation.  If you use the preprocessed separate
source files, get those instead.  Put all the source files in the
checkout directory created in the previous step.

The source code in public SQLite releases uses unix line endings
(ASCII code 10: "newline" only, NL) and spaces instead of tabs.  If you will
be changing the line ending to windows-style line endings
(ASCII codes 13, 10: "carriage-return" and "newline"; CR-NL) or if you will be
changing space indents into tab indents, make that change now
before you check in the baseline.  The merging process will only work
well if the differences between the public and the private branches are
minimal.  If every single line of the source file is changed in the
private branch because you changed from NL to CR-NL line endings, then
the merge steps will not work correctly.

Let us assume that you are using the amalgamation source code.
Add the baseline to your project as follows:


fossil add sqlite3.c sqlite3.h


If you are using separate source files, name all of the source files instead
of just the two amalgamation source files.  Once this is done, commit your
changes as follows:


fossil commit


You will be prompted for a check-in comment.  Say whatever you like.
After the commit completes, your baseline will be part of the repository.
The following command, if you like, to see this on the "timeline":



fossil ui


That last command is the same "ui" command that we ran before.  It
starts a mini-webserver running and points your web browser at it.  But
this time we didn't have to specify the repository file because we are
located inside a checkout and so fossil can figure out the repository for
itself.  If you want to type in the repository filename as the second
argument, you can.  But it is optional.

If you do not want to use your web browser to view the new check-in,
you can get some information from the command-line using commands like
these:


fossil timeline
fossil info
fossil statusprivatebranch.html#_installing_the_sqlite_baseline_in_fossil‹ô
  YO”kMaintaining Private Branches Of SQLite3.2.  Create A Project RepositoryCreate a fossil repository to host the private branch using the
following command:


fossil new private-project.fossil


You can call your project anything you like.  The ".fossil"
suffix is optional.  For this document, we will continue to call the
project "private-project.fossil".  Note that
private-project.fossil is an ordinary disk file (actually an
SQLite database) that will contain your complete project history.
You can make a backup of the project simply by making a copy of that
one file.

If you want to configure the new project, type:


fossil ui private-project.fossil


The "ui" command will cause fossil to run a miniature built-in webserver
and to launch your web-browser pointing
at that webserver.  You can use your web-browser to configure your project
in various ways.  See the instructions on the fossil website for additional
information.

Once the project repository is created, create an open checkout of the
project by moving to the directory where you want to keep all of the
project source code and typing:


fossil open private-project.fossil


You can have multiple checkouts of the same project if you want. 
And you can "clone" the repository to different machines so that multiple
developers can use it.  See the fossil website for further information.privatebranch.html#_create_a_project_repository
ž
¥ëž†Hô
YiŠiMaintaining Private Branches Of SQLite3.6.  Incorporating New Public SQLite ReleasesSuppose that after a while (about a month, usually) a new version of
SQLite is released: 3.6.16.  You will want to incorporate this new
public version of SQLite into your repository in the public branch (the
trunk).  To do this, first change your repository over to the trunk:


fossil update trunk


Then download the new version of the SQLite sources and overwrite the
files that are in the checkout.

If you made NL to CR-NL line ending changes or space to tab
indentation changes in the original baseline, make the same changes
to the new source file.

Once everything is ready, run the "fossil commit" command to
check in the changes.  This creates circle (4) in the diagram above.privatebranch.html#_incorporating_new_public_sqlite_releases‹5ôY”#Maintaining Private Branches Of SQLite3.5.  Adding Customizations To The Code In The Private BranchNow it is time to make the private, custom modifications to SQLite
which are the whole point of this exercise.  Switch to the private branch
(if you are not already there) using the "fossil update private"
command, then bring up the source files in your text editor and make
whatever changes you want to make.  Once you have finished making
changes, commit those changes using this command:


fossil commit


You will be prompted once again to enter a commit describing your
changes.  Then the commit will occur.  The commit creates a new checkin
in the repository that corresponds to circle (3) in the diagram above.

Now that the public and private branches are different, you can run
the "fossil update trunk" and "fossil update private"
commands and see that fossil really does change the files in the checkout
as you switch back and forth between branches.

Note that in the diagram above, we showed the private edits as a single
commit.  This was for clarity of presentation only.  There is nothing to stop
you from doing dozens or hundreds of separate tiny changes and committing
each separately.  In fact, making many small changes is the preferred way
to work.  The only reason for doing all the changes in a single commit
is that it makes the diagram easier to draw.privatebranch.html#_adding_customizations_to_the_code_in_the_private_branchŠVô    YO“;kMaintaining Private Branches Of SQLite3.4.  Creating The Private BranchThe previous step created circle (1) in the diagram above.
This step will create circle (2).  Run the following command:

 
fossil branch new private trunk -bgcolor "#add8e8"


This command will create a new branch named "private" (you can use
a different name if you like) and assign it a background color
of light blue ("#add8e8").  You can omit the background color if you want,
though having a distinct background does make it easier to tell the
branch from the "trunk" (the public branch) on timeline displays.  You
can change the background color of the private branch or of the public
branch (the "trunk") using the web interface if you like.

The command above created the new branch.  But your checkout is
still on the trunk - a fact you can see by running the command:


fossil info


To change your check-out to the private branch, type:


fossil update private


You can run the "info" command again to verify that you are on the
private branch.  To go back to the public branch, type:


fossil update trunk


Normally, fossil will modify all the files in your checkout when switching
between the private and the public branches.  But at this point, the files
are identical in both branches so no modifications need to be made.privatebranch.html#_creating_the_private_branch
ˆ
Ö       ”'ˆ…ûq     5#‰G7Compile-time Options1. OverviewFor most purposes, SQLite can be built just fine using the default
compilation options. However, if required, the compile-time options
documented below can be used to 
omit SQLite features (resulting in
a smaller compiled library size) or to change the
default values of some parameters.



Every effort has been made to ensure that the various combinations
of compilation options work harmoniously and produce a working library.
Nevertheless, it is strongly recommended that the SQLite test-suite
be executed to check for errors before using an SQLite library built
with non-standard compilation options.compile.html#overviewˆhô        Y)'IMaintaining Private Branches Of SQLite4.  VariationsSince this document was first written, the canonical SQLite source code
has been moved from the venerable CVS system into a Fossil repository at
http://www.sqlite.org/src.  This means that if you are working with
canonical SQLite source code (as opposed to the amalgamation source code
files, sqlite3.c and sqlite3.h) then you can create a private repository
simply by cloning the official repository:


fossil clone http://www.sqlite.org/src private-project.fossil


This command both creates the new repository and populates it with
all the latest SQLite code.  You can then create a private branch as
described in section 3.4.

When the private repository is created by cloning, incorporating new
public SQLite releases becomes much easier too.  To pull in all of the
latest changes from the public SQLite repository, simply move into
the open check-out and do:


fossil update


Then continue to merge the changes in "trunk" with your "private"
changes as described in section 3.7.
This page last modified on  2021-04-07 11:02:17 UTCprivatebranch.html#_variations‚=ô  Y7ƒ9SMaintaining Private Branches Of SQLite3.8.  Further UpdatesAs new versions of SQLite are released, repeat steps 3.6 and 3.7 to
add changes in the new release to the private branch.
Additional private changes can be
made on the private branch in between releases if desired.privatebranch.html#_further_updatesŠ%ôY‘mMaintaining Private Branches Of SQLite3.7.  Merging Public SQLite Updates Into The Private BranchThe next step is to move the changes in the public branch over into
the private branch.  In other words, we want to create circle (5) in the
diagram above.  Begin by changing to the private branch using
"fossil update private".  Then type this command:


fossil merge trunk


The "merge" command attempts to apply all the changes between
circles (1) and (4) to the files in the local checkout.  Note that
circle (5) has not been created yet.  You will need to run the
"commit" to create circle (5).

It might be that there are conflicts in the merge.  Conflicts
occur when the same line of code was changed in different ways between
circles (1) and (4) versus circles (2) and (3).  The merge command will
announce any conflicts and will include both versions of the conflicting
lines in the output.  You will need to bring up the files that contain
conflicts and manually resolve the conflicts.

After resolving conflicts, many users like to compile and test the
new version before committing it to the repository.  Or you can commit
first and test later.  Either way, run the "fossil commit"
command to check-in the circle (5) version.privatebranch.html#_merging_public_sqlite_updates_into_the_private_branchs the size of the library by about 2%.
But the downside is that using the compile-time option means that SQLite can never
be used by more than a single thread at a time, even if each thread has its own
database connection.

SQLITE_DEFAULT_MEMSTATUS=0.
This setting causes the sqlite3_status() interfaces that track memory usage
to be disabled.  This helps the sqlite3_malloc() routines run much faster,
and since SQLite uses sqlite3_malloc() internally, this helps to make the
entire library faster.

SQLITE_DEFAULT_WAL_SYNCHRONOUS=1.
For maximum database safety following a power loss, the setting of
PRAGMA synchronous=FULL is recommended.  However, in WAL mode, complete
database integrity is guaranteed with PRAGMA synchronous=NORMAL.  With
PRAGMA synchronous=NORMAL in WAL mode, recent changes to the database might
be rolled back by a power loss, but the database will not be corrupted.
Furthermore, transaction commit is much faster in WAL mode using
synchronous=NORMAL than with the default synchronous=FULL.  For these
reasons, it is recommended that the synchronous setting be changed from
FULL to NORMAL when switching to WAL mode.  This compile-time option will
accomplish that.

SQLITE_LIKE_DOESNT_MATCH_BLOBS.
Historically, SQLite has allowed BLOB operands to the LIKE and GLOB
operators.  But having a BLOB as an operand of LIKE or GLOB complicates
and slows the LIKE optimization.  When this option is set, it means that
the LIKE and GLOB operators always return FALSE if either operand is a BLOB.
That simplifies the implementation of the LIKE optimization and allows
queries that use the LIKE optimization to run faster.

SQLITE_MAX_EXPR_DEPTH=0.
Setting the maximum expression parse-tree depth to zero disables all checking
of the expression parse-tree depth, which simplifies the code resulting in
faster execution, and helps the parse tree to use less memory.

SQLITE_OMIT_DECLTYPE.
By omitting the (seldom-needed) ability to return the declared type of
columns from the result set of query, prepared statements can be made
to consume less memory.

SQLITE_OMIT_DEPRECATED.
Omitting deprecated interfaces and features will not help SQLite to
run any faster.  It will reduce the library footprint, however.  And
it is the right thing to do.

SQLITE_OMIT_PROGRESS_CALLBACK.
The progress handler callback counter must be checked in the inner loop
of the bytecode engine.  By omitting this interface, a single conditional
is removed from the inner loop of the bytecode engine, helping SQL statements
to run slightly faster.

SQLITE_OMIT_SHARED_CACHE.
Omitting the possibility of using shared cache allows many conditionals
in performance-critical sections of the code to be eliminated.  This can
give a noticeable improvement in performance.

SQLITE_USE_ALLOCA.
Make use of alloca() for dynamically allocating temporary stack space for 
use within a single function, on systems that support alloca().  Without
this option, temporary space is allocated from the heap.

SQLITE_OMIT_AUTOINIT.
The SQLite library needs to be initialized using a call to
sqlite3_initialize() before certain interfaces are used.  
This initialization normally happens automatically the first time
it is needed.  However, with the SQLITE_OMIT_AUTOINIT option, the automatic
initialization is omitted.  This helps many API calls to run a little faster
(since they do not have to check to see if initialization has already occurred
and then run initialization if it has not previously been invoked) but it
also means that the application must call sqlite3_initialize() manually.
If SQLite is compiled with -DSQLITE_OMIT_AUTOINIT and a routine like
sqlite3_malloc() or sqlite3_vfs_find() or sqlite3_open() is invoked
without first calling sqlite3_initialize(), the likely result will be
a segfault.


When all of the recommended compile-time options above are used,
the SQLite library will be approximately 3% smaller and use about 5% fewer
CPU cycles.  So these options do not make a huge difference.  But in 
some design situations, every little bit helps.compile.html#recommended_compile_time_options
       õ    âgûs      5AÄ%UCompile-time Options3.  Platform Configuration_HAVE_SQLITE_CONFIG_H
  If the _HAVE_SQLITE_CONFIG_H macro is defined
  then the SQLite source code will attempt to #include a file named "config.h".
  The "config.h" file usually contains other configuration options, especially
  "HAVE_INTERFACE" type options generated by autoconf scripts.

HAVE_FDATASYNC
  If the HAVE_FDATASYNC compile-time option is true, then the default VFS
  for unix systems will attempt to use fdatasync() iĨ>ûr   5SÏ/gCompile-time Options2. Recommended Compile-time OptionsThe following compile-time options are recommended for applications that
are able to use them, in order to minimized the number of CPU cycles and
the bytes of memory used by SQLite.
Not all of these compile-time options are usable by every application.
For example, the SQLITE_THREADSAFE=0 option is only usable by applications
that never access SQLite from more than one thread at a time.  And the
SQLITE_OMIT_PROGRESS_CALLBACK option is only usable by applications that
do not use the sqlite3_progress_handler() interface.  And so forth.

It is impossible to test every possible combination of compile-time
options for SQLite.  But the following set of compile-time options is
one configuration that is always fully tested.


SQLITE_DQS=0.
This setting disables the double-quoted string literal misfeature.

SQLITE_THREADSAFE=0.
Setting -DSQLITE_THREADSAFE=0 causes all of the mutex and thread-safety logic
in SQLite to be omitted.  This is the single compile-time option causes SQLite
to run about 2% faster and also reduceÂnstead of fsync() where
  appropriate.  If this flag is missing or false, then fsync() is always used.

HAVE_GMTIME_R
  If the HAVE_GMTIME_R option is true and if SQLITE_OMIT_DATETIME_FUNCS is true,
  then the CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP keywords will use
  the threadsafe "gmtime_r()" interface rather than "gmtime()".  In the usual case
  where SQLITE_OMIT_DATETIME_FUNCS is not defined or is false, then the
  built-in date and time functions are used to implement the CURRENT_TIME,
  CURRENT_DATE, and CURRENT_TIMESTAMP keywords and neither gmtime_r() nor
  gmtime() is ever called.

HAVE_ISNAN
  If the HAVE_ISNAN option is true, then SQLite invokes the system library isnan()
  function to determine if a double-precision floating point value is a NaN.
  If HAVE_ISNAN is undefined or false, then SQLite substitutes its own home-grown
  implementation of isnan().

HAVE_LOCALTIME_R
  If the HAVE_LOCALTIME_R option is true, then SQLite uses the threadsafe
  localtime_r() library routine instead of localtime()
  to help implement the localtime modifier
  to the built-in date and time functions.

HAVE_LOCALTIME_S
  If the HAVE_LOCALTIME_S option is true, then SQLite uses the threadsafe
  localtime_s() library routine instead of localtime()
  to help implement the localtime modifier
  to the built-in date and time functions.

HAVE_MALLOC_USABLE_SIZE
  If the HAVE_MALLOC_USABLE_SIZE option is true, then SQLite tries uses the
  malloc_usable_size() interface to find the size of a memory allocation obtained
  from the standard-library malloc() or realloc() routines.  This option is only
  applicable if the standard-library malloc() is used.  On Apple systems,
  "zone malloc" is used instead, and so this option is not applicable.  And, of
  course, if the application supplies its own malloc implementation using
  SQLITE_CONFIG_MALLOC then this option has no effect.
  
  If the HAVE_MALLOC_USABLE_SIZE option is omitted or is false, then SQLite 
  uses a wrapper around system malloc() and realloc() that enlarges each allocation
  by 8 bytes and writes the size of the allocation in the initial 8 bytes, and
  then SQLite also implements its own home-grown version of malloc_usable_size()
  that consults that 8-byte prefix to find the allocation size.  This approach
  works but it is suboptimal.  Applications are encouraged to use
  HAVE_MALLOC_USABLE_SIZE whenever possible.

HAVE_STRCHRNUL
  If the HAVE_STRCHRNUL option is true, then SQLite uses the strchrnul() library
  function.  If this option is missing or false, then SQLite substitutes its own
  home-grown implementation of strchrnul().

HAVE_USLEEP
  If the HAVE_USLEEP option is true, then the default unix VFS uses the
  usleep() system call to implement the xSleep method.  If this option is
  undefined or false, then xSleep on unix is implemented using sleep() which
  means that sqlite3_sleep() will have a minimum wait interval of 1000
  milliseconds regardless of its argument.  

HAVE_UTIME
  If the HAVE_UTIME option is true, then the built-in but non-standard
  "unix-dotfile" VFS will use the utime() system call, instead of utimes(),
  to set the last access time on the lock file.

SQLITE_BYTEORDER=(0|1234|4321)
  SQLite needs to know if the native byte order of the target CPU is
  big-endian or little-ending.  The SQLITE_BYTEORDER preprocessor is set
  to 4321 for big-endian machines and 1234 for little-endian machines, or
  it can be 0 to mean that the byte order must be determined at run-time.
  There are #ifdefs in the code that set SQLITE_BYTEORDER automatically
  for all common platforms and compilers.  However, it may be advantageous
  to set SQLITE_BYTEORDER appropriately when compiling SQLite for obscure
  targets.  If the target byte order cannot be determined at compile-time,
  then SQLite falls back to doing run-time checks, which always work, though
  with a small performance penalty.compile.html#_platform_configurationÆll be used for memory-mapped I/O
  for each open database file.  If the N
  is zero, then memory mapped I/O is disabled by default.  This
  compile-time limit and the SQLITE_MAX_MMAP_SIZE can be modified 
  at start-time using the
  sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) call, or at run-time
  using the mmap_size pragma.

SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=&lt;bytes&gt;
  This option sets the size limit on rollback journal files in
  persistent journal mode and
  exclusive locking mode and on the size of the
  write-ahead log file in WAL mode. When this 
  compile-time option is omitted there is no upper bound on the
  size of the rollback journals or write-ahead logs.  
  The journal file size limit
  can be changed at run-time using the journal_size_limit pragma.

SQLITE_DEFAULT_LOCKING_MODE=&lt;1 or 0&gt;
  If set to 1, then the default locking_mode is set to EXCLUSIVE.
  If omitted or set to 0 then the default locking_mode is NORMAL.

SQLITE_DEFAULT_LOOKASIDE=SZ,N
  Sets the default size of the lookaside memory allocator memory pool
  to N entries of SZ bytes each.  This setting can be modified at
  start-time using sqlite3_config(SQLITE_CONFIG_LOOKASIDE) and/or
  as each database connection is opened using
  sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE).

SQLITE_DEFAULT_MEMSTATUS=&lt;1 or 0&gt;
  This macro is used to determine whether or not the features enabled and
  disabled using the SQLITE_CONFIG_MEMSTATUS argument to sqlite3_config()
  are available by default. The default value is 1 (SQLITE_CONFIG_MEMSTATUS
  related features enabled).
  
  The sqlite3_memory_used() and sqlite3_memory_highwater() interfaces,
  the sqlite3_status64(SQLITE_STATUS_MEMORY_USED) interface,
  and the SQLITE_MAX_MEMORY compile-time option are all non-functional
  when memory usage tracking is disabled.

SQLITE_DEFAULT_PCACHE_INITSZ=N
  This macro determines the number of pages initially allocated by the 
  page cache module when SQLITE_CONFIG_PAGECACHE configuration option is
  not use and memory for the page cache is obtained from sqlite3_malloc()
  instead.  The number of pages set by this macro are allocated in a single
  allocation, which reduces the load on the memory allocator.

SQLITE_DEFAULT_PAGE_SIZE=&lt;bytes&gt;
  This macro is used to set the default page-size used when a
  database is created. The value assigned must be a power of 2. The
  default value is 4096. The compile-time default may be overridden at 
  runtime by the PRAGMA page_size command.

SQLITE_DEFAULT_SYNCHRONOUS=&lt;0-3&gt;
  This macro determines the default value of the
  PRAGMA synchronous setting.  If not overridden at compile-time,
  the default setting is 2 (FULL).

SQLITE_DEFAULT_WAL_SYNCHRONOUS=&lt;0-3&gt;
  This macro determines the default value of the
  PRAGMA synchronous setting for database files that open in
  WAL mode.  If not overridden at compile-time, this value is the
  same as SQLITE_DEFAULT_SYNCHRONOUS.
  
  If SQLITE_DEFAULT_WAL_SYNCHRONOUS differs from SQLITE_DEFAULT_SYNCHRONOUS,
  and if the application has not modified the synchronous setting for
  the database file using the PRAGMA synchronous statement, then
  the synchronous setting is changed to value defined by
  SQLITE_DEFAULT_WAL_SYNCHRONOUS when the database connection switches
  into WAL mode for the first time.
  If the SQLITE_DEFAULT_WAL_SYNCHRONOUS value is not overridden at
  compile-time, then it will always be the same as
  SQLITE_DEFAULT_SYNCHRONOUS and so no automatic synchronous setting
  changes will ever occur.

SQLITE_DEFAULT_WAL_AUTOCHECKPOINT=&lt;pages&gt;
  This macro sets the default page count for the WAL
  automatic checkpointing feature.  If unspecified,
  the default page count is 1000.

SQLITE_DEFAULT_WORKER_THREADS=N
  This macro sets the default value for
  the SQLITE_LIMIT_WORKER_THREADS parameter.  The SQLITE_LIMIT_WORKER_THREADS
  parameter sets the maximum number of auxiliary threads that a single
  prepared statement will launch to assist it with a query.  If not specified,
  the default maximum is 0.
  The value set here cannot be moreÇ than SQLITE_MAX_WORKER_THREADS.

SQLITE_DQS=N
  This macro determines the default values for
  SQLITE_DBCONFIG_DQS_DDL and SQLITE_DBCONFIG_DQS_DML, which
  in turn how SQLite handles each double-quoted string literal.
  The "DQS" name stands for 
  "Double-Quoted String".
  The N argument should be an integer 0, 1, 2, or 3.
  
  SQLITE_DQSDouble-Quoted Strings Allowed
      Remarks
  In DDLIn DML
  3yesyesdefault
  2yesno&nbsp;
  1noyes&nbsp;
  0nonorecommended
  
  The recommended setting is 0, meaning that double-quoted
  strings are disallowed in all contexts.  However, the default
  setting is 3 for maximum compatibility with legacy applications.

SQLITE_EXTRA_DURABLE
  The SQLITE_EXTRA_DURABLE compile-time option that used to cause the default
  PRAGMA synchronous setting to be EXTRA, rather than FULL.  This option
  is no longer supported.  Use
  SQLITE_DEFAULT_SYNCHRONOUS=3 instead.

SQLITE_FTS3_MAX_EXPR_DEPTH=N
  This macro sets the maximum depth of the search tree that corresponds to
  the right-hand side of the MATCH operator in an FTS3 or FTS4 full-text
  index.  The full-text search uses a recursive algorithm, so the depth of
  the tree is limited to prevent using too much stack space.  The default
  limit is 12.  This limit is sufficient for up to 4095 search terms on the
  right-hand side of the MATCH operator and it holds stack space usage to 
  less than 2000 bytes.
  
  For ordinary FTS3/FTS4 queries, the search tree depth is approximately
  the base-2 logarithm of the number of terms in the right-hand side of the
  MATCH operator.  However, for phrase queries and NEAR queries the
  search tree depth is linear in the number of right-hand side terms.
  So the default depth limit of 12 is sufficient for up to 4095 ordinary
  terms on a MATCH, it is only sufficient for 11 or 12 phrase or NEAR
  terms.  Even so, the default is more than enough for most application.

SQLITE_LIKE_DOESNT_MATCH_BLOBS
  This compile-time option causes the LIKE operator to always return 
  False if either operand is a BLOB.  The default behavior of LIKE 
  is that BLOB operands are cast to TEXT before the comparison is done.
  
  This compile-time option makes SQLite run more efficiently when processing
  queries that use the LIKE operator, at the expense of breaking backwards
  compatibility.  However, the backwards compatibility break may be only
  a technicality.  There was a long-standing bug in the LIKE processing logic
  (see https://www.sqlite.org/src/info/05f43be8fdda9f) that caused it to
  misbehavior for BLOB operands and nobody observed that bug in nearly
  10 years of active use.  So for more users, it is probably safe to
  enable this compile-time option and thereby save a little CPU time
  on LIKE queries.
  
  This compile-time option affects the SQL LIKE operator only and has
  no impact on the sqlite3_strlike() C-language interface.

SQLITE_MAX_MEMORY=N
  This option limits the total amount of memory that SQLite will request
  from malloc() to N bytes.  Any attempt by SQLite to allocate
  new memory that would cause the sum of all allocations held by SQLite to exceed
  N bytes will result in an out-of-memory error.
  This is a hard upper limit.  See also the sqlite3_soft_heap_limit()
  interface.
  
  This limit is only functional if memory usage statistics are available via
  the sqlite3_memory_used() and sqlite3_status64(SQLITE_STATUS_MEMORY_USED)
  interfaces.  Without that memory usage information, SQLite has no way of
  knowing when it is about to go over the limit, and thus is unable to prevent
  the excess memory allocation.  Memory usage tracking is turned on by default,
  but can be disabled at compile-time using the SQLITE_DEFAULT_MEMSTATUS option,
  or at start-time using sqlite3_config(SQLITE_CONFIG_MEMSTATUS).

SQLITE_MAX_MMAP_SIZE=N
  This macro sets a hard upper bound on the amount of address space that
  can be used by any single database for memory-mapped I/O.
  Setting this value to 0 completely disables memory-mapped I/O and
  causes logic associated with memory-mapped I/O to be omitted froÈm the
  build.  This option does change the default memory-mapped I/O address
  space size (set by SQLITE_DEFAULT_MMAP_SIZE or
  sqlite3_config(SQLITE_CONFIG_MMAP_SIZE) or the
  run-time memory-mapped I/O address space size (set by
  sqlite3_file_control(SQLITE_FCNTL_MMAP_SIZE) or
  PRAGMA mmap_size) as long as those other settings are less than the
  maximum value defined here.

SQLITE_MAX_SCHEMA_RETRY=N
  Whenever the database schema changes, prepared statements are automatically
  reprepared to accommodate the new schema.  There is a race condition here
  in that if one thread is constantly changing the schema, another thread
  might spin on reparses and repreparations of a prepared statement and
  never get any real work done.  This parameter prevents an infinite loop
  by forcing the spinning thread to give up after a fixed number of attempts
  at recompiling the prepared statement.  The default setting is 50 which is
  more than adequate for most applications.

SQLITE_MAX_WORKER_THREADS=N
  Set an upper bound on the sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,N)
  setting that determines the maximum number of auxiliary threads that a single
  prepared statement will use to aid with CPU-intensive computations
  (mostly sorting).  See also the SQLITE_DEFAULT_WORKER_THREADS options.

SQLITE_MEMDB_DEFAULT_MAXSIZE=N
  Set the default size limit (in bytes) for in-memory databases created using
  sqlite3_deserialize().  This is just the default.  The limit can be
  changed at start-time using
  sqlite3_config(SQLITE_CONFIG_MEMDB_MAXSIZE,N)
  or at run-time for individual databases using the
  SQLITE_FCNTL_SIZE_LIMIT file-control.
  If no default is specified, 1073741824 is used.

SQLITE_MINIMUM_FILE_DESCRIPTOR=N
  The unix VFS will never use a file descriptor less than N.  The
  default value of N is 3.
  
  Avoiding the use of low-numbered file descriptors is a defense against
  accidental database corruption.  If a database file was opened using
  file descriptor 2, for example, and then an assert() failed and invoked
  write(2,...), that would likely cause database corruption by overwriting
  part of the database file with the assertion error message.  Using only
  higher-valued file descriptors avoids this potential problem.  The 
  protection against
  using low-numbered file descriptors can be disabled by setting this
  compile-time option to 0.

SQLITE_POWERSAFE_OVERWRITE=&lt;0 or 1&gt;
  This option changes the default assumption about powersafe overwrite
  for the underlying filesystems for the unix and windows VFSes.
  Setting SQLITE_POWERSAFE_OVERWRITE to 1 causes SQLite to assume that
  application-level writes cannot changes bytes outside the range of
  bytes written even if the write occurs just before a power loss.
  With SQLITE_POWERSAFE_OVERWRITE set to 0, SQLite assumes that other
  bytes in the same sector with a written byte might be changed or 
  damaged by a power loss.

SQLITE_PRINTF_PRECISION_LIMIT=N
  This option limits the maximum width and precision of substitutions
  for the printf() SQL function and the other C-language string
  formatting functions such as sqlite3_mprintf() and
  sqlite3_str_appendf().  This is turn can prevent a hostile or
  malfunctioning script from using excessive memory by invoking
  a format such as: "printf('%*s',2147483647,'hi')".
  A value for N of around 100000 is normally sufficient.
  
  The printf() SQL function is subject to the SQLITE_LIMIT_LENGTH
  limit of sqlite3_limit().  Hence any printf() result with a
  width or precision more than the SQLITE_LIMIT_LENGTH will cause
  an SQLITE_TOOBIG error.  However, the low-level formatting
  for the printf() function is done by a subroutine that does not
  have access to SQLITE_LIMIT_LENGTH.  So the low-level formatting
  is done into a memory allocation that might be considerably larger
  than SQLITE_LIMIT_LENGTH and the SQLITE_LIMIT_LENGTH check is only
  performed after all formatting is complete.  Thus there might be a
  transient buffer that exceeds SQLITE_LIMIT_LENGTH.  The
  SQLITE_PRINTF_PRECISION_LIMIT option is an additional check
  that prevents excess sizes for the transient buffer used inside
  the low-level formatting subroutine, prior to the
  SQLITE_LIMIT_LENGTH check.
  
  Be careful not to set SQLITE_PRINTF_PRECISION_LIMIT too low.
  SQLite uses its built-in printf() functionality to format the text
  of CREATE statements stored in the sqlite_schema table.  So
  SQLITE_PRINTF_PRECISION_LIMIT should be at least as big as the largest
  table, index, view, or trigger definition that you are likely to
  encounter.
  
  No error is raised if a width or precision exceeds
  SQLITE_PRINTF_PRECISION_LIMIT.  Instead, the large width or
  precision is silently truncated.
  
  The default value for SQLITE_PRINTF_PRECISION_LIMIT is 2147483647
  (0x7fffffff).


SQLITE_QUERY_PLANNER_LIMIT=N
  As part of the query planning process, SQLite enumerates all usable
  combinations of indexes and WHERE-clause constraints.  For certain
  pathological queries, the number of these index-and-constraint combinations
  can be very large, resulting in slow performance by the query planner.
  The SQLITE_QUERY_PLANNER_LIMIT value (in conjunction with the
  related SQLITE_QUERY_PLANNER_LIMIT_INCR setting) limits the number 
  of index-and-constraint combinations that the query planner will 
  consider, in order to prevent the query planner from using excess
  CPU time.  The default value for SQLITE_QUERY_PLANNER_LIMIT is set
  high enough so that is never reached for real-world queries.  The
  query planner search limit only applies to queries that are deliberately
  crafted to use excess planning time.

SQLITE_QUERY_PLANNER_LIMIT_INCR=N
  The SQLITE_QUERY_PLANNER_LIMIT option sets an initial baseline value
  for the maximum number of index-and-constraint combinations that the
  query planner consider.  The baseline query planner limit is increased
  by SQLITE_QUERY_PLANNER_LIMIT_INCR prior to processing each table of a
  join so that each table is guaranteed to be able to propose at least
  some index-and-constraint combinations to the optimizer even if prior
  tables of the join have exhausted the baseline limit.  The default
  value for both this compile-time option and the
  SQLITE_QUERY_PLANNER_LIMIT option are set high enough so that they should
  never be reached for real-world queries.

SQLITE_REVERSE_UNORDERED_SELECTS
  This option causes the PRAGMA reverse_unordered_selects setting to be
  enabled by default.  When enabled, SELECT statements that lack an
  ORDER BY clause will run in reverse order.
  This option is useful for detecting when applications (incorrectly)
  assume that the order of rows in a SELECT without an ORDER BY clause
  will always be the same.

SQLITE_SORTER_PMASZ=N
  If multi-threaded processing is enabled via the
  PRAGMA threads setting, then sort operations will
  attempt to start helper threads when the amount of content
  to be sorted exceeds the minimum of the cache_size and PMA Size
  determined by the SQLITE_CONFIG_PMASZ start-time option.
  This compile-time option sets the default value for the
  SQLITE_CONFIG_PMASZ start-time option.
  The default value is 250.

SQLITE_STMTJRNL_SPILL=N
  The SQLITE_STMTJRNL_SPILL compile-time option determines the
  default setting of the SQLITE_CONFIG_STMTJRNL_SPILL start-time
  setting.  That setting determines the size threshold above which
  statement journals are moved from memory to disk.

SQLITE_WIN32_MALLOC
  This option enables the use of the Windows Heap API functions for memory
  allocation instead of the standard library malloc() and free() routines.

YYSTACKDEPTH=&lt;max_depth&gt;
  This macro sets the maximum depth of the LALR(1) stack used by
  the SQL parser within SQLite.  The default value is 100.  A typical
  application will use less than about 20 levels of the stack.
  Developers whose applications contain SQL statements that 
  need more than 100 LALR(1) stack entries should seriously
  consider refactoring their SQL as it is likely to be well beyond
  the ability of any human to comprehend.compile.html#_options_to_set_default_parameter_values
ú…sûu   5IŠ-]Compile-time Options5.  Options To Set Size LimitsThere are compile-time options that will set upper bounds
on the sizes of various structures in SQLite.  The compile-time
options normally set a hard upper bound that can be changed
at run-time on individual database connections using the
sqlite3_limit() interface.

The compile-time options for setting upper bounds are
documented separately.  The following is a list of
the available settings:


 SQLITE_MAX_ATTACHED  
 SQLITE_MAX_COLUMN  
 SQLITE_MAX_COMPOUND_SELECT  
 SQLITE_MAX_EXPR_DEPTH  
 SQLITE_MAX_FUNCTION_ARG  
 SQLITE_MAX_LENGTH  
 SQLITE_MAX_LIKE_PATTERN_LENGTH  
 SQLITE_MAX_PAGE_COUNT  
 SQLITE_MAX_SQL_LENGTH  
 SQLITE_MAX_VARIABLE_NUMBERcompile.html#_options_to_set_size_limits—lût
5c‚-iwCompile-time Options4.  Options To Set Default Parameter ValuesSQLITE_DEFAULT_AUTOMATIC_INDEX=&lt;0 or 1&gt;
  This macro determines the initial setting for PRAGMA automatic_index
  for newly opened database connections.
  For all versions of SQLite through 3.7.17,
  automatic indices are normally enabled for new database connections if
  this compile-time option is omitted.
  However, that might change in future releases of SQLite.
  See also: SQLITE_OMIT_AUTOMATIC_INDEX

SQLITE_DEFAULT_AUTOVACUUM=&lt;0 or 1 or 2&gt;
  This macro determines if SQLite creates databases with the 
  auto_vacuum flag set by default to OFF (0), FULL (1), or
  INCREMENTAL (2). The default value is 0 meaning that databases
  are created with auto-vacuum turned off.
  In any case the compile-time default may be overridden by the 
  PRAGMA auto_vacuum command.

SQLITE_DEFAULT_CACHE_SIZE=&lt;N&gt;
  This macro sets the default maximum size of the page-cache for each attached
  database.  A positive value means that the limit is N page.  If N is negative
  that means to limit the cache size to -N*1024 bytes.
  The suggested maximum cache size can be overridden by the 
  PRAGMA cache_size command. The default value is -2000, which translates
  into a maximum of 2048000 bytes per cache.

SQLITE_DEFAULT_FILE_FORMAT=&lt;1 or 4&gt;
  The default schema format number used by SQLite when creating
  new database files is set by this macro.  The schema formats are all
  very similar.  The difference between formats 1 and 4 is that format
  4 understands descending indices and has a tighter encoding for
  boolean values.

  All versions of SQLite since 3.3.0 (2006-01-10)
  can read and write any schema format
  between 1 and 4.  But older versions of SQLite might not be able to
  read formats greater than 1.  So that older versions of SQLite will
  be able to read and write database files created by newer versions
  of SQLite, the default schema format was set to 1 for SQLite versions
  through 3.7.9 (2011-11-01).  Beginning with 
  version 3.7.10 (2012-01-16), the default
  schema format is 4.

  The schema format number for a new database can be set at runtime using
  the PRAGMA legacy_file_format command.

SQLITE_DEFAULT_FILE_PERMISSIONS=N
  The default numeric file permissions for newly created database files
  under unix.  If not specified, the default is 0644 which means that
  the files is globally readable but only writable by the creator.

SQLITE_DEFAULT_FOREIGN_KEYS=&lt;0 or 1&gt;
  This macro determines whether enforcement of 
  foreign key constraints is enabled or disabled by default for
  new database connections.  Each database connection can always turn
  enforcement of foreign key constraints on and off and run-time using
  the foreign_keys pragma.  Enforcement of foreign key constraints
  is normally off by default, but if this compile-time parameter is
  set to 1, enforcement of foreign key constraints will be on by default.

SQLITE_DEFAULT_MMAP_SIZE=N
  This macro sets the default limit on the amount of memory that
  wiÅte3_os_end() interfaces.  The usual practice
  is for the supplied sqlite3_os_init() to invoke sqlite3_vfs_register().
  SQLite will automatically invoke sqlite3_os_init() when it initializes.

  This option is typically used when building SQLite for an embedded
  platform with a custom operating system.

SQLITE_SECURE_DELETE
  This compile-time option changes the default setting of the
  secure_delete pragma.  When this option is not used, secure_delete defaults
  to off.  When this option is present, secure_delete defaults to on.

  The secure_delete setting causes deleted content to be overwritten with
  zeros.  There is a small performance penalty since additional I/O
  must occur.  On the other hand, secure_delete can prevent fragments of 
  sensitive information from lingering in unused parts of the database file 
  after it has been deleted.  See the documentation on the
  secure_delete pragma for additional information.

SQLITE_THREADSAFE=&lt;0 or 1 or 2&gt;
  This option controls whether or not code is included in SQLite to
  enable it to operate safely in a multithreaded environment.  The
  default is SQLITE_THREADSAFE=1 which is safe for use in a multithreaded
  environment.  When compiled with SQLITE_THREADSAFE=0 all mutexing code
  is omitted and it is unsafe to use SQLite in a multithreaded program.
  When compiled with SQLITE_THREADSAFE=2, SQLite can be used in a multithreaded
  program so long as no two threads attempt to use the same
  database connection (or any prepared statements derived from
  that database connection) at the same time.

  To put it another way, SQLITE_THREADSAFE=1 sets the default
  threading mode to Serialized.  SQLITE_THREADSAFE=2 sets the default
  threading mode to Multi-threaded.  And SQLITE_THREADSAFE=0 sets the
  threading mode to Single-threaded.

  The value of SQLITE_THREADSAFE can be determined at run-time
  using the sqlite3_threadsafe() interface.

  When SQLite has been compiled with SQLITE_THREADSAFE=1 or
  SQLITE_THREADSAFE=2 then the threading mode
  can be altered at run-time using the sqlite3_config() interface together
  with one of these verbs:

  
  SQLITE_CONFIG_SINGLETHREAD
  SQLITE_CONFIG_MULTITHREAD
  SQLITE_CONFIG_SERIALIZED
  

  The SQLITE_OPEN_NOMUTEX and
  SQLITE_OPEN_FULLMUTEX flags to sqlite3_open_v2() can also be used
  to adjust the threading mode of individual database connections
  at run-time.

  Note that when SQLite is compiled with SQLITE_THREADSAFE=0, the code
  to make SQLite threadsafe is omitted from the build.  When this occurs,
  it is impossible to change the threading mode at start-time or run-time.

  See the threading mode documentation for additional information
  on aspects of using SQLite in a multithreaded environment.

SQLITE_TEMP_STORE=&lt;0 through 3&gt;
  This option controls whether temporary files are stored on disk or
  in memory.  The meanings for various settings of this compile-time
  option are as follows:

  
  SQLITE_TEMP_STOREMeaning
  0Always use temporary files
  1Use files by default but allow the
  PRAGMA temp_store command to override
  2Use memory by default but allow the
  PRAGMA temp_store command to override
  3Always use memory
  

  The default setting is 1.  
  Additional information can be found in tempfiles.html.

SQLITE_TRACE_SIZE_LIMIT=N
  If this macro is defined to a positive integer N, then the length of
  strings and BLOB that are expanded into parameters in the output of
  sqlite3_trace() is limited to N bytes.  

SQLITE_TRUSTED_SCHEMA=&lt;0 or 1&gt;
  This macro determines the default value for the
  SQLITE_DBCONFIG_TRUSTED_SCHEMA and PRAGMA trusted_schema setting.
  If no alternative is specified, the trusted-schema setting defaults
  to ON (a value of 1) for legacy compatibility.  However, for best
  security, systems that implement
  application-defined SQL functions and/or virtual tables should
  consider changing the default to OFF.

SQLITE_USE_URI
  This option causes the URI filename process logic to be enabled by 
  default.compile.html#_options_to_control_operating_characteristics
ññ´ûv
5mæCompile-time Options6.  Options To Control Operating CharacteristicsSQLITE_4_BYTE_ALIGNED_MALLOC
  On most systems, the malloc() system call returns a buffer that is
  aligned to an 8-byte boundary.  But on some systems (ex: windows) malloc()
  returns 4-byte aligned pointer.  This compile-time option must be used
  on systems that return 4-byte aligned pointers from malloc().

SQLITE_CASE_SENSITIVE_LIKE
  If this option is present, then the built-in LIKE operator will be
  case sensitive.  This same effect can be achieved at run-time using
  the case_sensitive_like pragma.

SQLITE_DIRECT_OVERFLOW_READ
  When this option is present, content contained in
  overflow pages of the database file is read directly from disk,
  bypassing the page cache, during read transactions.  In applications
  that do a lot of reads of large BLOBs, this option might improve read
  performance.

SQLITE_HAVE_ISNAN
  If this option is present, then SQLite will use the isnan() function from
  the system math library.  This is an alias for the HAVE_ISNAN configuration
  option.

SQLITE_MAX_ALLOCATION_SIZE=N
  This compile-time option sets an upper bound on the size of memory
  allocations that can be requested using sqlite3_malloc64(),
  sqlite3_realloc64(), and similar.  The default value is
  2,147,483,391 (0x7ffffeff) and this should be considered an
  upper bound.  Most applications can get by with an maximum allocation
  size of a few million bytes.
  
  This is a limit on the maximum size of any single memory allocation.
  It is not a limit on the total amount of memory allocated.
  
  Reducing the maximum size of individual memory allocations provides
  extra defense against denial-of-service attacks that attempt to exhaust
  system memory by doing many large allocations.  It is also an extra layer
  of defense against application bugs where the size of a memory allocation
  is computed using a signed 32-bit integer that could overflow &rarr;
  with a small maximum allocation size, such buggy memory allocation size
  computations are likely to be spotted sooner due to out-of-memory errors
  and before the integer actually overflows.

SQLITE_OS_OTHER=&lt;0 or 1&gt;
  The option causes SQLite to omit its built-in operating system interfaces
  for Unix, Windows, and OS/2.  The resulting library will have no default
  operating system interface.  Applications must use
  sqlite3_vfs_register() to register an appropriate interface before
  using SQLite.  Applications must also supply implementations for the
  sqlite3_os_init() and sqliÊÍ to required parameters or using objects after they have been
  destroyed.

SQLITE_ENABLE_ATOMIC_WRITE
  If this C-preprocessor macro is defined and if the
  xDeviceCharacteristics method of sqlite3_io_methods object for
  a database file reports (via one of the SQLITE_IOCAP_ATOMIC bits)
  that the filesystem supports atomic writes and if a transaction
  involves a change to only a single page of the database file,
  then the transaction commits with just a single write request of
  a single page of the database and no rollback journal is created
  or written.  On filesystems that support atomic writes, this
  optimization can result in significant speed improvements for
  small updates.  However, few filesystems support this capability
  and the code paths that check for this capability slow down write
  performance on systems that lack atomic write capability, so this
  feature is disabled by default.

SQLITE_ENABLE_BATCH_ATOMIC_WRITE
  This compile-time option enables SQLite to take advantage batch
  atomic write capabilities in the underlying filesystem.  As of
  SQLite version 3.21.0 (2017-10-24) this is only supported on
  F2FS.  However, the interface
  is implemented generically, using sqlite3_file_control() with
  SQLITE_FCNTL_BEGIN_ATOMIC_WRITE and SQLITE_FCNTL_COMMIT_ATOMIC_WRITE
  so the capability can be added to other filesystem times in the
  future.  When this option is enabled, SQLite automatically detects
  that the underlying filesystem supports batch atomic writes, and
  when it does so it avoids writing the rollback journal for transaction
  control.  This can make transactions over twice as fast, while
  simultaneously reducing wear on SSD storage devices.

  Future versions of SQLite might enable the batch-atomic-write
  capability by default, at which point this compile-time option
  will become superfluous.

SQLITE_ENABLE_BYTECODE_VTAB
  This option enables the bytecode and tables_used virtual tables.

SQLITE_ENABLE_COLUMN_METADATA
  When this C-preprocessor macro is defined, SQLite includes some
  additional APIs that provide convenient access to meta-data about
  tables and queries.  The APIs that are enabled by this option are:

  
   sqlite3_column_database_name() 
   sqlite3_column_database_name16() 
   sqlite3_column_table_name() 
   sqlite3_column_table_name16() 
   sqlite3_column_origin_name() 
   sqlite3_column_origin_name16() 
  

SQLITE_ENABLE_DBPAGE_VTAB
  This option enables the SQLITE_DBPAGE virtual table.

SQLITE_ENABLE_DBSTAT_VTAB
  This option enables the dbstat virtual table.

SQLITE_ENABLE_DESERIALIZE
  This option was formerly used to enable
  the sqlite3_serialize() and sqlite3_deserialize()
  interfaces.  However, as of SQLite 3.36.0 (2021-06-18)
  those interfaces are enabled by default and a new
  compile-time option SQLITE_OMIT_DESERIALIZE is added
  to omit them.

SQLITE_ENABLE_EXPLAIN_COMMENTS
  This option adds extra logic to SQLite that inserts comment text into the
  output of EXPLAIN.  These extra comments use extra memory, thus
  making prepared statements larger and very slightly slower, and so they are
  turned off by default and in most application.  But some applications, such
  as the command-line shell for SQLite, value clarity of EXPLAIN output
  over raw performance and so this compile-time option is available to them.
  The SQLITE_ENABLE_EXPLAIN_COMMENTS compile-time option is also enabled
  automatically if SQLITE_DEBUG is enabled.

SQLITE_ENABLE_FTS3
  When this option is defined in the amalgamation, version 3
  of the full-text search engine is added to the build automatically.

SQLITE_ENABLE_FTS3_PARENTHESIS
  This option modifies the query pattern parser in FTS3 such that it
  supports operators AND and NOT (in addition to the usual OR and NEAR)
  and also allows query expressions to contain nested parenthesis.

SQLITE_ENABLE_FTS3_TOKENIZER
  This option enables the two-argument version of the fts3_tokenizer()
  interface.  The second argument to fts3_tokenizer() is suppose to be a
  pointer to a function (encoded as a BLOB) that implements an
  aÎpplication defined tokenizer.  If hostile actors are able to run
  the two-argument version of fts3_tokenizer() with an arbitrary second
  argument, they could use crash or take control of the process. 
  
  Because of security concerns, the two-argument fts3_tokenizer() feature 
  was disabled beginning with Version 3.11.0 (2016-02-15)
  unless this compile-time option is used.
  Version 3.12.0 (2016-03-29) added the 
  sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER,1,0) interface
  that activates the two-argument version of fts3_tokenizer()
  for a specific database connection at run-time.

SQLITE_ENABLE_FTS4
  When this option is defined in the amalgamation, versions 3 and 4
  of the full-text search engine is added to the build automatically.

SQLITE_ENABLE_FTS5
  When this option is defined in the amalgamation, versions 5
  of the full-text search engine (fts5) is added to the build automatically.

SQLITE_ENABLE_GEOPOLY
  When this option is defined in the amalgamation, the Geopoly extension
  is included in the build.

SQLITE_ENABLE_ICU
  This option causes the 
  International Components for Unicode
  or "ICU" extension to SQLite to be added to the build.  

SQLITE_ENABLE_IOTRACE
  When both the SQLite core and the Command Line Interface (CLI) are both 
  compiled with this option, then the CLI provides an extra command
  named ".iotrace" that provides a low-level log of I/O activity.
  This option is experimental and may be discontinued in a future release.

SQLITE_ENABLE_MATH_FUNCTIONS
  This macro enables the built-in SQL math functions.  This option
  is automatically added to the Makefile by the configure script on unix platforms,
  unless the --disable-math option is used.
  This option is also included on Windows builds using the
  "Makefile.msc" makefile for nmake.

SQLITE_ENABLE_JSON1
  This compile-time option is a no-op.  Prior to SQLite version 3.38.0
  (2022-02-22), it was necessary to compile with this option in order
  to include the JSON SQL functions in the build.  However, beginning
  with SQLite version 3.38.0, those functions are included by default.
  Use the -DSQLITE_OMIT_JSON option to omit them.

SQLITE_ENABLE_LOCKING_STYLE
  This option enables additional logic in the OS interface layer for
  Mac OS X. The additional logic attempts to determine the type of the
  underlying filesystem and choose and alternative locking strategy
  that works correctly for that filesystem type. Five locking strategies 
  are available:

  
     POSIX locking style. This is the default locking style and the
         style used by other (non Mac OS X) Unixes. Locks are obtained and 
         released using the fcntl() system call.

     AFP locking style. This locking style is used for network file 
         systems that use the AFP (Apple Filing Protocol) protocol. Locks
         are obtained by calling the library function _AFPFSSetLock().

     Flock locking style. This is used for file-systems that do not
         support POSIX locking style. Locks are obtained and released using
         the flock() system call.

     Dot-file locking style. This locking style is used when neither
         flock nor POSIX locking styles are supported by the file system.
         Database locks are obtained by creating and entry in the file-system
         at a well-known location relative to the database file (a "dot-file")
         and relinquished by deleting the same file.

     No locking style. If none of the above can be supported, this 
         locking style is used. No database locking mechanism is used. When
         this system is used it is not safe for a single database to be
         accessed by multiple clients.
  

  Additionally, five extra VFS implementations are provided as well as the
  default. By specifying one of the extra VFS implementations 
  when calling sqlite3_open_v2(), an application may bypass the file-system
  detection logic and explicitly select one of the above locking styles. The
  five extra VFS implementations are called "unix-posix", "unix-afp",
  "unix-flock", "unix-Ïdotfile" and "unix-none".

SQLITE_ENABLE_MEMORY_MANAGEMENT
  This option adds extra logic to SQLite that allows it to release unused
  memory upon request.  This option must be enabled in order for the
  sqlite3_release_memory() interface to work.  If this compile-time
  option is not used, the sqlite3_release_memory() interface is a 
  no-op.

SQLITE_ENABLE_MEMSYS3
  This option includes code in SQLite that implements an alternative
  memory allocator.  This alternative memory allocator is only engaged
  when the SQLITE_CONFIG_HEAP option to sqlite3_config() is used to
  supply a large chunk of memory from which all memory allocations are
  taken.
  The MEMSYS3 memory allocator uses a hybrid allocation algorithm 
  patterned after dlmalloc().   Only one of SQLITE_ENABLE_MEMSYS3 and 
  SQLITE_ENABLE_MEMSYS5 may be enabled at once.

SQLITE_ENABLE_MEMSYS5
  This option includes code in SQLite that implements an alternative
  memory allocator.  This alternative memory allocator is only engaged
  when the SQLITE_CONFIG_HEAP option to sqlite3_config() is used to
  supply a large chunk of memory from which all memory allocations are
  taken.
  The MEMSYS5 module rounds all allocations up to the next power
  of two and uses a first-fit, buddy-allocator algorithm
  that provides strong guarantees against fragmentation and breakdown
  subject to certain operating constraints.

SQLITE_ENABLE_NORMALIZE
  This option includes the sqlite3_normalized_sql() API.

SQLITE_ENABLE_NULL_TRIM
  This option enables an optimization that omits NULL columns at
  the ends of rows, for a space savings on disk.
  
  Databases generated with this option enabled are not readable
  by SQLite version 3.1.6 (2005-03-17) and earlier.  Also,
  databases generated with this option enabled are prone to
  triggering the
  e6e962d6b0f06f46
  bug in the sqlite3_blob_reopen() interface.  For those reasons,
  this optimization is disabled by default.  However, this optimization
  may be enabled by default in a future release of SQLite.

SQLITE_ENABLE_OFFSET_SQL_FUNC
  This option enables support for the sqlite_offset(X) SQL function.
  
  The sqlite_offset(X) SQL function requires a new interface on the
  B-tree storage engine, a new opcode in the virtual machine that
  runs SQL statements, and a new conditional in a critical path of the
  code generator.  To avoid that overhead in applications that do not
  need the utility of sqlite_offset(X), the function is disabled by
  default.

SQLITE_ENABLE_PREUPDATE_HOOK
  This option enables 
  several new APIs that provide callbacks
  prior to any change to a rowid table.  The callbacks can be used
  to record the state of the row before the change occurs.
  The action of the preupdate hook is similar to the
  update hook except that the callback is
  invoked before the change, not afterwards, and the preupdate
  hook interfaces are omitted unless this compile-time option is
  used.
  The preupdate hook interfaces were originally added to
  support the session extension.

SQLITE_ENABLE_QPSG
  This option causes the query planner stability guarantee (QPSG) to
  be on by default.  Normally the QPSG is off and must be activated
  at run-time using the SQLITE_DBCONFIG_ENABLE_QPSG option to the
  sqlite3_db_config() interface.

SQLITE_ENABLE_RBU
  Enable the code the implements the RBU extension.

SQLITE_ENABLE_RTREE
  This option causes SQLite to include support for the
  R*Tree index extension.

SQLITE_ENABLE_SESSION
  This option enables the session extension.

SQLITE_ENABLE_SNAPSHOT
  This option enables the code to support the sqlite3_snapshot object
  and its related interfaces:
  
   sqlite3_snapshot_get() (constructor)
   sqlite3_snapshot_free() (destructor)
   sqlite3_snapshot_open()
   sqlite3_snapshot_cmp()
   sqlite3_snapshot_recover()
  

SQLITE_ENABLE_SORTER_REFERENCES
  This option activates an optimization that reduces the memory required
  by the sorter at the cost of doing additional B-tree lookups after
  the sort has occurred.
  
  The default sorting procedure is to gather all information that willÐ
  ultimately be output into a "record" and pass that complete record
  to the sorter.  But in some cases, for example if some of the output
  columns consists of large BLOB values, the size of the each record
  can be large, which means that the sorter has to either use more memory,
  and/or write more content to temporary storage.
  
  When SQLITE_ENABLE_SORTER_REFERENCES is enabled, the records passed to
  the sorter often contain only a ROWID value.  Such records are much
  smaller.  This means the sorter has much less "payload" to deal with and
  can run faster.  After sorting has occurred, the ROWID is used to look up 
  the output column values in the original table.  That requires another
  search into the table, and could potentially result in a slowdown.  Or,
  it might be a performance win, depending on how large the values are.
  
  Even when the SQLITE_ENABLE_SORTER_REFERENCES compile-time option is on,
  sorter references are still disabled by default.  To use sorter references,
  the application must set a sorter reference size threshold using the
  sqlite3_config(SQLITE_CONFIG_SORTERREF_SIZE) interface at start-time.
  
  Because the SQLite developers do not know whether the 
  SQLITE_ENABLE_SORTER_REFERENCES option will help or hurt performance,
  it is disabled by default at this time (2018-05-04).  It might be enabled
  by default in some future release, depending on what is learned about its
  impact on performance.

SQLITE_ENABLE_STMT_SCANSTATUS
  This option enables the sqlite3_stmt_scanstatus() interface.  The
  sqlite3_stmt_scanstatus() interface is normally omitted from the build
  because it imposes a small performance penalty, even on statements that
  do not use the feature.

SQLITE_ENABLE_STMTVTAB
  This compile-time option enables the SQLITE_STMT virtual table logic.

SQLITE_RTREE_INT_ONLY
  This compile-time option is deprecated and untested.

SQLITE_ENABLE_SQLLOG
  This option enables extra code (especially the SQLITE_CONFIG_SQLLOG
  option to sqlite3_config()) that can be used to create logs of all
  SQLite processing performed by an application.  These logs can be useful
  in doing off-line analysis of the behavior of an application, and especially
  for performance analysis.  In order for the SQLITE_ENABLE_SQLLOG option to 
  be useful, some extra code is required.  The 
  "test_sqllog.c"
  source code
  file in the SQLite source tree is a working example of the required extra
  code.  On unix and windows systems, a developer can append the text of the
  "test_sqllog.c" source code file to the end of an "sqlite3.c" amalgamation,
  recompile the application using the -DSQLITE_ENABLE_SQLLOG option, then 
  control logging using environment variables.  See the header comment on 
  the "test_sqllog.c" source file for additional detail.  

SQLITE_ENABLE_STAT2
  This option used to cause the ANALYZE command to collect
  index histogram data in the sqlite_stat2 table.  But that
  functionality was superceded by SQLITE_ENABLE_STAT3 as of
  SQLite version 3.7.9 (2011-11-01).  
  The SQLITE_ENABLE_STAT2 compile-time option
  is now a no-op.

SQLITE_ENABLE_STAT3
  This option used to cause the ANALYZE command to collect
  index histogram data in the sqlite_stat3 table.  But that
  functionality was superceded by SQLITE_ENABLE_STAT4 as of
  SQLite version 3.8.1 (2013-10-17).  
  The SQLITE_ENABLE_STAT3 compile-time option
  continued to be supported through version 3.29.0 (2019-07-10)
  but has now become a no-op.
  

SQLITE_ENABLE_STAT4
  This option adds additional logic to the ANALYZE command and to
  the query planner that can help SQLite to chose a better query plan
  under certain situations.  The ANALYZE command is enhanced to collect
  histogram data from all columns of every index and store that data
  in the sqlite_stat4 table.  The query planner will then use the
  histogram data to help it make better index choices.  The downside of
  this compile-time option is that it violates the
  query planner stability guarantee making it more difficult to ensure
  consistent performance in mass-produced applications.
  
  SQLITE_ENABLE_STAT4 is an enhancement of SQLITE_ENABLE_STAT3.  STAT3
  only recorded histogram data for the left-most column of each index
  whereas the STAT4 enhancement records histogram data from all columns
  of each index.
  The SQLITE_ENABLE_STAT3 compile-time option has become a no-op.

SQLITE_ENABLE_TREE_EXPLAIN
  This compile-time option is no longer used.

SQLITE_ENABLE_UPDATE_DELETE_LIMIT
  This option enables an optional ORDER BY and LIMIT clause on 
  UPDATE and DELETE statements.

  If this option is defined, then it must also be 
  defined when using the Lemon parser generator tool to generate a parse.c
  file. Because of this, this option may only be used when the library is built
  from source, not from the amalgamation or from the collection of
  pre-packaged C files provided for non-Unix like platforms on the website.
  

SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
  When the SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION compile-time option is
  activated, SQLite will suppress "unknown function" errors when running
  an EXPLAIN or EXPLAIN QUERY PLAN.  Instead of throwing an error,
  SQLite will insert a substitute no-op function named "unknown()".
  The substitution of "unknown()" in place of unrecognized functions
  only occurs on EXPLAIN and EXPLAIN QUERY PLAN, not on ordinary
  statements.
  
  When used in the command-line shell, the
  SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION feature allows SQL text that contains
  application-defined functions to be pasted into the shell for 
  analysis and debugging without having to create and load an
  extension that implements the application-defined functions.

SQLITE_ENABLE_UNLOCK_NOTIFY
  This option enables the sqlite3_unlock_notify() interface and
  its associated functionality.  See the documentation titled
  Using the SQLite Unlock Notification Feature for additional
  information.

SQLITE_INTROSPECTION_PRAGMAS
  This option is obsolete.  It used to enable some extra
  some extra PRAGMA statements such as
  PRAGMA function_list, PRAGMA module_list, and
  PRAGMA pragma_list, but those pragmas are now all
  enabled by default.  See SQLITE_OMIT_INTROSPECTION_PRAGMAS.

SQLITE_SOUNDEX
  This option enables the soundex() SQL function.

SQLITE_USE_ALLOCA
  If this option is enabled, then the alloca() memory allocator will be
  used in a few situations where it is appropriate.  This results in a slightly
  smaller and faster binary.  The SQLITE_USE_ALLOCA compile-time only
  works, of course, on systems that support alloca().

SQLITE_USE_FCNTL_TRACE
  This option causes SQLite to issue extra SQLITE_FCNTL_TRACE file controls
  to provide supplementary information to the VFS.  The "vfslog.c" extension
  makes use of this to provide enhanced logs of VFS activity.

SQLITE_HAVE_ZLIB
  This option causes some extensions to link against the 
  zlib compression library.
  
  This option has no effect on the SQLite core.  It is only used by extensions.
  This is option is necessary for the compression and decompression
  functions that are part of SQL Archive support in the
  command-line shell.
  
  When compiling with this option, it will normally
  be necessary to add a linker option to include the zlib library in the
  build.  Normal this option is "-lz" but might be different on different
  systems.
  
  When building with MSVC on Windows systems, one can put the zlib source
  code in the compat/zlib subdirectory of the source tree and then add
  the USE_ZLIB=1 option to the nmake command to cause the The Makefile.msc
  to automatically build and use an appropriate zlib library implementation.

YYTRACKMAXSTACKDEPTH
  This option causes the LALR(1) parser stack depth to be tracked
  and reported using the sqlite3_status(SQLITE_STATUS_PARSER_STACK,...)
  interface.  SQLite's LALR(1) parser has a fixed stack depth
  (determined at compile-time using the YYSTACKDEPTH options).
  This option can be used to help determine if an application is
  getting close to exceeding the maximum LALR(1) stack depth.compile.html#_options_to_enable_features_normally_turned_off
CJCŠûx
5q‘yCompile-time Options8.  Options To Disable Features Normally Turned OnSQLITE_DISABLE_LFS
  If this C-preprocessor macro is defined, large file support
  is disabled.

SQLITE_DISABLE_DIRSYNC
  If this C-preprocessor macro is defined, directory syncs
  are disabled.  SQLite typically attempts to sync the parent
  directory when a file is deleted to ensure the directory
  entries are updated immediately on disk.

SQLITE_DISABLE_FTS3_UNICODE
  If this C-preprocessor macro is defined, the unicode61 tokenizer
  in FTS3 is omitted from the build and is unavailable to 
  applications.

SQLITE_DISABLE_FTS4_DEFERRED
  If this C-preprocessor macro disables the "deferred token" optimization
  in FTS4.  The "deferred token" optimization avoids loading massive
  posting lists for terms that are in most documents of the collection
  and instead simply scans for those tokens in the document source.  FTS4
  should get exactly the same answer both with and without this optimization.

SQLITE_DISABLE_INTRINSIC
  This option disables the use of compiler-specific built-in functions
  such as __builtin_bswap32() and __builtin_add_overflow() in GCC and Clang, 
  or _byteswap_ulong() and _ReadWriteBarrier() with MSVC.compile.html#_options_to_disable_features_normally_turned_on¯ûw5q‚Ü#Compile-time Options7.  Options To Enable Features Normally Turned OffSQLITE_ALLOW_URI_AUTHORITY
  URI filenames normally throws an error if the authority section is
  not either empty or "localhost".  However, if SQLite is compiled with
  the SQLITE_ALLOW_URI_AUTHORITY compile-time option, then the URI is
  converted into a Uniform Naming Convention (UNC) filename and passed
  down to the underlying operating system that way.  
  
  Some future versions of SQLite may change to enable this feature
  by default.

SQLITE_ALLOW_COVERING_INDEX_SCAN=&lt;0 or 1&gt;
  This C-preprocess macro determines the default setting of the
  SQLITE_CONFIG_COVERING_INDEX_SCAN configuration setting.  It defaults
  to 1 (on) which means that covering indices are used for full table
  scans where possible, in order to reduce I/O and improve performance.
  However, the use of a covering index for a full scan will cause results
  to appear in a different order from legacy, which could cause some
  (incorrectly-coded) legacy applications to break.  Hence, the covering
  index scan option can be disabled at compile-time on systems that what
  to minimize their risk of exposing errors in legacy applications.

SQLITE_ENABLE_8_3_NAMES=&lt;1 or 2&gt;
  If this C-preprocessor macro is defined, then extra code is
  included that allows SQLite to function on a filesystem that
  only support 8+3 filenames.  If the value of this macro is 1,
  then the default behavior is to continue to use long filenames and
  to only use 8+3 filenames if the 
  database connection is opened using URI filenames with
  the "8_3_names=1" query parameter.  If the value of
  this macro is 2, then the use of 8+3 filenames becomes the default
  but may be disabled on using the 8_3_names=0 query parameter.

SQLITE_ENABLE_API_ARMOR
  When defined, this C-preprocessor macro activates extra code that
  attempts to detect misuse of the SQLite API, such as passing in NULL
  pointersÌÓrrent release might cause code
to be excluded in the next release.  Also, not all SQLITE_OMIT_* options
are tested.  Some SQLITE_OMIT_* options might cause SQLite to malfunction
and/or provide incorrect answers.


Important Note:
The SQLITE_OMIT_* compile-time options are mostly unsupported.


The following are the available OMIT options:


SQLITE_OMIT_ALTERTABLE
  When this option is defined, the 
  ALTER TABLE command is not included in the 
  library. Executing an ALTER TABLE statement causes a parse error.

SQLITE_OMIT_ANALYZE
  When this option is defined, the ANALYZE command is omitted from
  the build.

SQLITE_OMIT_ATTACH
  When this option is defined, the ATTACH and DETACH commands are
  omitted from the build.

SQLITE_OMIT_AUTHORIZATION
  Defining this option omits the authorization callback feature from the
  library. The sqlite3_set_authorizer() API function is not present
  in the library.

SQLITE_OMIT_AUTOINCREMENT
  This option is omits the AUTOINCREMENT feature. 
  When this is macro is defined, columns declared as 
  "INTEGER PRIMARY KEY AUTOINCREMENT"
  behave in the same way as columns declared as "INTEGER PRIMARY KEY" when a 
  NULL is inserted. The sqlite_sequence system table is neither created, nor
  respected if it already exists.

SQLITE_OMIT_AUTOINIT
  For backwards compatibility with older versions of SQLite that lack
  the sqlite3_initialize() interface, the sqlite3_initialize() interface
  is called automatically upon entry to certain key interfaces such as
  sqlite3_open(), sqlite3_vfs_register(), and sqlite3_mprintf().
  The overhead of invoking sqlite3_initialize() automatically in this
  way may be omitted by building SQLite with the SQLITE_OMIT_AUTOINIT
  C-preprocessor macro.  When built using SQLITE_OMIT_AUTOINIT, SQLite
  will not automatically initialize itself and the application is required
  to invoke sqlite3_initialize() directly prior to beginning use of the
  SQLite library.

SQLITE_OMIT_AUTOMATIC_INDEX
  This option is used to omit the 
  automatic indexing functionality.
  See also: SQLITE_DEFAULT_AUTOMATIC_INDEX.

SQLITE_OMIT_AUTORESET
  By default, the sqlite3_step() interface will automatically invoke
  sqlite3_reset() to reset the prepared statement if necessary.  This
  compile-time option changes that behavior so that sqlite3_step() will
  return SQLITE_MISUSE if it called again after returning anything other
  than SQLITE_ROW, SQLITE_BUSY, or SQLITE_LOCKED unless there was an
  intervening call to sqlite3_reset().

  In SQLite version 3.6.23.1 (2010-03-26)
  and earlier, sqlite3_step() used to always
  return SQLITE_MISUSE if it was invoked again after returning anything
  other than SQLITE_ROW without an intervening call to sqlite3_reset().
  This caused problems on some poorly written smartphone applications which
  did not correctly handle the SQLITE_LOCKED and SQLITE_BUSY error 
  returns.  Rather than fix the many defective smartphone applications, 
  the behavior of SQLite was changed in 3.6.23.2 to automatically reset
  the prepared statement.  But that changed caused issues in other 
  improperly implemented applications that were actually looking
  for an SQLITE_MISUSE return to terminate their query loops.  (Anytime
  an application gets an SQLITE_MISUSE error code from SQLite, that means the
  application is misusing the SQLite interface and is thus incorrectly
  implemented.)  The SQLITE_OMIT_AUTORESET interface was added to SQLite
  version 3.7.5 (2011-02-01) in an effort to get all of the (broken)
  applications to work again without having to actually fix the applications.

SQLITE_OMIT_AUTOVACUUM
  If this option is defined, the library cannot create or write to 
  databases that support auto_vacuum.
  Executing a PRAGMA auto_vacuum statement is not an error
  (since unknown PRAGMAs are silently ignored), but does not return a value
  or modify the auto-vacuum flag in the database file. If a database that
  supports auto-vacuum is opened by a library compiled with this option, it
  is automatically opened in read-only mode.

SQLITE_OMIT_BETWEEN_OPTIMIÔZATION
  This option disables the use of indices with WHERE clause terms
  that employ the BETWEEN operator.

SQLITE_OMIT_BLOB_LITERAL
  When this option is defined, it is not possible to specify a blob in
  an SQL statement using the X'ABCD' syntax.

SQLITE_OMIT_BTREECOUNT
  This option is no longer used for anything.  It is a no-op.

SQLITE_OMIT_BUILTIN_TEST
  This compile-time option has been renamed to SQLITE_UNTESTABLE.

SQLITE_OMIT_CASE_SENSITIVE_LIKE_PRAGMA
  This compile-time option disables the PRAGMA case_sensitive_like
  command.

SQLITE_OMIT_CAST
  This option causes SQLite to omit support for the CAST operator.

SQLITE_OMIT_CHECK
  This option causes SQLite to omit support for CHECK constraints.
  The parser will still accept CHECK constraints in SQL statements,
  they will just not be enforced.

SQLITE_OMIT_COMPILEOPTION_DIAGS
  This option is used to omit the compile-time option diagnostics available
  in SQLite, including the sqlite3_compileoption_used() and
  sqlite3_compileoption_get() C/C++ functions, the
  sqlite_compileoption_used() and sqlite_compileoption_get() SQL functions,
  and the compile_options pragma.

SQLITE_OMIT_COMPLETE
  This option causes the sqlite3_complete() and sqlite3_complete16()
  interfaces to be omitted.

SQLITE_OMIT_COMPOUND_SELECT
  This option is used to omit the compound SELECT functionality. 
  SELECT statements that use the 
  UNION, UNION ALL, INTERSECT or EXCEPT compound SELECT operators will 
  cause a parse error.

  An INSERT statement with multiple values in the VALUES clause is
  implemented internally as a compound SELECT.  Hence, this option also
  disables the ability to insert more than a single row using an
  INSERT INTO ... VALUES ... statement.

SQLITE_OMIT_CTE
  This option causes support for common table expressions to be omitted.

SQLITE_OMIT_DATETIME_FUNCS
  If this option is defined, SQLite's built-in date and time manipulation
  functions are omitted. Specifically, the SQL functions julianday(), date(),
  time(), datetime() and strftime() are not available. The default column
  values CURRENT_TIME, CURRENT_DATE and CURRENT_TIMESTAMP are still available.

SQLITE_OMIT_DECLTYPE
  This option causes SQLite to omit support for the
  sqlite3_column_decltype() and sqlite3_column_decltype16()
  interfaces.

SQLITE_OMIT_DEPRECATED
  This option causes SQLite to omit support for interfaces
  marked as deprecated.  This includes 
  sqlite3_aggregate_count(),
  sqlite3_expired(),
  sqlite3_transfer_bindings(),
  sqlite3_global_recover(),
  sqlite3_thread_cleanup() and
  sqlite3_memory_alarm() interfaces and
  PRAGMA statements PRAGMA count_changes,
  PRAGMA data_store_directory,
  PRAGMA default_cache_size,
  PRAGMA empty_result_callbacks,
  PRAGMA full_column_names,
  PRAGMA short_column_names, and
  PRAGMA temp_store_directory.

SQLITE_OMIT_DESERIALIZE
  This option causes the
  sqlite3_serialize() and sqlite3_deserialize()
  interfaces to be omitted from the build.

SQLITE_OMIT_DISKIO
  This option omits all support for writing to the disk and forces
  databases to exist in memory only.  This option has not been 
  maintained and probably does not work with newer versions of SQLite.

SQLITE_OMIT_EXPLAIN
  Defining this option causes the EXPLAIN command to be omitted from the
  library. Attempting to execute an EXPLAIN statement will cause a parse
  error.

SQLITE_OMIT_FLAG_PRAGMAS
  This option omits support for a subset of PRAGMA commands that
  query and set boolean properties.

SQLITE_OMIT_FLOATING_POINT
  This option is used to omit floating-point number support from the SQLite
  library. When specified, specifying a floating point number as a literal 
  (i.e. "1.01") results in a parse error.

  In the future, this option may also disable other floating point 
  functionality, for example the sqlite3_result_double(), 
  sqlite3_bind_double(), sqlite3_value_double() and
  sqlite3_column_double() API functions.
  

SQLITE_OMIT_FOREIGN_KEY
  If this option is defined, then foreign key constraint syntax is
  not recognized.

SQLITE_OMIT_GENERATED_COLUMNS
Õ  If this option is defined, then generated column syntax is
  not recognized.

SQLITE_OMIT_GET_TABLE
  This option causes support for sqlite3_get_table() and
  sqlite3_free_table() to be omitted.

SQLITE_OMIT_HEX_INTEGER
  This option omits support for hexadecimal integer literals.

SQLITE_OMIT_INCRBLOB
  This option causes support for incremental BLOB I/O
  to be omitted.

SQLITE_OMIT_INTEGRITY_CHECK
  This option omits support for the integrity_check pragma.

SQLITE_OMIT_INTROSPECTION_PRAGMAS
  This option omits support for
  PRAGMA function_list, PRAGMA module_list, and
  PRAGMA pragma_list.

SQLITE_OMIT_JSON
  This option omits the JSON SQL functions from the build.

SQLITE_OMIT_LIKE_OPTIMIZATION
  This option disables the ability of SQLite to use indices to help
  resolve LIKE and GLOB operators in a WHERE clause.

SQLITE_OMIT_LOAD_EXTENSION
  This option omits the entire extension loading mechanism from
  SQLite, including sqlite3_enable_load_extension() and
  sqlite3_load_extension() interfaces.

SQLITE_OMIT_LOCALTIME
  This option omits the "localtime" modifier from the date and time
  functions.  This option is sometimes useful when trying to compile
  the date and time functions on a platform that does not support the
  concept of local time.

SQLITE_OMIT_LOOKASIDE
  This option omits the lookaside memory allocator.

SQLITE_OMIT_MEMORYDB
  When this is defined, the library does not respect the special database
  name ":memory:" (normally used to create an in-memory database). If 
  ":memory:" is passed to sqlite3_open(), sqlite3_open16(), or
  sqlite3_open_v2(), a file with this name will be 
  opened or created.

SQLITE_OMIT_OR_OPTIMIZATION
  This option disables the ability of SQLite to use an index together
  with terms of a WHERE clause connected by the OR operator.

SQLITE_OMIT_PAGER_PRAGMAS
  Defining this option omits pragmas related to the pager subsystem from 
  the build.

SQLITE_OMIT_PRAGMA
  This option is used to omit the PRAGMA command
  from the library. Note that it is useful to define the macros that omit
  specific pragmas in addition to this, as they may also remove supporting code
  in other sub-systems. This macro removes the PRAGMA command only.

SQLITE_OMIT_PROGRESS_CALLBACK
  This option may be defined to omit the capability to issue "progress" 
  callbacks during long-running SQL statements. The 
  sqlite3_progress_handler()
  API function is not present in the library.

SQLITE_OMIT_QUICKBALANCE
  This option omits an alternative, faster B-Tree balancing routine.
  Using this option makes SQLite slightly smaller at the expense of
  making it run slightly slower.

SQLITE_OMIT_REINDEX
  When this option is defined, the REINDEX
  command is not included in the library.
  Executing a REINDEX statement causes 
  a parse error.

SQLITE_OMIT_SCHEMA_PRAGMAS
  Defining this option omits pragmas for querying the database schema from 
  the build.

SQLITE_OMIT_SCHEMA_VERSION_PRAGMAS
  Defining this option omits pragmas for querying and modifying the 
  database schema version and user version from the build. Specifically, the 
  schema_version and user_version PRAGMAs are omitted.

SQLITE_OMIT_SHARED_CACHE
  This option builds SQLite without support for shared cache mode.
  The sqlite3_enable_shared_cache() is omitted along with a fair
  amount of logic within the B-Tree subsystem associated with shared
  cache management.

  This compile-time option is recommended most applications as it
  results in improved performance and reduced library footprint.

SQLITE_OMIT_SUBQUERY
  If defined, support for sub-selects and the IN() operator are omitted.

SQLITE_OMIT_TCL_VARIABLE
  If this macro is defined, then the special "$" syntax
  used to automatically bind SQL variables to TCL variables is omitted.

SQLITE_OMIT_TEMPDB
  This option omits support for TEMP or TEMPORARY tables.

SQLITE_OMIT_TRACE
  This option omits support for the sqlite3_profile() and
  sqlite3_trace() interfaces and their associated logic.

SQLITE_OMIT_TRIGGER
  Defining this option omits support for TRIGGER objects. Neither the 
  CREATE TRIGGER or DROP TRIGGER
  commands are available in this case, and attempting to execute
  either will result in a parse error.
  This option also disables enforcement of foreign key constraints,
  since the code that implements triggers and which is omitted by this
  option is also used to implement foreign key actions.

SQLITE_OMIT_TRUNCATE_OPTIMIZATION
  A default build of SQLite, if a DELETE statement has no WHERE clause
  and operates on a table with no triggers, an optimization occurs that
  causes the DELETE to occur by dropping and recreating the table.  
  Dropping and recreating a table is usually much faster than deleting
  the table content row by row.  This is the "truncate optimization".

SQLITE_OMIT_UTF16
  This macro is used to omit support for UTF16 text encoding. When this is
  defined all API functions that return or accept UTF16 encoded text are
  unavailable. These functions can be identified by the fact that they end
  with '16', for example sqlite3_prepare16(), sqlite3_column_text16() and
  sqlite3_bind_text16().

SQLITE_OMIT_VACUUM
  When this option is defined, the VACUUM
  command is not included in the library.
  Executing a VACUUM statement causes 
  a parse error.

SQLITE_OMIT_VIEW
  Defining this option omits support for VIEW objects. Neither the 
  CREATE VIEW nor the DROP VIEW
  commands are available in this case, and
  attempting to execute either will result in a parse error.

  WARNING: If this macro is defined, it will not be possible to open a database
  for which the schema contains VIEW objects. 

SQLITE_OMIT_VIRTUALTABLE
  This option omits support for the Virtual Table
  mechanism in SQLite.

SQLITE_OMIT_WAL
  This option omits the "write-ahead log" (a.k.a. "WAL") capability.

SQLITE_OMIT_WINDOWFUNC
  This option omits window functions from the build.

SQLITE_OMIT_WSD
  This option builds a version of the SQLite library that contains no
  Writable Static Data (WSD).  WSD is global variables and/or static
  variables.  Some platforms do not support WSD, and this option is necessary
  in order for SQLite to work those platforms.  

  Unlike other OMIT options which make the SQLite library smaller,
  this option actually increases the size of SQLite and makes it run
  a little slower.  Only use this option if SQLite is being built for an
  embedded target that does not support WSD.

SQLITE_OMIT_XFER_OPT
  This option omits support for optimizations that help statements
  of the form "INSERT INTO ... SELECT ..." run faster.

SQLITE_UNTESTABLE
  A standard SQLite build includes a small amount of logic associated
  with sqlite3_test_control() to exercise
  parts of the SQLite core that are otherwise difficult to validate.
  This compile-time option omits that extra testing logic.  This
  compile-time option was called "SQLITE_OMIT_BUILTIN_TEST" prior
  to SQLite version 3.16.0 (2017-01-02).  The name was changed
  to better describe the implications of using it.
  
  Setting this compile-time option prevents SQLite from being fully
  testable.  Branch test coverage drops from 100% down to about 95%.
  
  SQLite developers follow the NASA principle of
  "fly what you test and test what you fly".  This principle is violated
  if this option is enabled for delivery but disabled for testing.
  But if this option is enabled during testing, not all branches are 
  reachable.  Therefore, the use of this compile-time option is discouraged.

SQLITE_ZERO_MALLOC
  This option omits both the default memory allocator and the
  debugging memory allocator from the build and substitutes a stub
  memory allocator that always fails.  SQLite will not run with this
  stub memory allocator since it will be unable to allocate memory.  But
  this stub can be replaced at start-time using
  sqlite3_config(SQLITE_CONFIG_MALLOC,...) or
  sqlite3_config(SQLITE_CONFIG_HEAP,...).
  So the net effect of this compile-time option is that it allows SQLite
  to be compiled and linked against a system library that does not support
  malloc(), free(), and/or realloc().compile.html#_options_to_omit_features
u_u‰eûz   5S‘eCompile-time Options10.  Analysis and Debugging OptionsSQLITE_DEBUG
  The SQLite source code contains literally thousands of assert() statements
  used to verify internal assumptions and subroutine preconditions and
  postconditions.  These assert() statements are normally turned off
  (they generate no code) since turning them on makes SQLite run approximately
  three times slower.  But for testing and analysis, it is useful to turn
  the assert() statements on.  The SQLITE_DEBUG compile-time option does this.
  SQLITE_DEBUG also enables some other debugging features, such as
  special PRAGMA statements that turn on tracing and listing features
  used for troubleshooting and analysis of the VDBE and code generator.

SQLITE_MEMDEBUG
  The SQLITE_MEMDEBUG option causes an instrumented 
  debugging memory allocator
  to be used as the default memory allocator within SQLite.  The
  instrumented memory allocator checks for misuse of dynamically allocated
  memory.  Examples of misuse include using memory after it is freed,
  writing off the ends of a memory allocation, freeing memory not previously
  obtained from the memory allocator, or failing to initialize newly
  allocated memory.compile.html#_analysis_and_debugging_options“ûy
5E‚¤[YCompile-time Options9.  Options To Omit FeaturesThe following options can be used to 
reduce the size of the compiled library
by omitting unused features. This is probably only useful
in embedded systems where space is especially tight, as even with all
features included the SQLite library is relatively small. Don't forget
to tell your compiler to optimize for binary size! (the -Os option if
using GCC).  Telling your compiler to optimize for size usually has
a much larger impact on library footprint than employing any of these
compile-time options.  You should also verify that 
debugging options are disabled.

The macros in this section do not require values. The following 
compilation switches all have the same effect:
-DSQLITE_OMIT_ALTERTABLE
-DSQLITE_OMIT_ALTERTABLE=1
-DSQLITE_OMIT_ALTERTABLE=0


If any of these options are defined, then the same set of SQLITE_OMIT_*
options must also be defined when using the Lemon parser generator
tool to generate the
parse.c file and when compiling the 'mkkeywordhash' tool which generates 
the keywordhash.h file.
Because of this, these options may only be used when the library is built
from canonical source, not from the amalgamation.
Some SQLITE_OMIT_* options might work, or appear to work, when used with
the amalgamation.  But this is not guaranteed.  In general, always compile
from canonical sources in order to take advantage of SQLITE_OMIT_* options.



Important Note: The SQLITE_OMIT_* options may not work with the
amalgamation.  SQLITE_OMIT_* compile-time
options usually work correctly only when SQLite is built from canonical 
source files.




Special versions of the SQLite amalgamation that do work with a
predetermined set of SQLITE_OMIT_* options can be generated.  To do so,
make a copy of the Makefile.linux-gcc makefile template in the canonical
source code distribution.  Change the name of your copy to simply "Makefile".
Then edit "Makefile" to set up appropriate compile-time options.  Then
type:
make clean; make sqlite3.c

The resulting "sqlite3.c" amalgamation code file (and its associated
header file "sqlite3.h") can then be moved to a non-unix platform
for final compilation using a native compiler.

The SQLITE_OMIT_* options are unsupported.  By this we mean that
an SQLITE_OMIT_* option that omits code from the build in the current
release might become a no-op in the next release.  Or the other way around:
an SQLITE_OMIT_* that is a no-op in the cuÒ
ìDìšSû|
5s³Compile-time Options12. Compiler Linkage and Calling Convention ControlThe following macros specify interface details
for certain kinds of SQLite builds.  The Makefiles will normally
handle setting these macros automatically.  Application developers should
not need to worry with these macros.  The following documentation about these 
macros is included for completeness.


SQLITE_API
  This macro identifies an externally visible interface for SQLite.
  This macro is sometimes set to "extern".  But the definition is
  compiler-specific.

SQLITE_APICALL
  This macro identifies the calling convention used by public interface
  routines in SQLite which accept a fixed number of arguments.
  This macro is normally defined to be nothing,
  though on Windows builds it can sometimes be set to "__cdecl" or "__stdcall".
  The "__cdecl" setting is the default, but "__stdcall" is used when SQLite
  is intended to be compiled as a Windows system library.
  
  A single function declaration should contain no more than one of
  the following:  SQLITE_APICALL, SQLITE_CDECL, or SQLITE_SYSAPI.

SQLITE_CALLBACK
  This macro specifies the calling convention used with callback pointers
  in SQLite.  This macro is normally defined to be nothing, though on Windows
  builds it can sometimes be set to "__cdecl" or "__stdcall".  The
  "__cdecl" setting is the default, but "__stdcall" is used when SQLite
  is intended to be compiled as a Windows system library.

SQLITE_CDECL
  This macro specifies the calling convention used by varargs interface
  routines in SQLite.  This macro is normally defined to be nothing,
  though on Windows builds it can sometimes be set to "__cdecl".  This
  macro is used on varargs routines and so cannot be set to "__stdcall"
  since the __stdcall calling convention does not support varargs functions.
  
  A single function declaration should contain no more than one of
  the following:  SQLITE_APICALL, SQLITE_CDECL, or SQLITE_SYSAPI.

SQLITE_EXTERN
  This macro specifies linkage for public interface variables in SQLite.
  It should normally be allowed to default to "extern".

SQLITE_STDCALL
  This macro is no longer used and is now deprecated.

SQLITE_SYSAPI
  This macro identifies the calling convention used by operating system
  interfaces for the target platform for an SQLite build.
  This macro is normally defined to be nothing,
  though on Windows builds it can sometimes be set to "__stdcall".
  
  A single function declaration should contain no more than one of
  the following:  SQLITE_APICALL, SQLITE_CDECL, or SQLITE_SYSAPI.

SQLITE_TCLAPI
  This macro specifies the calling convention used by the 
  TCL library interface routines.
  This macro is not used by the SQLite core, but only by the TCL Interface
  and TCL test suite.
  This macro is normally defined to be nothing,
  though on Windows builds it can sometimes be set to "__cdecl".  This
  macro is used on TCL library interface routines which are always compiled
  as __cdecl, even on platforms that prefer to use __stdcall, so this
  macro should not be set to __stdcall unless the platform has a custom
  TCL library build that supports __stdcall.
  
  This macro may not be used in combination with any of SQLITE_APICALL,
  SQLITE_CALLBACK, SQLITE_CDECL or SQLITE_SYSAPI.

This page last modified on  2022-11-07 14:28:05 UTCcompile.html#compiler_linkage_and_calling_convention_controlƒ7û{    5G…;YCompile-time Options11.  Windows-Specific OptionsSQLITE_WIN32_HEAP_CREATE
  This option forces the Win32 native memory allocator, when enabled, to
  create a private heap to hold all memory allocations.

SQLITE_WIN32_MALLOC_VALIDATE
  This option forces the Win32 native memory allocator, when enabled, to
  make strategic calls into the HeapValidate() function if assert() is also
  enabled.compile.html#_windows_specific_options
$$ƒr‘‹B 59†OIHow SQLite Is Tested1.1. Executive SummaryFour independently developed test harnesses
 100% branch test coverage in an as-deployed configuration
 Millions and millions of test cases
 Out-of-memory tests
 I/O error tests
 Crash and power loss tests
 Fuzz tests
 Boundary value tests
 Disabled optimization tests
 Regression tests
 Malformed database tests
 Extensive use of assert() and run-time checks
 Valgrind analysis
 Undefined behavior checks
 Checkliststesting.html#executive_summaryƒ`‘‹A  5+†C?How SQLite Is Tested1. IntroductionThe reliability and robustness of SQLite is achieved in part
by thorough and careful testing.

As of version 3.39.0 (2022-06-25),
the SQLite library consists of approximately
151.3 KSLOC of C code.
(KSLOC means thousands of "Source Lines Of Code" or, in other words,
lines of code excluding blank lines and comments.)
By comparison, the project has
608 times as much
test code and test scripts - 
92038.3 KSLOC.testing.html#introduction
áᜑ‹C  5/·/CHow SQLite Is Tested2. Test HarnessesThere are four independent test harnesses used for testing the 
core SQLite library.
Each test harness is designed, maintained, and managed separately
from the others.






The TCL Tests are the original tests for SQLite.  
They are contained in the same source tree as the
SQLite core and like the SQLite core are in the public domain.  The
TCL tests are the primary tests used during development.
The TCL tests are written using the 
TCL scripting language.
The TCL test harness itself consists of 27.7 KSLOC 
of C code used to create the TCL interface.  The test scripts are contained
in 1343 files totaling 
23.5MB in size.  There are
50240 distinct test cases, but many of the test
cases are parameterized and run multiple times (with different parameters)
so that on a full test run millions of
separate tests are performed.




The TH3 test harness is a set of proprietary tests, written in
C that provide 100% branch test coverage 
(and 100% MC/DC test coverage) to
the core SQLite library.  The TH3 tests are designed to run
on embedded and specialized platforms that would not easily support
TCL or other workstation services.  TH3 tests use only the published 
SQLite interfaces. TH3 consists of about
75.7 MB or 1038.0 KSLOC
of C code implementing 49116 distinct test cases.
TH3 tests are heavily parameterized, though, so a full-coverage test runs
about 2.3 million different test
instances.  The cases that provide 100% branch test coverage constitute
a subset of the total TH3 test suite.  A soak test
prior to release does hundreds of millions of tests.
Additional information on TH3 is available separately.




The SQL Logic Test
or SLT test harness is used to run huge numbers
of SQL statements against both SQLite and several other SQL database engines
and verify that they all get the same answers.  SLT currently compares
SQLite against PostgreSQL, MySQL, Microsoft SQL Server, and Oracle 10g.
SLT runs 7.2 million queries comprising
1.12GB of test data.



The dbsqlfuzz engine is a
proprietary fuzz tester.  Other fuzzers for SQLite 
mutate either the SQL inputs or the database file.  Dbsqlfuzz mutates
both the SQL and the database file at the same time, and is thus able
to reach new error states.  Dbsqlfuzz is built using the
libFuzzer framework of LLVM
with a custom mutator.  There are
303 seed files. The dbsqlfuzz fuzzer
runs about one billion test mutations per day.
Dbsqlfuzz helps ensure
that SQLite is robust against attack via malicious SQL or database
inputs.


In addition to the four main test harnesses, there several other
small programs that implement specialized tests.

The "speedtest1.c" program 
estimates the performance of SQLite under a typical workload.  
The "mptester.c" program is a stress test for multiple processes 
concurrently reading and writing a single database.
The "threadtest3.c" program is a stress test for multiple threads using
SQLite simultaneously.  
The "fuzzershell.c" program is used to
run some fuzz tests.



All of the tests above must run successfully, on multiple platforms
and under multiple compile-time configurations,
before each release of SQLite.

Prior to each check-in to the SQLite source tree, developers
typically run a subset (called "veryquick") of the Tcl tests
consisting of about 
300.2 thousand test cases.
The veryquick tests include most tests other than the anomaly, fuzz, and 
soak tests.  The idea behind the veryquick tests are that they are
sufficient to catch most errors, but also run in only a few minutes
instead of a few hours.testing.html#test_harnesses

ÿ:Œ5‘‹F 59—UIHow SQLite Is Tested3.2. I/O Error TestingI/O error testing seeks to verify that SQLite responds sanely
to failed I/O operations.  I/O errors might result from a full disk drive,
malfunctioning disk hardware, network outages when using a network
file system, system configuration or permission changes that occur in the 
middle of an SQL operation, or other hardware or operating system 
malfunctions.  Whatever the cause, it is important that SQLite be able
to respond correctly to these errors and I/O error testing seeks to
verify that it does.

I/O error testing is similar in concept to OOM testing; I/O errors
are simulated and checks are made to verify that SQLite responds
correctly to the simulated errors.  I/O errors are simulated in both
the TCL and TH3 test harnesses by inserting a new
Virtual File System object that is specially rigged
to simulate an I/O error after a set number of I/O operations.
As with OOM error testing, the I/O error simulators can be set to
fail just once, or to fail continuously after the first failure.
Tests are run in a loop, slowly increasing the point of failure until
the test case runs to completion without error.  The loop is run twice,
once with the I/O error simulator set to simulate only a single failure
and a second time with it set to fail all I/O operations after the first
failure.

In I/O error tests, after the I/O error simulation failure mechanism
is disabled, the database is examined using
PRAGMA integrity_check to make sure that the I/O error has not
introduced database corruption.testing.html#i_o_error_testing@‘‹E      5A™[QHow SQLite Is Tested3.1. Out-Of-Memory TestingSQLite, like all SQL database engines, makes extensive use of
malloc()  (See the separate report on
dynamic memory allocation in SQLite for
additional detail.)
On servers and workstations, malloc() never fails in practice and so correct
handling of out-of-memory (OOM) errors is not particularly important.
But on embedded devices, OOM errors are frighteningly common and since
SQLite is frequently used on embedded devices, it is important that
SQLite be able to gracefully handle OOM errors.

OOM testing is accomplished by simulating OOM errors.
SQLite allows an application to substitute an alternative malloc()
implementation using the sqlite3_config(SQLITE_CONFIG_MALLOC,...)
interface.  The TCL and TH3 test harnesses are both capable of
inserting a modified version of malloc() that can be rigged to fail 
after a certain number of allocations.  These instrumented mallocs
can be set to fail only once and then start working again, or to
continue failing after the first failure.  OOM tests are done in a
loop.  On the first iteration of the loop, the instrumented malloc
is rigged to fail on the first allocation.  Then some SQLite operation
is carried out and checks are done to make sure SQLite handled the
OOM error correctly.  Then the time-to-failure counter
on the instrumented malloc is increased by one and the test is
repeated.  The loop continues until the entire operation runs to
completion without ever encountering a simulated OOM failure.
Tests like this are run twice, once with the instrumented malloc
set to fail only once, and again with the instrumented malloc set
to fail continuously after the first failure.testing.html#out_of_memory_testingƒ|‘‹D    51†oEHow SQLite Is Tested3. Anomaly TestingAnomaly tests are tests designed to verify the correct behavior
of SQLite when something goes wrong.  It is (relatively) easy to build
an SQL database engine that behaves correctly on well-formed inputs
on a fully functional computer.  It is more difficult to build a system
that responds sanely to invalid inputs and continues to function following
system malfunctions.  The anomaly tests are designed to verify the latter
behavior.testing.html#anomaly_testing
Ëœb«˃[‘‹J  5'†E7How SQLite Is Tested4.1. SQL FuzzSQL fuzz testing consists of creating syntactically correct yet
wildly nonsensical SQL statements and feeding them to SQLite to see
what it will do with them.  Usually some kind of error is returned
(such as "no such table").  Sometimes, purely by chance, the SQL
statement also happens to be semantically correct.  In that case, the
resulting prepared statement is run to make sure it gives a reasonable
result.testing.html#sql_fuzz2‘‹I       5+g?How SQLite Is Tested4. Fuzz TestingFuzz testing
seeks to establish that SQLite responds correctly to invalid, out-of-range,
or malformed inputs.testing.html#fuzz_testing‚5‘‹H      5CƒASHow SQLite Is Tested3.4. Compound failure testsThe test suites for SQLite also explore the result of stacking
multiple failures.  For example, tests are run to ensure correct behavior
when an I/O error or OOM fault occurs while trying to recover from a
prior crash.testing.html#compound_failure_tests’_‘‹G    51¤9AHow SQLite Is Tested3.3. Crash TestingCrash testing seeks to demonstrate that an SQLite database will not
go corrupt if the application or operating system crashes or if there
is a power failure in the middle of a database update.  A separate
white-paper titled
Atomic Commit in SQLite describes the
defensive measure SQLite takes to prevent database corruption following
a crash.  Crash tests strive to verify that those defensive measures
are working correctly.

It is impractical to do crash testing using real power failures, of
course, and so crash testing is done in simulation.  An alternative
Virtual File System is inserted that allows the test
harness to simulate the state of the database file following a crash.

In the TCL test harness, the crash simulation is done in a separate
process.  The main testing process spawns a child process which runs
some SQLite operation and randomly crashes somewhere in the middle of
a write operation.  A special VFS randomly reorders and corrupts
the unsynchronized
write operations to simulate the effect of buffered filesystems.  After
the child dies, the original test process opens and reads the test
database and verifies that the changes attempted by the child either
completed successfully or else were completely rolled back.  The
integrity_check PRAGMA is used to make sure no database corruption
occurs.

The TH3 test harness needs to run on embedded systems that do not
necessarily have the ability to spawn child processes, so it uses
an in-memory VFS to simulate crashes.  The in-memory VFS can be rigged
to make a snapshot of the entire filesystem after a set number of I/O
operations.  Crash tests run in a loop.  On each iteration of the loop,
the point at which a snapshot is made is advanced until the SQLite
operations being tested run to completion without ever hitting a
snapshot.  Within the loop, after the SQLite operation under test has
completed, the filesystem is reverted to the snapshot and random file
damage is introduced that is characteristic of the kinds of damage
one expects to see following a power loss.  Then the database is opened
and checks are made to ensure that it is well-formed and that the
transaction either ran to completion or was completely rolled back.
The interior of the loop is repeated multiple times for each
snapshot with different random damage each time.testing.html#crash_testing
6
-6r‘‹M      5Cš?OHow SQLite Is Tested4.1.3. The dbsqlfuzz fuzzerBeginning in late 2018, SQLite has been fuzzed using a proprietary
fuzzer called "dbsqlfuzz".  Dbsqlfuzz is built using the 
libFuzzer framework of LLVM.

The dbsqlfuzz fuzzer mutates both the SQL input and the database file
at the same time.  Dbsqlfuzz uses a custom
Structure-Aware Mutator
on a specialized input file that defines both an input database and SQL
text to be run against that database. Because it mutates both the input
database and the input SQL at the same time, dbsqlfuzz has been able to
find some obscure faults in SQLite that were missed by prior fuzzers that
mutated only SQL inputs or only the database file.
The SQLite developers keep dbsqlfuzz running against trunk in about
16 cores at all times.  Each instance of dbsqlfuzz program is able to 
evalutes about 400 test cases per second, meaning that about 500 million
cases are checked every day.

The dbsqlfuzz fuzzer has been very successful at hardening the
SQLite code base against malicious attack.  Since dbsqlfuzz has been
added to the SQLite internal test suite, bug reports from external
fuzzers such as OSSFuzz have all but stopped.

Note that dbsqlfuzz is not the Protobuf-based structure-aware
fuzzer for SQLite that is used by Chromium and described in the
Structure-Aware Mutator article.
There is no connection between these two fuzzers, other than the fact that they
are both based on libFuzzer
The Protobuf fuzzer for SQLite is written and maintained by the Chromium
team at Google, whereas dbsqlfuzz is written and maintained by the original
SQLite developers.  Having multiple independently-developed fuzzers for SQLite
is good, as it means that obscure issues are more likely to be uncovered.testing.html#the_dbsqlfuzz_fuzzer†M‘‹L 59Œ  EHow SQLite Is Tested4.1.2. Google OSS FuzzBeginning in 2016, a team of engineers at Google started the
OSS Fuzz project.  
OSS Fuzz uses a AFL-style guided fuzzer running on Google's infrastructure.
The Fuzzer automatically downloads the latest check-ins for participating
projects, fuzzes them, and sends email to the developers reporting any
problems.  When a fix is checked in, the fuzzer automatically detects this
and emails a confirmation to the developers.

SQLite is one of many open-source projects that OSS Fuzz tests. The
test/ossfuzz.c source file
in the SQLite repository is SQLite's interface to OSS fuzz.

OSS Fuzz no longer finds historical bugs in SQLite.  But it is still
running and does occasionally find issues in new development check-ins.
Examples:
&#91;1&#93;
&#91;2&#93;
&#91;3&#93;.testing.html#google_oss_fuzzŠ|‘‹K   5s“sHow SQLite Is Tested4.1.1. SQL Fuzz Using The American Fuzzy Lop FuzzerThe concept of fuzz testing has been around for decades, but fuzz
testing was not an effective way to find bugs until 2014 when
Michal Zalewski invented the first practical profile-guided fuzzer,
American Fuzzy Lop or "AFL".
Unlike prior fuzzers that blindly generate random inputs, AFL
instruments the program being tested (by modifying the assembly-language
output from the C compiler) and uses that instrumentation to detect when
an input causes the program to do something different - to follow
a new control path or loop a different number of times.  Inputs that provoke
new behavior are retained and further mutated.  In this way, AFL is able
to "discover" new behaviors of the program under test, including behaviors
that were never envisioned by the designers.

AFL proved adept at finding arcane bugs in SQLite.
Most of the findings have been assert() statements where the conditional
was false under obscure circumstances.  But AFL has also found
a fair number of crash bugs in SQLite, and even a few cases where SQLite 
computed incorrect results.

Because of its past success, AFL became a standard part of the testing
strategy for SQLite beginning with version 3.8.10 (2015-05-07) until
it was superseded by better fuzzers in version 3.29.0 (2019-07-10).testing.html#sql_fuzz_using_the_american_fuzzy_lop_fuzzer

ˆça‘‹P5™How SQLite Is Tested4.1.6. Tension Between Fuzz Testing And 100% MC/DC TestingFuzz testing and 100% MC/DC testing are in tension with
one another.
That is to say, code tested to 100% MC/DC will tend to be
more vulnerable to problems found by fuzzing and code that performs
well during fuzz testing will tend to have (much) less than 
100% MC/DC.
This is because MC/DC testing discourages defensive code with
unreachable branches, but without defensive code, a fuzzer is
more likely to find a path that causes problems.  MC/DC testing
seems to work well for building code that is robust during
normal use, whereas fuzz testing is good for building code that is
robust against malicious attack.

Of course, users would prefer code that is both robust in normal
use and resistant to malicious attack.  The SQLite developers are
dedicated to providing that.  The purpose of this section is merely
to point out that doing both at the same time is difficult.

For much of its history SQLite has been focused on 100% MC/DC testing.
Resistance to fuzzing attacks only became a concern with the introduction
of AFL in 2014.  For a while there, fuzzers were finding many problems
in SQLite.  In more recent years, the testing strategy of SQLite has
evolved to place more emphasis on fuzz testing.  We still maintain
100% MC/DC of the core SQLite code, but most testing CPU cycles are 
now devoted to fuzzing.

While fuzz testing and 100% MC/DC testing are in tension, they
are not completely at cross-purposes.  The fact that the SQlite test
suite does test to 100% MC/DC means that when fuzzers do find problems,
those problems can be fixed quickly and with little risk of introducing
new errors.testing.html#tension_between_fuzz_testing_and_100_mc_dc_testing…‘‹O 5Oˆ{[How SQLite Is Tested4.1.5. The fuzzcheck test harnessHistorical test cases from AFL, OSS Fuzz, and dbsqlfuzz are
collected in a set of database files in the main SQLite source tree
and then rerun by the "fuzzcheck" utility program whenever one runs
"make test".  Fuzzcheck only runs a few thousand "interesting" cases
out of the billions of cases that the various fuzzers have
examined over the years.  "Interesting" cases are cases that exhibit
previously unseen behavior.  Actual bugs found by fuzzers are always
included among the interesting test cases, but most of the cases run
by fuzzcheck were never actual bugs.testing.html#the_fuzzcheck_test_harnessŠs‘‹N        5M”-YHow SQLite Is Tested4.1.4. Other third-party fuzzersSQLite seems to be a popular target for third-parties to fuzz.
The developers hear about many attempts to fuzz SQLite
and they do occasionally get bug reports found by independent
fuzzers.  All such reports are promptly fixed, so the product is
improved and that the entire SQLite user community benefits.
This mechanism of having many independent testers is similar to
Linus's law:
"given enough eyeballs, all bugs are shallow".

One fuzzing researcher of particular note is 
Manuel Rigger, currently
(as this paragraph is written on 2019-12-21)
at ETH Zurich.
Most fuzzers only look for assertion faults, crashes, undefined behavior (UB),
or other easily detected anomalies.  Dr. Rigger's fuzzers, on the other hand,
are able to find cases where SQLite computes an incorrect answer.
Rigger has found
many such cases.
Most of these finds are obscure corner cases involving type
conversions and affinity transformations, and a good number of the finds
are against unreleased features.  Nevertheless, his finds are still important
as they are real bugs,
and the SQLite developers are grateful to be able to identify and fix
the underlying problems.  Rigger's work is currently unpublished.  When it
is released, it could be as influential as Zalewski's invention of AFL
and profile-guided fuzzing.testing.html#other_third_party_fuzzers
Ê»     9hÛÊ‚‘‹U   5-ƒAHow SQLite Is Tested7. Test CoverageThe SQLite core, including the unix VFS,
has 100% branch test coverage under TH3 in
its default configuration as measured by
gcov.
Extensions such as FTS3 and RTree are excluded from this
analysis.testing.html#test_coverage‘‹T  5UŒ?iHow SQLite Is Tested6. Automatic Resource Leak DetectionResource leak occurs when system resources
are allocated and never freed.  The most troublesome resource leaks
in many applications are memory leaks - when memory is allocated using
malloc() but never released using free().  But other kinds of resources
can also be leaked:  file descriptors, threads, mutexes, etc.

Both the TCL and TH3 test harnesses automatically track system
resources and report resource leaks on every test run.
No special configuration or setup is required.   The test harnesses
are especially vigilant with regard to memory leaks.  If a change
causes a memory leak, the test harnesses will recognize this
quickly.  SQLite is designed to never leak memory, even after
an exception such as an OOM error or disk I/O error.  The test
harnesses are zealous to enforce this.testing.html#automatic_resource_leak_detectionƒL‘‹S       57†KHow SQLite Is Tested5. Regression TestingWhenever a bug is reported against SQLite, that bug is not considered
fixed until new test cases that would exhibit the bug have been added 
to either the TCL or TH3 test suites.
Over the years,
this has resulted in thousands and thousands of new tests.
These regression tests ensure that bugs that have
been fixed in the past are not reintroduced into future versions of
SQLite.testing.html#regression_testing„}‘‹R     5?ˆYOHow SQLite Is Tested4.3. Boundary Value TestsSQLite defines certain limits on its operation, such as the
maximum number of columns in a table, the maximum length of an 
SQL statement, or the maximum value of an integer.  The TCL and TH3 test
suites both contains numerous tests that push SQLite right to the edge
of its defined limits and verify that it performs correctly for
all allowed values.  Additional tests go beyond the defined limits
and verify that SQLite correctly returns errors.  The source code
contains testcase macros to verify that both sides of each boundary
have been tested.testing.html#boundary_value_testsˆ@‘‹Q 5GOWHow SQLite Is Tested4.2. Malformed Database FilesThere are numerous test cases that verify that SQLite is able to
deal with malformed database files.
These tests first build a well-formed database file, then add
corruption by changing one or more bytes in the file by some means
other than SQLite.  Then SQLite is used to read the database.
In some cases, the bytes changes are in the middle of data.
This causes the content of the database to change while keeping the
database well-formed.
In other cases, unused bytes of the file are modified, which has
no effect on the integrity of the database.
The interesting cases are when bytes of the file that
define database structure get changed.  The malformed database tests
verify that SQLite finds the file format errors and reports them
using the SQLITE_CORRUPT return code without overflowing
buffers, dereferencing NULL pointers, or performing other
unwholesome actions.

The dbsqlfuzz fuzzer also does an excellent job of verifying
that SQLite responds sanely to malformed database files.testing.html#malformed_database_files
èâèu‘‹W       5[škHow SQLite Is Tested7.2. Coverage testing of defensive codeA well-written C program will typically contain some defensive
conditionals which in practice are always true or always false.
This leads to a 
programming dilemma:  Does one remove defensive code in order to obtain
100% branch coverage?

In SQLite, the answer to the previous question is "no".
For testing purposes, the SQLite source code defines
macros called ALWAYS() and NEVER().   The ALWAYS() macro
surrounds conditions
which are expected to always evaluate as true and NEVER() surrounds
conditions that are always evaluated to false.  These macros serve as
comments to indicate that the conditions are defensive code.
In release builds, these macros are pass-throughs:

#define ALWAYS(X)  (X)
#define NEVER(X)   (X)


During most testing, however, these macros will throw an assertion
fault if their argument does not have the expected truth value.  This
alerts the developers quickly to incorrect design assumptions.

#define ALWAYS(X)  ((X)?1:assert(0),0)
#define NEVER(X)   ((X)?assert(0),1:0)


When measuring test coverage, these macros are defined to be constant
truth values so that they do not generate assembly language branch
instructions, and hence do not come into play when calculating the
branch coverage:

#define ALWAYS(X)  (1)
#define NEVER(X)   (0)


The test suite is designed to be run three times, once for each of
the ALWAYS() and NEVER() definitions shown above.  All three test runs
should yield exactly the same result.  There is a run-time test using
the sqlite3_test_control(SQLITE_TESTCTRL_ALWAYS, ...) interface that
can be used to verify that the macros are correctly set to the first
form (the pass-through form) for deployment.testing.html#coverage_testing_of_defensive_codeŽ‘‹V        5WšagHow SQLite Is Tested7.1. Statement versus branch coverageThere are many ways to measure test coverage.  The most popular
metric is "statement coverage".  When you hear someone say that their
program as "XX% test coverage" without further explanation, they usually
mean statement coverage.  Statement coverage measures what percentage
of lines of code are executed at least once by the test suite.

Branch coverage is more rigorous than statement coverage.  Branch
coverage measures the number of machine-code branch instructions that
are evaluated at least once on both directions.

To illustrate the difference between statement coverage and
branch coverage, consider the following hypothetical
line of C code:

if( a>b && c!=25 ){ d++; }


Such a line of C code might generate a dozen separate machine code
instructions.  If any one of those instructions is ever evaluated, then
we say that the statement has been tested.  So, for example, it might
be the case that the conditional expression is
always false and the "d" variable is
never incremented.  Even so, statement coverage counts this line of
code as having been tested.

Branch coverage is more strict.  With branch coverage, each test and
each subblock within the statement is considered separately.  In order
to achieve 100% branch coverage in the example above, there must be at
least three test cases:


 a&lt;=b
 a&gt;b && c==25
 a&gt;b && c!=25


Any one of the above test cases would provide 100% statement coverage
but all three are required for 100% branch coverage.  Generally speaking,
100% branch coverage implies 100% statement coverage, but the converse is
not true.  To reemphasize, the
TH3 test harness for SQLite provides the stronger form of
test coverage - 100% branch test coverage.testing.html#statement_versus_branch_coverage
ã ㊑‹Y       5O’w_How SQLite Is Tested7.4. Branch coverage versus MC/DCTwo methods of measuring test coverage were described above:
"statement" and "branch" coverage.  There are many other test coverage
metrics besides these two.  Another popular metric is "Modified
Condition/Decision Coverage" or MC/DC.  
Wikipedia
defines MC/DC as follows:


 Each decision tries every possible outcome.
 Each condition in a decision takes on every possible outcome.
 Each entry and exit point is invoked.
 Each condition in a decision is shown to independently
     affect the outcome of the decision.


In the C programming language 
where &amp;&amp; and ||
are "short-circuit" operators, MC/DC and branch coverage are very nearly
the same thing.  The primary difference is in boolean vector tests.
One can test for any of several bits in bit-vector and still obtain
100% branch test coverage even though the second element of MC/DC - the
requirement that each condition in a decision take on every possible outcome -
might not be satisfied.

SQLite uses testcase() macros as described in the previous
subsection to make sure that every condition in a bit-vector decision takes
on every possible outcome.  In this way, SQLite also achieves 100% MC/DC
in addition to 100% branch coverage.testing.html#branch_coverage_versus_mc_dcw‘‹X5™)How SQLite Is Tested7.3. Forcing coverage of boundary values and boolean vector testsAnother macro used in conjunction with test coverage measurement is
the testcase() macro.  The argument is a condition for which
we want test cases that evaluate to both true and false.
In non-coverage builds (that is to say, in release builds) the
testcase() macro is a no-op:

#define testcase(X)


But in a coverage measuring build, the testcase() macro
generates code that evaluates the conditional expression in its argument.  
Then during analysis, a check
is made to ensure tests exist that evaluate the conditional to both true
and false.  Testcase() macros are used, for example, to help verify
that boundary values are tested.  For example:

testcase( a==b );
testcase( a==b+1 );
if( a>b && c!=25 ){ d++; }


Testcase macros are also used when two or more cases of a switch
statement go to the same block of code, to make sure that the code was
reached for all cases:

switch( op ){
  case OP_Add:
  case OP_Subtract: {
    testcase( op==OP_Add );
    testcase( op==OP_Subtract );
    /* ... */
    break;
  }
  /* ... */
}


For bitmask tests, testcase() macros are used to verify that every
bit of the bitmask affects the outcome.  For example, in the following block
of code, the condition is true if the mask contains either of two bits
indicating either a MAIN_DB or a TEMP_DB is being opened.  
The testcase()
macros that precede the if statement verify that both cases are tested:

testcase( mask & SQLITE_OPEN_MAIN_DB );
testcase( mask & SQLITE_OPEN_TEMP_DB );
if( (mask & (SQLITE_OPEN_MAIN_DB|SQLITE_OPEN_TEMP_DB))!=0 ){ ... }


The SQLite source code contains 1143
uses of the testcase() macro.testing.html#forcing_coverage_of_boundary_values_and_boolean_vector_tests
     M      M.‘‹Z   5I™'YHow SQLite Is Tested7.5. Measuring branch coverageBranch coverage in SQLite is currently measured
using gcov with the "-b"
option.  First the test program is compiled using options
"-g -fprofile-arcs -ftest-coverage" and then the test program is run.
Then "gcov -b" is run to generate a coverage report.
The coverage report is verbose and inconvenient to read, 
so the gcov-generated report is processed using
some simple scripts to put it into a more human-friendly format.
This entire process is automated using scripts, of course.

Note that running SQLite with gcov is not a test of SQLite &mdash;
it is a test of the test suite.  The gcov run does not test SQLite because
the -fprofile-args and -ftest-coverage options cause the compiler to 
generate different code.  
The gcov run merely verifies that the test suite provides 100% branch test
coverage.  The gcov run is a test of the test - a meta-test.

After gcov has been run to verify 100% branch test coverage,
then the test program is recompiled using delivery compiler options
(without the special -fprofile-arcs and -ftest-coverage options)
and the test program is rerun.
This second run is the actual test of SQLite.

It is important to verify that the gcov test run 
and the second real test run both give the same output.  Any
differences in output indicate either the use of undefined or
indeterminate behavior in the SQLite code (and hence a bug), 
or a bug in the compiler.
Note that SQLite has, over the previous decade, encountered bugs
in each of GCC, Clang, and MSVC.  Compiler bugs, while rare, do happen,
which is why it is so important to test the code in an as-delivered
configuration.testing.html#measuring_branch_coverage
Z‘ƒZ‚$‘‹]     53ƒ;GHow SQLite Is Tested8. Dynamic AnalysisDynamic analysis refers to internal and external checks on the
SQLite code which are performed while the code is live and running.
Dynamic analysis has proven to be a great help in maintaining the
quality of SQLite.testing.html#dynamic_analysisˆ        ‘‹\     5[Ž9kHow SQLite Is Tested7.7. Experience with full test coverageThe developers of SQLite have found that full coverage testing is an
extremely effective method for locating and preventing bugs.
Because every single branch
instruction in SQLite core code is covered by test cases, the developers
can be confident that changes made in one part of the code
do not have unintended consequences in other parts of the code.
The many new features and performance improvements that have been
added to SQLite in recent years would not have been possible without
the availability of full-coverage testing.

Maintaining 100% MC/DC is laborious and time-consuming.
The level of effort needed to maintain full-coverage testing
is probably not cost effective for a typical application.
However, we think that full-coverage testing is justified for a
very widely deployed infrastructure library
like SQLite, and especially for a database library which by its very
nature "remembers" past mistakes.testing.html#experience_with_full_test_coverage”j‘‹[   57¨CGHow SQLite Is Tested7.6. Mutation testingUsing gcov (or similar) to show that every branch instruction is taken
at least once in both directions is good measure of test suite quality.
But even better is showing that every branch instruction makes
a difference in the output.  In other words, we want to show 
not only that every branch instruction both jumps and falls through but also
that every branch is doing useful work and that the test suite is able
to detect and verify that work.  When a branch is found that does not
make a difference in the output, that suggests that the code associated 
the branch can be removed (reducing the size of the library and perhaps
making it run faster) or that the test suite is inadequately testing the
feature that the branch implements.

SQLite strives to verify that every branch instruction makes a difference
using mutation testing.
A script
first compiles the SQLite source code into assembly language
(using, for example, the -S option to gcc).  Then the script steps through
the generated assembly language and, one by one, changes each branch 
instruction into either an unconditional jump or a no-op, compiles the 
result, and verifies that the test suite catches the mutation.


Unfortunately, SQLite contains many branch instructions that
help the code run faster without changing the output.
Such branches generate false-positives during mutation testing.
As an example, consider the following 
hash function
used to accelerate table-name lookup:

55  static unsigned int strHash(const char *z){
56    unsigned int h = 0;
57    unsigned char c;
58    while( (c = (unsigned char)*z++)!=0 ){     /*OPTIMIZATION-IF-TRUE*/
59      h = (h&lt;&lt;3) &#94; h &#94; sqlite3UpperToLower&#91;c&#93;;
60    }
61    return h;
62  }



If the branch instruction that implements the "c!=0" test on line 58
is changed into a no-op, then the while-loop will loop forever and the
test suite will fail with a time-out.  But if that branch is changed
into an unconditional jump, then the hash function will always return 0.
The problem is that 0 is a valid hash.  A hash function that always
returns 0 still works in the sense that SQLite still always gets the correct
answer.  The table-name hash table degenerates into a linked-list
and so the table-name lookups that occur while parsing SQL statements 
might be a little slower, but the end result will be the same.


To work around this problem, comments of the form
"/*OPTIMIZATION-IF-TRUE*/" and
"/*OPTIMIZATION-IF-FALSE*/" are inserted into the SQLite
source code to tell the mutation testing script to ignore some branch
instructions.testing.html#mutation_testing
ÈAçüÈ„/‘‹a 51‡YAHow SQLite Is Tested8.4. Mutex AssertsSQLite contains a pluggable mutex subsystem.  Depending on 
compile-time options, the default mutex system contains interfaces
sqlite3_mutex_held() and sqlite3_mutex_notheld() that detect
whether or not a particular mutex is held by the calling thread.
These two interfaces are used extensively within assert() statements
in SQLite to verify mutexes are held and released at all the right
moments, in order to double-check that SQLite does work correctly
in multi-threaded applications.testing.html#mutex_asserts…f‘‹`  5%Š_5How SQLite Is Tested8.3. Memsys2SQLite contains a pluggable
memory allocation subsystem.
The default implementation uses system malloc() and free(). 
However, if SQLite is compiled with SQLITE_MEMDEBUG, an alternative
memory allocation wrapper (memsys2)
is inserted that looks for memory allocation
errors at run-time.  The memsys2 wrapper checks for memory leaks, of
course, but also looks for buffer overruns, uses of uninitialized memory,
and attempts to use memory after it has been freed.  These same checks
are also done by valgrind (and, indeed, Valgrind does them better)
but memsys2 has the advantage of being much faster than Valgrind, which
means the checks can be done more often and for longer tests.testing.html#memsys2ŠU‘‹_  5'”97How SQLite Is Tested8.2. ValgrindValgrind is perhaps the most amazing
and useful developer tool in the world.  Valgrind is a simulator - it simulates
an x86 running a Linux binary.  (Ports of Valgrind for platforms other
than Linux are in development, but as of this writing, Valgrind only
works reliably on Linux, which in the opinion of the SQLite developers 
means that Linux should be the preferred platform for all software development.)
As Valgrind runs a Linux binary, it looks for all kinds of interesting
errors such as array overruns, reading from uninitialized memory,
stack overflows, memory leaks, and so forth.  Valgrind finds problems
that can easily slip through all of the other tests run against SQLite.
And, when Valgrind does find an error, it can dump the developer directly
into a symbolic debugger at the exact point where the error occur, to
facilitate a quick fix.

Because it is a simulator, running a binary in Valgrind is slower than 
running it on native hardware.  (To a first approximation, an application
running in Valgrind on a workstation will perform about the same as it
would running natively on a smartphone.)  So it is impractical to run the full
SQLite test suite through Valgrind.  However, the veryquick tests and
the coverage of the TH3 tests are run through Valgrind prior to every
release.testing.html#valgrind‡:‘‹^      5#Ž3How SQLite Is Tested8.1. AssertThe SQLite core contains 6548 assert()
statements that verify function preconditions and postconditions and
loop invariants.  Assert() is a macro which is a standard part of
ANSI-C.  The argument is a boolean value that is assumed to always be
true.  If the assertion is false, the program prints an error message
and halts.

Assert() macros are disabled by compiling with the NDEBUG macro defined.
In most systems, asserts are enabled by default.  But in SQLite, the
asserts are so numerous and are in such performance critical places, that
the database engine runs about three times slower when asserts are enabled.
Hence, the default (production) build of SQLite disables asserts.  
Assert statements are only enabled when SQLite is compiled with the
SQLITE_DEBUG preprocessor macro defined.

See the Use Of assert in SQLite document
for additional information about how SQLite uses assert().testing.html#assert
.‘.^‘‹c      5I YHow SQLite Is Tested8.6. Undefined Behavior ChecksIn the C programming language, it is very easy to write code that
has "undefined" or "implementation defined" behavior.
That means that the code might work during development, but then give
a different answer on a different system, or when recompiled using different
compiler options.  
Examples of undefined and implementation-defined behavior in
ANSI C include:

Signed integer overflow.  (Signed integer overflow does not
necessarily wrap around, as most people expect.)
Shifting an N-bit integer by more than N bits.
Shifting by a negative amount.
Shifting a negative number.
Using the memcpy() function on overlapping buffers.
The order of evaluation of function arguments.
Whether or not "char" variables are signed or unsigned.
And so forth....


Since undefined and implementation-defined behavior is non-portable
and can easily lead to incorrect answers, SQLite works very hard to avoid it.
For example,
when adding two integer column values together as part of an SQL statement,
SQLite does not simply add them together using the C-language "+" operator.
Instead, it first checks to make sure the
addition will not overflow, and if it will, it does the addition using
floating point instead.

To help ensure that SQLite does not make use of undefined or
implementation defined behavior, the test suites are rerun using
instrumented builds that try to detect undefined behavior.  For example,
test suites are run using the "-ftrapv" option of GCC.  And they
are run again using the "-fsanitize=undefined" option on Clang.  And
again using the "/RTC1" option in MSVC.  Then the test suites are rerun
using options like "-funsigned-char" and "-fsigned-char" to make sure
that implementation differences do not matter either.  Tests are then repeated
on 32-bit and 64-bit systems and on big-endian and little-endian systems,
using a variety of CPU architectures.
Furthermore, the test suites are augmented with many test cases that are
deliberately designed to provoke undefined behavior.  For example:
"SELECT -1*(-9223372036854775808);".testing.html#undefined_behavior_checks†j‘‹b 51ŒOAHow SQLite Is Tested8.5. Journal TestsOne of the things that SQLite does to ensure that transactions
are atomic across system crashes and power failures is to write
all changes into the rollback journal file prior to changing the
database.  The TCL test harness contains an alternative
OS backend implementation that helps to
verify this is occurring correctly.  The "journal-test VFS" monitors
all disk I/O traffic between the database file and rollback journal,
checking to make sure that nothing is written into the database
file which has not first been written and synced to the rollback journal.
If any discrepancies are found, an assertion fault is raised.

The journal tests are an additional double-check over and above
the crash tests to make sure that SQLite transactions will be atomic
across system crashes and power failures.testing.html#journal_tests
¾
–很"‘‹f      539EHow SQLite Is Tested11. Static AnalysisStatic analysis means analyzing source code at compile-time to
check for correctness.  Static analysis includes compiler
warning messages and more in-depth analysis engines such as the
Clang Static Analyzer.
SQLite compiles without warnings on GCC and Clang using 
the -Wall and -Wextra flags on Linux and Mac and on MSVC on Windows.
No valid warnings are generated by the Clang Static Analyzer tool "scan-build"
either (though recent versions of clang seem to generate many false-positives.)
Nevertheless, some warnings might be generated by other
static analyzers.  Users are encouraged not to stress over these
warnings and to instead take solace in the intense testing of SQLite
described above. 


Static analysis has not been helpful in finding
bugs in SQLite.  Static analysis has found a few bugs in SQLite, but
those are the exceptions.  More bugs have been
introduced into SQLite while trying to get it to compile without 
warnings than have been found by static analysis.testing.html#static_analysis‹,‘‹e      5)•a;How SQLite Is Tested10. ChecklistsThe SQLite developers use an on-line checklist to coordinate testing
activity and to verify that all tests pass prior each SQLite release.
Past checklists
are retained for historical reference.
(The checklists are read-only for anonymous internet viewers, but
developers can log in and update checklist items in their web
browsers.)
The use of checklists for SQLite testing and other development activities
is inspired by 
The Checklist Manifesto
.

The latest checklists contain approximately 200 items that are
individually verified for each release.  Some checklist items only take
a few seconds to verify and mark off.  Others involve test suites
that run for many hours.

The release checklist is not automated: developers run each item on
the checklist manually.  We find that it is important to keep a human in
the loop.  Sometimes problems are found while running a checklist item
even though the test itself passed.  It is important to have a human
reviewing the test output at the highest level, and constantly asking
"Is this really right?"

The release checklist is continuously evolving.  As new problems or
potential problems are discovered, new checklist items are added to
make sure those problems do not appear in subsequent releases.  The
release checklist has proven to be an invaluable tool in helping to
ensure that nothing is overlooked during the release process.testing.html#checklistsŠe‘‹d       5I”]How SQLite Is Tested9. Disabled Optimization TestsThe sqlite3_test_control(SQLITE_TESTCTRL_OPTIMIZATIONS, ...) interface
allows selected SQL statement optimizations to be disabled at run-time.
SQLite should always generate exactly the same answer with optimizations
enabled and with optimizations disabled; the answer simply arrives quicker
with the optimizations turned on.  So in a production environment, one always
leaves the optimizations turned on (the default setting).

One verification technique used on SQLite is to run an entire test suite
twice, once with optimizations left on and a second time with optimizations
turned off, and verify that the same output is obtained both times.  This
shows that the optimizations do not introduce errors.

Not all test cases can be handled this way.  Some test cases check
to verify that the optimizations really are reducing the amount of
computation by counting the number of disk accesses, sort operations, 
full-scan steps, or other processing steps that occur during queries.
Those test cases will appear to fail when optimizations are disabled.
But the majority of test cases simply check that the correct answer
was obtained, and all of those cases can be run successfully with and
without the optimizations, in order to show that the optimizations do not
cause malfunctions.testing.html#disabled_optimization_tests
éäÉé‹[‘“*
?}”}Version Numbers in SQLite1.1. The New Version Numbering System (After 2015-10-14)All SQLite releases starting with 3.9.0 use a three-number
"semantic version" of the form X.Y.Z.
The first number X is only increased when there is a change that
breaks backward compatibility.  The
current value for X is 3, and the SQLite developers plan to support
the current SQLite database file format, SQL syntax, and C interface
through at least the year 2050.  Hence, one
can expect that all future versions of SQLite for the next several
decades will begin with "3.".


The second number Y is incremented for any change that breaks forward
compatibility by adding new features.
Most future SQLite releases are expected
to increment the second number Y.  The Z is reset to zero whenever Y
is increased.


The third number Z is incremented for releases consisting of only
small changes that implement performance enhancements and/or bug fixes.


The rate of enhancement for SQLite over the previous five years
(2010-2015) is approximately 6 increments of Y per year.  The
numbering format used by for SQLITE_VERSION_NUMBER and
sqlite3_libversion_number() allows versions up to 3.999.999, which is
more than enough for the planned end-of-support date for SQLite
in 2050.  However, the current tarball naming conventions only
reserve two digits for the Y and so the naming format for downloads
will need to be revised in about 2030.versionnumbers.html#the_new_version_numbering_system_after_dateof_3_9_0_‚‘“)     ??‚oaVersion Numbers in SQLite1. SQLite Version NumbersBeginning with version 3.9.0 (2015-10-14) SQLite uses 
semantic versioning.
Prior to that time, SQLite employed a version identifier that
contained between two and four numbers.versionnumbers.html#sqlite_version_numbers†‘‹g  5#‹C5How SQLite Is Tested12. SummarySQLite is open source.  This gives many people the idea that
it is not well tested as commercial software and is perhaps unreliable.
But that impression is false.  
SQLite has exhibited very high reliability in the field and
a very low defect rate, especially considering how rapidly it is evolving.
The quality of SQLite is achieved in part by careful code design and
implementation.  But extensive testing also plays a vital role in
maintaining and improving the quality of SQLite.  This document has
summarized the testing procedures that every release of SQLite undergoes
with the hope of inspiring confidence that SQLite is
suitable for use in mission-critical applications.
This page last modified on  2022-05-31 20:17:58 UTCtesting.html#summary
    3      Û       3#‘“,       ?5!SVersion Numbers in SQLite1.3. Version HistoryChronology
Change log

This page last modified on  2018-05-31 17:37:17 UTCversionnumbers.html#version_historyŒ ‘“+
?}–Version Numbers in SQLite1.2. The Historical Numbering System (Before 2015-10-14)This historical version numbering system used a two-, three-,
or four-number version:  W.X, W.X.Y, or W.X.Y.Z.
W was the file format: 1 or 2 or 3.
X was the major version.
Y was the minor version.
Z was used only for patch releases to fix bugs.


There have been three historical file formats for SQLite.
SQLite 1.0 through 1.0.32 used the
gdbm library as its storage
engine.
SQLite 2.0.0 through 2.8.17 used a custom b-tree storage engine that
supported only text keys and data.
All modern versions of SQLite (3.0.0 to present) use a b-tree storage
engine that has full support for binary data and Unicode.


This major version number X was historically incremented only for
large and important changes to the code.  What constituted "large
and important" was subjective.  The 3.6.23 to 3.7.0 change
was a result of adding support for WAL mode.
The 3.7.17 to 3.8.0 change was a result of rewrite known as the
next generation query planner.


The minor version number Y was historically incremented for new
features and/or new interfaces that did not significantly change
the structure of the code.  The addition of common table expressions,
partial indexes, and indexes on expressions are all examples of
"minor" changes.  Again, the distinction between "major" and "minor"
is subjective.


The patch level Z was historically only used for bug-fix releases
that changed only a small number of code lines.versionnumbers.html#the_historical_numbering_system_before_dateof_3_9_0_
“^‘›    +5¦;CVulnerabilities1. Executive SummaryCVEs about SQLite probably do not apply to your use of SQLite.


All historical vulnerabilities reported against SQLite require at least
one of these preconditions:


The attacker can submit and run arbitrary SQL statements.

The attacker can submit a maliciously crafted database file to the
application that the application will then open and query.



Few real-world applications meet either of these preconditions, and hence
few real-world applications are vulnerable, even if they use older
and unpatched versions of SQLite.


The SQLite development team fixes bugs promptly,
usually within hours of discovery.  New releases of SQLite
are issued if the bug seems likely to impact real-world
applications.


Grey-hat hackers are rewarded based on the number and severity of 
CVEs that they write.  This results in a proliferation of CVEs that
have minor impact, or no impact at all, but which make
exaggerated impact claims.


Very few CVEs written about SQLite are real vulnerabilities in the 
sense that they do not give any new capabilities to an attacker.
Consider:


    Almost all CVEs written against SQLite require the ability to
    inject and run arbitrary SQL.

    The advertised consequence of most CVEs is "denial of service",
    typically by causing a crash through a NULL pointer dereference or
    a division by zero, or similar.

    But if an attacker can already run
    arbitrary SQL, they do not need a bug to cause a denial of service.
    There are plenty of perfectly legal and valid SQL statements
    that will consume unlimited CPU, memory, and disk I/O in order
    to create a denial-of-service without requiring help from bugs.

    Hence, the mere fact that an attacker has a way to inject and run
    arbitrary SQL is in and of itself a denial-of-service attack.  That
    the arbitrary SQL might also tickle a bug in SQLite and cause a
    crash is not a new vulnerability.



The SQLite developers do not write CVEs.  Any CVEs you find on
SQLite are generated by third-parties, often without any input from the
core developers.  A common scenario is that someone will report a bug in
SQLite, which will promptly be fixed, then weeks later a CVE for that bug will
appear, unbeknownst to the developers.


You should not assume that a CVE about
SQLite contains authoritative information.
CVEs often contain inaccuracies.
The SQLite developers have attempted to add clarifications and
corrections to CVEs about SQLite.cves.html#executive_summary
       t      t‘›    +'™)5Vulnerabilities2. About CVEsCVEs ("Common Vulnerabilities and Exposures") are reports of software
bugs that might allow a system to be hacked.  The idea
behind CVEs is sound.  They provide a common naming scheme whereby 
software bugs that might compromise information security can be easily
tracked.

While the original idea being CVEs is sound, the current processes for
creating and managing CVEs are inadequate.  There are countless grey-hat
hackers running fuzzers against a wide-variety of open-source software
products (SQLite as well as many others) and writing up CVEs against
any problems they find.  The grey-hats are rewarded, sometimes with
prestige and sometimes financially, by the number and severity of
the CVEs they write.  This incentive results in a proliferation
of CVEs which are often not well-vetted and which can have exaggerated
impact claims.  The quality-control procedures for CVEs are unable
to cope with this flood of inputs, making it difficult to correct
exaggerated, misleading, omitted, or inaccurate claims.

This is not to say that CVEs are useless.  CVEs do still (mostly)
report actual bugs.  But in most cases the bugs are not true vulnerabilities,
in the sense that they do not contribute to data loss or compromise
in and of themselves.
It is good that bugs are reported and fixed.  But not every bug is
accessible from every application.  In the case of SQLite, most of the
bugs reported by CVEs are inaccessible in most applications.  Upgrading
to the latest version of SQLite is always a good plan, but it need not
be an emergency just because an anonymous grey-hat on the internet
wrote up a CVE.cves.html#about_cves
±A±‡‘›       +IŒqSVulnerabilities2.2. Defense Against Dark ArtsMost applications can use SQLite without having to worry about
bugs in obscure SQL inputs.  If the application controls
the SQL, and the application is not deliberately trying to break
SQLite, then everything should just work.
It is not necessary to have the latest patched version of SQLite.
Any older version should work just fine.


However, there are some occasions where an application does need
to be able to safely run untrusted SQL. The SQLite developers work hard
to make SQLite safe for this purpose, though there are occasional
slip-ups.  It is good to keep up-to-date with the latest patches
in this case.  The separate defense against dark arts document
contains additional suggestions that can help prevent zero-day
attacks in cases where SQLite is given inputs that come directly
from untrusted sources.cves.html#defense_against_dark_arts•:‘›+¨GVulnerabilities2.1. A separate SQL injection vulnerability is usually requiredOther C-libraries that process complex structured inputs will
routinely be asked to deal with unvetted inputs from untrusted
sources.  Libraries like libjpeg, or libzip, or OpenSSL are
handed input streams that come directly from potentially hostile
agents.


But database engines like SQLite are usually not this way.
The SQL scripts that are passed into SQLite come from the
(trusted) application itself, not from an attacker.  Sometimes
applications contain bugs by which an external attacker can
trick the application into sending SQL of the attackers design
into the database engine.  This is a separate bug in the
application called an
SQL Injection
vulnerability.  Since SQL text is executable code, an
SQL Injection vulnerability is actually a special case of a
Remote
Code Execution (RCE) vulnerability.  An SQL Injection is perhaps not
quite as bad as other kinds of RCEs because,
while SQL is a powerful language, it is not as convenient
for crafting an exploit as Python or shell script or raw machine code.
Nevertheless, an SQL Injection is a serious problem.


Most CVEs written about SQLite assume that the attacker is
able to run arbitrary SQL scripts in SQLite.  In most applications,
this means that there must first be an SQL Injection vulnerability
that allows the attacker to inject the malicious SQL.


A few applications do allow untrusted SQL scripts received from
potentially hostile agents to be run direct in SQLite.  The main
example of this is the Chrome and Safari web browsers, which allow
an anonymous web page to run SQL using the WebSQL feature of Javascript.
This is done inside a sandbox with tightly controlled constraints on
resources, lest the SQL script try to soak up all available memory
or CPU cycles in a denial-of-service attack.  Chrome and Safari
have the infrastructure in place to allow a hostile agent to run
code which does not harm or compromise the rest of the machine.
They have to, as they also run Javascript which could, if not
tightly controlled, do even more damage than unrestrained SQL.
Apart from Chrome and Safari, no applications known to the
SQLite developers deliberately allows an anonymous remote agent
to run arbitrary SQL text.

However, most CVEs written against SQLite flippantly assume
that an attacker is free to run any arbitrary SQL in the database
engine.  So to a good approximation, this means most CVEs
written against SQLite really only apply to SQLite as it is
used in Chrome and Safari.  Or, in other words, most CVEs
for SQLite do not apply to you unless you are one of the
developers of Chrome or Safari.cves.html#a_separate_sql_injection_vulnerability_is_usually_required
Hd   rºHŽm‘¢z      Ia›coLoC Recommended Storage Format1.1. What Is A Recommended Storage Format?Recommended storage formats are formats which, in the opinion of the
preservationists at the Library of Congress, maximizes the chance of
survival and continued accessibility of digital content.
When selecting recommended storage formats, the following criteria are
considered (quoting from the LOC website):


Disclosure.
Degree to which complete specifications and tools for validating 
technical integrity exist and are accessible to those creating and
sustaining digital content.
A spectrum of disclosure levels can be observed for digital formats.
What is most significant is not approval by a recognized standards body,
but the existence of complete documentation.
Adoption.
Degree to which the format is already used by the primary creators,
disseminators, or users of information resources. 
This includes use as a master format, for delivery to end users, 
and as a means of interchange between systems.
Transparency.
Degree to which the digital representation is open to direct analysis 
with basic tools, such as human readability using a text-only editor.
Self-documentation.
Self-documenting digital objects contain basic descriptive, 
technical, and other administrative metadata.
External Dependencies.
Degree to which a particular format depends on particular hardware,
operating system, or software for rendering or use and the predicted
complexity of dealing with those dependencies in future technical 
environments.
Impact of Patents.
Degree to which the ability of archival institutions to sustain content 
in a format will be inhibited by patents.
Technical Protection Mechanisms.
Implementation of mechanisms such as encryption that prevent the 
preservation of content by a trusted repository. 

This page last modified on  2018-12-10 12:34:08 UTClocrsf.html#what_is_a_recommended_storage_format_ƒ3‘¢y       I#…g5LoC Recommended Storage Format1. OverviewSQLite is a
Recommended Storage Format
for datasets according to the
US Library of Congress.
Further information:




https://www.loc.gov/preservation/digital/formats/fdd/fdd000461.shtml#local

https://www.loc.gov/preservation/resources/rfs/data.html



As of this writing (2018-05-29) the only other recommended storage formats
for datasets are XML, JSON, and CSV.locrsf.html#overviewÂC‘›
+KƒWYVulnerabilities3. Status Of Recent SQLite CVEsThough the SQLite developers do not consider CVEs to be a reliable
source of information about bugs in SQLite, they recognize that many
groups, and especially small teams working at the bottom of tall
bureaucracies, sometimes need to track CVEs, whether they are useful
or not.  To aid in this chore, the following table of recent CVEs
affecting SQLite is provided.

If you notice new CVEs associated with SQLite that are not in
the 쉑›   +eQoVulnerabilities2.3. The SQLite Developer Policy Toward CVEsSQLite developers fix all bugs in SQLite as soon as they are reported,
usually within a few hours.  The fixes are immediately available on the
public SQLite source tree.
If a bug seems like it might cause problems for existing applications,
a new patch release for SQLite will be issued.

However, the SQLite developers do not track CVEs.  There are 
various reasons for this:



The developers often do not find out about CVEs until long after the
bug is fixed.  You can see this by the fact that many CVEs reference the
bug fix in their initial report.


CVEs are a low-quality source of information about bugs in SQLite
that are likely to affect most applications.


Almost all bugs reported by CVEs are just bugs and not
true vulnerabilities.  Claiming that they are vulnerabilities is
stretching the meaning of the word "vulnerability" and the SQLite
developers do not wish to participate in that deception.


The developers have no editorial influence on the content of CVEs,
and they do not like to be controlled by groups in which they have
no voice.cves.html#the_sqlite_developer_policy_toward_cvesítable below, please bring them to the attention of the developers
on the SQLite Forum so they can
be added.




CVE Number
Fix
Comments





CVE-2022-46908

Bug not in the SQLite library
This is a bug in the --safe command-line option of the command-line shell
  program that is available for accessing SQLite database files.  The bug does
  not exist in the SQLite library.  Nor is it an issue for the CLI as long as
  the user does not depend on the --safe option.  It is not serious.  It is
  debatable whether or not this is a security issue.



CVE-2022-35737

3.39.2(2022-07-21)
This bug is an array-bounds overflow.  The bug is only accessible when using some
  of the C-language APIs provided by SQLite.  The bug cannot be reached using SQL
  nor can it be reached by providing SQLite with a corrupt database file.
  The bug only comes up when very long string inputs (greater than 2 billion bytes
  in length) are provided as arguments to a few specific C-language interfaces,
  and even then only under special circumstances.



CVE-2022-24854

Not a bug
This CVE describes a bug in an application that uses SQLite, not in SQLite itself.
  SQLite is doing everything correctly.  The application grants users the ability to
  run SQL statements, using SQLite, that can leak or change information that those users
  should not normally have access to.  This is purely an application bug.  It does not
  describe a malfunction or vulnerability in SQLite.



CVE-2022-21227

Not a bug
This CVE describes a bug in a third-party packages that provides a binding
  for SQLite to Node.js.  The bug reported is in the third-party Node.js binding,
  not in SQLite itself.  Do not be confused by the use of the word "SQLite" in the
  ambiguously-worded CVE description.



CVE-2021-45346

Not a bug
This CVE is misinformation.  See the discussion around
  SQLite forum post 53de8864ba114bf.



CVE-2021-42169

Not a bug
This CVE has nothing whatsoever to do with SQLite.  It is about a bug in
  application that happens to use SQLite.  Since SQLite is mentioned in the 
  CVE description, the CVE is included here to emphasize that
  this is not an SQLite bug.



CVE-2021-36690

Bug not in the SQLite library
This bug is not in the SQLite core library, but rather in an
  
  experimental extension that is used to implement the
  .expert command in the CLI.  The code that contains the bug
  does not appear in standard SQLite builds, though it
  is included in the sqlite3.exe command-line tool.
  Applications must link against the extra source code files that
  implement the extension and take other deliberate actions to
  activate the extension before the troublesome code can be run.
  For the rare application that uses the troublesome extension,
  the consequence of this bug is that malicious SQL can cause a
  NULL pointer deference and denial of service.
(details)



CVE-2021-28305

Not a bug
This is not a bug in SQLite.  The bug is in a third-party application that
  uses SQLite.  SQLite is mentioned by name in the CVE description,
  however, so we have included the CVE in the list.



CVE-2021-23404

Not a bug
This is not a bug in SQLite.  The bug is in a third-party application that
  uses SQLite and includes "sqlite" in its name.  This CVE is included on the
  list because it mentions SQLite even though the bug has nothing to do
  with SQLite.



CVE-2021-20227

3.34.1(2021-01-20)
Malicious SQL statement causes read-after-free.  No harm can come of this
  particular read-after-free instance, as far as anyone knows.  The bug is
  undetectable without a memory sanitizer. The CVE
  claims that this bug is an RCE - a Remote Code Execution
  vulnerability, but that claim is incorrect.
  The RCE claim is misinformation.
(details)



CVE-2021-20223

3.34.0(2020-12-01)
The problem identified by this CVE is not a vulnerability. 
  It is a malfunction. A coding error causes FTS5
  to sometimes return inconsistent and incorrect results under obscure circumstances,
  but no memory errors occur.
(details)



CVE-2020-15358

3.32.3(2020-06-18)
Malicious SQL statement causes an read past the end of a heap buffer.
(details)



CVE-2020-13871

3.32.3(2020-06-18)
Malicious SQL statement causes a read-only use-after-free memory error.
(details)



CVE-2020-13632

3.32.0(2020-05-22)
Malicious SQL statement causes a read of a NULL pointer in the
  matchinfo() SQL function of the FTS3 extension, resulting in
  denial of service.
(details)



CVE-2020-13631

3.32.0(2020-05-22)
Malicious SQL statement (an ALTER TABLE that tries to rename a
  virtual table into one of its own shadow tables)
  causes an infinite loop and denial of service.
(details)



CVE-2020-13630

3.32.0(2020-05-22)
Malicious SQL statement causes a read-only use-after-free,
  possibly resulting in a incorrect output from the snippet()
  SQL function of the FTS3 extension.  There is no known
  way to exfiltrate data or crash the application using this bug.
(details)



CVE-2020-13435

3.32.1(2020-05-25)
Malicious SQL statement causes a read access to a NULL pointer and
  denial of service.
(details)



CVE-2020-13434

3.32.1(2020-05-25)
Malicious SQL statement involving the printf() SQL function results
  in an integer overflow which can overwrite the stack with over 2
  billion bytes of 0x30 or 0x20 (ASCII '0' or ' ').
  Even though this is a stack overwrite, there is no known way to
  redirect control or otherwise escalate the level of harm.
  This is a denial-of-service attack only.
(details)



CVE-2020-11656

3.32.0(2020-05-22)
Malicious SQL statement causes read-only use-after-free of memory allocation
  if SQLite is compile with -DSQLITE_DEBUG.  Does not affect release
  builds.
(details)



CVE-2020-11655

3.32.0(2020-05-22)
Malicious SQL statement causes a read using an uninitialized pointer
  and denial-of-service.
(details)



CVE-2020-9327

3.32.0(2020-05-22)
Malicious SQL statement causes a read using an uninitialized pointer
  and denial-of-service
(details)



CVE-2020-6405

3.31.0(2020-01-22)
Malicious SQL statement causes a NULL pointer dereference and
  denial-of-service
(details)



CVE-2019-20218

3.31.0(2020-01-22)
Malicious SQL statement causes an uninitialized pointer read and
  denial-of-service.
(details)



CVE-2019-19959

3.31.0(2020-01-22)
Malicious SQL statement causes a NULL pointer dereference
  in the Zipfile virtual table extension and
  denial-of-service.  This is only possible when the optional
  Zipfile virtual table extension is deployed, which is not
  the case in default builds.
(details)



CVE-2019-19926

3.31.0(2020-01-22)
Malicious SQL statement causes an uninitialized pointer read and
  denial-of-service.
(details)



CVE-2019-19925

3.31.0(2020-01-22)
Malicious SQL statement causes a NULL pointer dereference and
  in the Zipfile virtual table extension and
  denial-of-service.  This is only possible when the optional
  Zipfile virtual table extension is deployed, which is not
  the case in default builds.
(details)



CVE-2019-19924

3.31.0(2020-01-22)
Malicious SQL statement causes a uninitialized pointer reference and
  denial-of-service.
(details)



CVE-2019-19923

3.31.0(2020-01-22)
Malicious SQL statement causes a NULL pointer dereference and
  denial-of-service.
(details)



CVE-2019-19646

3.31.0(2020-01-22)
The PRAGMA integrity_check command might cause the byte-code for a prepared
  statement to loop indefinitely.  This might enable a denial-of-service, if the 
  application has not taken appropriate and prudent steps
  to limit the run-time of SQL statements.  This is not a vulnerability, as there
  are countless perfectly valid SQL queries, especially queries involving
  recursive common table expressions, that also run essentially forever.
(details)



CVE-2019-19317

3.31.0(2020-01-22)
This CVE identifies a bug in a development check-in of
  SQLite.  The bug never appeared in any official SQLite release.
(details)





This page last modified on  2022-12-14 16:29:06 UTCcves.html#status_of_recent_sqlite_cves
ÇyÇ-‘ªc      ?5™AGThe Error And Warning Log2. Interface DetailsThe third argument to the sqlite3_config(SQLITE_CONFIG_LOG,...) 
interface (the "pData" argument in the example above) is a pointer to arbitrary
data.  SQLite passes this pointer through to the first argument of the
error logger callback.  The pointer can be used to pass application-specific 
setup or state information, if desired.  Or it can simply be a NULL 
pointer which is ignored by the callback.

The second argument to the error logger callback is an integer
extended error code.  The third argument to the error logger is the
text of the error message.  The error message text is stored in a fixed-length
stack buffer in the calling function and so will only be valid for the
duration of the error logger callback function.  The error logger should
make a copy of this message into persistent storage if retention of the
message is needed.

The error logger callback should be treated like a signal handler.
The application should save off or otherwise process the error, then return
as soon as possible.  No other SQLite APIs should be invoked, directly or
indirectly, from the error logger.  SQLite is not reentrant through
the error logger callback.  In particular, the error logger callback
is invoked when a memory allocation fails, so it is generally a bad idea
to try to allocate memory inside the error logger.  Do not even think
about trying to store the error message in another SQLite database.

Applications can use the sqlite3_log(E,F,..) API to send new messages
to the log, if desired, but this is discouraged.  The sqlite3_log()
interface is intended for use by extensions only, not by applications.errlog.html#interface_details‹‘ªb        ?]”OoThe Error And Warning Log1. Setting Up The Error Logging CallbackThere can only be a single error logging callback per process.
The error logging callback is registered at start-time using C-code
similar to the following:


sqlite3_config(SQLITE_CONFIG_LOG, errorLogCallback, pData);


The error logger callback function might look something like this:


void errorLogCallback(void *pArg, int iErrCode, const char *zMsg){
  fprintf(stderr, "(%d) %s\n", iErrCode, zMsg);
}


The example above illustrates the signature of the error logger callback.
However, in an embedded application, one usually does not print
messages on stderr.  Instead, one might store the messages in a
preallocated circular buffer where they can be accessed when diagnostic
information is needed during debugging.  Or perhaps the messages can be
sent to Syslog.  Somehow, the
messages need to be stored where they are accessible to developers,
not displayed to end users.

Do not misunderstand: There is nothing technically wrong with displaying 
the error logger messages to end users.  The messages do not contain
sensitive or private information that must be protected from unauthorized
viewing.  Rather the messages are technical in nature and are not useful
or meaningful to the typical end user.  The messages coming from the
error logger are intended for database geeks.  Display them accordingly.errlog.html#setting_up_the_error_logging_callbackƒa‘ªa  ?†Q5The Error And Warning Log OverviewSQLite can be configured to invoke a callback function containing
an error code and a terse error message whenever anomalies occur.
This mechanism is very helpful in tracking obscure problems that
occur rarely and in the field.  Application developers are encouraged
to take advantage of the error logging facility of SQLite in their
products, as it is very low CPU and memory cost but can be a
huge aid for debugging.errlog.html#overview
‹    ‹†y‘ªe  ?!3The Error And Warning Log4. SummaryThe use of the error logger callback is highly recommended.
The debugging information that the error logger provides has proven
very useful in tracking down obscure problems that occur with applications
after they get into the field.  The error logger callback has also 
proven useful in catching occasional errors that the application
misses because of inconsistent checking of API return codes.
Developers are encouraged to implement an error logger callback early
in the development cycle in order to spot unexpected behavior quickly,
and to leave the error logger callback turned on through deployment.
If the error logger never finds a problem, then no harm is done.  
But failure to set up an appropriate error logger might compromise
diagnostic capabilities later on.
This page last modified on  2022-01-20 21:38:08 UTCerrlog.html#summary•r‘ªd     ?Eª+WThe Error And Warning Log3. Variety of Error MessagesThe error messages that might be sent to the error logger and their
exact format is subject to changes from one release to the next.  So
applications should not depend on any particular error message text formats or
error codes.  Things do not change capriciously, but they do sometimes
changes.

The following is a partial list of the kinds of messages that might
appear in the error logger callback.



Any time there is an error either compiling an SQL statement 
(using sqlite3_prepare_v2() or its siblings) or running an SQL
statement (using sqlite3_step()) that error is logged.



When a schema change occurs that requires a prepared statement to be reparsed
and reprepared, that event is logged with the error code SQLITE_SCHEMA.
The reparse and reprepare is normally automatic (assuming that
sqlite3_prepare_v2() has been used to prepare the statements originally,
which is recommended) and so these logging events are normally the only
way to know that reprepares are taking place.


SQLITE_NOTICE messages are logged whenever a database has to be recovered
because the previous writer crashed without completing its transaction.
The error code is SQLITE_NOTICE_RECOVER_ROLLBACK when recovering a
rollback journal and SQLITE_NOTICE_RECOVER_WAL when recovering a 
write-ahead log.



SQLITE_WARNING messages are logged when database files are renamed or
aliased in ways that can lead to database corruption.
(See 1 and 2 for
additional information.)



Out of memory (OOM) error conditions generate error logging events
with the SQLITE_NOMEM error code and a message that says how many bytes
of memory were requested by the failed allocation.


I/O errors in the OS-interface generate error logging events.
The message to these events gives the line number in the source code where
the error originated and the filename associated with the event when
there is a corresponding file. 

When database corruption is detected, an SQLITE_CORRUPT error
logger callback is invoked.  As with I/O errors, the error message text
contains the line number in the original source code where the error
was first detected.


An error logger callback is invoked on SQLITE_MISUSE errors.
This is useful in detecting application design issues when return codes
are not consistently checked in the application code.


SQLite strives to keep error logger traffic low and only send messages
to the error logger when there really is something wrong.  Applications
might further cull the error message traffic 
by deliberately ignoring certain classes of error
messages that they do not care about.  For example, an application that
makes frequent database schema changes might want to ignore all
SQLITE_SCHEMA errors.errlog.html#variety_of_error_messages

EF
ˆ4‘²L     c[ŽWuUsing SQLite In Multi-Threaded Applications4. Run-time selection of threading modeIf single-thread mode has not been selected at compile-time or start-time,
then individual database connections can be created as either multi-thread
or serialized.  It is not possible to downgrade an individual database
connection to single-thread mode.  Nor is it possible to escalate an
individual database connection if the compile-time or start-time mode
is single-thread.

The threading mode for an individual database connection is determined
by flags given as the third argument to sqlite3_open_v2().  The
SQLITE_OPEN_NOMUTEX flag causes the database connection to be in the
multi-thread mode and the SQLITE_OPEN_FULLMUTEX flag causes the connection
to be in serialized mode.  If neither flag is specified or if
sqlite3_open() or sqlite3_open16() are used instead of 
sqlite3_open_v2(), then the default
mode determined by the compile-time and start-time settings is used.

This page last modified on  2022-01-20 21:38:08 UTCthreadsafe.html#run_time_selection_of_threading_modeƒz‘²K    c_…[yUsing SQLite In Multi-Threaded Applications3. Start-time selection of threading modeAssuming that the compile-time threading mode is not single-thread, then
the threading mode can be changed during initialization using the
sqlite3_config() interface.  The SQLITE_CONFIG_SINGLETHREAD verb
puts SQLite into single-thread mode, the SQLITE_CONFIG_MULTITHREAD
verb sets multi-thread mode, and the SQLITE_CONFIG_SERIALIZED verb
sets serialized mode.threadsafe.html#start_time_selection_of_threading_mode‡Y‘²J        cc}Using SQLite In Multi-Threaded Applications2. Compile-time selection of threading modeUse the SQLITE_THREADSAFE compile-time parameter to select the
threading mode.  If no SQLITE_THREADSAFE compile-time parameter is
present, then serialized mode is used.
This can be made explicit with 
-DSQLITE_THREADSAFE=1.
With
-DSQLITE_THREADSAFE=0 the threading mode is
single-thread.  With
-DSQLITE_THREADSAFE=2 the threading mode is
multi-thread.



The return value of the sqlite3_threadsafe() interface is the value
of SQLITE_THREADSAFE set at compile-time. It does not reflect changes
to the threading mode made at runtime via the sqlite3_config()
interface or by flags given as the third argument to sqlite3_open_v2().



If single-thread mode is selected at compile-time, then critical
mutexing logic is omitted from the build and it is impossible to
enable either multi-thread or serialized modes at start-time or
run-time.threadsafe.html#compile_time_selection_of_threading_mode‡X‘²I  c#Ž=Using SQLite In Multi-Threaded Applications1. OverviewSQLite supports three different threading modes:


Single-thread.
In this mode, all mutexes are disabled and SQLite is unsafe to use in
more than a single thread at once.

Multi-thread.
In this mode, SQLite can be safely used by multiple threads provided that
no single database connection is used simultaneously in two or more threads.


Serialized.
In serialized mode, SQLite can be safely used by multiple threads with no
restriction.



The threading mode can be selected at compile-time (when the SQLite
library is being compiled from source code) or at start-time (when the
application that intends to use SQLite is initializing) or at
run-time (when a new SQLite database connection is being created).
Generally speaking, run-time overrides start-time and start-time
overrides compile-time.  Except, single-thread mode cannot be 
overridden once selected.



The default mode is serialized.threadsafe.html#overview
ÎCΈp‘º3     9C'_Floating Point Numbers1.2. Floating Point NumbersThe binary64 floating-point format uses 64 bits per number.  Hence there
are 1.845e+19 different possible floating point values.  On the other hand
there are infinitely many real numbers in the range of 
1.7977e+308 and 4.9407e-324.  It follows then that binary64 cannot possibly
represent all possible real numbers within that range.  Approximations are
required.


An IEEE 754 floating-point value is an integer multiplied by a power
of two:


M &times 2E


The M value is the "mantissa" and E is the "exponent".  Both
M and E are integers.

For Binary64, M is a 53-bit integer and E is an 11-bit integer that is
offset so that represents a range of values between -1074 and +972, inclusive.

(NB:  The usual description of IEEE 754 is more complex, and it is important
to understand the added complexity if you really want to appreciate the details,
merits, and limitations of IEEE 754.  However, the integer description shown
here, while not exactly right, is easier to understand and is sufficient for
the purposes of this article.)floatingpoint.html#floating_point_numbersˆ7‘º2    9E1aFloating Point Numbers1.1. Floating-Point AccuracySQLite promises to preserve the 15 most significant digits of a floating
point value.  However, it makes no guarantees about the accuracy of
computations on floating point values, as no such guarantees are possible.
Performing math on floating-point values introduces error.
For example, consider what happens if you attempt to subtract two floating-point
numbers of similar magnitude:



1152693165.1106291898
-1152693165.1106280772

0.0000011126



The result shown above (0.0000011126) is the correct answer.  But if you
do this computation using binary64 floating-point, the answer you get is
0.00000095367431640625 - an error of about 14%.  If you do many similar
computations as part of your program, the errors add up so that your final
result might be completely meaningless.

The error arises because only about the first 15 significant digits of
each number are stored accurately, and the first difference between the two numbers
being subtracted is in the 16th digit.floatingpoint.html#floating_point_accuracyˆ|‘º1   9E7eFloating Point Numbers1. How SQLite Stores NumbersSQLite stores integer values in the 64-bit 
twos-complement
format&sup1.
This gives a storage range of -9223372036854775808 to +9223372036854775807,
inclusive.  Integers within this range are exact.


So-called "REAL" or floating point values are stored in the
IEEE 754
Binary-64
format&sup1.
This gives a range of positive values between approximately
1.7976931348623157e+308 and 4.9406564584124654e-324 with an equivalent
range of negative values.  A binary64 can also be 0.0 (and -0.0), positive
and negative infinity and "NaN" or "Not-a-Number".  Floating point
values are approximate.


Pay close attention to the last sentence in the previous paragraph:

Floating point values are approximate.



If you need an exact answer, you should not use binary64 floating-point
values, in SQLite or in any other product.  This is not an SQLite limitation.
It is a mathematical limitation inherent in the design of floating-point numbers.

&mdash;&sup1;
Exception:  The R-Tree extension stores information as 32-bit floating
point or integer values.floatingpoint.html#how_sqlite_stores_numbers

nŒ^ˆA‘º7    9GI[Floating Point Numbers2.1.1. The ieee754() functionThe ieee754(F) SQL function takes a single floating-point argument
as its input and returns a string that looks like this:


'ieee754(M,E)'


Except that the M and E are replaced by the mantissa and exponent of the
floating point number.  For example:

sqlite> .mode box
sqlite> SELECT ieee754(47.49) AS x;
┌───────────────────────────────â”
│               x               │
├───────────────────────────────┤
│ ieee754(6683623321994527,-47) │
└───────────────────────────────┘



Going in the other direction, the 2-argument version of ieee754() takes
the M and E values and converts them into the corresponding F value:

sqlite> select ieee754(6683623321994527,-47) as x;
┌───────â”
│   x   │
├───────┤
│ 47.49 │
└───────┘floatingpoint.html#the_ieee754_function„)‘º6 9E‡aFloating Point Numbers2.1. The ieee754.c ExtensionThe ieee754 extension converts a floating point number between its
binary64 representation and the M&times;2E format.
In other words in the expression:


F = M &times 2E


The ieee754 extension converts between F and (M,E) and back again.

The ieee754 extension is not part of the amalgamation, but it is included
by default in the CLI.  If you want to include the ieee754 extension in your
application, you will need to compile and load it separately.floatingpoint.html#the_ieee754_c_extension…]‘º5    9AŠ  YFloating Point Numbers1.2.2. Is it close enough?The precision provided by IEEE 754 Binary64 is sufficient for most computations.
For example, if "47.49" represents a price and inflation is running
at 2% per year, then the price is going up by about 0.0000000301 dollars per
second.  The error in the recorded value of 47.49 represents about 66 nanoseconds
worth of inflation.  So if the 47.49 price is exact
when you enter it, then the effects of inflation will cause the true value to
exactly equal the value actually stored
(47.4900000000000019895196601282805204391479492187) in less than 
one ten-millionth of a second.
Surely that level of precision is sufficient for most purposes?floatingpoint.html#is_it_close_enough_‹
‘º4      9I”YaFloating Point Numbers1.2.1. Unrepresentable numbersNot every decimal number with fewer than 16 significant digits can be
represented exactly as a binary64 number.  In fact, most decimal numbers
with digits to the right of the decimal point lack an exact binary64
equivalent.  For example, if you have a database column that is intended
to hold an item price in dollars and cents, the only cents value that
can be exactly represented are 0.00, 0.25, 0.50, and 0.75.  Any other
numbers to the right of the decimal point result in an approximation.
If you provide a "price" value of 47.49, that number will be represented
in binary64 as:


6683623321994527 &times; 2-47


Which works out to be:


47.49000000000000198951966012828052043914794921875


That number is very close to 47.49, but it is not exact.  It is a little
too big.  If we reduce M by one to 6683623321994526 so that we have the
next smaller possible binary64 value, we get:


47.4899999999999948840923025272786617279052734375




This second number is too small.
The first number is closer to the desired value of 47.49, so that is the
one that gets used.  But it is not exact.  Most decimal values work this
way in IEEE 754.  Remember the key point we made above:


Floating point values are approximate.


If you remember nothing else about floating-point values, 
please don't forget this one key idea.floatingpoint.html#unrepresentable_numbers
F˜F‰L‘º:    9E‘[aFloating Point Numbers2.2. The decimal.c ExtensionThe decimal extension provides arbitrary-precision decimal arithmetic on
numbers stored as text strings.  Because the numbers are stored to arbitrary
precision and as text, no approximations are needed.  Computations can be
done exactly.

The decimal extension is not (currently) part of the SQLite amalgamation.
However, it is included in the CLI.

There are three math functions available:



 decimal_add(A,B)
 decimal_sub(A,B)
 decimal_mul(A,B)



These functions respectively add, subtract, and multiply their arguments
and return a new text string that is the decimal representation of the result.
There is no division operator at this time.

Use the decimal_cmp(A,B) to compare two decimal values.  The result will
be negative, zero, or positive if A is less than, equal to, or greater than B,
respectively.

The decimal_sum(X) function is an aggregate, like the built-in
sum() aggregate function, except that decimal_sum() computes its result
to arbitrary precision and is therefore precise.

Finally, the decimal extension provides the "decimal" collating sequences
that compares decimal text strings in numeric order.floatingpoint.html#the_decimal_c_extensionŠ|‘º99       “;Floating Point Numbers2.1.3. The ieee754_from_blob() and ieee754_to_blob() functionsThe ieee754_to_blob(F) SQL function converts the floating point number F
into an 8-byte BLOB that is the big-endian binary64 encoding of that number.
The ieee754_from_blob(B) function goes the other way, converting an 8-byte
blob into the floating-point value that the binary64 encoding represents.

So, for example, if you read
on
Wikipedia that the encoding for the minimum positive binary64 value is
0x0000000000000001, then you can find the corresponding floating point value
like this:

sqlite> .mode box
sqlite> SELECT ieee754_from_blob(x'0000000000000001') AS F;
┌───────────────────────â”
│           F           │
├───────────────────────┤
│ 4.94065645841247e-324 │
└───────────────────────┘


Or go the other way:

sqlite> .mode box
sqlite> SELECT quote(ieee754_to_blob(4.94065645841247e-324)) AS binary64;
┌─────────────────────â”
│      binary64       │
├─────────────────────┤
│ X'0000000000000001' │
└─────────────────────┘floatingpoint.html#the_ieee754_from_blob_and_ieee754_to_blob_functions†c‘º89  ‹       Floating Point Numbers2.1.2. The ieee754_mantissa() and ieee754_exponent() functionsThe text output of the one-argument form of ieee754() is great for human
readability, but it is awkward to use as part of a larger expression.  Hence
the ieee754_mantissa() and ieee754_exponent() routines were added to return
the M and E values corresponding to their single argument F
value.
For example:

sqlite> .mode box
sqlite> SELECT ieee754_mantissa(47.49) AS M, ieee754_exponent(47.49) AS E;
┌──────────────────┬─────â”
│        M         │  E  │
├──────────────────┼─────┤
│ 6683623321994527 │ -47 │
└──────────────────┴─────┘floatingpoint.html#the_ieee754_mantissa_and_ieee754_exponent_functions
p0p‹;‘ÙR       9U•!iIndexes On Expressions1. How To Use Indexes On ExpressionsUse a CREATE INDEX statement to create a new index on one or more
expressions just like you would to create an index on columns.  The only
difference is that expressions are listed as the elements to be indexed
rather than column names.


The SQLite query planner will consider using an index on an expression
when the expression that is indexed appears in the WHERE clause or in
the ORDER BY clause of a query, exactly as it is written in the
CREATE INDEX statement.  The query planner does not do algebra.  In order
to match WHERE clause constraints and ORDER BY terms to indexes, SQLite
requires that the expressions be the same, except for minor syntactic
differences such as white-space changes.  So if you have:

CREATE TABLE t2(x,y,z);
CREATE INDEX t2xy ON t2(x+y);



And then you run the query:

SELECT * FROM t2 WHERE y+x=22;



Then the index will not be used because 
the expression on the CREATE INDEX
statement (x+y) is not the same as the expression as it appears in the 
query (y+x).  The two expressions might be mathematically equivalent, but
the SQLite query planner insists that they be the same, not merely
equivalent.  Consider rewriting the query thusly:

SELECT * FROM t2 WHERE x+y=22;



This second query will likely use the index because now the expression
in the WHERE clause (x+y) matches the expression in the index exactly.expridx.html#how_to_use_indexes_on_expressions‹h‘ÙQ       9
—'Indexes On ExpressionsNormally, an SQL index references columns of a table.  But an index
can also be formed on expressions involving table columns.


As an example, consider the following table that tracks
dollar-amount changes on various "accounts":

CREATE TABLE account_change(
  chng_id INTEGER PRIMARY KEY,
  acct_no INTEGER REFERENCES account,
  location INTEGER REFERENCES locations,
  amt INTEGER,  -- in cents
  authority TEXT,
  comment TEXT
);
CREATE INDEX acctchng_magnitude ON account_change(acct_no, abs(amt));



Each entry in the account_change table records a deposit or a withdrawal
into an account.  Deposits have a positive "amt" and withdrawals have
a negative "amt".


The acctchng_magnitude index is over the account number ("acct_no") and
on the absolute value of the amount.  This index allows one to do 
efficient queries over the magnitude of a change to the account.
For example, to list all changes to account number $xyz that are
more than $100.00, one can say:


SELECT * FROM account_change WHERE acct_no=$xyz AND abs(amt)>=10000;



Or, to list all changes to one particular account ($xyz) in order of
decreasing magnitude, one can write:

SELECT * FROM account_change WHERE acct_no=$xyz
 ORDER BY abs(amt) DESC;



Both of the above example queries would work fine without the
acctchng_magnitude index.
The acctchng_magnitude index merely helps the queries to run
faster, especially on databases where there are many entries in
the table for each account.expridx.html#‡^‘º;   9'Ž7GFloating Point Numbers3. TechniquesThe following SQL illustrates how to use the ieee754 and decimal
extensions to compute the exact decimal equivalent
for a binary64 floating-point number.

-- The pow2 table will hold all the necessary powers of two.
CREATE TABLE pow2(x INTEGER PRIMARY KEY, v TEXT);
WITH RECURSIVE c(x,v) AS (
  VALUES(0,'1')
  UNION ALL
  SELECT x+1, decimal_mul(v,'2') FROM c WHERE x+1&lt;=971
) INSERT INTO pow2(x,v) SELECT x, v FROM c;
WITH RECURSIVE c(x,v) AS (
  VALUES(-1,'0.5')
  UNION ALL
  SELECT x-1, decimal_mul(v,'0.5') FROM c WHERE x-1&gt;=-1075
) INSERT INTO pow2(x,v) SELECT x, v FROM c;

-- This query finds the decimal representation of each value in the "c" table.
WITH c(n) AS (VALUES(47.49))
                 ----XXXXX----------- Replace with whatever you want
SELECT decimal_mul(ieee754_mantissa(c.n),pow2.v)
  FROM pow2, c WHERE pow2.x=ieee754_exponent(c.n);

This page last modified on  2022-11-21 14:37:06 UTCfloatingpoint.html#techniques
—H
—ˆt’€Y     5+o;SQLite Archive Files1. IntroductionAn "SQLite Archive" is a file container similar to a 
ZIP archive or
Tarball but
based on an SQLite database.


An SQLite Archive is an ordinary SQLite database file that contains the
following table as part of its schema:

CREATE TABLE sqlar(
  name TEXT PRIMARY KEY,  -- name of the file
  mode INT,               -- access permissions
  mtime INT,              -- last modification time
  sz INT,                 -- original file size
  data BLOB               -- compressed content
);



Each row of the SQLAR table holds the content of a single file.
The filename (the full pathname relative to the root of the archive)
is in the "name" field.
The "mode" field is an integer which is the unix-style access permissions
for the file.  "mtime" is the modification time of the file in seconds
since 1970.  "sz" is the original uncompressed size of the file.
The "data" field contains the file content.  The content is usually
compressed using Deflate, though not always.  If the
"sz" field is equal to the size of the "data" field, then the content
is stored uncompressed.sqlar.html#introduction‚3‘ÙT     9-ƒaAIndexes On Expressions3. CompatibilityThe ability to index expressions was added to SQLite with 
version 3.9.0 (2015-10-14).  A database that uses an index on
expressions will not be usable by earlier versions of SQLite.
This page last modified on  2022-01-20 21:38:08 UTCexpridx.html#compatibility‰3‘ÙS      9+‘e?Indexes On Expressions2. RestrictionsThere are certain reasonable restrictions on expressions that appear in
CREATE INDEX statements:



Expressions in CREATE INDEX statements
may only refer to columns of the table being indexed, not to
columns in other tables.


Expressions in CREATE INDEX statements
may contain function calls, but only to functions whose output
is always determined completely by its input parameters (a.k.a.:
deterministic functions).  Obviously, functions like random() will not
work well in an index.  But also functions like sqlite_version(), though
they are constant across any one database connection, are not constant
across the life of the underlying database file, and hence may not be
used in a CREATE INDEX statement.


Note that application-defined SQL functions are by default considered
non-deterministic and may not be used in a CREATE INDEX statement unless
the SQLITE_DETERMINISTIC flag is used when the function is registered.


Expressions in CREATE INDEX statements may not use subqueries.


Expressions may only be used in CREATE INDEX statements, not within
UNIQUE or PRIMARY KEY constraints within the CREATE TABLE statement.expridx.html#restrictions
'
       'b’€\       5Mž]SQLite Archive Files2. Advantages Of SQLite ArchivesAn SQLite Archive is flexible.
ZIP Archives and Tarballs are limited to storing only files.  An
SQLite Archive stores files plus whatever other tabular
and/or relational data seems useful to the application.


An SQLite Archive is transactional.
Updates are atomic and durable, even if there are crashes
or power losses in the middle of the update.
Readers see a consistent and unchanging version of the content even
is some other process is simultaneously updating the archive.


An SQLite Archive can be updated incrementally.
Individual files can be added or removed or replaced without having
to rewrite the entire archive.


An SQLite Archive can be queried using a high-level query language (SQL).
Some examples:

 What is the total size of all files in the archive whose names
     end in ".h" or ".cpp"?
 What percentage of the files are compressed by less than 25%?
 How many executable files are in the archive?

Questions like these (and countless others) can be answered without
having to uncompress or extract any content.


Applications that already use SQLite for other purposes can easily
add support for SQLite Archives using a small extension
(https://sqlite.org/src/file/ext/misc/sqlar.c) to handle the compression
and decompression of content.  Even this tiny extension can be omitted
if the files in the archive are uncompressed.  In contrast, supporting
ZIP Archives and/or Tarballs requires either separate libraries or
lots of extra custom code, or sometimes both.


An SQLite Archive can work around firewall-imposed censorship.
For example, certain file types that are considered "dangerous" 
(examples: DLLs) will be
blocked by Gmail
and probably many other email services and firewalls, even if the
files are wrapped inside a ZIP Archive or Tarball.
But these firewalls usually do not (yet) know about SQLite Archives and
so content can be put inside an SQLite Archive to evade censorship.sqlar.html#advantages_of_sqlite_archives‚    ’€[     5[‚=gSQLite Archive Files1.2. Applications Using SQLite ArchivesThe Fossil Distributed Version Control system
provides users with the option to download check-ins as either Tarballs,
ZIP Archives, or SQLite Archives.sqlar.html#applications_using_sqlite_archives‹_’€Z     5O–[SQLite Archive Files1.1. Database As Container ObjectAn SQLite Archive is one example of a more general
idea that an SQLite database can behave as a container object holding
lots of smaller data components.


With client/server databases like PostgreSQL or Oracle, users and
developers tend to think of the database as a service or a "node", not
as an object.  This is because the database content is spread out across
multiple files on the server, or possibly across multiple servers in a
service cluster.  One cannot point to a single file or even a single
directory and say "this is the database".


SQLite, in contrast, stores all content in a single file on disk.
That single file is something you can point to and say
"this is the database".  It behaves as an object.
An SQLite database file can be copied, renamed, sent as an
email attachment, passed as the argument a POST HTTP request,
or otherwise treated as other data object such as an image,
document, or media file.


Studies show that many applications already use
SQLite as a container object.  For example,
Kennedy
(no relation to the SQLite developer) reports that 14% of
Android applications never write to their SQLite databases.  It is
believed that these applications are downloading entire databases
from the cloud and then using the information locally as needed.  In other
words, the applications are using SQLite not so much as a database but as
a queryable wire-transfer format.sqlar.html#database_as_container_object
0
<30ƒ~’€_   5G†OSSQLite Archive Files4.1. Other command-line toolsJust as there is the "zip" program to manage ZIP Archives, and the
"tar" program to manage Tarballs, the 
"sqlar" program exists to manage SQL Archives.
The "sqlar" program is able to create a new SQLite Archive, list the
content of an existing archive, add or remove files from the archive,
and/or extract files from the archive.
A separate "sqlarfs" program is able to mount the SQLite Archive as
a Fuse Filesystem.sqlar.html#other_command_line_toolsŠ’€^
5s‘}SQLite Archive Files4. Managing An SQLite Archive From The Command-LineThe recommended way of creating, updating, listing, and extracting
an SQLite Archive is to use the sqlite3.exe command-line shell 
for SQLite version 3.23.0 (2018-04-02) or later.  This CLI
supports the -A command-line option that allows easy management
of SQLite Archives.
The CLI for SQLite version 3.22.0 (2018-01-22) has the
.archive command for managing SQLite Archives, but that requires
interacting with the shell.


To list all of the files in an SQLite Archive named "example.sqlar"
using one of these commands:

sqlite3 example.sqlar -At
sqlite3 example.sqlar -Atv



To extract all files from an SQLite Archive named "example.sqlar":

sqlite3 example.sqlar -Ax



To create a new SQLite Archive named "alltxt.sqlar" containing all *.txt
files in the current directory:

sqlite3 alltxt.sqlar -Ac *.txt



To add or update files in an existing SQLite Archive:

sqlite3 example.sqlar -Au *.md



For usage hints and a summary of all options, simply give the CLI
the -A option with no additional arguments:

sqlite3 -A



All of these commands work the same way if the filename argument is
is a ZIP Archive instead of an SQLite database.sqlar.html#managing_an_sqlite_archive_from_the_command_line‹?’€] 5S•5cSQLite Archive Files3. Disadvantages Of SQLite ArchivesThe SQLite Archive is a relatively new format.  It was first described in
in 2014.  ZIP Archives and Tarballs, on the other hand, have been around
for decades and are well-entrenched as standard formats.  Most programmers
know what a ZIP Archive or Tarball is, but if you say "SQLite Archive" you
are more likely to get a reply of "What?"  Tooling to process ZIP Archives
and Tarballs is more likely to be installed on stock computers.


Since an SQLite database is a more general format (it is designed to do
much more than simply store a bunch of files) it is not as compact as either
the ZIP Archive or Tarball formats.  An SQLite Archive is usually about 1%
larger than the equivalent ZIP Archive.  Tarballs are compressed as a single
unit rather than compressing each file separately as is done by both
SQLite and ZIP Archives.  For these reason, Tarballs tend to be smaller
than either ZIP or SQLite Archives.

As an example, the following table show the relative sizes for an
SQLite Archive, a ZIP Archive, and a Tarball of the 1,743 files
in the SQLite 3.22.0 source tree:

  SQLite Archive10,754,048
  ZIP Archive (using Info-ZIP 3.0)10,662,365
  ZIP Archive (using zipfile)10,390,215
  Tarball&#x2007;9,781,109



An SQLite Archive supports only the Deflate compression
method.  Tarballs and ZIP Archive support a wider assortment of
compression methods.sqlar.html#disadvantages_of_sqlite_archives
-üÝ-…+’ˆB      Q_ˆ]kThe Lemon LALR(1) Parser Generator1.1. Lemon Source Files And DocumentationLemon does not have its own source repository.  Rather, Lemon consists
of a few files in the SQLite source tree:



     lemon.html &rarr;
     The original detailed usage documentation and programmers reference
     for Lemon.

     lemon.c &rarr; The source code
     for the utility program that reads a grammar file and generates 
     corresponding parser C-code.

     lempar.c &rarr; A template
     for the generated parser C-code.  The "lemon" utility program reads this
     template and inserts additional code in order to generate a parser.lemon.html#lemon_source_files_and_documentation‚’ˆA    Q#ƒ/3The Lemon LALR(1) Parser Generator1. OverviewThe SQL language parser for SQLite is generated using a code-generator
program called "Lemon".  The Lemon program reads a grammar of the input
language and emits C-code to implement a parser for that language.lemon.html#overview‘’€`      5o¡}SQLite Archive Files5. Managing SQLite Archives From Application CodeApplications can easily read or write SQLite Archives by linking against
SQLite and including the 
ext/misc/sqlar.c extension
to handle the compression and decompression.  The sqlar.c extension
creates two new SQL functions.


sqlar_compress(X)

The sqlar_compress(X) function attempts to compress a copy of the
string or blob X using the Default algorithm and
returns the result as a blob.  If the input X is incompressible, then
a copy of X is returned.  This routine is used when inserting content
into an SQLite Archive.
sqlar_uncompress(Y,SZ)

The sqlar_uncompress(Y,SZ) function will undo the compression accomplished
by sqlar_compress(X).  The Y parameter is the compressed content (the output
from a prior call to sqlar_compress()) and SZ is the original uncompressed
size of the input X that generated Y.  If SZ is less than or equal to the
size of Y, that indicates that no compression occurred, and so
sqlar_uncompress(Y,SZ) returns a copy of Y.  Otherwise, sqlar_uncompress(Y,SZ)
runs the Inflate algorithm on Y to uncompress it and restore it to its
original form and returns the uncompressed content.
This routine is used when extracting content from an SQLite Archive.



Using the two routines above, it is simple for applications to insert
new records into or extract existing records from an SQLite Archive.
Insert a new into an SQLite Archive using code like this:

INSERT INTO sqlar(name,mode,mtime,sz,data)
 VALUES ($name,$mode,strftime('%s',$mtime),
         length($content),sqlar_compress($content));



Extract an entry from the SQLite Archive using code like this:

SELECT name, mode, datetime(mtime,'unixepoch'), sqlar_uncompress(data,sz)
  FROM sqlar
 WHERE ...;



The code above is for the general case.  For the special case of an
SQLite Archive that only stores uncompressed or uncompressible content
(this might come up, for example, in an SQLite Archive that stores only
JPEG, GIF, and/or PNG images) then the content can be inserted into
and extracted from the database without using the sqlar_compress()
and sqlar_uncompress() functions, and the sqlar.c extension is not
required.
This page last modified on  2020-12-02 18:42:06 UTCsqlar.html#managing_sqlite_archives_from_application_code
       …—    …„
’ˆD    QK†IWThe Lemon LALR(1) Parser Generator2.1. Use of Lemon Within SQLiteLemon is used in two places in SQLite.

The primary use of Lemon is to create the SQL language parser.
A grammar file (parse.y) is
compiled by Lemon into parse.c and parse.h.  The parse.c file is
incorporated into the amalgamation without further modification.

Lemon is also used to generate the parser for the query pattern
expressions in the FTS5 extension.  In this case, the input grammar
file is fts5parse.y.lemon.html#use_of_lemon_within_sqliteˆd’ˆC  Q9IThe Lemon LALR(1) Parser Generator2. Advantages of LemonLemon generates an LALR(1) parser.  Its operation is similar to the
more familiar tools Yacc and
Bison, but Lemon adds important
improvements, including:



     The grammar syntax is less error prone - using symbolic names for
     semantic values rather that the "$1"-style positional notation
     of Yacc.

     In Lemon, the tokenizer calls the parser.  Yacc operates the other
     way around, with the parser calling the tokenizer.  The Lemon
     approach is reentrant and threadsafe, whereas Yacc uses global 
     variables and is therefore neither.  Reentrancy is especially
     important for SQLite since some SQL statements make recursive calls
     to the parser.  For example, when parsing a CREATE TABLE statement,
     SQLite invokes the parser recursively to generate an INSERT statement
     to make a new entry in the sqlite_schema table.

     Lemon has the concept of a non-terminal destructor that can be
     used to reclaim memory or other resources following a syntax error
     or other aborted parse.lemon.html#advantages_of_lemon
þ'þˆ$’ˆF   Q3#CThe Lemon LALR(1) Parser Generator3. History Of LemonLemon was originally written by D. Richard Hipp (also the creator of SQLite)
while he was in graduate school at Duke University between 1987 and 1992.
The original creation date of Lemon has been lost, but was probably sometime
around 1990.  Lemon generates an LALR(1) parser.  There was a companion 
LL(1) parser generator tool named "Lime", but the source code for Lime
has been lost.

The Lemon source code was originally written as separate source files,
and only later merged into a single "lemon.c" source file.

The author of Lemon and SQLite (Hipp) reports that his C programming
skills were greatly enhanced by studying John Ousterhout's original
source code to Tcl.  Hipp discovered and studied Tcl in 1993.  Lemon
was written before then, and SQLite afterwards.  There is a clear
difference in the coding styles of these two products, with SQLite seeming
to be cleaner, more readable, and easier to maintain.
This page last modified on  2021-08-21 20:50:48 UTClemon.html#history_of_lemon•T’ˆE     Qk©wThe Lemon LALR(1) Parser Generator2.2. Lemon Customizations Especially For SQLiteOne of the advantages of hosting code generator tools as part of
the project is that the tools can be optimized to serve specific needs of
the overall project.  Lemon has benefited from this effect. Over the years,
the Lemon parser generator has been extended and enhanced to provide
new capabilities and improved performance to SQLite.  A few of the
specific enhancements to Lemon that are specifically designed for use
by SQLite include:



Lemon has the concept of a "fallback" token.
The SQL language contains a large number of keywords and these keywords
have the potential to collide with identifier names.
Lemon has the ability to designate some keywords as being able to
"fallback" to an identifier.  If the keyword appears in the input token
stream in a context that would otherwise be a syntax error, the token
is automatically transformed into its fallback before the syntax error
is raised.  This feature allows the parser to be very forgiving of
reserved words used as identifiers, which is a problem that comes up
frequently in the SQL language.


In support of the 100% MC/DC testing goal for SQLite, 
the parser code generated by Lemon has no unreachable branches,
and contains extra (compile-time selected) instrumentation useful
for measuring test coverage.


Lemon supports conditional compilation of grammar file rules, so that
a different parser can be generated depending on compile-time options.


As a performance optimization, reduce actions in the Lemon input grammar
are allowed to contain comments of the form "/*A-overwrites-Z*/" to indicate
that the semantic value "A" on the right-hand side of the rule is allowed
to directly overwrite the semantic value "Z" on the left-hand side.
This simple optimization reduces the number of stack operations in the
push-down automaton used to parse the input grammar, and thus improve
performance of the parser.  It also makes the generated code a little smaller.


The parsing of SQL statements is a significant consumer of CPU cycles 
in any SQL database engine.  On-going efforts to optimize SQLite have caused
the developers to spend a lot of time tweaking Lemon to generate faster
parsers.  These efforts have benefited all users of the Lemon parser generator,
not just SQLite.  But if Lemon had been a separately maintained tool, it
would have been more difficult to make coordinated changes to both SQLite
and Lemon, and as a result not as much optimization would have been
accomplished.  Hence, the fact that the parser generator tool is included
in the source tree for SQLite has turned out to be a net benefit for both
the tool itself and for SQLite.lemon.html#lemon_customizations_especially_for_sqlite
¤
:  ﯞ¤…u’Îi  G#Šq1The SQLITE_STMT Virtual Table1. OverviewThe SQLITE_STMT extension implements an eponymous-only virtual table that
provides information about all prepared statements associated with
the database connection.



The SQLITE_STMT extension is included in the amalgamation though 
it is disabled
by default.  Use the SQLITE_ENABLE_STMTVTAB compile-time option to enable
the SQLITE_STMT extension.  The SQLITE_STMT extension can also be 
loaded at run-time
by compiling the extension into a shared library or DLL using the source
code at https://sqlite.org/src/file/ext/misc/stmt.c and following the
instructions for how to compile loadable extensions.



The SQLITE_STMT extension is enabled in default builds
of the command-line shell.stmt.html#overview„’¿       ?e†{NUL Characters In Strings4. Removing NUL Characters From A Text FieldThe following example shows how to remove NUL character, and all text
that follows, from a column of a table.  So if you have a database file
that contains embedded NULs and you would like to remove them, running
UPDATE statements similar to the following might help:

UPDATE t1 SET b=substr(b,1,instr(b,char(0)))
 WHERE instr(b,char(0));

This page last modified on  2022-05-23 22:21:54 UTCnulinstr.html#removing_nul_characters_from_a_text_field†;’¿
?ŠCNUL Characters In Strings3. How To Tell If You Have NUL Characters In Your StringsIf you CAST a string into a BLOB, then the entire length of the
string is shown.  For example:

SELECT a, CAST(b AS BLOB) FROM t1;



Gives this result:

1,X'6162630078797a'



In the BLOB output, you can clearly see the NUL character as the 4th
character in the 7-character string.


Another, more automated, way
to tell if a string value X contains embedded NUL characters is to
use an expression like this:

instr(X,char(0))



If this expression returns a non-zero value N, then there exists an 
embedded NUL at the N-th character position.  Thus to count the number
of rows that contain embedded NUL characters:

SELECT count(*) FROM t1 WHERE instr(b,char(0))>0;nulinstr.html#how_to_tell_if_you_have_nul_characters_in_your_strings†F’¿      ?9‹gONUL Characters In Strings2. Unexpected BehaviorConsider the following SQL:

CREATE TABLE t1(
  a INTEGER PRIMARY KEY,
  b TEXT
);
INSERT INTO t1(a,b) VALUES(1, 'abc'||char(0)||'xyz');

SELECT a, b, length(b) FROM t1;



The SELECT statement above shows output of:

1,'abc',3



(Through this document, we assume that the CLI has ".mode quote" set.)
But if you run:

SELECT * FROM t1 WHERE b='abc';



Then no rows are returned.  SQLite knows that the t1.b column actually
holds a 7-character string, and the 7-character string 'abc'||char(0)||'xyz'
is not equal to the 3-character string 'abc', and so no rows are returned.
But a user might be easily confused by this because the CLI output
seems to show that the string has only 3 characters.  This seems like
a bug.  But it is how SQLite works.nulinstr.html#unexpected_behavior…A’¿       ?+‰yANUL Characters In Strings1. IntroductionSQLite allows NUL characters (ASCII 0x00, Unicode \u0000) in the middle
of string values stored in the database.  However, the use of NUL within
strings can lead to surprising behaviors:



The length() SQL function only counts characters up to and excluding
the first NUL.



The quote() SQL function only shows characters up to and excluding
the first NUL.


The .dump command in the CLI omits the first NUL character and all
subsequent text in the SQL output that it generates.  In fact, the
CLI omits everything past the first NUL character in all contexts.



The use of NUL characters in SQL text strings is not recommended.nulinstr.html#introduction
µµ†F’Îj     GŒ+The SQLITE_STMT Virtual Table2. UsageThe SQLITE_STMT virtual table is a read-only table that can be directly
queried to access information about all prepared statements on the 
current database connection.  For example:

SELECT * FROM sqlite_stmt;



A statement such as the above can be run immediately prior to invoking
sqlite3_close() to confirm that all prepared statements have been 
finalized and to help identify and track down prepared
statements that have "leaked" and missed finalization.


The SQLITE_STMT virtual table can also be used to access performance
information about prepared statements, to aid in optimization an application.
For example,
to find out how much memory is being used by prepared statements that have
never been used, one could run:

SELECT sum(mem) FROM sqlite_stmt WHERE run=0;stmt.html#usage
?–?‚R’ÖQ        Y#„
=The COMPLETION() Table-Valued Function1. OverviewThe COMPLETION extension implements a table-valued function named
"completion" that can be used to suggest completions of partially entered
words during interactive SQL input.  The completion table can be
used to help implement tab-completion, for example.completion.html#overviewše’Îk        G%´Q/The SQLITE_STMT Virtual Table2.1. ColumnsThe columns are provided by the SQLITE_STMT virtual table are summarized by
the hypothetical CREATE TABLE statement show here:

CREATE TABLE sqlite_stmt(
  sql    TEXT,    -- Original SQL text
  ncol   INT,     -- Number of output columns
  ro     BOOLEAN, -- True for "read only" statements
  busy   BOOLEAN, -- True if the statement is current running
  nscan  INT,     -- Number of full-scan steps
  nsort  INT,     -- Number of sort operations
  naidx  INT,     -- Number of automatic index inserts
  nstep  INT,     -- Number of byte-code engine steps
  reprep INT,     -- Number of reprepare operations
  run    INT,     -- Number of times this statement has been run
  mem    INT      -- Heap memory used by this statement
);


Future releases may add new output columns and may change the order
of legacy columns.
Further detail about the meaning of each column in the SQLITE_STMT virtual
table is provided below:


sql:
The original SQL text of the prepared statement.  If the prepared
statement is compiled using the sqlite3_prepare() interface, then
the SQL text might not have been saved, in which case this column
will be NULL.

ncol:
The number of columns in the result set of a query.
For DML statements, this column has a value of 0.

ro:
The "read only" column.  This column is true (non-zero) if the
SQL statement is a query and false (zero) if it is a DML statement.

busy:
This field is true if the prepared statement is currently running.
In other words, this field is true if sqlite3_step() has been called
on the prepared statement at least once but sqlite3_reset() has
not yet been called to reset it.

nscan:
This field is the number of times that the bytecode engine has stepped
through a table as part of a full-table scan.  A large number if this
field may indicate an opportunity to improve performance by adding an
index.  This field is equivalent to the SQLITE_STMTSTATUS_FULLSCAN_STEP
value.

nsort:
This field is the number of times that the bytecode engine had to sort.
A positive value in this field may indicate an opportunity to improve
performance by adding an index that will cause the query results to
appear naturally in the desired order.  
This field is equivalent to the SQLITE_STMTSTATUS_SORT value.

naidx:
This field is the number of rows that have been inserted into
automatic indexes.  A positive value in this field may indicate 
an opportunity to improve performance by adding a named index that
take the place of the automatic index.
This field is equivalent to the SQLITE_STMTSTATUS_AUTOINDEX value.

nstep:
This field is the number of bytecode engine operations that have
been performed for the prepared statement.  This field can be used
as a proxy for how much CPU time a statement has used.
This field is equivalent to the SQLITE_STMTSTATUS_VM_STEP value.

reprep:
This field is the number of times that the statement has had to be
reprepared due to schema changes or changes to parameter bindings.
This field is equivalent to the SQLITE_STMTSTATUS_REPREPARE value.

run:
This field is the number of times that the statement has been run.
This field is equivalent to the SQLITE_STMTSTATUS_RUN value.

mem:
This field is the number of bytes of heap storage used by the
prepared statement.
This field is equivalent to the SQLITE_STMTSTATUS_MEMUSED value.

This page last modified on  2017-07-14 15:38:02 UTCstmt.html#columns
›^  l_›†n’î
        +!Œ{7Imposter Tables2. DetailsEach table and each index in SQLite is stored in a separate b-tree
in the database file.  Each b-tree is identified by its root page
number.  The root page number for any index or table can be found
by querying the "rootpage" column of the sqlite_schema table.
See the indexing tutorial and the file format documentation
for further background on this design.



Usually the b-trees for tables and indexes are slightly different.
A table b-tree contains a 64-bit integer key and arbitrary data.
The 64-bit integer key is the ROWID.  Index b-trees contain
an arbitrary binary key and no data.  So table b-trees and index
b-trees are not directly compatible.



However, the b-tree for a WITHOUT ROWID table is in the same format
as an index b-tree.  Thus, an index b-tree can be accessed as if it
were a WITHOUT ROWID table.imposter.html#details„L’î            ++ˆ#AImposter Tables1. IntroductionAn imposter table is a table that is attached to the same b-tree
as an index.
An imposter table allows the content of an index to be queried or
modified as if the index were an ordinary table.



Imposter tables are intended for analysis and debugging only.
This is not a feature that most application developers should understand
or even know about.
Imposter tables are for experts only.



Improper use of imposter tables can cause index corruption, though
any corruption created this way can be fixed by running REINDEX.imposter.html#introduction’ÖT   Y)ŠmCThe COMPLETION() Table-Valued Function3. LimitationsThe completion table is designed for interactive use.  It will return
answers at a speed appropriate for human typing.  No effort is made to
be unusually efficient, so long as the response time is nearly instantaneous
in a user interface.

As of this writing (2017-07-13), the completion virtual table only
looks for SQL keywords, and schema, table, and column names.  The
context contained in $wholeline is completely ignored.  Future enhancements
will try to return new completions taken from function and pragma names
and other sources, as well as consider more context.  The completion
table should be considered a work-in-progress.
This page last modified on  2017-07-14 03:53:46 UTCcompletion.html#limitations…m’ÖS     Y1Š+GThe COMPLETION() Table-Valued Function2.1. Example UsageThe completion table is used to implement tab-completion in the
command-line shell in conjunction with either the readline or linenoise
input line editing packages for unix.  See the
https://sqlite.org/src/file/src/shell.c.in source file for example
code.  Search for "FROM completion" to find the relevant code sections.

Because the completion table is built into the command-line shell in order
to provide for tab-completions, you can run test queries against the
completion table directly in the command-line shell.  Simply type a
query such as the example shown above, filling in appropriate values
for $prefix and $wholeline, and observe the output.completion.html#example_usage‡’ÖR   Y!';The COMPLETION() Table-Valued Function2. DetailsThe designed query interface is:

SELECT DISTINCT candidate COLLATE nocase
  FROM completion($prefix, $wholeline)
 ORDER BY 1;


The query above will return suggestions for the whole input word that
begins with $prefix.  The $wholeline parameter is all text from the beginning
of the line up to the insertion point.  The $wholeline parameter is used
for context.

The $prefix parameter may be NULL, in which case the prefix is deduced
from $wholeline.  Or, the $wholeline parameter may be NULL or omitted if 
context information is unavailable or if context-aware completion is not
desired.

The completion table might return the same candidate more than once, and
it will return candidates in an arbitrary order.  The DISTINCT keyword and
the ORDER BY in the sample query above are added to make the answers unique
and in lexicographical order.completion.html#details
c
:c‡R’î      +?ŽMImposter Tables2.1.1. Corrupted DatabaseA serious problem with the manual imposter table approach described above
is that after adding the new "t2" entry to the "sqlite_schema" table, the
database file will technically be corrupt.  Both the "t1bc" index and the
"t2" table will point to the same b-tree.  This will not cause
any immediate problems, though one should avoid running VACUUM.



It is possible to write into the "t2" table, thus changing the content
of the index.
But doing so will get the "t1bc" index out of synchronization with its
parent table "t1".  An out-of-sync index can result in incorrect query
results.



Since the "t2" imposter table is a form of database corruption, the
manual approach to creating imposter tables is not recommended.
Actually, any use of imposter tables is discouraged for all but
expert developers, but manually created imposter tables are
especially discouraged because they are permanent.imposter.html#corrupted_database‹A’î +W•9iImposter Tables2.1. Manually Created Imposter TablesOne way to create an imposter table is to directly edit the sqlite_schema
table to insert a new row that describes the table.
For example, suppose the schema is like this:


CREATE TABLE t1(a INTEGER PRIMARY KEY,b TEXT,c INT, d INT);
CREATE INDEX t1bc ON t1(b,c);



The WITHOUT ROWID table that has the same structure as the t1bc index
would look like this:


CREATE TABLE t2(b TEXT,c INT,a INT, PRIMARY KEY(b,c,a)) WITHOUT ROWID;



To create a permanent imposter table "t2" against index "t1bc" one
should first enable editing of the sqlite_schema table by running
"PRAGMA writable_schema=ON".
(Be careful to observe the warnings that accompany this PRAGMA.
A mistake can cause severe database corruption.)
Then insert a new entry into the sqlite_schema table like this:


INSERT INTO sqlite_schema(type,name,tbl_name,rootpage,sql)
 SELECT 'table','t2','t2',rootpage,
   'CREATE TABLE t2(b,c,a,PRIMARY KEY(b,c,a))WITHOUT ROWID'
   FROM sqlite_schema
  WHERE name='t1bc';



The INSERT statement above adds a new row to the sqlite_schema table that
defines a table "t2" having the same on-disk format as index "t1bc" and 
pointing to the same b-tree.
After adding this sqlite_schema table entry, it is necessary to close and
reopen the database in order to get SQLite to reread the schema.
Then the "t2" table can be queried to see the content of the "t1bc" index.imposter.html#manually_created_imposter_tables
ÙƒI’î        +E…i[Imposter Tables3. Summary And Final WarningThe imposter table mechanism is a power analysis and debugging tool
for SQLite.  But as with all sharp tools, it can also be dangerous and
can result in corrupt database files if misused.  Do not attempt to
use imposter tables in an application.  Imposter tables are intended
for use in the laboratory by experts.

This page last modified on  2020-06-18 21:18:56 UTCimposter.html#summary_and_final_warning†;’î +M‹C]Imposter Tables2.3. The .imposter Shell CommandAs of SQLite 3.16.0 (2017-01-02), the command-line shell contains
a dot-command ".imposter" that does all of the work of setting up a
transient imposter table.
Instead of making multiple calls to sqlite3_test_control() and figuring
out and invoking a compatible CREATE TABLE statement, a transient
imposter table can be constructed as follows:


.imposter t1bc t2



Of course, substitute the desired index and imposter table names in
place of the "t1bc" and "t2" shown in the example.
The ".imposter" command reads the schema of the "t1bc" index, uses
that information to construct a compatible CREATE TABLE statement for
the imposter table, then makes all the necessary calls to create the
transient imposter table automatically.imposter.html#the_imposter_shell_command“b’î
    +I¦[Imposter Tables2.2. Transient Imposter TablesAnother (safer) approach to creating an imposter table is to add an
entry for the imposter table to SQLite's internal symbol table without
updating the "sqlite_schema" table on disk.
That way, the imposter table exists in only a single database connection
and is automatically removed whenever the schema is reloaded.



Creation of a transient imposter table involves a special
sqlite3_test_control() call.  Unlike all other SQLite APIs,
sqlite3_test_control() interface is subject to incompatible changes
from one release to the next, and so the mechanism described below
is not guaranteed to work in future releases of SQLite.  The
SQLite developers do not consider this a problem because imposter
tables should not be used in applications.  Imposter tables are for
analysis and testing use only.



To create a transient imposter table, first call sqlite3_test_control()
as follows:


sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, "main", 1, tnum);



The "db" parameter is a pointer to the database connection.
The "main" argument is the name of the schema in which the imposter
table is to be created.  The "1" argument enables the imposter table
mechanism.  "tnum" is the root page of the index that the imposter
table should mirror.



After the sqlite3_test_control() call above, then run a CREATE TABLE
statement the defines the imposter table.
With the imposter mechanism enabled, this CREATE TABLE statement does
not create a real table but instead merely adds an entry in SQLite's
internal symbol table.  Note that the CREATE TABLE statement must
be in the correct format for the index.  If the imposter table has the
wrong number of columns or is not a WITHOUT ROWID table or is otherwise
incompatible with the index b-tree, then SQLITE_CORRUPT errors will result
when the imposter table is used.



After running the CREATE TABLE statement, disable the imposter mechanism
as follows:


sqlite3_test_control(SQLITE_TESTCTRL_IMPOSTER, db, "main", 0, 0);



In other words, make the same sqlite3_test_control() call except change
the last two parameters to zero.



After the imposter table is loaded into SQLite's internal schema as
described above, the imposter table can be used as any other table.
But the imposter table will only be visible to the one database
connection that created it.  No changes are made to the database file
on disk.  And the imposter table will disappear the next time the schema 
is loaded.imposter.html#transient_imposter_tables
kŠe’õr 7%”_1The CSV Virtual Table2. ArgumentsThe example above showed a single filename='thefile.csv' argument
for the CSV virtual table.  But other arguments are also possible.


filename=FILENAME
The filename= argument specifies an external file from which
CSV content is read.  Every CSV virtual table must have either a 
filename= argument or a data= argument and not both.

data=TEXT
The data= argument specifies that TEXT is the literal
content of the CSV file.

schema=SCHEMA
 The schema= argument specifies a CREATE TABLE statement that
the CSV virtual table passes to the sqlite3_declare_vtab() interface in
order to define the names of the columns in the virtual table.

columns=N
The columns=N argument specifies the number of columns
in the CSV file.
If the input data contains more columns than this,
then the excess columns are ignored.  If the input data contains fewer columns,
then extra columns are filled with NULL.
If the columns=N argument is omitted, the first line of the
CSV file is read to determine the number of columns.

header=BOOLEAN
or just
header
If the header argument is true then the first row of the CSV file
to be treated as a header rather than as data.  The second line of the CSV
file becomes the first row of content.
If the schema= options is omitted, then the first line of the CSV
file determines the names of the columns.csv.html#arguments“’õq        7#¥9/The CSV Virtual Table1. OverviewThe CSV virtual table reads
RFC 4180 formatted comma-separated
values, and returns that content as if it were rows and columns of an SQL
table.



The CSV virtual table is useful to applications that need to bulk-load
large amounts of comma-separated value content.
The CSV virtual table is also useful as a template source file for
implementing other virtual tables.




The CSV virtual table is not built into the SQLite amalgamation.
It is available as a
separate source file
that can be compiled into a loadable extension.
Typical usage of the CSV virtual table from the
command-line shell would be something like this:

.load ./csv
CREATE VIRTUAL TABLE temp.t1 USING csv(filename='thefile.csv');
SELECT * FROM t1;



The first line of the script above causes the command-line shell to
read and activate the run-time loadable extension for CSV.  For an
application, the equivalent C-language API is
sqlite3_load_extension().
Observe that the filename extension (ex: ".dll" or ".so" or ".dylib") is
omitted from the extension filename.  Omitting the filename extension is
not required, but it helps in making the script cross-platform.  SQLite
will automatically append the appropriate extension.


The second line above creates a virtual table named "t1" that reads
the content of the file named in the argument.  The number and names of
the columns is determined automatically by reading the first line of
content.  Other options to the CSV virtual table provide the ability to
take the CSV content from a string rather than a separate file, and give 
the programmer more control over the number and names of the columns.
The options are detailed below.  The CSV virtual table is usually
created as a TEMP table so that it exists only for the current database
connection and does not become a permanent part of the database schema.
Note that there is no "CREATE TEMP VIRTUAL TABLE" command in SQLite.
Instead, prepend the "temp." schema prefix to the name of the virtual
table.


The third line of the example shows the virtual table being used, to read
all content of the CSV file.  This is perhaps the simplest possible use
of the virtual table.  The CSV virtual table can be used anywhere an ordinary
virtual table can be used.  One can use the CSV virtual table inside subqueries,
or common table expressions or add WHERE, GROUP BY, HAVING, ORDER BY,
and LIMIT clauses as required.csv.html#overview
g2—g’+’ýZ    i-£#?Recovering Data From A Corrupt SQLite Database1.1. LimitationsIt is sometimes possible to perfectly restore a database that has
gone corrupt, but that is the exception.  Usually
the recovered database will be defective in a number of ways:



Some content might be permanently deleted and unrecoverable.
This can happen, for example, if a rogue process overwrites part
of the database file.


Previously deleted content might reappear.  Normally when SQLite
does a DELETE operation, it does not actually overwrite the old content
but instead remembers that space is available for reuse during the next
INSERT.  If such deleted content is still in the file when a recovery
is attempted, it might be extracted and "resurrected".


Recovered content might be altered.
For example, the value stored in a particular row
might change from 48 to 49.  Or it might change from an integer into
a string or blob.  A value that was NULL might become an integer.
A string value might become a BLOB.  And so forth.


Constraints may not be valid after recovery.  CHECK constraints, 
FOREIGN KEY constraints, UNIQUE constraints, type constraints on
STRICT tables - any of these might be violated in the recovered
database.


Content might be moved from one table into another.



The recovery API does as good of a job as it can at restoring a database,
but the results will always be suspect.  Sometimes (for example if the
corruption is restricted to indexes) the recovery will perfectly restore
the database content.  However in other cases, the recovery will be imperfect.
The impact of this imperfection depends on the application.  A database that
holds a list of bookmarks is still a list of bookmarks after recovery.
A few bookmarks might be missing or added or altered after recovery, but
the list is "fuzzy" and imperfect to begin with so adding a bit more
uncertainty will not be fatal to the application.  But if an accounting
database goes corrupt and is subsequently recovered, the books might be
out of balance.


It is best to think of the recovery API as a salvage undertaking.
Recovery will extract as much usable data as it can from the wreck
of the old database, but some parts may be damaged beyond repair and
some rework and testing should be performed prior to returning the
recovered database to service.recovery.html#limitations…’ýY
i}‡WRecovering Data From A Corrupt SQLite Database1. Recovering (Some) Data From A Corrupt SQLite DatabaseSQLite databases are remarkably rebust.  Application faults and
power failures typically leave the content of the database intact.
However, it is possible to corrupt an SQLite database.
For example, hardware malfunctions can damage the database file, or a
rogue process can open the database and overwrite parts of it.


Given a corrupt database file, it is sometimes desirable to try to
salvage as much data from the file as possible.  The recovery API
is designed to facilitate this.recovery.html#recovering_some_data_from_a_corrupt_sqlite_databaseƒI’õs   7+†7The CSV Virtual Table3. Column NamesThe column names of the virtual table are determined primarily by the
schema= argument.
If the schema= argument is omitted, but header is true, then
the values found in the first line of the CSV file become the column names.
If the schema= argument is omitted and header is false, then
the columns are named "c0", "c1", "c2", and so forth.
This page last modified on  2018-11-16 01:45:15 UTCcsv.html#column_names
         ˜_ Š:’ý]    iI“  [Recovering Data From A Corrupt SQLite Database3.2. How To Implement RecoveryThese are the basic steps needed to recover content from a corrupt
Database:



Creates an sqlite3_recover handle by calling either
sqlite3_recover_init() or sqlite3_recover_init_sql().
Use sqlite3_recover_init() to store the recovered content
in a separate database and use sqlite3_recover_init_sql()
to generate SQL text that will reconstruct the database.


Make zero or more calls to sqlite3_recover_config() to set
options on the new sqlite3_recovery handle.


Invoke sqlite3_recover_step() repeatedly
until it returns something other than SQLITE_OK. If it
returns SQLITE_DONE, then the recovery operation completed without 
error. If it returns some other non-SQLITE_OK value, then an error 
has occurred.  The sqlite3_recover_run() interface is also
available as a convenience wrapper that simply invokes
sqlite3_recover_step() repeatedly until it returns something other
than SQLITE_DONE.


Retrieves any error code and English language error message using the
sqlite3_recover_errcode() and sqlite3_recover_errmsg() interfaces,
respectively.


Invoke sqlite3_recover_finish() to destroy the sqlite3_recover object.



Details of the interface are described in comments in the
sqlite3_recover.h header file.recovery.html#how_to_implement_recovery†4’ý\      i9‹KRecovering Data From A Corrupt SQLite Database3.1. Source Code FilesIf you want to build the recovery API into your application, you will
need to add some source files to your build, above and beyond the usual
"sqlite3.c" and "sqlite3.h" source files.  You will need:






sqlite3recover.c

This is the main source file that implements the recovery API.





sqlite3recover.h

This is the header file that goes with sqlite3recover.h.





dbdata.c

This file implements two virtual tables name "sqlite_dbdata" and
"sqlite_dbptr" that required by sqlite3recover.c.






The two C source file above need to be linked into your application in the
same way as "sqlite3.c" is linked in.  And the header file needs to be
accessible to the compiler when the C files are being compiled.recovery.html#source_code_filesŒc’ý[
is—Recovering Data From A Corrupt SQLite Database2. Recovery Using The ".recover" Command In The CLIThe easiest way to manually recover a corrupt database is using
the Command Line Interface or "CLI" for SQLite.  The CLI is a program
named "sqlite3".  Use it to recover a corrupt database file using
a command similar to the following:

sqlite3 corrupt.db .recover &gt;data.sql



This will generate SQL text in the file named "data.sql" that can be used
to reconstruct the original database:

sqlite3 recovered.db &lt;data.sql



The ".recover" option is actually a command that is issued to the
CLI.  That command can accept arguments.  For example, by running:

sqlite3 corruptdb ".recover --ignore-freelist" &gt;data.sql



Notice that the ".recover" command and its arguments must be contained
in quotes.  The following options are supported:



--ignore-freelist

Ignore pages of the database that appear to be part of the
freelist.  Normally the freelist is scanned, and if it contains
pages that look like they have content, that content is output.
But if the page really is on the freelist, that can mean that
previously deleted information is reintroduced into the database.


--lost-and-found TABLE

If content is found during recovery that cannot be associated
with a particular table, it is put into the "lost_and_found"
table.  Use this option to change the name of the
"lost_and_found" table to "TABLE".


--no-rowids

If this option is provided, then rowid values that are not also
INTEGER PRIMARY KEY values are not extracted from the
corrupt database.recovery.html#recovery_using_the_recover_command_in_the_cli
Õ
ËyÕ†(“…D  u#‹=Clustered Indexes and the WITHOUT ROWID Optimization1.3. QuirksWITHOUT ROWID is found only in SQLite and is not compatible
with any other SQL database engine, as far as we know.
In an elegant system, all tables would behave as WITHOUT ROWID
tables even without the WITHOUT ROWID keyword.  However, when SQLite was
first designed, it used only integer rowids for row keys 
to simplify the implementation.
This approach worked well for many years.  But as the demands on
SQLite grew, the need for tables in which the PRIMARY KEY really did
correspond to the underlying row key grew more acute.  The WITHOUT ROWID
concept was added
in order to meet that need without breaking backwards
compatibility with the billions of SQLite databases already in use at
the time (circa 2013).withoutrowid.html#quirks‚r“…C     u1„KClustered Indexes and the WITHOUT ROWID Optimization1.2. CompatibilitySQLite version 3.8.2 (2013-12-06) or later 
is necessary in order to use a WITHOUT
ROWID table.  An attempt to open a database that contains one or more WITHOUT
ROWID tables using an earlier version of SQLite will result in a
"malformed database schema" error.withoutrowid.html#compatibility†5“…B  u#‹7=Clustered Indexes and the WITHOUT ROWID Optimization1.1. SyntaxTo create a WITHOUT ROWID table, simply add the keywords "WITHOUT ROWID"
to the end of the CREATE TABLE statement.  For example:


CREATE TABLE IF NOT EXISTS wordcount(
  word TEXT PRIMARY KEY,
  cnt INTEGER
) WITHOUT ROWID;


As with all SQL syntax, the case of the keywords does not matter.  
One can write "WITHOUT rowid" or "without rowid" or "WiThOuT rOwId" and
it will mean the same thing.

Every WITHOUT ROWID table must have a PRIMARY KEY.  An error is raised
if a CREATE TABLE statement with the WITHOUT ROWID clause lacks a PRIMARY KEY.

In most contexts, the special "rowid" column of normal tables can 
also be called "oid" or "_rowid_".  However, only "rowid" works as 
the keyword in the CREATE TABLE statement.withoutrowid.html#syntax„“…A u+†_IClustered Indexes and the WITHOUT ROWID Optimization1. IntroductionBy default, every row in SQLite has a special column, usually called the
"rowid", that uniquely identifies that row within the table.  However
if the phrase "WITHOUT ROWID" is added to the end of a CREATE TABLE statement,
then the special "rowid" column is omitted.  There are sometimes
space and performance advantages to omitting the rowid.

A WITHOUT ROWID table is a table that uses a 
Clustered Index
as the primary key.withoutrowid.html#introduction„0’ý^  iE†}WRecovering Data From A Corrupt SQLite Database3.3. Example ImplementationsExamples of how the recovery extension is used by SQLite itself
can be seen at the following links:


https://sqlite.org/src/info/30475c820dc5ab8a8?ln=999,1026

An example of the recovery extension found in the 
"fuzzcheck" testing utility in the SQLite tree.

https://sqlite.org/src/info/84bb08d8762920285f08f1c0?ln=7299,7361

The code that implements the ".recover" command in the CLI.

This page last modified on  2022-11-04 15:23:18 UTCrecovery.html#example_implementations
11™J“…E u_°e}Clustered Indexes and the WITHOUT ROWID Optimization2. Differences From Ordinary Rowid TablesThe WITHOUT ROWID syntax is an optimization.  It provides no new
capabilities.  Anything that can be done using a WITHOUT ROWID table
can also be done in exactly the same way, and exactly the same syntax,
using an ordinary rowid table.  The only advantage of a WITHOUT ROWID
table is that it can sometimes use less disk space and/or perform a little
faster than an ordinary rowid table.

For the most part, ordinary rowid tables and WITHOUT ROWID tables
are interchangeable.  But there are some additional restrictions on
WITHOUT ROWID tables that do not apply to ordinary rowid tables:



Every WITHOUT ROWID table must have a PRIMARY KEY.
An attempt to create a WITHOUT ROWID table without a PRIMARY KEY results
in an error.


The special behaviors associated "INTEGER PRIMARY KEY" do not apply
on WITHOUT ROWID tables.
In an ordinary table, "INTEGER PRIMARY KEY" means that the column is an
alias for the rowid.  But since there is no rowid in a WITHOUT ROWID
table, that special meaning no longer applies.  An "INTEGER PRIMARY KEY" 
column in a WITHOUT ROWID table works
like an "INT PRIMARY KEY" column in an ordinary table: It is a PRIMARY KEY
that has integer affinity.


AUTOINCREMENT does not work on WITHOUT ROWID tables.
The AUTOINCREMENT mechanism assumes the presence of a rowid and so it
does not work on a WITHOUT ROWID table.  An error is raised if the
 "AUTOINCREMENT" keyword is used in the CREATE TABLE statement for
a WITHOUT ROWID table.


NOT NULL is enforced on every column of the PRIMARY KEY in a WITHOUT
ROWID table.
This is in accordance with the SQL standard.  Each column of a PRIMARY KEY
is supposed to be individually NOT NULL.  However, NOT NULL was not enforced
on PRIMARY KEY columns by early versions of SQLite due to a bug.  By the
time that this bug was discovered, so many SQLite databases were already
in circulation that the decision was made not to fix this bug for fear of
breaking compatibility.  So, ordinary rowid tables in SQLite violate the
SQL standard and allow NULL values in PRIMARY KEY fields.  But WITHOUT ROWID
tables do follow the standard and will throw an error on any attempt to
insert a NULL into a PRIMARY KEY column.


The sqlite3_last_insert_rowid() function
does not work for WITHOUT ROWID tables.
Inserts into a WITHOUT ROWID do not change the value returned by the
sqlite3_last_insert_rowid() function.  The last_insert_rowid() SQL
function is also unaffected since it is just a wrapper around
sqlite3_last_insert_rowid().


The incremental blob I/O mechanism does not work
for WITHOUT ROWID tables.
Incremental BLOB I/O uses the rowid to create an sqlite3_blob object for
doing the direct I/O.  However, WITHOUT ROWID tables do not have a rowid,
and so there is no way to create an sqlite3_blob object for a WITHOUT
ROWID table.


The sqlite3_update_hook() interface does not fire callbacks for changes
to a WITHOUT ROWID table.
Part of the callback from sqlite3_update_hook() is the rowid of the table
row that has changed.  However, WITHOUT ROWID tables do not have a rowid.
Hence, the update hook is not invoked when a WITHOUT ROWID table changes.withoutrowid.html#differences_from_ordinary_rowid_tables
SS™(“…F      uS°9qClustered Indexes and the WITHOUT ROWID Optimization3. Benefits Of WITHOUT ROWID TablesA WITHOUT ROWID table is an optimization that can reduce storage and
processing requirements.

In an ordinary SQLite table, the PRIMARY KEY is really just a 
UNIQUE index.  The key used to look up records on disk
is the rowid.
The special "INTEGER PRIMARY KEY" column type in ordinary SQLite tables 
causes the column to be an alias for the rowid, and so an INTEGER PRIMARY
KEY is a true PRIMARY KEY.  But any other kind of PRIMARY KEYs, including
"INT PRIMARY KEY" are just unique indexes in an ordinary rowid table.

Consider a table (shown below) intended to store a
vocabulary of words together with a count of the number of occurrences of
each word in some text corpus:


CREATE TABLE IF NOT EXISTS wordcount(
  word TEXT PRIMARY KEY,
  cnt INTEGER
);


As an ordinary SQLite table, "wordcount" is implemented as two
separate B-Trees.  The main table uses the hidden rowid value as the key
and stores the "word" and "cnt" columns as data.  The "TEXT PRIMARY KEY"
phrase of the CREATE TABLE statement
causes the creation of an unique index on the "word" column.  This index is a
separate B-Tree that uses "word" and the "rowid" as the key and stores no
data at all.  Note that the complete text of every "word" is stored twice:
once in the main table and again in the index.

Consider querying this table to find the number of occurrences of the
word "xyzzy".:


SELECT cnt FROM wordcount WHERE word='xyzzy';


This query first has to search the index B-Tree looking for any entry
that contains the matching value for "word".  When an entry is found in
the index, the rowid is extracted and used to search the main table.
Then the "cnt" value is read out of the main table and returned.  Hence, two
separate binary searches are required to fulfill the request.

A WITHOUT ROWID table uses a different data design for the equivalent
table.


CREATE TABLE IF NOT EXISTS wordcount(
  word TEXT PRIMARY KEY,
  cnt INTEGER
) WITHOUT ROWID;


In this latter table, there is only a single B-Tree which uses the "word"
column as its key and the "cnt" column as its data.  (Technicality:  the
low-level implementation actually stores both "word" and "cnt" in the "key"
area of the B-Tree.  But unless you are looking at the low-level byte encoding
of the database file, that fact is unimportant.)  Because there is only
a single B-Tree, the text of the "word" column is only stored once in the
database.  Furthermore, querying the "cnt" value for a specific "word"
only involves a single binary search into the main B-Tree, since the "cnt"
value can be retrieved directly from the record found by that first search
and without the need to do a second binary search on the rowid.

Thus, in some cases, a WITHOUT ROWID table can use about half the amount
of disk space and can operate nearly twice as fast.  Of course, in a 
real-world schema, there will typically be secondary indices and/or
UNIQUE constraints, and the situation is more complicated.  But even then,
there can often be space and performance advantages to using WITHOUT ROWID
on tables that have non-integer or composite PRIMARY KEYs.withoutrowid.html#benefits_of_without_rowid_tables
èMè„+“œy       =%‡c3Why Is SQLite Coded In C1. C Is BestNote: Sections 2.0 and 3.0 of this article were added in response
to comments on 
Hacker News and
Reddit.



Since its inception on 2000-05-29, SQLite has been implemented in generic C.
C was and continues to be the best language for implementing a software
library like SQLite.  There are no plans to recode SQLite in any other
programming language at this time.


The reasons why C is the best language to implement SQLite include:



 Performance
 Compatibility
 Low-dependency
 Stabilitywhyc.html#c_is_best†0“…H
uuŠClustered Indexes and the WITHOUT ROWID Optimization5. Determining If An Existing Table Is WITHOUT ROWIDA WITHOUT ROWID table returns the same content for
PRAGMA table_info and PRAGMA table_xinfo as does an ordinary
table.  But unlike an ordinary table, a WITHOUT ROWID also
responds to the PRAGMA index_info command.  The PRAGMA index_info
on a WITHOUT ROWID table returns information abou the PRIMARY KEY
for the table.  In this way, the PRAGMA index_info command can be
used to unabiguously determine whether a particular table is a 
WITHOUT ROWID table or an ordinary table - an ordinary table will
always return no rows but a WITHOUT ROWID table will always return
one or more rows.
This page last modified on  2022-01-20 21:38:08 UTCwithoutrowid.html#determining_if_an_existing_table_is_without_rowid“.“…G     uE¤acClustered Indexes and the WITHOUT ROWID Optimization4. When To Use WITHOUT ROWIDThe WITHOUT ROWID optimization is likely to be helpful for tables
that have non-integer or composite (multi-column) PRIMARY KEYs and that do
not store large strings or BLOBs.

WITHOUT ROWID tables will work correctly (that is to say, they
provide the correct answer) for tables with a single INTEGER PRIMARY KEY. 
However, ordinary rowid tables will run faster in that case.  
Hence, it is good design
to avoid creating WITHOUT ROWID tables with single-column PRIMARY KEYs 
of type INTEGER.

WITHOUT ROWID tables work best when individual rows are not too large.
A good rule-of-thumb is that the average size of a single row in a
WITHOUT ROWID table should be less than about 1/20th the size of 
a database page.  That means that rows should not contain more than about
50 bytes each for a 1KiB page size or about 200 bytes each for 4KiB
page size.  WITHOUT ROWID tables will work (in the sense that
they get the correct answer) for arbitrarily large rows - up to 2GB in size -
but traditional rowid tables tend to work faster for large row sizes.
This is because rowid tables are implemented as B*-Trees where
all content is stored in the leaves of the tree, whereas WITHOUT ROWID 
tables are implemented using ordinary B-Trees with content stored on both
leaves and intermediate nodes.  Storing content in 
intermediate nodes causes each intermediate node entry to take up more
space on the page and thus reduces the fan-out, increasing the search cost.

The "sqlite3_analyzer.exe" utility program, available as source code
in the SQLite source tree or as a precompiled binary on the
SQLite Download page, can be
used to measure the average sizes of table rows in an existing SQLite
database.

Note that except for a few corner-case differences detailed above,
WITHOUT ROWID tables and rowid tables work the same.  They both generate
the same answers given the same SQL statements.  So it is a simple matter
to run experiments on an application, late in the development cycle,
to test whether or not the use of WITHOUT ROWID tables will be helpful.
A good strategy is to simply not worry about WITHOUT ROWID until near
the end of product development, then go back and run tests to see
if adding WITHOUT ROWID to tables with non-integer PRIMARY KEYs helps
or hurts performance, and retaining the WITHOUT ROWID only in those cases
where it helps.withoutrowid.html#when_to_use_without_rowid
Š
v
3Šƒ$“œ}   =)…Q3Why Is SQLite Coded In C1.4. StabilityThe C language is old and boring.
It is a well-known and well-understood language.
This is exactly what one wants when developing a module like SQLite.
Writing a small, fast, and reliable database engine is hard enough as it
is without the implementation language changing out from under you with
each update to the implementation language specification.whyc.html#stability…>“œ|       =3‰q=Why Is SQLite Coded In C1.3. Low-DependencyLibraries written in C do not have a huge run-time dependency.
In its minimum configuration, SQLite requires only the following
routines from the standard C library:






 memcmp()
 memcpy()
 memmove()
 memset()


&nbsp;&nbsp;&nbsp;


 strcmp()
 strlen()
 strncmp()







In a more complete build, SQLite also uses library routines like
malloc() and free() and operating system interfaces for opening, reading,
writing, and closing files.  But even then, the number of dependencies
is very small.  Other "modern" language, in contrast, often require
multi-megabyte runtimes loaded with thousands and thousands of interfaces.whyc.html#low_dependency„{“œ{ =1ˆo;Why Is SQLite Coded In C1.2. CompatibilityNearly all systems have the ability to call libraries
written in C.  This is not true of other implementation languages.

So, for example, Android applications written in Java are able to
invoke SQLite (through an adaptor).  Maybe it would have been more
convenient for Android if SQLite had been coded in Java as that would
make the interface simpler.  However, on iPhone applications are coded
in Objective-C or Swift, neither of which have the ability to call
libraries written in Java.  Thus, SQLite would be unusable on iPhones
had it been written in Java.whyc.html#compatibility…“œz        =-‰7Why Is SQLite Coded In C1.1. PerformanceAn intensively used low-level library like SQLite needs to be fast.
(And SQLite is fast, see Internal Versus External BLOBs and
35% Faster Than The Filesystem for example.)

C is a great language for writing fast code.  C is sometimes
described as "portable assembly language".  It enables to developers
to code as close to the underlying hardware as possible while still
remaining portable across platforms.

Other programming languages sometimes claim to be "as fast as C".
But no other language claims to be faster than C for general-purpose
programming, because none are.whyc.html#performance
        B      B9“œ~
=˜I
Why Is SQLite Coded In C2. Why Isn't SQLite Coded In An Object-Oriented Language?Some programmers cannot imagine developing a complex system like
SQLite in a language that is not "object oriented".  So why is
SQLite not coded in C++ or Java?



Libraries written in C++ or Java can generally only be used by
applications written in the same language. It is difficult to
get an application written in Haskell or Java to invoke a library
written in C++.  On the other hand, libraries written in C are
callable from any programming language.


Object-Oriented is a design pattern, not a programming language.
You can do object-oriented programming in any language you want,
including assembly language.  Some languages (ex: C++ or Java) make
object-oriented easier.  But you can still do object-oriented programming
in languages like C.


Object-oriented is not the only valid design pattern.
Many programmers have been taught to think purely in terms of
objects.  And, to be fair, objects are often a good way to
decompose a problem.  But objects are not the only way, and are
not always the best way to decompose a problem.  Sometimes good old
procedural code is easier to write, easier to maintain and understand,
and faster than object-oriented code.


When SQLite was first being developed, Java was a young and immature
language.  C++ was older, but was undergoing such growing pains that
it was difficult to find any two C++ compilers that worked the same
way.  So C was definitely a better choice back when SQLite was first
being developed.  The situation is less stark now, but there is little
to no benefit in recoding SQLite at this point.whyc.html#why_isn_t_sqlite_coded_in_an_object_oriented_language_
||‡“¬I        O5ŒaIApplication-Defined SQL Functions1. Executive SummaryApplications that use SQLite can define custom SQL functions that call
back into application code to compute their results.  The custom SQL
function implementations can be embedded in the application code itself,
or can be loadable extensions.

Application-defined or custom SQL functions are created using the
sqlite3_create_function() family of interfaces.
Custom SQL functions can be scalar functions, aggregate functions,
or window functions.
Custom SQL functions can have any number of arguments from 0 up to
SQLITE_MAX_FUNCTION_ARG.
The sqlite3_create_function() interface specifies callbacks that are
invoked to carry out the processing for the new SQL function.

SQLite also supports custom table-valued functions, but they are
implemented by a different mechanism that is not covered in this document.appfunc.html#executive_summary•t“œ   =k©muWhy Is SQLite Coded In C3. Why Isn't SQLite Coded In A "Safe" Language?There has lately been a lot of interest in "safe" programming languages
like Rust or Go in which it is impossible, or is at least difficult, to make
common programming errors like memory leaks or array overruns.  So the
question often arises as to why SQLite is not coded in a "safe" language.



None of the safe programming languages existed for the first 10 years
of SQLite's existence.  SQLite could be recoded in Go or Rust, but doing
so would probably introduce far more bugs than would be fixed, and it
seems also likely to result in slower code.


Safe languages insert additional machine branches to do things like
verify that array accesses are in-bounds.  In correct code, those
branches are never taken.  That means that the machine code cannot
be 100% branch tested, which is an important component of SQLite's
quality strategy.


Safe languages usually want to abort if they encounter an out-of-memory
(OOM) situation.  SQLite is designed to recover gracefully from an OOM.
It is unclear how this could be accomplished in the current crop of
safe languages.


All of the existing safe languages are new.  The developers of SQLite
applaud the efforts of computer language researchers in trying to
develop languages that are easier to program safely.  We encourage these
efforts to continue.  But we ourselves are more interested in old and
boring languages when it comes to implementing SQLite.



All that said, it is possible that SQLite might
one day be recoded in Rust.  Recoding SQLite in Go is unlikely
since Go hates assert().  But Rust is a possibility.  Some
preconditions that must occur before SQLite is recoded in Rust
include:



 Rust needs to mature a little more, stop changing so fast, and
     move further toward being old and boring.
 Rust needs to demonstrate that it can be used to create general-purpose
     libraries that are callable from all other programming languages.
 Rust needs to demonstrate that it can produce object code that
     works on obscure embedded devices, including devices that lack
     an operating system.
 Rust needs to pick up the necessary tooling that enables one to
     do 100% branch coverage testing of the compiled binaries.
 Rust needs a mechanism to recover gracefully from OOM errors.
 Rust needs to demonstrate that it can do the kinds of work that
     C does in SQLite without a significant speed penalty.



If you are a "rustacean" and feel that Rust already meets the
preconditions listed above, and that SQLite should be recoded in
Rust, then you are welcomed and encouraged
to contact the SQLite developers privately
and argue your case.
This page last modified on  2022-07-29 00:41:26 UTCwhyc.html#why_isn_t_sqlite_coded_in_a_safe_language_

-
-‹N“¬J  OG•M[Application-Defined SQL Functions2. Defining New SQL FunctionsThe sqlite3_create_function() family of interfaces is used to create
new custom SQL functions.  Each member of this family is a wrapper around
a common core.  All family members accomplish the same thing; they merely
have different calling signatures.


sqlite3_create_function() &rarr;
The original version of sqlite3_create_function() allows the application
to create a single new SQL function that can be either a scalar or an
aggregate.  The name of the function is specified using UTF8.

sqlite3_create_function16() &rarr;
This variant works exactly like the sqlite3_create_function() original
except that the name of the function itself is specified as a UTF16
string rather than as a UTF8 string.

sqlite3_create_function_v2() &rarr;
This variant works like the original sqlite3_create_function() except
that it includes an additional parameter that is a pointer to a
destructor for the sqlite3_user_data() pointer that is passed in
as the 5th argument to all of the sqlite3_create_function() variants.
That destructor function (if it is non-NULL) is called when the
custom function is deleted - usually when the database connection is
closing.

sqlite3_create_window_function() &rarr;
This variant works like the original sqlite3_create_function() except
that it accepts a different set of callback pointers - the callback
pointers used by window function definitions.appfunc.html#defining_new_sql_functions
§§–T“¬K      O9«yIApplication-Defined SQL Functions2.1. Common ParametersMany of the parameters passed to the sqlite3_create_function()
family of interfaces are common across the entire family.


db &rarr;
The 1st parameter is always a pointer to the database connection
on which the custom SQL function will work.  Custom SQL functions are
created separately for each database connection.  There is no short-hand
mechanism for creating SQL functions that work across all database
connections.

zFunctionName &rarr;
The 2nd parameter is the name of the SQL function that is being
created.  The name is usually in UTF8, except that the name should
be in UTF16 in the native byte order for sqlite3_create_function16().

The maximum length of a SQL function name is 255 bytes of UTF8.
Any attempt to create a function with a longer name will result in
an SQLITE_MISUSE error.

The SQL function creation interfaces may be called multiple
times with the same function name.
If two calls have the same function number but a different number of
arguments, for example, then two variants of the SQL function will
be registered, each taking a different number of arguments.

nArg &rarr;
The 3rd parameter is always the number of arguments that the function
accepts.  The value must be an integer between -1 and 
SQLITE_MAX_FUNCTION_ARG (default value: 127).  A value of -1 means
that the SQL function is a variadic function that can take any number
of arguments between 0 and SQLITE_MAX_FUNCTION_ARG.

eTextRep &rarr;
The 4th parameter is a 32-bit integer flag whose bits convey various
properties about the new function.  The original purpose of this
parameter was to specify the preferred text encoding for the function,
using one of the following constants:

 SQLITE_UTF8
 SQLITE_UTF16BE
 SQLITE_UTF16LE

All custom SQL functions will accept text in any encoding.  Encoding
conversions will happen automatically.  The preferred encoding merely
specifies the encoding for which the function implementation is optimized.
It is possible to specify multiple functions with the same name and the
same number of arguments, but different preferred encodings and different
callbacks used to implement the function, and SQLite will chose the
set of callbacks for which the input encodings most closely match the
preferred encoding.

The 4th parameter as more recently be extended with additional flag bits
to convey additional information about the function.  The additional
bits include:

 SQLITE_DETERMINISTIC
 SQLITE_DIRECTONLY
 SQLITE_INNOCUOUS
 SQLITE_SUBTYPE


Additional bits may be added in future versions of SQLite.

pApp &rarr;
The 5th parameter is an arbitrary pointer that is passed through
into the callback routines.  SQLite itself does nothing with this
pointer, except to make it available to the callbacks, and to pass
it into the destructor when the function is unregistered.appfunc.html#common_parameters
?
â
P?”“¬N       OS¦9_Application-Defined SQL Functions2.3.1. The Scalar Function CallbackScalar SQL functions are implemented by a single callback in the
xFunc parameter to sqlite3_create_function().
The following code demonstrations the implementation of a "noop(X)"
scalar SQL function that merely returns its argument:

static void noopfunc(
  sqlite3_context *context,
  int argc,
  sqlite3_value **argv
){
  assert( argc==1 );
  sqlite3_result_value(context, argv&#91;0&#93;);
}



The 1st parameter, context, is a pointer to an opaque object
that describes the content from which the SQL function was invoked.  This
context point becomes the first parameter to many other routines that
the function implement might to invoke, including:



sqlite3_aggregate_context
sqlite3_context_db_handle
sqlite3_get_auxdata
sqlite3_result_blob
sqlite3_result_blob64
sqlite3_result_double
sqlite3_result_error
sqlite3_result_error16
sqlite3_result_error_code
sqlite3_result_error_nomem
sqlite3_result_error_toobig
sqlite3_result_int
sqlite3_result_int64
sqlite3_result_null
sqlite3_result_pointer
sqlite3_result_subtype
sqlite3_result_text
sqlite3_result_text16
sqlite3_result_text16be
sqlite3_result_text16le
sqlite3_result_text64
sqlite3_result_value
sqlite3_result_zeroblob
sqlite3_result_zeroblob64
sqlite3_set_auxdata
sqlite3_user_data




The sqlite3_result() family of functions are
used to specify the result of the scalar SQL function.  One or more of
these should be invoked by the callback to set the function return value.
If none of these routines are invoked for a specific callback, then the
return value will be NULL.

The sqlite3_user_data() routine returns a copy of the pArg
pointer that was given to sqlite3_create_function() when the SQL
function was created.

The sqlite3_context_db_handle() routine returns a pointer to the
database connection object.

The sqlite3_aggregate_context() routine is used only in the
implementations of aggregate and window functions.  Scalar functions
may not use sqlite3_aggregate_context().  The sqlite3_aggregate_context()
function is included in the interface list only for completeness.


The 2nd and 3rd arguments to the scalar SQL function implemenetation,
argc and argv, are
the number of arguments to the SQL function itself and the values for
each argument of the SQL function.
Argument values can be of any datatype and are thus stored in
instances of the sqlite3_value object.
Specific C-language values can be extracted from this object using
the sqlite3_value() family of interfaces.appfunc.html#the_scalar_function_callback
“¬M O)9Application-Defined SQL Functions2.3. CallbacksSQLite evaluates an SQL function by invoking callback routines.appfunc.html#callbacksŠ“¬LO‘C%Application-Defined SQL Functions2.2. Multiple Calls To sqlite3_create_function() For The Same FunctionIt is common for an application to invoke sqlite3_create_function() multiple
times for the same SQL function.  For example, if an SQL function can take
either 2 or 3 arguments, then sqlite3_create_function() would be invoked
once for the 2-argument version and a second time for the 3-argument version.
The underlying implementation (the callbacks) can be different for both
variants.


An application can also register multiple SQL functions with the same name
and same number of arguments, but a different preferred text encoding.
In that case, SQLite will invoke the function using the callbacks for
the version whose preferred text encoding most closely matches the database
text encoding.  In this way, multiple implementations of the same function
can be provided that are optimized for UTF8 or UTF16.


If multiple calls to sqlite3_create_function() specify the same function name,
and the same number of arguments, and the same preferred text encoding, then
the callbacks and other parameters of the second call overwrite the first,
and the destructor callback from the first call (if it exists) is invoked.appfunc.html#multiple_calls_to_sqlite3_create_function_for_the_same_function
3;ë3ƒ3“¬Q O+…W7Application-Defined SQL Functions2.3.4. ExamplesThere are dozens and dozens of SQL function implementations scattered
throughout the SQLite source code that can be used as example applications.
The built-in SQL functions use the same interface as application-defined
SQL functions, so built-in functions can be used as examples too.
Search for "sqlite3_context" in the SQLite source code to find examples.appfunc.html#examples‚K“¬P      OUƒ3aApplication-Defined SQL Functions2.3.3. The Window Function CallbacksWindow functions use the same xStep() and xFinal() callbacks that
aggregate functions use, plus two others: xValue and xInverse.
See the documentation on
application-defined window functions for further details.appfunc.html#the_window_function_callbacks“@“¬O        O[¥gApplication-Defined SQL Functions2.3.2. The Aggregate Function CallbacksAggregate SQL functions are implemented by using two callback
functions, xStep and xFinal.  The xStep() function 
is called for each row of the aggregate and the xFinal() function
is invoked to compute the final answer at the end.
The following (slightly simplified) version of the built-in
count() function illustrates:

typedef struct CountCtx CountCtx;
struct CountCtx {
  i64 n;
};
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&#91;0&#93;)) && p ){
    p->n++;
  }
}   
static void countFinalize(sqlite3_context *context){
  CountCtx *p;
  p = sqlite3_aggregate_context(context, 0);
  sqlite3_result_int64(context, p ? p->n : 0);
}


Recall that there are two versions of the count() aggregate.
With zero arguments, count() returns a count of the number of rows.
With one argument, count() returns the number of times that the
argument was non-NULL.

The countStep() callback is invoked once for each row in the aggregate.
As you can see, the count is incremented if either there are no arguments,
or if the one argument is not NULL.

The step function for an aggregate should always begin with a call
to the sqlite3_aggregate_context() routine to fetch the persistent
state of the aggregate function.  On the first invocation of the step()
function, the aggregate context is initialized to a block of memory
that is N bytes in size, where N is the second parameter to
sqlite3_aggregate_context() and that memory is zeroed.  On all subsequent
calls to the step() function, the same block of memory is returned.
Except, sqlite3_aggregate_context() might return NULL in the case of
an out-of-memory error, so aggregate functions should be prepared to
deal with that case.

After all rows are processed the countFinalize() routine is called
exactly once.  This routine computes the final result and invokes
one of the sqlite3_result() family of functions
to set the final result.  The aggregate context will be freed automatically
by SQLite, though the xFinalize() routine must clean up any substructure
associated with the aggregate context before it returns.  If the xStep()
method is called one or more times, then SQLite guarantees thta the
xFinal() method will be called at once, even if the query aborts.appfunc.html#the_aggregate_function_callbacks
XX›#“¬R    O=µQApplication-Defined SQL Functions3. Security ImplicationsApplication-defined SQL functions can become security vulnerabilities if
not carefully managed.  Suppose, for example, an application defines
a new "system(X)" SQL function that runs its argument X as a command and
returns the integer result code.  Perhaps the implementation is like this:

static void systemFunc(
  sqlite3_context *context,
  int argc,
  sqlite3_value **argv
){
  const char *zCmd = (const char*)sqlite3_value_text(argv&#91;0&#93;);
  if( zCmd!=0 ){
    int rc = system(zCmd);
    sqlite3_result_int(context, rc);
  }
}



This is a function with powerful side-effects.  Most programmers would
be naturally cautious about using it, but probably would not see the
harm in merely having it available.  But there is great risk in merely
defining such a function, even if the application itself never invokes
it!


Suppose the application normally does a query against table TAB1
when it starts up.  If an attacker can gain access to the database
file and modify the schema like this:

ALTER TABLE tab1 RENAME TO tab1_real;
CREATE VIEW tab1 AS SELECT * FROM tab1 WHERE system('rm -rf *') IS NOT NULL;



Then, when the application attempts to open the database, register the
system() function, then run an innocent query against the "tab1" table,
it instead deletes all the files in its working directory.  Yikes!


To prevent this kind of mischief, applications that create their own
custom SQL functions should take one or more of the following safety
precautions.  The more precautions taken the better:



Invoke sqlite3_db_config(db,SQLITE_DBCONFIG_TRUSTED_SCHEMA,0,0)
on each database connection as soon as it is opened.
This prevents application-defined functions from being used in places
where an attacker might be able to surreptiously invoke them by modifying
a database schema:

 In in VIEWs.
 In in TRIGGERSs.
 In CHECK constraints of a table definition.
 In DEFAULT constraints of a table definition.
 In the definitions of generated columns.
 In the expression part of an index on an expression.
 In the WHERE clause of a partial index.


To put it another way, this setting requires that application-defined
functions only be run directly by top-level SQL invoked from the application
itself, not as a consequence of doing some other innocent-looking query.


Use the PRAGMA trusted_schema=OFF SQL statement to disable trusted
schema.  This has the same effect as the previous bullet, but does not
require the use of C-code and hence can be performed in programs written
in another programming language and that do not have access SQLite
C-language APIs.


Compile SQLite using the -DSQLITE_TRUSTED_SCHEMA=0 compile-time option.
This make SQLite distrust application-defined functions inside of
the schema by default.


If any application-defined SQL functions have potentially dangerous
side-effects, or if they could potentially leak sensitive information
to an attacker if misused, then tag those functions using the
SQLITE_DIRECTONLY option on the "enc" parameter.  This means
that the function can never be run from schema-code even if the
trusted-schema option is on.


Never tag an application-defined SQL function with SQLITE_INNOCUOUS
unless you really need to and you have checked the implementation closely
and are certain that it can do no harm even if it falls under the
control of an attacker.

This page last modified on  2020-09-20 12:35:50 UTCappfunc.html#security_implications
Lh
vL’%“Ëk  GU¢igDefense Against The Dark Arts1.2. Untrusted SQLite Database FilesApplications that read or write SQLite database files of uncertain
provenance should take precautions enumerated below.

Even if the application does not deliberately accept database files 
from untrusted sources, beware of attacks in which a local 
database file is altered.  For best security, any database file which 
might have ever been writable by an agent in a different security domain
should be treated as suspect.



If the application includes any custom SQL functions or 
custom virtual tables that have side effects or that might leak
privileged information, then the application should use one or more
of the techniques below to prevent a maliciously crafted database
schema from surreptitiously running those SQL functions and/or
virtual tables for nefarious purposes:

 Invoke sqlite3_db_config(db,SQLITE_DBCONFIG_TRUSTED_SCHEMA,0,0)
     on each database connection as soon as it is opened.
 Run the PRAGMA trusted_schema=OFF statement on each database connection
     as soon as it is opened.
 Compile SQLite using the -DSQLITE_TRUSTED_SCHEMA=0 compile-time option.
 Disable the surreptitious use of custom SQL functions and virtual tables
     by setting the SQLITE_DIRECTONLY flag on all custom SQL functions and
     the SQLITE_VTAB_DIRECTONLY flag on all custom virtual tables.



If the application does not use triggers or views, consider disabling the
unused capabilities with:

sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_TRIGGER,0,0);
sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_VIEW,0,0);





For reading database files that are unusually high-risk, such as database
files that are received from remote machines, and possibly from anonymous
contributors, the following extra precautions
might be justified.  These added defenses come with performance costs,
however, and so may not be appropriate in every situation:



Run PRAGMA integrity_check or PRAGMA quick_check on the database
as the first SQL statement after opening the database files and
prior to running any other SQL statements.  Reject and refuse to
process any database file containing errors.


Enable the PRAGMA cell_size_check=ON setting.



Do not enable memory-mapped I/O.
In other words, make sure that PRAGMA mmap_size=0.security.html#untrusted_sqlite_database_files£“Ëj    G?ÄSQDefense Against The Dark Arts1.1. Untrusted SQL InputsApplications that accept untrusted SQL inputs should take the following
precautions:



Set the SQLITE_DBCONFIG_DEFENSIVE flag.
This prevents ordinary SQL statements from deliberately corrupting the 
database file.  SQLite should be proof against attacks that involve both
malicious SQL inputs and a maliciously corrupted database file at the
same time.  Nevertheless, denying a script-only attacker access to 
corrupt databas‡“Ëi        GWŒ=mDefense Against The Dark Arts1. SQLite Always Validates Its InputsSQLite should never crash, overflow a buffer, leak memory,
or exhibit any other harmful behavior, even when presented with
maliciously malformed SQL inputs or database files.  SQLite should
always detect erroneous inputs and raise an error, not crash or
corrupt memory.
Any malfunction caused by an SQL input or database file
is considered a serious bug and will be promptly addressed when
brought to the attention of the SQLite developers.  SQLite is
extensively fuzz-tested to help ensure that it is resistant
to these kinds of errors.


Nevertheless, bugs happen.
If you are writing an application that sends untrusted SQL inputs
or database files to SQLite, there are additional steps you can take
to help reduce the attack surface and
prevent zero-day exploits caused by undetected bugs.security.html#sqlite_always_validates_its_inputse inputs provides an extra layer of defense.


Reduce the limits that SQLite imposes on inputs.  This can help prevent
denial of service attacks and other kinds of mischief that can occur
as a result of unusually large inputs.  You can do this either at compile-time
using -DSQLITE_MAX_... options, or at run-time using the
sqlite3_limit() interface.  Most applications can reduce limits
dramatically without impacting functionality.  The table below
provides some suggestions, though exact values will vary depending
on the application:


Limit SettingDefault ValueHigh-security Value
LIMIT_LENGTH1,000,000,0001,000,000
LIMIT_SQL_LENGTH1,000,000,000100,000
LIMIT_COLUMN2,000100
LIMIT_EXPR_DEPTH1,00010
LIMIT_COMPOUND_SELECT5003
LIMIT_VDBE_OP250,000,00025,000
LIMIT_FUNCTION_ARG1278
LIMIT_ATTACH100
LIMIT_LIKE_PATTERN_LENGTH50,00050
LIMIT_VARIABLE_NUMBER99910
LIMIT_TRIGGER_DEPTH1,00010



Consider using the sqlite3_set_authorizer() interface to limit
the scope of SQL that will be processed.  For example, an application
that does not need to change the database schema might add an
sqlite3_set_authorizer() callback that causes any CREATE or DROP
statement to fail.


The SQL language is very powerful, and so it is always possible for
malicious SQL inputs (or erroneous SQL inputs caused by an application
bug) to submit SQL that runs for a very long time.  To prevent this
from becoming a denial-of-service attack, consider using the
sqlite3_progress_handler() interface to invoke a callback periodically
as each SQL statement runs, and have that callback return non-zero to
abort the statement if the statement runs for too long.  Alternatively,
set a timer in a separate thread and invoke sqlite3_interrupt() when
the timer goes off to prevent the SQL statement from running forever.


Limit the maximum amount of memory that SQLite will allocate using
the sqlite3_hard_heap_limit64() interface.  This helps prevent
denial-of-service attacks.  To find out how much heap space an
application actually needs, run the it against typical inputs and
then measure the maximum instantaneous memory usage with the 
sqlite3_memory_highwater() interface.  Set the hard heap limit
to the maximum observed instantaneous memory usage plus some margin.


Consider setting the SQLITE_MAX_ALLOCATION_SIZE compile-time option
to something smaller than its default value of 2147483391 (0x7ffffeff).
A value of 100000000 (100 million) or even smaller would not be unreasonable,
depending on the application.


For embedded systems, consider compiling SQLite with the
-DSQLITE_ENABLE_MEMSYS5 option and then providing SQLite with
a fixed chunk of memory to use as its heap via the
sqlite3_config(SQLITE_CONFIG_HEAP) interface. This will
prevent malicious SQL from executing a denial-of-service attack
by using an excessive amount of memory. If (say) 5 MB of memory
is provided for SQLite to use, once that much has been consumed,
SQLite will start returning SQLITE_NOMEM errors rather than
soaking up memory needed by other parts of the application.
This also sandboxes SQLite's memory so that a write-after-free
error in some other part of the application will not cause
problems for SQLite, or vice versa.



To control memory usage in the printf() SQL function, compile
with "-DSQLITE_PRINTF_PRECISION_LIMIT=100000" or some similarly
reasonable value.
This #define limits the width and precision for %-substitutions in the
printf() function, and thus prevents a hostile SQL statement from
consuming large amounts of RAM via constructs such as
"printf('%1000000000s','hi')".

Note that SQLite uses its built-in printf() internally to help it
format the sql column in the sqlite_schema table.  For that reason,
no table, index, view, or trigger definition can be much larger than the
precision limit.  You can set a precision limit of less than 100000,
but be careful that whatever precision limit you use is at least as
long as the longest CREATE statement in your schema.security.html#untrusted_sql_inputs
þÔþQ“ÓR        )Ew_Query Planning1.1.  Tables Without IndicesMost tables in SQLite consist of zero or more rows with a unique integer
key (the rowid or INTEGER PRIMARY KEY) followed by content.  
(The exception is WITHOUT ROWID tables.)
The rows
are logically stored in order of increasing rowid.  As an example, this
article uses a table named "FruitsForSale" which relates various fruits 
to the state
where they are grown and their unit price at market.  The schema is this:



CREATE TABLE FruitsForSale(
  Fruit TEXT,
  State TEXT,
  Price REAL
);




With some (arbitrary) data, such a table might be logically stored on disk
as shown in figure 1:





Figure 1: Logical Layout Of Table "FruitsForSale"




In this example, the rowids are not
consecutive but they are ordered.  SQLite usually creates rowids beginning
with one and increasing by one with each added row.  But if rows are 
deleted, gaps can appear in the sequence.  And the application can control
the rowid assigned if desired, so that rows are not necessarily inserted 
at the bottom.  But regardless of what happens, the rowids are always 
unique and in strictly ascending order.



Suppose you want to look up the price of peaches.  The query would
be as follows:



SELECT price FROM fruitsforsale WHERE fruit='Peach';




To satisfy this query, SQLite reads every row out of the
table, checks to see if the "fruit" column has the value of "Peach" and if
so, outputs the "price" column from that row.  The process is illustrated
by figure 2 below.
This is algorithm is called a full table scan 
since the entire content of the
table must be read and examined in order to find the one row of interest.
With a table of only 7 rows, a full table scan is acceptable, 
but if the table contained 7 million rows, a full table scan might read 
megabytes of content in order to find a single 8-byte number.  
For that reason, one normally tries to avoid full table scans.





Figure 2: Full Table Scanqueryplanner.html#_tables_without_indices‹ “ÓQ )•YAQuery Planning OverviewThe best feature of SQL (in all its implementations, not just SQLite)
is that it is a declarative language, not a procedural
language.  When programming in SQL you tell the system what you
want to compute, not how to compute it.  The task of figuring out
the how is delegated to the query planner subsystem within 
the SQL database engine.

For any given SQL statement, there might be hundreds or thousands or
even millions of different algorithms of performing the operation.  All
of these algorithms will get the correct answer, though some will run
faster than others.
The query planner is an 
AI that 
tries to pick the fastest and most efficient algorithm for each SQL
statement.



Most of the time, the query planner in SQLite does a good job.
However, the query planner needs indices to
work with.  
These indices must normally be added by programmers.
Rarely, the query planner AI will make a suboptimal algorithm
choice.
In those cases, programmers may want to provide additional
hints to help the query planner do a better job.



This document provides background information about how the
SQLite query planner and query engine work.
Programmers can use this information to help create better
indexes, and provide hints to help the query planner when
needed.



Additional information is provided in the
SQLite query planner and 
next generation query planner documents.queryplanner.html#overviewƒ“Ël G!…7Defense Against The Dark Arts2. SummaryThe precautions above are not required in order to use SQLite safely
with potentially hostile inputs.
However, they do provide an extra layer of defense against zero-day
exploits and are encouraged for applications that pass data from
untrusted sources into SQLite.
This page last modified on  2022-11-07 14:28:05 UTCsecurity.html#summary
(ú(‘M“ÓT )7¢QQuery Planning1.3.  Lookup By IndexThe problem with looking up information by rowid is that you probably
do not care what the price of "item 4" is - you want to know the price
of peaches.  And so a rowid lookup is not helpful.



To make the original query more efficient, we can add an index on the
"fruit" column of the "fruitsforsale" table like this:



CREATE INDEX Idx1 ON fruitsforsale(fruit);




An index is another table similar to the original "fruitsforsale" table
but with the content (the fruit column in this case) stored in front of the
rowid and with all rows in content order.
Figure 4 gives a logical view of the Idx1 index.
The "fruit" column is the primary key used to order the elements of the
table and the "rowid" is the secondary key used to break the tie when
two or more rows have the same "fruit".  In the example, the rowid
has to be used as a tie-breaker for the "Orange" rows.
Notice that since the rowid
is always unique over all elements of the original table, the composite key
of "fruit" followed by "rowid" will be unique over all elements of the index.





Figure 4: An Index On The Fruit Column




This new index can be used to implement a faster algorithm for the
original "Price of Peaches" query.



SELECT price FROM fruitsforsale WHERE fruit='Peach';




The query starts by doing a binary search on the Idx1 index for entries
that have fruit='Peach'.  SQLite can do this binary search on the Idx1 index
but not on the original FruitsForSale table because the rows in Idx1 are sorted
by the "fruit" column.  Having found a row in the Idx1 index that has
fruit='Peach', the database engine can extract the rowid for that row.
Then the database engines does a second binary search
on the original FruitsForSale table to find the
original row that contains fruit='Peach'.  
From the row in the FruitsForSale table,
SQLite can then extract the value of the price column.
This procedure is illustrated by figure 5.





Figure 5: Indexed Lookup For The Price Of Peaches




SQLite has to do two binary searches to find the price of peaches using
the method show above.  But for a table with a large number of rows, this
is still much faster than doing a full table scan.queryplanner.html#_lookup_by_index†“ÓS       )7ŠsQQuery Planning1.2.  Lookup By RowidOne technique for avoiding a full table scan is to do lookups by
rowid (or by the equivalent INTEGER PRIMARY KEY).   To lookup the
price of peaches, one would query for the entry with a rowid of 4:



SELECT price FROM fruitsforsale WHERE rowid=4;




Since the information is stored in the table in rowid order, SQLite
can find the correct row using a binary search.
If the table contains N elements, the time required to look up the
desired row is proportional to logN rather than being proportional
to N as in a full table scan.  If the table contains 10 million elements,
that means the query will be on the order of N/logN or about 1 million
times faster.





Figure 3: Lookup By Rowidqueryplanner.html#_lookup_by_rowid

©
©ŠR“ÓU      )A”[Query Planning1.4.  Multiple Result RowsIn the previous query the fruit='Peach' constraint narrowed the result
down to a single row.  But the same technique works even if multiple
rows are obtained.  Suppose we looked up the price of Oranges instead of
Peaches:



SELECT price FROM fruitsforsale WHERE fruit='Orange'




Figure 6: Indexed Lookup For The Price Of Oranges




In this case, SQLite still does a single binary search to find the first
entry of the index where fruit='Orange'.  Then it extracts the rowid from
the index and uses that rowid to lookup the original table entry via
binary search and output the price from the original table.  But instead
of quitting, the database engine then advances to the next row of index
to repeat the process for next fruit='Orange' entry.  Advancing to the
next row of an index (or table) is much less costly than doing a binary
search since the next row is often located on the same database page as
the current row.  In fact, the cost of advancing to the next row is so
cheap in comparison to a binary search that we usually ignore it.  So
our estimate for the total cost of this query is 3 binary searches.
If the number of rows of output is K and the number of rows in the table
is N, then in general the cost of doing the query is proportional
to (K+1)*logN.queryplanner.html#_multiple_result_rows
qq—
“ÓV
)k¬Query Planning1.5.  Multiple AND-Connected WHERE-Clause TermsNext, suppose that you want to look up the price of not just any orange,
but specifically California-grown oranges.  The appropriate query would
be as follows:



SELECT price FROM fruitsforsale WHERE fruit='Orange' AND state='CA'




Figure 7: Indexed Lookup Of California Oranges




One approach to this query is to use the fruit='Orange' term of the WHERE
clause to find all rows dealing with oranges, then filter those rows
by rejecting any that are from states other than California.  This
process is shown by figure 7 above.  This is a perfectly
reasonable approach in most cases.  Yes, the database engine did have
to do an extra binary search for the Florida orange row that was
later rejected, so it was not as efficient as we might hope, though
for many applications it is efficient enough.  



Suppose that in addition to the index on "fruit" there was also
an index on "state".



CREATE INDEX Idx2 ON fruitsforsale(state);




Figure 8: Index On The State Column




The "state" index works just like the "fruit" index in that it is a
new table with an extra column in front of the rowid and sorted by
that extra column as the primary key.  The only difference is that
in Idx2, the first column is "state" instead of "fruit" as it is with
Idx1.  In our example data set, there is more redundancy in the "state"
column and so they are more duplicate entries.  The ties are still
resolved using the rowid.



Using the new Idx2 index on "state", SQLite has another option for
lookup up the price of California oranges:  it can look up every row
that contains fruit from California and filter out those rows that
are not oranges.





Figure 9: Indexed Lookup Of California Oranges




Using Idx2 instead of Idx1 causes SQLite to examine a different set of
rows, but it gets the same answer in the end (which is very important -
remember that indices should never change the answer, only help SQLite to
get to the answer more quickly) and it does the same amount of work.
So the Idx2 index did not help performance in this case.



The last two queries take the same amount of time, in our example.
So which index, Idx1 or Idx2, will SQLite choose?  If the
ANALYZE command has been run on the database, so that SQLite has
had an opportunity to gather statistics about the available indices,
then SQLite will know that the Idx1 index usually narrows the search
down to a single item (our example of fruit='Orange' is the exception
to this rule) whereas the Idx2 index will normally only narrow the 
search down to two rows.  So, if all else is equal, SQLite will
choose Idx1 with the hope of narrowing the search to as small
a number of rows as possible.  This choice is only possible because
of the statistics provided by ANALYZE.  If ANALYZE has not been
run then the choice of which index to use is arbitrary.queryplanner.html#_multiple_and_connected_where_clause_terms
tŠa“ÓX  )9”/SQuery Planning1.7.  Covering IndexesThe "price of California oranges" query was made more efficient through
the use of a two-column index.  But SQLite can do even better with a
three-column index that also includes the "price" column:



CREATE INDEX Idx4 ON FruitsForSale(fruit, state, price);




Figure 13: A Covering Index




This new index contains all the columns of the original FruitsForSale table that
are used by the query - both the search terms and the output.  We call
this a "covering index".  Because all of the information needed is in
the covering index, SQLite never needs to consult the original table
in order to find the price.



SELECT price FROM fruitsforsale WHERE fruit='Orange' AND state='CA';




Figure 14: Query Using A Covering Index




Hence, by adding extra "output" columns onto the end of an index, one
can avoid having to reference the original table and thereby
cut the number of binary searches for a query in half.  This is a
constant-factor improvement in performance (roughly a doubling of
the speed).  But on the other hand, it is also just a refinement;
A two-fold performance increase is not nearly as dramatic as the
one-million-fold increase seen when the table was first indexed.
And for most queries, the difference between 1 microsecond and
2 microseconds is unlikely to be noticed.queryplanner.html#_covering_indexes““ÓW       )A¤k[Query Planning1.6.  Multi-Column IndicesTo get the maximum performance out of a query with multiple AND-connected
terms in the WHERE clause, you really want a multi-column index with
columns for each of the AND terms.  In this case we create a new index
on the "fruit" and "state" columns of FruitsForSale:



CREATE INDEX Idx3 ON FruitsForSale(fruit, state);




Figure 1: A Two-Column Index




A multi-column index follows the same pattern as a single-column index;
the indexed columns are added in front of the rowid.  The only difference
is that now multiple columns are added.  The left-most column is the
primary key used for ordering the rows in the index.  The second column is
used to break ties in the left-most column.  If there were a third column,
it would be used to break ties for the first two columns.  And so forth for
all columns in the index.  Because rowid is guaranteed
to be unique, every row of the index will be unique even if all of the
content columns for two rows are the same.  That case does not happen
in our sample data, but there is one case (fruit='Orange') where there
is a tie on the first column which must be broken by the second column.



Given the new multi-column Idx3 index, it is now possible for SQLite
to find the price of California oranges using only 2 binary searches:



SELECT price FROM fruitsforsale WHERE fruit='Orange' AND state='CA'




Figure 11: Lookup Using A Two-Column Index




With the Idx3 index on both columns that are constrained by the WHERE clause,
SQLite can do a single binary search against Idx3 to find the one rowid
for California oranges, then do a single binary search to find the price
for that item in the original table.  There are no dead-ends and no
wasted binary searches.  This is a more efficient query.



Note that Idx3 contains all the same information as the original 
Idx1.  And so if we have Idx3, we do not really need Idx1
any more.  The "price of peaches" query can be satisfied using Idx3
by simply ignoring the "state" column of Idx3:



SELECT price FROM fruitsforsale WHERE fruit='Peach'




Figure 12: Single-Column Lookup On A Multi-Column Index




Hence, a good rule of thumb is that your database schema should never
contain two indices where one index is a prefix of the other.  Drop the
index with fewer columns.  SQLite will still be able to do efficient
lookups with the longer index.queryplanner.html#_multi_column_indices
3¿3‰“ÓZ  )#‘#AQuery Planning2.  SortingSQLite (like all other SQL database engines) can also use indices to
satisfy the ORDER BY clauses in a query, in addition to expediting
lookup.  In other words, indices can be used to speed up sorting as
well as searching.



When no appropriate indices are available, a query with an ORDER BY
clause must be sorted as a separate step.  Consider this query:



SELECT * FROM fruitsforsale ORDER BY fruit;




SQLite processes this by gathering all the output of query and then
running that output through a sorter.





Figure 16: Sorting Without An Index




If the number of output rows is K, then the time needed to sort is
proportional to KlogK.  If K is small, the sorting time is usually
not a factor, but in a query such as the above where K==N, the time
needed to sort can be much greater than the time needed to do a
full table scan.  Furthermore, the entire output is accumulated in
temporary storage (which might be either in main memory or on disk,
depending on various compile-time and run-time settings)
which can mean that a lot of temporary storage is required to complete
the query.queryplanner.html#_sorting’<“ÓY       )e£
Query Planning1.8.  OR-Connected Terms In The WHERE ClauseMulti-column indices only work if the constraint terms in the WHERE
clause of the query are connected by AND.
So Idx3 and Idx4 are helpful when the search is for items that
are both Oranges and grown in California, but neither index would
be that useful if we wanted all items that were either oranges
or are grown in California.



SELECT price FROM FruitsForSale WHERE fruit='Orange' OR state='CA';




When confronted with OR-connected terms in a WHERE clause, SQLite 
examines each OR term separately and tries to use an index to
find the rowids associated with each term.
It then takes the union of the resulting rowid sets to find
the end result.  The following figure illustrates this process:





Figure 15: Query With OR Constraints




The diagram above implies that SQLite computes all of the rowids first
and then combines them with a union operation before starting to do
rowid lookups on the original table.  In reality, the rowid lookups
are interspersed with rowid computations.  SQLite uses one index at
a time to find rowids while remembering which rowids it has seen
before so as to avoid duplicates.  That is just an implementation
detail, though.  The diagram, while not 100% accurate, provides a good
overview of what is happening.



In order for the OR-by-UNION technique shown above to be useful, there
must be an index available that helps resolve every OR-connected term
in the WHERE clause.  If even a single OR-connected term is not indexed,
then a full table scan would have to be done in order to find the rowids
generated by the one term, and if SQLite has to do a full table scan, it
might as well do it on the original table and get all of the results in
a single pass without having to mess with union operations and follow-on
binary searches.



One can see how the OR-by-UNION technique could also be leveraged to
use multiple indices on queries where the WHERE clause has terms connected
by AND, by using an intersect operator in place of union.  Many SQL
database engines will do just that.  But the performance gain over using
just a single index is slight and so SQLite does not implement that technique
at this time.  However, a future version SQLite might be enhanced to support
AND-by-INTERSECT.queryplanner.html#_or_connected_terms_in_the_where_clause
~ÃËã~‚`“Ó^  )aƒYQuery Planning3.  Searching And Sorting At The Same TimeThe previous discussion has treated searching and sorting as separate
topics.  But in practice, it is often the case that one wants to search
and sort at the same time.  Fortunately, it is possible to do this
using a single index.queryplanner.html#_searching_and_sorting_at_the_same_timeƒc“Ó]     )K†eQuery Planning2.3.  Sorting By Covering IndexIf a covering index can be used for a query, then the multiple rowid lookups
can be avoided and the cost of the query drops dramatically.





Figure 19: Sorting With A Covering Index




With a covering index, SQLite can simply walk the index from one end to the
other and deliver the output in time proportional to N and without having
allocate a large buffer to hold the result set.queryplanner.html#_sorting_by_covering_indexs“Ó\        )9šSSQuery Planning2.2.  Sorting By IndexOf course, ordering the output of a query by rowid is seldom useful.
Usually one wants to order the output by some other column.



If an index is available on the ORDER BY column, that index can be used
for sorting.  Consider the request for all items sorted by "fruit":



SELECT * FROM fruitsforsale ORDER BY fruit;






Figure 18: Sorting With An Index




The Idx1 index is scanned from top to bottom (or from bottom to top if
"ORDER BY fruit DESC" is used) in order to find the rowids for each item
in order by fruit.  Then for each rowid, a binary search is done to lookup
and output that row.  In this way, the output appears in the requested order
without the need to gather the entire output and sort it using a separate step.



But does this really save time?  The number of steps in the 
original indexless sort is proportional to NlogN since
that is how much time it takes to sort N rows.  But when we use Idx1 as
shown here, we have to do N rowid lookups which take logN time each, so
the total time of NlogN is the same!



SQLite uses a cost-based query planner.  When there are two or more ways
of solving the same query, SQLite tries to estimate the total amount of
time needed to run the query using each plan, and then uses the plan with
the lowest estimated cost.  A cost is computed mostly from the estimated
time, and so this case could go either way depending on the table size and
what WHERE clause constraints were available, and so forth.  But generally
speaking, the indexed sort would probably be chosen, if for no other
reason, because it does not need to accumulate the entire result set in
temporary storage before sorting and thus uses much less temporary storage.queryplanner.html#_sorting_by_index†8“Ó[     )9‹]SQuery Planning2.1.  Sorting By RowidBecause sorting can be expensive, SQLite works hard to convert ORDER BY
clauses into no-ops.  If SQLite determines that output will
naturally appear in the order specified, then no sorting is done.
So, for example, if you request the output in rowid order, no sorting
will be done:



SELECT * FROM fruitsforsale ORDER BY rowid;




Figure 17: Sorting By Rowid




You can also request a reverse-order sort like this:



SELECT * FROM fruitsforsale ORDER BY rowid DESC;




SQLite will still omit the sorting step.  But in order for output to
appear in the correct order, SQLite will do the table scan starting at
the end and working toward the beginning, rather than starting at the
beginning and working toward the end as shown in 
figure 17.queryplanner.html#_sorting_by_rowid

‰s“Ó`
)o‘e        Query Planning3.2.  Searching And Sorting With A Covering IndexA covering index can also be used to search and sort at the same time.
Consider the following:



SELECT * FROM fruitforsale WHERE fruit='Orange' ORDER BY state




Figure 21: Search And Sort By Covering Index




As before, SQLite does single binary search
for the range of rows in the covering
index that satisfy the WHERE clause, the scans that range from top to 
bottom to get the desired results.  
The rows that satisfy the WHERE clause are guaranteed to be adjacent
since the WHERE clause is an equality constraint on the left-most
column of the index.  And by scanning the matching index rows from
top to bottom, the output is guaranteed to be ordered by state since the
state column is the very next column to the right of the fruit column.
And so the resulting query is very efficient.



SQLite can pull a similar trick for a descending ORDER BY:



SELECT * FROM fruitforsale WHERE fruit='Orange' ORDER BY state DESC




The same basic algorithm is followed, except this time the matching rows
of the index are scanned from bottom to top instead of from top to bottom,
so that the states will appear in descending order.queryplanner.html#_searching_and_sorting_with_a_covering_index‹g“Ó_
)w•=Query Planning3.1.  Searching And Sorting With A Multi-Column IndexSuppose we want to find the prices of all kinds of oranges sorted in
order of the state where they are grown.  The query is this:



SELECT price FROM fruitforsale WHERE fruit='Orange' ORDER BY state




The query contains both a search restriction in the WHERE clause
and a sort order in the ORDER BY clause.  Both the search and the sort
can be accomplished at the same time using the two-column index Idx3.





Figure 20: Search And Sort By Multi-Column Index




The query does a binary search on the index to find the subset of rows
that have fruit='Orange'.  (Because the fruit column is the left-most column
of the index and the rows of the index are in sorted order, all such 
rows will be adjacent.)  Then it scans the matching index rows from top to
bottom to get the rowids for the original table, and for each rowid does
a binary search on the original table to find the price.



You will notice that there is no "sort" box anywhere in the above diagram.
The ORDER BY clause of the query has become a no-op.  No sorting has to be
done here because the output order is by the state column and the state
column also happens to be the first column after the fruit column in the
index.  So, if we scan entries of the index that have the same value for
the fruit column from top to bottom, those index entries are guaranteed to
be ordered by the state column.queryplanner.html#_searching_and_sorting_with_a_multi_column_index
ê       Nºê‹K“Û9 ;-–KAtomic Commit In SQLite1.  IntroductionAn important feature of transactional databases like SQLite
is "atomic commit".  
Atomic commit means that either all database changes within a single 
transaction occur or none of them occur.  With atomic commit, it
is as if many different writes to different sections of the database
file occur instantaneously and simultaneously.
Real hardware serializes writes to mass storage, and writing
a single sector takes a finite amount of time.
So it is impossible to truly write many different sectors of a 
database file simultaneously and/or instantaneously.
But the atomic commit logic within
SQLite makes it appear as if the changes for a transaction
are all written instantaneously and simultaneously.

SQLite has the important property that transactions appear
to be atomic even if the transaction is interrupted by an
operating system crash or power failure.

This article describes the techniques used by SQLite to create the
illusion of atomic commit.

The information in this article applies only when SQLite is operating
in "rollback mode", or in other words when SQLite is not 
using a write-ahead log.  SQLite still supports atomic commit when
write-ahead logging is enabled, but it accomplishes atomic commit by
a different mechanism from the one described in this article.  See
the write-ahead log documentation for additional information on how
SQLite supports atomic commit in that context.atomiccommit.html#_introductionƒ“Ób      )=„[Query Planning4.  WITHOUT ROWID tablesThe basic principals described above apply to both ordinary rowid tables
and WITHOUT ROWID tables.
The only difference is that the rowid column that serves as the key for
tables and that appears as the right-most term in indexes is replaced by
the PRIMARY KEY.

This page last modified on  2022-10-26 13:30:36 UTCqueryplanner.html#_without_rowid_tables-“Óa)˜3Query Planning3.3.  Partial Sorting Using An Index (a.k.a. Block Sorting)Sometimes only part of an ORDER BY clause can be satisfied using indexes.
Consider, for example, the following query:



SELECT * FROM fruitforsale ORDER BY fruit, price




If the covering index is used for the scan, the "fruit" column will appear
naturally in the correct order, but when there are two or more rows with
the same fruit, the price might be out of order.  When this occurs, SQLite
does many small sorts, one sort for each distinct value of fruit, rather
than one large sort.  Figure 22 below illustrates the concept.





Figure 22: Partial Sort By Index




In the example, instead of a single sort of 7 elements, there
are 5 sorts of one-element each and 1 sort of 2 elements for the
case of fruit=='Orange'.


The advantages of doing many smaller sorts instead of a single large sort
are:

Multiple small sorts collectively use fewer CPU cycles than a single
    large sort.
Each small sort is run independently, meaning that much less information
    needs to be kept in temporary storage at any one time.
Those columns of the ORDER BY that are already in the correct order
    due to indexes can be omitted from the sort key, further reducing
    storage requirements and CPU time.
Output rows can be returned to the application as each small sort
    completes, and well before the table scan is complete.
If a LIMIT clause is present, it might be possible to avoid scanning
    the entire table.


Because of these advantages, SQLite always tries to do a partial sort using an
index even if a complete sort by index is not possible.queryplanner.html#_partial_sorting_using_an_index_a_k_a_block_sorting_dicate, SQLite will try to take advantage of that fact.  But
the default xDeviceCharacteristics method for both Unix and Windows
does not indicate atomic sector writes and so these optimizations
are normally omitted.

SQLite assumes that the operating system will buffer writes and
that a write request will return before data has actually been stored
in the mass storage device.
SQLite further assumes that write operations will be reordered by
the operating system.
For this reason, SQLite does a "flush" or "fsync" operation at key
points.  SQLite assumes that the flush or fsync will not return until
all pending write operations for the file that is being flushed have
completed.  We are told that the flush and fsync primitives
are broken on some versions of Windows and Linux.  This is unfortunate.
It opens SQLite up to the possibility of database corruption following
a power loss in the middle of a commit.  However, there is nothing 
that SQLite can do to test for or remedy the situation.  SQLite
assumes that the operating system that it is running on works as
advertised.  If that is not quite the case, well then hopefully you
will not lose power too often.

SQLite assumes that when a file grows in length that the new
file space originally contains garbage and then later is filled in
with the data actually written.  In other words, SQLite assumes that
the file size is updated before the file content.  This is a 
pessimistic assumption and SQLite has to do some extra work to make
sure that it does not cause database corruption if power is lost
between the time when the file size is increased and when the
new content is written.  The xDeviceCharacteristics method of
the VFS might indicate that the filesystem will always write the
data before updating the file size.  (This is the 
SQLITE_IOCAP_SAFE_APPEND property for those readers who are looking
at the code.)  When the xDeviceCharacteristics method indicates
that files content is written before the file size is increased,
SQLite can forego some of its pedantic database protection steps
and thereby decrease the amount of disk I/O needed to perform a
commit.  The current implementation, however, makes no such assumptions
for the default VFSes for Windows and Unix.

SQLite assumes that a file deletion is atomic from the
point of view of a user process.  By this we mean that if SQLite
requests that a file be deleted and the power is lost during the
delete operation, once power is restored either the file will
exist completely with all if its original content unaltered, or
else the file will not be seen in the filesystem at all.  If
after power is restored the file is only partially deleted,
if some of its data has been altered or erased,
or the file has been truncated but not completely removed, then
database corruption will likely result.

SQLite assumes that the detection and/or correction of 
bit errors caused by cosmic rays, thermal noise, quantum
fluctuations, device driver bugs, or other mechanisms, is the 
responsibility of the underlying hardware and operating system.  
SQLite does not add any redundancy to the database file for
the purpose of detecting corruption or I/O errors.
SQLite assumes that the data it reads is exactly the same data 
that it previously wrote.

By default, SQLite assumes that an operating system call to write
a range of bytes will not damage or alter any bytes outside of that range
even if a power loss or OS crash occurs during that write.  We
call this the "powersafe overwrite" property.  
Prior to version 3.7.9 (2011-11-01),
SQLite did not assume powersafe overwrite.  But with the standard
sector size increasing from 512 to 4096 bytes on most disk drives, it
has become necessary to assume powersafe overwrite in order to maintain
historical performance levels and so powersafe overwrite is assumed by
default in recent versions of SQLite.  The assumption of powersafe 
overwrite property can be disabled at compile-time or a run-time if
desired.  See the powersafe overwrite documentation for further
details.atomiccommit.html#_hardware_assumptions
²ƒ“Û;   ;9…WAtomic Commit In SQLite3.  Single File CommitWe begin with an overview of the steps SQLite takes in order to
perform an atomic commit of a transaction against a single database
file.  The details of file formats used to guard against damage from
power failures and techniques for performing an atomic commit across
multiple databases are discussed in later sections.atomiccommit.html#_single_file_commit¼A“Û:   ;=÷Q[Atomic Commit In SQLite2.  Hardware AssumptionsThroughout this article, we will call the mass storage device "disk"
even though the mass storage device might really be flash memory.

We assume that disk is written in chunks which we call a "sector".
It is not possible to modify any part of the disk smaller than a sector.
To change a part of the disk smaller than a sector, you have to read in
the full sector that contains the part you want to change, make the
change, then write back out the complete sector.

On a traditional spinning disk, a sector is the minimum unit of transfer
in both directions, both reading and writing.  On flash memory, however,
the minimum size of a read is typically much smaller than a minimum write.
SQLite is only concerned with the minimum write amount and so for the
purposes of this article, when we say "sector" we mean the minimum amount
of data that can be written to mass storage in a single go.


  Prior to SQLite version 3.3.14, a sector size of 512 bytes was
  assumed in all cases.  There was a compile-time option to change
  this but the code had never been tested with a larger value.  The
  512 byte sector assumption seemed reasonable since until very recently
  all disk drives used a 512 byte sector internally.  However, there
  has recently been a push to increase the sector size of disks to
  4096 bytes.  Also the sector size
  for flash memory is usually larger than 512 bytes.  For these reasons,
  versions of SQLite beginning with 3.3.14 have a method in the OS
  interface layer that interrogates the underlying filesystem to find
  the true sector size.  As currently implemented (version 3.5.0) this
  method still returns a hard-coded value of 512 bytes, since there
  is no standard way of discovering the true sector size on either
  Unix or Windows.  But the method is available for embedded device
  manufacturers to tweak according to their own needs.  And we have
  left open the possibility of filling in a more meaningful implementation
  on Unix and Windows in the future.

SQLite has traditionally assumed that a sector write is not atomic.
However, SQLite does always assume that a sector write is linear.  By "linear"
we mean that SQLite assumes that when writing a sector, the hardware begins
at one end of the data and writes byte by byte until it gets to
the other end.  The write might go from beginning to end or from
end to beginning.  If a power failure occurs in the middle of a
sector write it might be that part of the sector was modified
and another part was left unchanged.  The key assumption by SQLite
is that if any part of the sector gets changed, then either the
first or the last bytes will be changed.  So the hardware will
never start writing a sector in the middle and work towards the
ends.  We do not know if this assumption is always true but it
seems reasonable.

The previous paragraph states that SQLite does not assume that
sector writes are atomic.  This is true by default.  But as of
SQLite version 3.5.0, there is a new interface called the
Virtual File System (VFS) interface.  The VFS is the only means
by which SQLite communicates to the underlying filesystem.  The
code comes with default VFS implementations for Unix and Windows
and there is a mechanism for creating new custom VFS implementations
at runtime.  In this new VFS interface there is a method called
xDeviceCharacteristics.  This method interrogates the underlying
filesystem to discover various properties and behaviors that the
filesystem may or may not exhibit.  The xDeviceCharacteristics
method might indicate that sector writes are atomic, and if it does
so in
ŽÚ\“Û>
;g‹5Atomic Commit In SQLite3.3.  Reading Information Out Of The DatabaseAfter the shared lock is acquired, we can begin reading
information from the database file.  In this scenario, we
are assuming a cold cache, so information must first be
read from mass storage into the operating system cache then
transferred from operating system cache into user space.
On subsequent reads, some or all of the information might
already be found in the operating system cache and so only
the transfer to user space would be required.

Usually only a subset of the pages in the database file
are read.  In this example we are showing three
pages out of eight being read.  In a typical application, a
database will have thousands of pages and a query will normally
only touch a small percentage of those pages.atomiccommit.html#_reading_information_out_of_the_database‹f“Û=    ;C–]Atomic Commit In SQLite3.2.  Acquiring A Read LockBefore SQLite can write to a database, it must first read
the database to see what is there already.  Even if it is just
appending new data, SQLite still has to read in the database
schema from the "sqlite_schema" table so that it can know
how to parse the INSERT statements and discover where in the
database file the new information should be stored.

The first step toward reading from the database file
is obtaining a shared lock on the database file.  A "shared"
lock allows two or more database connections to read from the
database file at the same time.  But a shared lock prevents
another database connection from writing to the database file
while we are reading it.  This is necessary because if another
database connection were writing to the database file at the
same time we are reading from the database file, we might read
some data before the change and other data after the change.
This would make it appear as if the change made by the other
process is not atomic.

Notice that the shared lock is on the operating system
disk cache, not on the disk itself.  File locks
really are just flags within the operating system kernel,
usually.  (The details depend on the specific OS layer
interface.)  Hence, the lock will instantly vanish if the
operating system crashes or if there is a power loss.  It
is usually also the case that the lock will vanish if the
process that created the lock exits.atomiccommit.html#_acquiring_a_read_lock†!“Û<       ;3‹)MAtomic Commit In SQLite3.1.  Initial StateThe state of the computer when a database connection is
first opened is shown conceptually by the diagram at the
right.
The area of the diagram on the extreme right (labeled "Disk") represents
information stored on the mass storage device.  Each rectangle is
a sector.  The blue color represents that the sectors contain
original data.
The middle area is the operating systems disk cache.  At the
onset of our example, the cache is cold and this is represented
by leaving the rectangles of the disk cache empty.
The left area of the diagram shows the content of memory for
the process that is using SQLite.  The database connection has
just been opened and no information has been read yet, so the
user space is empty.atomiccommit.html#_initial_state
5D»÷5‡=“ÛB
;}ŒKAtomic Commit In SQLite3.7.  Flushing The Rollback Journal File To Mass StorageThe next step is to flush the content of the rollback journal
file to nonvolatile storage.
As we will see later, 
this is a critical step in insuring that the database can survive
an unexpected power loss.
This step also takes a lot of time, since writing to nonvolatile
storage is normally a slow operation.

This step is usually more complicated than simply flushing
the rollback journal to the disk.  On most platforms two separate
flush (or fsync()) operations are required.  The first flush writes
out the base rollback journal content.  Then the header of the
rollback journal is modified to show the number of pages in the 
rollback journal.  Then the header is flushed to disk.  The details
on why we do this header modification and extra flush are provided
in a later section of this paper.atomiccommit.html#_flushing_the_rollback_journal_file_to_mass_storage…?“ÛA     ;c‰}Atomic Commit In SQLite3.6.  Changing Database Pages In User SpaceAfter the original page content has been saved in the rollback
journal, the pages can be modified in user memory.  Each database
connection has its own private copy of user space, so the changes
that are made in user space are only visible to the database connection
that is making the changes.  Other database connections still see
the information in operating system disk cache buffers which have
not yet been changed.  And so even though one process is busy
modifying the database, other processes can continue to read their
own copies of the original database content.atomiccommit.html#_changing_database_pages_in_user_space‹“Û@       ;Y”#sAtomic Commit In SQLite3.5.  Creating A Rollback Journal FilePrior to making any changes to the database file, SQLite first
creates a separate rollback journal file and writes into the 
rollback journal the original
content of the database pages that are to be altered.
The idea behind the rollback journal is that it contains
all information needed to restore the database back to 
its original state.

The rollback journal contains a small header (shown in green
in the diagram) that records the original size of the database
file.  So if a change causes the database file to grow, we
will still know the original size of the database.  The page
number is stored together with each database page that is 
written into the rollback journal.


  When a new file is created, most desktop operating systems
  (Windows, Linux, Mac OS X) will not actually write anything to
  disk.  The new file is created in the operating systems disk
  cache only.  The file is not created on mass storage until sometime
  later, when the operating system has a spare moment.  This creates
  the impression to users that I/O is happening much faster than
  is possible when doing real disk I/O.  We illustrate this idea in
  the diagram to the right by showing that the new rollback journal
  appears in the operating system disk cache only and not on the
  disk itself.atomiccommit.html#_creating_a_rollback_journal_file‡7“Û?  ;K%eAtomic Commit In SQLite3.4.  Obtaining A Reserved LockBefore making changes to the database, SQLite first
obtains a "reserved" lock on the database file.  A reserved
lock is similar to a shared lock in that both a reserved lock
and shared lock allow other processes to read from the database
file.  A single reserve lock can coexist with multiple shared
locks from other processes.  However, there can only be a
single reserved lock on the database file.  Hence only a
single process can be attempting to write to the database
at one time.

The idea behind a reserved lock is that it signals that
a process intends to modify the database file in the near
future but has not yet started to make the modifications.
And because the modifications have not yet started, other
processes can continue to read from the database.  However,
no other process should also begin trying to write to the
database.atomiccommit.html#_obtaining_a_reserved_lock
\
\„/“ÛE       ;]†suAtomic Commit In SQLite3.10. 0 Flushing Changes To Mass StorageAnother flush must occur to make sure that all the
database changes are written into nonvolatile storage.
This is a critical step to ensure that the database will
survive a power loss without damage.  However, because
of the inherent slowness of writing to disk or flash memory, 
this step together with the rollback journal file flush in section
3.7 above takes up most of the time required to complete a
transaction commit in SQLite.atomiccommit.html#0_flushing_changes_to_mass_storageƒ“ÛD  ;a„5{Atomic Commit In SQLite3.9.  Writing Changes To The Database FileOnce an exclusive lock is held, we know that no other
processes are reading from the database file and it is
safe to write changes into the database file.  Usually
those changes only go as far as the operating systems disk
cache and do not make it all the way to mass storage.atomiccommit.html#_writing_changes_to_the_database_file‹Q“ÛC       ;O•QiAtomic Commit In SQLite3.8.  Obtaining An Exclusive LockPrior to making changes to the database file itself, we must
obtain an exclusive lock on the database file.  Obtaining an
exclusive lock is really a two-step process.  First SQLite obtains
a "pending" lock.  Then it escalates the pending lock to an
exclusive lock.

A pending lock allows other processes that already have a
shared lock to continue reading the database file.  But it
prevents new shared locks from being established.  The idea
behind a pending lock is to prevent writer starvation caused
by a large pool of readers.  There might be dozens, even hundreds,
of other processes trying to read the database file.  Each process
acquires a shared lock before it starts reading, reads what it
needs, then releases the shared lock.  If, however, there are
many different processes all reading from the same database, it
might happen that a new process always acquires its shared lock before
the previous process releases its shared lock.  And so there is
never an instant when there are no shared locks on the database
file and hence there is never an opportunity for the writer to
seize the exclusive lock.  A pending lock is designed to prevent
that cycle by allowing existing shared locks to proceed but
blocking new shared locks from being established.  Eventually
all shared locks will clear and the pending lock will then be
able to escalate into an exclusive lock.atomiccommit.html#_obtaining_an_exclusive_lock
.¨.Šu“ÛG       ;A”7YAtomic Commit In SQLite3.12. 2 Releasing The LockThe last step in the commit process is to release the
exclusive lock so that other processes can once again
start accessing the database file.

In the diagram at the right, we show that the information
that was held in user space is cleared when the lock is released.
This used to be literally true for older versions of SQLite.  But
more recent versions of SQLite keep the user space information
in memory in case it might be needed again at the start of the
next transaction.  It is cheaper to reuse information that is
already in local memory than to transfer the information back
from the operating system disk cache or to read it off of the
disk drive again.  Prior to reusing the information in user space,
we must first reacquire the shared lock and then we have to check
to make sure that no other process modified the database file while
we were not holding a lock.  There is a counter in the first page
of the database that is incremented every time the database file
is modified.  We can find out if another process has modified the
database by checking that counter.  If the database was modified,
then the user space cache must be cleared and reread.  But it is
commonly the case that no changes have been made and the user
space cache can be reused for a significant performance savings.atomiccommit.html#2_releasing_the_lock’S“ÛF     ;W£GoAtomic Commit In SQLite3.11. 1 Deleting The Rollback JournalAfter the database changes are all safely on the mass
storage device, the rollback journal file is deleted.
This is the instant where the transaction commits.
If a power failure or system crash occurs prior to this
point, then recovery processes to be described later make
it appear as if no changes were ever made to the database
file.  If a power failure or system crash occurs after
the rollback journal is deleted, then it appears as if
all changes have been written to disk.  Thus, SQLite gives
the appearance of having made no changes to the database
file or having made the complete set of changes to the
database file depending on whether or not the rollback
journal file exists.

Deleting a file is not really an atomic operation, but
it appears to be from the point of view of a user process.
A process is always able to ask the operating system "does
this file exist?" and the process will get back a yes or no
answer.  After a power failure that occurs during a 
transaction commit, SQLite will ask the operating system
whether or not the rollback journal file exists.  If the
answer is "yes" then the transaction is incomplete and is
rolled back.  If the answer is "no" then it means the transaction
did commit.

The existence of a transaction depends on whether or
not the rollback journal file exists and the deletion
of a file appears to be an atomic operation from the point of
view of a user-space process.  Therefore, 
a transaction appears to be an atomic operation.

The act of deleting a file is expensive on many systems.
As an optimization, SQLite can be configured to truncate
the journal file to zero bytes in length
or overwrite the journal file header with zeros.  In either
case, the resulting journal file is no longer capable of rolling
back and so the transaction still commits.  Truncating a file
to zero length, like deleting a file, is assumed to be an atomic
operation from the point of view of a user process.  Overwriting
the header of the journal with zeros is not atomic, but if any
part of the header is malformed the journal will not roll back.
Hence, one can say that the commit occurs as soon as the header
is sufficiently changed to make it invalid.  Typically this happens
as soon as the first byte of the header is zeroed.atomiccommit.html#1_deleting_the_rollback_journal
Ò
åaÒ†,“ÛL    ;WŠwqAtomic Commit In SQLite4.4.  Rolling Back Incomplete ChangesOnce a process obtains an exclusive lock, it is permitted
to write to the database file.  It then proceeds to read the
original content of pages out of the rollback journal and write
that content back to where it came from in the database file.
Recall that the header of the rollback journal records the original
size of the database file prior to the start of the aborted
transaction.  SQLite uses this information to truncate the
database file back to its original size in cases where the
incomplete transaction caused the database to grow.  At the
end of this step, the database should be the same size and
contain the same information as it did before the start of
the aborted transaction.atomiccommit.html#_rolling_back_incomplete_changes‚Y“ÛK
;oƒ        Atomic Commit In SQLite4.3.  Obtaining An Exclusive Lock On The DatabaseThe first step toward dealing with a hot journal is to
obtain an exclusive lock on the database file.  This prevents two
or more processes from trying to rollback the same hot journal
at the same time.atomiccommit.html#_obtaining_an_exclusive_lock_on_the_databaseŠ“ÛJ    ;C”E]Atomic Commit In SQLite4.2.  Hot Rollback JournalsThe first time that any SQLite process attempts to access
the database file, it obtains a shared lock as described in
section 3.2 above.
But then it notices that there is a 
rollback journal file present.  SQLite then checks to see if
the rollback journal is a "hot journal".   A hot journal is
a rollback journal that needs to be played back in order to
restore the database to a sane state.  A hot journal only
exists when an earlier process was in the middle of committing
a transaction when it crashed or lost power.

A rollback journal is a "hot" journal if all of the following
are true:


The rollback journal exists.
The rollback journal is not an empty file.
There is no reserved lock on the main database file.
The header of the rollback journal is well-formed and in particular
    has not been zeroed out.
The rollback journal does not
contain the name of a super-journal file (see
section 5.5 below) or if does
contain the name of a super-journal, then that super-journal
file exists.


The presence of a hot journal is our indication
that a previous process was trying to commit a transaction but
it aborted for some reason prior to the completion of the
commit.  A hot journal means that
the database file is in an inconsistent state and needs to
be repaired (by rollback) prior to being used.atomiccommit.html#_hot_rollback_journals†“ÛI     ;QŠagAtomic Commit In SQLite4.1.  When Something Goes Wrong...Suppose the power loss occurred
during step 3.10 above,
while the database changes were being written to disk.
After power is restored, the situation might be something
like what is shown to the right.  We were trying to change
three pages of the database file but only one page was
successfully written.  Another page was partially written
and a third page was not written at all.

The rollback journal is complete and intact on disk when
the power is restored.  This is a key point.  The reason for
the flush operation in step 3.7
is to make absolutely sure that
all of the rollback journal is safely on nonvolatile storage
prior to making any changes to the database file itself.atomiccommit.html#_when_something_goes_wrong_ƒx“ÛH      ;%†oCAtomic Commit In SQLite4.  RollbackAn atomic commit is supposed to happen instantaneously.  But the processing
described above clearly takes a finite amount of time.
Suppose the power to the computer were cut
part way through the commit operation described above.  In order
to maintain the illusion that the changes were instantaneous, we
have to "rollback" any partial changes and restore the database to
the state it was in prior to the beginning of the transaction.atomiccommit.html#_rollback
µ
Ö-   Vµ‹“ÛP
;q”!Atomic Commit In SQLite5.1.  Separate Rollback Journals For Each DatabaseWhen multiple database files are involved in a transaction,
each database has its own rollback journal and each database
is locked separately.  The diagram at the right shows a scenario
where three different database files have been modified within
one transaction.  The situation at this step is analogous to 
the single-file transaction scenario at 
step 3.6.  Each database file has
a reserved lock.  For each database, the original content of pages 
that are being changed have been written into the rollback journal
for that database, but the content of the journals have not yet
been flushed to disk.  No changes have been made to the database
file itself yet, though presumably there are changes being held
in user memory.

For brevity, the diagrams in this section are simplified from
those that came before.  Blue color still signifies original content
and pink still signifies new content.  But the individual pages
in the rollback journal and the database file are not shown and
we are not making the distinction between information in the
operating system cache and information that is on disk.  All of
these factors still apply in a multi-file commit scenario.  They
just take up a lot of space in the diagrams and they do not add
any new information, so they are omitted here.atomiccommit.html#_separate_rollback_journals_for_each_database„R“ÛO      ;7‡UAtomic Commit In SQLite5.  Multi-file CommitSQLite allows a single 
database connection to talk to
two or more database files simultaneously through the use of
the ATTACH DATABASE command.
When multiple database files are modified within a single
transaction, all files are updated atomically.  
In other words, either all of the database files are updated or
else none of them are.
Achieving an atomic commit across multiple database files is
more complex that doing so for a single file.  This section
describes how SQLite works that bit of magic.atomiccommit.html#_multi_file_commit„$“ÛN;    …#Atomic Commit In SQLite4.6.  Continue As If The Uncompleted Writes Had Never HappenedThe final recovery step is to reduce the exclusive lock back
to a shared lock.  Once this happens, the database is back in the
state that it would have been if the aborted transaction had never
started.  Since all of this recovery activity happens completely
automatically and transparently, it appears to the program using
SQLite as if the aborted transaction had never begun.atomiccommit.html#_continue_as_if_the_uncompleted_writes_had_never_happened„%“ÛM   ;I‡cAtomic Commit In SQLite4.5.  Deleting The Hot JournalAfter all information in the rollback journal has been
played back into the database file (and flushed to disk in case
we encounter yet another power failure), the hot rollback journal
can be deleted.

As in section 3.11, the journal
file might be truncated to zero length or its header might
be overwritten with zeros as an optimization on systems where
deleting a file is expensive.  Either way, the journal is no 
longer hot after this step.atomiccommit.html#_deleting_the_hot_journal
Ë  |[ˆC“ÛT ;S‹-mAtomic Commit In SQLite5.5.  Delete The Super-Journal FileThe next step is to delete the super-journal file.
This is the point where the multi-file transaction commits.
This step corresponds to 
step 3.11 in the single-file
commit scenario where the rollback journal is deleted.

If a power failure or operating system crash occurs at this
point, the transaction will not rollback when the system reboots
even though there are rollback journals present.  The
difference is the super-journal pathname in the header of the
rollback journal.  Upon restart, SQLite only considers a journal
to be hot and will only playback the journal if there is no
super-journal filename in the header (which is the case for
a single-file commit) or if the super-journal file still
exists on disk.atomiccommit.html#_delete_the_super_journal_file„C“ÛS    ;O‡5iAtomic Commit In SQLite5.4.  Updating The Database FilesOnce all rollback journal files have been flushed to disk, it
is safe to begin updating database files.  We have to obtain an
exclusive lock on all database files before writing the changes.
After all the changes are written, it is important to flush the
changes to disk so that they will be preserved in the event of
a power failure or operating system crash.

This step corresponds to steps
3.8,
3.9, and
3.10 in the single-file commit
scenario described previously.atomiccommit.html#_updating_the_database_files†“ÛR       ;[ŠOuAtomic Commit In SQLite5.3.  Updating Rollback Journal HeadersThe next step is to record the full pathname of the super-journal file
in the header of every rollback journal.  Space to hold the 
super-journal filename was reserved at the beginning of each rollback journal
as the rollback journals were created.

The content of each rollback journal is flushed to disk both before
and after the super-journal filename is written into the rollback
journal header.  It is important to do both of these flushes.  Fortunately,
the second flush is usually inexpensive since typically only a single
page of the journal file (the first page) has changed.

This step is analogous to 
step 3.7 in the single-file commit
scenario described above.atomiccommit.html#_updating_rollback_journal_headersŒ“ÛQ      ;E˜A_Atomic Commit In SQLite5.2.  The Super-Journal FileThe next step in a multi-file commit is the creation of a
"super-journal" file.  The name of the super-journal file is
the same name as the original database filename (the database
that was opened using the 
sqlite3_open() interface,
not one of the ATTACHed auxiliary
databases) with the text "-mjHHHHHHHH" appended where
HHHHHHHH is a random 32-bit hexadecimal number.  The
random HHHHHHHH suffix changes for every new super-journal.

(Nota bene: The formula for computing the super-journal filename
given in the previous paragraph corresponds to the implementation as
of SQLite version 3.5.0.  But this formula is not part of the SQLite
specification and is subject to change in future releases.)

Unlike the rollback journals, the super-journal does not contain
any original database page content.  Instead, the super-journal contains
the full pathnames for rollback journals for every database that is
participating in the transaction.

After the super-journal is constructed, its content is flushed
to disk before any further actions are taken.  On Unix, the directory
that contains the super-journal is also synced in order to make sure
the super-journal file will appear in the directory following a
power failure.

The purpose of the super-journal is to ensure that multi-file
transactions are atomic across a power-loss.  But if the database files
have other settings that compromise integrity across a power-loss event
(such as PRAGMA synchronous=OFF or PRAGMA journal_mode=MEMORY) then
the creation of the super-journal is omitted, as an optimization.atomiccommit.html#_the_super_journal_file
#=
ó#‹K“ÛW ;W•5qAtomic Commit In SQLite6.1.  Always Journal Complete SectorsWhen the original content of a database page is written into
the rollback journal (as shown in section 3.5),
SQLite always writes a complete sector of data, even if the
page size of the database is smaller than the sector size.  
Historically, the sector size in SQLite has been hard coded to 512
bytes and since the minimum page size is also 512 bytes, this has never
been an issue.  But beginning with SQLite version 3.3.14, it is possible
for SQLite to use mass storage devices with a sector size larger than 512
bytes.  So, beginning with version 3.3.14, whenever any page within a
sector is written into the journal file, all pages in that same sector
are stored with it.

It is important to store all pages of a sector in the rollback
journal in order to prevent database corruption following a power
loss while writing the sector.  Suppose that pages 1, 2, 3, and 4 are
all stored in sector 1 and that page 2 is modified.  In order to write
the changes to page 2, the underlying hardware must also rewrite the
content of pages 1, 3, and 4 since the hardware must write the complete
sector.  If this write operation is interrupted by a power outage,
one or more of the pages 1, 3, or 4 might be left with incorrect data.
Hence, to avoid lasting corruption to the database, the original content
of all of those pages must be contained in the rollback journal.atomiccommit.html#_always_journal_complete_sectors‚E“ÛV
;eƒAtomic Commit In SQLite6.  Additional Details Of The Commit ProcessSection 3.0 above provides an overview of
how atomic commit works in SQLite.  But it glosses over a number of
important details.  The following subsections will attempt to fill
in the gaps.atomiccommit.html#_additional_details_of_the_commit_process‡>“ÛU    ;UoAtomic Commit In SQLite5.6.  Clean Up The Rollback JournalsThe final step in a multi-file commit is to delete the
individual rollback journals and drop the exclusive locks on
the database files so that other processes can see the changes.
This corresponds to 
step 3.12 in the single-file
commit sequence.

The transaction has already committed at this point so timing
is not critical in the deletion of the rollback journals.
The current implementation deletes a single rollback journal
then unlocks the corresponding database file before proceeding
to the next rollback journal.  But in the future we might change
this so that all rollback journals are deleted before any database
files are unlocked.  As long as the rollback journal is deleted before
its corresponding database file is unlocked it does not matter in what
order the rollback journals are deleted or the database files are
unlocked.atomiccommit.html#_clean_up_the_rollback_journals
FF›5“ÛX
;w´GAtomic Commit In SQLite6.2.  Dealing With Garbage Written Into Journal FilesWhen data is appended to the end of the rollback journal,
SQLite normally makes the pessimistic assumption that the file
is first extended with invalid "garbage" data and that afterwards
the correct data replaces the garbage.  In other words, SQLite assumes
that the file size is increased first and then afterwards the content
is written into the file.  If a power failure occurs after the file
size has been increased but before the file content has been written,
the rollback journal can be left containing garbage data.  If after
power is restored, another SQLite process sees the rollback journal
containing the garbage data and tries to roll it back into the original
database file, it might copy some of the garbage into the database file
and thus corrupt the database file.

SQLite uses two defenses against this problem.  In the first place,
SQLite records the number of pages in the rollback journal in the header
of the rollback journal.  This number is initially zero.  So during an
attempt to rollback an incomplete (and possibly corrupt) rollback
journal, the process doing the rollback will see that the journal
contains zero pages and will thus make no changes to the database.  Prior
to a commit, the rollback journal is flushed to disk to ensure that
all content has been synced to disk and there is no "garbage" left
in the file, and only then is the page count in the header changed from
zero to true number of pages in the rollback journal.  The rollback journal
header is always kept in a separate sector from any page data so that
it can be overwritten and flushed without risking damage to a data
page if a power outage occurs.  Notice that the rollback journal
is flushed to disk twice: once to write the page content and a second
time to write the page count in the header.

The previous paragraph describes what happens when the
synchronous pragma setting is "full".


PRAGMA synchronous=FULL;


The default synchronous setting is full so the above is what usually
happens.  However, if the synchronous setting is lowered to "normal",
SQLite only flushes the rollback journal once, after the page count has
been written.
This carries a risk of corruption because it might happen that the 
modified (non-zero) page count reaches the disk surface before all
of the data does.  The data will have been written first, but SQLite
assumes that the underlying filesystem can reorder write requests and
that the page count can be burned into oxide first even though its
write request occurred last.  So as a second line of defense, SQLite
also uses a 32-bit checksum on every page of data in the rollback
journal.  This checksum is evaluated for each page during rollback
while rolling back a journal as described in 
section 4.4.  If an incorrect checksum
is seen, the rollback is abandoned.  Note that the checksum does
not guarantee that the page data is correct since there is a small
but finite probability that the checksum might be right even if the data is
corrupt.  But the checksum does at least make such an error unlikely.


Note that the checksums in the rollback journal are not necessary
if the synchronous setting is FULL.  We only depend on the checksums
when synchronous is lowered to NORMAL.  Nevertheless, the checksums
never hurt and so they are included in the rollback journal regardless
of the synchronous setting.atomiccommit.html#_dealing_with_garbage_written_into_journal_files
   ƒm“ÛZ    ;/†EMAtomic Commit In SQLite7.  OptimizationsProfiling indicates that for most systems and in most circumstances
SQLite spends most of its time doing disk I/O.  It follows then that
anything we can do to reduce the amount of disk I/O will likely have a
large positive impact on the performance of SQLite.  This section
describes some of the techniques used by SQLite to try to reduce the
amount of disk I/O to a minimum while still preserving atomic commit.atomiccommit.html#_optimizationsŒ|“ÛY      ;O˜'iAtomic Commit In SQLite6.3.  Cache Spill Prior To CommitThe commit process shown in section 3.0
assumes that all database changes fit in memory until it is time to
commit.  This is the common case.  But sometimes a larger change will
overflow the user-space cache prior to transaction commit.  In those
cases, the cache must spill to the database before the transaction
is complete.

At the beginning of a cache spill, the status of the database
connection is as shown in step 3.6.
Original page content has been saved in the rollback journal and
modifications of the pages exist in user memory.  To spill the cache,
SQLite executes steps 3.7 through
3.9.  In other words, the rollback journal
is flushed to disk, an exclusive lock is acquired, and changes are
written into the database.  But the remaining steps are deferred
until the transaction really commits.  A new journal header is
appended to the end of the rollback journal (in its own sector)
and the exclusive database lock is retained, but otherwise processing
returns to step 3.6.  When the transaction
commits, or if another cache spill occurs, steps
3.7 and 3.9 are
repeated.  (Step 3.8 is omitted on second
and subsequent passes since an exclusive database lock is already held
due to the first pass.)

A cache spill causes the lock on the database file to
escalate from reserved to exclusive.  This reduces concurrency.
A cache spill also causes extra disk flush or fsync operations to
occur and these operations are slow, hence a cache spill can
seriously reduce performance.
For these reasons a cache spill is avoided whenever possible.atomiccommit.html#_cache_spill_prior_to_commit
zŒs“Û\       ;C˜-]Atomic Commit In SQLite7.2.  Exclusive Access ModeSQLite version 3.3.14 adds the concept of "Exclusive Access Mode".
In exclusive access mode, SQLite retains the exclusive
database lock at the conclusion of each transaction.  This prevents
other processes from accessing the database, but in many deployments
only a single process is using a database so this is not a
serious problem.  The advantage of exclusive access mode is that
disk I/O can be reduced in three ways:


It is not necessary to increment the change counter in the
database header for transactions after the first transaction.  This
will often save a write of page one to both the rollback
journal and the main database file.

No other processes can change the database so there is never
a need to check the change counter and clear the user-space cache
at the beginning of a transaction.

Each transaction can be committed by overwriting the rollback
journal header with zeros rather than deleting the journal file.
This avoids having to modify the directory entry for the journal file
and it avoids having to deallocate disk sectors associated with the 
journal.  Furthermore, the next transaction will overwrite existing
journal file content rather than append new content and on most systems
overwriting is much faster than appending.


The third optimization, zeroing the journal file header rather than
deleting the rollback journal file,
does not depend on holding an exclusive lock at all times.
This optimization can be set independently of exclusive lock mode
using the journal_mode pragma
as described in section 7.6 below.atomiccommit.html#_exclusive_access_mode“Û[ ;_œyAtomic Commit In SQLite7.1.  Cache Retained Between TransactionsStep 3.12 of the commit process shows
that once the shared lock has been released, all user-space cache
images of database content must be discarded.  This is done because
without a shared lock, other processes are free to modify the database
file content and so any user-space image of that content might become
obsolete.  Consequently, each new transaction would begin by rereading
data which had previously been read.  This is not as bad as it sounds
at first since the data being read is still likely in the operating
systems file cache.  So the "read" is really just a copy of data
from kernel space into user space.  But even so, it still takes time.

Beginning with SQLite version 3.3.14 a mechanism has been added
to try to reduce the needless rereading of data.  In newer versions
of SQLite, the data in the user-space pager cache is retained when
the lock on the database file is released.  Later, after the
shared lock is acquired at the beginning of the next transaction,
SQLite checks to see if any other process has modified the database
file.  If the database has been changed in any way since the lock
was last released, the user-space cache is erased at that point.
But commonly the database file is unchanged and the user-space cache
can be retained, and some unnecessary read operations can be avoided.

In order to determine whether or not the database file has changed,
SQLite uses a counter in the database header (in bytes 24 through 27)
which is incremented during every change operation.  SQLite saves a copy
of this counter prior to releasing its database lock.  Then after
acquiring the next database lock it compares the saved counter value
against the current counter value and erases the cache if the values
are different, or reuses the cache if they are the same.atomiccommit.html#_cache_retained_between_transactions
åå%“Û^
;qž3Atomic Commit In SQLite7.4.  Single Page Updates And Atomic Sector WritesBeginning in SQLite version 3.5.0, the new Virtual File System (VFS)
interface contains a method named xDeviceCharacteristics which reports
on special properties that the underlying mass storage device
might have.  Among the special properties that
xDeviceCharacteristics might report is the ability of to do an
atomic sector write.

Recall that by default SQLite assumes that sector writes are
linear but not atomic.  A linear write starts at one end of the
sector and changes information byte by byte until it gets to the
other end of the sector.  If a power loss occurs in the middle of
a linear write then part of the sector might be modified while the
other end is unchanged.  In an atomic sector write, either the entire
sector is overwritten or else nothing in the sector is changed.

We believe that most modern disk drives implement atomic sector
writes.  When power is lost, the drive uses energy stored in capacitors
and/or the angular momentum of the disk platter to provide power to 
complete any operation in progress.  Nevertheless, there are so many
layers in between the write system call and the on-board disk drive
electronics that we take the safe approach in both Unix and w32 VFS
implementations and assume that sector writes are not atomic.  On the
other hand, device
manufacturers with more control over their filesystems might want
to consider enabling the atomic write property of xDeviceCharacteristics
if their hardware really does do atomic writes.

When sector writes are atomic and the page size of a database is
the same as a sector size, and when there is a database change that
only touches a single database page, then SQLite skips the whole
journaling and syncing process and simply writes the modified page
directly into the database file.  The change counter in the first
page of the database file is modified separately since no harm is
done if power is lost before the change counter can be updated.atomiccommit.html#_single_page_updates_and_atomic_sector_writes‰l“Û]     ;S‘mAtomic Commit In SQLite7.3.  Do Not Journal Freelist PagesWhen information is deleted from an SQLite database, the pages used
to hold the deleted information are added to a "freelist".  Subsequent
inserts will draw pages off of this freelist rather than expanding the
database file.

Some freelist pages contain critical data; specifically the locations
of other freelist pages.  But most freelist pages contain nothing useful.
These latter freelist pages are called "leaf" pages.  We are free to
modify the content of a leaf freelist page in the database without
changing the meaning of the database in any way.

Because the content of leaf freelist pages is unimportant, SQLite
avoids storing leaf freelist page content in the rollback journal
in step 3.5 of the commit process.
If a leaf freelist page is changed and that change does not get rolled back
during a transaction recovery, the database is not harmed by the omission.
Similarly, the content of a new freelist page is never written back
into the database at step 3.9 nor
read from the database at step 3.3.
These optimizations can greatly reduce the amount of I/O that occurs
when making changes to a database file that contains free space.atomiccommit.html#_do_not_journal_freelist_pages
   à      àŒ“Û_       ;e–9Atomic Commit In SQLite7.5.  Filesystems With Safe Append SemanticsAnother optimization introduced in SQLite version 3.5.0 makes
use of "safe append" behavior of the underlying disk.
Recall that SQLite assumes that when data is appended to a file
(specifically to the rollback journal) that the size of the file
is increased first and that the content is written second.  So
if power is lost after the file size is increased but before the
content is written, the file is left containing invalid "garbage"
data.  The xDeviceCharacteristics method of the VFS might, however,
indicate that the filesystem implements "safe append" semantics.
This means that the content is written before the file size is
increased so that it is impossible for garbage to be introduced
into the rollback journal by a power loss or system crash.

When safe append semantics are indicated for a filesystem,
SQLite always stores the special value of -1 for the page count
in the header of the rollback journal.  The -1 page count value
tells any process attempting to rollback the journal that the
number of pages in the journal should be computed from the journal
size.  This -1 value is never changed.  So that when a commit
occurs, we save a single flush operation and a sector write of
the first page of the journal file.  Furthermore, when a cache
spill occurs we no longer need to append a new journal header
to the end of the journal; we can simply continue appending
new pages to the end of the existing journal.atomiccommit.html#_filesystems_with_safe_append_semantics
½½š>“Û`       ;Q³'kAtomic Commit In SQLite7.6.  Persistent Rollback JournalsDeleting a file is an expensive operation on many systems.
So as an optimization, SQLite can be configured to avoid the
delete operation of section 3.11.
Instead of deleting the journal file in order to commit a transaction,
the file is either truncated to zero bytes in length or its
header is overwritten with zeros.  Truncating the file to zero
length saves having to make modifications to the directory containing
the file since the file is not removed from the directory. 
Overwriting the header has the additional savings of not having
to update the length of the file (in the "inode" on many systems)
and not having to deal with newly freed disk sectors.  Furthermore,
at the next transaction the journal will be created by overwriting
existing content rather than appending new content onto the end
of a file, and overwriting is often much faster than appending.

SQLite can be configured to commit transactions by overwriting
the journal header with zeros instead of deleting the journal file
by setting the "PERSIST" journaling mode using the 
journal_mode PRAGMA.
For example:


PRAGMA journal_mode=PERSIST;


The use of persistent journal mode provides a noticeable performance
improvement on many systems.  Of course, the drawback is that the 
journal files remain on the disk, using disk space and cluttering
directories, long after the transaction commits.  The only safe way
to delete a persistent journal file is to commit a transaction
with journaling mode set to DELETE:


PRAGMA journal_mode=DELETE;
BEGIN EXCLUSIVE;
COMMIT;


Beware of deleting persistent journal files by any other means
since the journal file might be hot, in which case deleting it will
corrupt the corresponding database file.

Beginning in SQLite version 3.6.4 (2008-10-15), 
the TRUNCATE journal mode is
also supported:


PRAGMA journal_mode=TRUNCATE;


In truncate journal mode, the transaction is committed by truncating
the journal file to zero length rather than deleting the journal file
(as in DELETE mode) or by zeroing the header (as in PERSIST mode).
TRUNCATE mode shares the advantage of PERSIST mode that the directory
that contains the journal file and database does not need to be updated.
Hence truncating a file is often faster than deleting it.  TRUNCATE has
the additional advantage that it is not followed by a
system call (ex: fsync()) to synchronize the change to disk.  It might
be safer if it did.
But on many modern filesystems, a truncate is an atomic and
synchronous operation and so we think that TRUNCATE will usually be safe
in the face of power failures.  If you are uncertain about whether or
not TRUNCATE will be synchronous and atomic on your filesystem and it is
important to you that your database survive a power loss or operating
system crash that occurs during the truncation operation, then you might
consider using a different journaling mode.

On embedded systems with synchronous filesystems, TRUNCATE results
in slower behavior than PERSIST.  The commit operation is the same speed.
But subsequent transactions are slower following a TRUNCATE because it is
faster to overwrite existing content than to append to the end of a file.
New journal file entries will always be appended following a TRUNCATE but
will usually overwrite with PERSIST.atomiccommit.html#_persistent_rollback_journals
     Ž“Ûc     ;Uš;oAtomic Commit In SQLite9.1.  Broken Locking ImplementationsSQLite uses filesystem locks to make sure that only one
process and database connection is trying to modify the database
at a time.  The filesystem locking mechanism is implemented
in the VFS layer and is different for every operating system.
SQLite depends on this implementation being correct.  If something
goes wrong and two or more processes are able to write the same
database file at the same time, severe damage can result.

We have received reports of implementations of both
Windows network filesystems and NFS in which locking was
subtly broken.  We can not verify these reports, but as
locking is difficult to get right on a network filesystem
we have no reason to doubt them.  You are advised to 
avoid using SQLite on a network filesystem in the first place,
since performance will be slow.  But if you must use a 
network filesystem to store SQLite database files, consider
using a secondary locking mechanism to prevent simultaneous
writes to the same database even if the native filesystem
locking mechanism malfunctions.

The versions of SQLite that come preinstalled on Apple
Mac OS X computers contain a version of SQLite that has been
extended to use alternative locking strategies that work on
all network filesystems that Apple supports.  These extensions
used by Apple work great as long as all processes are accessing
the database file in the same way.  Unfortunately, the locking
mechanisms do not exclude one another, so if one process is
accessing a file using (for example) AFP locking and another
process (perhaps on a different machine) is using dot-file locks,
the two processes might collide because AFP locks do not exclude
dot-file locks or vice versa.atomiccommit.html#_broken_locking_implementationsƒK“Ûb     ;E…UcAtomic Commit In SQLite9.  Things That Can Go WrongThe atomic commit mechanism in SQLite has proven to be robust,
but it can be circumvented by a sufficiently creative
adversary or a sufficiently broken operating system implementation.
This section describes a few of the ways in which an SQLite database
might be corrupted by a power failure or system crash.
(See also: How To Corrupt Your Database Files.)atomiccommit.html#_things_that_can_go_wrongŒ“Ûa ;Q–YoAtomic Commit In SQLite8.  Testing Atomic Commit BehaviorThe developers of SQLite are confident that it is robust
in the face of power failures and system crashes because the
automatic test procedures do extensive checks on
the ability of SQLite to recover from simulated power loss.
We call these the "crash tests".

Crash tests in SQLite use a modified VFS that can simulate
the kinds of filesystem damage that occur during a power
loss or operating system crash.  The crash-test VFS can simulate
incomplete sector writes, pages filled with garbage data because
a write has not completed, and out of order writes, all occurring
at varying points during a test scenario.  Crash tests execute
transactions over and over, varying the time at which a simulated
power loss occurs and the properties of the damage inflicted.
Each test then reopens the database after the simulated crash and
verifies that the transaction either occurred completely
or not at all and that the database is in a completely
consistent state.

The crash tests in SQLite have discovered a number of very
subtle bugs (now fixed) in the recovery mechanism.  Some of 
these bugs were very obscure and unlikely to have been found
using only code inspection and analysis techniques.  From this
experience, the developers of SQLite feel confident that any other
database system that does not use a similar crash test system
likely contains undetected bugs that will lead to database
corruption following a system crash or power failure.atomiccommit.html#_testing_atomic_commit_behavior
_Q        r_„“Ûf    ;M†OgAtomic Commit In SQLite9.4.  Garbage Written Into FilesSQLite database files are ordinary disk files that can be
opened and written by ordinary user processes.  A rogue process
can open an SQLite database and fill it with corrupt data.  
Corrupt data might also be introduced into an SQLite database
by bugs in the operating system or disk controller; especially
bugs triggered by a power failure.  There is nothing SQLite can
do to defend against these kinds of problems.atomiccommit.html#_garbage_written_into_filesƒZ“Ûe ;E…w_Atomic Commit In SQLite9.3.  Partial File DeletionsSQLite assumes that file deletion is an atomic operation from the
point of view of a user process.  If power fails in the middle of
a file deletion, then after power is restored SQLite expects to see
either the entire file with all of its original data intact, or it
expects not to find the file at all.  Transactions may not be atomic
on systems that do not work this way.atomiccommit.html#_partial_file_deletions‰*“Ûd     ;G‘aAtomic Commit In SQLite9.2.  Incomplete Disk FlushesSQLite uses the fsync() system call on Unix and the FlushFileBuffers()
system call on w32 in order to sync the file system buffers onto disk
oxide as shown in step 3.7 and
step 3.10.  Unfortunately, we have received
reports that neither of these interfaces works as advertised on many
systems.  We hear that FlushFileBuffers() can be completely disabled
using registry settings on some Windows versions.  Some historical
versions of Linux contain versions of fsync() which are no-ops on
some filesystems, we are told.  Even on systems where 
FlushFileBuffers() and fsync() are said to be working, often
the IDE disk control lies and says that data has reached oxide
while it is still held only in the volatile control cache.

On the Mac, you can set this pragma:


PRAGMA fullfsync=ON;


Setting fullfsync on a Mac will guarantee that data really does
get pushed out to the disk platter on a flush.  But the implementation
of fullfsync involves resetting the disk controller.  And so not only
is it profoundly slow, it also slows down other unrelated disk I/O.
So its use is not recommended.atomiccommit.html#_incomplete_disk_flushes
JJ‰L“Ûh ;W‘5sAtomic Commit In SQLite10.  Future Directions And ConclusionEvery now and then someone discovers a new failure mode for
the atomic commit mechanism in SQLite and the developers have to
put in a patch.  This is happening less and less and the
failure modes are becoming more and more obscure.  But it would
still be foolish to suppose that the atomic commit logic of
SQLite is entirely bug-free.  The developers are committed to fixing
these bugs as quickly as they might be found.


The developers are also on the lookout for new ways to
optimize the commit mechanism.  The current VFS implementations
for Unix (Linux and Mac OS X) and Windows make pessimistic assumptions about
the behavior of those systems.  After consultation with experts
on how these systems work, we might be able to relax some of the
assumptions on these systems and allow them to run faster.  In
particular, we suspect that most modern filesystems exhibit the
safe append property and that many of them might support atomic
sector writes.  But until this is known for certain, SQLite will
take the conservative approach and assume the worst.
This page last modified on  2021-10-05 17:51:47 UTCatomiccommit.html#_future_directions_and_conclusion“`“Ûg     ;]¥SwAtomic Commit In SQLite9.5.  Deleting Or Renaming A Hot JournalIf a crash or power loss does occur and a hot journal is left on
the disk, it is essential that the original database file and the hot
journal remain on disk with their original names until the database
file is opened by another SQLite process and rolled back.  
During recovery at step 4.2 SQLite locates
the hot journal by looking for a file in the same directory as the
database being opened and whose name is derived from the name of the
file being opened.  If either the original database file or the
hot journal have been moved or renamed, then the hot journal will
not be seen and the database will not be rolled back.

We suspect that a common failure mode for SQLite recovery happens
like this:  A power failure occurs.  After power is restored, a well-meaning
user or system administrator begins looking around on the disk for
damage.  They see their database file named "important.data".  This file
is perhaps familiar to them.  But after the crash, there is also a
hot journal named "important.data-journal".  The user then deletes
the hot journal, thinking that they are helping to cleanup the system.
We know of no way to prevent this other than user education.

If there are multiple (hard or symbolic) links to a database file,
the journal will be created using the name of the link through which
the file was opened.  If a crash occurs and the database is opened again
using a different link, the hot journal will not be located and no
rollback will occur.

Sometimes a power failure will cause a filesystem to be corrupted
such that recently changed filenames are forgotten and the file is
moved into a "/lost+found" directory.  When that happens, the hot
journal will not be found and recovery will not occur.
SQLite tries to prevent this
by opening and syncing the directory containing the rollback journal
at the same time it syncs the journal file itself.  However, the
movement of files into /lost+found can be caused by unrelated processes
creating unrelated files in the same directory as the main database file.
And since this is out from under the control of SQLite, there is nothing
that SQLite can do to prevent it.  If you are running on a system that
is vulnerable to this kind of filesystem namespace corruption (most
modern journalling filesystems are immune, we believe) then you might
want to consider putting each SQLite database file in its own private
subdirectory.atomiccommit.html#_deleting_or_renaming_a_hot_journal
?R    Õ?…“ú[    _/ˆuAThe generate_series Table-Valued Function2. Usage ExamplesGenerate all multiples of 5 less than or equal to 100:

SELECT value FROM generate_series(5,100,5);


Generate the 20 random integer values:

SELECT random() FROM generate_series(1,20);


Find the name of every customer whose account number
   is an even multiple of 100 between 10000 and 20000.

SELECT customer.name
  FROM customer, generate_series(10000,20000,100)
 WHERE customer.id=value;
/* or */
SELECT name FROM customer
 WHERE id IN (SELECT value
                FROM generate_series(10000,20000,200));

This page last modified on  2022-01-20 21:38:08 UTCseries.html#usage_examples„x“úZ      _o‡G}The generate_series Table-Valued Function1.1. Equivalent Recursive Common Table ExpressionThe generate_series table can be simulated using a
recursive common table expression.  If the three parameters
are $start, $end, and $step, then the equivalent common table
expression is:

WITH RECURSIVE generate_series(value) AS (
  SELECT $start
  UNION ALL
  SELECT value+$step FROM generate_series
   WHERE value+$step&lt;=$end
) ...


The common table expression works without having to load an
extension.  On the other hand, the extension is easier to program
and faster.series.html#equivalent_recursive_common_table_expression‡)“úY        _#=5The generate_series Table-Valued Function1. OverviewThe generate_series(START,END,STEP) table-valued function is a
loadable extension included in the SQLite source tree, and compiled into
the command-line shell.  The generate_series() table has a single
result column named "value" holding integer values
and a number of rows determined by the
parameters START, END, and STEP.  The first row of the table has
a value of START.  Subsequent rows increase by STEP up to END.

Omitted parameters take on default values.  STEP defaults to 1.
END defaults to 9223372036854775807.  The START parameter is required
as of version 3.37.0 (2021-11-27) and later and an error will
be raised if START is omitted or has a self-referential or otherwise
uncomputable value.  Older versions used a default of 0 for START.
The legacy behavior can be obtained from recent code by compiling
with -DZERO_ARGUMENT_GENERATE_SERIES.series.html#overview
]ñ]‡”‚B     ;MŒSeSwarmvtab Virtual Table2. Compiling and Using SwarmvtabThe code for the swarmvtab virtual table is found in the
ext/misc/unionvtab.c file of the main SQLite source tree. It may be compiled
into an SQLite loadable extension using a command like:

gcc -g -fPIC -shared unionvtab.c -o unionvtab.so


Alternatively, the unionvtab.c file may be compiled into the application. 
In this case, the following function should be invoked to register the
extension with each new database connection:

int sqlite3_unionvtab_init(sqlite3 *db, void*, void*);


 The first argument passed should be the database handle to register the
extension with. The second and third arguments should both be passed 0.

 The source file and entry point are named for "unionvtab" instead of
"swarmvtab". Unionvtab is a separately documented virtual table 
that is bundled with swarmvtab.swarmvtab.html#compiling_and_using_swarmvtab˜
”‚A     ;#¯;Swarmvtab Virtual Table1. OverviewThe "swarmvtab" virtual table allows the user to query a large number 
of tables (hereafter "component" tables) with similar schemas but distinct
ranges of rowid values as if they were a single database table. The tables may
be (and usually are) located in different databases. Swarmvtab tables are
read-only.

Component tables must not be declared WITHOUT ROWID, and must all have
the same schema, but may have different names within their databases. In
this context, "the same schema" means that:


  All component tables must have the same set of columns, in the same 
      order.
  The types and default collation sequences attached to each column
      must be the same for all component tables.
  All component tables must have the same PRIMARY KEY declaration (if any).


A swarmvtab table has the same schema as each of its component tables.

A swarmvtab virtual table is created as follows:

CREATE VIRTUAL TABLE temp.&lt;name&gt; USING swarmvtab(&lt;sql-statement&gt;);


Swarmvtab virtual tables must be created in the temp schema. Attempting
to create a swarmvtab in the main or an attached database is an error.

The SQL statement supplied as the argument to the CREATE VIRTUAL TABLE
statement is executed when the table is created. It must return either four
or five columns. Each row returned describes one of the component tables. The
first four columns are interpreted, from first to last, as:


   Database URI. A filename or URI that can be used to open the
  database containing the component table.

   Table name. The name of the component table within its database.

   Minimum rowid. The smallest rowid value that the component
  table may contain.

   Maximum rowid. The smallest rowid value that the component
  table may contain.


The interpretation of the final column, if it is present, is 
described here.

For example, say the SQL statement returns the following data when 
executed:


Database URITable nameMinimum rowidMaximum rowid
test.db1 t1 0 10
test.db2 t2 11 20
test.db3 t1 21 30
test.db4 t1 31 40


and the user queries the swarmvtab table for the row with rowid value
25. The swarmvtab table will open database file "test.db3" and read the
data to return from table "t1" (as 25 falls within the range of rowids
assigned to table "t1" in "test.db3").

Swarmvtab efficiently handles range and equality constraints on the
rowid (or other INTEGER PRIMARY KEY) field only. If a query does not 
contain such a constraint, then swarmvtab finds the results by opening
each database in turn and linearly scanning the component table. Which 
generates a correct result, but is often slow.

There must be no overlapping rowid ranges in the rows returned by
the SQL statement. It is an error if there are.

The swarmvtab implementation may open or close databases at any 
point. By default, it attempts to limit the maximum number of 
simultaneously open database files to nine. This is not a hard limit -
it is possible to construct a scenario that will cause swarmvtab to 
exceed it.swarmvtab.html#overview
)…     ¤²)”‚F     ;G˜QWSwarmvtab Virtual Table3.3. The "openclose" CallbackThe "openclose" parameter allows the user to specify the name of a
application-defined SQL function that will be invoked just before
swarmvtab opens a database, and again just after it closes one. The first
argument passed to the open close function is the filename or URI
identifying the database to be opened or just recently closed (the same
value returned in the leftmost column of the SQL statement provided to
the CREATE VIRTUAL TABLE command). The second argument is integer value
0 when the function is invoked before opening a database, and 1 when it
is invoked after one is closed. For example, if:

CREATE VIRTUAL TABLE temp.x1 USING swarmvtab (
  "SELECT ...",
  openclose = 'openclose_udf'
);


then before each database containing a component table is opened, 
swarmvtab effectively executes:

SELECT openclose_udf(&lt;database-name&gt;, 0);


After a database is closed, swarmvtab runs the equivalent of:

SELECT openclose_udf(&lt;database-name&gt;, 1);


Any value returned by the openclose function is ignored. If an invocation
made before opening a database returns an error, then the database file is
not opened and the error returned to the user. This is the only scenario
in which swarmvtab will issue an "open" invocation without also eventually
issuing a corresponding "close" call. If there are still databases open,
"close" calls may be issued from within the eventual sqlite3_close() call
on the applications database that deletes the temp schema in which the
swarmvtab table resides.

Errors returned by "close" invocations are always ignored.swarmvtab.html#the_openclose_callbackƒm”‚E    ;E†'USwarmvtab Virtual Table3.2. The "maxopen" ParameterBy default, swarmvtab attempts to limit the number of simultaneously
open databases to nine. This parameter allows that limit to be changed.
For example, to create a swarmvtab table that may hold up to 30 databases
open simultaneously:

CREATE VIRTUAL TABLE temp.x1 USING swarmvtab (
  "SELECT ...",
  maxopen=30
);


Raising the number of open databases may improve performance in some
scenarios.swarmvtab.html#the_maxopen_parameter…\”‚D     ;3Š%GSwarmvtab Virtual Table3.1. SQL ParametersIf a parameter name begins with a ":", then it is assumed to be a
value to bind to the SQL statement before executing it. The value is always
bound as text. It is an error if the specified SQL parameter does not
exist. For example:

CREATE VIRTUAL TABLE temp.x1 USING swarmvtab (
  "SELECT :dir || local_filename, tbl, min, max FROM components",
  :dir = '/home/user/app/databases/'
);


When the above CREATE VIRTUAL TABLE statement is executed, swarmvtab binds
the text value "/home/user/app/databases/" to the :dir parameter of the
SQL statement before executing it.

A single CREATE VIRTUAL TABLE statement may contain any number of SQL
parameters.swarmvtab.html#sql_parameters†v”‚C   ;/Œ]GSwarmvtab Virtual Table3. Advanced UsageMost users of swarmvtab will only use the features described above. 
This section describes features designed for more esoteric use cases. These
features all involve specifying extra optional parameters following the SQL
statement as part of the CREATE VIRTUAL TABLE command. An optional parameter 
is specified using its name, followed by an "=" character, followed by an
optionally quoted value. Whitespace may separate the name, "=" character 
and value. For example:

CREATE VIRTUAL TABLE temp.sv USING swarmvtab (
  'SELECT ...',                -- the SELECT statement
  maxopen = 20,                -- An optional parameter
  missing='missing_udf'        -- Another optional parameter
);


The following sections describe the supported parameters. Specifying
an unrecognized parameter name is an error.swarmvtab.html#advanced_usage
        ƈy”’  C#kCDeterministic SQL Functions1. OverviewSQL functions in SQLite can be either "deterministic" or "non-deterministic".


A deterministic function always gives the same answer when it has
the same inputs.  Most built-in SQL functions in SQLite are
deterministic.  For example, the abs(X) function always returns
the same answer as long as its input X is the same.


Non-deterministic functions might give different answers on each
invocation, even if the arguments are always the same.  The following
are examples of non-deterministic functions:


 random()
 changes()
 last_insert_rowid()
 sqlite3_version()



The random() function is obviously non-deterministic because it gives
a different answer every time it is invoked.  The answers from changes()
and last_insert_rowid() depend on prior SQL statements, and so they
are also non-deterministic. The
sqlite3_version() function is mostly constant, but it can change when
SQLite is upgraded, and so even though it always returns the same answer
for any particular session, because it can change answers across sessions
it is still considered non-deterministic.deterministic.html#overview†2”‚H       ;W‹
gSwarmvtab Virtual Table3.5. Component table "context" valuesIf the SELECT statement specified as part of the CREATE VIRTUAL 
TABLE command returns five columns, then the final column is used
for application context only. Swarmvtab does not use this value at
all, except that it is passed after &lt;database-name&gt; to both
the openclose and missing functions, if specified. In other words,
instead of invoking the functions as described above, if the "context"
column is present swarmvtab instead invokes:

SELECT missing_udf(&lt;database-name&gt;, &lt;context&gt;);
SELECT openclose_udf(&lt;database-name&gt;, &lt;context&gt;, 0);
SELECT openclose_udf(&lt;database-name&gt;, &lt;context&gt;, 1);


as required.
This page last modified on  2018-01-22 17:51:55 UTCswarmvtab.html#component_table_context_valuesŒ5”‚G   ;C—;SSwarmvtab Virtual Table3.4. The "missing" CallbackThe "missing" parameter allows the user to specify the name of a
application-defined SQL function that will be invoked just before
swarmvtab opens a database if it finds that the required database file
is not present on disk. This provides the application with an opportunity
to retrieve the required database from a remote source before swarmvtab
attempts to open it. The only argument passed to the "missing" function
is the name or URI that identifies the database being opened. Assuming:

CREATE VIRTUAL TABLE temp.x1 USING swarmvtab (
  "SELECT ...",
  openclose = 'openclose_udf',
  missing='missing_udf'
);


then the missing function is invoked as follows:

SELECT missing_udf(&lt;database-name&gt;);


If the missing function returns an error, then the database is not 
opened and the error returned to the user. If an openclose function is
configured, then a "close" invocation is issued at this point to match
the earlier "open". The following pseudo-code illustrates the procedure used
by a swarmvtab instance with both missing and openclose functions configured
when a component database is opened.

SELECT openclose_udf(&lt;database-name&gt;, 0);
if( error ) return error;
if( db does not exist ){
  SELECT missing_udf(&lt;database-name&gt;);
  if( error ){
    SELECT openclose_udf(&lt;database-name&gt;, 1);
    return error;
  }
}
sqlite3_open_v2(&lt;database-name&gt;);
if( error ){
  SELECT openclose_udf(&lt;database-name&gt;, 1);
  return error;
}
// db successfully opened!swarmvtab.html#the_missing_callback
OlOˆ”’       CIŽaeDeterministic SQL Functions3.1. Bug fix in version 3.35.2When the enhancement was made to SQLite 3.20.0 such that date/time
functions would be considered deterministic as they do not depend
on the current time, one case was overlooked:
Many of the date/time functions can be called
with no arguments at all.  These no-argument date/time functions
behave as if they had a single "'now'" argument.
Thus "datetime()" and
"datetime('now')" both yield the current date and time.
However, only the second form was recognized as non-deterministic.
This meant that developers could sneak the non-deterministic
"datetime()" form into CHECK constraints, index
expressions, generated column expressions, and similar places
where non-deterministic functions make no sense.
This oversight was fixed in version 3.35.2 (2021-03-17).
However, there may be legacy databases in circulation that were created
by SQLite version 3.20.0 through 3.35.1 that have non-deterministic
date/time functions in their schemas.deterministic.html#bug_fix_in_version_3_35_2‡4”’
CqŒCDeterministic SQL Functions3. Special-case Processing For Date/Time FunctionsThe built-in date and time functions of SQLite are a special case.
These functions are usually considered deterministic.  However, if
these functions use the string "now" as the date, or if they use
the localtime modifier or the utc modifier, then they are
considered non-deterministic.  Because the function inputs are
not necessarily known until run-time, the date/time functions will
throw an exception if they encounter any of the non-deterministic
features in a context where only deterministic functions are allowed.


Prior to SQLite 3.20.0 (2017-08-01) all date/time functions were
always considered non-deterministic.  The ability for date/time functions
to be deterministic sometimes and non-deterministic at other times,
depending on their arguments, was added for the 3.20.0 release.deterministic.html#special_case_processing_for_date_time_functions‡V”’
CŒkDeterministic SQL Functions2. Restrictions on the use of non-deterministic functionsThere are some contexts in SQLite that do not allow the use of
non-deterministic functions:


In the expression of a CHECK constraint.
In the WHERE clause of a partial index.
In an expression used as part of an expression index.
In the expression of a generated column.



In the cases above, the values returned by the function affects the
information stored in the database file.  The values of functions
in CHECK constraints determines which entries are valid for a table,
and functions in the WHERE clause of a partial index or in an index on
an expression compute values stored in the index b-tree.
If any of these functions later returns a different
value, then the database might no longer be well-formed.  
Hence, to avoid database corruption,
only deterministic functions can be used in the contexts
above.deterministic.html#restrictions_on_the_use_of_non_deterministic_functions
(¥†(‚Y”™{    oAƒSQThe Geopoly Interface To The SQLite R*Tree Module1.2. Binary storage formatInternally, Geopoly stores polygons in a binary format - an SQL BLOB.
Details of the binary format are given below.
All of the Geopoly interfaces are able to accept polygons in either the
GeoJSON format or in the binary format.geopoly.html#binary_storage_formatŠ”™z  o%“
5The Geopoly Interface To The SQLite R*Tree Module1.1. GeoJSONThe GeoJSON standard is syntax for
exchanging geospatial information using JSON.  GeoJSON is a rich standard
that can describe nearly any kind of geospatial content.

The Geopoly module only understands
a small subset of GeoJSON, but a critical subset.  
In particular, GeoJSON understands
the JSON array of vertexes that describes a simple polygon.

A polygon is defined by its vertexes.
Each vertex is a JSON array of two numeric values which are the
X and Y coordinates of the vertex.
A polygon is a JSON array of at least four of these vertexes, 
and hence is an array of arrays.
The first and last vertex in the array must be the same.
The polygon follows the right-hand rule:  When tracing a line from
one vertex to the next, the area to the right of the line is outside
of the polygon and the area to the left is inside the polygon.
In other words, the net rotation of the vertexes is counter-clockwise.


For example, the following JSON describes an isosceles triangle, sitting
on the X axis and with an area of 0.5:

&#91;&#91;0,0],&#91;1,0],&#91;0.5,1],&#91;0,0]]



A triangle has three vertexes, but the GeoJSON description of the triangle
has 4 vertexes because the first and last vertex are duplicates.geopoly.html#geojsonˆs”™y       o#?7The Geopoly Interface To The SQLite R*Tree Module1. OverviewThe Geopoly module is an alternative interface to the R-Tree extension that uses
the GeoJSON notation
(RFC-7946) to describe two-dimensional
polygons.  Geopoly includes functions for detecting when one polygon is
contained within or overlaps with another, for computing the
area enclosed by a polygon, for doing linear transformations of polygons,
for rendering polygons as
SVG, and other
similar operations.


The source code for Geopoly is included in the amalgamation but is not
included in the library unless the -DSQLITE_ENABLE_GEOPOLY compile-time option
is used.


Geopoly operates on "simple" polygons - that is, polygons for which
the boundary does not intersect itself.  Geopoly thus extends the capabilities
of the R-Tree extension which can only deal with rectangular areas.
On the other hand, the R-Tree extension is
able to handle between 1 and 5 coordinate dimensions, whereas Geopoly is restricted
to 2-dimensional shapes only.


Each polygon in the Geopoly module can be associated with an arbitrary
number of auxiliary data fields.geopoly.html#overview‰^”’
Ci‘'        Deterministic SQL Functions4. Application-defined deterministic functionsBy default, application-defined SQL functions are considered to
be non-deterministic.  However, if the 4th parameter to
sqlite3_create_function_v2() is OR-ed with 
SQLITE_DETERMINISTIC, then SQLite will treat that function as if it
were deterministic.


Note that if a non-deterministic function is tagged with
SQLITE_DETERMINISTIC and if that function ends up being used in
the WHERE clause of a partial index or in an
expression index, then when the function begins to return different
answers, the associated index may become corrupt.  If an SQL function
is nearly deterministic (which is to say, if it only rarely changes,
like sqlite_version()) and it is used in an index that becomes
corrupt, the corruption can be fixed by running REINDEX.


The interfaces necessary to construct a function that is sometimes
deterministic and sometimes non-deterministic depending on their
inputs, such as the built-in date/time functions, are not published.
Generic application-defined SQL functions must
be always deterministic or always non-deterministic.
This page last modified on  2021-06-17 16:11:09 UTCdeterministic.html#application_defined_deterministic_functions
aá…}”š       o[‰iiThe Geopoly Interface To The SQLite R*Tree Module3.2. The geopoly_within(P1,P2) FunctionIf P1 and P2 are both polygons, then the geopoly_within(P1,P2) function returns
a non-zero integer if P1 is completely contained within P2, or it returns zero
if any part of P1 is outside of P2.  If P1 and P2 are the same polygon, this routine
returns non-zero.
If either P1 or P2 is not a polygon, this routine returns NULL.


The geopoly_within(P1,P2) function is special in that the geopoly virtual
table knows how to use R*Tree indexes to optimize queries in which the 
WHERE clause uses geopoly_within() as a boolean function.  Only the
geopoly_within(P1,P2) and geopoly_overlap(P1,P2) functions have this
capability.geopoly.html#the_geopoly_within_p1_p2_function…?”™  o]ˆikThe Geopoly Interface To The SQLite R*Tree Module3.1. The geopoly_overlap(P1,P2) FunctionIf P1 and P2 are both polygons, then the geopoly_overlap(P1,P2) function returns
a non-zero integer if there is any overlap between P1 and P2, or it returns
zero if P1 and P2 completely disjoint.
If either P1 or P2 is not a polygon, this routine returns NULL.


The geopoly_overlap(P1,P2) function is special in that the geopoly virtual
table knows how to use R*Tree indexes to optimize queries in which the 
WHERE clause uses geopoly_overlap() as a boolean function.  Only the
geopoly_overlap(P1,P2) and geopoly_within(P1,P2) functions have this
capability.geopoly.html#the_geopoly_overlap_p1_p2_function‚5”™~ o5ƒIThe Geopoly Interface To The SQLite R*Tree Module3. Special FunctionsThe geopoly module defines several new SQL functions that are useful for
dealing with polygons.  All polygon arguments to these functions can be
either the GeoJSON format or the internal binary format.geopoly.html#special_functionsŠA”™}     o%“[5The Geopoly Interface To The SQLite R*Tree Module2.1. QueriesTo query the geopoly table using an indexed geospatial search, 
use one of the functions geopoly_overlap()
or geopoly_within() as a boolean function in the WHERE clause,
with the "_shape" column as the first argument to the function.
For example:

SELECT * FROM newtab WHERE geopoly_overlap(_shape, $query_polygon);



The previous example will return every row for which the _shape
overlaps the polygon in the $query_polygon parameter.  The
geopoly_within() function works similarly, but only returns rows for
which the _shape is completely contained within $query_polygon.


Queries (and also DELETE and UPDATE statements) in which the WHERE
clause contains a bare geopoly_overlap() or geopoly_within() function
make use of the underlying R*Tree data structures for a fast lookup that
only has to examine a subset of the rows in the table.  The number of
rows examines depends, of course, on the size of the $query_polygon.
Large $query_polygons will normally need to look at more rows than small
ones.


Queries against the rowid of a geopoly table are also very quick, even
for tables with a vast number of rows.
However, none of the auxiliary data columns are indexes, and so queries
against the auxiliary data columns will involve a full table scan.geopoly.html#queries‡”™|     oIŒA]The Geopoly Interface To The SQLite R*Tree Module2. Using The Geopoly ExtensionA geopoly table is created as follows:

CREATE VIRTUAL TABLE newtab USING geopoly(a,b,c);



The statement above creates a new geopoly table named "newtab".
Every geopoly table contains a built-in integer "rowid" column
and a "_shape" column that contains
the polygon associated with that row of the table.
The example above also defines three auxiliary data columns 
named "a", "b", and "c" that can store whatever additional
information the application needs to associate
with each polygon.  If there is no need to store auxiliary
information, the list of auxiliary columns can be omitted.


Store new polygons in the table using ordinary INSERT statements:

INSERT INTO newtab(_shape) VALUES('&#91;&#91;0,0],&#91;1,0],&#91;0.5,1],&#91;0,0]]');



UPDATE and DELETE statements work similarly.geopoly.html#using_the_geopoly_extension
ið
Õ™WÎiˆ`”š        oiwThe Geopoly Interface To The SQLite R*Tree Module3.9. The geopoly_xform(P,A,B,C,D,E,F) FunctionThe geopoly_xform(P,A,B,C,D,E,F) function returns a new polygon that is an
affine transformation of the polygon P and where the transformation
is defined by values A,B,C,D,E,F. If P is not a valid polygon, this
routine returns NULL.


The transformation converts each vertex of the polygon according to the
following formula:

x1 = A*x0 + B*y0 + E
y1 = C*x0 + D*y0 + F



So, for example, to move a polygon by some amount DX, DY without changing
its shape, use:

geopoly_xform($polygon, 1, 0, 0, 1, $DX, $DY)



To rotate a polygon by R radians around the point 0, 0:

geopoly_xform($polygon, cos($R), sin($R), -sin($R), cos($R), 0, 0)



Note that a transformation that flips the polygon might cause the
order of vertexes to be reversed.  In other words, the transformation
might cause the vertexes to circulate in clockwise order instead of
counter-clockwise.  This can be corrected by sending the result
through the geopoly_ccw() function after transformation.geopoly.html#the_geopoly_xform_p_a_b_c_d_e_f_functionƒ”š      okƒWyThe Geopoly Interface To The SQLite R*Tree Module3.8. The geopoly_contains_point(P,X,Y) FunctionIf P is a polygon, then geopoly_contains_point(P,X,Y) returns a 
non-zero integer if and only
if the coordinate X,Y is inside or on the boundary of the polygon P.
If P is not a polygon, geopoly_contains_point(P,X,Y) returns NULL.geopoly.html#the_geopoly_contains_point_p_x_y_function„=”šo†The Geopoly Interface To The SQLite R*Tree Module3.7. The geopoly_bbox(P) and geopoly_group_bbox(P) FunctionsIf P is a polygon, then geopoly_bbox(P) returns a new polygon that is
the smallest (axis-aligned) rectangle completely enclosing P.
If P is not a polygon, geopoly_bbox(P) returns NULL.


The geopoly_group_bbox(P) function is an aggregate version of geopoly_bbox(P).
The geopoly_group_bbox(P) function returns the smallest rectangle that will
enclose all P values seen during aggregation.geopoly.html#the_geopoly_bbox_p_and_geopoly_group_bbox_p_functionsˆ”š    oUŽ[The Geopoly Interface To The SQLite R*Tree Module3.6. The geopoly_svg(P,...) FunctionIf P is a polygon, then geopoly_svg(P,...) returns a text string which is a
Scalable Vector Graphics (SVG)
representation of that polygon.  If there is more one argument, then second
and subsequent arguments are added as attributes to each SVG glyph.  For example:

SELECT geopoly_svg($polygon,'class="poly"','style="fill:blue;"');



If P is not a polygon, geopoly_svg(P,...) returns NULL.


Note that geopoly uses a traditional right-handed cartesian coordinate system
with the origin at the lower left, whereas SVG uses a left-handed coordinate
system with the origin at the upper left.  The geopoly_svg() routine makes no
attempt to transform the coordinate system, so the displayed images are shown
in mirror image and rotated.  If that is undesirable, the geopoly_xform() routine
can be used to transform the output from cartesian to SVG coordinates prior to
passing the polygons into geopoly_svg().geopoly.html#the_geopoly_svg_p_function‚$”š    oO‚O]The Geopoly Interface To The SQLite R*Tree Module3.5. The geopoly_json(P) FunctionIf P is a polygon, then geopoly_json(P) returns the GeoJSON representation
of that polygon as a TEXT string.
If P is not a polygon, geopoly_json(P) returns NULL.geopoly.html#the_geopoly_json_p_function‚”š       oO‚3]The Geopoly Interface To The SQLite R*Tree Module3.4. The geopoly_blob(P) FunctionIf P is a polygon, then geopoly_blob(P) returns the binary encoding
of that polygon as a BLOB.
If P is not a polygon, geopoly_blob(P) returns NULL.geopoly.html#the_geopoly_blob_p_function‚”š       oO‚]The Geopoly Interface To The SQLite R*Tree Module3.3. The geopoly_area(P) FunctionIf P is a polygon, then geopoly_area(P) returns the area enclosed by
that polygon.  If P is not a polygon, geopoly_area(P) returns NULL.geopoly.html#the_geopoly_area_p_function
¦3¦”š
        o?„1SThe Geopoly Interface To The SQLite R*Tree Module4. Implementation DetailsThe geopoly module is an extension to the R-Tree extension.  Geopoly
uses the same underlying logic and shadow tables as the R-Tree extension.
Geopoly merely presents a different interface, and provides some extra logic
to compute polygon decoding, overlap, and containment.geopoly.html#implementation_details†”š           oOŠE[The Geopoly Interface To The SQLite R*Tree Module3.11. The geopoly_ccw(J) FunctionThe geopoly_ccw(J) function returns the polygon J with counter-clockwise (CCW) rotation.


RFC-7946 requires that polygons use CCW rotation.
But the spec also observes that many legacy GeoJSON files do not following the spec and
contain polygons with clockwise (CW) rotation.  The geopoly_ccw() function is useful for
applications that are reading legacy GeoJSON scripts.  If the input to geopoly_ccw() is
a correctly-formatted polygon, then no changes are made.  However, if the circulation of
the input polygon is backwards, then geopoly_ccw() reverses the circulation order so that
it conforms to the spec and so that it will work correctly with the Geopoly module.geopoly.html#the_geopoly_ccw_j_function‰%”   oc+oThe Geopoly Interface To The SQLite R*Tree Module3.10. The geopoly_regular(X,Y,R,N) FunctionThe geopoly_regular(X,Y,R,N) function returns a convex, simple, regular,
equilateral, equiangular polygon with N sides, centered at X,Y, and with
a circumradius of R.  Or, if R is negative or if N is less than 3, the
function returns NULL.  The N value is capped at 1000 so that the routine
will never render a polygon with more than 1000 sides even if the N value
is larger than 1000.


As an example, the following graphic:





Was generated by this script:

SELECT '&lt;svg width="600" height="300">';
WITH t1(x,y,n,color) AS (VALUES
   (100,100,3,'red'),
   (200,100,4,'orange'),
   (300,100,5,'green'),
   (400,100,6,'blue'),
   (500,100,7,'purple'),
   (100,200,8,'red'),
   (200,200,10,'orange'),
   (300,200,12,'green'),
   (400,200,16,'blue'),
   (500,200,20,'purple')
)
SELECT
   geopoly_svg(geopoly_regular(x,y,40,n),
        printf('style="fill:none;stroke:%s;stroke-width:2"',color))
   || printf(' &lt;text x="%d" y="%d" alignment-baseline="central" text-anchor="middle">%d&lt;/text>',x,y+6,n)
  FROM t1;
SELECT '&lt;/svg>';geopoly.html#the_geopoly_regular_x_y_r_n_function
    G؃9”¡b e3…/MHow To Download Canonical SQLite Source Code2. Direct DownloadsSnapshots of official releases of SQLite source code can often
be obtained directly from the download page of the SQLite website.
Even if the specific version desired is not listed on the download page,
the naming conventions are fairly clear and so programmers can often
guess the name of an historical release and download it that way.getthecode.html#direct_downloads„.”¡a  e+‡)EHow To Download Canonical SQLite Source Code1. IntroductionMost programmers compile SQLite into their applications using
the amalgamation.  The amalgamation is C-code but it is not
"source code".  The amalgamation is generated from source code
by scripts.

This document describes how to obtain the canonical source code
for SQLite - the raw source files from which the amalgamation is
built.  See the How To Compile SQLite page for additional information
on what to do with the canonical source code once it is obtained.getthecode.html#introduction„7”š      o1‡/AThe Geopoly Interface To The SQLite R*Tree Module4.2. Shadow TablesThe geopoly module is built on top of the R-Tree extension and uses the
same underlying shadow tables and algorithms.  For indexing purposes, each
polygon is represented in the shadow tables as a rectangular bounding box.
The underlying R-Tree implementation uses bounding boxes to limit the search
space.  Then the geoploy_overlap() and/or geopoly_within() routines further
refine the search to the exact answer.
This page last modified on  2020-04-18 20:02:04 UTCgeopoly.html#shadow_tables4”š      oM˜q]The Geopoly Interface To The SQLite R*Tree Module4.1. Binary Encoding of PolygonsGeopoly stores all polygons internally using a binary format.  A binary
polygon consists of a 4-byte header following by an array of coordinate
pairs in which each dimension of each coordinate is a 32-bit floating point
number.


The first byte of the header is a flag byte.  The least significant bit
of the flag byte determines whether the coordinate pairs that follow the
header are stored big-endian or little-endian.  A value of 0 for the least
significant bit means big-endian and a value of 1 means little endian.
Other bits of the first byte in the header are reserved for future expansion.


The next three bytes in the header record the number of vertexes in the polygon
as a big-endian integer.  Thus there is an upper bound of about 16 million
vertexes per polygon.


Following the header is the array of coordinate pairs.  Each coordinate is
a 32-bit floating point number.  The use of 32-bit floating point values for
coordinates means that any point on the earth's surface can be mapped with
a resolution of approximately 2.5 meters.  Higher resolutions are of course
possible if the map is restricted to a single continent or country.
Note that the resolution of coordinates in the geopoly module is similar
in magnitude to daily movement of points on the earth's surface due to
tidal forces.


The list of coordinates in the binary format contains no redundancy.  
The last coordinate is not a repeat of the first as it is with GeoJSON.  
Hence, there is always one fewer coordinate pair in the binary representation of
a polygon compared to the GeoJSON representation.geopoly.html#binary_encoding_of_polygons
9       9[”¡d   ec}How To Download Canonical SQLite Source Code4. Cloning The Complete Development HistoryTo clone the entire history of SQLite, first go to the
https://www.fossil-scm.org/download.html page and grab a precompiled binary
for the Fossil version control program.  Or get the source code on the
same page and compile it yourself.

As of 2017-03-12, you must use Fossil version
2.0 or later for the following instructions to work.  
The SQLite repository started using
artifacts named using SHA3 hashes instead of SHA1 hashes on that date,
and Fossil 2.0 or later is needed in order to understand the new SHA3
hashes.  To find out what version of Fossil you are running, 
type "fossil -v".

Fossil is a completely stand-alone
program, so install it simply by putting the "fossil" or "fossil.exe"
executable someplace on your $PATH or %PATH%.  After you have Fossil
installed, do this:

fossil clone https://www.sqlite.org/src sqlite.fossil


The command above
will make a copy of the complete development history of
SQLite into the "sqlite.fossil" file on your computer.  Making this copy
takes about a minute and uses about 32 megabytes of transfer.  After
making the copy, "open" the repository by typing:

fossil open sqlite.fossil


This second command will "checkout" the latest check-in from the SQLite
source tree into your current directory.  Subsequently, you can easily switch
to a different version by typing:

fossil update VERSION


Where VERSION can be a branch name (like "trunk" or "session") to get the
latest check-in on a specific branch, or VERSION can be a SHA1 hash or a
prefix of a SHA1 hash for a specific check-in, or VERSION can be a tag
such as "version-3.8.8".  Every time you run "fossil update" it will
automatically reach out to the original repository at
https://www.sqlite.org/src to obtain new check-ins that might have been
made by others since your previous update.
This page last modified on  2022-01-16 07:37:35 UTCgetthecode.html#cloning_the_complete_development_historyb”¡ce˜aHow To Download Canonical SQLite Source Code3. Obtaining Code Directly From the Version Control SystemFor any historical version of SQLite, the source tree can be obtained
from the Fossil version control system,
either downloading a tarball or ZIP archive for a specific version, or
by cloning the entire project history.

SQLite sources are maintained on three geographically dispersed
servers:


https://www.sqlite.org/src (Dallas)
https://www2.sqlite.org/src (Newark)
https://www3.sqlite.org/src (San Francisco)


The documentation is maintained in separate source repositories on
those same servers:


https://www.sqlite.org/docsrc (Dallas)
https://www2.sqlite.org/docsrc (Newark)
https://www3.sqlite.org/docsrc (San Francisco)


To download a specific historical version, first locate the specific
version desired by visiting the timeline page on one of these servers
(for example: https://www.sqlite.org/src/timeline).  If
you know the approximate date of the version you want to download, you
can add a query parameter like "c=YYYY-MM-DD" to the "timeline" URL to
see a timeline centered on that date.  For example, to see all the check-ins
that occurred around August 26, 2013, visit
https://www.sqlite.org/src/timeline?c=2013-08-26.
If you are looking for an official release, visit the
chronology page, click on the date to the left of the release
you are looking for, and that will take you immediately to the
check-in corresponding to the release.

Once you locate a specific version, click on the hyperlink for that
version to see the "Check-in Information Page".
Then click on either the "Tarball" link or the
"ZIP archive" link to download the complete source tree.getthecode.html#obtaining_code_directly_from_the_version_control_system
""‘j”©J        M¢[1The SQLITE_MEMSTAT Virtual Table2. UsageThe SQLITE_MEMSTAT virtual table is a read-only table that can be
queried to determine performance characteristics (primarily the
amount of memory being used) of the current instance of SQLite.
The SQLITE_MEMSTATE table is essentially a wrapper around the
C-language APIs sqlite3_status64() and sqlite3_db_status().
If the 
memstat.c source
file is compiled with the -DSQLITE_ENABLE_ZIPVFS option, then SQLITE_MEMSTAT
will also do some file-control calls to extract
memory usage information about the 
ZIPVFS subsystem, 
if that subsystem as been licensed, installed, and is in use.


The SQLITE_MEMSTAT table appears to have the following schema:

CREATE TABLE sqlite_memstat(
  name TEXT,
  schema TEXT,
  value INT,
  hiwtr INT
);



Each row of the SQLITE_MEMSTAT table corresponds to a single call to
one of the sqlite3_status64() or sqlite3_db_status() interfaces.
The NAME column of the row identifies which "verb" was passed to those
interfaces.  For example, if sqlite3_status64() is invoked with
SQLITE_STATUS_MEMORY_USED, then the NAME column is 'MEMORY_USED'.
Or if sqlite3_db_status() is invoked with SQLITE_DBSTATUS_CACHE_USED,
then the NAME column is "DB_CACHE_USED".


The SCHEMA column is NULL, except for cases when the sqlite3_file_control()
interface is used to interrogate the ZIPVFS backend.  As this only happens
when the memstat.c module is compiled with -DSQLITE_ENABLE_ZIPVFS and when
ZIPVFS is in use, 
SCHEMA is usually NULL.


The VALUE and HIWTR columns report the current value of the measure and
its "high-water mark".  The high-water mark is the highest value ever seen
for the measurement, at least since the last reset.  The SQLITE_MEMSTAT
virtual table does not provide a mechanism for resetting the high-water mark.


Depending on which parameter is being interrogated, one of the VALUE
or HIWTR mark measurements might be undefined.  For example, only the
high-water mark is meaningful for SQLITE_STATUS_MALLOC_SIZE, and
only the current value is meaningful for SQLITE_DBSTATUS_CACHE_USED.
For rows where one or the other of VALUE or HIWTR is not meaningful,
that value is returned as NULL.
the 

interfaces, with the initial
This page last modified on  2018-09-28 23:43:25 UTCmemstat.html#usageƒj”©I      M#†O7The SQLITE_MEMSTAT Virtual Table1. OverviewThe SQLITE_MEMSTAT extension implements an eponymous-only virtual table that
provides SQL access to the sqlite3_status64() and
sqlite3_db_status() interfaces.



The SQLITE_STMT extension can also be loaded at run-time
by compiling the extension into a shared library or DLL using the source
code at https://sqlite.org/src/file/ext/misc/memstat.c and following the
instructions for how to compile loadable extensions.memstat.html#overview
g
ÄgŒX”Ø;      =A˜QThe SQLite R*Tree Module3. Using the R*Tree ModuleThe SQLite R*Tree module is implemented as a
virtual table.  Each R*Tree index is a
virtual table with an odd number of columns between 3 and 11.
The first column is always a 64-bit signed integer primary key.
The other columns are pairs, one pair per dimension, containing the
minimum and maximum values for that dimension, respectively.
A 1-dimensional R*Tree thus has 3 columns.  
A 2-dimensional R*Tree has 5 columns.
A 3-dimensional R*Tree has 7 columns.
A 4-dimensional R*Tree has 9 columns.
And a 5-dimensional R*Tree has 11 columns.  The SQLite R*Tree implementation
does not support R*Trees wider than 5 dimensions.



The first column of an SQLite R*Tree is similar to an integer primary 
key column of a normal SQLite table. It may only store a 64-bit signed
integer value. Inserting a NULL value into this column causes SQLite
to automatically generate a new unique primary key value. If an attempt
is made to insert any other non-integer value into this column,
the r-tree module silently converts it to an integer before writing it
into the database.

The min/max-value pair columns are stored as 32-bit floating point values for
"rtree" virtual tables or as 32-bit signed integers in "rtree_i32" virtual
tables.  Unlike regular SQLite tables which can store data in a variety of
datatypes and formats, the R*Tree rigidly enforce these storage types. 
If any other type of value is inserted into such a column, the r-tree
module silently converts it to the required type before writing the
new record to the database.rtree.html#using_the_r_tree_moduleƒ5”Ø:      =I…-YThe SQLite R*Tree Module2. Compiling The R*Tree ModuleThe source code to the SQLite R*Tree module is included as part
of the amalgamation but is disabled by default.  To enable the
R*Tree module, simply compile with the SQLITE_ENABLE_RTREE 
C-preprocessor macro defined.  With many compilers, this is accomplished
by adding the option "-DSQLITE_ENABLE_RTREE=1" to the compiler
command-line.rtree.html#compiling_the_r_tree_moduleŠ}”Ø9        =#•  3The SQLite R*Tree Module1. OverviewAn R-Tree is a special
index that is designed for doing range queries.  R-Trees are most commonly
used in geospatial systems where each entry is a rectangle with minimum and
maximum X and Y coordinates.  Given a query rectangle, an R-Tree is able
to quickly find all entries that are contained within the query rectangle
or which overlap the query rectangle.  This idea is easily extended to
three dimensions for use in CAD systems.  R-Trees also find use in time-domain
range look-ups.  For example, suppose a database records the starting and
ending times for a large number of events.  A R-Tree is able to quickly
find all events that were active at any time during a given
time interval, or all events that started during a particular time interval,
or all events that both started and ended within a given time interval.
And so forth.



The R-Tree concept originated with 
Toni Guttman: 
R-Trees: A Dynamic Index Structure for Spatial Searching,
Proc. 1984 ACM SIGMOD International Conference on Management of Data,
pp. 47-57.
The implementation found in SQLite is a refinement of Guttman's original
idea, commonly called "R*Trees", that was described by
Norbert Beckmann, Hans-Peter Kriegel, Ralf Schneider, Bernhard Seeger:
The R*-Tree: An Efficient and Robust Access Method for Points
and Rectangles. SIGMOD Conference 1990: 322-331.rtree.html#overview
Ö7ÖŠ\”Ø> =K“{WThe SQLite R*Tree Module3.2. Populating An R*Tree IndexThe usual INSERT, UPDATE, and DELETE commands work on an R*Tree
index just like on regular tables.  So to insert some data into our sample
R*Tree index, we can do something like this:


INSERT INTO demo_index VALUES
  (28215, -80.781227, -80.604706, 35.208813, 35.297367),
  (28216, -80.957283, -80.840599, 35.235920, 35.367825),
  (28217, -80.960869, -80.869431, 35.133682, 35.208233),
  (28226, -80.878983, -80.778275, 35.060287, 35.154446),
  (28227, -80.745544, -80.555382, 35.130215, 35.236916),
  (28244, -80.844208, -80.841988, 35.223728, 35.225471),
  (28262, -80.809074, -80.682938, 35.276207, 35.377747),
  (28269, -80.851471, -80.735718, 35.272560, 35.407925),
  (28270, -80.794983, -80.728966, 35.059872, 35.161823),
  (28273, -80.994766, -80.875259, 35.074734, 35.172836),
  (28277, -80.876793, -80.767586, 35.001709, 35.101063),
  (28278, -81.058029, -80.956375, 35.044701, 35.223812),
  (28280, -80.844208, -80.841972, 35.225468, 35.227203),
  (28282, -80.846382, -80.844193, 35.223972, 35.225655);




The entries above are bounding boxes (longitude and latitude) for 14
zipcodes near Charlotte, NC.  A real database would have many thousands,
millions, or billions of such entries, but this small 14-row sample will
be sufficient to illustrate the ideas.rtree.html#populating_an_r_tree_index‡R”Ø=        =EwMThe SQLite R*Tree Module3.1.1. Column naming detailsIn the argments to "rtree" in the CREATE VIRTUAL TABLE statement, the
names of the columns are taken from the first token of each argument.
All subsequent tokens within each argument are silently ignored.
This means, for example, that if you try to give a column a
type affinity or add a constraint such as UNIQUE or NOT NULL or DEFAULT to
a column, those extra tokens are accepted as valid, but they do not change
the behavior of the rtree.
In an RTREE virtual table, the first column always has a
type affinity of INTEGER and all other data columns have a
type affinity of REAL.
In an RTREE_I32 virtual table, all columns have type affinity of INTEGER.


Recommended practice is to omit any extra tokens in the rtree specification.
Let each argument to "rtree" be a single ordinary label that is the name of
the corresponding column, and omit all other tokens from the argument list.rtree.html#column_naming_details‰m”Ø<        =G’%SThe SQLite R*Tree Module3.1. Creating An R*Tree IndexA new R*Tree index is created as follows:


CREATE VIRTUAL TABLE &lt;name&gt; USING rtree(&lt;column-names&gt;);



The &lt;name&gt; is the name your application chooses for the
R*Tree index and &lt;column-names&gt; is a comma separated list
of between 3 and 11 columns.
The virtual &lt;name&gt; table creates three shadow tables to actually
store its content.  The names of these shadow tables are:


&lt;name&gt;_node
&lt;name&gt;_rowid
&lt;name&gt;_parent




The shadow tables are ordinary SQLite data tables.  You can query them 
directly if you like, though this unlikely to reveal anything particularly
useful. 
And you can UPDATE, DELETE, INSERT or even DROP 
the shadow tables, though doing so will corrupt your R*Tree index.
So it is best to simply ignore the shadow tables.  Recognize that they
hold your R*Tree index information and let it go as that.



As an example, consider creating a two-dimensional R*Tree index for use in 
spatial queries:


CREATE VIRTUAL TABLE demo_index USING rtree(
   id,              -- Integer primary key
   minX, maxX,      -- Minimum and maximum X coordinate
   minY, maxY       -- Minimum and maximum Y coordinate
);rtree.html#creating_an_r_tree_index
ü!üŠ ”Ø@   =3“3?The SQLite R*Tree Module3.4. Roundoff ErrorBy default, coordinates are stored in an R*Tree using 32-bit floating
point values.  When a coordinate cannot be exactly represented by a
32-bit floating point number, the lower-bound coordinates are rounded down
and the upper-bound coordinates are rounded up.  Thus, bounding boxes might
be slightly larger than specified, but will never be any smaller.  This
is exactly what is desired for doing the more common "overlapping" queries
where the application wants to find every entry in the R*Tree that overlaps
a query bounding box.  Rounding the entry bounding boxes outward might cause a
few extra entries to appears in an overlapping query if the edge of the
entry bounding box corresponds to an edge of the query bounding box.  But
the overlapping query will never miss a valid table entry.  

However, for a "contained-within" style query, rounding the bounding
boxes outward might cause some entries to be excluded from the result set
if the edge of the entry bounding box corresponds to the edge of the query
bounding box.  To guard against this, applications should expand their
contained-within query boxes slightly (by 0.000012%) by rounding down the
lower coordinates and rounding up the top coordinates, in each dimension.rtree.html#roundoff_errorZӯ? =GSThe SQLite R*Tree Module3.3. Querying An R*Tree IndexAny valid query will work against an R*Tree index.  The R*Tree
implementation just makes some kinds of queries especially
efficient.  Queries against the primary key are efficient:


SELECT * FROM demo_index WHERE id=28269;




Of course, an ordinary SQLite table will also do a query against its
integer primary key efficiently, so the previous is not important.
The big reason for using an R*Tree is so that
you can efficiently do range queries against the coordinate
ranges.  For example, the main office of the SQLite project is
located at 35.37785, -80.77470. 
To find which zipcodes might service that office, one could right:


SELECT id FROM demo_index
 WHERE minX&lt;=-80.77470 AND maxX&gt;=-80.77470
   AND minY&lt;=35.37785  AND maxY&gt;=35.37785;




The query above will quickly locate all zipcodes that contain
the SQLite main office in their bounding box, even if the
R*Tree contains many entries.  The previous is an example
of a "contained-within" query.  The R*Tree also supports "overlapping"
queries.  For example, to find all zipcode bounding boxes that overlap
with the 28269 zipcode:


SELECT A.id FROM demo_index AS A, demo_index AS B
 WHERE A.maxX&gt;=B.minX AND A.minX&lt;=B.maxX
   AND A.maxY&gt;=B.minY AND A.minY&lt;=B.maxY
   AND B.id=28269;




This second query will find both 28269 entry (since every bounding box
overlaps with itself) and also other zipcode that is close enough to
28269 that their bounding boxes overlap.



Note that it is not necessary for all coordinates in an R*Tree index
to be constrained in order for the index search to be efficient.
One might, for example, want to query all objects that overlap with
the 35th parallel:


SELECT id FROM demo_index
 WHERE maxY&gt;=35.0  AND minY&lt;=35.0;




But, generally speaking, the more constraints that the R*Tree module
has to work with, and the smaller the bounding box, the faster the
results will come back.rtree.html#querying_an_r_tree_index
™™Žb”ØA        =_›_kThe SQLite R*Tree Module3.5. Reading And Writing At The Same TimeIt is the nature of the Guttman R-Tree algorithm that any write might
radically restructure the tree, and in the process change the scan order
of the nodes.  For this reason, it is not generally possible to modify
the R-Tree in the middle of a query of the R-Tree.  Attempts to do so
will fail with a SQLITE_LOCKED "database table is locked" error.


So, for example, suppose an application runs one query against an R-Tree like
this:

SELECT id FROM demo_index
 WHERE maxY&gt;=35.0  AND minY&lt;=35.0;



Then for each "id" value returned, suppose the application creates an 
UPDATE statement like the following and binds the "id" value returned against
the "?1" parameter:

UPDATE demo_index SET maxY=maxY+0.5 WHERE id=?1;



Then the UPDATE might fail with an SQLITE_LOCKED error.  The reason is that
the initial query has not run to completion.  It is remembering its place
in the middle of a scan of the R-Tree.  So an update to the R-Tree cannot
be tolerated as this would disrupt the scan.


This is a limitation of the R-Tree extension only.  Ordinary tables in
SQLite are able to read and write at the same time.  Other virtual tables
might (or might not) also that capability.  And R-Tree can appear to read
and write at the same time in some circumstances, if it can figure out how
to reliably run the query to completion before starting the update.  But
you shouldn't count on that for every query.  Generally speaking, it is
best to avoid running queries and updates to the same R-Tree at the same
time.


If you really need to update an R-Tree based on complex queries against
the same R-Tree, it is best to run the complex queries first and store
the results in a temporary table, then update the R-Tree based on the values
stored in the temporary table.rtree.html#reading_and_writing_at_the_same_time
77™D”ØB      =E±SUThe SQLite R*Tree Module4. Using R*Trees EffectivelyFor SQLite versions prior to 3.24.0 (2018-06-04),
the only information that an R*Tree index stores about an object is
its integer ID and its bounding box.  Additional information needs to
be stored in separate tables and related to the R*Tree index using
the primary key.  For the example above, one might create an auxiliary
table as follows:


CREATE TABLE demo_data(
  id INTEGER PRIMARY KEY,  -- primary key
  objname TEXT,            -- name of the object
  objtype TEXT,            -- object type
  boundary BLOB            -- detailed boundary of object
);



In this example, the demo_data.boundary field is intended to hold some
kind of binary representation of the precise boundaries of the object.
The R*Tree index only holds an axis-aligned rectangular boundary for the
object.  The R*Tree boundary is just an approximation of the true object
boundary.  So what typically happens is that the R*Tree index is used to
narrow a search down to a list of candidate objects and then more detailed
and expensive computations are done on each candidate to find if the
candidate truly meets the search criteria.



Key Point:
An R*Tree index does not normally provide the exact answer but merely
reduces the set of potential answers from millions to dozens.



Suppose the demo_data.boundary field holds some proprietary data description
of a complex two-dimensional boundary for a zipcode and suppose that the
application has used the sqlite3_create_function() interface to
created an application-defined function "contained_in(boundary,lat,long)"
that accepts the demo_data.boundary object and a latitute and longitude
and returns return true or false if the lat/long is contained within
the boundary.
One may assume that "contained_in()" is a relatively slow
functions that we do not want to invoke too frequently.
Then an efficient way to find the specific ZIP code for the main
SQLite office would be to run a query like this:



SELECT objname FROM demo_data, demo_index
 WHERE demo_data.id=demo_index.id
   AND contained_in(demo_data.boundary, 35.37785, -80.77470)
   AND minX&lt;=-80.77470 AND maxX&gt;=-80.77470
   AND minY&lt;=35.37785  AND maxY&gt;=35.37785;


Notice how the query above works:  The R*Tree index runs in the outer
loop to find entries that contain the SQLite main office in their
boundary box.
For each row found, SQLite looks up
the corresponding entry in the demo_data table.  It then uses the boundary
field from the demo_data table as a parameter to the contained_in()
function and if that function returns true, then we know the sought after
coordinate is in that ZIP code boundary.

One would get the same answer without the use of the R*Tree index
using the following simpler query:

SELECT objname FROM demo_data
 WHERE contained_in(demo_data.boundary, 35.37785, -80.77470);


The problem with this latter query is that it must apply the
contained_in() function to all entries in the demo_data table.
The use of the R*Tree in the penultimate query reduces the number of
calls to contained_in() function to a small subset of the entire table.
The R*Tree index did not find the exact answer itself, it merely
limited the search space.rtree.html#using_r_trees_effectively
à   à„9”ØE   =?‡IOThe SQLite R*Tree Module5. Integer-Valued R-TreesThe default virtual table ("rtree") stores coordinates as
single-precision (4-byte) floating point numbers.  If integer coordinates
are desired, declare the table using "rtree_i32" instead:

CREATE VIRTUAL TABLE intrtree USING rtree_i32(id,x0,x1,y0,y1,z0,z1);



An rtree_i32 stores coordinates as 32-bit signed integers.  
Even though it stores values using integer, the rtree_i32 virtual
table still uses floating point computations internally as part of
the r-tree algorithm.rtree.html#integer_valued_r_treesƒ=”ØD     =1…u9The SQLite R*Tree Module4.1.1. LimitationsFor auxiliary columns, only the name of the column matters.
The type affinity is ignored.
Constraints such as NOT NULL, UNIQUE, REFERENCES, or CHECK
are also ignored.  However, future versions
of SQLite might start paying attention to the type affinity and
constraints, so users of auxiliary columns are advised to leave
both blank, to avoid future compatibility problems.rtree.html#limitationsŒ”ØC  =9—EThe SQLite R*Tree Module4.1. Auxiliary ColumnsBeginning with SQLite version 3.24.0 (2018-06-04), r-tree tables
can have auxiliary columns that store arbitrary data.
Auxiliary columns can be used in place of
secondary tables such as "demo_data".


Auxiliary columns are marked with a "+" symbol before the column name.
Auxiliary columns must come after all of the coordinate boundary columns.
An RTREE table can have no more than 100 columns total.  In other words,
the count of columns including the integer primary key column, 
the coordinate boundary columns, and all auxiliary columns must be 100 or less.
The following example shows an r-tree table with auxiliary columns that
is equivalent to the two tables "demo_index" and "demo_data" above:

CREATE VIRTUAL TABLE demo_index2 USING rtree(
   id,              -- Integer primary key
   minX, maxX,      -- Minimum and maximum X coordinate
   minY, maxY,      -- Minimum and maximum Y coordinate
   +objname TEXT,   -- name of the object
   +objtype TEXT,   -- object type
   +boundary BLOB   -- detailed boundary of object
);



By combining location data and related information into the same
table, auxiliary columns can provide a cleaner model
and reduce the need to joins.
For example, the earlier
join between demo_index and demo_data can now
be written as a simple query, like this:

SELECT objname FROM demo_index2
 WHERE contained_in(boundary, 35.37785, -80.77470)
   AND minX&lt;=-80.77470 AND maxX&gt;=-80.77470
   AND minY&lt;=35.37785  AND maxY&gt;=35.37785;rtree.html#auxiliary_columns
ÆÆ’5”ØF      ==£EMThe SQLite R*Tree Module6. Custom R-Tree QueriesBy using standard SQL expressions in the WHERE clause of a SELECT query,
a programmer can query for all R*Tree entries that 
intersect with or are contained within a particular bounding-box.
Custom R*Tree queries, using the MATCH
operator in the WHERE clause of a SELECT, allow the programmer to query for 
the set of R*Tree entries that intersect any arbitrary region or shape, not 
just a box.  This capability is useful, for example, in computing the 
subset of objects in the R*Tree that are visible from a camera positioned 
in 3-D space.

Regions for custom R*Tree queries are defined by R*Tree geometry callbacks
implemented by the application and registered with SQLite via a call to one
of the following two APIs:

int sqlite3_rtree_query_callback(
  sqlite3 *db,
  const char *zQueryFunc,
  int (*xQueryFunc)(sqlite3_rtree_query_info*),
  void *pContext,
  void (*xDestructor)(void*)
);
int sqlite3_rtree_geometry_callback(
  sqlite3 *db,
  const char *zGeom,
  int (*xGeom)(sqlite3_rtree_geometry *, int nCoord, double *aCoord, int *pRes),
  void *pContext
);


The sqlite3_rtree_query_callback() became available with SQLite
version 3.8.5 (2014-06-04) and is the preferred interface.
The sqlite3_rtree_geometry_callback() is an older and less flexible
interface that is supported for backwards compatibility.

A call to one of the above APIs creates a new SQL function named by the
second parameter (zQueryFunc or zGeom).  When that SQL function appears
on the right-hand side of the MATCH operator and the left-hand side of the
MATCH operator is any column in the R*Tree virtual table, then the callback 
defined by the third argument (xQueryFunc or xGeom) is invoked to determine
if a particular object or subtree overlaps the desired region.

For example, a query like the following might be used to find all
R*Tree entries that overlap with a circle centered a 45.3,22.9 with a
radius of 5.0:

SELECT id FROM demo_index WHERE id MATCH circle(45.3, 22.9, 5.0)


The SQL syntax for custom queries is the same regardless of which
interface, sqlite3_rtree_geometry_callback() or sqlite3_rtree_query_callback(),
is used to register the SQL function.  However, the newer query-style
callbacks give the application greater control over how the query proceeds.rtree.html#custom_r_tree_queries
ŽŽ˜m”ØG =I°!UThe SQLite R*Tree Module6.1. The Legacy xGeom CallbackThe legacy xGeom callback is invoked with four arguments.  The first
argument is a pointer to an sqlite3_rtree_geometry structure which provides
information about how the SQL function was invoked.  The second argument
is the number of coordinates in each r-tree entry, and is always the same
for any given R*Tree.  The number of coordinates is 2 for a 1-dimensional R*Tree,
4 for a 2-dimensional R*Tree, 6 for a 3-dimensional R*Tree, and so forth.
The third argument, aCoord[], is an array of nCoord coordinates that defines
a bounding box to be tested.  The last argument is a pointer into which 
the callback result should be written.  The result is zero
if the bounding-box defined by aCoord[] is completely outside
the region defined by the xGeom callback and the result is non-zero if
the bounding-box is inside or overlaps with the xGeom region.  The xGeom
callback should normally return SQLITE_OK.  If xGeom returns anything other
than SQLITE_OK, then the r-tree query will abort with an error.

The sqlite3_rtree_geometry structure that the first argument to the
xGeom callback points to has a structure shown below.  The exact same
sqlite3_rtree_geometry
structure is used for every callback for same MATCH operator in the same
query.  The contents of the sqlite3_rtree_geometry
structure are initialized by SQLite but are
not subsequently modified.  The callback is free to make changes to the
pUser and xDelUser elements of the structure if desired.

typedef struct sqlite3_rtree_geometry sqlite3_rtree_geometry;
struct sqlite3_rtree_geometry {
  void *pContext;                 /* Copy of pContext passed to s_r_g_c() */
  int nParam;                     /* Size of array aParam */
  double *aParam;                 /* Parameters passed to SQL geom function */
  void *pUser;                    /* Callback implementation user data */
  void (*xDelUser)(void *);       /* Called by SQLite to clean up pUser */
};


The pContext member of the sqlite3_rtree_geometry
structure is always set to a copy of the pContext
argument passed to sqlite3_rtree_geometry_callback() when the
callback is registered. The aParam[] array (size nParam) contains the parameter
values passed to the SQL function on the right-hand side of the MATCH operator.
In the example "circle" query above, nParam would be set to 3 and the aParam[]
array would contain the three values 45.3, 22.9 and 5.0.

The pUser and xDelUser members of the sqlite3_rtree_geometry structure are
initially set to NULL. The pUser variable may be set by the callback
implementation to any arbitrary value that may be useful to subsequent
invocations of the callback within the same query (for example, a
pointer to a complicated data structure used to test for region intersection).
If the xDelUser variable is set to a non-NULL value, then after the
query has finished running SQLite automatically invokes it with the
value of the pUser variable as the only argument. In other words, xDelUser
may be set to a destructor function for the pUser value.

The xGeom callback always does a depth-first search of the r-tree.rtree.html#the_legacy_xgeom_callback;


The first five fields of the sqlite3_rtree_query_info structure are identical
to the sqlite3_rtree_geometry structure, and have exactly the same meaning.
The sqlite3_rtree_query_info structure also contains nCoord and aCoord fields 
which have the same meaning as the parameter of the same name in the xGeom callback.

The xQueryFunc must set the eWithin field of sqlite3_rtree_query_info to
one of the values NOT_WITHIN, PARTLY_WITHIN, or FULLY_WITHIN depending on whether
or not the bounding box defined by aCoord[] is completely outside the region,
overlaps the region, or is completely inside the region, respectively.  In
addition, the xQueryFunc must set the rScore field to a non-negative value that
indicates the order in which subtrees and entries of the query should be analyzed
and returned.  Smaller scores are processed first.

As its name implies, an R*Tree is organized as a tree.  Each node of the
tree is a bounding box.  The root of the tree is a bounding box that encapsulates
all elements of the tree.  Beneath the root are a number of subtrees (typically
20 or more) each with their own smaller bounding boxes and each containing some
subset of the R*Tree entries.  The subtrees may have sub-subtrees, and so forth
until finally one reaches the leaves of the tree which are the actual R*Tree
entries.

An R*Tree query is initialized by making the root node the only entry
in a priority queue sorted by rScore.
The query proceeds by extracting the entry from the priority queue that has
the lowest score.  If that entry is a leaf (meaning that it is an actual
R*Tree entry and not a subtree) then that entry
is returned as one row of the query result.  
If the extracted priority queue entry is a node (a subtree),
then the next child of that node is passed to the xQueryFunc callback.
If the node has more children then it is returned to the priority queue.
Otherwise it is discarded. Those subelements for which the xQueryFunc
callback sets eWithin to PARTLY_WITHIN or FULLY_WITHIN are added to the
priority queue using the score supplied by the callback.  Subelements that
return NOT_WITHIN are discarded.  The query runs until the priority queue is
empty.

Every leaf entry and node (subtree) within the R*Tree has an integer "level".
The leaves have a level of 0.  The first containing subtree of the leaves has
a level of 1.  The root of the R*Tree has the largest level value.  The
mxLevel entry in the sqlite3_rtree_query_info structure is the level value for
the root of the R*Tree.  The iLevel entry in sqlite3_rtree_query_info gives the
level for the object being interrogated.

Most R*Tree queries use a depth-first search.  This is accomplished by setting
the rScore equal to iLevel.  A depth-first search is usually preferred since it
minimizes the number of elements in the priority queue, which reduces memory
requirements and speeds processing.  However, some application may prefer a
breadth-first search, which can be accomplished by setting rScore to mxLevel-iLevel.
By creating more complex formulas for rScore, applications can exercise
detailed control over the order in which subtree are searched and leaf
R*Tree entries are returned.  For example, in an application with many
millions of R*Tree entries, the rScore might be arranged so that the
largest or most significant entries are returned first, allowing the
application to display the most important information quickly, and
filling in smaller and less important details as they become available.

Other information fields of the sqlite3_rtree_query_info structure are
available for use by the xQueryFunc callback, if desired.  The iRowid field
is the rowid (the first of the 3 to 11 columns in the R*Tree) for the element
being considered.  iRowid is only valid for leaves.  The eParentWithin and
rParentScore values are copies of the eWithin and rScore values from the
containing subtree of the current row.  The anQueue field is an array
of mxLevel+1 unsigned integers that tell the current number of elements in
the priority queue at each level.rtree.html#the_new_xqueryfunc_callback
} „mv}‰t”ØK       =1’_=The SQLite R*Tree Module7.1. Shadow TablesThe content of an R*Tree index is actually stored in three ordinary
SQLite tables with names derived from the name of the R*Tree.  These
three tables are called "shadow tables".  This is their schema:

CREATE TABLE %_node(nodeno INTEGER PRIMARY KEY, data)
CREATE TABLE %_parent(nodeno INTEGER PRIMARY KEY, parentnode)
CREATE TABLE %_rowid(rowid INTEGER PRIMARY KEY, nodeno)


The "%" in the name of each shadow table is replaced by the name of the
R*Tree virtual table.  So, if the name of the R*Tree table is "xyz" then
the three shadow tables would be "xyz_node", "xyz_parent", and "xyz_rowid".

There is one entry in the %_node table for each R*Tree node.  An
R*Tree node consists of one or more entries that are proximate to one another.
The nodes of an R*Tree for a tree.  All nodes other than the root have an
entry in the %_parent shadow table that identifies the parent node.
Each entry in an R*Tree has a rowid.  The %_rowid shadow table maps entry
rowids to the node that contains that entry.

Extra columns appended to the %_rowid table hold the 
content of auxiliary columns.  The names of these extra
%_rowid columns are probably not the same as the
actual auxiliary column names.rtree.html#shadow_tablesr”ØJ     =?‚;OThe SQLite R*Tree Module7. Implementation DetailsThe following sections describe some low-level details of the R*Tree implementation,
that might be useful for trouble-shooting or performance analysis.rtree.html#implementation_details†”ØI        =oŠ{The SQLite R*Tree Module6.3. Additional Considerations for Custom QueriesThe MATCH operator of a custom R*Tree query function must be a top-level
AND-connected term of the WHERE clause, or else it will not be usable
by the R*Tree query optimizer and the query will not be runnable.
If the MATCH operator is connected to other terms of the WHERE clause 
via an OR operator, for example, the query will fail with an error.


Two or more MATCH operators are allowed in the same WHERE clause, as long
as they are connected by AND operators.  However,
the R*Tree query engine only contains a single priority queue.  The priority
assigned to each node in the search is the lowest priority returned by any
of the MATCH operators.rtree.html#additional_considerations_for_custom_queries¬o”ØH     =MØYThe SQLite R*Tree Module6.2. The New xQueryFunc CallbackThe newer xQueryFunc callback receives more information from the r-tree
query engine on each call, and it sends more information back to the query engine
before it returns.
To help keep the interface manageable, the xQueryFunc callback sends and receives
information from the query engine as fields in the
sqlite3_rtree_query_info structure:

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: Visiblity */
  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 */
}B
T   bøNTƒu”à#        7U†oThe Session Extension1.2. Obtaining the Session ExtensionSince version 3.13.0 (2016-05-18), 
the session extension has been included in the SQLite
amalgamation source distribution. By default, the session extension is 
disabled. To enable it, build with the following compiler switches:

-DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK


 Or, if using the autoconf build system, pass the --enable-session option to the configure script.sessionintro.html#obtaining_the_session_extension‰%”à"        77‘-QThe Session Extension1.1. Typical Use CaseSuppose SQLite is used as the application file format for a
particular design application.  Two users, Alice and Bob, each start
with a baseline design that is about a gigabyte in size.  They work
all day, in parallel, each making their own customizations and tweaks
to the design.  At the end of the day, they would like to merge their
changes together into a single unified design.

The session extension facilitates this by recording all changes to
both Alice's and Bob's databases and writing those changes into
changeset or patchset files.  At the end of the day, Alice can send her
changeset to Bob and Bob can "apply" it to his database.  The result (assuming
there are no conflicts) is that Bob's database then contains both his
changes and Alice's changes.  Likewise, Bob can send a changeset of
his work over to Alice and she can apply his changes to her database.

In other words, the session extension provides a facility for
SQLite database files that is similar to the unix
patch utility program,
or to the "merge" capabilities of version control systems such
as Fossil, Git, 
or Mercurial.sessionintro.html#typical_use_case„e”à!    7+ˆAIThe Session Extension1. IntroductionThe session extension provide a mechanism for recording changes
to some or all of the rowid tables in an SQLite database, and packaging
those changes into a "changeset" or "patchset" file that can later
be used to apply the same set of changes to another database with
the same schema and compatible starting data.  A "changeset" may
also be inverted and used to "undo" a session.

This document is an introduction to the session extension.
The details of the interface are in the separate
Session Extension C-language Interface document.sessionintro.html#introductionӯL
=}˜The SQLite R*Tree Module7.2. Integrity Check using the rtreecheck() SQL functionThe scalar SQL function rtreecheck(R) or rtreecheck(S,R) runs an
integrity check on the rtree table named R contained within database S.
The function returns a human-language description of any problems found,
or the string 'ok' if everything is ok.  Running rtreecheck() on an R*Tree
virtual table is similar to running PRAGMA integrity_check on a
database.

Example: To verify that an R*Tree named "demo_index" is well-formed
and internally consistent, run:

SELECT rtreecheck('demo_index');


The rtreecheck() function performs the following checks:



For each cell in the r-tree structure (%_node table), that:

 for each dimension, (coord1 &lt;= coord2).
 unless the cell is on the root node, that the cell is bounded
        by the parent cell on the parent node.
 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.
 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.


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.

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.

This page last modified on  2021-09-29 16:36:36 UTCrtree.html#integrity_check_using_the_rtreecheck_sql_function
Í“<”à%       7G¥;aThe Session Extension2.1. Changesets and PatchsetsThe sessions module revolves around creating and manipulating 
changesets. A changeset is a blob of data that encodes a series of 
changes to a database. Each change in a changeset is one of the 
following:


   An INSERT. An INSERT change contains a single row to add to 
       a database table. The payload of the INSERT change consists of the
       values for each field of the new row.

   A DELETE. A DELETE change represents a row, identified by
       its primary key values, to remove from a database table. The payload
       of a DELETE change consists of the values for all fields of the 
       deleted row.

   An UPDATE. An UPDATE change represents the modification of
       one or more non-PRIMARY KEY fields of a single row within a database 
       table, identified by its PRIMARY KEY fields. The payload for an UPDATE
       change consists of:
   
      The PRIMARY KEY values identifying the modified row, 
      The new values for each modified field of the row, and
      The original values for each modified field of the row.
   
        An UPDATE change does not contain any information regarding
       non-PRIMARY KEY fields that are not modified by the change. It is not
       possible for an UPDATE change to specify modifications to PRIMARY 
       KEY fields. 


 A single changeset may contain changes that apply to more than one 
database table. For each table that the changeset includes at least one change
for, it also encodes the following data:


   The name of the database table, 
   The number of columns the table has, and
   Which of those columns are PRIMARY KEY columns.


 Changesets may only be applied to databases that contain tables 
matching the above three criteria as stored in the changeset.

 A patchset is similar to a changeset. It is slightly more compact than
a changeset, but provides more limited conflict detection and resolution
options (see the next section for details). The differences between a 
patchset and a changeset are that:


   For a DELETE change, the payload consists of the PRIMARY KEY 
          fields only. The original values of other fields are not stored as
          part of a patchset.

   For an UPDATE change, the payload consists of the PRIMARY KEY 
          fields and the new values of modified fields only. The original
          values of modified fields are not stored as part of a patchset.sessionintro.html#changesets_and_patchsets†.”à$        7-‹SGThe Session Extension1.3. LimitationsPrior to SQLite version 3.17.0, the session extension only worked with
        rowid tables, not WITHOUT ROWID tables. As of 3.17.0, both
        rowid and WITHOUT ROWID tables are supported.

 There is no support for virtual tables. Changes to virtual tables are
        not captured.

 The session extension only works with tables that have a declared
        PRIMARY KEY. The PRIMARY KEY of a table may be an INTEGER PRIMARY KEY
        (rowid alias) or an external PRIMARY KEY.

 SQLite allows NULL values to be stored in
        PRIMARY KEY columns. However, the session extension ignores all
        such rows. No changes affecting rows with one or more NULL values
        in PRIMARY KEY columns are recorded by the sessions module.sessionintro.html#limitations
88‘C”à&        7)¢CThe Session Extension2.2. ConflictsWhen a changeset or patchset is applied to a database, an attempt is 
made to insert a new row for each INSERT change, remove a row for each
DELETE change and modify a row for each UPDATE change. If the target 
database is in the same state as the original database that the changeset
was recorded on, this is a simple matter. However, if the contents of the
target database is not in exactly this state, conflicts can occur when
applying the changeset or patchset.

When processing an INSERT change, the following conflicts can
occur:


   The target database may already contain a row with the same PRIMARY
       KEY values as specified by the INSERT change.

   Some other database constraint, for example a UNIQUE or CHECK 
       constraint, may be violated when the new row is inserted.


When processing a DELETE change, the following conflicts may be
detected:


   The target database may contain no row with the specified PRIMARY 
       KEY values to delete.

   The target database may contain a row with the specified PRIMARY
       KEY values, but the other fields may contain values that do not
       match those stored as part of the changeset. This type of conflict
       is not detected when using a patchset.


When processing an UPDATE change, the following conflicts may be
detected:


   The target database may contain no row with the specified PRIMARY 
       KEY values to modify.

   The target database may contain a row with the specified PRIMARY
       KEY values, but the current values of the fields that will be modified
       by the change may not match the original values stored within the
       changeset. This type of conflict is not detected when using a patchset.

   Some other database constraint, for example a UNIQUE or CHECK 
       constraint, may be violated when the row is updated.


 Depending on the type of conflict, a sessions application has a variety
of configurable options for dealing with conflicts, ranging from omitting the
conflicting change, aborting the entire changeset application or applying
the change despite the conflict. For details, refer to the documentation for
the sqlite3changeset_apply() API.sessionintro.html#conflicts
Ï…ÁÏ¡:”à)       7AÁC[The Session Extension3.1. Capturing a ChangesetThe example code below demonstrates the steps involved in capturing a
changeset while executing SQL commands. In summary:


   A session object (type sqlite3_session*) is created by making a 
          call to the sqlite3session_create() API function.

       A single session object monitors changes made to a single database 
          (i.e. "main", "temp" or an attached database) via a single 
          sqlite3* database handle.H?ӈ(    7I9gThe Session Extension3. Using The Session ExtensionThis section provides examples that demonstrate how to use the sessions
    extension.sessionintro.html#using_the_session_extensionŽv”à'        7Cœ7]The Session Extension2.3. Changeset ConstructionAfter a session object has been configured, it begins monitoring for 
changes to its configured tables. However, it does not record an entire
change each time a row within the database is modified. Instead, it records
just the PRIMARY KEY fields for each inserted row, and just the PRIMARY KEY 
and all original row values for any updated or deleted rows. If a row is 
modified more than once by a single session, no new information is recorded.

 The other information required to create a changeset or patchset is
read from the database file when sqlite3session_changeset() or
sqlite3session_patchset() is called. Specifically,


   For each primary key recorded as a result of an INSERT operation, 
       the sessions module checks if there is a row with a matching primary
       key still in the table. If so, an INSERT change is added to the 
       changeset.

   For each primary key recorded as a result of an UPDATE or DELETE
       operation, the sessions module also checks for a row with a matching
       primary key within the table. If one can be found, but one or more
       of the non-PRIMARY KEY fields does not match the original recorded
       value, an UPDATE is added to the changeset. Or, if there is no row
       at all with the specified primary key, a DELETE is added to the 
       changeset. If the row does exist but none of the non-PRIMARY KEY
       fields have been modified, no change is added to the changeset.


 One implication of the above is that if a change is made and then 
unmade within a single session (for example if a row is inserted and then
deleted again), the sessions module does not report any change at all. Or
if a row is updated multiple times within the same session, all updates
are coalesced into a single update within any changeset or patchset blob.sessionintro.html#changeset_construction

   The session object is configured with a set of tables to monitor
          changes on.

        By default a session object does not monitor changes on any 
           database table. Before it does so it must be configured. There 
           are three ways to configure the set of tables to monitor changes
           on:
       
          By explicitly specifying tables using one call to
              sqlite3session_attach() for each table, or

          By specifying that all tables in the database should be monitored
              for changes using a call to sqlite3session_attach() with a
              NULL argument, or

          By configuring a callback to be invoked the first time each table
              is written to that indicates to the session module whether or
              not changes on the table should be monitored.
       
         The example code below uses the second of the methods enumerated
            above - it monitors for changes on all database tables.

    Changes are made to the database by executing SQL statements. The
           session object records these changes.

    A changeset blob is extracted from the session object using a call
           to sqlite3session_changeset() (or, if using patchsets, a call to
           the sqlite3session_patchset() function).

    The session object is deleted using a call to the 
           sqlite3session_delete() API function.

        It is not necessary to delete a session object after extracting
           a changeset or patchset from it. It can be left attached to the
           database handle and will continue monitoring for changes on the
           configured tables as before. However, if 
           sqlite3session_changeset() or sqlite3session_patchset() is
           called a second time on a session object, the changeset or patchset
           will contain all changes that have taken place on the connection
           since the session was created. In other words,
           a session object is not reset or
           zeroed by a call to sqlite3session_changeset() or
           sqlite3session_patchset().


/*
** Argument zSql points to a buffer containing an SQL script to execute 
** against the database handle passed as the first argument. As well as
** executing the SQL script, this function collects a changeset recording
** all changes made to the "main" database file. Assuming no error occurs,
** output variables (*ppChangeset) and (*pnChangeset) are set to point
** to a buffer containing the changeset and the size of the changeset in
** bytes before returning SQLITE_OK. In this case it is the responsibility
** of the caller to eventually free the changeset blob by passing it to
** the sqlite3_free function.
**
** Or, if an error does occur, return an SQLite error code. The final
** value of (*pChangeset) and (*pnChangeset) are undefined in this case.
*/
int sql_exec_changeset(
  sqlite3 *db,                  /* Database handle */
  const char *zSql,             /* SQL script to execute */
  int *pnChangeset,             /* OUT: Size of changeset blob in bytes */
  void **ppChangeset            /* OUT: Pointer to changeset blob */
){
  sqlite3_session *pSession = 0;
  int rc;

  /* Create a new session object */
  rc = sqlite3session_create(db, "main", &pSession);

  /* Configure the session object to record changes to all tables */
  if( rc==SQLITE_OK ) rc = sqlite3session_attach(pSession, NULL);

  /* Execute the SQL script */
  if( rc==SQLITE_OK ) rc = sqlite3_exec(db, zSql, 0, 0, 0);

  /* Collect the changeset */
  if( rc==SQLITE_OK ){
    rc = sqlite3session_changeset(pSession, pnChangeset, ppChangeset);
  }

  /* Delete the session object */
  sqlite3session_delete(pSession);

  return rc;
}sessionintro.html#capturing_a_changeset
        è      茔à*       7[–AuThe Session Extension3.2. Applying a Changeset to a DatabaseApplying a changeset to a database is simpler than capturing a changeset.
Usually, a single call to sqlite3changeset_apply(), as depicted in the
example code below, suffices.

 In cases where it is complicated, the complications in applying a 
changeset lie in conflict resolution. Refer to the API documentation linked
above for details.

  /*
** Conflict handler callback used by apply_changeset(). See below.
*/
static int xConflict(void *pCtx, int eConflict, sqlite3_changset_iter *pIter){
  int ret = (int)pCtx;
  return ret;
}

/*
** Apply the changeset contained in blob pChangeset, size nChangeset bytes,
** to the main database of the database handle passed as the first argument.
** Return SQLITE_OK if successful, or an SQLite error code if an error
** occurs.
**
** If parameter bIgnoreConflicts is true, then any conflicting changes 
** within the changeset are simply ignored. Or, if bIgnoreConflicts is
** false, then this call fails with an SQLTIE_ABORT error if a changeset
** conflict is encountered.
*/
int apply_changeset(
  sqlite3 *db,                  /* Database handle */
  int bIgnoreConflicts,         /* True to ignore conflicting changes */
  int nChangeset,               /* Size of changeset in bytes */
  void *pChangeset              /* Pointer to changeset blob */
){
  return sqlite3changeset_apply(
      db, 
      nChangeset, pChangeset, 
      0, xConflict, 
      (void*)bIgnoreConflicts
  );
}sessionintro.html#applying_a_changeset_to_a_database
ííž”à+ 7cº'}The Session Extension3.3. Inspecting the Contents of a ChangesetThe example code below demonstrates the techniques used to iterate 
through and extract the data related to all changes in a changeset. To
summarize:


   The sqlite3changeset_start() API is called to create and
          initialize an iterator to iterate through the contents of a
          changeset. Initially, the iterator points to no element at all.

   The first call to sqlite3changeset_next() on the iterator moves
          it to point to the first change  in the changeset (or to EOF, if 
          the changeset is completely empty). sqlite3changeset_next() returns
          SQLITE_ROW if it moves the iterator to point to a valid entry,
          SQLITE_DONE if it moves the iterator to EOF, or an SQLite error
          code if an error occurs.

   If the iterator points to a valid entry, the sqlite3changeset_op()
          API may be used to determine the type of change (INSERT, UPDATE or
          DELETE) that the iterator points to. Additionally, the same API 
          can be used to obtain the name of the table the change applies to
          and its expected number of columns and primary key columns.

   If the iterator points to a valid INSERT or UPDATE entry, the
          sqlite3changeset_new() API may be used to obtain the new.* values
          within the change payload.

   If the iterator points to a valid DELETE or UPDATE entry, the
          sqlite3changeset_old() API may be used to obtain the old.* values
          within the change payload.

   An iterator is deleted using a call to the 
          sqlite3changeset_finalize() API. If an error occured while
          iterating, an SQLite error code is returned (even if the same error
          code has already been returned by sqlite3changeset_next()). Or,
          if no error has occurred, SQLITE_OK is returned.


  /*
** Print the contents of the changeset to stdout.
*/
static int print_changeset(void *pChangeset, int nChangeset){
  int rc;
  sqlite3_changeset_iter *pIter = 0;

  /* Create an iterator to iterate through the changeset */
  rc = sqlite3changeset_start(&pIter, nChangeset, pChangeset);
  if( rc!=SQLITE_OK ) return rc;

  /* This loop runs once for each change in the changeset */
  while( SQLITE_ROW==sqlite3changeset_next(pIter) ){
    const char *zTab;           /* Table change applies to */
    int nCol;                   /* Number of columns in table zTab */
    int op;                     /* SQLITE_INSERT, UPDATE or DELETE */
    sqlite3_value *pVal;

    /* Print the type of operation and the table it is on */
    rc = sqlite3changeset_op(pIter, &zTab, &nCol, &op, 0);
    if( rc!=SQLITE_OK ) goto exit_print_changeset;
    printf("%s on table %s\n",
      op==SQLITE_INSERT?"INSERT" : op==SQLITE_UPDATE?"UPDATE" : "DELETE",
      zTab
    );

    /* If this is an UPDATE or DELETE, print the old.* values */
    if( op==SQLITE_UPDATE || op==SQLITE_DELETE ){
      printf("Old values:");
      for(i=0; i&lt;nCol; i++){
        rc = sqlite3changeset_old(pIter, i, &pVal);
        if( rc!=SQLITE_OK ) goto exit_print_changeset;
        printf(" %s", pVal ? sqlite3_value_text(pVal) : "-");
      }
      printf("\n");
    }

    /* If this is an UPDATE or INSERT, print the new.* values */
    if( op==SQLITE_UPDATE || op==SQLITE_INSERT ){
      printf("New values:");
      for(i=0; i&lt;nCol; i++){
        rc = sqlite3changeset_new(pIter, i, &pVal);
        if( rc!=SQLITE_OK ) goto exit_print_changeset;
        printf(" %s", pVal ? sqlite3_value_text(pVal) : "-");
      }
      printf("\n");
    }
  }

  /* Clean up the changeset and return an error code (or SQLITE_OK) */
 exit_print_changeset:
  rc2 = sqlite3changeset_finalize(pIter);
  if( rc==SQLITE_OK ) rc = rc2;
  return rc;
}sessionintro.html#inspecting_the_contents_of_a_changeset
ÙÙ†"”à,   7?‹]The Session Extension4. Extended FunctionalityMost applications will only use the session module functionality described
in the previous section. However, the following additional functionality is
available for the use and manipulation of changeset and patchset blobs:


   Two or more changeset/patchsets may be combined using the 
       sqlite3changeset_concat() or sqlite3_changegroup interfaces.

   A changeset may be "inverted" using the sqlite3changeset_invert()
       API function. An inverted changeset undoes the changes made by the
       original. If changeset C+ is the inverse of changeset C, then
       applying C and then C+ to a database should leave
       the database unchanged.
This page last modified on  2018-02-28 22:21:53 UTCsessionintro.html#extended_functionality
BB›9”è              -SµwWindow Functions1. Introduction to Window FunctionsA window function is an SQL function where the input
values are taken from
a "window" of one or more rows in the results set of a SELECT statement.

Window functions are distinguished from other SQL functions by the
presence of an OVER clause. If a function has an OVER clause,
then it is a window function. If it lacks an OVER clause, then it is an
ordinary aggregate or scalar function. Window functions might also
have a FILTER clause in between the function and the OVER clause.

The syntax for a window function is like this:


window-function-invocation:
hide
 
 

expr:
show
 
 

literal-value:
show
 
 


over-clause:
show
 
 

frame-spec:
hide
 
 


ordering-term:
show
 
 



raise-function:
show
 
 


select-stmt:
show
 
 

common-table-expression:
show
 
 


compound-operator:
show
 
 


join-clause:
show
 
 

join-constraint:
show
 
 


join-operator:
show
 
 



ordering-term:
show
 
 


result-column:
show
 
 


table-or-subquery:
show
 
 



type-name:
show
 
 

signed-number:
show
 
 




filter-clause:
hide
 
 


window-defn:
hide
 
 

frame-spec:
hide
 
 


ordering-term:
show
 
 







Unlike ordinary functions, window functions
cannot use the DISTINCT keyword.
Also, Window functions may only appear in the result set and in the
ORDER BY clause of a SELECT statement.

Window functions come in two varieties: 
aggregate window functions and
built-in window functions.  Every aggregate window function
can also work as a ordinary aggregate function, simply by omitting
the OVER and FILTER clauses.  Furthermore, all of the built-in
aggregate functions of SQLite can be used as an
aggregate window function by adding an appropriate OVER clause.
Applications can register new aggregate window functions using
the sqlite3_create_window_function() interface.
The built-in window functions, however, require special-case
handling in the query planner and hence new window functions
that exhibit the exceptional properties found in the built-in
window functions cannot be added by the application.

Here is an example using the built-in row_number()
window function:

CREATE TABLE t0(x INTEGER PRIMARY KEY, y TEXT);
INSERT INTO t0 VALUES (1, 'aaa'), (2, 'ccc'), (3, 'bbb');

-- The following SELECT statement returns:
-- 
--   x | y | row_number
-----------------------
--   1 | aaa | 1         
--   2 | ccc | 3         
--   3 | bbb | 2         
-- 
SELECT x, y, row_number() OVER (ORDER BY y) AS row_number FROM t0 ORDER BY x;



The row_number() window function
assigns consecutive integers to each
row in order of the "ORDER BY" clause within the
window-defn (in this case "ORDER BY y"). Note that 
this does not affect the order in which results are returned from
the overall query.  The order of the final output is
still governed by the ORDER BY clause attached to the SELECT
statement (in this case "ORDER BY x").

Named window-defn clauses may also be added to a SELECT 
statement using a WINDOW clause and then referred to by name within window
function invocations. For example, the following SELECT statement contains
two named window-defs clauses, "win1" and "win2":

SELECT x, y, row_number() OVER win1, rank() OVER win2 
FROM t0 
WINDOW win1 AS (ORDER BY y RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
       win2 AS (PARTITION BY y ORDER BY x)
ORDER BY x;


The WINDOW clause, when one is present, comes after any HAVING clause and
before any ORDER BY.windowfunctions.html#introduction_to_window_functions
D¬Dc”è        -E eWindow Functions2.1. The PARTITION BY ClauseFor the purpose of computing window functions, the result set
of a query is divided into one or more "partitions".  A partition consists
of all rows that have the same value for all terms of the PARTITION BY clause
in the window-defn.  If there is no PARTITION BY clause,
then the entire result set of the query is a single partition.
Window-function processing is performed separately for each partition.

 For example:

-- The following SELECT statement returns:
-- 
--   c     | a | b | group_concat
---------------------------------
--   one   | 1 | A | A.D.G       
--   one   | 4 | D | D.G         
--   one   | 7 | G | G           
--   three | 3 | C | C.F         
--   three | 6 | F | F           
--   two   | 2 | B | B.E         
--   two   | 5 | E | E           
-- 
SELECT c, a, b, group_concat(b, '.') OVER (
  PARTITION BY c ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS group_concat
FROM t1 ORDER BY c, a;


 In the query above, the "PARTITION BY c" clause breaks the
result set up into three partitions. The first partition has
three rows with c=='one'.  The second partition has two rows with
c=='three' and the third partition has two rows with c=='two'.

 In the example above, all the rows for each partition are
grouped together in the final output.  This is because the PARTITION BY
clause is a prefix of the ORDER BY clause on the overall query.  
But that does not have
to be the case.  A partition can be composed of rows scattered
about haphazardly within the result set.  For example:

-- The following SELECT statement returns:
-- 
--   c     | a | b | group_concat
---------------------------------
--   one   | 1 | A | A.D.G       
--   two   | 2 | B | B.E         
--   three | 3 | C | C.F         
--   one   | 4 | D | D.G         
--   two   | 5 | E | E           
--   three | 6 | F | F           
--   one   | 7 | G | G           
-- 
SELECT c, a, b, group_concat(b, '.') OVER (
  PARTITION BY c ORDER BY a RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS group_concat
FROM t1 ORDER BY a;windowfunctions.html#the_partition_by_clauseŽO”è
        -G›akWindow Functions2. Aggregate Window FunctionsThe examples in this section all assume that the database is populated as
follows:

CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c);
INSERT INTO t1 VALUES   (1, 'A', 'one'  ),
                        (2, 'B', 'two'  ),
                        (3, 'C', 'three'),
                        (4, 'D', 'one'  ),
                        (5, 'E', 'two'  ),
                        (6, 'F', 'three'),
                        (7, 'G', 'one'  );


 An aggregate window function is similar to an 
ordinary aggregate function, except
adding it to a query does not change the number of rows returned. Instead,
for each row the result of the aggregate window function is as if the
corresponding aggregate were run over all rows in the "window frame"
specified by the OVER clause.


-- The following SELECT statement returns:
-- 
--   a | b | group_concat
-------------------------
--   1 | A | A.B         
--   2 | B | A.B.C       
--   3 | C | B.C.D       
--   4 | D | C.D.E       
--   5 | E | D.E.F       
--   6 | F | E.F.G       
--   7 | G | F.G         
-- 
SELECT a, b, group_concat(b, '.') OVER (
  ORDER BY a ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) AS group_concat FROM t1;


 In the example above, the window frame consists of all rows between the
previous row ("1 PRECEDING") and the following row ("1 FOLLOWING"), inclusive,
where rows are sorted according to the ORDER BY clause in the
window-defn (in this case "ORDER BY a"). 
For example, the frame for the row with (a=3) consists of rows (2, 'B', 'two'),
(3, 'C', 'three') and (4, 'D', 'one'). The result of group_concat(b, '.') 
for that row is therefore 'B.C.D'.

 All of SQLite's aggregate functions may
be used as aggregate window functions. It is also possible to 
create user-defined aggregate window functions.windowfunctions.html#aggregate_window_functions
ùmùŒo”è
    -/˜YKWindow Functions2.2.1. Frame TypeThere are three frame types:  ROWS, GROUPS, and RANGE.
The frame type determines how the starting and ending boundaries
of the frame are measured.


ROWS: 
The ROWS frame type means that the starting and ending boundaries
for the frame are determined by counting individual rows relative
to the current row.



GROUPS:
The GROUPS frame type means that the starting and ending boundaries
are determine by counting "groups" relative to the current group.
A "group" is a set of rows that all have equivalent values for all
all terms of the window ORDER BY clause.  ("Equivalent" means that
the IS operator is true when comparing the two values.)
In other words, a group consists of all peers of a row.



RANGE:
The RANGE frame type requires that the ORDER BY clause of the
window have exactly one term.  Call that term "X".  With the
RANGE frame type, the elements of the frame are determined by
computing the value of expression X for all rows in the partition
and framing those rows for which the value of X is within a certain
range of the value of X for the current row.  See the description
in the "&lt;expr&gt; PRECEDING" boundary
specification below for details.


The ROWS and GROUPS frame types are similar in that they
both determine the extent of a frame by counting relative to
the current row.  The difference is that ROWS counts individual
rows and GROUPS counts peer groups.
The RANGE frame type is different.
The RANGE frame type determines the extent of a frame by
looking for expression values that are within some band of
values relative to the current row.windowfunctions.html#frame_type‘”è -? s_Window Functions2.2. Frame SpecificationsThe frame-spec determines which output rows are
read by an aggregate window function.  The
frame-spec consists of four parts:


   A frame type - either ROWS, RANGE or GROUPS,
   A starting frame boundary,
   An ending frame boundary,
   An EXCLUDE clause.


 Here are the syntax details:

frame-spec:
hide
 
 

expr:
show
 
 

filter-clause:
show
 
 


literal-value:
show
 
 


over-clause:
show
 
 

ordering-term:
show
 
 



raise-function:
show
 
 


select-stmt:
show
 
 

common-table-expression:
show
 
 


compound-operator:
show
 
 


join-clause:
show
 
 

join-constraint:
show
 
 


join-operator:
show
 
 



ordering-term:
show
 
 


result-column:
show
 
 


table-or-subquery:
show
 
 


window-defn:
show
 
 



type-name:
show
 
 

signed-number:
show
 
 








The ending frame boundary can be omitted (if the
BETWEEN and AND keywords that surround the starting frame boundary
are also omitted),
in which case the ending frame boundary defaults to CURRENT ROW.

 If the frame type is RANGE or GROUPS, then rows with the same values for
all ORDER BY expressions are considered "peers". Or, if there are no ORDER BY
terms, all rows are peers. Peers are always within the same frame.

The default frame-spec is:

RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS


The default means that aggregate window functions read all
rows from the beginning of the partition up to and including the
current row and its peers. This implies that rows that have the same values for
all ORDER BY expressions will also have the same value for the result of the
window function (as the window frame is the same). For example:

-- The following SELECT statement returns:
-- 
--   a | b | c | group_concat
-----------------------------
--   1 | A | one   | A.D.G       
--   2 | B | two   | A.D.G.C.F.B.E
--   3 | C | three | A.D.G.C.F   
--   4 | D | one   | A.D.G       
--   5 | E | two   | A.D.G.C.F.B.E
--   6 | F | three | A.D.G.C.F   
--   7 | G | one   | A.D.G       
-- 
SELECT a, b, c, 
       group_concat(b, '.') OVER (ORDER BY c) AS group_concat 
FROM t1 ORDER BY a;windowfunctions.html#frame_specifications
  ž[”è       -;¼WWindow Functions2.2.2. Frame BoundariesThere are five ways to describe starting and ending frame boundaries:


 UNBOUNDED PRECEDING
     The frame boundary is the first
     row in the partition.

 &lt;expr&gt; PRECEDING
        &lt;expr&gt; must be a non-negative constant numeric expression.
        The boundary is a row that is &lt;expr&gt; "units" prior to
        the current row.  The meaning of "units" here depends on the
        frame type:
        
         ROWS &rarr;
        The frame boundary is the row that is &lt;expr&gt;
        rows before the current row, or the first row of the
        partition if there are fewer than &lt;expr&gt; rows
        before the current row.  &lt;expr&gt; must be an integer.
         GROUPS &rarr;
        A "group" is a set of peer rows - rows that all have
        the same values for every term in the ORDER BY clause.
        The frame boundary is the group that is &lt;expr&gt;
        groups before the group containing the current row, or the
        first group of the partition if there are fewer
        than &lt;expr&gt; groups before the current row.
        For the starting boundary of a frame, the first
        row of the group is used and for the ending boundary
        of a frame, the last row of the group is used.
        &lt;expr&gt; must be an integer.
        

         RANGE &rarr;
        For this form, the ORDER BY clause of the
        window-defn must have a single
        term.  Call that ORDER BY term "X".  Let
        Xi be the value of the X
        expression for the i-th row in the partition and let
        Xc be the value of X for the
        current row.  Informally, a RANGE bound is the first row
        for which Xi is within
        the &lt;expr&gt; of Xc.
        More precisely:
        
         If either Xi or
             Xc are non-numeric, then
             the boundary is the first row for which the expression
             "Xi IS Xc"
             is true.
         Else if the ORDER BY is ASC then the boundary
             is the first row for which
             Xi&gt;=Xc-&lt;expr&gt;.
         Else if the ORDER BY is DESC then the boundary
        is the first row for which
        Xi&lt;=Xc+&lt;expr&gt;.
        
        For this form, the &lt;expr&gt; does not have to be an
        integer. It can evaluate to a real number as long as
        it is constant and non-negative.
        
    The boundary description "0 PRECEDING" always means the same
    thing as "CURRENT ROW".

CURRENT ROW
        The current row. For RANGE and GROUPS frame types,
        peers of the current row are also included in the frame,
        unless specifically excluded by the EXCLUDE clause.
        This is true regardless of whether CURRENT ROW is used
        as the starting or ending frame boundary.

&lt;expr&gt; FOLLOWING
        This is the same as "&lt;expr&gt; PRECEDING" except that
        the boundary is &lt;expr&gt; units after the current
        rather than before the current row.

 UNBOUNDED FOLLOWING
   The frame boundary is the last
   row in the partition.



 The ending frame boundary may not take a form that appears higher in
the above list than the starting frame boundary.

 In the following example, the window frame for each row consists of all
rows from the current row to the end of the set, where rows are sorted
according to "ORDER BY a".

-- The following SELECT statement returns:
-- 
--   c     | a | b | group_concat
---------------------------------
--   one   | 1 | A | A.D.G.C.F.B.E
--   one   | 4 | D | D.G.C.F.B.E 
--   one   | 7 | G | G.C.F.B.E   
--   three | 3 | C | C.F.B.E     
--   three | 6 | F | F.B.E       
--   two   | 2 | B | B.E         
--   two   | 5 | E | E           
-- 
SELECT c, a, b, group_concat(b, '.') OVER (
  ORDER BY c, a ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
) AS group_concat
FROM t1 ORDER BY c, a;windowfunctions.html#frame_boundaries
rŠa”è   -9”%YWindow Functions2.3. The FILTER Clausefilter-clause:
hide
 
 

expr:
show
 
 

literal-value:
show
 
 


over-clause:
show
 
 

frame-spec:
show
 
 


ordering-term:
show
 
 



raise-function:
show
 
 


select-stmt:
show
 
 

common-table-expression:
show
 
 


compound-operator:
show
 
 


join-clause:
show
 
 

join-constraint:
show
 
 


join-operator:
show
 
 



ordering-term:
show
 
 


result-column:
show
 
 


table-or-subquery:
show
 
 


window-defn:
show
 
 

frame-spec:
show
 
 




type-name:
show
 
 

signed-number:
show
 
 







If a FILTER clause is provided, then only rows for which the expr is
true are included in the window frame. The aggregate window still returns a
value for every row, but those for which the FILTER expression evaluates to
other than true are not included in the window frame for any row. For example:

-- The following SELECT statement returns:
-- 
--   c     | a | b | group_concat
---------------------------------
--   one   | 1 | A | A           
--   two   | 2 | B | A           
--   three | 3 | C | A.C         
--   one   | 4 | D | A.C.D       
--   two   | 5 | E | A.C.D       
--   three | 6 | F | A.C.D.F     
--   one   | 7 | G | A.C.D.F.G   
-- 
SELECT c, a, b, group_concat(b, '.') FILTER (WHERE c!='two') OVER (
  ORDER BY a
) AS group_concat
FROM t1 ORDER BY a;windowfunctions.html#the_filter_clause‘      ”è     -? m[Window Functions2.2.3. The EXCLUDE ClauseThe optional EXCLUDE clause may take any of the following four forms:


    EXCLUDE NO OTHERS: This is the default. In this case no
  rows are excluded from the window frame as defined by its starting and ending
  frame boundaries.

    EXCLUDE CURRENT ROW: In this case the current row is 
  excluded from the window frame.  Peers of the current row remain in
  the frame for the GROUPS and RANGE frame types.

    EXCLUDE GROUP: In this case the current row and all other
  rows that are peers of the current row are excluded from the frame. When
  processing an EXCLUDE clause, all rows with the same ORDER BY values, or all
  rows in the partition if there is no ORDER BY clause, are considered peers,
  even if the frame type is ROWS.

    EXCLUDE TIES: In this case the current row is part of the
  frame, but peers of the current row are excluded.


 The following example demonstrates the effect of the various
forms of the EXCLUDE clause:

-- The following SELECT statement returns:
-- 
--   c    | a | b | no_others     | current_row | grp       | ties
--  one   | 1 | A | A.D.G         | D.G         |           | A
--  one   | 4 | D | A.D.G         | A.G         |           | D
--  one   | 7 | G | A.D.G         | A.D         |           | G
--  three | 3 | C | A.D.G.C.F     | A.D.G.F     | A.D.G     | A.D.G.C
--  three | 6 | F | A.D.G.C.F     | A.D.G.C     | A.D.G     | A.D.G.F
--  two   | 2 | B | A.D.G.C.F.B.E | A.D.G.C.F.E | A.D.G.C.F | A.D.G.C.F.B
--  two   | 5 | E | A.D.G.C.F.B.E | A.D.G.C.F.B | A.D.G.C.F | A.D.G.C.F.E
-- 
SELECT c, a, b,
  group_concat(b, '.') OVER (
    ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS
  ) AS no_others,
  group_concat(b, '.') OVER (
    ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE CURRENT ROW
  ) AS current_row,
  group_concat(b, '.') OVER (
    ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE GROUP
  ) AS grp,
  group_concat(b, '.') OVER (
    ORDER BY c GROUPS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE TIES
  ) AS ties
FROM t1 ORDER BY c, a;windowfunctions.html#the_exclude_clauseR type.

 Most built-in window functions ignore the
frame-spec, the exceptions being first_value(),
last_value() and nth_value(). It is a syntax error to specify a FILTER 
clause as part of a built-in window function invocation.



 SQLite supports the following 11 built-in window functions:


  row_number()
   The number of the row within the current partition. Rows are
       numbered starting from 1 in the order defined by the ORDER BY clause in
       the window definition, or in arbitrary order otherwise.
  rank()
   The row_number() of the first peer in each group - the rank of the
       current row with gaps. If there is no ORDER BY clause, then all rows
       are considered peers and this function always returns 1.
  dense_rank()
   The number of the current row's peer group within its partition - the
       rank of the current row without gaps. Rows are numbered starting
       from 1 in the order defined by the ORDER BY clause in the window
       definition. If there is no ORDER BY clause, then all rows are
       considered peers and this function always returns 1.
  percent_rank()
   Despite the name, this function always returns a value between 0.0
       and 1.0 equal to (rank - 1)/(partition-rows - 1), where
       rank is the value returned by built-in window function rank()
       and partition-rows is the total number of rows in the
       partition. If the partition contains only one row, this function
       returns 0.0.
  cume_dist()
   The cumulative distribution. Calculated as
       row-number/partition-rows, where row-number is
       the value returned by row_number() for the last peer in the group
       and partition-rows the number of rows in the partition.
  ntile(N)
   Argument N is handled as an integer. This function divides the
       partition into N groups as evenly as possible and assigns an integer
       between 1 and N to each group, in the order defined by the ORDER
       BY clause, or in arbitrary order otherwise. If necessary, larger groups
       occur first. This function returns the integer value assigned to the
       group that the current row is a part of.

  lag(expr)lag(expr, offset)lag(expr, offset, default)
   The first form of the lag() function returns the result of evaluating
       expression expr against the previous row in the partition. Or, if
       there is no previous row (because the current row is the first), NULL.

       If the offset argument is provided, then it must be a
       non-negative integer. In this case the value returned is the result
       of evaluating expr against the row offset rows before the
       current row within the partition. If offset is 0, then
       expr is evaluated against the current row. If there is no row
       offset rows before the current row, NULL is returned.

       If default is also provided, then it is returned instead of
      NULL if the row identified by offset does not exist.
       
  lead(expr)lead(expr, offset)lead(expr, offset, default)
   The first form of the lead() function returns the result of evaluating
       expression expr against the next row in the partition. Or, if
       there is no next row (because the current row is the last), NULL.

       If the offset argument is provided, then it must be a
       non-negative integer. In this case the value returned is the result
       of evaluating expr against the row offset rows after the
       current row within the partition. If offset is 0, then
       expr is evaluated against the current row. If there is no row
       offset rows after the current row, NULL is returned.

       If default is also provided, then it is returned instead of
      NULL if the row identified by offset does not exist.
  first_value(expr)
   This built-in window function calculates the window frame for each
       row in the same way as an aggregate window function. It returns the
       value of expr evaluated against the first row in the window frame
       for each row.
  last_value(expr)
   This built-in window function calculates the window frame for each
       row in the same way as an aggregate window function. It returns the
       value of expr evaluated against the last row in the window frame
       for each row.
  nth_value(expr, N)
   This built-in window function calculates the window frame for each
       row in the same way as an aggregate window function. It returns the
       value of expr evaluated against the row N of the window
       frame. Rows are numbered within the window frame starting from 1 in
       the order defined by the ORDER BY clause if one is present, or in
       arbitrary order otherwise. If there is no Nth row in the
       partition, then NULL is returned.
  


The examples in this section use the
previously defined T1 table
as well as the following T2 table:

CREATE TABLE t2(a, b);
INSERT INTO t2 VALUES('a', 'one'), 
                     ('a', 'two'), 
                     ('a', 'three'), 
                     ('b', 'four'), 
                     ('c', 'five'), 
                     ('c', 'six');


The following example illustrates the behaviour of the five ranking
functions - row_number(), rank(), dense_rank(), percent_rank() and 
cume_dist().

-- The following SELECT statement returns:
-- 
--   a | row_number | rank | dense_rank | percent_rank | cume_dist
------------------------------------------------------------------
--   a |          1 |    1 |          1 |          0.0 |       0.5
--   a |          2 |    1 |          1 |          0.0 |       0.5
--   a |          3 |    1 |          1 |          0.0 |       0.5
--   b |          4 |    4 |          2 |          0.6 |       0.66
--   c |          5 |    5 |          3 |          0.8 |       1.0
--   c |          6 |    5 |          3 |          0.8 |       1.0
-- 
SELECT a                        AS a,
       row_number() OVER win    AS row_number,
       rank() OVER win          AS rank,
       dense_rank() OVER win    AS dense_rank,
       percent_rank() OVER win  AS percent_rank,
       cume_dist() OVER win     AS cume_dist
FROM t2
WINDOW win AS (ORDER BY a);


The example below uses ntile() to divide the six rows into two groups (the
ntile(2) call) and into four groups (the ntile(4) call). For ntile(2), there
are three rows assigned to each group. For ntile(4), there are two groups of
two and two groups of one. The larger groups of two appear first.

-- The following SELECT statement returns:
-- 
--   a | b     | ntile_2 | ntile_4
----------------------------------
--   a | one   |       1 |       1
--   a | two   |       1 |       1
--   a | three |       1 |       2
--   b | four  |       2 |       2
--   c | five  |       2 |       3
--   c | six   |       2 |       4
-- 
SELECT a                        AS a,
       b                        AS b,
       ntile(2) OVER win        AS ntile_2,
       ntile(4) OVER win        AS ntile_4
FROM t2
WINDOW win AS (ORDER BY a);


 The next example demonstrates lag(), lead(), first_value(), last_value()
and nth_value(). The frame-spec is ignored by 
both lag() and lead(), but respected by first_value(), last_value()
and nth_value().

-- The following SELECT statement returns:
-- 
--   b | lead | lag  | first_value | last_value | nth_value_3
-------------------------------------------------------------
--   A | C    | NULL | A           | A          | NULL       
--   B | D    | A    | A           | B          | NULL       
--   C | E    | B    | A           | C          | C          
--   D | F    | C    | A           | D          | C          
--   E | G    | D    | A           | E          | C          
--   F | n/a  | E    | A           | F          | C          
--   G | n/a  | F    | A           | G          | C          
-- 
SELECT b                          AS b,
       lead(b, 2, 'n/a') OVER win AS lead,
       lag(b) OVER win            AS lag,
       first_value(b) OVER win    AS first_value,
       last_value(b) OVER win     AS last_value,
       nth_value(b, 3) OVER win   AS nth_value_3
FROM t1
WINDOW win AS (ORDER BY b ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)windowfunctions.html#built_in_window_functions
XWX‹z”è       -1–cUWindow Functions4. Window ChainingWindow chaining is a shorthand that allows one window to be defined in terms 
of another. Specifically, the shorthand allows the new window to implicitly
copy the PARTITION BY and optionally ORDER BY clauses of the base window. For
example, in the following:

SELECT group_concat(b, '.') OVER (
  win ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)
FROM t1
WINDOW win AS (PARTITION BY a ORDER BY c)



the window used by the group_concat() function is equivalent
to "PARTITION BY a ORDER BY c ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW". In order to use window
chaining, all of the following must be true:


  The new window definition must not include a PARTITION BY clause. The
       PARTITION BY clause, if there is one, must be supplied by the base
       window specification.

  If the base window has an ORDER BY clause, it is copied into the new
       window. In this case the new window must not specify an ORDER BY clause.
       If the base window has no ORDER BY clause, one may be specified as part
       of the new window definition.
  
  The base window may not specify a frame specification.  The frame
      specification can only be given in the new window specification.


The two fragments of SQL below are similar, but not entirely equivalent, as
the latter will fail if the definition of window "win" contains a frame
specification.

SELECT group_concat(b, '.') OVER win ...
SELECT group_concat(b, '.') OVER (win) ...windowfunctions.html#window_chainingÇ”è
-EŒuiWindow Functions3. Built-in Window FunctionsAs well as aggregate window functions, SQLite features a set of built-in
window functions based on 

those supported by PostgreSQL.

 Built-in window functions honor any PARTITION BY clause in the same way
as aggregate window functions - each selected row is assigned to a partition 
and each partition is processed separately. The ways in which any ORDER BY
clause affects each built-in window function is described below. Some of
the window functions (rank(), dense_rank(), percent_rank() and ntile()) use
the concept of "peer groups" (rows within the same partition that have the
same values for all ORDER BY expressions). In these cases, it does not matter
whether the frame-spec specifies ROWS, GROUPS, or RANGE.
For the purposes of built-in window function processing, rows with the same values
for all ORDER BY expressions are considered peers regardless of the frameQ3_int64 *pInt;

  assert( nArg==1 );
  if( sqlite3_value_type(apArg[0])!=SQLITE_INTEGER ){
    sqlite3_result_error(ctx, "invalid argument", -1);
    return;
  }
  pInt = (sqlite3_int64*)sqlite3_aggregate_context(ctx, sizeof(sqlite3_int64));
  if( pInt ){
    *pInt += sqlite3_value_int64(apArg[0]);
  }
}

/*
** xInverse for sumint().
**
** This does the opposite of xStep() - subtracts the value of the argument
** from the current context value. The error checking can be omitted from
** this function, as it is only ever called after xStep() (so the aggregate
** context has already been allocated) and with a value that has already
** been passed to xStep() without error (so it must be an integer).
*/
static void sumintInverse(
  sqlite3_context *ctx, 
  int nArg, 
  sqlite3_value *apArg[]
){
  sqlite3_int64 *pInt;
  assert( sqlite3_value_type(apArg[0])==SQLITE_INTEGER );
  pInt = (sqlite3_int64*)sqlite3_aggregate_context(ctx, sizeof(sqlite3_int64));
  *pInt -= sqlite3_value_int64(apArg[0]);
}

/*
** xFinal for sumint().
**
** Return the current value of the aggregate window function. Because
** this implementation does not allocate any resources beyond the buffer
** returned by sqlite3_aggregate_context, which is automatically freed
** by the system, there are no resources to free. And so this method is
** identical to xValue().
*/
static void sumintFinal(sqlite3_context *ctx){
  sqlite3_int64 res = 0;
  sqlite3_int64 *pInt;
  pInt = (sqlite3_int64*)sqlite3_aggregate_context(ctx, 0);
  if( pInt ) res = *pInt;
  sqlite3_result_int64(ctx, res);
}

/*
** xValue for sumint().
**
** Return the current value of the aggregate window function.
*/
static void sumintValue(sqlite3_context *ctx){
  sqlite3_int64 res = 0;
  sqlite3_int64 *pInt;
  pInt = (sqlite3_int64*)sqlite3_aggregate_context(ctx, 0);
  if( pInt ) res = *pInt;
  sqlite3_result_int64(ctx, res);
}

/*
** Register sumint() window aggregate with database handle db. 
*/
int register_sumint(sqlite3 *db){
  return sqlite3_create_window_function(db, "sumint", 1, SQLITE_UTF8, 0,
      sumintStep, sumintFinal, sumintValue, sumintInverse, 0
  );
}




 The following example uses the sumint() function implemented by the above
C code. For each row, the window consists of the preceding row (if any), the current row and the following row (again, if any):

CREATE TABLE t3(x, y);
INSERT INTO t3 VALUES('a', 4),
                     ('b', 5),
                     ('c', 3),
                     ('d', 8),
                     ('e', 1);

-- Assuming the database is populated using the above script, the 
-- following SELECT statement returns:
-- 
--   x | sum_y
--------------
--   a | 9    
--   b | 12   
--   c | 16   
--   d | 12   
--   e | 9    
-- 
SELECT x, sumint(y) OVER (
  ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) AS sum_y
FROM t3 ORDER BY x;


In processing the query above, SQLite invokes the sumint callbacks as
follows:



   xStep(4) - add "4" to the current window.
   xStep(5) - add "5" to the current window.
   xValue() - invoke xValue() to obtain the value of sumint() for
       the row with (x='a'). The window currently consists of values 4 and 5, 
       and so the result is 9.
   xStep(3) - add "3" to the current window.
   xValue() - invoke xValue() to obtain the value of sumint() for
       the row with (x='b'). The window currently consists of values 4, 5 and
       3, and so the result is 12.
   xInverse(4) - remove "4" from the window. 
   xStep(8) - add "8" to the current window. The window now consists
       of values 5, 3 and 8.
   xValue() - invoked to obtain the value for the row with (x='c').
       In this case, 16.
   xInverse(5) - remove value "5" from the window.
   xStep(1) - add value "1" to the window.
   xValue() - invoked to obtain the value for row (x='d').
   xInverse(3) - remove value "3" from the window. The window now
       contains values 8 and 1 only.
   xValue() - invoked to obtain the value for row (x='e'). 9.
   xFinal() - invoked to reclaim any allocated resources.windowfunctions.html#user_defined_aggregate_window_functions
<m“<ˆR”÷Y  1#=5Quality Management1. OverviewThis is the Quality Management Plan for SQLite.


Quality management documents tend to expand into
binders full of incomprehensible jargon that nobody
reads.  This document strives to break that pattern by
being concise and useful.


The inspiration for this document is
DO-178B.
Among quality standards, DO-178B seems to have the highest usefulness
to paperwork ratio.  Even so, the amount of documentation needed
for a full-up DO-178B implementation is vast.  SQLite strives to be
nimble and low-ceremony, and to that end, much of the required
DO-178B documentation is omitted.  We retain only those parts that
genuinely improve quality for an open-source software project such
as SQLite.


The purpose of this document is to brief the reader on how the
SQLite development team functions on a daily basis, as they continuously
enhance the SQLite software and work to improve its already high reliability.
The document achieves its purpose if a competent developer can be
assimilated into the development team quickly after perusing this
document.qmplan.html#overview…U”è      -!Š9EWindow Functions6. HistoryWindow function support was first added to SQLite with release
version 3.25.0 (2018-09-15). The SQLite developers used
the PostgreSQL window function
documentation as their primary reference for how window functions
ought to behave.  Many test cases have been run against PostgreSQL
to ensure that window functions operate the same way in both
SQLite and PostgreSQL.

In SQLite version 3.28.0 (2019-04-16),
windows function support was extended to include the EXCLUDE clause,
GROUPS frame types, window chaining, and support for
"&lt;expr&gt; PRECEDING" and "&lt;expr&gt; FOLLOWING" boundaries
in RANGE frames.
This page last modified on  2022-08-09 12:51:29 UTCwindowfunctions.html#history±”è
-aàWindow Functions5. User-Defined Aggregate Window FunctionsUser-defined aggregate window functions may be created using the
sqlite3_create_window_function() API. Implementing an aggregate window
function is very similar to an ordinary aggregate function. Any user-defined
aggregate window function may also be used as an ordinary aggregate. To 
implement a user-defined aggregate window function the application must
supply four callback functions:


Callback Description
xStep 
      This method is required by both window aggregate and legacy aggregate
      function implementations. It is invoked to add a row to the current
      window. The function arguments, if any, corresponding to the row being
      added are passed to the implementation of xStep.

xFinal 
      This method is required by both window aggregate and legacy aggregate
      function implementations. It is invoked to return the current value
      of the aggregate (determined by the contents of the current window),
      and to free any resources allocated by earlier calls to xStep.

xValue 
      This method is  only required for window aggregate functions.  The presence
      of this method is what distinguishes a window aggregate function from a
      legacy  aggregate function.  This method is invoked to return the current
      value of the aggregate. Unlike xFinal, the implementation should not
      delete any context.

xInverse 
      This method is only required for window aggregate functions, not legacy
      aggregate function implementations. It is invoked to remove the oldest
      presently aggregated result of xStep from the current window.
      The function arguments, if any, are those
      passed to xStep for the row being removed.


 The C code below implements a simple window aggregate function named
sumint(). This works in the same way as the built-in sum() function, except
that it throws an exception if passed an argument that is not an integer
value.


/*
** xStep for sumint().
**
** Add the value of the argument to the aggregate context (an integer).
*/
static void sumintStep(
  sqlite3_context *ctx, 
  int nArg, 
  sqlite3_value *apArg[]
){
  sqliteT
ª‚
6‡XuªƒF”÷`      1'†!5Quality Management2.3. ScheduleSQLite has a long-range vision.
Planning is done with the assumption that SQLite
will be used and supported through at least the year 2050.
All code is written with the idea that it will one day be read and
maintained by people not yet born.  The code is carefully commented
with an eye toward helping those future developers more easily 
understand the logic and the rationale behind the code.qmplan.html#schedule^”÷_        15‚5CQuality Management2.2. Release HistoryThe documentation system automatically maintains a
chronology of past releases, as well as a
complete list of SQLite releases with change summaries.qmplan.html#release_history„*”÷^ 17‡MAQuality Management2.1.2. Patch ReleasesOccasionally, a serious problem is found and a small "patch" release
must be made against a regular maintenance release.  Patches are distinct
from maintenance releases in that the number of lines of code changed
from the previous release is small.  Every effort is made to avoid
patch releases by making sure that maintenance releases are bug free.


Patch releases may or may not have a release checklist, depending on the
issue.  This is a judgement call by the project leader.qmplan.html#patch_releases†|”÷]  1CŒYMQuality Management2.1.1. Maintenance ReleasesRoutine maintenance releases of SQLite contain feature enhancements,
performance enhancements, and/or fixes for non-critical issues.
The version number for major releases are of the form "3.N.0"
for some integer N.  See the version numbering conventions document
for details.


Upcoming maintenance releases announced on the sqlite-users and
sqlite-dev mailing lists about two weeks prior to the anticipated
release.  Approximately one week prior to release, the lead developer
declares "pencils down" after which only bug-fix check-ins are
allowed on trunk.  A new 
release checklist
is created and updated as needed.  As items of the checklist are 
verified, they are checked off and turn green.  The release occurs
when all elements of the checklist are green.  That process normally
takes about a week.qmplan.html#maintenance_releases„)”÷\        1=‡;KQuality Management2.1. Software Life CycleSQLite uses a continuous integration process.  The software
is under constant enhancement and refinement.  The latest trunk
check-ins are frequently used internally for mission-critical
operations. 


There is no pre-defined release cycle.  Releases occur
when there is a critical mass of feature enhancements and/or
bug fixes.  Historically, releases have occurred about 5 or 6
times per year.
Users of SQLite pick up new releases from the website on an
as-needed basis.qmplan.html#software_life_cycle‚G”÷[    1EƒcWQuality Management2. Software Development PlanThis section is a combination of the Plan For Software Aspects Of
Certification and the Software Development Plan sections of DO-178B.



See About SQLite for an overview of the
SQLite software and what it does and how it is different.qmplan.html#software_development_plan‚y”÷Z     1=„[KQuality Management1.1. About This DocumentThe quality management plan was originally composed by going through
the description of outputs in section 11 of DO-178B (pages 48 through 56)
and writing down those elements that seemed relevant to SQLite.
The text will be subsequent revised to track enhancements to the
SQLite quality process.qmplan.html#about_this_document
+  _ýÚ+*”÷e 1/Y=Quality Management5.3. RepositoriesThe SQLite source is broken up into multiple repositories, each described
in a separate section below.qmplan.html#repositories†”÷d       11‹=?Quality Management5.2. SurvivabilityAll code is archived on three separate machines:
https://www.sqlite.org, https://www2.sqlite.org, https://www3.sqlite.org.
These machines are located in different cities (Dallas, Newark, and
San Francisco, respectively) and managed by two different hosting
companies (Linode for the first two and
Digital Ocean for the third).
This diversity is intended to avoid a single point of failure.


The main machine in Dallas https://www.sqlite.org/ is the primary
server and the one that most people use.  The other two are considered
backups.


In addition to the official repositories, the developers typically
keep complete clones of all software on their personal machines.
And there are other clones scattered about the internet.qmplan.html#survivability‚”÷c  15ƒ%CQuality Management5.1. Version ControlSQLite source code is managed using the Fossil
version control system.  Fossil was written specifically to support
SQLite development.  Fossil provides both distributed version control
and issue tracking.qmplan.html#version_control†B”÷b     1G‹UYQuality Management4. Software Verification PlanThe testing process for SQLite is described in the testing document.
Testing objectives include:


 100% MC/DC in an as-delivered configuration
 Testing of both source code and object code
 Testing on multiple platforms and with multiple compilers
 Fuzz testing
 Code change inspection
 Dynamic and static analysis of the code


The testing process is controlled by the
release testing checklists.  The checklists succinctly summarize
all steps necessary to fully validate SQLite, and they record when
and by whom each validation step was performed.

The set of checklist items for release checklist is potentially
updated for each release.  The content and complete
history of each release checklist are retained for the historical
record.qmplan.html#software_verification_plan”÷a      1S˜qeQuality Management3. Software Development EnvironmentSQLite is written in portable C code.
Development work occurs on a mix of Linux, Mac, and Windows workstations.
The developers use command-line tools and eschew integrated development
environments (IDEs) whenever possible.  All developers are expected to be
fluent with the unix command-line.


A minimum setup for compiling and testing SQLite from canonical
sources is as follows:


 A host computer with a 32-bit or 64-bit address space.
     The OS can be Linux, Mac, Windows, *BSD, Solaris, or some other.
 A C99 compiler such as GCC (including MinGW variants for Windows),
     Clang, or MSVC
 A text editor of the user's choice supporting UTF-8 text.
 Tcl version 8.6 or later.
 The "make" utility, or optionally "nmake" on Windows.



The Tcl script language is used to help translate canonical source code
into the amalgamation and to manage testing.  Tcl is not used directly
by SQLite itself (unless requested by a compile-time option).  End users
of the SQLite amalgamation sources do not need Tcl.


When building the CLI, it is helpful, but not required, to have
the following third-party libraries on hand:


 zLib
 readline
     or editline
     or linenoise for
     command-line editing.



A complete release-test of SQLite requires additional software,


 valgrind
 gcov



SQLite is expected to operate the same, and use exactly the same 
on-disk format,
on all modern operating systems, on all modern computer architectures,
and using all modern C compilers.  The developers are constantly testing
SQLite on as many diverse platforms as they can get their hands on.qmplan.html#software_development_environment
ûöñìçâÝØÓÎÉÄ¿ºµ°«¦¡œ—’ˆƒ~ytoje`[VQLGB=83.)$ü÷òíçáÛÕÏÉý·±«¥Ÿ™“‡{uoic]WQKE?93-'! 
ý
÷
ñ
ë
å
ß
Ù
Ó
Í
Ç
Á
»
µ
¯
©
£

—
‘
‹
…

y
s
m
g
a
[
U
O
I
C
=
7
1
+
%






ûõïéãÝ×ÑËÅ¿¹³-§¡›•‰ƒ}wqke_YSMGA;5/)#ÿùóíçáÛÕÏÉý·±«¥Ÿ™“‡{uoic]WQKE?93-'! 
ý
÷
ñ
ë
ä
Ý
Ö
Ï
È
Á
º
³
¬
¥
ž
—

‰
‚
{
t
m
f
_
X
Q
J
C
<
5
.
'
 



       ý       ö       ï       è       á       Ú       Ó       Ì       Å       ¾       ·       °       ©       ¢       ›       ”              †              x       q       j       c       \       U       N       G       @       9       2       +       $                            þ÷ðéâÛÔÍÆ¿¸±ª£œ•Ž‡€yrkd]VOHA:3,%        ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)"
ÿøñêãÜÕÎÇÀ¹²«¤–ˆzsle^WPIB;4-&
üõîçàÙÒËĽ¶¯¨¡š“Œ…~wpib[TMF?81*#ùòëäÝÖ5”÷YS”èP”èO”èN”è
M”èL”è        K”à,J”à+I”à*G”à)F”à&E”à%D”à#C”ØKA”ØG@”ØF?”ØE>”ØB=”ØA<”Ø@;”Ø>:”Ø;9”©J8”¡d7”¡b6”š
5”š4”š3”™{2”’1”’0”‚F/”‚B.“ú[-“Ûh,“Ûf+“Ûc*“Û`)“Û_(“Û^'“Û\&“ÛZ%“ÛX$“ÛW#“ÛT"“ÛP!“ÛL “ÛG“ÛE“ÛB“Û>“Û;“Û9“Ó`“Ó^“ÓZ“ÓX“ÓV“ÓU“ÓT“ÓR“Ëk“¬R“¬Q
“¬N“¬K“¬J
“¬I  “œ~“œ}“œy“…F“…E“…D’ý]’ýZ’õr’îÿ’îþ’î
ý’ÖQü’Îjû’Îiú’ˆFù’ˆDø’ˆB÷’€_ö’€\õ’€Yô‘ÙRó‘º:ò‘º7ñ‘º3ð‘²Lecë‘¢zꑛ鑛葛瑓,æ‘“*å‘‹fä‘‹cã‘‹aâ‘‹]á‘‹Zà‘‹Yß‘‹WÞ‘‹UÝ‘‹PÜ‘‹MÛ‘‹JÚ‘‹FÙ‘‹CØ‘‹B×û|ÖûzÑûxËûvÉûuÃûsÁûqÀô¿ô¾ô½ô        ¼ì"»Ü_ºÜ[¹ÜZ¸ÜX·ÜT¶ÜRµÔk¢Ôj¥|œ¥y›ŽCšŽB™ŽA˜†n—†m–†j•†g”†e“†d’†c‘†`†\Œÿ‹ÿŠÿˆÿ‡ÿ„ÿƒÿ‚ÿ€ÿ~ÿ}ÿzÿvþ~uþ|tþ{sþzpþyoþwmþulþtkþsjþriþqh÷
g÷  fï/eï,dï+cï)bï$aï!KßYIßXHßUGßSFÐ
EÐCÐBÈ AÈ?È>È=È<Àp;Ào:Àk9Àf7Àe6Àb5À`3À^0À].À\,ÀZ+ÀY*ÀU)ÀS(ÀP'ÀN&ÀM%ÀK$ÀI#ÀG"ÀF!ÀD ÀBÀ@À?À<À:À8À5À2¸[¸Z¸X¸V¸T¸P¸M¸L¸I¨~
¨}¨z
™/  ™.™+‘C‘A‰Z‰YyxvÿtþrýqüŽúûŽúúŽúùŽúøŽú÷Žú
öŽúõŽúôŽú    îƒëƒêƒèƒçƒæƒ
ÞƒÙƒ׃   ´ƒ²ƒ¡ƒƒ›ƒe‚a‚}^‚zZ‚yU‚xT‚wJ‚vG‚uE‚t/‚s.‚r+‚q#‚p‚n‚l‚k‚j‚i‚h‚gò‚fè‚dà‚bÚ‚aׂ^Ö‚]Ó‚\Ç‚[Ä‚YÁ‚X»‚W¥‚Uœ‚T—‚S‚R‚QŒ‚P‹‚NŠ‚M…‚Lƒ‚I|‚H{‚Fv‚Eu‚Dt‚Ce‚B^‚A\‚@Q‚?O‚=K‚<I‚;G‚:F‚9E‚8B‚7?‚6=‚4:‚38‚16‚/5‚.3‚-2‚,(‚+"‚*‚(‚&
‚$‚!‚‚ý‚ü‚ú‚õ‚ô‚ã‚΂É‚Æ‚¯‚©‚¦‚
¥‚¡‚œ‚
™‚   •“‚l‚j‚f‚I‚@"}|zy
w   vuûtúrøp÷löjõgóeòcîbêaé]èZçYæXãVÞTÝRÚNÙJØI×GÖEÔDÏBÎ@Í>Ë:É8È4Ç0Å-Ä*Â(Á%À$¿#¾"½!¼»¹·µ´³±°¯®¬«ª©¨~§|¦z¥y¤x£u¢r¡n kŸiœg›dša™^˜[—X–T•R”O“J’F‘C@>Ž=;Œ:‹6Š2‰/ˆ,…*„'ƒ&%z#v"t!l jfeca_SNLI
H
F    DBA½ÕXùòëäÝÖÏÈÁº³¬¥ž—‰‚{tmf_XQJC<5.' ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$
ú
ó
ì
å
Þ
×
Ð
É
Â
»
´
-
¦
Ÿ
˜
‘
Š
ƒ
|
u
n
g
`
Y
R
K
D
=
6
/
(
!



þ÷ðéâÛÔÍÆ¿¸±ª£œ•Ž‡€yrkd]VOHA:3,%     ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)"

ÿ
ø
ñ
ê
ã
Ü
Õ
Î
Ç
À
¹
²
«
¤

–

ˆ

z
s
l
e
^
W
P
I
B
;
4
-
&





       ü       õ       î       ç       à       Ù       Ò       Ë       Ä       ½       ¶       ¯       ¨       ¡       š       “       Œ       …       ~       w       p       i       b       [       T       M       F       ?       8       1       *       #                                   ýöïèáÚÓÌž·°©¢›”†xqjc\UNG@92+$úóìåÞ×ÐÉ»´-¦Ÿ˜‘Šƒ|ung`YRKD=6/(!þ÷ðéâÛÔÍÆ¿¸±ª£œ•Ž‡€yrkd]VOHA:3,%       ûôíæßØÑÊüµ®§ ™’‹„}vohaZSLE>70)"
ÿøñêãÜÕV˜ÄQU˜µT˜¥5S˜¥1R˜hQ˜dP˜`O˜[N˜WM˜TL˜QK˜MJ˜JI˜~H˜|G˜zF—þ[E—þYD—þVB—þSA—þR@—þP?—þO>—þN=—þL<—þK;—þJ:—þG9—þE8—þD7—þB3—þ@2—þ?1—þ;0—þ6/—þ2.—þ--—þ+,—îo*—îl)—îk'—îi&—îf%—îc$—îa#—î_!—î[ —îY—æw—æu—æt—ær—Ïc—Ï`—Ï_—ÏZ—ÏY—ÏX—ÏW—ÏR—ÏP—ÏM—ÏL—ÏI—ÏF
—ÏE—ÏD—ÏB
—Ï@    —Ï?—Ï>—Ï:—ÇZ—ÇX—ÇU—ÇT—ÇSÿ—ÇQþ—¿mý—¿jø—¸÷—¸ö—¸õ—¨2ô—|ó—zò—yñ—‰ð—‰ï—‰î—‰í—0ì—-ê—,é—+è—*ç–ùCæ–Úkå–Úiä–Úfã–Úaâ–Ú_á–Ú\à–Ú[ß–ÚXÞ–ÚUÝ–ÚSÜ–ÚMÛ–ÚKÚ–ÚIÙ–ÚGØ–ÚEÖ–ÚDÕ–ÚBÔ–Ú@Ó–Ú;Ò–Ú6Ñ–Ú3ЖÚ/Ï–Ú-ΖÚ(Í–Ú&Ì–Ú#Ë–Ú!É–ÊYÇ–ÊVÆ–ÊSÅ–»Ä–»Ö³(Á–³'¿–³%¾–³!½–³¼–³»–«4º–«2¹–›d¸–Œ·–Œ¶–Œµ–„)´•üc³•ü^²•ü\°•ü[¯•üW®•üS¬•üPª•üN¨•üM§•üL¥•üJ¤•üG¢•üE¡•üC •ôsŸ•ôpž•ôn•ôm›•ôkš•ôh™•ôe˜•ôc–•ôb••ô_”•ô^’•ô]‘•ô\•ôZ•ì{Ž•ìx•ìwŒ•ìv‹•ìsŠ•ìr‰•Ý(ˆ•Ý'„•Ý&‚•Ý#•Ý"•Ý!}•ÕF|•ÕCz•ÕBy•ÕAx•Õ?w•Õ>v•Õ=u•Õ;t•¾s•¾r•¾q•¶p•¶o•¶n•¶m•¦Pl•¦Ok•¦Lj•¦Ii•žlh•žkg•žif•žhe•žgd•žec•žcb•žba•`•_•^•]”ÿH\”ÿE[”ÿAZ”÷kW”÷eV”÷`U”÷YS”èP”èO”èN”è
M”èL”è      K”à,J”à+I”à*G”à)F”à&E”à%D”à#C”ØKA”ØG@”ØF?”ØE>”ØB=”ØA<”Ø@;”Ø>:”Ø;9”©J8”¡d7”¡b6”š
5”š4”š3”™{2”’1”’0”‚F/”‚B.“ú[-“Ûh,“Ûf+“Ûc*“Û`)“Û_(“Û^'“Û\&“ÛZ%“ÛX$“ÛW#“ÛT"“ÛP!“ÛL “ÛG“ÛE“ÛB“Û>“Û;“Û9“Ó`“Ó^“ÓZ“ÓX“ÓV“ÓU“ÓT“ÓR“Ëk“¬R“¬Q
“¬N“¬K“¬J
“¬I  “œ~“œ}“œy“…F“…E“…D’ý]’ýZ’õr’îÿ’îþ’î
ý’ÖQü’Îjû’Îiú’ˆFù’ˆDø’ˆB÷’€_ö’€\õ’€Yô‘ÙRó‘º:ò‘º7ñ‘º3ð‘²Lecë‘¢zꑛ鑛葛瑓,æ‘“*å‘‹fä‘‹cã‘‹aâ‘‹]á‘‹Zà‘‹Yß‘‹WÞ‘‹UÝ‘‹PÜ‘‹MÛ‘‹JÚ‘‹FÙ‘‹CØ‘‹B×û|ÖûzÑûxËûvÉûuÃûsÁûqÀô¿ô¾ô½ô        ¼ì"»Ü_ºÜ[¹ÜZ¸ÜX·ÜT¶ÜRµÔk¢Ôj¥|œ¥y›ŽCšŽB™ŽA˜†n—†m–†j•†g”†e“†d’†c‘†`†\Œÿ‹ÿŠÿˆÿ‡ÿ„ÿƒÿ‚ÿ€ÿ~ÿ}ÿzÿvþ~uþ|tþ{sþzpþyoþwmþulþtkþsjþriþqh÷
g÷  fï/eï,dï+cï)bï$aï!KßYIßXHßUGßSFÐ
EÐCÐBÈ AÈ?È>È=È<Àp;Ào:Àk9Àf7Àe6Àb5À`3À^0À].À\,ÀZ+ÀY*ÀU)ÀS(ÀP'ÀN&ÀM%ÀK$ÀI#ÀG"ÀF!ÀD ÀBÀ@À?À<À:À8À5À2¸[
r
¨—drƒm”÷k     1Q†_Quality Management5.4. Software Verification ResultsRelease testing proceeds by checklist.  The current status and
complete change history for each checklist is stored in a separate
SQLite database file.  These files are not version controlled, but
separate copies are maintained on private backup servers.

The source code to the software that runs the checklists is stored
in its own Fossil repository at https://www.sqlite.org/checklistapp.qmplan.html#software_verification_results„.”÷j      1-‡i7Quality Management5.3.5. DbsqlfuzzThe dbsqlfuzz module is a 
libFuzzer-based fuzzer
for SQLite.  Dbsqlfuzz fuzzes both the SQL and the database file at
the same time.  Dbsqlfuzz uses a customized mutator.


Dbsqlfuzz seems to work better at finding problems than any other
fuzzer available.  For that reason, it is kept private.  We do not
want hacker gaining access to this technology.


 Primary location: https://www.sqlite.org/dbsqlfuzz
 Backup A: https://www3.sqlite.org/cgi/dbsqlfuzz
 Additional backups on private serversqmplan.html#dbsqlfuzz„”÷i        19‡AQuality Management5.3.4. Test Harness #3The Test Harness #3 or TH3 test suite is a private set of
test cases used to test SQLite to 100% MC/DC in an as-delivered
configuration.  TH3 sources are served on the same servers as the
other SQLite repositories, but differ from the others in being
proprietary.  The TH3 code is only accessible to SQLite developers.



 Primary location: https://www.sqlite.org/th3
 Backup A: https://www3.sqlite.org/cgi/th3
 Additional backups on private serversqmplan.html#test_harness_3‚U”÷h   17„#AQuality Management5.3.3. SQL Logic TestThe SQL Logic Tests are a set of test cases designed to show that
SQLite behaves the same as other SQL database engines.  These tests
are hosted in a separate code public repository.


 Primary location: https://www.sqlite.org/sqllogictest
 Backups on private serversqmplan.html#sql_logic_test‡z”÷g      1SŽ5]Quality Management5.3.2. SQLite Documentation SourcesThe documentation sources include documentation text and images with the
scripts and makefile needed to construct the SQLite website documentation.
This document is contained within the documentation sources.  The
document sources are kept in a separate repository distinct from the
source code.  The documentation sources repository is publicly readable.

The makefiles and scripts used to generate the documentation gather
text from baseline documents in the documentation source repository.
Additional text is extracted from comments in the SQLite source code.
Requirements coverage information is extracted from special comments in the
TCL test suite which is part of the source repository, and from
comments in the TH3 test suite which is in a separate private repository.


 Primary location: https://www.sqlite.org/docsrc
 Backup A: https://www2.sqlite.org/docsrc
 Backup B: https://www3.sqlite.org/cgi/docsrcqmplan.html#sqlite_documentation_sourcesƒz”÷f      1?†]IQuality Management5.3.1. SQLite Source CodeThe SQLite source code and the TCL test suite are stored together
in a single repository.  This one repository is all that is required to
build the SQLite.  The source repository is public and is
readable by anonymous passersby on the internet.


 Primary location: https://www.sqlite.org/src
 Backup A: https://www2.sqlite.org/src
 Backup B: https://www3.sqlite.org/cgi/src
 GitHub mirror: https://github.com/sqlite/sqlite/qmplan.html#sqlite_source_code
•þ       «Í•„3”ÿA !)‡?Row Values1. DefinitionsA "value" is a single number, string, BLOB or NULL.
Sometimes the qualified name "scalar value" is used to emphasize that
only a single quantity is involved.

A "row value" is an ordered list of two or more scalar values.
In other words, a "row value" is a vector or tuple.

The "size" of a row value is the number of scalar values the row value contains.
The size of a row value is always at least 2.
A row value with a single column is just a scalar value.
A row value with no columns is a syntax error.rowvalue.html#definitions‹Y”÷n    11–/CQuality Management8. Problem ReportsAll problems are fixed expeditiously.  There are no lingering problems
in the sQLite software.

The Fossil version control system utilized by
SQLite contains built-in support for tracking trouble-tickets.  This built-in
ticket system is used to track and document many historical problems.

The SQLite Community Forum is a place
where anybody on the internet can go to ask questions about or report bugs
against SQLite.  Bugs found by third-parties are often reported initially
on the Forum.  Forum-reported bugs will sometimes be transferred to tickets,
though recent practice as been to just deal with the bugs on the Forum.
The Forum has an excellent full-text search feature, is mirrored to
multiple machines, and is just as searchable and survivable as the ticket
system, so it seems unnecessary to duplicate Forum-originated bug reports
into the ticket system.  The public locations of the Forum are:


 Primary location: https://www.sqlite.org/forum
 Backup A: https://www2.sqlite.org/forum
 Backup B: https://www3.sqlite.org/cgi/forum



As with the source repositories, the Forum is also synced to various
private machines.
Note that because of the way Fossil works, the "backups" are more than just
read-only backups.  They can also function as data inputs.  All content
entered is synced to all repositories, regardless of which repository is
used for insertion.
This page last modified on  2021-11-26 21:13:11 UTCqmplan.html#problem_reports„N”÷m     1[‡EmQuality Management7. Software Design And Coding StandardsObjective coding standards for SQLite are minimal:


 2-space indentation
 No lines over 80 characters in length
 No tabs


All other design and coding rules are subjective.  The
goal here is to make the software so that it is readable
and maintainable through the year 2050.  To that end, we look
for succinct yet useful comments (no boilerplate), carefully
chosen variable names, and careful explanation of the meaning
of each data structure and the role of each code block.qmplan.html#software_design_and_coding_standards‡}”÷l    1cŽuQuality Management6. Software Requirements Standards And DataIn the SQLite project, the "requirements" are the project documentation.
Special markup in the documentation text indentifies individual requirements.
The requirement numbers are based on a cryptographic hash of normalized
requirement text, so that it is impossible to change the requirement text
without also changing the requirement number.

Documentation text (and hence requirement text) is taken from the
SQLite Documentation source repository, described above, and also from
comments in the implementation.  The makefiles to build the documentation
are in the documentation source repository.

When the documentation is build, requirements are identified and labeled.
The documentation build process also scans for test cases that verify
each requirement and constructs a matrix showing which requirements have
been testing and identifying the specific test cases that test those
requirements.qmplan.html#software_requirements_standards_and_data
¥
B;¥ƒ”ÿE     !U„ggRow Values2.3. Row Values In UPDATE StatementsRow values can also be used in the SET clause of an UPDATE statement.
The LHS must be a list of column names.  The RHS can be any row value.
For example:

UPDATE tab3 
   SET (a,b,c) = (SELECT x,y,z
                    FROM tab4
                   WHERE tab4.w=tab3.d)
 WHERE tab3.e BETWEEN 55 AND 66;rowvalue.html#row_values_in_update_statements„”ÿD      !C†mURow Values2.2. Row Value IN OperatorsFor a row-value IN operator, the left-hand side (hereafter "LHS") can be either
a parenthesized list of values or a subquery with multiple columns.  But the
right-hand side (hereafter "RHS") must be a subquery expression.

CREATE TABLE t2(x,y,z);
INSERT INTO t2(x,y,z) VALUES(1,2,3),(2,3,4),(1,NULL,5);
SELECT
   (1,2,3) IN (SELECT * FROM t2),  -- 1
   (7,8,9) IN (SELECT * FROM t2),  -- 0
   (1,3,5) IN (SELECT * FROM t2);  -- NULLrowvalue.html#row_value_in_operatorsŠO”ÿC     !A”SRow Values2.1. Row Value ComparisonsTwo row values are compared by looking at the constituent scalar
values from left to right.
A NULL means of "unknown".  
The overall result of comparison is NULL if it is possible to make the
result either true or false by substituting alternative values in place
of the constituent NULLs.
The following query demonstrates some row value comparisons:

SELECT
  (1,2,3) = (1,2,3),          -- 1
  (1,2,3) = (1,NULL,3),       -- NULL
  (1,2,3) = (1,NULL,4),       -- 0
  (1,2,3) &lt; (2,3,4),          -- 1
  (1,2,3) &lt; (1,2,4),          -- 1
  (1,2,3) &lt; (1,3,NULL),       -- 1
  (1,2,3) &lt; (1,2,NULL),       -- NULL
  (1,3,5) &lt; (1,2,NULL),       -- 0
  (1,2,NULL) IS (1,2,NULL);   -- 1


The result of "(1,2,3)=(1,NULL,3)" is NULL because the result might be
true if we replaced NULL&rarr;2 or false if we replaced NULL&rarr;9.
The result of "(1,2,3)=(1,NULL,4)" is not NULL because there is no
substitutions of the constituent NULL that will make the expression true,
since 3 will never equal 4 in the third column.

Any of the row values in the previous example could be replace by a
subquery that returns three columns and the same answer would result.
For example:

CREATE TABLE t1(a,b,c);
INSERT INTO t1(a,b,c) VALUES(1,2,3);
SELECT (1,2,3)=(SELECT * FROM t1); -- 1rowvalue.html#row_value_comparisons„e”ÿB !ˆw5Row Values2. SyntaxSQLite allows row values to be expressed in two ways:

A parenthesized, comma-separated list of scalar values.
A subquery expression with two or more result columns.


SQLite can use row values in two contexts:

Two row values of the same size 
can be compared using operators &lt;, &lt;=, &gt;, &gt;=,
=, &lt;&gt;, IS, IS NOT, IN, NOT IN, BETWEEN, or CASE.
In an UPDATE statement, a list of column names can be set to a row value of
the same size.


The syntax for row values and the circumstances in which row values
can be used are illustrated in examples below.rowvalue.html#syntax
B
,B‰e”ÿH !W’iRow Values3.3. Search against multi-column keysSuppose we want to know the order number, product number, and quantity
for any item in which the product number and quantity match the product
number and quantity of any item in order number 365:

SELECT ordid, prodid, qty
  FROM item
 WHERE (prodid, qty) IN (SELECT prodid, qty
                           FROM item
                          WHERE ordid = 365);


The query above could be rewritten as a join and without the use
of row values:

SELECT t1.ordid, t1.prodid, t1.qty
  FROM item AS t1, item AS t2
 WHERE t1.prodid=t2.prodid
   AND t1.qty=t2.qty
   AND t2.ordid=365;


Because the same query could be written without the use of row values,
row values do not provide new capabilities.  However, many developers say
that the row value format is easier to read, write, and debug.

Even in the JOIN form, the query can be made clearer through the use of
row values:

SELECT t1.ordid, t1.prodid, t1.qty
  FROM item AS t1, item AS t2
 WHERE (t1.prodid,t1.qty) = (t2.prodid,t2.qty)
   AND t2.ordid=365;


This later query generates exactly the same bytecode as the previous
scalar formulation, but using syntax that it cleaner and
easier to read.rowvalue.html#search_against_multi_column_keys…T”ÿG
!q‰3Row Values3.2. Comparison of dates stored as separate fieldsThe usual way of storing a date in a database table is as a single
field, as either a unix timestamp, a julian day number, or an ISO-8601
dates string.  But some application store dates as three separate
fields for the year, month, and day.  

CREATE TABLE info(
  year INT,          -- 4 digit year
  month INT,         -- 1 through 12
  day INT,           -- 1 through 31
  other_stuff BLOB   -- blah blah blah
);


When dates are stored this way, row value comparisons provide a
convenient way to compare dates:

SELECT * FROM info
 WHERE (year,month,day) BETWEEN (2015,9,12) AND (2016,9,12);rowvalue.html#comparison_of_dates_stored_as_separate_fields‹v”ÿF    !G–MYRow Values3.1. Scrolling Window QueriesSuppose an application wants to display a list of contacts
in alphabetical order by lastname, firstname, in a scrolling window
that can only show 7 contacts at a time.  Initialize the scrolling
window to the first 7 entries is easy:

SELECT * FROM contacts
 ORDER BY lastname, firstname
 LIMIT 7;


When the user scrolls down, the application needs to find the
second set of 7 entries.  One way to do this is to use the OFFSET clause:

SELECT * FROM contacts
 ORDER BY lastname, firstname
 LIMIT 7 OFFSET 7;


OFFSET gives the correct answer.  However, OFFSET requires time
proportional to the offset value.  What really happens
with "LIMIT x OFFSET y" is that SQLite computes the query as
"LIMIT x+y" and discards the first y values without returning them
to the application.  So as the window scrolls down toward
the bottom of a long list, and the y value becomes larger and larger,
successive offset computations take more and more time.

A more efficient approach is to remember the last entry currently
displayed and then use a row value comparison in the WHERE
clause:

SELECT * FROM contacts
 WHERE (lastname,firstname) &gt; (?1,?2)
 ORDER BY lastname, firstname
 LIMIT 7;


If the lastname and firstname on the bottom row of the previous
screen are bound to ?1 and ?2, then the query above computes the next
7 rows.  And, assuming there is an appropriate index, it does so
very efficiently &mdash; much more efficiently than OFFSET.rowvalue.html#scrolling_window_queries
M&˜|4M…b•       7ŠOAHow To Compile SQLite OverviewSQLite is ANSI-C source code.
It must be compiled into machine code before it is useful.
This article is a guide to the various ways of compiling SQLite.


This article does not contain a step-by-step recipe for compiling
SQLite.  That would be difficult since each development situation
is different.
Rather, this article describes and illustrates the principals behind the
compilation of SQLite.  Typical compilation commands are provided as examples
with the expectation that application developers can use these examples
as guidance for developing their own custom compilation procedures.
In other words, this article provides ideas and insights, not turnkey
solutions.howtocompile.html#overviewD•7
71How To Compile SQLiteHow To Compile SQLitehowtocompile.html#‚”ÿK !AƒWRow Values4. Backwards CompatibilityRow values were added to SQLite
version 3.15.0 (2016-10-14).  Attempts to use row values in
prior versions of SQLite will generate syntax errors.
This page last modified on  2022-03-07 15:31:00 UTCrowvalue.html#backwards_compatibility‡       ”ÿJ     !EŒwWRow Values3.5. Clarity of presentationSometimes the use of row values just makes the SQL easier to read
and write.  Consider the following two UPDATE statements:

UPDATE tab1 SET (a,b)=(b,a);
UPDATE tab1 SET a=b, b=a;


Both UPDATE statements do exactly the same thing.  (They generate
identical bytecode.)  But the first form, the row value form, seems
to make it clearer that the intent of the statement is to swap the
values in columns A and B.

Or consider these identical queries:

SELECT * FROM tab1 WHERE a=?1 AND b=?2;
SELECT * FROM tab1 WHERE (a,b)=(?1,?2);


Once again, the SQL statements generate identical bytecode and thus
do exactly the same job in exactly the same way.  But the second form
is made easier for humans to read by grouping the query parameters together
into a single row value rather than scattering them across the WHERE
clause.rowvalue.html#clarity_of_presentationU”ÿI
!}Row Values3.4. Update multiple columns of a table based on a queryThe row-value notation is useful for updating two or more columns
of a table from the result of a single query.
An example of this is in the full-text search feature of the
Fossil version control system.

In the Fossil full-text search system,
documents that participate in the full-text search (wiki pages, tickets,
check-ins, documentation files, etc) are tracked by a table called
"ftsdocs" (full text search documents).
As new documents are added to the repository, they are not indexed right
away.  Indexing is deferred until there is a search request.  The
ftsdocs table contains an "idxed" field which is true if the document
has been indexed and false if not.

When a search request occurs and pending documents are indexed for the
first time, the ftsdocs table must be updated by setting the idxed column
to true and also filling in several other columns with information pertinent
to the search.  That other information is obtained from a join.  The
query is this:

UPDATE ftsdocs SET
  idxed=1,
  name=NULL,
  (label,url,mtime) = 
      (SELECT printf('Check-in &#91;%%.16s&#93; on %%s',blob.uuid,
                     datetime(event.mtime)),
              printf('/timeline?y=ci&amp;c=%%.20s',blob.uuid),
              event.mtime
         FROM event, blob
        WHERE event.objid=ftsdocs.rid
          AND blob.rid=ftsdocs.rid)
WHERE ftsdocs.type='c' AND NOT ftsdocs.idxed


(See the 
source code
for further detail.  Other examples
here and
here.)

Five out of nine columns in the ftsdocs table are updated.  Two of
the modified columns, "idxed" and "name", can be updated independently of
the query.  But the three columns "label", "url", and "mtime" all require
a join query against the "event" and "blob" tables.  Without row values,
the equivalent UPDATE would require that the join be repeated three times, 
once for each column to be updated.rowvalue.html#update_multiple_columns_of_a_table_based_on_a_query
ÉÉ2•
7iž]How To Compile SQLite1. Amalgamation Versus Individual Source FilesSQLite is built from over one hundred files of C code and script
spread across multiple directories.  The implementation of SQLite is pure
ANSI-C, but many of the C-language source code files are either
generated or transformed by auxiliary C programs and AWK, SED, and TCL 
scripts prior to being incorporated into the finished SQLite library.
Building the necessary C programs and transforming and/or creating the
C-language source code for SQLite is a complex process.

To simplify matters, SQLite is also available as a pre-packaged
amalgamation source code file: sqlite3.c.  The amalgamation is
a single file of ANSI-C code that implements the entire SQLite library.
The amalgamation is much easier to deal with.  Everything is contained
within a single code file, so it is easy to drop into the source tree
of a larger C or C++ program.  All the code generation and transformation
steps have already been carried out so there are no auxiliary C programs
to configure and compile and no scripts to run.  And, because the entire
library is contained in a single translation unit, compilers are able to
do more advanced optimizations resulting in a 5% to 10% performance 
improvement.  For these reasons, the amalgamation source file 
("sqlite3.c") is recommended for all applications.


The use of the amalgamation is recommended for all applications.


Building SQLite directly from individual source code files is certainly
possible, but it is not recommended.  For some specialized applications, it
might be necessary to modify the build process in ways that cannot be done
using just the prebuilt amalgamation source file downloaded from the website.
For those situations, it is recommended that a customized amalgamation be
built (as described below)
and used.  In other words, even if a project requires building SQLite 
beginning with individual source files, it is still recommended that an
amalgamation source file be used as an intermediate step.howtocompile.html#amalgamation_versus_individual_source_files
—i• 7[-iyHow To Compile SQLite2. Compiling The Command-Line InterfaceA build of the command-line interface requires three source
files:


sqlite3.c: The SQLite amalgamation source file
sqlite3.h: The header files that accompanies sqlite3.c and 
defines the C-language interfaces to SQLite.
shell.c: The command-line interface program itself.
This is the C source code file that contains the definition of
the main() routine and the loop that prompts for user input
and passes that input into the SQLite database engine for processing.


All three of the above source files are contained in the
amalgamation tarball available on the download page.

To build the CLI, simply put these three files in the same directory
and compile them together.  Using MSVC:


cl shell.c sqlite3.c -Fesqlite3.exe


On unix systems (or on Windows using cygwin or mingw+msys)
the command typically looks something like this:


gcc shell.c sqlite3.c -lpthread -ldl -lm -o sqlite3


The pthreads library is needed to make SQLite threadsafe.  But
since the CLI is single threaded,  we could instruct SQLite to build
in a non-threadsafe mode and thereby omit the pthreads library:


gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl -lm -o sqlite3


The -ldl library is needed to support dynamic loading, the
sqlite3_load_extension() interface and the
load_extension() SQL function.  If these features are not required,
then they can be omitted using SQLITE_OMIT_LOAD_EXTENSION compile-time
option:


gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c -o sqlite3


One might want to provide other compile-time options such as
-DSQLITE_ENABLE_FTS4 or -DSQLITE_ENABLE_FTS5 for full-text search,
-DSQLITE_ENABLE_RTREE for the R*Tree search engine extension,
-DSQLITE_ENABLE_JSON1 to include JSON SQL functions, or
-DSQLITE_ENABLE_DBSTAT_VTAB for the dbstat virtual table.
In order to see extra commentary in EXPLAIN listings, add the 
-DSQLITE_ENABLE_EXPLAIN_COMMENTS option.
On unix systems, add -DHAVE_USLEEP=1 if the host machine supports the
usleep() system call.  Add -DHAVE_READLINE and the -lreadline
and -lncurses libraries to get command-line editing support.
One might also want to
specify some compiler optimization switches.  (The precompiled
CLI available for download from the SQLite website uses "-Os".)
There are countless possible variations here.  A command to
compile a full-featured shell might look something like this:


gcc -Os -I. -DSQLITE_THREADSAFE=0 -DSQLITE_ENABLE_FTS4 &#92;
   -DSQLITE_ENABLE_FTS5 -DSQLITE_ENABLE_JSON1 &#92;
   -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_EXPLAIN_COMMENTS &#92;
   -DHAVE_USLEEP -DHAVE_READLINE &#92;
   shell.c sqlite3.c -ldl -lm -lreadline -lncurses -o sqlite3


The key point is this:  Building the CLI consists of compiling 
together two C-language files.   The shell.c file contains the
definition of the entry point and the user input loop and the
SQLite amalgamation sqlite3.c contains the complete implementation
of the SQLite library.howtocompile.html#compiling_the_command_line_interface
/
&/“r•     7E¦'cHow To Compile SQLite4. Building The AmalgamationThe versions of the SQLite amalgamation that are supplied on the
download page are normally adequate for most users.  However, some
projects may want or need to build their own amalgamations.  A common
reason for building a custom amalgamation is in order to use certain
compile-time options to customize the SQLite library.  Recall that
the SQLite amalgamation contains a lot of C-code that is generated by
auxiliary programs and scripts.  Many of the compile-time
options effect this generated code and must be supplied to the code
generators before the amalgamation is assembled.  The set of 
compile-time options that must be passed into the code generators can
vary from one release of SQLite to the next, but at the time of this
writing (circa SQLite 3.6.20, 2009-11-04) the set of options that must
be known by the code generators includes:


SQLITE_ENABLE_UPDATE_DELETE_LIMIT
SQLITE_OMIT_ALTERTABLE
SQLITE_OMIT_ANALYZE
SQLITE_OMIT_ATTACH
SQLITE_OMIT_AUTOINCREMENT
SQLITE_OMIT_CAST
SQLITE_OMIT_COMPOUND_SELECT
SQLITE_OMIT_EXPLAIN
SQLITE_OMIT_FOREIGN_KEY
SQLITE_OMIT_PRAGMA
SQLITE_OMIT_REINDEX
SQLITE_OMIT_SUBQUERY
SQLITE_OMIT_TEMPDB
SQLITE_OMIT_TRIGGER
SQLITE_OMIT_VACUUM
SQLITE_OMIT_VIEW
SQLITE_OMIT_VIRTUALTABLE


To build a custom amalgamation, first download the original individual
source files onto a unix or unix-like development platform.  
Be sure to get the original source
files not the "preprocessed source files".  One can obtain the complete
set of original source files either from the download page or directly
from the configuration management system.

Suppose the SQLite source tree is stored in a directory named "sqlite".
Plan to construct the amalgamation in a parallel directory named (for
example) "bld".  First construct an appropriate Makefile by either
running the configure script at the top of the SQLite source tree, or by
making a copy of one of the template Makefiles at the top of the source tree.
Then hand edit this Makefile to include the desired compile-time options.
Finally run:


make sqlite3.c


Or on Windows with MSVC:


nmake /f Makefile.msc sqlite3.c


The "sqlite3.c" make target will automatically construct the regular
"sqlite3.c" amalgamation source file, its header file
"sqlite3.h", and the "tclsqlite3.c" amalgamation source
file that includes the TCL interface.
Afterwards, the needed files can be copied into project directories and
compiled according to the procedures outlined above.howtocompile.html#building_the_amalgamation‹U•    7I•egHow To Compile SQLite3. Compiling The TCL InterfaceThe TCL interface for SQLite is a small module that is added into
the regular amalgamation.  The result is a new amalgamated source
file called "tclsqlite3.c".  This single source file is all that
is needed to generate a shared library that can be loaded into a
standard 
tclsh or 
wish using the 
TCL load command, or to generate a
standalone tclsh that comes with SQLite built in.
A copy of the tcl amalgamation
is included on the download page as a file in the TEA tarball.

To generate a TCL-loadable library for SQLite on Linux, the following
command will suffice:


gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl


Building shared libraries for Mac OS X and Windows is not nearly so simple,
unfortunately.  For those platforms it is best to use the configure script
and makefile that is included with the TEA tarball.

To generate a standalone tclsh that is statically linked with SQLite,
use this compiler invocation:


gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm


The trick here is the -DTCLSH=1 option.  The TCL interface module for
SQLite includes a main() procedure that initializes a TCL interpreter
and enters a command-line loop when it is compiled with -DTCLSH=1.  The
command above works on both Linux and Mac OS X, though one may need to adjust
the library options depending on the platform and which version of TCL one
is linking against.howtocompile.html#compiling_the_tcl_interface
,
,ƒY•žb   IM…YeTemporary Files Used By SQLite2. Nine Kinds Of Temporary FilesSQLite currently uses nine distinct types of temporary files:



Rollback journals
Super-journals
Write-ahead Log (WAL) files
Shared-memory files
Statement journals
TEMP databases
Materializations of views and subqueries
Transient indices
Transient databases used by VACUUM



Additional information about each of these temporary file types
is in the sequel.tempfiles.html#nine_kinds_of_temporary_filesŠ•ža      I+“  CTemporary Files Used By SQLite1. IntroductionOne of the distinctive features of
SQLite is that a database consists of a single disk file.
This simplifies the use of SQLite since moving or backing up a
database is a simple as copying a single file.  It also makes
SQLite appropriate for use as an
application file format.
But while a complete database is held in a single disk file,
SQLite does make use of many temporary files during the
course of processing a database.



This article describes the various temporary files that SQLite
creates and uses.  It describes when the files are created, when
they are deleted, what they are used for, why they are important,
and how to avoid them on systems where creating temporary files is
expensive.



The manner in which SQLite uses temporary files is not considered
part of the contract that SQLite makes with applications.  The
information in this document is a correct description of how
SQLite operates at the time that this document was written or last
updated.  But there is no guarantee that future versions of SQLite
will use temporary files in the same way.  New kinds of temporary
files might be employed  and some of
the current temporary file uses might be discontinued
in future releases of SQLite.tempfiles.html#introduction]•   7?ž  ]How To Compile SQLite5. Building A Windows DLLTo build a DLL of SQLite for use in Windows, first acquire the
appropriate amalgamated source code files, sqlite3.c and sqlite3.h.  
These can either
be downloaded from the SQLite website
or custom generated from sources as shown above.

With source code files in the working directory, a DLL
can be generated using MSVC with the following command:


cl sqlite3.c -link -dll -out:sqlite3.dll


The above command should be run from the MSVC Native Tools Command
Prompt.  If you have MSVC installed on your machine, you probably
have multiple versions of this Command Prompt, for native builds
for x86 and x64, and possibly also for cross-compiling to ARM.
Use the appropriate Command Prompt depending on the desired DLL.

If using the MinGW compiler, the command-line is this:


gcc -shared sqlite3.c -o sqlite3.dll


Note that MinGW generates 32-bit DLLs only.  There is a separate
MinGW64 project that can be used to generate 64-bit DLLs.  Presumably
the command-line syntax is similar.
Also note that recent versions of MSVC generate DLLs that will not work
on WinXP and earlier versions of Windows.  So for maximum compatibility
of your generated DLL, MinGW is recommended.  A good rule-of-thumb
is to generate 32-bit DLLs using MinGW and 64-bit DLLs using MSVC.

In most cases, you will want to supplement the basic commands above with
compile-time options appropriate for your application.  Commonly used
compile-time options include:


-Os - Optimize for size. 
Make the DLL as small as possible.

-O2 - Optimize for speed.  This will make the DLL larger by
unrolling loops and inlining functions.

-DSQLITE_ENABLE_FTS4 -
Include the full-text search engine code in SQLite.

-DSQLITE_ENABLE_RTREE - Include the R-Tree extension.

-DSQLITE_ENABLE_COLUMN_METADATA -
This enables some extra APIs that are required by some common systems,
including Ruby-on-Rails.

This page last modified on  2021-10-12 03:48:52 UTChowtocompile.html#building_a_windows_dll
ÌÌœ/•žc   I9·1MTemporary Files Used By SQLite2.1. Rollback JournalsA rollback journal is a temporary file used to implement
atomic commit and rollback capabilities in SQLite.
(For a detailed discussion of how this works, see
the separate document titled
Atomic Commit In SQLite.)
The rollback journal is always located in the same directory
as the database file and has the same name as the database
file except with the 8 characters "-journal" appended.
The rollback journal is usually created when a transaction
is first started and is usually deleted when a transaction
commits or rolls back.
The rollback journal file is essential for implementing the
atomic commit and rollback capabilities of SQLite.  Without
a rollback journal, SQLite would be unable to rollback an
incomplete transaction, and if a crash or power loss occurred
in the middle of a transaction the entire database would likely
go corrupt without a rollback journal.



The rollback journal is usually created and destroyed at the
start and end of a transaction, respectively.  But there are exceptions
to this rule.



If a crash or power loss occurs in the middle of a transaction,
then the rollback journal file is left on disk.  The next time
another application attempts to open the database file, it notices
the presence of the abandoned rollback journal (we call it a "hot
journal" in this circumstance) and uses the information in the
journal to restore the database to its state prior to the start
of the incomplete transaction.  This is how SQLite implements
atomic commit.



If an application puts SQLite in 
exclusive locking mode using
the pragma:



PRAGMA locking_mode=EXCLUSIVE;



SQLite creates a new rollback journal at the start of the first
transaction within an exclusive locking mode session.  But at the
conclusion of the transaction, it does not delete the rollback
journal.  The rollback journal might be truncated, or its header
might be zeroed (depending on what version of SQLite you are using)
but the rollback journal is not deleted.  The rollback journal is
not deleted until exclusive access mode is exited.


Rollback journal creation and deletion is also changed by the
journal_mode pragma.
The default journaling mode is DELETE, which is the default behavior
of deleting the rollback journal file at the end of each transaction,
as described above.  The PERSIST journal mode foregoes the deletion of
the journal file and instead overwrites the rollback journal header
with zeros, which prevents other processes from rolling back the
journal and thus has the same effect as deleting the journal file, though
without the expense of actually removing the file from disk.  In other
words, journal mode PERSIST exhibits the same behavior as is seen
in EXCLUSIVE locking mode. The
OFF journal mode causes SQLite to omit the rollback journal, completely.
In other words, no rollback journal is ever written if journal mode is
set to OFF.
The OFF journal mode disables the atomic
commit and rollback capabilities of SQLite.  The ROLLBACK command
is not available when OFF journal mode is set.  And if a crash or power
loss occurs in the middle of a transaction that uses the OFF journal
mode, no recovery is possible and the database file will likely
go corrupt.
The MEMORY journal mode causes the rollback journal to be stored in
memory rather than on disk.  The ROLLBACK command still works when
the journal mode is MEMORY, but because no file exists on disks for
recovery, a crash or power loss in the middle of a transaction that uses
the MEMORY journal mode will likely result in a corrupt database.tempfiles.html#rollback_journals
…Ñ…ŒG•že  I=—YQTemporary Files Used By SQLite2.3. Shared-Memory FilesWhen operating in WAL mode, all SQLite database connections associated
with the same database file need to share some memory that is used as an
index for the WAL file.  In most implementations, this shared memory is
implemented by calling mmap() on a file created for this sole purpose:
the shared-memory file.  The shared-memory file, if it exists, is located
in the same directory as the database file and has the same name as the
database file except with the 4 characters "-shm" appended.
Shared memory files only exist while running in WAL mode.



The shared-memory file contains no persistent content.  The only purpose
of the shared-memory file is to provide a block of shared memory for use
by multiple processes all accessing the same database in WAL mode.
If the VFS is able to provide an alternative method for accessing shared
memory, then that alternative method might be used rather than the
shared-memory file.  For example, if PRAGMA locking_mode is set to
EXCLUSIVE (meaning that only one process is able to access the database
file) then the shared memory will be allocated from heap rather than out
of the shared-memory file, and the shared-memory file will never be
created.



The shared-memory file has the same lifetime as its associated WAL file.
The shared-memory file is created when the WAL file is created and is
deleted when the WAL file is deleted.  During WAL file recovery, the
shared memory file is recreated from scratch based on the contents of
the WAL file being recovered.tempfiles.html#shared_memory_files†*•žd    IM‹]Temporary Files Used By SQLite2.2. Write-Ahead Log (WAL) FilesA write-ahead log or WAL file is used in place of a rollback journal
when SQLite is operating in WAL mode.  As with the rollback journal,
the purpose of the WAL file is to implement atomic commit and rollback.
The WAL file is always located in the same directory
as the database file and has the same name as the database
file except with the 4 characters "-wal" appended.
The WAL file is created when the first connection to the
database is opened and is normally removed when the last
connection to the database closes.  However, if the last connection
does not shutdown cleanly, the WAL file will remain in the filesystem
and will be automatically cleaned up the next time the database is
opened.tempfiles.html#write_ahead_log_wal_files
’1’•žg  IE˜oYTemporary Files Used By SQLite2.5. Statement Journal FilesA statement journal file is used to rollback partial results of
a single statement within a larger transaction.  For example, suppose
an UPDATE statement will attempt to modify 100 rows in the database.
But after modifying the first 50 rows, the UPDATE hits
a constraint violation which should block the entire statement.
The statement journal is used to undo the first 50 row changes
so that the database is restored to the state it was in at the start
of the statement.



A statement journal is only created for an UPDATE or INSERT statement
that might change multiple rows of a database and which might hit a
constraint or a RAISE exception within a trigger and thus need to
undo partial results.
If the UPDATE or INSERT is not contained within BEGIN...COMMIT and if
there are no other active statements on the same database connection then
no statement journal is created since the ordinary
rollback journal can be used instead.
The statement journal is also omitted if an alternative
conflict resolution algorithm is
used.  For example:



UPDATE OR FAIL ...
UPDATE OR IGNORE ...
UPDATE OR REPLACE ...
UPDATE OR ROLLBACK ...
INSERT OR FAIL ...
INSERT OR IGNORE ...
INSERT OR REPLACE ...
INSERT OR ROLLBACK ...
REPLACE INTO ....



The statement journal is given a randomized name, not necessarily
in the same directory as the main database, and is automatically
deleted at the conclusion of the transaction.  The size of the
statement journal is proportional to the size of the change implemented
by the UPDATE or INSERT statement that caused the statement journal
to be created.tempfiles.html#statement_journal_files‘J•žf       I=¡_QTemporary Files Used By SQLite2.4. Super-Journal FilesThe super-journal file is used as part of the atomic commit
process when a single transaction makes changes to multiple
databases that have been added to a single database connection
using the ATTACH statement.  The super-journal file is always
located in the same directory as the main database file
(the main database file is the database that is identified
in the original sqlite3_open(), sqlite3_open16(), or
sqlite3_open_v2() call that created the database connection)
with a randomized suffix.  The super-journal file contains
the names of all of the various attached auxiliary databases
that were changed during the transaction.  The multi-database
transaction commits when the super-journal file is deleted.
See the documentation titled
Atomic Commit In SQLite for
additional detail.



Without the super-journal, the transaction commit on a multi-database
transaction would be atomic for each database individually, but it
would not be atomic across all databases.  In other words, if the
commit were interrupted in the middle by a crash or power loss, then
the changes to one of the databases might complete while the changes
to another database might roll back.  The super-journal causes all
changes in all databases to either rollback or commit together.



The super-journal file is only created for COMMIT operations that
involve multiple database files where at least two of the databases 
meet all of the following requirements:


The database is modified by the transaction
The PRAGMA synchronous setting is not OFF
The PRAGMA journal_mode is not OFF, MEMORY, or WAL



This means that SQLite transactions are not atomic
across multiple database files on a power-loss when the database 
files have synchronous turned off or when they are using journal 
modes of OFF, MEMORY, or WAL.  For synchronous OFF and for
journal_modes OFF and MEMORY, database will usually corrupt if
a transaction commit is interrupted by a power loss.  For 
WAL mode, individual database files are updated atomically
across a power-loss, but in the case of a multi-file transactions,
some files might rollback while others roll forward after
power is restored.tempfiles.html#super_journal_files

þ
þ‰}•žh I3’YGTemporary Files Used By SQLite2.6. TEMP DatabasesTables created using the "CREATE TEMP TABLE" syntax are only
visible to the database connection in which the "CREATE TEMP TABLE"
statement is originally evaluated.  These TEMP tables, together
with any associated indices, triggers, and views, are collectively
stored in a separate temporary database file that is created as
soon as the first "CREATE TEMP TABLE" statement is seen.
This separate temporary database file also has an associated
rollback journal.
The temporary database file used to store TEMP tables is deleted
automatically when the database connection is closed
using sqlite3_close().



The TEMP database file is very similar to auxiliary database
files added using the ATTACH statement, though with a few
special properties.
The TEMP database is always automatically deleted when the
database connection is closed.
The TEMP database always uses the
synchronous=OFF and journal_mode=PERSIST
PRAGMA settings.
And, the TEMP database cannot be used with DETACH nor can
another process ATTACH the TEMP database.



The temporary files associated with the TEMP database and its
rollback journal are only created if the application makes use
of the "CREATE TEMP TABLE" statement.tempfiles.html#temp_databases
II™2•ži       Ig°[{Temporary Files Used By SQLite2.7. Materializations Of Views And SubqueriesQueries that contain subqueries must sometime evaluate
the subqueries separately and store the results in a temporary
table, then use the content of the temporary table to evaluate
the outer query.
We call this "materializing" the subquery.
The query optimizer in SQLite attempts to avoid materializing,
but sometimes it is not easily avoidable.
The temporary tables created by materialization are each stored
in their own separate temporary file, which is automatically
deleted at the conclusion of the query.
The size of these temporary tables depends on the amount of
data in the materialization of the subquery, of course.



A subquery on the right-hand side of IN operator must often
be materialized.  For example:



SELECT * FROM ex1 WHERE ex1.a IN (SELECT b FROM ex2);



In the query above, the subquery "SELECT b FROM ex2" is evaluated
and its results are stored in a temporary table (actually a temporary
index) that allows one to determine whether or not a value ex2.b
exists using a simple binary search.  Once this table is constructed,
the outer query is run and for each prospective result row a check
is made to see if ex1.a is contained within the temporary table.
The row is output only if the check is true.



To avoid creating the temporary table, the query might be rewritten
as follows:



SELECT * FROM ex1 WHERE EXISTS(SELECT 1 FROM ex2 WHERE ex2.b=ex1.a);



Recent versions of SQLite (version 3.5.4 2007-12-14) and later)
will do this rewrite automatically
if an index exists on the column ex2.b.



If the right-hand side of an IN operator can be list of values
as in the following:


SELECT * FROM ex1 WHERE a IN (1,2,3);


List values on the right-hand side of IN are treated as a 
subquery that must be materialized.  In other words, the
previous statement acts as if it were:


SELECT * FROM ex1 WHERE a IN (SELECT 1 UNION ALL
                              SELECT 2 UNION ALL
                              SELECT 3);


A temporary index is always used to hold the values of the
right-hand side of an IN operator when that right-hand side
is a list of values.



Subqueries might also need to be materialized when they appear
in the FROM clause of a SELECT statement.  For example:



SELECT * FROM ex1 JOIN (SELECT b FROM ex2) AS t ON t.b=ex1.a;



Depending on the query, SQLite might need to materialize the 
"(SELECT b FROM ex2)" subquery into a temporary table, then
perform the join between ex1 and the temporary table.  The
query optimizer tries to avoid this by "flattening" the
query.  In the previous example the query can be flattened,
and SQLite will automatically transform the query into



SELECT ex1.*, ex2.b FROM ex1 JOIN ex2 ON ex2.b=ex1.a;



More complex queries may or may not be able to employ query
flattening to avoid the temporary table.  Whether or not
the query can be flattened depends on such factors as whether
or not the subquery or outer query contain aggregate functions,
ORDER BY or GROUP BY clauses, LIMIT clauses, and so forth.
The rules for when a query can and cannot be flattened are
very complex and are beyond the scope of this document.tempfiles.html#materializations_of_views_and_subqueries
F„%•žk        IY†[oTemporary Files Used By SQLite2.9. Transient Database Used By VACUUMThe VACUUM command works by creating a temporary file
and then rebuilding the entire database into that temporary
file.  Then the content of the temporary file is copied back
into the original database file and the temporary file is
deleted.



The temporary file created by the VACUUM command exists only
for the duration of the command itself.  The size of the temporary
file will be no larger than the original database.tempfiles.html#transient_database_used_by_vacuum_—5•žj        I9-=MTemporary Files Used By SQLite2.8. Transient IndicesSQLite may make use of transient indices to
implement SQL language features such as:



An ORDER BY or GROUP BY clause
The DISTINCT keyword in an aggregate query
Compound SELECT statements joined by UNION, EXCEPT, or INTERSECT



Each transient index is stored in its own temporary file.
The temporary file for a transient index is automatically deleted
at the end of the statement that uses it.



SQLite strives to implement ORDER BY clauses using a preexisting
index.  If an appropriate index already exists, SQLite will walk
the index, rather than the underlying table, to extract the 
requested information, and thus cause the rows to come out in
the desired order.  But if SQLite cannot find an appropriate index
it will evaluate the query and store each row in a transient index
whose data is the row data and whose key is the ORDER BY terms.
After the query is evaluated, SQLite goes back and walks the
transient index from beginning to end in order to output the
rows in the desired order.



SQLite implements GROUP BY by ordering the output rows in the
order suggested by the GROUP BY terms.  Each output row is
compared to the previous to see if it starts a new "group".
The ordering by GROUP BY terms is done in exactly the same way
as the ordering by ORDER BY terms.  A preexisting index is used
if possible, but if no suitable index is available, a transient
index is created.



The DISTINCT keyword on an aggregate query is implemented by
creating a transient index in a temporary file and storing
each result row in that index.  As new result rows are computed
a check is made to see if they already exist in the transient
index and if they do the new result row is discarded.



The UNION operator for compound queries is implemented by creating
a transient index in a temporary file and storing the results
of the left and right subquery in the transient index, discarding
duplicates.  After both subqueries have been evaluated, the
transient index is walked from beginning to end to generate the final output.



The EXCEPT operator for compound queries is implemented by creating
a transient index in a temporary file, storing the results of the
left subquery in this transient index, then removing the result 
from right subquery from the transient index, and finally walking
the index from beginning to end to obtain the final output.



The INTERSECT operator for compound queries is implemented by
creating two separate transient indices, each in a separate
temporary file.  The left and right subqueries are evaluated
each into a separate transient index.  Then the two indices
are walked together and entries that appear in both indices
are output.



Note that the UNION ALL operator for compound queries does not
use transient indices by itself (though of course the right
and left subqueries of the UNION ALL might use transient indices
depending on how they are composed.)tempfiles.html#transient_indices
,,•O•žlI¨YTemporary Files Used By SQLite3. The SQLITE_TEMP_STORE Compile-Time Parameter and PragmaThe temporary files associated with transaction control, namely
the rollback journal, super-journal, write-ahead log (WAL) files,
and shared-memory files, are always written to disk.
But the other kinds of temporary files might be stored in memory
only and never written to disk.
Whether or not temporary files other than the rollback,
super, and statement journals are written to disk or stored only in memory
depends on the SQLITE_TEMP_STORE compile-time parameter, the
temp_store pragma,
and on the size of the temporary file.



The SQLITE_TEMP_STORE compile-time parameter is a #define whose value is
an integer between 0 and 3, inclusive.  The meaning of the
SQLITE_TEMP_STORE compile-time parameter is as follows:




Temporary files are always stored on disk regardless of the setting
of the temp_store pragma.


Temporary files are stored on disk by default but this can be
overridden by the temp_store pragma.


Temporary files are stored in memory by default but this can be
overridden by the temp_store pragma.


Temporary files are always stored in memory regardless of the setting
of the temp_store pragma.




The default value of the SQLITE_TEMP_STORE compile-time parameter is 1,
which means to store temporary files on disk but provide the option
of overriding the behavior using the temp_store pragma.



The temp_store pragma has
an integer value which also influences the decision of where to store
temporary files.  The values of the temp_store pragma have the
following meanings:




Use either disk or memory storage for temporary files as determined
by the SQLITE_TEMP_STORE compile-time parameter.


If the SQLITE_TEMP_STORE compile-time parameter specifies memory storage for
temporary files, then override that decision and use disk storage instead.
Otherwise follow the recommendation of the SQLITE_TEMP_STORE compile-time
parameter.


If the SQLITE_TEMP_STORE compile-time parameter specifies disk storage for
temporary files, then override that decision and use memory storage instead.
Otherwise follow the recommendation of the SQLITE_TEMP_STORE compile-time
parameter.




The default setting for the temp_store pragma is 0,
which means to following the recommendation of SQLITE_TEMP_STORE compile-time
parameter.



To reiterate, the SQLITE_TEMP_STORE compile-time parameter and the 
temp_store pragma only
influence the temporary files other than the rollback journal
and the super-journal.  The rollback journal and the
super-journal are always written to disk regardless of the settings of
the SQLITE_TEMP_STORE compile-time parameter and the
temp_store pragma.tempfiles.html#the_sqlite_temp_store_compile_time_parameter_and_pragma

/"~•¦I   M+‚o7The SQLite OS Interface or "VFS"1. IntroductionThis article describes the SQLite OS portability layer or "VFS" - the
module at the bottom of the SQLite implementation stack
that provides portability across operating systems.vfs.html#introduction•žn     IS’+kTemporary Files Used By SQLite5. Temporary File Storage LocationsThe directory or folder in which temporary files are created is
determined by the OS-specific VFS.


On unix-like systems, directories are searched in the following order:

The directory set by PRAGMA temp_store_directory or by the
    sqlite3_temp_directory global variable
The SQLITE_TMPDIR environment variable
The TMPDIR environment variable
/var/tmp
/usr/tmp
/tmp
The current working directory (".")

The first of the above that is found to exist and have the write and
execute bits set is used.  The final "." fallback is important for some
applications that use SQLite inside of chroot jails that do not have
the standard temporary file locations available.


On Windows systems, folders are searched in the following order:

The folder set by PRAGMA temp_store_directory or by the
    sqlite3_temp_directory global variable
The folder returned by the GetTempPath() system interface.

SQLite itself does not pay any attention to environment variables
in this case, though presumably the GetTempPath() system call does.
The search algorithm is different for CYGWIN builds.  Check the 
source code for details.
This page last modified on  2020-08-16 11:16:26 UTCtempfiles.html#temporary_file_storage_locations‹L•žm IW•+oTemporary Files Used By SQLite4. Other Temporary File OptimizationsSQLite uses a page cache of recently read and written database
pages.  This page cache is used not just for the main database
file but also for transient indices and tables stored in temporary
files.  If SQLite needs to use a temporary index or table and
the SQLITE_TEMP_STORE compile-time parameter and the
temp_store pragma are
set to store temporary tables and index on disk, the information
is still initially stored in memory in the page cache.  The 
temporary file is not opened and the information is not truly
written to disk until the page cache is full.



This means that for many common cases where the temporary tables
and indices are small (small enough to fit into the page cache)
no temporary files are created and no disk I/O occurs.  Only
when the temporary data becomes too large to fit in RAM does
the information spill to disk.



Each temporary table and index is given its own page cache
which can store a maximum number of database pages determined
by the SQLITE_DEFAULT_TEMP_CACHE_SIZE compile-time parameter.
(The default value is 500 pages.)
The maximum number of database pages in the page cache is the
same for every temporary table and index.  The value cannot
be changed at run-time or on a per-table or per-index basis.
Each temporary file gets its own private page cache with its
own SQLITE_DEFAULT_TEMP_CACHE_SIZE page limit.tempfiles.html#other_temporary_file_optimizations
ò ^óò‹|•¦L  M=–KEThe SQLite OS Interface or "VFS"3.1. Standard Unix VFSesUnix builds come with multiple built-in VFSes.  The default VFS
for unix is called "unix" and is used in most applications.
Other VFSes that might be found in unix (depending on compile-time
options) include:



unix-dotfile - uses dot-file locking rather than
          POSIX advisory locks.
unix-excl - obtains and holds an exclusive lock on
          database files, preventing other processes from accessing the
          database.  Also keeps the wal-index in heap rather than in
          shared memory.
unix-none - all file locking operations are no-ops.
unix-namedsem - uses named semaphores for file locking.
       VXWorks only.



The various unix VFSes differ only in the way they handle file locking -
they share most of their implementation in common with one another and
are all located in the same SQLite source file:  
os_unix.c.
Note that except for "unix" and "unix-excl", the various unix VFSes all
use incompatible locking implementations.  If two processes are accessing
the same SQLite database using different unix VFSes, they may
not see each others locks and may end up interfering with one another,
resulting in database corruption.  The "unix-none" VFS in particular
does no locking at all and will easily result in database corruption if
used by two or more database connections at the same time.
Programmers are encouraged to use only "unix" or "unix-excl" unless
there is a compelling reason to do otherwise.vfs.html#standard_unix_vfses„f•¦K  M/ˆ7;The SQLite OS Interface or "VFS"3. Multiple VFSesThe standard SQLite source tree contains built-in VFSes for unix
and windows.  Alternative VFSes can be
added at start-time or run-time using the
sqlite3_vfs_register() interface.



Multiple VFSes can be registered at the same time.
Each VFS has a unique names.
Separate database connections within the same process can be using
different VFSes at the same time.   For that matter, if a single
database connection has multiple database files open using
the ATTACH command, then each attached database might be using a
different VFS.vfs.html#multiple_vfses•¦J      Me˜9qThe SQLite OS Interface or "VFS"2. The VFS In Relation To The Rest Of SQLiteThe internal organization of the SQLite library can be viewed as the
stack of modules shown to the right.
The Tokenizer, Parser, and Code Generator components are used to
process SQL statements and convert them into executable programs 
in a virtual machine language or byte code.
Roughly speaking, these top three layers implement
sqlite3_prepare_v2().  The byte code generated by the top three
layers is a prepared statement.
The Virtual Machine module is responsible for running the SQL statement 
byte code. The B-Tree module organizes a database file into multiple 
key/value stores with ordered keys and logarithmic performance. 
The Pager module is responsible for loading pages of the database
file into memory, for implementing and controlling transactions, and 
for creating and maintaining the journal files that prevent database 
corruption following a crash or power failure. 
The OS Interface is a thin abstraction that provides a common set of 
routines for adapting SQLite to run on different operating systems.
Roughly speaking, the bottom four layers implement
sqlite3_step().



This article is about the bottom layer.


The OS Interface - also called the "VFS" - is what makes SQLite 
portable across operating systems.  Whenever any of the other modules
in SQLite needs to communicate with the operating
system, they invoke methods in the VFS.  The VFS then invokes the
operating-specific code needed to satisfy the request.
Hence, porting SQLite to a new
operating system is simply a matter of writing a new OS interface layer
or "VFS".vfs.html#the_vfs_in_relation_to_the_rest_of_sqlite
V
V„B•¦O        M)‡1The SQLite OS Interface or "VFS"3.4. VFS ShimsFrom the point of view of the uppers layers of the SQLite stack, each
open database file uses exactly one VFS.
But in practice, a particular VFS might
just be a thin wrapper around another VFS that does the real work.
We call a wrapper VFS a "shim".



A simple example of a shim is the "vfstrace" VFS.  This is a VFS
(implemented in the 
test_vfstrace.c
source file) that writes a message associated with each VFS method call
into a log file, then passes control off to another VFS to do the actual
work.vfs.html#vfs_shimsŠx•¦N    MM”#UThe SQLite OS Interface or "VFS"3.3. Specifying Which VFS To UseThere is always one VFS which is the default VFS.  On unix systems,
the "unix" VFS comes up as the default and on windows it is "win32".
If no other actions are taken, new database connections will make use
of the default VFS.



The default VFS can be changed by registering or re-registering the
VFS using the sqlite3_vfs_register() interface with a second parameter
of 1.  Hence, if a (unix) process wants to always use the "unix-nolock" VFS 
in place of "unix", the following code would work:



sqlite3_vfs_register(sqlite3_vfs_find("unix-nolock"), 1);



An alternate VFS can also be specified as the 4th parameter to the
sqlite3_open_v2() function.  For example:



int rc = sqlite3_open_v2("demo.db", &db, SQLITE_OPEN_READWRITE, "unix-nolock");



Finally, if URI filenames have been enabled, then the alternative
VFS can be specified using the "vfs=" parameter on the URI.  This technique
works with sqlite3_open(), sqlite3_open16(), sqlite3_open_v2(), and
when a new database is ATTACH-ed to an existing database connection.
For example:



ATTACH 'file:demo2.db?vfs=unix-none' AS demo2;



The VFS specified by a URI has the highest priority.  After that comes
a VFS specified as the fourth argument to sqlite3_open_v2().  The
default VFS is used if no VFS is specified otherwise.vfs.html#specifying_which_vfs_to_use…a•¦M  MCŠ  KThe SQLite OS Interface or "VFS"3.2. Standard Windows VFSesWindows builds also come with multiple built-in VFSes.  The default
Windows VFS is called "win32" and is used in most applications.
Other VFSes that might be found on windows builds include:



win32-longpath - like "win32" except that pathnames can
          be up to 65534 bytes in length, whereas pathnames max out at
          1040 bytes in "win32".
win32-none - all file locking operations are no-ops.
win32-longpath-none - combination of "win32-longpath"
          and "win32-none" - long pathnames are supported and all lock
          operations are no-ops.


As with unix, most of the code for the various Windows VFSes is shared.vfs.html#standard_windows_vfses
¨¨žS•¦P     M=»yEThe SQLite OS Interface or "VFS"3.5. Other Example VFSesThe following are other VFS implementations available in the public
SQLite source tree:




appendvfs.c -
This VFS allows an SQLite database to be appended to the end of some
other file.  This can be used, for example, to append an SQLite database
onto the end of an executable such that, when run, it can easily
locate the appended database. The command-line shell will use this
VFS if launched with the --append option, and its .archive command
will use it given the --append flag.


test_demovfs.c - 
This file implements a very simple VFS named "demo" that uses POSIX 
functions such as
open(), read(), write(), fsync(), close(), fsync(), sleep(), time(),
and so forth.  This VFS only works on unix systems.  But it is not
intended as a replacement for the standard "unix" VFS used by default
on unix platforms.  The "demo" VFS is deliberately kept very simple
so that it can be used as a learning aid or as template for building
other VFSes or for porting SQLite to new operating systems.


test_quota.c - 
This file implements a shim called "quota" that enforces cumulative
file size limits on a collection of database files.  An auxiliary
interface is used to define "quota groups".  A quota group is a
set of files (database files, journals, and temporary files) whose
names all match a GLOB pattern.  The sum of the sizes of all files
in each quota group is tracked, and if that sum exceeds a threshold
defined for the quota group, a callback function is invoked.  That
callback can either increase the threshold or cause the operation
that would have exceeded the quota to fail with an 
SQLITE_FULL error.  One of the uses of this shim is used to enforce 
resource limits on application databases in Firefox.


test_multiplex.c - 
This file implements a shim that allows database files to exceed the
maximum file size of the underlying filesystem.  This shim presents
an interface to the upper six layers of SQLite that makes it look like
very large files are being used, when in reality each such large file
is split up into many smaller files on the underlying system.
This shim has been used, for example, to allow databases to grow
larger than 2 gibibytes on FAT16 filesystems.


test_onefile.c - 
This file implements a demonstration VFS named "fs" that shows how SQLite 
can be used on an embedded device that lacks a filesystem.  Content is
written directly to the underlying media.  A VFS derived from this
demonstration code could be used by a gadget with a limited amount of
flash memory to make SQLite behave as the filesystem for the flash memory
on the device.


test_journal.c - 
This file implements a shim used during SQLite testing that verifies that
the database and rollback journal are written in the correct order and
are "synced" at appropriate times in order to guarantee that the database
can recover from a power lose are hard reset at any time.  The shim
checks several invariants on the operation of databases and rollback
journals and raises exceptions if any of those invariants are violated.
These invariants, in turn, assure that the database is always recoverable.
Running a large suite of test cases using this shim provides added
assurance that SQLite databases will not be damaged by unexpected
power failures or device resets.


test_vfs.c - 
This file implements a shim that can be used to simulate filesystem faults.
This shim is used during testing to verify that SQLite responses sanely
to hardware malfunctions or to other error conditions such as running out
of filesystem space that are difficult to test on a real system.



There are other VFS implementations both in the core SQLite source code
library and in available extensions.  The list above is not meant to be
exhaustive but merely representative of the kinds of features that can
be realized using the VFS interface.vfs.html#other_example_vfses
mŒmŒ•¶       G]–GkThe Use Of assert() In SQLite1. Assert() And Similar Macros In SQLiteThe assert(X) macro is 
part of standard C, in the
&lt;assert.h&gt; header file.
SQLite adds three other assert()-like macros named NEVER(X), ALWAYS(X),
and testcase(X).


assert(X) &rarr;
The assert(X) statement indicates that the condition X is always true.
In other words, X is an invariant.  The assert(X) macro works like a
procedure in that it has no return value.

ALWAYS(X) &rarr;
The ALWAYS(X) function indicates that condition X is always true as far
as the developers know, but there is no proof the X is true, or the
proof is complex and error-prone, or the proof depends on implementation
details that are likely to change in the future.  ALWAYS(X) behaves like
a function that returns the boolean value X, and is intended to be used
within the conditional of an "if" statement.

NEVER(X) &rarr;
The NEVER(X) function indicates that condition X is never true.  This
is the negative analog of the ALWAYS(X) function.

testcase(X) &rarr;
The testcase(X) statement indicates that X is sometimes true and sometimes
false.  In other words, testcase(X) indicates that X is definitely not an
invariant.  Since SQLite uses 100% MC/DC testing, the presence of a
testcase(X) macro indicates that not only is it possible for X to be either
true or false, but there are test cases to demonstrate this.



SQLite version 3.22.0 (2018-01-22) contains 5290 assert() macros,
839 testcase() macros, 88 ALWAYS() macros, and 63 NEVER() macros.assert.html#assert_and_similar_macros_in_sqliteŽo•¦Q   M9œ5EThe SQLite OS Interface or "VFS"4. VFS ImplementationsA new VFS is implemented by subclassing three objects:



sqlite3_vfs
sqlite3_io_methods
sqlite3_file



An sqlite3_vfs object defines the name of the VFS and the core
methods that implement the interface to the operating system, such
as checking for existence of files, deleting files, creating files
and opening and for reading and/or writing, converting filenames
into their canonical form.  The sqlite3_vfs object also contains
methods for obtaining randomness from the operating system, for
suspending a process (sleeping) and for finding the current date and
time.



The sqlite3_file object represents an open file.
The xOpen method of sqlite3_vfs constructs an sqlite3_file
object when the file is opened.  The sqlite3_file keeps track
of the state of the file while it is opened.



The sqlite3_io_methods object holds the methods used to interact
with an open file.  Each sqlite3_file contains a pointer to 
an sqlite3_io_methods object that is appropriate for the file it
represents.  The sqlite3_io_methods object contains methods to do
things such as read and write from the file, to truncate the file,
to flush any changes to persistent storage, to find the size of the
file, to lock and unlock the file, and to close file and destroy
the sqlite3_file object.



Writing the code for a new VFS involves constructing a subclass for
the sqlite3_vfs object and then registering that VFS object using
a call to sqlite3_vfs_register().  The VFS implementation also
provides subclasses for sqlite3_file and sqlite3_io_methods but
those objects are not registered directly with SQLite.  Instead, the
sqlite3_file object is returned from the xOpen method of
sqlite3_vfs and the sqlite3_file object points to an instance
of the sqlite3_io_methods object.

This page last modified on  2021-12-06 01:48:47 UTCvfs.html#vfs_implementations
z•¶        GC =OThe Use Of assert() In SQLite1.1. Philosophy of assert()In SQLite, the presence of assert(X) means that the developers have
a proof that X is always true.  Readers can depend upon X being true to
help them reason about the code.  An assert(X) is a strong statement
about the truth of X.  There is no doubt.

The ALWAYS(X) and NEVER(X) macros are a weaker statement about the
truth of X.  The presence of ALWAYS(X) or NEVER(X) means that the developers
believe X is always or never true, but there is no proof, or the proof
is complex and error-prone, or the proof depends on other aspects 
of the system that seem likely to change.

Other systems sometimes use assert(X) in a way that is
similar to the use of ALWAYS(X) or NEVER(X) in SQLite.
Developers will add an assert(X) as a 
tacit acknowledgement that they
do not fully believe that X is always true.
We believe that this use of assert(X) is wrong and violates the intent
and purpose of having assert(X) available in C in the first place.
An assert(X) should not be seen as a safety-net or top-rope used to
guard against mistakes.  Nor is assert(X) appropriate for defense-in-depth.
An ALWAYS(X) or NEVER(X) macro, or something similar, should be used in 
those cases because ALWAYS(X) or NEVER(X) will be followed by code to
actually deal with the problem when the programmers reasoning
turns out to be wrong.  Since the code that follows ALWAYS(X) or NEVER(X)
is untested, it should be something very simple, like a "return" statement,
that is easily verified by inspection.


Because assert() can be and is commonly misused, some programming language
theorists and designers look upon it with disfavor.
For example, the designers of the Go programming language 
intentionally omit a built-in assert().
They feel that the harm caused by misuse of assert()
outweighs the benefits of including it as a language built-in.
The SQLite developers disagree.  In fact, the original purpose of this
article is to push back against the common notion that assert() is harmful.
In our experience, SQLite would be much more difficult to develop, test,
and maintain without assert().assert.html#philosophy_of_assert_
ŒŒo•¶     GmŸQ{The Use Of assert() In SQLite1.2. Different Behaviors According To Build TypeThree separate builds are used to validate the SQLite software.

 A functionality testing build is used to validate the source code.
 A coverage testing build is used to validate the test suite, to confirm
     that the test suite provides 100% MC/DC.
 The release build is used to validate the generated machine code.

All tests must give the same answer in all three
builds. See the "How SQLite Is Tested" document for more detail.

The various assert()-like
macros behave differently according to how SQLite is built.


Functionality TestingCoverage TestingRelease
assert(X)
abort() if X is false
no-op
no-op

ALWAYS(X)
abort() if X is false
always true
pass through the value X

NEVER(X)
abort() if X is true
always false
pass through the value X

testcase(X)
no-op
do some harmless work if X is true
no-op



The default behavior of assert(X) in standard C is that it is enabled
for release builds.  This is a reasonable default.  However, the
SQLite code base has many assert() statements in performance-sensitive
areas of the code.  Leaving assert(X) turned on causes SQLite to run about
three times slower.  Also, SQLite strives to provide 100% MC/DC in an
as-delivered configuration, which is obviously impossible if assert(X)
statements are enabled.  For these reasons, assert(X) is a no-op for
release builds in SQLite.

The ALWAYS(X) and NEVER(X) macros behave like assert(X) during
functionality testing, because the developers want to be immediately
alerted to the issue if the value of X is different from what is expected.
But for delivery, ALWAYS(X) and NEVER(X) are simple pass-through macros,
which provide defense-in-depth.  For coverage testing ALWAYS(X) and NEVER(X)
are hard-coded boolean values so that they do not cause unreachable
machine code to be generated.

The testcase(X) macro is normally a no-op, but for a coverage test
build it does generate a small amount of extra code that includes at least
one branch, in order to verify that test cases exist for which X is both
true and false.assert.html#different_behaviors_according_to_build_type
ççž•¶      G#»+5The Use Of assert() In SQLite2. ExamplesAn assert() statement is often used to validate pre-conditions on 
internal functions and methods.
Example: https://sqlite.org/src/artifact/c1e97e4c6f?ln=1048.
This is deemed better than simply stating the pre-condition in a header 
comment, since the assert() is actually executed.  In a highly tested
program like SQLite, the reader knows that the pre-condition is true
for all of the hundreds of millions of test cases run against SQLite,
since it has been verified by the assert().
In contrast, a text pre-condition statement in a header comment
is untested.  It might have been true when the code was written, 
but who is to say that it is still true now?


Sometimes SQLite uses compile-time evaluatable assert() statements.
Consider the code at
https://sqlite.org/src/artifact/c1e97e4c6f?ln=2130-2138.
Four assert() statements verify the values for compile-time constants
so that the reader can quickly check the validity of the if-statement
that follows, without having to look up the constant values in a separate
header file.


Sometimes compile-time assert() statements are used to verify that
SQLite has been correctly compiled.  For example, the code at
https://sqlite.org/src/artifact/c1e97e4c6f?ln=157
verifies that the SQLITE_PTRSIZE preprocessor macro is set correctly
for the target architecture.


The CORRUPT_DB macro is used in many assert() statements.
In functional testing builds, CORRUPT_DB references a global variable
that is true if the database file might contain corruption.  This variable
is true by default, since we do not normally know whether or not a database
is corrupt, but during testing while working on databases that are known
to be well-formed, that global variable can be set to false.
Then the CORRUPT_DB macro
can be used in assert() statements such as seen at
https://sqlite.org/src/artifact/18a53540aa3?ln=1679-1680.
Those assert()s specify pre-conditions to the routine that are true for
consistent database files, but which might be false if the database file
is corrupt. Knowledge of these kinds of conditions is very helpful to
readers who are trying to understand a block of code in isolation.


ALWAYS(X) and NEVER(X) functions are used in places where we always
want the test to occur even though the developers believe the value of
X is always true or false.  For example, the sqlite3BtreeCloseCursor()
routine shown must remove the closing cursor from a linked list of all
cursors.  We know that the cursor is on the list, so that the loop
must terminate by the "break" statement, but it is convenient to
use the ALWAYS(X) test at
https://sqlite.org/src/artifact/18a53540aa3?ln=4371 to prevent
running off the end of the linked list in case there is an error in some
other part of the code that has corrupted the linked list.


An ALWAYS(X) or NEVER(X) sometimes verifies pre-conditions that are
subject to change if other parts of the code are modified in
subtle ways.  At https://sqlite.org/src/artifact/18a53540aa3?ln=5512-5516
we have a test for two pre-conditions that are true only because
of the limited scope of use of the sqlite3BtreeRowCountEst() function.
Future enhancements to SQLite might use sqlite3BtreeRowCountEst() in
new ways where those preconditions no longer hold, and the NEVER()
macros will quickly alert the developers to that fact when the
situation arises.  But if, for some reason, the pre-conditions are
not satisfied in a release build, the program will still behave sanely
and will not do an undefined memory access.


The testcase() macro is often used to verify that boundary
cases of an inequality comparison are checked.  For example, at
https://sqlite.org/src/artifact/18a53540aa3?ln=5766.  These
kind of checks help to prevent off-by-one errors.
This page last modified on  2019-04-29 19:27:41 UTCassert.html#examples
ê
êŽ&•¾    E'›O3Uniform Resource Identifiers3. URI FormatAccording to RFC 3986, a URI consists
of a scheme, an authority, a path, a query string, and a fragment.  The
scheme is always required.  One of either the authority or the path is also
always required.  The query string and fragment are optional.



SQLite uses the "file:" URI syntax to identify database files.
SQLite strives to interpret file: URIs in exactly the same way as
popular web-browsers such as 
Firefox, 
Chrome, 
Safari, 
Internet Explorer, and
Opera,
and command-line programs such as 
Windows "start" and the Mac OS-X
"open" command.
A succinct summary of the URI parsing rules follows:



 The scheme of the URI must be "file:".  Any other scheme
     results in the input being treated as an ordinary filename.
 The authority may be omitted, may be blank, or may be
      "localhost".  Any other authority results in an error.
      Exception: If SQLite is compiled with SQLITE_ALLOW_URI_AUTHORITY
      then any authority value other than "localhost" is passed through to the 
      underlying operating system as a UNC filename.
 The path is optional if the authority is present.  If the authority
     is omitted then the path is required. 
 The query string is optional.  If the query string is present, then
      all query parameters are passed through into the xOpen method of
      the underlying VFS.  
 The fragment is optional.  If present, it is ignored.


Zero or more escape sequences of the form  "%HH" 
(where H represents any hexadecimal digit) can occur 
in the path, query string, or fragment.

A filename that is not a well-formed URI is interpreted as an
ordinary filename.

URIs are processed as UTF8 text.
The filename argument sqlite3_open16() is converted from UTF16 
native byte order into UTF8 prior to processing.uri.html#uri_formatŠ@•¾        EA“OMUniform Resource Identifiers2. Backwards CompatibilityIn order to maintain full backwards compatibility for legacy applications,
the URI filename capability is disabled by default.
URI filenames can be enabled or disabled using the SQLITE_USE_URI=1
or SQLITE_USE_URI=0 compile-time options.
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.
Regardless of the compile-time or start-time settings, URI filenames
can be enabled for individual database connections by including the
SQLITE_OPEN_URI bit in the set of bits passed as the F parameter
to sqlite3_open_v2(N,P,F,V).



If URI filenames are recognized when the database connection is originally
opened, then URI filenames will also be recognized on ATTACH statements.
Similarly, if URI filenames are not recognized when the database connection
is first opened, they will not be recognized by ATTACH.



Since SQLite always interprets any filename that does not begin
with "file:"
as an ordinary filename regardless of the URI setting, and because it is
very unusual to have an actual file begin with "file:", 
it is safe for most applications to enable URI processing even if URI 
filenames are not currently being used.uri.html#backwards_compatibility…!•¾    EA‰MUniform Resource Identifiers1. URI Filenames In SQLiteBeginning with version 3.7.7 (2011-06-23),
the SQLite database file argument to the
sqlite3_open(), sqlite3_open16(), and sqlite3_open_v2() interfaces
and to the ATTACH command can be specified
either as an ordinary filename or as a Uniform Resource Identifier or URI.
The advantage of using a URI filename is that query parameters on the URI can
be used to control details of the newly created database connection.
For example, an alternative VFS can be specified using a 
"vfs=" query parameter.
Or the database can be opened read-only by using "mode=ro" as a query
parameter.uri.html#uri_filenames_in_sqlite
ü
[üˆZ•¾      E/+7Uniform Resource Identifiers3.2. Query StringA URI filename can optionally be followed by a query string.
The query string consists of text following the first "?"
character but excluding the optional fragment that begins with
"#".  The query string is divided into key/value pairs.
We usually refer to these key/value pairs as "query parameters".
Key/value pairs are separated by a single "&amp;" character.
The key comes first and is separated from the value by a single
"=" character.
Both key and value may contain %HH escape sequences.


The text of query parameters is appended to the filename argument of
the xOpen method of the VFS.
Any %HH escape sequences in the query parameters are resolved prior to
being appended to the xOpen filename.
A single zero-byte separates the xOpen filename argument from the key of
the first query parameters, each key and value, and each subsequent key
from the prior value.
The list of query parameters appended to the xOpen filename
is terminated by a single zero-length key.
Note that the value of a query parameter can be an empty string.uri.html#query_string‹ •¾      E/•77Uniform Resource Identifiers3.1. The URI PathThe path component of the URI specifies the disk file that is the
SQLite database to be opened.  If the path component is omitted, then
the database is stored in a temporary file that will be automatically
deleted when the database connection closes.  If the authority section
is present, then the path is always an absolute pathname.  If the 
authority section is omitted, then the path is an absolute pathname if it
begins with the "/" character (ASCII code 0x2f) and is a relative
pathname otherwise.  On windows, if the absolute path begins with
"/X:/" where X is any single ASCII alphabetic
character ("a" through "z" or "A" through "Z") then the "X:"
is understood to be the drive letter of the volume containing the file,
not the toplevel directory.

An ordinary filename can usually be converted into an equivalent URI 
by the steps shown below.  The one exception is that a relative windows
pathname with a drive letter cannot be converted directly into a URI; it must
be changed into an absolute pathname first.


Convert all "?" characters into "%3f".
Convert all "#" characters into "%23".
On windows only, convert all "\" characters into "/".
Convert all sequences of two or more "/" characters into a
    single "/" character.
On windows only, if the filename begins with a drive letter, prepend
    a single "/" character.
Prepend the "file:" scheme.uri.html#the_uri_path
)Ú),•¾        E#c/Uniform Resource Identifiers4. See AlsoURI filenames in sqlite3_open()
 URI filename examples

This page last modified on  2022-01-20 21:38:08 UTCuri.html#see_also–!•¾       EMª}UUniform Resource Identifiers3.3. Recognized Query ParametersSome query parameters are interpreted by the SQLite core and used to 
modify the characteristics of the new connection.  All query parameters
are always passed through into the xOpen method of the VFS even if
they are previously read and interpreted by the SQLite core.



The following query parameters are recognized by SQLite as of 
version 3.15.0 (2016-10-14).
New query parameters might be added in the future.





cache=sharedcache=private
The cache query parameter determines if the new database is opened
using shared cache mode or with a private cache.




immutable=1
The immutable query parameter is a boolean that signals to
SQLite that the underlying database file is held on read-only media
and cannot be modified, even by another process with elevated 
privileges.  SQLite always opens immutable database files
read-only and it skips all file locking and change detection
on immutable database files.  If this query parameter (or
the SQLITE_IOCAP_IMMUTABLE bit in xDeviceCharacteristics)
asserts that a database file is immutable and that file 
changes anyhow, then SQLite might return incorrect query 
results and/or SQLITE_CORRUPT errors.




mode=romode=rwmode=rwcmode=memory
The mode query parameter determines if the new database is opened
read-only, read-write, read-write and created if it does not exist, or
that the database is a pure in-memory database that never interacts with
disk, respectively.




modeof=filename
When creating a new database file during sqlite3_open_v2()
on unix systems, SQLite will try to set the permissions of the new
database file to match the existing file "filename".




nolock=1
The nolock query parameter is a boolean that disables all calls
to the xLock, xUnlock, and xCheckReservedLock methods of the VFS when true.
The nolock query parameter might be used, for example, when trying to
access a file on a filesystem that does not support file locking.
Caution:  If two or more database connections try to interact with 
the same SQLite database and one or more of those connections has
enabled "nolock", then database corruption can result.  The "nolock"
query parameter should only be used if the application can guarantee
that writes to the database are serialized.



psow=0psow=1
The psow query parameter overrides the powersafe overwrite
property of the database file being opened.  The psow query parameter
works with the default windows and unix VFSes but might be a no-op for
other proprietary or non-standard VFSes.




vfs=NAME
The vfs query parameter causes the database connection to be opened
using the VFS called NAME.
The open attempt fails if NAME is not the name of a VFS that
is built into SQLite or that has been previously registered using
sqlite3_vfs_register().uri.html#recognized_query_parameters
³3볆3•Õ;     OI‹iThe Next-Generation Query Planner2.1.  Query Planning In SQLiteSQLite computes joins using nested loops, 
one loop for each table
in the join.  (Additional loops might be inserted for IN
and OR operators in the WHERE clause.  SQLite considers those too,
but for simplicity we will ignore them in this essay.)
One or more indexes might be used on each loop to speed the search,
or a loop might be a "full table scan" that reads every row in the
table.  Thus query planning decomposes into two subtasks:

 Picking the nested order of the various loops
 Choosing good indexes for each loop

Picking the nesting order is generally the more challenging problem.
Once the nesting order of the join is established, the choice of indexes
for each loop is normally obvious.queryplanner-ng.html#_query_planning_in_sqliteŽC•Õ:   O)›cMThe Next-Generation Query Planner2.  BackgroundFor simple queries against a single table with few indexes, there is usually
an obvious choice for the best algorithm.
But for larger and more complex queries, such as
multi-way joins with many indexes
and subqueries, there can be hundreds, thousands, or millions
of reasonable algorithms for computing the result.
The job of the query planner is to choose the single "best" query plan from
this multitude of possibilities.

Query planners are what make SQL database engines so amazingly useful and powerful.
(This is true of all SQL database engines, not just SQLite.)
The query planner frees the programmer from the chore of selecting
a particular query plan, and thereby allows the programmer to
focus more mental energy on higher-level application issues and on 
providing more value to the end user.  For simple queries where the choice
of query plan is obvious, this is convenient but not hugely important.
But as applications and schemas and queries grow more complex, a
clever query planner can greatly speed and simplify the work of application
development. 
There is amazing power in being about to tell
the database engine what content is desired, and then let the database
engine figure out the best way to retrieve that content.

Writing a good query planner is more art than science.
The query planner must work with incomplete information.
It cannot determine how long any particular plan will take
without actually running that plan.  So when comparing two
or more plans to figure out which is "best", the query planner has to make
some guesses and assumptions and those guesses and assumptions will 
sometimes be wrong. A good query planner is one that will
find the correct solution often enough that application
programmers rarely need to get involved.queryplanner-ng.html#_background‰H•Õ9   O-‘eQThe Next-Generation Query Planner1.  IntroductionThe task of the "query planner" is to figure
out the best algorithm or "query plan" to accomplish an SQL statement.
Beginning with SQLite version 3.8.0 (2013-08-26),
the query planner component has been
rewritten so that it runs faster and generates better plans.  The
rewrite is called the "next generation query planner" or "NGQP".


This article overviews the importance of query planning, describes some
of the problems inherent to query planning, and outlines how the NGQP
solves those problems.

The NGQP is almost always better than the legacy query planner.
However, there may exist legacy applications that unknowingly depend on 
undefined and/or suboptimal behavior in the legacy query planner, and
upgrading to the NGQP on those legacy applications could cause performance
regressions.  This risk is considered and a checklist is provided
for reducing the risk and for fixing any issues that do arise.

This document focuses on the NGQP.  For a more general overview of the
SQLite query planner that encompasses the entire history of SQLite, see the
"The SQLite Query Optimizer Overview" and
"How Indexes Work" documents.queryplanner-ng.html#_introduction
SÿS…'•Õ=        O5‰YThe Next-Generation Query Planner3.  A Difficult Case"TPC-H Q8" is a test query from the
Transaction Processing Performance
Council.  The query planners in SQLite versions 3.7.17 and earlier 
do not choose good plans for TPC-H Q8.  And it has been determined that 
no amount
of tweaking of the legacy query planner will fix that.  In order to find
a good solution to the TPC-H Q8 query, and to continue improving the 
quality of SQLite's query planner, it became necessary to redesign the
query planner.  This section tries to explain why this redesign was
necessary and how the NGQP is different and addresses the TPC-H Q8 problem.queryplanner-ng.html#_a_difficult_case“|•Õ<
Oq¥GThe Next-Generation Query Planner2.2.  The SQLite Query Planner Stability GuaranteeWhen the Query Planner Stability Guarantee (QPSG) is enabled
SQLite will always pick the same query plan for any
given SQL statement as long as:


the database schema does not change in significant ways such as 
    adding or dropping indexes,
the ANALYZE command is not rerun, 
the same version of SQLite is used.


The QPSG is disabled by default.  It can be enabled at compile-time
using the SQLITE_ENABLE_QPSG compile-time option, or at run-time by
invoking sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_QPSG,1,0).

The QPSG means that if all of your queries run efficiently
during testing, and if your application does not change the schema,
then SQLite will not suddenly decide to start using a different
query plan, possibly causing a performance problem after your application 
is released to users.  If your application works in the lab, it
will continue working the same way after deployment.

Enterprise-class client/server SQL database engines do not normally 
make this guarantee.
In client/server SQL database engines, the server keeps track of
statistics on the sizes of tables and on the quality of indexes 
and the query planner uses those statistics to help select the best plans.
As content is added, deleted, or changed in the database, the statistics 
will evolve and may cause the query planner to begin using a different 
query plan for some particular query.  Usually the new plan will be better 
for the evolving structure of the data.  But sometimes the new query plan will
cause a performance reduction.  With a client/server database engine, there
is typically a Database Administrator (DBA) on hand to deal with these 
rare problems as they come up.  But DBAs are not available to fix problems 
in an embedded database like SQLite, and hence SQLite is careful to
ensure that plans do not change unexpectedly after deployment.

It is important to note that changing versions of SQLite might cause
changes in query plans.
The same version of SQLite will
always pick the same query plan, but if you relink your application to use
a different version of SQLite, then query plans might change.  In rare
cases, an SQLite version change might lead to a performance regression.  
This is one reason
you should consider statically linking your applications against SQLite 
rather than use a system-wide SQLite shared library which might 
change without your knowledge or control.queryplanner-ng.html#_the_sqlite_query_planner_stability_guarantee
––e•Õ>      O3 SThe Next-Generation Query Planner3.1.  Query DetailsTPC-H Q8 is an eight-way join.
As observed above, the main task of the query planner is
to figure out the best nesting order of the eight loops in order to minimize
the work needed to complete the join.
A simplified model of this problem for the case of TPC-H Q8 is shown
by the following diagram:








In the diagram, each of the 8 tables in the FROM clause of the query is
identified by a large circle with the label of the FROM-clause term:
N2, S, L, P, O, C, N1 and R.
The arcs in the graph represent the estimated cost of computing each term 
assuming that the origin of the arc is in an outer loop.  For example, the
cost of running the S loop as an inner loop to L is 2.30 whereas the
cost of running the S loop as an outer loop to L is 9.17.

The "cost" here is logarithmic.  With nested loops, the work
is multiplied, not added.  But it is customary to think of graphs
with additive weights and so the graph shows the logarithm of the
various costs.  The graph shows a cost advantage of S being inside of
L of about 6.87, but this translates into the query running about
963 times faster when S loop is inside of the L loop rather than
being outside of it.

The arrows from the small circles labeled with "*" indicate the cost
of running each loop with no dependencies.  The outermost loop must use this
*-cost.  Inner loops have the option of using the *-cost or a cost assuming
one of the other terms is in an outer loop, whichever gives the best
result.  One can think of the *-costs as a short-hand notation indicating
multiple arcs, one from each of the other nodes in the
graph.  The graph is therefore "complete", meaning that there are arcs
(some explicit and some implied) in both directions between every pair of 
nodes in the graph.

The problem of finding the best query plan is equivalent to finding
a minimum-cost path through the graph that visits each node
exactly once.

(Side note:  The cost estimates in the TPC-H Q8 graph above were computed
by the query planner in SQLite 3.7.16 and converted using a natural logarithm.)queryplanner-ng.html#_query_details
44“G•Õ?  O3¥[SThe Next-Generation Query Planner3.2.  ComplicationsThe presentation of the query planner problem above is a simplification.
The costs are estimates.  We cannot
know what the true cost of running a loop is until we actually run the loop.
SQLite makes guesses for the cost of running a loop based on
the availability of indexes and constraints found in the WHERE
clause.  These guesses are usually pretty good, but they can sometimes be
off.  Using the ANALYZE command to collect additional statistical
information about the database can sometimes enable SQLite to make better
guesses about the cost.

The costs are comprised of multiple numbers, not a single number as
shown in the graph.
SQLite computes several different estimated costs for each loop that apply at
different times.  For example, there is a "setup" cost that is incurred
just once when the query starts.  The setup cost is the cost of computing
an automatic index for a table that does not already
have an index.  Then there
is the cost of running each step of the loop.  Finally, there is an estimate
of the number rows generated by the loop, which is information needed in
estimating the costs of inner loops.  Sorting costs may come into play
if the query has an ORDER BY clause.

In a general query, dependencies need not be on a single loop, and hence
the matrix of dependencies might not be representable as a graph.
For example, one of the WHERE clause constraints might be
S.a=L.b+P.c, implying that the S loop must be an inner loop of both
L and P.  Such dependencies cannot be drawn as a graph
since there is no way for an arc to originate at two or more nodes at
once.

If the query contains an ORDER BY clause or a GROUP BY clause or if
the query uses the DISTINCT keyword then it is advantageous to select a 
path through the graph that causes rows to naturally appear in sorted order, 
so that no separate sorting step is required.  Automatic elimination of 
ORDER BY clauses
can make a large performance difference, so this is another factor
that needs to be considered in a complete implementation.

In the TPC-H Q8 query, the setup costs are all negligible,
all dependencies are between individual nodes, and there is no ORDER BY,
GROUP BY, or DISTINCT clause. So for TPC-H Q8,
the graph above is a reasonable representation of what needs to be computed.
The general case involves a lot of extra complication, which for clarity
is neglected in the remainder of this article.queryplanner-ng.html#_complications
       ±‘'•ÕA
Ok -The Next-Generation Query Planner3.4.  The N Nearest Neighbors or "N3" HeuristicThe NGQP uses a new heuristic for seeking the best path through the
graph: "N Nearest Neighbors" (hereafter "N3").  With N3, instead of
choosing just one nearest neighbor for each step, the algorithm keeps
track of the N bests paths at each step for some small integer N.

Suppose N=4.  Then for the TPC-H Q8 graph, the first step finds
the four shortest paths to visit any single node in the graph:


    R (cost: 3.56) 
    N1 (cost: 5.52) 
    N2 (cost: 5.52) 
    P (cost: 7.71) 


The second step finds the four shortest paths to visit two nodes 
beginning with one of the four paths from the previous step.  In the
case where two or more paths are equivalent (they have the same set of
visited nodes, though possibly in a different order) only the
first and lowest-cost path is retained.  We have:


    R-N1 (cost: 7.03) 
    R-N2 (cost: 9.08) 
    N2-N1 (cost: 11.04) 
    R-P {cost: 11.27} 


The third step starts with the four shortest two-node paths and finds
the four shortest three-node paths:


    R-N1-N2 (cost: 12.55) 
    R-N1-C (cost: 13.43) 
    R-N1-P (cost: 14.74) 
    R-N2-S (cost: 15.08) 


And so forth.  There are 8 nodes in the TPC-H Q8 query, 
so this process repeats a total of 8
times.  In the general case of a K-way join, the storage requirement
is O(N) and the computation time is O(K*N), which is significantly faster
than the O(2K) exact solution.

But what value to choose for N?  One might try N=K.  This makes the
algorithm O(K2) 
which is actually still quite efficient, since the
maximum value of K is 64 and K rarely exceeds 10.  
But that is not enough for the TPC-H Q8
problem.  With N=8 on TPC-H Q8 the N3 algorithm finds 
the solution R-N1-C-O-L-S-N2-P with a cost of 29.78.  
That is a big improvement over NN, but it is still
not optimal.  N3 finds the optimal solution for TPC-H Q8 
when N is 10 or greater.

The initial implementation of NGQP chooses N=1 for simple queries, N=5
for two-way joins and N=10 for all joins with three or more tables.  This
formula for selecting N might change in subsequent releases.queryplanner-ng.html#_the_n_nearest_neighbors_or_n3_heuristicŒJ•Õ@  OO—)oThe Next-Generation Query Planner3.3.  Finding The Best Query PlanPrior to version 3.8.0 (2013-08-26), SQLite always used
the "Nearest Neighbor" or "NN" heuristic when searching for the best query plan.
The NN heuristic makes a single traversal of the graph, always choosing
the lowest-cost arc as the next step.  
The NN heuristic works surprisingly well in most cases.
And NN is fast, so that SQLite is able to quickly find good plans
for even large 64-way joins.  In contrast, other SQL database engines that
do more extensive searching tend to bog down when the
number of tables in a join goes above 10 or 15.

Unfortunately, the query plan computed by NN for TPC-H Q8 is not optimal.
The plan computed using NN is R-N1-N2-S-C-O-L-P with a cost of 36.92.  
The notation
in the previous sentence means that the R table is run in the outer loop,
N1 is in the next inner loop, N2 is in the third loop, and so forth down
to P which is in the inner-most loop.  The shortest path through the
graph (as found via exhaustive search) is  P-L-O-C-N1-R-S-N2
with a cost of 27.38.  The difference might not seem like much, but 
remember that
the costs are logarithmic, so the shortest path is nearly 750 times
faster than that path found using the NN heuristic.

One solution to this problem is to change SQLite to do an exhaustive
search for the best path.  But an exhaustive search requires time 
proportional to
K! (where K is the number of tables in the join) and so when you get 
beyond a 10-way join, the time
to run sqlite3_prepare() becomes very large.queryplanner-ng.html#_finding_the_best_query_plan
‘`•ÕB        OM¡UqThe Next-Generation Query Planner4.  Hazards Of Upgrading To NGQPUpdate on 2018-11-24: This section was important 
when the NGQP was new.  But five years have elapsed, the NGQP has been
deployed successfully to billions of devices, and everyone has upgraded.
The upgrade hazard has vanished.
This section is retained for historical reference only.
Modern reads can skip ahead to the query planner checklist.

For most applications, upgrading from the legacy query planner to the NGQP
requires little thought or effort.
Simply replace the older SQLite version with the newer version of SQLite 
and recompile and the application will run faster.  
There are no API changes nor modifications
to compilation procedures.

But as with any query planner change, upgrading to the NGQP does carry
a small risk of introducing performance regressions.  The problem here is
not that the NGQP is incorrect or buggy or inferior to the legacy query
planner.  Given reliable information about the selectivity of indexes, 
the NGQP should always pick a plan that is as good or better than before.
The problem is that some applications may be using low-quality and
low-selectivity indexes without having run ANALYZE.  The older query
planners look at many fewer possible implementations for each query and 
so they may have stumbled over a good plan by stupid luck.  The NGQP, on 
the other hand, looks at many more query plan possibilities, and it may 
choose a different query plan that
works better in theory, assuming good indexes, but which gives a performance
regression in practice, because of the shape of the data.

Key points:


The NGQP will always find an equal or better query plan, compared to
    prior query planners, as long as it
    has access to accurate ANALYZE data in the SQLITE_STAT1 file.
The NGQP will always find a good query plan 
    as long as the schema does not contain indexes that have more than
    about 10 or 20 rows with the same value in the left-most column of the
    index.


Not all applications meet these conditions.  Fortunately,
the NGQP will still usually find good query plans, even without these conditions.
However, cases do arise (rarely) where performance regressions can occur.queryplanner-ng.html#_hazards_of_upgrading_to_ngqpblem is the same in each, so we will examine
just the second one.
The subquery of the second condition can be rewritten (with minor
and immaterial simplifications) as follows:


SELECT 1
  FROM plink JOIN tagxref ON tagxref.rid=plink.cid
 WHERE tagxref.tagid=$trunk
   AND plink.pid=$ckid;


The PLINK table holds parent-child relationships between
check-ins.  The TAGXREF table maps tags into check-ins.
For reference, the relevant portions of the schemas
for these two tables is shown here:


CREATE TABLE plink(
  pid INTEGER REFERENCES blob,
  cid INTEGER REFERENCES blob
);
CREATE UNIQUE INDEX plink_i1 ON plink(pid,cid);

CREATE TABLE tagxref(
  tagid INTEGER REFERENCES tag,
  mtime TIMESTAMP,
  rid INTEGER REFERENCE blob,
  UNIQUE(rid, tagid)
);
CREATE INDEX tagxref_i1 ON tagxref(tagid, mtime);


There are only two reasonable ways to implement this query.
(There are many other possible algorithms, but none of the
others are contenders for being the "best" algorithm.)



Find all children of check-in $ckid and test each one to see if
it has the $trunk tag.

Find all check-ins with the $trunk tag and test each one to see if
it is a child of $ckid.



Intuitively, we humans understand that algorithm-1 is best.
Each check-in is likely to have few children (one child is
the most common case) and each child can be tested for the
$trunk tag in logarithmic time.  Indeed, algorithm-1 is the
faster choice in practice.  But the NGQP has no intuition.  The
NGQP must use hard math, and algorithm-2 is slightly
better mathematically.  This is because, in the absence of other information,
the NGQP must assume that the indexes PLINK_I1 and TAGXREF_I1 are of
equal quality and are equally selective.  Algorithm-2 uses one field
of the TAGXREF_I1 index and both fields of the PLINK_I1 index whereas
algorithm-1 only uses the first field of each index.  Since 
algorithm-2 uses more index material, the NGQP is correct
to judge it to be the better algorithm.  The scores are close and
algorithm-2 just barely squeaks ahead of algorithm-1.  But
algorithm-2 really is the correct choice here.



Unfortunately, algorithm-2 is slower than algorithm-1 in
this application.



The problem is that the indexes are not of equal quality.
A check-in is likely to only have one child.  So the first
field of PLINK_I1 will usually narrow down the search to just a single
row.  But there are thousands and thousands check-ins tagged with "trunk", 
so the first field of TAGXREF_I1 will be
of little help in narrowing down the search.



The NGQP has no way of knowing that TAGXREF_I1 is almost useless in this
query, unless ANALYZE has been run on the database.  The ANALYZE command
gathers statistics on the quality of the various indexes and stores those
statistics in SQLITE_STAT1 table.  
Having access to this statistical information,
the NGQP easily chooses algorithm-1 as the best algorithm, by a wide
margin.

Why didn't the legacy query planner choose algorithm-2?
Easy: because the NN algorithm
never even considered algorithm-2.  Graphs of the planning
problem look like this:







In the "without ANALYZE" case on the left, the NN algorithm chooses 
loop P (PLINK) as the outer loop because 4.9 is less than 5.2, resulting
in path P-T which is algorithm-1. NN only looks at the single best choice
at each step so it completely misses the fact that 
5.2+4.4 makes a slightly cheaper plan than 4.9+4.8. But the N3 algorithm
keeps track of the 5 best paths for a 2-way join, so it ends up
selecting path T-P because of its slightly lower overall cost.
Path T-P is algorithm-2.



Note that with ANALYZE the cost estimates are
better aligned with reality and algorithm-1 is 
selected by both NN and N3.


(Side note:  The costs estimates in the two most recent graphs 
were computed by the NGQP using a base-2 logarithm and slightly different
cost assumptions compared to the legacy query planner.  
Hence, the cost estimates in
these latter two graphs are not directly comparable to the cost estimates
in the TPC-H Q8 graph.)queryplanner-ng.html#_case_study_upgrading_fossil_to_the_ngqp
·T•ÕC
Oií  The Next-Generation Query Planner4.1.  Case Study: Upgrading Fossil to the NGQPThe Fossil DVCS is the version
control system used to track all of the SQLite source code.
A Fossil repository is an SQLite database file.
(Readers are invited to ponder this recursion as an independent exercise.)
Fossil is both the version-control system for SQLite and a test
platform for SQLite.  Whenever enhancements are made to SQLite, 
Fossil is one of the first applications to test and evaluate those
enhancements.  So Fossil was an early adopter of the NGQP.

Unfortunately, the NGQP caused a
performance regression in Fossil.

One of the many reports that Fossil makes available is a timeline of
changes to a single branch showing all merges in and out of that branch.  See
http://www.sqlite.org/src/timeline?nd&n=200&r=trunk
for a typical
example of such a report.  Generating such a report normally takes just
a few milliseconds.  But after upgrading to the NGQP we noticed that
this one report was taking closer to 10 seconds for the trunk of the
repository.

The core query used to generate the branch timeline is shown below.
(Readers are not expected to understand the details of this query.
Commentary will follow.)


SELECT
     blob.rid AS blobRid,
     uuid AS uuid,
     datetime(event.mtime,'localtime') AS timestamp,
     coalesce(ecomment, comment) AS comment,
     coalesce(euser, user) AS user,
     blob.rid IN leaf AS leaf,
     bgcolor AS bgColor,
     event.type AS eventType,
     (SELECT group_concat(substr(tagname,5), ', ')
        FROM tag, tagxref
       WHERE tagname GLOB 'sym-*'
         AND tag.tagid=tagxref.tagid
         AND tagxref.rid=blob.rid
         AND tagxref.tagtype>0) AS tags,
     tagid AS tagid,
     brief AS brief,
     event.mtime AS mtime
  FROM event CROSS JOIN blob
 WHERE blob.rid=event.objid
   AND (EXISTS(SELECT 1 FROM tagxref
                WHERE tagid=11 AND tagtype>0 AND rid=blob.rid)
        OR EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=cid
                   WHERE tagid=11 AND tagtype>0 AND pid=blob.rid)
        OR EXISTS(SELECT 1 FROM plink JOIN tagxref ON rid=pid
                   WHERE tagid=11 AND tagtype>0 AND cid=blob.rid))
 ORDER BY event.mtime DESC
 LIMIT 200;


This query is not
especially complicated, but even so it replaces hundreds or 
perhaps thousands of lines of procedural code.
The gist of the query is this:  Scan down the EVENT table looking
for the most recent 200 check-ins that satisfy any one of three conditions:


 The check-in has a "trunk" tag.
 The check-in has a child that has a "trunk" tag.
 The check-in has a parent that has a "trunk" tag.



The first condition causes all of the trunk check-ins to be displayed and
the second and third cause check-ins that merge into or fork from
the trunk to also be included.
The three conditions are implemented by the three OR-connected
EXISTS statements in the WHERE clause of the query.
The slowdown that occurred with the NGQP was caused by the second and
third conditions.  The pro{
‹
e}‹£a•ÕFOÄg'The Next-Generation Query Planner5.  Checklist For Avoiding Or Fixing Query Planner ProblemsDon't panic!
Cases where the query planner picks an inferior plan are actually quite
rare.  You are unlikely to run across any problems in your application.
If you are not having performance issues, you do not need to worry
about any of this.

Create appropriate indexes.
Most SQL performance problems arise not because of query planner issues
but rather due to lack of appropriate inde~‹c•ÕE     OI•igThe Next-Generation Query Planner4.3. Update 2017: A Better FixThe prior text was written in early 2013, before the first release of
SQLite version 3.8.0.  This paragraph was added in mid 2021.
While all of the previous discussion remains true, a lot of improvements
have been made to the query planner, making this whole section largely moot.

In 2017, Fossil was enhanced to make use of the new
PRAGMA optimize statement.  Whenever Fossil is about to close the
database connection to its repository, it first runs
"PRAGMA optimize", which will in turn cause ANALYZE to be run if it
is needed.  Usually an ANALYZE is not needed, and so there is no
measurable performance penalty for doing this.  But every now and
then ANALYZE might be run on a few of the tables in the repository
database.  Because if this, query planning issues such as the one
described here no longer come up in Fossil.  The fact that ANALYZE
is run periodically to keep the sqlite_stat1 table up-to-date means
that hand-tuning of queries is no longer required.  We have not had
to tweak a query in Fossil in ages.

Therefore, the current recommendation for avoiding problems such
as this one is to simply run "PRAGMA optimize" (possibly preceded by
"PRAGMA analysis_limit=200") just prior to closing each database
connection.  The CROSS JOIN hack is still available, but if you keep
the query planner statistics in the sqlite_stat1 table up-to-date,
it usually won't be necessary.queryplanner-ng.html#update_2017_a_better_fix‹•ÕD        O=”e]The Next-Generation Query Planner4.2.  Fixing The ProblemRunning ANALYZE on the repository database immediately fixed the
performance problem.  However, we want Fossil to be robust and to always
work quickly regardless of whether or not its repository has been analyzed.
For this reason, the query was modified to use the CROSS JOIN operator 
instead of the plain JOIN operator.
SQLite will not reorder the tables of a CROSS JOIN.
This is a long-standing feature of SQLite that is specifically designed
to allow knowledgeable programmers
to enforce a particular loop nesting order.  Once the join
was changed to CROSS JOIN (the addition of a single keyword) the NGQP was
forced to choose the faster algorithm-1 regardless of whether or not
statistical information had been gathered using ANALYZE.

We say that algorithm-1 is "faster", but this
is not strictly true.  Algorithm-1 is faster in common repositories, but
it is possible to construct a repository in which
every check-in is on a different uniquely-named branch and
all check-ins are children of the root check-in.
In that case, TAGXREF_I1 would become more selective
than PLINK_I1 and algorithm-2 really would be the faster choice.
However such repositories are very unlikely to appear in
practice and so hard-coding the loop nested order using the
CROSS JOIN syntax is a reasonable solution
to the problem in this case.queryplanner-ng.html#_fixing_the_problemxes.  Make sure indexes are
available to assist all large queries.  Most performance issues can be
resolved by one or two CREATE INDEX commands and with no changes to
application code.

Avoid creating low-quality indexes..
A low-quality index (for the purpose of this checklist) is one where
there are more than 10 or 20 rows in the table that have the same value
for the left-most column of the index.  In particular, avoid using
boolean or "enum" columns as the left-most columns of your indexes.

The Fossil performance problem described in the previous section of
this document arose because there were over
ten-thousand entries in the TAGXREF table with the same value for the 
left-most column (the TAGID column) of the TAGXREF_I1 index.

If you must use a low-quality index, be sure to run ANALYZE.
Low-quality indexes will not confuse the query planner as long as the
query planner knows that the indexes are of low quality.  And the way
the query planner knows this is by the content of the SQLITE_STAT1 table,
which is computed by the ANALYZE command.

Of course, ANALYZE only works effectively if you have a significant 
amount of content in your database in the first place.  When creating a 
new database that you expect to accumulate a lot of data, you can run 
the command "ANALYZE sqlite_schema" to create the SQLITE_STAT1 table,
then prepopulate the sqlite_stat1 table (using ordinary INSERT statements)
with content that describes a typical
database for your application - perhaps content that you extracted after
running ANALYZE on a well-populated template database in the lab.
Or, you could just run "PRAGMA optimize" before shutting down
database connections so that ANALYZE will be run automatically as
needed to keep the sqlite_stat1 table current.

Instrument your code.
Add logic that lets you know quickly and easily which queries are taking
too much time.  Then work on just those specific queries.

Use unlikely() and likelihood() SQL functions.
SQLite normally assumes that terms in the WHERE clause that cannot be used
by indexes have a strong probability of being true.  If this assumption
is incorrect, it could lead to a suboptimal query plan.  The
unlikely() and likelihood() SQL functions can be used to provide
hints to the query planner about WHERE clause terms that are probably
not true, and thus aid the query planner in selecting the best possible
plan.

Use the CROSS JOIN syntax to enforce a particular
loop nesting order on queries that might use low-quality indexes in an
unanalyzed database.
SQLite treats the CROSS JOIN operator specially, forcing the table to 
the left to be an outer loop relative to the table on the right.

Avoid this step if possible, as it defeats one of the huge advantages
of the whole SQL language concept, specifically that the application 
programmer does not need to get involved with query planning.  If you
do use CROSS JOIN, wait until late in your development cycle to do so,
and comment the use of CROSS JOIN carefully so that you can take it out
later if possible.  Avoid using CROSS JOIN early in the development
cycle as doing so is a premature optimization, which is well known to
be the root of
all evil.

Use unary "+" operators to disqualify WHERE clause terms.
If the query planner insists on selecting a poor-quality index for a particular
query when a much higher-quality index is available, then
careful use of unary "+" operators in the WHERE clause
can force the query planner away from the poor-quality index.
Avoid using this trick if at all possible, and especially avoid it
early in the application development cycle.  Beware that
adding a unary "+" operator to an equality expression might change
the result of that expression if 
type affinity is involved.

Use the INDEXED BY syntax to enforce the selection of
particular indexes on problem queries.
As with the previous two bullets, avoid this step if possible, and 
especially avoid doing this early in development as it is clearly a
premature optimization.queryplanner-ng.html#_checklist_for_avoiding_or_fixing_query_planner_problems
çªç‰>•Ý!        A‘?SQLite Foreign Key Support OverviewThis document describes the support for SQL foreign key constraints
   introduced in SQLite version 3.6.19 (2009-10-14). 

The first section introduces the 
   concept of an SQL foreign key by example and defines the terminology 
   used for the remainder of the document. Section 2 describes the steps 
   an application must take in order to enable foreign key constraints in 
   SQLite (it is disabled by default). The next section, section 3, 
   describes the indexes that the user must create in order to use 
   foreign key constraints, and those that should be created in order for
   foreign key constraints to function efficiently. Section 4 describes
   the advanced foreign key related features supported by SQLite and
   section 5 describes the way the ALTER and DROP TABLE commands are
   enhanced to support foreign key constraints. Finally, section 6 
   enumerates the missing features and limits of the current implementation.

This document does not contain a full description of the syntax used
   to create foreign key constraints in SQLite. This may be found as 
   part of the documentation for the CREATE TABLE statement.foreignkeys.html#overview†Q•ÕG      O#ŒGThe Next-Generation Query Planner6.  SummaryThe query planner in SQLite normally does a terrific job of selecting
fast algorithms for running your SQL statements.  This is true of the 
legacy query planner and even more true of the new NGQP.  There may be
an occasional situation where, due to incomplete information, the query
planner selects a suboptimal plan.  This will happen less often with the
NGQP than with the legacy query planner, but it might still happen.  Only
in those rare cases do application developers need to get involved and
help the query planner to do the right thing.  In the common case, the
NGQP is just a new enhancement to SQLite that makes the application run
a little faster and which requires no new developer thought or action.
This page last modified on  2022-09-19 12:27:16 UTCqueryplanner-ng.html#_summarye new value of trackartist (3)
sqlite&gt; -- Still does not correspond to any row in the artist table.
sqlite&gt; UPDATE track SET trackartist = 3 WHERE trackname = 'Mr. Bojangles';
SQL error: foreign key constraint failed

sqlite&gt; -- Insert the required row into the artist table. It is then possible to
sqlite&gt; -- update the inserted row to set trackartist to 3 (since a corresponding
sqlite&gt; -- row in the artist table now exists).
sqlite&gt; INSERT INTO artist VALUES(3, 'Sammy Davis Jr.');
sqlite&gt; UPDATE track SET trackartist = 3 WHERE trackname = 'Mr. Bojangles';

sqlite&gt; -- Now that "Sammy Davis Jr." (artistid = 3) has been added to the database,
sqlite&gt; -- it is possible to INSERT new tracks using this artist without violating
sqlite&gt; -- the foreign key constraint:
sqlite&gt; INSERT INTO track VALUES(15, 'Boogie Woogie', 3);


  
    As you would expect, it is not possible to manipulate the database to a state
    that violates the foreign key constraint by deleting or updating rows in the 
    artist table either:
sqlite&gt; -- Attempting to delete the artist record for "Frank Sinatra" fails, since
sqlite&gt; -- the track table contains a row that refer to it.
sqlite&gt; DELETE FROM artist WHERE artistname = 'Frank Sinatra';
SQL error: foreign key constraint failed

sqlite&gt; -- Delete all the records from the track table that refer to the artist
sqlite&gt; -- "Frank Sinatra". Only then is it possible to delete the artist.
sqlite&gt; DELETE FROM track WHERE trackname = 'My Way';
sqlite&gt; DELETE FROM artist WHERE artistname = 'Frank Sinatra';

sqlite&gt; -- Try to update the artistid of a row in the artist table while there
sqlite&gt; -- exists records in the track table that refer to it. 
sqlite&gt; UPDATE artist SET artistid=4 WHERE artistname = 'Dean Martin';
SQL error: foreign key constraint failed

sqlite&gt; -- Once all the records that refer to a row in the artist table have
sqlite&gt; -- been deleted, it is possible to modify the artistid of the row.
sqlite&gt; DELETE FROM track WHERE trackname IN('That''s Amore', 'Christmas Blues');
sqlite&gt; UPDATE artist SET artistid=4 WHERE artistname = 'Dean Martin';


  
    SQLite uses the following terminology:


  
    The parent table is the table that a foreign key constraint
        refers to. The parent table in the example in this section is the
        artist table. Some books and articles refer to this as the
        referenced table, which is arguably more correct, but tends
        to lead to confusion.

    The child table is the table that a foreign key constraint
        is applied to and the table that contains the REFERENCES clause.
        The example in this section uses the track table
        as the child table. Other books and articles refer to this as the
        referencing table.

    The parent key is the column or set of columns in the parent 
        table that the foreign key constraint refers to. This is normally, but
        not always, the primary key of the parent table.  The parent key must
        be a named column or columns in the parent table, not the rowid.

    The child key is the column or set of columns in the child 
        table that are constrained by the foreign key constraint and which
        hold the REFERENCES clause.
  

  
    The foreign key constraint is satisfied if for each row in the child table 
    either one or more of the child key columns are NULL, or there exists a 
    row in the parent table for which each parent key column contains a value
    equal to the value in its associated child key column.

  
    In the above paragraph, the term "equal" means equal when values are 
    compared using the rules specified 
    here. The following clarifications apply:
    
  
    When comparing text values, the collating sequence
        associated with the parent key column is always used.
    When comparing values, if the parent key column has an affinity,
        then that affinity is applied to the child key value before the
        comparison is performed.foreignkeys.html#fk_basics
AA½2•Ý"        Aaù#ASQLite Foreign Key Support1. Introduction to Foreign Key ConstraintsSQL foreign key constraints are used to enforce "exists" relationships 
    between tables. For example, consider a database schema created using 
    the following SQL commands:

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER     -- Must map to an artist.artistid!
);


  
    The applications using this database are entitled to assume that for
    each row in the track table there exists a corresponding row in the
    artist table. After all, the comment in the declaration says so.
    Unfortunately, if a user edits the database using an external tool or 
    if there is a bug in an application, rows might be inserted into the 
    track table that do not correspond to any row in the artist
    table. Or rows might be deleted from the artist table, leaving
    orphaned rows in the track table that do not correspond to any of
    the remaining rows in artist. This might cause the application
    or applications to malfunction later on, or at least make coding the
    application more difficult.

  
    One solution is to add an SQL foreign key constraint to the database 
    schema to enforce the relationship between the artist and 
    track table. To do so, a foreign key definition may be added
    by modifying the declaration of the track table to the following:

CREATE TABLE track(
  trackid     INTEGER, 
  trackname   TEXT, 
  trackartist INTEGER,
  FOREIGN KEY(trackartist) REFERENCES artist(artistid)
);


  
    This way, the constraint is enforced by SQLite. Attempting to insert
    a row into the track table that does not correspond to any
    row in the artist table will fail, as will attempting to
    delete a row from the artist table when there exist dependent 
    rows in the track table There is one exception: if the foreign
    key column in the track table is NULL, then no corresponding
    entry in the artist table is required. Expressed in SQL, this
    means that for every row in the track table, the following
    expression evaluates to true:
trackartist IS NULL OR EXISTS(SELECT 1 FROM artist WHERE artistid=trackartist)


  Tip: If the application requires a stricter relationship between 
     artist and track, where NULL values are not permitted 
     in the trackartist column, simply add the appropriate 
     "NOT NULL" constraint to the schema.

  There are several other ways to add an equivalent foreign key declaration 
     to a CREATE TABLE statement. Refer to the 
     CREATE TABLE documentation for details.

  The following SQLite command-line session illustrates the effect of the
     foreign key constraint added to the track table:

sqlite&gt; SELECT * FROM artist;
artistid  artistname       
--------  -----------------
1         Dean Martin      
2         Frank Sinatra    

sqlite> SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
11       That's Amore       1  
12       Christmas Blues    1  
13       My Way             2  

sqlite&gt; -- This fails because the value inserted into the trackartist column (3)
sqlite&gt; -- does not correspond to row in the artist table.
sqlite&gt; INSERT INTO track VALUES(14, 'Mr. Bojangles', 3);
SQL error: foreign key constraint failed

sqlite&gt; -- This succeeds because a NULL is inserted into trackartist. A
sqlite&gt; -- corresponding row in the artist table is not required in this case.
sqlite&gt; INSERT INTO track VALUES(14, 'Mr. Bojangles', NULL);

sqlite&gt; -- Trying to modify the trackartist field of the record after it has 
sqlite&gt; -- been inserted does not work either, since th€
°°’K•Ý#  AS£cASQLite Foreign Key Support2. 
  Enabling Foreign Key Support
In order to use foreign key constraints in SQLite, the library must
    be compiled with neither SQLITE_OMIT_FOREIGN_KEY nor 
    SQLITE_OMIT_TRIGGER defined. If SQLITE_OMIT_TRIGGER is defined 
    but SQLITE_OMIT_FOREIGN_KEY is not, then SQLite behaves as it did prior 
    to version 3.6.19 (2009-10-14)
    - foreign key definitions are parsed and may be 
    queried using PRAGMA foreign_key_list, but foreign key constraints 
    are not enforced. The PRAGMA foreign_keys command is a no-op in this 
    configuration. If OMIT_FOREIGN_KEY is defined, then foreign key 
    definitions cannot even be parsed (attempting to specify a foreign
    key definition is a syntax error).

  
    Assuming the library is compiled with foreign key constraints enabled,
    it must still be enabled by the application at runtime, using the
    PRAGMA foreign_keys command. For example:

sqlite&gt; PRAGMA foreign_keys = ON;


  
    Foreign key constraints are disabled by default 
    (for backwards compatibility),
    so must be enabled separately for each database connection.
    (Note, however, that future releases of SQLite might change
    so that foreign key constraints enabled by default.  Careful
    developers will not
    make any assumptions about whether or not foreign keys are enabled by
    default but will instead enable or disable them as necessary.)
    The application can also use a PRAGMA foreign_keys statement to
    determine if foreign keys are currently enabled. The following 
    command-line session demonstrates this:
sqlite> PRAGMA foreign_keys;
0
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA foreign_keys;
1
sqlite> PRAGMA foreign_keys = OFF;
sqlite> PRAGMA foreign_keys;
0


  Tip: If the command "PRAGMA foreign_keys" returns no data instead of a
     single row containing "0" or "1", then the version of SQLite you are
     using does not support foreign keys (either because it is older than
     3.6.19 or because it was compiled with SQLITE_OMIT_FOREIGN_KEY or 
     SQLITE_OMIT_TRIGGER defined).

  
    It is not possible to enable or disable foreign key constraints
    in the middle of a multi-statement transaction (when SQLite
    is not in autocommit mode).  Attempting to do so does not return
    an error; it simply has no effect.foreignkeys.html#fk_enableat use the foreign keys.
    Errors reported when content is changed are "DML errors" and errors
    reported when the schema is changed are "DDL errors".
    So, in other words, misconfigured foreign key constraints that require
    looking at both the child and parent are DML errors.
    The English language error message for foreign key DML errors is usually
    "foreign key mismatch" but can also be "no such table" if the parent
    table does not exist.
    Foreign key DML errors are reported if:

  
     The parent table does not exist, or
     The parent key columns named in the foreign key constraint do
         not exist, or
     The parent key columns named in the foreign key constraint are not
         the primary key of the parent table and are not subject to a unique
         constraint using collating sequence specified in the CREATE TABLE, or
     The child table references the primary key of the parent without
         specifying the primary key columns and the number of primary key
         columns in the parent do not match the number of child key columns.
  

  
    The last bullet above is illustrated by the following:

CREATE TABLE parent2(a, b, PRIMARY KEY(a,b));

CREATE TABLE child8(x, y, FOREIGN KEY(x,y) REFERENCES parent2);        -- Ok
CREATE TABLE child9(x REFERENCES parent2);                             -- Error!
CREATE TABLE child10(x,y,z, FOREIGN KEY(x,y,z) REFERENCES parent2);    -- Error!


  
    By contrast, if foreign key errors can be recognized simply by looking
    at the definition of the child table and without having to consult the
    parent table definition, then the 
    CREATE TABLE statement for the child table fails.  Because the error
    occurs during a schema change, this is a DDL error.
    Foreign key DDL errors are reported regardless of
    whether or not foreign key constraints are enabled when the
    table is created.

  
    Indices are not required for child key columns but they are almost
    always beneficial. Returning to
    the example in section 1, each time an application
    deletes a row from the artist table (the parent table), it
    performs the equivalent of the following SELECT statement to search
    for referencing rows in the track table (the child table).

SELECT rowid FROM track WHERE trackartist = ?


 
   where ? in the above is replaced with the value of the artistid
   column of the record being deleted from the artist table (recall
   that the trackartist column is the child key and the artistid
   column is the parent key). Or, more generally:

SELECT rowid FROM &lt;child-table&gt; WHERE &lt;child-key&gt; = :parent_key_value


 
   If this SELECT returns any rows at all, then SQLite concludes that
   deleting the row from the parent table would violate the foreign key
   constraint and returns an error.
   Similar queries may be run if the content of the parent key
   is modified or a new row is inserted into the parent table.
   If these queries cannot use an index, they are forced to do a
   linear scan of the entire child table.  In a non-trivial database, this may
   be prohibitively expensive.

 
   So, in most real systems, an index should be created on the child key columns
   of each foreign key constraint. The child key index does not have
   to be (and usually will not be) a UNIQUE index.
   Returning again to the example in section 1, the
   complete database schema for efficient implementation of the foreign key 
   constraint might be:

CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER REFERENCES artist
);
CREATE INDEX trackindex ON track(trackartist);


  
    The block above uses a shorthand form to create the foreign key constraint.
    Attaching a "REFERENCES &lt;parent-table&gt;" clause to a column
    definition creates a foreign key constraint that maps the column to the
    primary key of &lt;parent-table&gt;. Refer to the CREATE TABLE 
    documentation for further details.foreignkeys.html#fk_indexes
¥Z—¥¢"•Ý&     AWÃ  ESQLite Foreign Key Support4.2. Deferred Foreign Key ConstraintsEach foreign key constraint in SQLite is classified as either immediate
     or deferred. Foreign key constraints are immediate by default.
     All the foreign key examples presented
     so far have been of immediate foreign key constraints.

  
    If a statement modifies the contents of the database so that an immediate 
    foreign key constraint is in violation at the conclusion the statement, 
    an except…‡>•Ý%  AY=GSQLite Foreign Key Support4.1. Composite Foreign Key ConstraintsA composite foreign key constraint is one where the child and parent keys
    are both composite keys. For example, consider
    the following database schema:

CREATE TABLE album(
  albumartist TEXT,
  albumname TEXT,
  albumcover BINARY,
  PRIMARY KEY(albumartist, albumname)
);

CREATE TABLE song(
  songid     INTEGER,
  songartist TEXT,
  songalbum TEXT,
  songname   TEXT,
  FOREIGN KEY(songartist, songalbum) REFERENCES album(albumartist, albumname)
);


  
    In this system, each entry in the song table is required to map to an entry
    in the album table with the same combination of artist and album.

  
    Parent and child keys must have the same cardinality.
    In SQLite, if any of the child key columns (in this case songartist 
    and songalbum) are NULL, then there is no requirement for a corresponding
    row in the parent table.foreignkeys.html#fk_composite±•Ý$  AaàoCSQLite Foreign Key Support3. Required and Suggested Database IndexesUsually, the parent key of a foreign key constraint is the primary key of
    the parent table. If they are not the primary key, then the parent key
    columns must be collectively subject to a UNIQUE constraint or have
    a UNIQUE index. 
    If the parent key columns have a UNIQUE index,
    then that index must use the collation sequences that are specified
    in the CREATE TABLE statement for the parent table.
    For example,

CREATE TABLE parent(a PRIMARY KEY, b UNIQUE, c, d, e, f);
CREATE UNIQUE INDEX i1 ON parent(c, d);
CREATE INDEX i2 ON parent(e);
CREATE UNIQUE INDEX i3 ON parent(f COLLATE nocase);

CREATE TABLE child1(f, g REFERENCES parent(a));                        -- Ok
CREATE TABLE child2(h, i REFERENCES parent(b));                        -- Ok
CREATE TABLE child3(j, k, FOREIGN KEY(j, k) REFERENCES parent(c, d));  -- Ok
CREATE TABLE child4(l, m REFERENCES parent(e));                        -- Error!
CREATE TABLE child5(n, o REFERENCES parent(f));                        -- Error!
CREATE TABLE child6(p, q, FOREIGN KEY(p, q) REFERENCES parent(b, c));  -- Error!
CREATE TABLE child7(r REFERENCES parent(c));                           -- Error!


  
    The foreign key constraints created as part of tables child1, 
    child2 and child3 are all fine. The foreign key
    declared as part of table child4 is an error because even though
    the parent key column is indexed, the index is not UNIQUE.
    The foreign key for table child5
    is an error because even though the parent key column has a unique
    index, the index uses a different collating sequence.
    Tables child6 and child7 are incorrect because while
    both have UNIQUE indices on their parent keys, the keys are not an
    exact match to the columns of a single UNIQUE index.

  
    If the database schema contains foreign key errors that require looking
    at more than one table definition to identify, then those errors are not
    detected when the tables are created. Instead, such errors prevent
    the application from preparing SQL statements that modify the content
    of the child or parent tables in ways thƒion is thrown and 
    the effects of the statement are reverted. By contrast, if
    a statement modifies the contents of the database such that a deferred 
    foreign key constraint is violated, the violation is not reported
    immediately. Deferred foreign key constraints are not checked
    until the transaction tries to COMMIT.
    For as long as the user has 
    an open transaction, the database is allowed to exist in a state that 
    violates any number of deferred foreign key constraints. However, 
    COMMIT will fail as long as foreign key constraints remain in
    violation.

  
    If the current statement is not inside an explicit transaction (a 
    BEGIN/COMMIT/ROLLBACK block), then an implicit
    transaction is committed
    as soon as the statement has finished executing. In this case deferred
    constraints behave the same as immediate constraints.

  
    To mark a foreign key constraint as deferred, its declaration must
    include the following clause:

DEFERRABLE INITIALLY DEFERRED                -- A deferred foreign key constraint


  
    The full syntax for specifying foreign key constraints is available as part
    of the CREATE TABLE documentation. Replacing the phrase above
    with any of the following 
    creates an immediate foreign key constraint.

NOT DEFERRABLE INITIALLY DEFERRED            -- An immediate foreign key constraint
NOT DEFERRABLE INITIALLY IMMEDIATE           -- An immediate foreign key constraint
NOT DEFERRABLE                               -- An immediate foreign key constraint
DEFERRABLE INITIALLY IMMEDIATE               -- An immediate foreign key constraint
DEFERRABLE                                   -- An immediate foreign key constraint


  The defer_foreign_keys pragma can be used to temporarily change all foreign
    key constraints to deferred regardless of how they are declared.

  
    The following example illustrates the effect of using a deferred foreign
    key constraint.

-- Database schema. Both tables are initially empty. 
CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER REFERENCES artist(artistid) DEFERRABLE INITIALLY DEFERRED
);

sqlite3&gt; -- If the foreign key constraint were immediate, this INSERT would
sqlite3&gt; -- cause an error (since as there is no row in table artist with
sqlite3&gt; -- artistid=5). But as the constraint is deferred and there is an
sqlite3&gt; -- open transaction, no error occurs.
sqlite3&gt; BEGIN;
sqlite3&gt;   INSERT INTO track VALUES(1, 'White Christmas', 5);

sqlite3&gt; -- The following COMMIT fails, as the database is in a state that
sqlite3&gt; -- does not satisfy the deferred foreign key constraint. The
sqlite3&gt; -- transaction remains open.
sqlite3&gt; COMMIT;
SQL error: foreign key constraint failed

sqlite3&gt; -- After inserting a row into the artist table with artistid=5, the
sqlite3&gt; -- deferred foreign key constraint is satisfied. It is then possible
sqlite3&gt; -- to commit the transaction without error.
sqlite3&gt;   INSERT INTO artist VALUES(5, 'Bing Crosby');
sqlite3&gt; COMMIT;

  
    A nested savepoint transaction may be RELEASEd while the
    database is in a state that does not satisfy a deferred foreign key 
    constraint. A transaction savepoint (a non-nested savepoint that was
    opened while there was not currently an open transaction), on the 
    other hand, is subject to the same restrictions as a COMMIT - attempting 
    to RELEASE it while the database is in such a state will fail.

  
    If a COMMIT statement (or the RELEASE of a transaction SAVEPOINT) fails
    because the database is currently in a state that violates a deferred
    foreign key constraint and there are currently
    nested savepoints, the nested savepoints remain open.foreignkeys.html#fk_deferred‡PDATE action associated with each foreign key in an
    SQLite database is one of "NO ACTION", "RESTRICT", "SET NULL",
    "SET DEFAULT" or "CASCADE". If an action is not explicitly specified, it 
    defaults to "NO ACTION".

  
     NO ACTION: Configuring "NO ACTION" means just that: when a
     parent key is modified or deleted from the database, no special action is
     taken.

     RESTRICT: The "RESTRICT" action means that the application
      is prohibited from deleting (for ON DELETE RESTRICT) or modifying
      (for ON UPDATE RESTRICT) a parent key when there exists one or more child
      keys mapped to it. The difference between the effect of a RESTRICT
      action and normal foreign key constraint enforcement is that the
      RESTRICT action processing happens as soon as the field is updated -
      not at the end of the current statement as it would with an immediate
      constraint, or at the end of the current transaction as it would with
      a deferred constraint.
      Even if the foreign key constraint it is 
      attached to is deferred, configuring a RESTRICT action causes SQLite to 
      return an error immediately if a parent key with dependent child keys is 
      deleted or modified.

     SET NULL: If the configured action is "SET NULL", then when
      a parent key is deleted (for ON DELETE SET NULL) or modified (for ON 
      UPDATE SET NULL), the child key columns of all rows in the child table
      that mapped to the parent key are set to contain SQL NULL values.

     SET DEFAULT: The "SET DEFAULT" actions are similar to
      "SET NULL",
      except that each of the child key columns is set to contain the column's 
      default value instead of NULL. Refer to the CREATE TABLE 
      documentation for details on how default values are assigned to table
      columns.

     CASCADE: A "CASCADE" action propagates the delete or update
      operation on the parent key to each dependent child key. For an "ON 
      DELETE CASCADE" action, this means that each row in the child table that
      was associated with the deleted parent row is also deleted. For an "ON
      UPDATE CASCADE" action, it means that the values stored in each dependent
      child key are modified to match the new parent key values.
  

  
    For example, adding an "ON UPDATE CASCADE" clause to the foreign key as
    shown below enhances the example schema from section 1 to allow the user
    to update the artistid (the parent key of the foreign key constraint) 
    column without breaking referential integrity:
-- Database schema
CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER REFERENCES artist(artistid) ON UPDATE CASCADE
);

sqlite&gt; SELECT * FROM artist;
artistid  artistname       
--------  -----------------
1         Dean Martin      
2         Frank Sinatra    

sqlite&gt; SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
11       That's Amore       1
12       Christmas Blues    1
13       My Way             2  

sqlite&gt; -- Update the artistid column of the artist record for "Dean Martin".
sqlite&gt; -- Normally, this would raise a constraint, as it would orphan the two
sqlite&gt; -- dependent records in the track table. However, the ON UPDATE CASCADE clause
sqlite&gt; -- attached to the foreign key definition causes the update to "cascade"
sqlite&gt; -- to the child table, preventing the foreign key constraint violation.
sqlite&gt; UPDATE artist SET artistid = 100 WHERE artistname = 'Dean Martin';

sqlite&gt; SELECT * FROM artist;
artistid  artistname       
--------  -----------------
2         Frank Sinatra    
100       Dean Martin      

sqlite&gt; SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
11       That's Amore       100
12       Christmas Blues    100  
13       My Way             2  


  
    Configuring an ON UPDATE or ON DELETE action does not mean that the foreign
    key constraint does not need to be satisfied. For example, if an
    "ON DELETE SET DEFAULT" action is configured,
    but there is no row in the parent table 
    that corresponds to the default values of the child key columns, deleting
    a parent key while dependent child keys exist still causes a foreign key
    violation. For example:

-- Database schema
CREATE TABLE artist(
  artistid    INTEGER PRIMARY KEY, 
  artistname  TEXT
);
CREATE TABLE track(
  trackid     INTEGER,
  trackname   TEXT, 
  trackartist INTEGER DEFAULT 0 REFERENCES artist(artistid) ON DELETE SET DEFAULT
);

sqlite&gt; SELECT * FROM artist;
artistid  artistname       
--------  -----------------
3         Sammy Davis Jr.

sqlite&gt; SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
14       Mr. Bojangles      3

sqlite&gt; -- Deleting the row from the parent table causes the child key
sqlite&gt; -- value of the dependent row to be set to integer value 0. However, this
sqlite&gt; -- value does not correspond to any row in the parent table. Therefore
sqlite&gt; -- the foreign key constraint is violated and an is exception thrown.
sqlite&gt; DELETE FROM artist WHERE artistname = 'Sammy Davis Jr.';
SQL error: foreign key constraint failed

sqlite&gt; -- This time, the value 0 does correspond to a parent table row. And
sqlite&gt; -- so the DELETE statement does not violate the foreign key constraint
sqlite&gt; -- and no exception is thrown.
sqlite&gt; INSERT INTO artist VALUES(0, 'Unknown Artist');
sqlite&gt; DELETE FROM artist WHERE artistname = 'Sammy Davis Jr.';

sqlite&gt; SELECT * FROM artist;
artistid  artistname       
--------  -----------------
0         Unknown Artist

sqlite&gt; SELECT * FROM track;
trackid  trackname          trackartist
-------  -----------------  -----------
14       Mr. Bojangles      0


  
    Those familiar with SQLite triggers
    will have noticed that the 
    "ON DELETE SET DEFAULT" action demonstrated in the example above is
    similar in effect to the following AFTER DELETE trigger:
CREATE TRIGGER on_delete_set_default AFTER DELETE ON artist BEGIN
  UPDATE child SET trackartist = 0 WHERE trackartist = old.artistid;
END;


  
    Whenever a row in the parent table of a foreign key constraint is deleted,
    or when the values stored in the parent key column or columns are modified, 
    the logical sequence of events is:

  
    Execute applicable BEFORE trigger programs,
    Check local (non foreign key) constraints,
    Update or delete the row in the parent table,
    Perform any required foreign key actions,
    Execute applicable AFTER trigger programs.
  

  
    There is one important difference between ON UPDATE foreign key actions and
    SQL triggers. An ON UPDATE action is only taken if the values of the
    parent key are modified so that the new parent key values are 
    not equal to the old. For example:

-- Database schema
CREATE TABLE parent(x PRIMARY KEY);
CREATE TABLE child(y REFERENCES parent ON UPDATE SET NULL);

sqlite&gt; SELECT * FROM parent;
x
----
key

sqlite&gt; SELECT * FROM child;
y
----
key

sqlite&gt; -- Since the following UPDATE statement does not actually modify
sqlite&gt; -- the parent key value, the ON UPDATE action is not performed and
sqlite&gt; -- the child key value is not set to NULL.
sqlite&gt; UPDATE parent SET x = 'key';
sqlite&gt; SELECT IFNULL(y, 'null') FROM child;
y
----
key

sqlite&gt; -- This time, since the UPDATE statement does modify the parent key
sqlite&gt; -- value, the ON UPDATE action is performed and the child key is set
sqlite&gt; -- to NULL.
sqlite&gt; UPDATE parent SET x = 'key2';
sqlite&gt; SELECT IFNULL(y, 'null') FROM child;
y
----
nullforeignkeys.html#fk_actions
Á•Ý'
A]€mCSQLite Foreign Key Support4.3. 
  ON DELETE and ON UPDATE Actions
Foreign key ON DELETE and ON UPDATE clauses are used to configure actions
    that take place when deleting rows from the parent table (ON DELETE), or 
    modifying the parent key values of existing rows (ON UPDATE). A single
    foreign key constraint may have different actions configured for ON DELETE
    and ON UPDATE. Foreign key actions are similar to triggers in many ways.

  
    The ON DELETE and ON U†
ééž•Ý(    A]ºWQSQLite Foreign Key Support5. CREATE, ALTER and DROP TABLE commandsThis section describes the way the CREATE TABLE, ALTER TABLE,
    and DROP TABLE commands
    interact with SQLite's foreign keys.

  
    A CREATE TABLE command operates the same whether or not
    foreign key constraints are enabled.  The parent key definitions of 
    foreign key constraints are not checked when a table is created. There is
    nothing stopping the user from creating a foreign key definition that
    refers to a parent table that does not exist, or to parent key columns that
    do not exist or are not collectively bound by a PRIMARY KEY or UNIQUE
    constraint.

  
    The ALTER TABLE command works differently in two respects when foreign
    key constraints are enabled:

  
     
         It is not possible to use the "ALTER TABLE ... ADD COLUMN" syntax
         to add a column that includes a REFERENCES clause, unless the default
         value of the new column is NULL. Attempting to do so returns an
         error.

     
         If an "ALTER TABLE ... RENAME TO" command is used to rename a table
         that is the parent table of one or more foreign key constraints, the
         definitions of the foreign key constraints are modified to refer to
         the parent table by its new name. The text of the child CREATE
         TABLE statement or statements stored in the sqlite_schema table are 
         modified to reflect the new parent table name.
  

  
    If foreign key constraints are enabled when it is prepared, the 
    DROP TABLE command performs an implicit DELETE to remove all
    rows from the table before dropping it. The implicit DELETE does not cause
    any SQL triggers to fire, but may invoke foreign key actions or constraint
    violations. If an immediate foreign key constraint is violated, the DROP
    TABLE statement fails and the table is not dropped. If a deferred foreign
    key constraint is violated, then an error is reported when the user attempts
    to commit the transaction if the foreign key constraint violations still
    exist at that point. Any "foreign key mismatch" errors encountered as part 
    of an implicit DELETE are ignored.

  
    The intent of these enhancements to the ALTER TABLE and DROP TABLE
    commands is to ensure that they cannot be used to create a database that
    contains foreign key violations, at least while foreign key constraints are
    enabled. There is one exception to this rule though. If a parent key is
    not subject to a PRIMARY KEY or UNIQUE constraint created as part of the
    parent table definition, but is subject to a UNIQUE constraint by virtue
    of an index created using the CREATE INDEX command, then the child 
    table may be populated without causing a "foreign key mismatch" error. If
    the UNIQUE index is dropped from the database schema, then the parent table
    itself is dropped, no error will be reported. However the database may be
    left in a state where the child table of the foreign key constraint contains
    rows that do not refer to any parent table row. This case can be avoided
    if all parent keys in the database schema are constrained by PRIMARY KEY
    or UNIQUE constraints added as part of the parent table definition, not
    by external UNIQUE indexes.

  
    The properties of the DROP TABLE and ALTER TABLE commands described
    above only apply if foreign keys are enabled. If the user considers them
    undesirable, then the workaround is to use PRAGMA foreign_keys to 
    disable foreign key constraints before executing the DROP or ALTER TABLE 
    command. Of course, while foreign key constraints are disabled, there is nothing
    to stop the user from violating foreign key constraints and thus creating
    an internally inconsistent database.foreignkeys.html#fk_schemacommands
‡>‡‰2•ìr  Ak[Pointer Passing Interfaces2. A Brief History Of Pointer Passing In SQLiteIt is sometimes convenient for SQLite extensions to
communicate non-SQL values between subcomponents or between the extension
and the application.  Some examples:



In the FTS3 extension, the 
MATCH operator (which does the full-text search)
needs to communicate details of matching entries 
to the snippet(), offsets(),
and matchinfo() functions so that those functions can convert the details
of the match into useful output.


In order for an application to 
add new extensions to FTS5, such as new tokenizers, 
the application needs a pointer to the "fts5_api" object.


In the CARRAY extension, the application needs to tell the 
extension the
location of a C-language array that contains the data for the table-valued
function that the extension implements.



The traditional way of communicating this information was to transform a
C-language pointer into a BLOB or a 64-bit integer, then move that BLOB or
integer through SQLite using the usual interfaces like
sqlite3_bind_blob(), sqlite3_result_blob(), sqlite3_value_blob() or
the integer equivalents.bindptr.html#a_brief_history_of_pointer_passing_in_sqliteƒO•ìq  A#†%7Pointer Passing Interfaces1. OverviewThree new "_pointer()" interfaces were added to SQLite 3.20.0 (2017-08-01):

 sqlite3_bind_pointer(),
 sqlite3_result_pointer(), and
 sqlite3_value_pointer().


Questions and confusion quickly arose
on the mailing lists about the purpose behind these new interfaces,
why they were introduced, and what problem they solve.  This essay attempts
to answer those questions and clear up the confusion.bindptr.html#overview‘i•Ý) AQ¢KSQLite Foreign Key Support6. Limits and Unsupported FeaturesThis section lists a few limitations and omitted features that are not
    mentioned elsewhere.

  
     
      No support for the MATCH clause. According to SQL92, a MATCH clause
         may be attached to a composite foreign key definition to modify the way
         NULL values that occur in child keys are handled. If "MATCH SIMPLE" is
         specified, then a child key is not required to correspond to any row
         of the parent table if one or more of the child key values are NULL.
         If "MATCH FULL" is specified, then if any of the child key values is
         NULL, no corresponding row in the parent table is required, but all
         child key values must be NULL. Finally, if the foreign key constraint
         is declared as "MATCH PARTIAL" and one of the child key values is NULL,
         there must exist at least one row in the parent table for which the
         non-NULL child key values match the parent key values.

       
         SQLite parses MATCH clauses (i.e. does not report a syntax error
         if you specify one), but does not enforce them. All foreign key 
         constraints in SQLite are handled as if MATCH SIMPLE were specified.
     
      No support for switching constraints between deferred and immediate 
         mode. Many systems allow the user to toggle individual foreign key
         constraints between deferred and immediate 
         mode at runtime (for example using the Oracle "SET CONSTRAINT" command).
         SQLite does not support this. In SQLite, a foreign key constraint is
         permanently marked as deferred or immediate when it is created.

    
      Recursion limit on foreign key actions. The 
         SQLITE_MAX_TRIGGER_DEPTH and SQLITE_LIMIT_TRIGGER_DEPTH
         settings determine the maximum allowable depth of trigger
         program recursion. For the purposes of these limits,
         foreign key actions are considered trigger programs. The
         PRAGMA recursive_triggers setting does not affect the operation 
         of foreign key actions. It is not possible to disable recursive foreign 
         key actions.
   
This page last modified on  2022-01-20 21:38:08 UTCforeignkeys.html#fk_unsupported
øøœ•ìs        AE¶MUPointer Passing Interfaces2.1. Upping The Threat LevelPassing around pointers as if they were integers or BLOBs is easy,
effective, and works well in an environment where the application
components are all friendly toward one another.  However, passing pointers
as integers and BLOBs allows hostile SQL text to forge invalid pointers that
can carry out mischief.


For example, the first argument to the snippet() function is supposed to
be a special column of the FTS3 table that contains a pointer to an fts3cursor
object that contains information about the current full text search match.
That pointer was formerly passed as a BLOB.  
For example, if the FTS3 table is named "t1" and has a column named "cx",
one might write:

SELECT snippet(t1) FROM t1 WHERE cx MATCH $pattern;



But if a hacker is able to run arbitrary SQL, he might run a slightly
different query, like this:

SELECT hex(t1) FROM t1 WHERE cx MATCH $pattern;



Because the pointer is passed in the t1 column of the t1
table as a BLOB (in older versions of SQLite), such a query would have 
shown the value of the
pointer in hex.  The attacker could then modify that pointer to try to
get the snippet() function to modify memory in some other part of 
the application address space instead of the fts3cursor object it 
was supposed to be operating on:

SELECT snippet(x'6092310100000000') FROM t1 WHERE cx MATCH $pattern;



Historically, this was not considered a threat.  The argument was that if
a hostile agent is able to inject arbitrary SQL text into the application,
then that agent is already in full control of the application, so
letting the hostile agent forge a pointer does not give the agent
any new capability.


For most cases, it is true that potential attackers have no way of injecting
arbitrary SQL, and so most uses of SQLite are immune to the attack above.
But there are some notable exceptions.  To wit:



The WebSQL interface
to webkit allowed any webpage to run arbitrary SQL in the browser
for Chrome and Safari.  That arbitrary SQL was supposed to be run inside
a sandbox where it could do no harm even if exploited, but that sandbox
turned out to be less secure than people supposed.  In the spring of 2017, 
one team of hackers was able to root an iMac using a long sequence of 
exploits, one of which involved corrupting the pointers passed as BLOB 
values to the snippet() FTS3 function of an SQLite database running via
the WebSQL interface inside of Safari.


On Android, we are told, there are many services that will blindly 
run arbitrary SQL that is passed to them by untrustworthy apps
that have been downloaded from dodgy corners of the internet.
Android services are suppose to be more guarded about running SQL
from unvetted sources.  This author does not have any specific examples
to the contrary, but he has heard rumors that they exist.  Even if
all Android services are more careful and properly vet all the SQL
they run, it would be difficult to audit them
all in order to verify that they are safe.  Hence, security-minded people
are keen to ensure that no exploits are possible by passing arbitrary
SQL text.


The Fossil version control system (designed
and written for the purpose of supporting SQLite development) allows
mildly trusted users to enter arbitrary SQL for generating trouble-ticket
reports.  That SQL is sanitized using the
sqlite3_set_authorizer() interface, and no exploits have ever been
found.  But this is an example of potentially hostile agents being able to
inject arbitrary SQL into the system.bindptr.html#upping_the_threat_level
Å+ÅŒa•ìv      AW—akPointer Passing Interfaces3. The New Pointer-Passing InterfacesAllowing extension components to pass private information to one another
securely and without introducing pointer leaks requires new interfaces:


sqlite3_bind_pointer(S,I,P,T,D) &rarr;
Bind pointer P of type T to the I-th parameter of prepared statement S.
D is an optional destructor function for P.
sqlite3_result_pointer(C,P,T,D) &rarr;
Return pointer P of type T as the argument of function C.
D is an optional destructor function for P.
sqlite3_value_pointer(V,T) &rarr;
Return the pointer of type T associated with value V, or if V has no
associated pointer, or if the pointer on V is of a type different from
T, then return NULL.



To SQL, the values created by sqlite3_bind_pointer() and 
sqlite3_result_pointer() are indistinguishable from NULL.  An
SQL statement that tries to use the hex() function to read the
value of a pointer will get an SQL NULL answer.  The only way to
discover whether or not a value has an associated pointer is to
use the sqlite3_value_pointer() interface with the appropriate
type string T. 


Pointer values read by sqlite3_value_pointer()
cannot be generated by pure SQL.  Hence, it is not possible for SQL to
forge pointers.


Pointer values generated by sqlite3_bind_pointer() and
sqlite3_result_pointer() cannot be read by pure SQL.
Hence, it is not possible for SQL to leak the value of pointers.


In this way the new pointer-passing interface seems to solve all of the
security problems associated with passing pointer values from one
extension to another in SQLite.bindptr.html#the_new_pointer_passing_interfacesˆ}•ìu     A1iAPointer Passing Interfaces2.3. Pointer LeaksThe use of subtypes on pointers prevented pointer forgery using
pure SQL.  But subtypes do nothing to prevent an attacker from reading
the values of pointers.  In other words, subtypes on pointer values
prevent attacks using SQL statements like this:

SELECT snippet(x'6092310100000000') FROM t1 WHERE cx MATCH $pattern;



The BLOB argument to snippet() does not have the correct subtype, so the
snippet function ignores it, makes no changes to any data structures,
and harmlessly returns NULL.


But the use of subtypes does nothing to prevent the value of a
pointer from being read using SQL code like this:

SELECT hex(t1) FROM t1 WHERE cx MATCH $pattern;



What harm could come of that, you ask?  The SQLite developers (including
this author) wondered the same thing.  But then security researchers
pointed out that knowledge of pointers can help attackers to circumvent
address-space randomization defenses.  This is called a "pointer leak".
A pointer leak is not itself a vulnerability, but it can aid an attacker
in effectively exploiting other vulnerabilities.bindptr.html#pointer_leaks†N•ìt AK‹W[Pointer Passing Interfaces2.2. Preventing Forged PointersThe first attempt at closing security gaps in pointer passing was to
prevent pointer values from being forged.  This was accomplished by
having the sender attach a subtype to each pointer using
sqlite3_result_subtype() and having the receiver verify that subtype
using sqlite3_value_subtype() and reject pointers that had an incorrect
subtype.  Since there is no way to attach a subtype to a result using
pure SQL, this prevents pointers from being forged using SQL.  The only
way to send a pointer is to use C code.  If an attacker can set a subtype,
then he is also able to forge a pointer without the help of SQLite.


Using subtypes to identify valid pointers prevented the WebSQL exploit.
But it turned out to be an incomplete solution.bindptr.html#preventing_forged_pointers

$
$‹W•ìw   A1–APointer Passing Interfaces3.1. Pointer TypesThe "pointer type" in the last parameter to sqlite3_bind_pointer(),
sqlite3_result_pointer(), and sqlite3_value_pointer() is used to prevent
pointers intended for one extension from being redirected to a different
extension.  For example, without the use of pointer types, an attacker 
could still get access to pointer information in a system that included 
both the FTS3 and the CARRAY extension using SQL like this:

SELECT ca.value FROM t1, carray(t1,10) AS ca WHERE cx MATCH $pattern



In the statement above, the FTS3 cursor pointer generated by the
MATCH operator is send into the carray() table-valued function instead
of its intended recipient snippet().  The carray() function treats the
pointer as a pointer to an array of integers and returns each integer
one by one, thus leaking the content of the FTS3 cursor object.  Since
the FTS3 cursor object contains pointers to other objects, the statement
above would be a pointer leak.


Except, the statement above does not work, thanks to pointer types.
The pointer generated by the MATCH operator has a type of "fts3cursor"
but the carray() function expects to receives a pointer of type "carray".
Because the pointer type on the sqlite3_result_pointer() does not match
the pointer type on the sqlite3_value_pointer() call, 
sqlite3_value_pointer() returns NULL in carray() and thus signals
the CARRAY extension that it has been passed an invalid pointer.bindptr.html#pointer_types
žn•ìx    A[»{gPointer Passing Interfaces3.1.1. Pointer types are static stringsPointer types are static strings, which ideally should be string literals
embedded directly in the SQLite API call, not parameters passed in from
other functions.  Consideration was given to using integer values as
the pointer type, but static strings provides a much larger name space
which reduces the chance of accidental type-name collisions between
unrelated extensions.


By "static string", we mean a zero-terminated array of bytes that is
fixed and unchanging for the life of the program.  In other words, the
pointer type string should be a string constant.
In contrast, a "dynamic string" is a zero-terminated array of bytes
that is held in memory allocated
from the heap, and which must be freed to avoid a memory leak.
Do not use dynamic strings as the pointer type string.


Multiple commentators have expressed a desire to use dynamic strings
for the pointer type, and to have SQLite take ownership of the type strings
and to automatically free the type string
when it has finished using it.  That design is rejected for the
following reasons:



The pointer type is not intended to be flexible and dynamic.  The
pointer type is intended to be a design-time constant.  Applications
should not synthesize pointer type strings at run-time.  Providing
support for dynamic pointer type strings would lead developers
to misuse the pointer-passing interfaces by creating run-time
synthesized pointer type strings.  Requiring the pointer type strings
to be static encourages developers to do the right thing by choosing
fixed pointer type names at design-time and encoding those names
as constant strings.


All string values at the SQL level in SQLite are dynamic strings.  
Requiring type strings to be static makes it difficult to 
create an application-defined SQL function that
can synthesize a pointer of an arbitrary type.  We do not want users
to create such SQL functions, since such functions would compromise the
security of the system.  Thus, the requirement to use static strings
helps to defend that the integrity of the pointer-passing interfaces against
ill-designed SQL functions.  The static string requirement is not
a perfect defense, since a sophisticated programmer can code around
it, and a novice program can simply take the memory leak.  But by
stating that the pointer type string must be static, we hope to encourage
developers who might otherwise use a dynamic string for the pointer type
to think more carefully about the problem and avoid introducing
security issues.


Having SQLite take ownership of the type strings would impose a performance
cost on all applications, even applications that do not use the 
pointer-passing interfaces.  SQLite passes values around as instances
of the sqlite3_value object.  That object has a destructor, which because
of the fact that sqlite3_value objects are used for nearly everything, is
invoked frequently.  If the destructor needs to check to see if there is
a pointer type string that needs to be freed, that is a few extra CPU
cycles that need to be burned on each call to the destructor.  Those
cycles add up.  We would be willing to bear the cost of the extra CPU
cycles if pointer-passing was a commonly used programming paradigm, but
pointer-passing is rare, and so it seems unwise to impose a run-time cost
on billions and billions of applications that do not use pointer passing
just for convenience of a few applications that do.



If you feel that you need dynamic pointer type strings in your application,
that is a strong indicator that you are misusing the pointer-passing interface.
Your intended use may be unsafe.
Please rethink your design.  Determine if you really need to be passing
pointers through SQL in the first place.  Or perhaps find a different
mechanism other than the pointer-passing interfaces described by this
article.bindptr.html#pointer_types_are_static_strings
†T]†R•ì{        A!š/5Pointer Passing Interfaces5. SummaryKey take-aways from this essay:



The internet is an increasingly hostile place.  These day, developers
should assume that attackers will find a way to execute arbitrary SQL 
in an application.
Applications should be designed to prevent the execution of arbitrary
SQL from escalating into a more severe exploit.


A few SQLite extensions benefit from passing pointers:

The FTS3 MATCH operator passes pointers into snippet(),
    offsets(), and matchinfo().
The carray table-valued function needs to accept a pointer to
    an array of C-language values from the application.
The remember() extension
    needs a pointer to a C-language integer variable in which to remember
    the value it passes.
Applications need to receive a pointer to the "fts5_api" object in order
    to add extensions, such as custom tokenizers, to the FTS5 extension.



Pointers should never be exchanged by encoding them as some other
SQL datatype, such as integers or BLOBs.  Instead, use the interfaces
designed to facilitate secure pointer passing:
sqlite3_bind_pointer(), sqlite3_result_pointer(), and
sqlite3_value_pointer().


The use of pointer-passing is an advanced technique that should be used
infrequently and cautiously.  Pointer-passing should not be
used haphazardly or carelessly.  Pointer-passing is a sharp tool 
that can leave deep scars if misused.


The "pointer type" string which is the last parameter to each of the
pointer-passing interfaces should be a distinct, application-specific
string literal that appears directly in the API call.  The pointer type
should not be a parameter passed in from a higher-level function.

This page last modified on  2022-10-07 10:23:26 UTCbindptr.html#summary‡r•ìz    AegyPointer Passing Interfaces4. Restrictions On The Use of Pointer ValuesThe pointers that piggy-back on SQL NULL values using the
sqlite3_bind_pointer(), sqlite3_result_pointer(), and
sqlite3_value_pointer() interface are transient and ephemeral.
The pointers are never written into the database.  The pointers
will not survive sorting.  The latter fact is why there is no
sqlite3_column_pointer() interface, since it is impossible to
predict whether or not the query planner will insert a sort operation
prior to returning a value from a query, so it would be impossible to
know if a pointer value inserted into a query by
sqlite3_bind_pointer() or sqlite3_result_pointer() would survive
through to the result set.


Pointer values must flow directly from their producer into their
consumer, with no intermediate operators or functions.  Any transformation
of a pointer value destroys the pointer and transforms the value into
an ordinary SQL NULL.bindptr.html#restrictions_on_the_use_of_pointer_values‰'•ìy        A?‘!OPointer Passing Interfaces3.2. Destructor FunctionsThe last parameter to the sqlite3_bind_pointer() and
sqlite3_result_pointer() routines is a pointer to a procedure
used to dispose of the P pointer once SQLite has finished with it.
This pointer can be NULL, in which case no destructor is called.


When the D parameter is not NULL, that means that ownership of the
pointer is being transferred to SQLite.  SQLite will take responsibility
for freeing resources associated with the pointer when it has finished
using the pointer.  If the D parameter is NULL, that means that ownership
of the pointer remains with the caller and the caller is responsible for
disposing of the pointer.


Note that the destructor function D is for the pointer value P, not for
the type string T.  The type string T should be a static string with an
infinite lifetime.


If ownership of the pointer is passed into SQLite by providing a
non-NULL D parameter to sqlite3_bind_pointer() or sqlite3_result_pointer()
then the ownership remains with SQLite until the object is destroyed.
There is no way to transfer ownership out of SQLite and back into the
application again.bindptr.html#destructor_functions
ƒƒ“•ôZ    S=¤?YThe SQLite Query Optimizer Overview2. WHERE Clause AnalysisThe WHERE clause on a query is broken up into "terms" where each term
  is separated from the others by an AND operator.
  If the WHERE clause is composed of constraints separated by the OR
  operator then the entire clause is considered to be a single "term"
  to which the OR-clause optimization is applied.


  All terms of the WHERE clause are analyzed to see if they can be
  satisfied using indexes.
  To be usable by an index a term must usually be of one of the following
  forms:


  column = expression
  column IS expression
  column &gt; expression
  column &gt;= expression
  column &lt; expression
  column &lt;= expression
  expression = column
  expression &gt; column
  expression &gt;= column
  expression &lt; column
  expression &lt;= column
  column IN (expression-list)
  column IN (subquery)
  column IS NULL
  column LIKE pattern
  column GLOB pattern



  If an index is created using a statement like this:

CREATE INDEX idx_ex1 ON ex1(a,b,c,d,e,...,y,z);



  Then the index might be used if the initial columns of the index
  (columns a, b, and so forth) appear in WHERE clause terms.
  The initial columns of the index must be used with
  the = or IN or IS operators.  
  The right-most column that is used can employ inequalities.  
  For the right-most
  column of an index that is used, there can be up to two inequalities
  that must sandwich the allowed values of the column between two extremes.


  It is not necessary for every column of an index to appear in a
  WHERE clause term in order for that index to be used. 
  However, there cannot be gaps in the columns of the index that are used.
  Thus for the example index above, if there is no WHERE clause term
  that constrains column c, then terms that constrain columns a and b can
  be used with the index but not terms that constrain columns d through z.
  Similarly, index columns will not normally be used (for indexing purposes)
  if they are to the right of a 
  column that is constrained only by inequalities.
  (See the skip-scan optimization below for the exception.)


  In the case of indexes on expressions, whenever the word "column" is
  used in the foregoing text, one can substitute "indexed expression"
  (meaning a copy of the expression that appears in the CREATE INDEX
  statement) and everything will work the same.optoverview.html#where_clause_analysis‡p•ôY      S+Ž=GThe SQLite Query Optimizer Overview1. IntroductionThis document provides an overview of how the query planner and optimizer
  for SQLite works.



  Given a single SQL statement, there might be dozens, hundreds, or even
  thousands of ways to implement that statement, depending on the complexity
  of the statement itself and of the underlying database schema.  The 
  task of the query planner is to select the algorithm that minimizes
  disk I/O and CPU overhead.



  Additional background information is available in the
  indexing tutorial document.



  With release 3.8.0 (2013-08-26),
  the SQLite query planner was reimplemented as the
  Next Generation Query Planner or "NGQP".  All of the features, techniques,
  and algorithms described in this document are applicable to both the
  pre-3.8.0 legacy query planner and to the NGQP.  For further information on
  how the NGQP differs from the legacy query planner, see the 
  detailed description of the NGQP.optoverview.html#introduction
§        W§‡+•ô\   SC_The SQLite Query Optimizer Overview3. The BETWEEN OptimizationIf a term of the WHERE clause is of the following form:


  expr1 BETWEEN expr2 AND expr3


  Then two "virtual" terms are added as follows:


  expr1 &gt;= expr2 AND expr1 &lt;= expr3


  Virtual terms are used for analysis only and do not cause any byte-code
  to be generated.
  If both virtual terms end up being used as constraints on an index,
  then the original BETWEEN term is omitted and the corresponding test
  is not performed on input rows.
  Thus if the BETWEEN term ends up being used as an index constraint
  no tests are ever performed on that term.
  On the other hand, the
  virtual terms themselves never causes tests to be performed on
  input rows.
  Thus if the BETWEEN term is not used as an index constraint and
  instead must be used to test input rows, the expr1 expression is
  only evaluated once.optoverview.html#the_between_optimization$•ô[    SI˜maThe SQLite Query Optimizer Overview2.1. Index Term Usage ExamplesFor the index above and WHERE clause like this:

... WHERE a=5 AND b IN (1,2,3) AND c IS NULL AND d='hello'


  The first four columns a, b, c, and d of the index would be usable since
  those four columns form a prefix of the index and are all bound by
  equality constraints.


  For the index above and WHERE clause like this:

... WHERE a=5 AND b IN (1,2,3) AND c>12 AND d='hello'


  Only columns a, b, and c of the index would be usable.  The d column
  would not be usable because it occurs to the right of c and c is
  constrained only by inequalities.


  For the index above and WHERE clause like this:

... WHERE a=5 AND b IN (1,2,3) AND d='hello'


  Only columns a and b of the index would be usable.  The d column
  would not be usable because column c is not constrained and there can
  be no gaps in the set of columns that usable by the index.


  For the index above and WHERE clause like this:

... WHERE b IN (1,2,3) AND c NOT NULL AND d='hello'


  The index is not usable at all because the left-most column of the
  index (column "a") is not constrained.  Assuming there are no other
  indexes, the query above would result in a full table scan.


  For the index above and WHERE clause like this:

... WHERE a=5 OR b IN (1,2,3) OR c NOT NULL OR d='hello'


  The index is not usable because the WHERE clause terms are connected
  by OR instead of AND. This query would result in a full table scan.
  However, if three additional indexes where added that contained columns
  b, c, and d as their left-most columns, then the
  OR-clause optimization might apply.optoverview.html#index_term_usage_examples
++™P•ô]        S3±mOThe SQLite Query Optimizer Overview4. OR OptimizationsWHERE clause constraints that are connected by OR instead of AND can
  be handled in two different ways.
  If a term consists of multiple subterms containing a common column
  name and separated by OR, like this:


  column = expr1 OR column = expr2 OR column = expr3 OR ...


  Then that term is rewritten as follows:


  column IN (expr1,expr2,expr3,...)


  The rewritten term then might go on to constrain an index using the
  normal rules for IN operators.  Note that column must be
  the same column in every OR-connected subterm,
  although the column can occur on either the left or the right side of
  the = operator.


  If and only if the previously described conversion of OR to an IN operator
  does not work, the second OR-clause optimization is attempted.
  Suppose the OR clause consists of multiple subterms as follows:


  expr1 OR expr2 OR expr3


  Individual subterms might be a single comparison expression like
  a=5 or x&gt;y or they can be 
  LIKE or BETWEEN expressions, or a subterm
  can be a parenthesized list of AND-connected sub-subterms.
  Each subterm is analyzed as if it were itself the entire WHERE clause
  in order to see if the subterm is indexable by itself.
  If every subterm of an OR clause is separately indexable
  then the OR clause might be coded such that a separate index is used
  to evaluate each term of the OR clause.  One way to think about how
  SQLite uses separate indexes for each OR clause term is to imagine
  that the WHERE clause where rewritten as follows:


  rowid IN (SELECT rowid FROM table WHERE expr1
            UNION SELECT rowid FROM table WHERE expr2
            UNION SELECT rowid FROM table WHERE expr3)


  The rewritten expression above is conceptual; WHERE clauses containing
  OR are not really rewritten this way.
  The actual implementation of the OR clause uses a mechanism that is
  more efficient and that works even for WITHOUT ROWID tables or 
  tables in which the "rowid" is inaccessible.  Nevertheless,
  the essence of the implementation is captured by the statement
  above:  Separate indexes are used to find candidate result rows
  from each OR clause term and the final result is the union of
  those rows.


  Note that in most cases, SQLite will only use a single index for each
  table in the FROM clause of a query.  The second OR-clause optimization
  described here is the exception to that rule.  With an OR-clause,
  a different index might be used for each subterm in the OR-clause.


  For any given query, the fact that the OR-clause optimization described
  here can be used does not guarantee that it will be used.
  SQLite uses a cost-based query planner that estimates the CPU and
  disk I/O costs of various competing query plans and chooses the plan
  that it thinks will be the fastest.  If there are many OR terms in
  the WHERE clause or if some of the indexes on individual OR-clause 
  subterms are not very selective, then SQLite might decide that it is
  faster to use a different query algorithm, or even a full-table scan.
  Application developers can use the
  EXPLAIN QUERY PLAN prefix on a statement to get a
  high-level overview of the chosen query strategy.optoverview.html#or_optimizationsthat case insensitivity only applies to
  latin1 characters - basically the upper and lower case letters of English
  in the lower 127 byte codes of ASCII.  International character sets
  are case sensitive in SQLite unless an application-defined
  collating sequence and like() SQL function are provided that
  take non-ASCII characters into account.
  If an application-defined collating sequence and/or like() SQL
  function are provided, the LIKE optimization described here will never
  be taken.


  The LIKE operator is case insensitive by default because this is what
  the SQL standard requires.  You can change the default behavior at
  compile time by using the SQLITE_CASE_SENSITIVE_LIKE command-line option
  to the compiler.


  The LIKE optimization might occur if the column named on the left of the
  operator is indexed using the built-in BINARY collating sequence and
  case_sensitive_like is turned on.  Or the optimization might occur if
  the column is indexed using the built-in NOCASE collating sequence and the 
  case_sensitive_like mode is off.  These are the only two combinations
  under which LIKE operators will be optimized.


  The GLOB operator is always case sensitive.  The column on the left side
  of the GLOB operator must always use the built-in BINARY collating sequence
  or no attempt will be made to optimize that operator with indexes.


  The LIKE optimization will only be attempted if
  the right-hand side of the GLOB or LIKE operator is either
  literal string or a parameter that has been bound
  to a string literal.  The string literal must not
  begin with a wildcard; if the right-hand side begins with a wildcard
  character then this optimization is not attempted.  If the right-hand side 
  is a parameter that is bound to a string, then this optimization is
  only attempted if the prepared statement containing the expression
  was compiled with sqlite3_prepare_v2() or sqlite3_prepare16_v2().
  The LIKE optimization is not attempted if the
  right-hand side is a parameter and the statement was prepared using
  sqlite3_prepare() or sqlite3_prepare16().


  Suppose the initial sequence of non-wildcard characters on the right-hand
  side of the LIKE or GLOB operator is x.  We are using a single 
  character to denote this non-wildcard prefix but the reader should
  understand that the prefix can consist of more than 1 character.
  Let y be the smallest string that is the same length as /x/ but which
  compares greater than x.  For example, if x is
  'hello' then
  y would be 'hellp'.
  The LIKE and GLOB optimizations consist of adding two virtual terms
  like this:


  column &gt;= x AND column &lt; y


  Under most circumstances, the original LIKE or GLOB operator is still
  tested against each input row even if the virtual terms are used to
  constrain an index.  This is because we do not know what additional
  constraints may be imposed by characters to the right
  of the x prefix.  However, if there is only a single
  global wildcard to the right of x, then the original LIKE or 
  GLOB test is disabled.
  In other words, if the pattern is like this:


  column LIKE x%
  column GLOB x*


  then the original LIKE or GLOB tests are disabled when the virtual
  terms constrain an index because in that case we know that all of the
  rows selected by the index will pass the LIKE or GLOB test.


  Note that when the right-hand side of a LIKE or GLOB operator is
  a parameter and the statement is prepared using sqlite3_prepare_v2()
  or sqlite3_prepare16_v2() then the statement is automatically reparsed
  and recompiled on the first sqlite3_step() call of each run if the binding
  to the right-hand side parameter has changed since the previous run.
  This reparse and recompile is essentially the same action that occurs
  following a schema change.  The recompile is necessary so that the query
  planner can examine the new value bound to the right-hand side of the
  LIKE or GLOB operator and determine whether or not to employ the
  optimization described above.optoverview.html#the_like_optimization
¼¼°7•ô^      S=ß'YThe SQLite Query Optimizer Overview5. The LIKE OptimizationA WHERE-clause term that uses the LIKE or GLOB operator
  can sometimes be used with an index to do a range search, 
  almost as if the LIKE or GLOB were an alternative to a BETWEEN
  operator.
  There are many conditions on this optimization:


  
  The right-hand side of the LIKE or GLOB must be either a string literal
      or a parameter bound to a string literal
      that does not begin with a wildcard character.
  It must not be possible to make the LIKE or GLOB operator true by
      having a numeric value (instead of a string or blob) on the
      left-hand side. This means that either:
      
       the left-hand side of the LIKE or GLOB operator is the name
           of an indexed column with TEXT affinity, or
       the right-hand side pattern argument does not begin with a
           minus sign ("-") or a digit.
      
      This constraint arises from the fact that numbers do not sort in
      lexicographical order.  For example: 9&lt;10 but '9'&gt;'10'.
  The built-in functions used to implement LIKE and GLOB must not
      have been overloaded using the sqlite3_create_function() API.
  For the GLOB operator, the column must be indexed using the 
      built-in BINARY collating sequence.
  For the LIKE operator, if case_sensitive_like mode is enabled then
      the column must indexed using BINARY collating sequence, or if
      case_sensitive_like mode is disabled then the column must indexed
      using built-in NOCASE collating sequence.
  If the ESCAPE option is used, the ESCAPE character must be ASCII,
      or a single-byte character in UTF-8.
  


  The LIKE operator has two modes that can be set by a
  pragma.  The
  default mode is for LIKE comparisons to be insensitive to differences
  of case for latin1 characters.  Thus, by default, the following
  expression is true:

'a' LIKE 'A'


  If the case_sensitive_like pragma is enabled as follows:

PRAGMA case_sensitive_like=ON;


  Then the LIKE operator pays attention to case and the example above would
  evaluate to false.  Note “
ŽŽžm•ô_      SG»cThe SQLite Query Optimizer Overview6. The Skip-Scan OptimizationThe general rule is that indexes are only useful if there are 
  WHERE-clause constraints on the left-most columns of the index.
  However, in some cases,
  SQLite is able to use an index even if the first few columns of
  the index are omitted from the WHERE clause but later columns 
  are included.



  Consider a table such as the following:

CREATE TABLE people(
  name TEXT PRIMARY KEY,
  role TEXT NOT NULL,
  height INT NOT NULL, -- in cm
  CHECK( role IN ('student','teacher') )
);
CREATE INDEX people_idx1 ON people(role, height);



  The people table has one entry for each person in a large
  organization.  Each person is either a "student" or a "teacher",
  as determined by the "role" field.  The table also records the height in
  centimeters of each person.  The role and height are indexed.
  Notice that the left-most column of the index is not very
  selective - it only contains two possible values.



  Now consider a query to find the names of everyone in the
  organization that is 180cm tall or taller:


SELECT name FROM people WHERE height>=180;



  Because the left-most column of the index does not appear in the
  WHERE clause of the query, one is tempted to conclude that the
  index is not usable here.  However, SQLite is able to use the index.
  Conceptually, SQLite uses the index as if the query were more
  like the following:


SELECT name FROM people
 WHERE role IN (SELECT DISTINCT role FROM people)
   AND height>=180;



  Or this:

SELECT name FROM people WHERE role='teacher' AND height>=180
UNION ALL
SELECT name FROM people WHERE role='student' AND height>=180;



  The alternative query formulations shown above are conceptual only.
  SQLite does not really transform the query. 
  The actual query plan is like this:
  SQLite locates the first possible value for "role", which it
  can do by rewinding the "people_idx1" index to the beginning and reading
  the first record.  SQLite stores this first "role" value in an
  internal variable that we will here call "$role".  Then SQLite
  runs a query like: "SELECT name FROM people WHERE role=$role AND height>=180".
  This query has an equality constraint on the left-most column of the
  index and so the index can be used to resolve that query.  Once
  that query is finished, SQLite then uses the "people_idx1" index to
  locate the next value of the "role" column, using code that is logically
  similar to "SELECT role FROM people WHERE role>$role LIMIT 1".
  This new "role" value overwrites the $role variable, and the process
  repeats until all possible values for "role" have been examined.


  We call this kind of index usage a "skip-scan" because the database
  engine is basically doing a full scan of the index but it optimizes the
  scan (making it less than "full") by occasionally skipping ahead to the
  next candidate value.


  SQLite might use a skip-scan on an index if it knows that the first
  one or more columns contain many duplication values.
  If there are too few duplicates
  in the left-most columns of the index, then it would
  be faster to simply step ahead to the next value, and thus do
  a full table scan, than to do a binary search on an index to locate
  the next left-column value.


  The only way that SQLite can know that there are many duplicates
  in the left-most columns of an index
  is if the ANALYZE command has been run
  on the database.
  Without the results of ANALYZE, SQLite has to guess at the "shape" of
  the data in the table, and the default guess is that there are an average
  of 10 duplicates for every value in the left-most column of the index.
  Skip-scan only becomes profitable (it only gets to be faster than
  a full table scan) when the number of duplicates is about 18 or more.
  Hence, a skip-scan is never used on a database that has not been analyzed.optoverview.html#the_skip_scan_optimization
7R7ƒU•ôbS„WThe SQLite Query Optimizer Overview7.2. Manual Control Of Query Plans Using SQLITE_STAT TablesSQLite provides the ability for advanced programmers to exercise control
  over the query plan chosen by the optimizer. One method for doing this
  is to fudge the ANALYZE results in the sqlite_stat1, 
  sqlite_stat3, and/or sqlite_stat4 tables.  This is not
  recommended for most situations.optoverview.html#manual_control_of_query_plans_using_sqlite_stat_tables¨4•ôa  SIÏ
aThe SQLite Query Optimizer Overview7.1. Order of Tables in a JoinThe current implementation of 
  SQLite uses only loop joins.  That is to say, joins are implemented as
  nested loops.


  The default order of the nested loops in a join is for the left-most
  table in the FROM clause to form the outer loop and the right-most
  table to form the inner loop.
  However, SQLite will nest the loops in a different order if doing so
  will help it to select better indexes.


  Inner joins can be freely reordered.  However a left outer join is
  neither commutative nor associative and hence will not be reordered.
  Inner joins to the left and right of the outer join might be reordered
  if the optimizer thinks that is advantageous but the outer joins are
  always evaluated in the order in which they occur.


  SQLite treats the CROSS JOIN operator specially.
  The CROSS JOIN operator is commutative, in theory.  However, SQLite chooses to
  never reorder tables in a CROSS JOIN.  This provides a mechanism
  by which the programmer can force SQLite to choose a parti—‰)•ô`   S‘K9The SQLite Query Optimizer Overview7. JoinsThe ON and USING clauses of an inner join are converted into additional
  terms of the WHERE clause prior to WHERE clause analysis described
  above in paragraph 2.0.
  Thus with SQLite, there is no computational
  advantage to use the newer SQL92 join syntax
  over the older SQL89 comma-join syntax.  They both end up accomplishing
  exactly the same thing on inner joins.


  For an OUTER JOIN the situation is more complex.  The following
  two queries are not equivalent:

SELECT * FROM tab1 LEFT JOIN tab2 ON tab1.x=tab2.y;
SELECT * FROM tab1 LEFT JOIN tab2 WHERE tab1.x=tab2.y;


  For an inner join, the two queries above would be identical.  However,
  special processing applies to the ON and USING clauses of an OUTER join:
  specifically, the constraints in an ON or USING clause do not apply if
  the right table of the join is on a null row, but the constraints do apply
  in the WHERE clause.  The net effect is that putting the ON or USING
  clause expressions for a LEFT JOIN in the WHERE clause effectively converts
  the query to an
  ordinary INNER JOIN - albeit an inner join that runs more slowly.optoverview.html#joinscular loop nesting
  order.  


  When selecting the order of tables in a join, SQLite uses an efficient
  polynomial-time algorithm.  Because of this,
  SQLite is able to plan queries with 50- or 60-way joins in a matter of
  microseconds


  Join reordering is automatic and usually works well enough that
  programmers do not have to think about it, especially if ANALYZE
  has been used to gather statistics about the available indexes,
  though occasionally some hints from the programmer are needed.
  Consider, for example, the following schema:

CREATE TABLE node(
   id INTEGER PRIMARY KEY,
   name TEXT
);
CREATE INDEX node_idx ON node(name);
CREATE TABLE edge(
   orig INTEGER REFERENCES node,
   dest INTEGER REFERENCES node,
   PRIMARY KEY(orig, dest)
);
CREATE INDEX edge_idx ON edge(dest,orig);


  The schema above defines a directed graph with the ability to store a
  name at each node. Now consider a query against this schema:

SELECT *
  FROM edge AS e,
       node AS n1,
       node AS n2
 WHERE n1.name = 'alice'
   AND n2.name = 'bob'
   AND e.orig = n1.id
   AND e.dest = n2.id;


  This query asks for is all information about edges that go from
  nodes labeled "alice" to nodes labeled "bob".
  The query optimizer in SQLite has basically two choices on how to
  implement this query.  (There are actually six different choices, but
  we will only consider two of them here.)
  Pseudocode below demonstrating these two choices.



Option 1:
foreach n1 where n1.name='alice' do:
  foreach n2 where n2.name='bob' do:
    foreach e where e.orig=n1.id and e.dest=n2.id
      return n1.*, n2.*, e.*
    end
  end
end



Option 2:
foreach n1 where n1.name='alice' do:
  foreach e where e.orig=n1.id do:
    foreach n2 where n2.id=e.dest and n2.name='bob' do:
      return n1.*, n2.*, e.*
    end
  end
end


  The same indexes are used to speed up every loop in both implementation
  options.
  The only difference in these two query plans is the order in which
  the loops are nested.


  So which query plan is better? It turns out that the answer depends on
  what kind of data is found in the node and edge tables.


  Let the number of alice nodes be M and the number of bob nodes be N.
  Consider two scenarios. In the first scenario, M and N are both 2 but
  there are thousands of edges on each node. In this case, option 1 is
  preferred. With option 1, the inner loop checks for the existence of
  an edge between a pair of nodes and outputs the result if found. 
  Because there are only 2 alice and bob nodes each, the inner loop
  only has to run four times and the query is very quick. Option 2 would
  take much longer here. The outer loop of option 2 only executes twice,
  but because there are a large number of edges leaving each alice node,
  the middle loop has to iterate many thousands of times. It will be
  much slower. So in the first scenario, we prefer to use option 1.


  Now consider the case where M and N are both 3500. Alice nodes are
  abundant.  This time suppose each of these nodes is connected by only one
  or two edges. Now option 2 is preferred. With option 2,
  the outer loop still has to run 3500 times, but the middle loop only
  runs once or twice for each outer loop and the inner loop will only
  run once for each middle loop, if at all. So the total number of
  iterations of the inner loop is around 7000. Option 1, on the other
  hand, has to run both its outer loop and its middle loop 3500 times
  each, resulting in 12 million iterations of the middle loop.
  Thus in the second scenario, option 2 is nearly 2000 times faster
  than option 1.


  So you can see that depending on how the data is structured in the table,
  either query plan 1 or query plan 2 might be better.  Which plan does
  SQLite choose by default?  As of version 3.6.18, without running ANALYZE,
  SQLite will choose option 2.
  If the ANALYZE command is run in order to gather statistics,
  a different choice might be made if the statistics indicate that the
  alternative is likely to run faster.optoverview.html#order_of_tables_in_a_join
\\•ôc
Ssœ
The SQLite Query Optimizer Overview7.3. Manual Control of Query Plans using CROSS JOINProgrammers can force SQLite to use a particular loop nesting order
  for a join by using the CROSS JOIN operator instead of just JOIN, 
  INNER JOIN, NATURAL JOIN, or a "," join.  Though CROSS JOINs are
  commutative in theory, SQLite chooses to never reorder the tables in
  a CROSS JOIN.  Hence, the left table of a CROSS JOIN will always be
  in an outer loop relative to the right table.


  In the following query, the optimizer is free to reorder the 
  tables of FROM clause any way it sees fit:

SELECT *
  FROM node AS n1,
       edge AS e,
       node AS n2
 WHERE n1.name = 'alice'
   AND n2.name = 'bob'
   AND e.orig = n1.id
   AND e.dest = n2.id;


  In the following logically equivalent formulation of the same query,
  the substitution of "CROSS JOIN" for the "," means that the order
  of tables must be N1, E, N2.

SELECT *
  FROM node AS n1 CROSS JOIN
       edge AS e CROSS JOIN
       node AS n2
 WHERE n1.name = 'alice'
   AND n2.name = 'bob'
   AND e.orig = n1.id
   AND e.dest = n2.id;


  In the latter query, the query plan must be 
  option 2.  Note that
  you must use the keyword "CROSS" in order to disable the table reordering
  optimization; INNER JOIN, NATURAL JOIN, JOIN, and other similar
  combinations work just like a comma join in that the optimizer is
  free to reorder tables as it sees fit. (Table reordering is also
  disabled on an outer join, but that is because outer joins are not
  associative or commutative. Reordering tables in OUTER JOIN changes
  the result.)


  See "The Fossil NGQP Upgrade Case Study" for another real-world example
  of using CROSS JOIN to manually control the nesting order of a join.
  The query planner checklist found later in the same document provides
  further guidance on manual control of the query planner.optoverview.html#manual_control_of_query_plans_using_cross_join
íZíˆh•ôe
Sw        The SQLite Query Optimizer Overview8.1. Disqualifying WHERE Clause Terms using Unary-"+"Terms of the WHERE clause can be manually disqualified for use with
  indexes by prepending a unary + operator to the column name.  The
  unary + is a no-op and will not generate any byte code in the prepared
  statement.
  However, the unary + operator will prevent the term from
  constraining an index.
  So, in the example above, if the query were rewritten as:

SELECT z FROM ex2 WHERE +x=5 AND y=6;


  The + operator on the x column will prevent that term from 
  constraining an index.  This would force the use of the ex2i2 index.


  Note that the unary + operator also removes 
  type affinity from
  an expression, and in some cases this can cause subtle changes in
  the meaning of an expression.
  In the example above,
  if column x has TEXT affinity
  then the comparison "x=5" will be done as text.  The + operator
  removes the affinity.  So the comparison "+x=5" will compare the text
  in column x with the numeric value 5 and will always be false.optoverview.html#disqualifying_where_clause_terms_using_unary_‘!•ôd     SU KqThe SQLite Query Optimizer Overview8. Choosing Between Multiple IndexesEach table in the FROM clause of a query can use at most one index
  (except when the OR-clause optimization comes into
  play)
  and SQLite strives to use at least one index on each table.  Sometimes,
  two or more indexes might be candidates for use on a single table.
  For example:

CREATE TABLE ex2(x,y,z);
CREATE INDEX ex2i1 ON ex2(x);
CREATE INDEX ex2i2 ON ex2(y);
SELECT z FROM ex2 WHERE x=5 AND y=6;


  For the SELECT statement above, the optimizer can use the ex2i1 index
  to lookup rows of ex2 that contain x=5 and then test each row against
  the y=6 term.  Or it can use the ex2i2 index to lookup rows
  of ex2 that contain y=6 then test each of those rows against the
  x=5 term.


  When faced with a choice of two or more indexes, SQLite tries to estimate
  the total amount of work needed to perform the query using each option.
  It then selects the option that gives the least estimated work.


  To help the optimizer get a more accurate estimate of the work involved
  in using various indexes, the user may optionally run the ANALYZE command.
  The ANALYZE command scans all indexes of database where there might
  be a choice between two or more indexes and gathers statistics on the
  selectiveness of those indexes.  The statistics gathered by
  this scan are stored in special database tables names shows names all
  begin with "sqlite_stat".
  The content of these tables is not updated as the database
  changes so after making significant changes it might be prudent to
  rerun ANALYZE.
  The results of an ANALYZE command are only available to database connections
  that are opened after the ANALYZE command completes.


  The various sqlite_statN tables contain information on how
  selective the various indexes are.  For example, the sqlite_stat1
  table might indicate that an equality constraint on column x reduces the
  search space to 10 rows on average, whereas an equality constraint on
  column y reduces the search space to 3 rows on average.  In that case,
  SQLite would prefer to use index ex2i2 since that index is more selective.optoverview.html#choosing_between_multiple_indexes
¸åŒ¸‡O•ôh     SAQ[The SQLite Query Optimizer Overview10. ORDER BY OptimizationsSQLite attempts to use an index to satisfy the ORDER BY clause of a
  query when possible.
  When faced with the choice of using an index to satisfy WHERE clause
  constraints or satisfying an ORDER BY clause, SQLite does the same
  cost analysis described above
  and chooses the index that it believes will result in the fastest answer.


  SQLite will also attempt to use indexes to help satisfy GROUP BY clauses
  and the DISTINCT keyword.  If the nested loops of the join can be arranged
  such that rows that are equivalent for the GROUP BY or for the DISTINCT are
  consecutive, then the GROUP BY or DISTINCT logic can determine if the 
  current row is part of the same group or if the current row is distinct
  simply by comparing the current row to the previous row.
  This can be much faster than the alternative of comparing each row to
  all prior rows.optoverview.html#order_by_optimizations†T•ôg   S3‹uOThe SQLite Query Optimizer Overview9. Covering IndexesWhen doing an indexed lookup of a row, the usual procedure is to
  do a binary search on the index to find the index entry, then extract
  the rowid from the index and use that rowid to do a binary search on
  the original table.  Thus a typical indexed lookup involves two
  binary searches.
  If, however, all columns that were to be fetched from the table are
  already available in the index itself, SQLite will use the values
  contained in the index and will never look up the original table
  row.  This saves one binary search for each row and can make many
  queries run twice as fast.


  When an index contains all of the data needed for a query and when the
  original table never needs to be consulted, we call that index a
  "covering index".optoverview.html#covering_indexes•ôf       S1ŸIThe SQLite Query Optimizer Overview8.2. Range QueriesConsider a slightly different scenario:

CREATE TABLE ex2(x,y,z);
CREATE INDEX ex2i1 ON ex2(x);
CREATE INDEX ex2i2 ON ex2(y);
SELECT z FROM ex2 WHERE x BETWEEN 1 AND 100 AND y BETWEEN 1 AND 100;


  Further suppose that column x contains values spread out
  between 0 and 1,000,000 and column y contains values
  that span between 0 and 1,000.  In that scenario,
  the range constraint on column x should reduce the search space by
  a factor of 10,000 whereas the range constraint on column y should
  reduce the search space by a factor of only 10.  So the ex2i1 index
  should be preferred.


  SQLite will make this determination, but only if it has been compiled
  with SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4.
  The SQLITE_ENABLE_STAT3 and SQLITE_ENABLE_STAT4 options causes
  the ANALYZE command to collect a histogram of column content in the
  sqlite_stat3 or sqlite_stat4 tables and to use this histogram to 
  make a better guess at the best query to use for range constraints
  such as the above.  The main difference between STAT3 and STAT4 is
  that STAT3 records histogram data for only the left-most column of
  an index whereas STAT4 records histogram data for all columns of an
  index.  For single-column indexes, STAT3 and STAT4 work the same.


  The histogram data is only useful if the right-hand side of the constraint
  is a simple compile-time constant or parameter and not an expression.


  Another limitation of the histogram data is that it only applies to the
  left-most column on an index.  Consider this scenario:

CREATE TABLE ex3(w,x,y,z);
CREATE INDEX ex3i1 ON ex2(w, x);
CREATE INDEX ex3i2 ON ex2(w, y);
SELECT z FROM ex3 WHERE w=5 AND x BETWEEN 1 AND 100 AND y BETWEEN 1 AND 100;


  Here the inequalities are on columns x and y which are not the
  left-most index columns.  Hence, the histogram data which is collected no
  left-most column of indexes is useless in helping to choose between the
  range constraints on columns x and y.optoverview.html#range_queries
¯Ï ݯ)•ôk       S=Ÿ
WThe SQLite Query Optimizer Overview12. Subquery Co-routinesPrior to SQLite 3.7.15 (2012-12-12),
  a subquery in the FROM clause would be
  either flattened into the outer query, or else the subquery would be run
  to completion
  before the outer query started, the result set from the subquery
  would be stored in a transient table,
  and then the transient table would be used in the outer query.  Newer
  versions of SQLite have a third option, which is to implement the subquery
  using a co-routine.


  A co-routine is like a subroutine in that it runs in the same thread
  as the caller and eventually returns control back to the caller.  The
  difference is that a co-routine also has the ability to return
  before it has finished, and then resume where it left off the next
  time it is called.


  When a subquery is implemented as a co-routine, byte-code is generated
  to implement the subquery as if it were a standalone query, except
  instead of returning rows of results back to the application, the
  co-routine yields control back to the caller after each row is computed.
  The caller can then use that one computed row as part of its computation,
  then invoke the co-routine again when it is ready for the next row.


  Co-routines are better than storing the complete result set of the subquery
  in a transient table because co-routines use less memory.  With a co-routine,
  only a single row of the result needs to be remembered, whereas all rows of
  the result must be stored for a transient table.  Also, because the
  co-routine does not need to run to completion before the outer query
  begins its work, the first rows of output can appear much sooner, and if
  the overall query is aborted, less work is done overall.


  On the other hand, if the result of the subquery must be scanned multiple
  times (because, for example, it is just one table in a join) then it
  is better to use a transient table to remember the entire result of the
  subquery, in order to avoid computing the subquery more than once.optoverview.html#subquery_co_routines 6•ôj  S;¿+UThe SQLite Query Optimizer Overview11. Subquery FlatteningWhen a subquery occurs in the FROM clause of a SELECT, the simplest
  behavior is to evaluate the subquery into a transient table, then run
  the outer SELECT against the transient table.  Such a plan
  can be suboptimal since the transient table will not have any indexes
  and the outer query (which is likely a join) will be forced to do a
  full table scan on the transient table.


  To overcome this problem, SQLite œˆ,•ôi    SMŽwcThe SQLite Query Optimizer Overview10.1. Partial ORDER BY via IndexIf a query contains an ORDER BY clause with multiple terms, it might
  be that SQLite can use indexes to cause rows to come out in the order
  of some prefix of the terms in the ORDER BY but that later terms in
  the ORDER BY are not satisfied.  In that case, SQLite does block sorting.
  Suppose the ORDER BY clause has four terms and the natural order of the
  query results in rows appearing in order of the first two terms.  As
  each row is output by the query engine and enters the sorter, the 
  outputs in the current row corresponding to the first two terms of 
  the ORDER BY are compared against the previous row.  If they have
  changed, the current sort is finished and output and a new sort is
  started.  This results in a slightly faster sort.  Event bigger
  advantages are that many fewer rows need to be held in memory,
  reducing memory requirements, and outputs can begin to appear before
  the core query has run to completion.optoverview.html#partial_order_by_via_indexattempts to flatten subqueries in
  the FROM clause of a SELECT.
  This involves inserting the FROM clause of the subquery into the
  FROM clause of the outer query and rewriting expressions in
  the outer query that refer to the result set of the subquery.
  For example:

SELECT t1.a, t2.b FROM t2, (SELECT x+y AS a FROM t1 WHERE z&lt;100) WHERE a&gt;5


  Would be rewritten using query flattening as:

SELECT t1.x+t1.y AS a, t2.b FROM t2, t1 WHERE z&lt;100 AND a&gt;5


  There is a long list of conditions that must all be met in order for
  query flattening to occur.  Some of the constraints are marked as 
  obsolete by italic text.  These extra constraints are retained in the
  documentation to preserve the numbering of the other constraints.


  Casual readers are not expected to understand all of these rules.
  A key take-away from this section is that the rules for determining
  if query flatting is safe or unsafe are subtle and
  complex.  There have been multiple bugs over the years caused by
  over-aggressive query flattening.  On the other hand, performance
  of complex queries and/or queries involving views tends to suffer
  if query flattening is more conservative.


  
    (Obsolete.  Query flattening is no longer
                      attempted for aggregate subqueries.)

    (Obsolete.  Query flattening is no longer
                      attempted for aggregate subqueries.)

  
  If the subquery is the right operand of a LEFT JOIN then
    the subquery may not be a join, and
    the FROM clause of the subquery may
   not contain a virtual table, and
    the outer query may not be an aggregate.

    The subquery is not DISTINCT.

   (Subsumed into constraint 4)

   (Obsolete.  Query flattening is no longer
                      attempted for aggregate subqueries.)

  
  The subquery has a FROM clause.

  
  The subquery does not use LIMIT or the outer query is not a join.

  
  The subquery does not use LIMIT or the outer query does not use
  aggregates.

   (Restriction relaxed in 2005)

  
  The subquery and the outer query do not both have ORDER BY clauses.

   (Subsumed into constraint 3)

    The subquery and outer query do not both use LIMIT.

    The subquery does not use OFFSET.

  
  If the outer query is part of a compound select, then the
  subquery may not have a LIMIT clause.

  
  If the outer query is an aggregate, then the subquery may
  not contain ORDER BY. 

  
  If the sub-query is a compound SELECT, then
  
   all compound operators must be UNION ALL, and
   no terms with the subquery compound may be aggregate
       or DISTINCT, and
   every term within the subquery must have a FROM clause, and
   the outer query may not be an aggregate, DISTINCT query, or join.
  

  The parent and sub-query may contain WHERE clauses. Subject to
  rules (11), (12) and (13), they may also contain ORDER BY,
  LIMIT and OFFSET clauses.

  
  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.

  
  If the subquery uses LIMIT then the outer query may not
  have a WHERE clause.

  
  If the sub-query is a compound select, then it must not use
   an ORDER BY clause.

  
  If the subquery uses LIMIT, then the outer query may not be
  DISTINCT.

   The subquery may not be a recursive CTE.

   (Subsumed into constraint 17d.)

   (Obsolete. Query flattening is no longer
                      attempted for aggregate subqueries.)
  



  Query flattening is an important optimization when views are used as
  each use of a view is translated into a subquery.optoverview.html#subquery_flattening
ŽŽƒ•ôm     SE„7_The SQLite Query Optimizer Overview13. The MIN/MAX OptimizationQueries that contain a single MIN() or MAX() aggregate function whose
  argument is the left-most column of an index might be satisfied
  by doing a single index lookup rather than by scanning the entire table.
  Examples:

SELECT MIN(x) FROM table;
SELECT MAX(x)+1 FROM table;optoverview.html#the_min_max_optimizationb•ôlSœkThe SQLite Query Optimizer Overview12.1. Using Co-routines to Defer Work until after the SortingAs of SQLite version 3.21.0 (2017-10-24), the query planner will
  always prefer to use a co-routine to implement FROM-clause subqueries 
  that contains an ORDER BY clause and that are not part of a join when
  the result set of the outer query is "complex".  This feature allows
  applications to shift expensive computations from before the
  sorter until after the sorter, which can result in faster operation.
  For example, consider this query:

SELECT expensive_function(a) FROM tab ORDER BY date DESC LIMIT 5;


  The goal of this query is to compute some value for the five most
  recent entries in the table.  In the query above, the
  "expensive_function()" is invoked prior to the sort and thus is
  invoked on every row of the table, even
  rows that are ultimately omitted due to the LIMIT clause.
  A co-routine can be used to work around this:

SELECT expensive_function(a) FROM (
  SELECT a FROM tab ORDER BY date DESC LIMIT 5
);


  In the revised query, the subquery implemented by a co-routine computes
  the five most recent values for "a".  Those five values are passed from the
  co-routine up into the outer query where the "expensive_function()" is
  invoked on only the specific rows that the application cares about.


  The query planner in future versions of SQLite might grow smart enough
  to make transformations such as the above automatically, in both directions.
  That is to say, future versions of SQLite might transform queries of the
  first form into the second, or queries written the second way into the
  first.  As of SQLite version 3.22.0 (2018-01-22), the query planner
  will flatten the subquery if the outer query does not make use of any
  user-defined functions or subqueries in its result set.  For the examples
  shown above, however, SQLite implements each of the queries as
  written.optoverview.html#using_co_routines_to_defer_work_until_after_the_sorting
””˜g•ôn    S7°QThe SQLite Query Optimizer Overview14. Automatic IndexesWhen no indexes are available to aid the evaluation of a query, SQLite
  might create an automatic index that lasts only for the duration
  of a single SQL statement.
  Since the cost of constructing the automatic index is
  O(NlogN) (where N is the number of entries in the table) and the cost of
  doing a full table scan is only O(N), an automatic index will
  only be created if SQLite expects that the lookup will be run more than
  logN times during the course of the SQL statement. Consider an example:

CREATE TABLE t1(a,b);
CREATE TABLE t2(c,d);
-- Insert many rows into both t1 and t2
SELECT * FROM t1, t2 WHERE a=c;


  In the query above, if both t1 and t2 have approximately N rows, then
  without any indexes the query will require O(N*N) time.  On the other
  hand, creating an index on table t2 requires O(NlogN) time and using
  that index to evaluate the query requires an additional O(NlogN) time.
  In the absence of ANALYZE information, SQLite guesses that N is one
  million and hence it believes that constructing the automatic index will
  be the cheaper approach.


  An automatic index might also be used for a subquery:

CREATE TABLE t1(a,b);
CREATE TABLE t2(c,d);
-- Insert many rows into both t1 and t2
SELECT a, (SELECT d FROM t2 WHERE c=b) FROM t1;


  In this example, the t2 table is used in a subquery to translate values
  of the t1.b column.  If each table contains N rows, SQLite expects that
  the subquery will run N times, and hence it will believe it is faster
  to construct an automatic, transient index on t2 first and then use
  that index to satisfy the N instances of the subquery.


  The automatic indexing capability can be disabled at run-time using
  the automatic_index pragma.  Automatic indexing is turned on by
  default, but this can be changed so that automatic indexing is off
  by default using the SQLITE_DEFAULT_AUTOMATIC_INDEX compile-time option.
  The ability to create automatic indexes can be completely disabled by
  compiling with the SQLITE_OMIT_AUTOMATIC_INDEX compile-time option.


  In SQLite version 3.8.0 (2013-08-26) and later, 
  an SQLITE_WARNING_AUTOINDEX message is sent
  to the error log every time a statement is prepared that uses an
  automatic index.  Application developers can and should use these warnings
  to identify the need for new persistent indexes in the schema.


  Do not confuse automatic indexes with the internal indexes (having names
  like "sqlite_autoindex_table_N") that are sometimes
  created to implement a PRIMARY KEY constraint or UNIQUE constraint.
  The automatic indexes described here exist only for the duration of a
  single query, are never persisted to disk, and are only visible to a
  single database connection.  Internal indexes are part of the implementation
  of PRIMARY KEY and UNIQUE constraints, are long-lasting and persisted
  to disk, and are visible to all database connections.  The term "autoindex"
  appears in the names of internal indexes for legacy reasons and does
  not indicate that internal indexes and automatic indexes are related.optoverview.html#automatic_indexes
EýE‹3•ôp  SI•  cThe SQLite Query Optimizer Overview15. The Push-Down OptimizationIf a subquery cannot be flattened into the outer query, it might
  still be possible to enhance performance by "pushing down" WHERE clause
  terms from the outer query into the subquery.  Consider an example:

CREATE TABLE t1(a INT, b INT);
CREATE TABLE t2(x INT, y INT);
CREATE VIEW v1(a,b) AS SELECT DISTINCT a, b FROM t1;

SELECT x, y, b
  FROM t2 JOIN v1 ON (x=a)
 WHERE b BETWEEN 10 AND 20;



  The view v1 cannot be flattened because it is DISTINCT.  It must
  instead be run as a subquery with the results being stored in a
  transient table, then the join is performed between t2 and the
  transient table.  The push-down optimization pushes down the
  "b BETWEEN 10 AND 20" term into the view.  This makes the transient
  table smaller, and helps the subquery to run faster if there
  is an index on t1.b.  The resulting evaluation is like this:

SELECT x, y, b
  FROM t2
  JOIN (SELECT DISTINCT a, b FROM t1 WHERE b BETWEEN 10 AND 20)
 WHERE b BETWEEN 10 AND 20;



  The push-down optimization cannot always be used.  For example,
  if the subquery contains a LIMIT, then pushing down any part of
  the WHERE clause from the outer query could change the result of
  the inner query.  There are other restrictions, explained in a
  comment in the source code on the pushDownWhereTerms() routine
  that implements this optimization.optoverview.html#the_push_down_optimization‡~•ôo    S-Ž[CThe SQLite Query Optimizer Overview14.1. Hash JoinsAn automatic index is about the same thing as a
 hash join.  The only difference
 is that a B-Tree is used instead of a hash table.  If you are willing to
 say that the transient B-Tree constructed for an automatic index is
 really just a fancy hash table, then a query that uses an automatic
 index is just a hash join.


 SQLite constructs an transient index instead of a hash table in this
 instance because it already has a robust and high performance B-Tree
 implementation at hand, whereas a hash-table would need to be added.
 Adding a separate hash table implementation to handle this one case
 would increase the size of the library (which is designed for use on
 low-memory embedded devices) for minimal performance gain.  SQLite might
 be enhanced with a hash-table implementation someday, but for now it seems
 better to continue using automatic indexes in cases where client/server
 database engines might use a hash join.optoverview.html#hash_joins
7     1(7‡l•ôs     S_OyThe SQLite Query Optimizer Overview18. The Constant Propagation OptimizationWhen a WHERE clause contains two or more equality constraints connected
  by the AND operator such that all of the affinities of the various
  constraints are the same, then SQLite might use the transitive property
  of equality to construct new "virtual" constraints that can be used to
  simplify expressions and/or improve performance.  This is called the
  "constant-propagation optimization".


  For example, consider the following schema and query:

CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c INT);
SELECT * FROM t1 WHERE a=b AND b=5;



  SQLite looks at the "a=b" and "b=5" constraints and deduces that
  if those two constraints are true, then it must also be the case
  that "a=5" is true.  This means that the desired row can be looked up
  quickly using a value of 5 for the INTEGER PRIMARY KEY.
This page last modified on  2022-09-19 12:27:16 UTCoptoverview.html#the_constant_propagation_optimizationŠ•ôr  SS’mThe SQLite Query Optimizer Overview17. The Omit LEFT JOIN OptimizationSometimes a LEFT JOIN can be completely omitted from a query without
  changing the result.  This can happen if all of the following are
  true:


  
   The query is not an aggregate
   Either the query is DISTINCT or else the ON or USING clause
       on the LEFT JOIN constrains the join such that it matches
       only a single row
   The right-hand table of the LEFT JOIN is not be used anywhere
       in the query outside of its own USING or ON clause.
  


  LEFT JOIN elimination often comes up when LEFT JOINs are used
  inside of views, and then the view is used in such as way that
  none of the columns of the right-hand table of the LEFT JOIN are
  referenced.


  Here is a simple example of omitting a LEFT JOIN:

CREATE TABLE t1(ipk INTEGER PRIMARY KEY, v1);
CREATE TABLE t2(ipk INTEGER PRIMARY KEY, v2);
CREATE TABLE t3(ipk INTEGER PRIMARY KEY, v3);

SELECT v1, v3 FROM t1 
  LEFT JOIN t2 ON (t1.ipk=t2.ipk)
  LEFT JOIN t3 ON (t1.ipk=t3.ipk)



  The t2 table is completely unused in the query above, and so the
  query planner is able to implement the query as if it were written:

SELECT v1, v3 FROM t1 
  LEFT JOIN t3 ON (t1.ipk=t3.ipk)optoverview.html#the_omit_left_join_optimizationJ•ôq
So˜i        The SQLite Query Optimizer Overview16. The LEFT JOIN Strength Reduction OptimizationA LEFT JOIN can sometimes be converted into an ordinary JOIN
  if there are terms in the WHERE clause that guarantee that the
  two joins will give identical results.  In particular, if any
  column in the right-hand table of the LEFT JOIN must be non-NULL
  in order for the WHERE clause to be true, then the LEFT JOIN is
  demoted to an ordinary JOIN.


  The prover that determines whether any column of the right-hand
  table of a LEFT JOIN must be non-NULL in the WHERE clause is
  imperfect.  It sometimes returns a false negative.  In other words,
  it sometimes fails to reduce the strength of a LEFT JOIN when doing
  so was in fact possible.  For example, the prover does not know
  the datetime() SQL function will always return NULL if its first
  argument is NULL, and so it will not recognize that the LEFT JOIN
  in the following query could be strength-reduced:

SELECT urls.url
  FROM urls
  LEFT JOIN
    (SELECT *
      FROM (SELECT url_id AS uid, max(retrieval_time) AS rtime
              FROM lookups GROUP BY 1 ORDER BY 1)
      WHERE uid IN (358341,358341,358341)
    ) recent
    ON u.source_seed_id = recent.xyz OR u.url_id = recent.xyz
 WHERE
     DATETIME(recent.rtime) > DATETIME('now', '-5 days');



  It is possible that future enhancements to the prover might enable it
  to recognize that NULL inputs to certain built-in functions
  always result in a NULL answer.  However, not all built-in
  functions have that property (for example coalesce()) and, of
  course, the prover will never be able to reason about
  application-defined SQL functions.optoverview.html#the_left_join_strength_reduction_optimization
u™´u‚:•üC    WKƒ#QThe Virtual Table Mechanism Of SQLite1.1.1. Temporary virtual tablesThere is no "CREATE TEMP VIRTUAL TABLE" statement.  To create a
temporary virtual table, add the "temp" schema
before the virtual table name.

CREATE VIRTUAL TABLE temp.tablename USING module(arg1, ...);vtab.html#temporary_virtual_tables‹`•üB     W!–?+The Virtual Table Mechanism Of SQLite1.1. UsageA virtual table is created using a CREATE VIRTUAL TABLE statement.

create-virtual-table-stmt:
hide
 
 




The CREATE VIRTUAL TABLE statement creates a new table
called table-name derived from the class
module-name.  The module-name
is the name that is registered for the virtual table by
the sqlite3_create_module() interface.

CREATE VIRTUAL TABLE tablename USING modulename;


One can also provide comma-separated arguments to the module following 
the module name:

CREATE VIRTUAL TABLE tablename USING modulename(arg1, arg2, ...);


The format of the arguments to the module is very general. Each 
module-argument
may contain keywords, string literals, identifiers, numbers, and 
punctuation. Each module-argument is passed as 
written (as text) into the
constructor method of the virtual table implementation 
when the virtual 
table is created and that constructor is responsible for parsing and 
interpreting the arguments. The argument syntax is sufficiently general 
that a virtual table implementation can, if it wants to, interpret its
arguments as column definitions in an ordinary CREATE TABLE statement. 
The implementation could also impose some other interpretation on the 
arguments.

Once a virtual table has been created, it can be used like any other 
table with the exceptions noted above and imposed by specific virtual
table implementations. A virtual table is destroyed using the ordinary
DROP TABLE syntax.vtab.html#usageb•üA  W+ +9The Virtual Table Mechanism Of SQLite1. IntroductionA virtual table is an object that is registered with an open SQLite
database connection. From the perspective of an SQL statement,
the virtual table object looks like any other table or view. 
But behind the scenes, queries and updates on a virtual table
invoke callback methods of the virtual table object instead of
reading and writing on the database file.

The virtual table mechanism allows an application to publish
interfaces that are accessible from SQL statements as if they were
tables. SQL statements can do almost anything to a
virtual table that they can do to a real table, with the following
exceptions:



 One cannot create a trigger on a virtual table.
 One cannot create additional indices on a virtual table. 
     (Virtual tables can have indices but that must be built into
     the virtual table implementation.  Indices cannot be added
     separately using CREATE INDEX statements.)
 One cannot run ALTER TABLE ... ADD COLUMN
     commands against a virtual table.


Individual virtual table implementations might impose additional
constraints. For example, some virtual implementations might provide
read-only tables. Or some virtual table implementations might allow
INSERT or DELETE but not UPDATE.  Or some virtual table implementations
might limit the kinds of UPDATEs that can be made.

A virtual table might represent an in-memory data structures. 
Or it might represent a view of data on disk that is not in the
SQLite format. Or the application might compute the content of the 
virtual table on demand.

Here are some existing and postulated uses for virtual tables:


 A full-text search interface
 Spatial indices using R-Trees
 Introspect the disk content of an SQLite database file
     (the dbstat virtual table)
 Read and/or write the content of a comma-separated value (CSV)
     file
 Access the filesystem of the host computer as if it were a database table
 Enabling SQL manipulation of data in statistics packages like R


See the list of virtual tables page for a longer list of actual
virtual table implementations.vtab.html#introduction
©
©…S•üE        WU‰A[The Virtual Table Mechanism Of SQLite1.1.3. Eponymous-only virtual tablesIf the xCreate method is NULL, then
CREATE VIRTUAL TABLE statements are prohibited for that virtual table,
and the virtual table is an "eponymous-only virtual table".
Eponymous-only virtual tables are useful as 
table-valued functions.


Note that prior to version 3.9.0 (2015-10-14), 
SQLite did not check the xCreate method
for NULL before invoking it.  So if an eponymous-only virtual table is
registered with SQLite version 3.8.11.1 (2015-07-29)
or earlier and a CREATE VIRTUAL TABLE
command is attempted against that virtual table module, a jump to a NULL
pointer will occur, resulting in a crash.vtab.html#eponymous_only_virtual_tablesŠz•üD   WK”#QThe Virtual Table Mechanism Of SQLite1.1.2. Eponymous virtual tablesSome virtual tables exist automatically in the "main" schema of
every database connection in which their
module is registered, even without a CREATE VIRTUAL TABLE statement.
Such virtual tables are called "eponymous virtual tables".
To use an eponymous virtual table, simply use the 
module name as if it were a table.
Eponymous virtual tables exist in the "main" schema only, so they will
not work if prefixed with a different schema name.

An example of an eponymous virtual table is the dbstat virtual table.
To use the dbstat virtual table as an eponymous virtual table, 
simply query against the "dbstat"
module name, as if it were an ordinary table.  (Note that SQLite
must be compiled with the SQLITE_ENABLE_DBSTAT_VTAB option to include
the dbstat virtual table in the build.)

SELECT * FROM dbstat;


A virtual table is eponymous if its xCreate method is the exact same
function as the xConnect method, or if the xCreate method is NULL.
The xCreate method is called when a virtual table is first created
using the CREATE VIRTUAL TABLE statement.  The xConnect method 
is invoked whenever
a database connection attaches to or reparses a schema. When these two methods
are the same, that indicates that the virtual table has no persistent
state that needs to be created and destroyed.vtab.html#eponymous_virtual_tables3_vtab_cursor {
  sqlite3_vtab *pVtab;
};


Once again, practical implementations will likely subclass this 
structure to add additional private fields.

The sqlite3_index_info structure is used to pass information into
and out of the xBestIndex method of the module that implements a 
virtual table.

Before a CREATE VIRTUAL TABLE statement can be run, the module 
specified in that statement must be registered with the database 
connection. This is accomplished using either of the sqlite3_create_module()
or sqlite3_create_module_v2() interfaces:

int sqlite3_create_module(
  sqlite3 *db,               /* SQLite connection to register module with */
  const char *zName,         /* Name of the module */
  const sqlite3_module *,    /* Methods for the module */
  void *                     /* Client data for xCreate/xConnect */
);
int sqlite3_create_module_v2(
  sqlite3 *db,               /* SQLite connection to register module with */
  const char *zName,         /* Name of the module */
  const sqlite3_module *,    /* Methods for the module */
  void *,                    /* Client data for xCreate/xConnect */
  void(*xDestroy)(void*)     /* Client data destructor function */
);


The sqlite3_create_module() and sqlite3_create_module_v2()
routines associates a module name with 
an sqlite3_module structure and a separate client data that is specific 
to each module.  The only difference between the two create_module methods
is that the _v2 method includes an extra parameter that specifies a
destructor for client data pointer.  The module structure is what defines
the behavior of a virtual table.  The module structure looks like this:


struct sqlite3_module {
  int iVersion;
  int (*xCreate)(sqlite3*, void *pAux,
               int argc, char *const*argv,
               sqlite3_vtab **ppVTab,
               char **pzErr);
  int (*xConnect)(sqlite3*, void *pAux,
               int argc, char *const*argv,
               sqlite3_vtab **ppVTab,
               char **pzErr);
  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*, sqlite_int64 *pRowid);
  int (*xUpdate)(sqlite3_vtab *, int, sqlite3_value **, sqlite_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*);
};


The module structure defines all of the methods for each virtual 
table object. The module structure also contains the iVersion field which
defines the particular edition of the module table structure. Currently, 
iVersion is always 3 or less, but in future releases of SQLite the module
structure definition might be extended with additional methods and in 
that case the maximum iVersion value will be increased.

The rest of the module structure consists of methods used to implement
various features of the virtual table. Details on what each of these 
methods do are provided in the sequel.vtab.html#implementation
0„•üG       WU†U_The Virtual Table Mechanism Of SQLite1.3. Virtual Tables And Shared CachePrior to SQLite version 3.6.17 (2009-08-10), 
the virtual table mechanism assumes 
that each database connection kept
its own copy of the database schema. Hence, the virtual table mechanism
could not be used in a database that has shared cache mode enabled. 
The sqlite3_create_module() interface would return an error if 
shared cache mode is enabled.  That restriction was relaxed
beginning with SQLite version 3.6.17.vtab.html#virtual_tables_and_shared_cache³C•üF     W3åa=The Virtual Table Mechanism Of SQLite1.2. ImplementationSeveral new C-level objects are used by the virtual table implementation:

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;


The sqlite3_module structure defines a module object used to implement
a virtual table. Think of a module as a class from which one can 
construct multiple virtual tables having similar properties. For example,
one might have a module that provides read-only access to 
comma-separated-value (CSV) files on disk. That one module can then be
used to create several virtual tables where each virtual table refers
to a different CSV file.

The module structure contains methods that are invoked by SQLite to
perform various actions on the virtual table such as creating new
instances of a virtual table or destroying old ones, reading and
writing data, searching for and deleting, updating, or inserting rows. 
The module structure is explained in more detail below.

Each virtual table instance is represented by an sqlite3_vtab structure. 
The sqlite3_vtab structure looks like this:

struct sqlite3_vtab {
  const sqlite3_module *pModule;
  int nRef;
  char *zErrMsg;
};


Virtual table implementations will normally subclass this structure 
to add additional private and implementation-specific fields. 
The nRef field is used internally by the SQLite core and should not 
be altered by the virtual table implementation. The virtual table 
implementation may pass error message text to the core by putting 
an error message string in zErrMsg.
Space to hold this error message string must be obtained from an
SQLite memory allocation function such as sqlite3_mprintf() or
sqlite3_malloc().
Prior to assigning a new value to zErrMsg, the virtual table 
implementation must free any preexisting content of zErrMsg using 
sqlite3_free(). Failure to do this will result in a memory leak. 
The SQLite core will free and zero the content of zErrMsg when it 
delivers the error message text to the client application or when 
it destroys the virtual table. The virtual table implementation only 
needs to worry about freeing the zErrMsg content when it overwrites 
the content with a new, different error message.

The sqlite3_vtab_cursor structure represents a pointer to a specific
row of a virtual table. This is what an sqlite3_vtab_cursor looks like:

struct sqlite£
7
S87‰|•üJ    W[’aThe Virtual Table Mechanism Of SQLite2.1.1. Hidden columns in virtual tablesIf a column datatype contains the special keyword "HIDDEN"
(in any combination of upper and lower case letters) then that keyword
it is omitted from the column datatype name and the column is marked 
as a hidden column internally. 
A hidden column differs from a normal column in three respects:



 Hidden columns are not listed in the dataset returned by 
     "PRAGMA table_info",
 Hidden columns are not included in the expansion of a "*"
     expression in the result set of a SELECT, and
 Hidden columns are not included in the implicit column-list 
     used by an INSERT statement that lacks an explicit column-list. 


For example, if the following SQL is passed to sqlite3_declare_vtab():

CREATE TABLE x(a HIDDEN VARCHAR(12), b INTEGER, c INTEGER Hidden);


Then the virtual table would be created with two hidden columns,
and with datatypes of "VARCHAR(12)" and "INTEGER".

An example use of hidden columns can be seen in the FTS3 virtual 
table implementation, where every FTS virtual table
contains an FTS hidden column that is used to pass information from the
virtual table into FTS auxiliary functions and to the FTS MATCH operator.vtab.html#hidden_columns_in_virtual_tables¦•üI        W;ÊgEThe Virtual Table Mechanism Of SQLite2.1. The xCreate Methodint (*xCreate)(sqlite3 *db, void *pAux,
             int argc, char *const*argv,
             sqlite3_vtab **ppVTab,
             char **pzErr);


The xCreate method is called to create a new instance of a virtual table 
in response to a CREATE VIRTUAL TABLE statement.
If the xCreate method is the same pointer as the xConnect method, then the
virtual table is an eponymous virtual table.
If the xCreate method is omitted (if it is a NULL pointer) then the virtual 
table is an eponymous-only virtual table.


The db parameter is a pointer to the SQLite database connection that 
is executing the CREATE VIRTUAL TABLE statement. 
The pAux argument is the copy of the client data pointer that was the 
fourth argument¦‹(•üH        Wk”;uThe Virtual Table Mechanism Of SQLite1.4. Creating New Virtual Table ImplementationsFollow these steps to create your own virtual table:



 Write all necessary methods.
 Create an instance of the sqlite3_module structure containing pointers
     to all the methods from step 1.
 Register your sqlite3_module structure using one of the
     sqlite3_create_module() or sqlite3_create_module_v2() interfaces.
 Run a CREATE VIRTUAL TABLE command that specifies the new module in 
     the USING clause. 


The only really hard part is step 1. You might want to start with an 
existing virtual table implementation and modify it to suit your needs.
The SQLite source tree
contains many virtual table implementations that are suitable for copying,
including:



 templatevtab.c
&rarr; A virtual table created specifically to serve as a template for
other custom virtual tables.
 series.c
&rarr; Implementation of the generate_series() table-valued function.
 json.c &rarr;
Contains the sources for the json_each() and json_tree() table-valued
functions.
 csv.c &rarr;
A virtual table that reads CSV files.



There are many other virtual table implementations
in the SQLite source tree that can be used as examples.  Locate 
these other virtual table implementations by searching 
for "sqlite3_create_module".

You might also want to implement your new virtual table as a 
loadable extension.vtab.html#creating_new_virtual_table_implementations to the sqlite3_create_module() or
sqlite3_create_module_v2() call that registered the 
virtual table module. 
The argv parameter is an array of argc pointers to null terminated strings. 
The first string, argv[0], is the name of the module being invoked.   The
module name is the name provided as the second argument to 
sqlite3_create_module() and as the argument to the USING clause of the
CREATE VIRTUAL TABLE statement that is running.
The second, argv[1], is the name of the database in which the new virtual 
table is being created. The database name is "main" for the primary database, or
"temp" for TEMP database, or the name given at the end of the ATTACH
statement for attached databases.  The third element of the array, argv[2], 
is the name of the new virtual table, as specified following the TABLE
keyword in the CREATE VIRTUAL TABLE statement.
If present, the fourth and subsequent strings in the argv[] array report 
the arguments to the module name in the CREATE VIRTUAL TABLE statement.

The job of this method is to construct the new virtual table object
(an sqlite3_vtab object) and return a pointer to it in *ppVTab.

As part of the task of creating a new sqlite3_vtab structure, this 
method must invoke sqlite3_declare_vtab() to tell the SQLite 
core about the columns and datatypes in the virtual table. 
The sqlite3_declare_vtab() API has the following prototype:

int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable)


The first argument to sqlite3_declare_vtab() must be the same 
database connection pointer as the first parameter to this method.
The second argument to sqlite3_declare_vtab() must a zero-terminated 
UTF-8 string that contains a well-formed CREATE TABLE statement that 
defines the columns in the virtual table and their data types. 
The name of the table in this CREATE TABLE statement is ignored, 
as are all constraints. Only the column names and datatypes matter.
The CREATE TABLE statement string need not to be 
held in persistent memory.  The string can be
deallocated and/or reused as soon as the sqlite3_declare_vtab()
routine returns.

The xConnect method can also optionally request special features
for the virtual table by making one or more calls to
the sqlite3_vtab_config() interface:

int sqlite3_vtab_config(sqlite3 *db, int op, ...);


Calls to sqlite3_vtab_config() are optional.  But for maximum
security, it is recommended that virtual table implementations
invoke "sqlite3_vtab_config(db, SQLITE_VTAB_DIRECTONLY)" if the
virtual table will not be used from inside of triggers or views.

The xCreate method need not initialize the pModule, nRef, and zErrMsg
fields of the sqlite3_vtab object.  The SQLite core will take care of 
that chore.

The xCreate should return SQLITE_OK if it is successful in 
creating the new virtual table, or SQLITE_ERROR if it is not successful.
If not successful, the sqlite3_vtab structure must not be allocated. 
An error message may optionally be returned in *pzErr if unsuccessful.
Space to hold the error message string must be allocated using
an SQLite memory allocation function like 
sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will
attempt to free the space using sqlite3_free() after the error has
been reported up to the application.


If the xCreate method is omitted (left as a NULL pointer) then the
virtual table is an eponymous-only virtual table.  New instances of
the virtual table cannot be created using CREATE VIRTUAL TABLE and the
virtual table can only be used via its module name.
Note that SQLite versions prior to 3.9.0 (2015-10-14) do not understand
eponymous-only virtual tables and will segfault if an attempt is made
to CREATE VIRTUAL TABLE on an eponymous-only virtual table because
the xCreate method was not checked for null.


If the xCreate method is the exact same pointer as the xConnect method,
that indicates that the virtual table does not need to initialize backing
store.  Such a virtual table can be used as an eponymous virtual table
or as a named virtual table using CREATE VIRTUAL TABLE or both.vtab.html#the_xcreate_method
Ë
qË‹!•üL       WW”Y]The Virtual Table Mechanism Of SQLite2.1.3.  WITHOUT ROWID Virtual Tables Beginning with SQLite version 3.14.0 (2016-08-08), 
the CREATE TABLE statement that
is passed into sqlite3_declare_vtab() may contain a WITHOUT ROWID clause.
This is useful for cases where the virtual table rows 
cannot easily be mapped into unique integers.  A CREATE TABLE
statement that includes WITHOUT ROWID must define one or more columns as
the PRIMARY KEY.  Every column of the PRIMARY KEY must individually be
NOT NULL and all columns for each row must be collectively unique.

Note that SQLite does not enforce the PRIMARY KEY for a WITHOUT ROWID
virtual table.  Enforcement is the responsibility of the underlying
virtual table implementation.  But SQLite does assume that the PRIMARY KEY
constraint is valid - that the identified columns really are UNIQUE and
NOT NULL - and it uses that assumption to optimize queries against the
virtual table.

The rowid column is not accessible on a
WITHOUT ROWID virtual table (of course).

The xUpdate method was originally designed around having a
ROWID as a single value.  The xUpdate method has been expanded to
accommodate an arbitrary PRIMARY KEY in place of the ROWID, but the
PRIMARY KEY must still be only one column.  For this reason, SQLite
will reject any WITHOUT ROWID virtual table that has more than one
PRIMARY KEY column and a non-NULL xUpdate method.vtab.html#_without_rowid_virtual_tables_‹
•üK     WG”KMThe Virtual Table Mechanism Of SQLite2.1.2. Table-valued functionsA virtual table that contains hidden columns can be used like
a table-valued function in the FROM clause of a SELECT statement.
The arguments to the table-valued function become constraints on 
the HIDDEN columns of the virtual table.

For example, the "generate_series" extension (located in the
ext/misc/series.c
file in the source tree)
implements an eponymous virtual table with the following schema:

CREATE TABLE generate_series(
  value,
  start HIDDEN,
  stop HIDDEN,
  step HIDDEN
);


The sqlite3_module.xBestIndex method in the implementation of this
table checks for equality constraints against the HIDDEN columns, and uses
those as input parameters to determine the range of integer "value" outputs
to generate.  Reasonable defaults are used for any unconstrained columns.
For example, to list all integers between 5 and 50:

SELECT value FROM generate_series(5,50);


The previous query is equivalent to the following:

SELECT value FROM generate_series WHERE start=5 AND stop=50;


Arguments on the virtual table name are matched to hidden columns
in order.  The number of arguments can be less than the
number of hidden columns, in which case the latter hidden columns are
unconstrained.  However, an error results if there are more arguments
than there are hidden columns in the virtual table.vtab.html#table_valued_functions
îî”
•üM       W=¦aGThe Virtual Table Mechanism Of SQLite2.2. The xConnect Methodint (*xConnect)(sqlite3*, void *pAux,
             int argc, char *const*argv,
             sqlite3_vtab **ppVTab,
             char **pzErr);


The xConnect method is very similar to xCreate. 
It has the same parameters and constructs a new sqlite3_vtab structure 
just like xCreate. 
And it must also call sqlite3_declare_vtab() like xCreate.  It
should also make all of the same sqlite3_vtab_config() calls as
xCreate.

The difference is that xConnect is called to establish a new 
connection to an existing virtual table whereas xCreate is called 
to create a new virtual table from scratch.

The xCreate and xConnect methods are only different when the
virtual table has some kind of backing store that must be initialized 
the first time the virtual table is created. The xCreate method creates 
and initializes the backing store. The xConnect method just connects 
to an existing backing store.  When xCreate and xConnect are the same,
the table is an eponymous virtual table.

As an example, consider a virtual table implementation that 
provides read-only access to existing comma-separated-value (CSV)
files on disk. There is no backing store that needs to be created 
or initialized for such a virtual table (since the CSV files already 
exist on disk) so the xCreate and xConnect methods will be identical 
for that module.

Another example is a virtual table that implements a full-text index. 
The xCreate method must create and initialize data structures to hold 
the dictionary and posting lists for that index. The xConnect method,
on the other hand, only has to locate and use an existing dictionary 
and posting lists that were created by a prior xCreate call.

The xConnect method must return SQLITE_OK if it is successful 
in creating the new virtual table, or SQLITE_ERROR if it is not 
successful. If not successful, the sqlite3_vtab structure must not be 
allocated. An error message may optionally be returned in *pzErr if 
unsuccessful. 
Space to hold the error message string must be allocated using
an SQLite memory allocation function like 
sqlite3_malloc() or sqlite3_mprintf() as the SQLite core will
attempt to free the space using sqlite3_free() after the error has
been reported up to the application.

The xConnect method is required for every virtual table implementation, 
though the xCreate and xConnect pointers of the sqlite3_module object
may point to the same function if the virtual table does not need to
initialize backing store.vtab.html#the_xconnect_method.0 and later */
  sqlite3_uint64 colUsed;    /* Input: Mask of columns used by statement */
};


Note the warnings on the "estimatedRows", "idxFlags", and colUsed fields.
These fields were added with SQLite versions 3.8.2, 3.9.0, and 3.10.0, respectively. 
Any extension that reads or writes these fields must first check that the 
version of the SQLite library in use is greater than or equal to appropriate
version - perhaps comparing the value returned from sqlite3_libversion_number()
against constants 3008002, 3009000, and/or 3010000. The result of attempting 
to access these fields in an sqlite3_index_info structure created by an 
older version of SQLite are undefined.

In addition, there are some defined constants:

#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  /* 3.10.0 and later */
#define SQLITE_INDEX_CONSTRAINT_GLOB      66  /* 3.10.0 and later */
#define SQLITE_INDEX_CONSTRAINT_REGEXP    67  /* 3.10.0 and later */
#define SQLITE_INDEX_CONSTRAINT_NE        68  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_ISNOT     69  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_ISNULL    71  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_IS        72  /* 3.21.0 and later */
#define SQLITE_INDEX_CONSTRAINT_LIMIT     73  /* 3.38.0 and later */
#define SQLITE_INDEX_CONSTRAINT_OFFSET    74  /* 3.38.0 and later */
#define SQLITE_INDEX_CONSTRAINT_FUNCTION 150  /* 3.25.0 and later */
#define SQLITE_INDEX_SCAN_UNIQUE           1  /* Scan visits at most 1 row */


Use the sqlite3_vtab_collation() interface to find the name of
the collating sequence that should be used when evaluating the i-th
constraint:

const char *sqlite3_vtab_collation(sqlite3_index_info*, int i);


The SQLite core calls the xBestIndex method when it is compiling a query
that involves a virtual table. In other words, SQLite calls this method 
when it is running sqlite3_prepare() or the equivalent. 
By calling this method, the 
SQLite core is saying to the virtual table that it needs to access 
some subset of the rows in the virtual table and it wants to know the
most efficient way to do that access. The xBestIndex method replies 
with information that the SQLite core can then use to conduct an 
efficient search of the virtual table.

While compiling a single SQL query, the SQLite core might call 
xBestIndex multiple times with different settings in sqlite3_index_info.
The SQLite core will then select the combination that appears to 
give the best performance.

Before calling this method, the SQLite core initializes an instance 
of the sqlite3_index_info structure with information about the
query that it is currently trying to process. This information 
derives mainly from the WHERE clause and ORDER BY or GROUP BY clauses 
of the query, but also from any ON or USING clauses if the query is a 
join. The information that the SQLite core provides to the xBestIndex 
method is held in the part of the structure that is marked as "Inputs". 
The "Outputs" section is initialized to zero.

The information in the sqlite3_index_info structure is ephemeral
and may be overwritten or deallocated as soon as the xBestIndex method
returns.  If the xBestIndex method needs to remember any part of the
sqlite3_index_info structure, it should make a copy.  Care must be
take to store the copy in a place where it will be deallocated, such
as in the idxStr field with needToFreeIdxStr set to 1.

Note that xBestIndex will always be called before xFilter, since
the idxNum and idxStr outputs from xBestIndex are required inputs to
xFilter.  However, there is no guarantee that xFilter will be called
following a successful xBestIndex.

The xBestIndex method is required for every virtual table implementation.vtab.html#the_xbestindex_method
»»²8•üN     WAã/KThe Virtual Table Mechanism Of SQLite2.3. The xBestIndex MethodSQLite uses the xBestIndex method of a virtual table module to determine
the best way to access the virtual table. 
The xBestIndex method has a prototype like this:

int (*xBestIndex)(sqlite3_vtab *pVTab, sqlite3_index_info*);


The SQLite core communicates with the xBestIndex method by filling 
in certain fields of the sqlite3_index_info structure and passing a 
pointer to that structure into xBestIndex as the second parameter. 
The xBestIndex method fills out other fields of this structure which
forms the reply. The sqlite3_index_info structure looks like this:

struct sqlite3_index_info {
  /* Inputs */
  const int nConstraint;     /* Number of entries in aConstraint */
  const 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 */
  } *const aConstraint;      /* Table of WHERE clause constraints */
  const int nOrderBy;        /* Number of terms in the ORDER BY clause */
  const struct sqlite3_index_orderby {
     int iColumn;              /* Column number */
     unsigned char desc;       /* True for DESC.  False for ASC. */
  } *const 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 */
  } *const 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©   FUNCTION( column, EXPR)


In this case the aConstraint[].op value is the same as the value
returned by xFindFunction() for FUNCTION.

The aConstraint[] array contains information about all constraints 
that apply to the virtual table. But some of the constraints might
not be usable because of the way tables are ordered in a join. 
The xBestIndex method must therefore only consider constraints 
that have an aConstraint[].usable flag which is true.

In addition to WHERE clause constraints, the SQLite core also 
tells the xBestIndex method about the ORDER BY clause. 
(In an aggregate query, the SQLite core might put in GROUP BY clause 
information in place of the ORDER BY clause information, but this fact
should not make any difference to the xBestIndex method.) 
If all terms of the ORDER BY clause are columns in the virtual table, 
then nOrderBy will be the number of terms in the ORDER BY clause 
and the aOrderBy[] array will identify the column for each term 
in the order by clause and whether or not that column is ASC or DESC.



In SQLite version 3.10.0 (2016-01-06) and later, 
the colUsed field is available
to indicate which fields of the virtual table are actually used by the
statement being prepared.  If the lowest bit of colUsed is set, that
means that the first column is used.  The second lowest bit corresponds
to the second column.  And so forth.  If the most significant bit of
colUsed is set, that means that one or more columns other than the 
first 63 columns are used.  If column usage information is needed by the
xFilter method, then the required bits must be encoded into either
the output idxNum field or idxStr content.

2.3.1.1. LIKE, GLOB, REGEXP, and MATCH functions

For the LIKE, GLOB, REGEXP, and MATCH operators, the 
aConstraint[].iColumn value is the virtual table column that
is the left operand of the operator.  However, if these operators
are expressed as function calls instead of operators, then
the aConstraint[].iColumn value references the virtual table
column that is the second argument to that function:


LIKE(EXPR, column)
GLOB(EXPR, column)
REGEXP(EXPR, column)
MATCH(EXPR, column)


Hence, as far as the xBestIndex() method is concerned, the following
two forms are equivalent:


column LIKE EXPR
LIKE(EXPR,column)


This special behavior of looking at the second argument of a function
only occurs for the LIKE, GLOB, REGEXP, and MATCH functions.  For all
other functions, the aConstraint[].iColumn value references the first
argument of the function.

This special feature of LIKE, GLOB, REGEXP, and MATCH does not
apply to the xFindFunction() method, however.  The
xFindFunction() method always keys off of the left operand of an
LIKE, GLOB, REGEXP, or MATCH operator but off of the first argument
to function-call equivalents of those operators.

2.3.1.2. LIMIT and OFFSET

When aConstraint[].op is one of SQLITE_INDEX_CONSTRAINT_LIMIT or
SQLITE_INDEX_CONSTRAINT_OFFSET, that indicates that there is a
LIMIT or OFFSET clause on the SQL query statement that is using
the virtual table.  The LIMIT and OFFSET operators have no
left operand, and so when aConstraint[].op is one of
SQLITE_INDEX_CONSTRAINT_LIMIT or SQLITE_INDEX_CONSTRAINT_OFFSET
then the aConstraint[].iColumn value is meaningless and should
not be used.

2.3.1.3. Right-hand side values of constraints

The sqlite3_vtab_rhs_value() interface can be used to try to
access the right-hand operand of a constraint.  However, the value
of a right-hand operator might not be known at the time that
the xBestIndex method is run, so the sqlite3_vtab_rhs_value()
call might not be successful.  Usually the right operand of a
constraint is only available to xBestIndex if it is coded as
a literal value in the input SQL.  If the right operand is
coded as an expression or a host parameter, it probably will
not be accessible to xBestIndex.  Some operators, such as
SQLITE_INDEX_CONSTRAINT_ISNULL and
SQLITE_INDEX_CONSTRAINT_ISNOTNULL have no right-hand operand.
The sqlite3_vtab_rhs_value() interface always returns
SQLITE_NOTFOUND for such operators.vtab.html#inputs
gFg-R•üP   W)Ú/The Virtual Table Mechanism Of SQLite2.3.2. OutputsGiven all of the information above, the job of the xBestIndex 
method it to figure out the best way to search the virtual table.

The xBestIndex method conveys an indexing strategy to the xFilter 
method through the idxNum and idxStr fields. The idxNum value and 
idxStr string content are arbitrary as far as the SQLite core is 
concerned and can have any meaning as long as xBestIndex and xFilter 
agree on what that meaning is. The SQLite core just copies the 
information from xBestIndex through to the xFilter method, assuming 
only that the char sequence referenced via idxStr is NUL terminated.

The idxStr value may be a string obtained from an SQLite
memory allocation function such as sqlite3_mprintf(). 
If this is the case, then the needToFreeIdxStr flag must be set to 
true so that the SQLite core will know to call sqlite3_free() on 
that string when it has finished with it, and thus avoid a memory leak.
The idxStr value may also be a static constant string, in which case
the needToFreeIdxStr boolean should remain false.


The estimatedCost field should be set to the estimated number
of disk access operations required to execute this query against 
the virtual table. The SQLite core will often call xBestIndex 
multiple times with different constraints, obtain multiple cost
estimates, then choose the query plan that gives the lowest estimate.
The SQLite core initializes estimatedCost to a very large value
prior to invoking xBestIndex, so if xBestIndex determines that the
current combination of parameters is undesirable, it can leave the
estimatedCost field unchanged to discourage its use.

If the current version of SQLite is 3.8.2 or greater, the estimatedRows-¯-•üO        W'ÝQ-The Virtual Table Mechanism Of SQLite2.3.1. InputsThe main thing that the SQLite core is trying to communicate to 
the virtual table is the constraints that are available to limit 
the number of rows that need to be searched. The aConstraint[] array 
contains one entry for each constraint. There will be exactly 
nConstraint entries in that array.

Each constraint will usually correspond to a term in the WHERE clause
or in a USING or ON clause that is of the form


     column  OP  EXPR


Where "column" is a column in the virtual table, OP is an operator 
like "=" or "&lt;", and EXPR is an arbitrary expression. So, for example,
if the WHERE clause contained a term like this:

a = 5


Then one of the constraints would be on the "a" column with 
operator "=" and an expression of "5". Constraints need not have a
literal representation of the WHERE clause. The query optimizer might
make transformations to the 
WHERE clause in order to extract as many constraints 
as it can. So, for example, if the WHERE clause contained something 
like this:

x BETWEEN 10 AND 100 AND 999&gt;y


The query optimizer might translate this into three separate constraints:

x &gt;= 10
x &lt;= 100
y &lt; 999


For each such constraint, the aConstraint[].iColumn field indicates which 
column appears on the left-hand side of the constraint.
The first column of the virtual table is column 0. 
The rowid of the virtual table is column -1. 
The aConstraint[].op field indicates which operator is used. 
The SQLITE_INDEX_CONSTRAINT_* constants map integer constants 
into operator values.
Columns occur in the order they were defined by the call to
sqlite3_declare_vtab() in the xCreate or xConnect method.
Hidden columns are counted when determining the column index.

If the xFindFunction() method for the virtual table is defined, and 
if xFindFunction() sometimes returns SQLITE_INDEX_CONSTRAINT_FUNCTION or
larger, then the constraints might also be of the form:


  «
field may be set to an estimate of the number of rows returned by the
proposed query plan. If this value is not explicitly set, the default 
estimate of 25 rows is used.

If the current version of SQLite is 3.9.0 or greater, the idxFlags field
may be set to SQLITE_INDEX_SCAN_UNIQUE to indicate that the virtual table
will return only zero or one rows given the input constraints.  Additional
bits of the idxFlags field might be understood in later versions of SQLite.

The aConstraintUsage[] array contains one element for each of 
the nConstraint constraints in the inputs section of the 
sqlite3_index_info structure. 
The aConstraintUsage[] array is used by xBestIndex to tell the 
core how it is using the constraints.

The xBestIndex method may set aConstraintUsage[].argvIndex 
entries to values greater than zero. 
Exactly one entry should be set to 1, another to 2, another to 3, 
and so forth up to as many or as few as the xBestIndex method wants. 
The EXPR of the corresponding constraints will then be passed 
in as the argv[] parameters to xFilter.

For example, if the aConstraint[3].argvIndex is set to 1, then 
when xFilter is called, the argv[0] passed to xFilter will have 
the EXPR value of the aConstraint[3] constraint.

2.3.2.1. Omit constraint checking in bytecode

By default, the SQLite generates bytecode that will double
checks all constraints on each row of the virtual table to verify
that they are satisfied.  If the virtual table can guarantee
that a constraint will always be satisfied, it can try to
suppress that double-check by setting aConstraintUsage[].omit.
However, with some exceptions, this is only a hint and
there is no guarantee that the redundant check of the constraint
will be suppressed.  Key points:



The omit flag is only honored if the argvIndex value for the
constraint is greater than 0 and less than or equal to 16.  
Constraint checking is never suppressed for constraints
that do not pass their right operand into the xFilter method.
The current implementation is only able to suppress redundant
constraint checking for the first 16 values passed to xFilter,
though that limitation might be increased in future releases.


The omit flag is always honored for SQLITE_INDEX_CONSTRAINT_OFFSET
constraints as long as argvIndex is greater than 0.  Setting the
omit flag on an SQLITE_INDEX_CONSTRAINT_OFFSET constraint indicates
to SQLite that the virtual table will itself suppress the first N
rows of output, where N is the right operand of the OFFSET operator.
If the virtual table implementation sets omit on an
SQLITE_INDEX_CONSTRAINT_OFFSET constraint but then fails to suppress
the first N rows of output, an incorrect answer will result from
the overall query.




2.3.2.2. ORDER BY and orderByConsumed

If the virtual table will output rows in the order specified by 
the ORDER BY clause, then the orderByConsumed flag may be set to 
true. If the output is not automatically in the correct order 
then orderByConsumed must be left in its default false setting. 
This will indicate to the SQLite core that it will need to do a 
separate sorting pass over the data after it comes out of the virtual table.
Setting orderByConsumed is an optimization.  A query will always
get the correct answer if orderByConsumed is left at its default
value (0).  Unnecessary sort operations might be avoided resulting
in a faster query if orderByConsumed is set, but setting
orderByConsumed incorrectly can result in an incorrect answer.
It is suggested that new virtual table implementations leave
the orderByConsumed value unset initially, and then after everything
else is known to be working correctly, go back and attempt to
optimize by setting orderByConsumed where appropriate.

Sometimes the orderByConsumed flag can be safely set even if
the outputs from the virtual table are not strictly in the order
specified by nOrderBy and aOrderBy.  If the
sqlite3_vtab_distinct() interface returns 1 or 2, that indicates
that the ordering can be relaxed.  See the documentation on
sqlite3_vtab_distinct() for further information.vtab.html#outputs
yôƒy†•üS WCŠEMThe Virtual Table Mechanism Of SQLite2.4. The xDisconnect Methodint (*xDisconnect)(sqlite3_vtab *pVTab);


This method releases a connection to a virtual table. 
Only the sqlite3_vtab object is destroyed.
The virtual table is not destroyed and any backing store 
associated with the virtual table persists. 

This method undoes the work of xConnect.

This method is a destructor for a connection to the virtual table.
Contrast this method with xDestroy.  The xDestroy is a destructor
for the entire virtual table.

The xDisconnect method is required for every virtual table implementation,
though it is acceptable for the xDisconnect and xDestroy methods to be
the same function if that makes sense for the particular virtual table.vtab.html#the_xdisconnect_method’l•üRW      £The Virtual Table Mechanism Of SQLite2.3.4. Enforcing Required Parameters On Table-Valued FunctionsThe SQLITE_CONSTRAINT return from xBestIndex
is useful for table-valued functions that
have required parameters.  If the aConstraint[].usable field is false
for one of the required parameter, then the xBestIndex method should
return SQLITE_CONSTRAINT.  If a required field does not appear in
the aConstraint[] array at all, that means that the corresponding
parameter is omitted from the input SQL.  In that case, xBestIndex
should set an error message in pVTab-&gt;zErrMsg and return
SQLITE_ERROR.  To summarize:



The aConstraint[].usable value for a required parameter is
false &rarr; return SQLITE_CONSTRAINT.

A required parameter does not appears anywhere in
the aConstraint[] array &rarr;
Set an error message in pVTab-&gt;zErrMsg and return
SQLITE_ERROR


The following example will better illustrate the use of SQLITE_CONSTRAINT
as a return value from xBestIndex:

SELECT * FROM realtab, tablevaluedfunc(realtab.x);


Assuming that the first hidden column of "tablevaluedfunc" is "param1",
the query above is semantically equivalent to this:

SELECT * FROM realtab, tablevaluedfunc
 WHERE tablevaluedfunc.param1 = realtab.x;


The query planner must decide between many possible implementations
of this query, but two plans in particular are of note:


Scan all
rows of realtab and for each row, find rows in tablevaluedfunc where
param1 is equal to realtab.x

Scan all rows of tablevalued func and for each row find rows
in realtab where x is equal to tablevaluedfunc.param1.


The xBestIndex method will be invoked once for each of the potential
plans above.  For plan 1, the aConstraint[].usable flag for the
SQLITE_CONSTRAINT_EQ constraint on the param1 column will be true because
the right-hand side value for the "param1 = ?" constraint will be known,
since it is determined by the outer realtab loop.
But for plan 2, the aConstraint[].usable flag for "param1 = ?" will be false
because the right-hand side value is determined by an inner loop and is thus
an unknown quantity.  Because param1 is a required input to the table-valued
functions, the xBestIndex method should return SQLITE_CONSTRAINT when presented 
with plan 2, indicating that a required input is missing.  This forces the
query planner to select plan 1.vtab.html#enforcing_required_parameters_on_table_valued_functions†•üQ   W3Šm9The Virtual Table Mechanism Of SQLite2.3.3. Return ValueThe xBestIndex method should return SQLITE_OK on success.  If any
kind of fatal error occurs, an appropriate error code (ex: SQLITE_NOMEM)
should be returned instead.

If xBestIndex returns SQLITE_CONSTRAINT, that does not indicate an
error.  Rather, SQLITE_CONSTRAINT indicates that the particular combination
of input parameters specified is insufficient for the virtual table
to do its job.
This is logically the same as setting the estimatedCost to infinity.
If every call to xBestIndex for a particular query plan returns
SQLITE_CONSTRAINT, that means there is no way for the virtual table
to be safely used, and the sqlite3_prepare() call will fail with
a "no query solution" error.vtab.html#return_value
©
¨Z©ƒ,•üW        W5…/?The Virtual Table Mechanism Of SQLite2.8. The xEof Methodint (*xEof)(sqlite3_vtab_cursor*);


The xEof method must return false (zero) if the specified cursor 
currently points to a valid row of data, or true (non-zero) otherwise. 
This method is called by the SQL engine immediately after each 
xFilter and xNext invocation.

The xEof method is required for every virtual table implementation.vtab.html#the_xeof_method„I•üV       W9‡aCThe Virtual Table Mechanism Of SQLite2.7. The xClose Methodint (*xClose)(sqlite3_vtab_cursor*);


The xClose method closes a cursor previously opened by 
xOpen. 
The SQLite core will always call xClose once for each cursor opened 
using xOpen.

This method must release all resources allocated by the
corresponding xOpen call. The routine will not be called again even if it
returns an error.  The SQLite core will not use the
sqlite3_vtab_cursor again after it has been closed.

The xClose method is required for every virtual table implementation.vtab.html#the_xclose_methodˆc•üU   W7AThe Virtual Table Mechanism Of SQLite2.6. The xOpen Methodint (*xOpen)(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor);


The xOpen method creates a new cursor used for accessing (read and/or
writing) a virtual table.  A successful invocation of this method 
will allocate the memory for the sqlite3_vtab_cursor (or a subclass),
initialize the new object, and make *ppCursor point to the new object.
The successful call then returns SQLITE_OK.

For every successful call to this method, the SQLite core will
later invoke the xClose method to destroy 
the allocated cursor.

The xOpen method need not initialize the pVtab field of the
sqlite3_vtab_cursor structure.  The SQLite core will take care
of that chore automatically.

A virtual table implementation must be able to support an arbitrary
number of simultaneously open cursors.

When initially opened, the cursor is in an undefined state.
The SQLite core will invoke the xFilter method
on the cursor prior to any attempt to position or read from the cursor.

The xOpen method is required for every virtual table implementation.vtab.html#the_xopen_method…k•üT     W=ŠGThe Virtual Table Mechanism Of SQLite2.5. The xDestroy Methodint (*xDestroy)(sqlite3_vtab *pVTab);


This method releases a connection to a virtual table, just like 
the xDisconnect method, and it also destroys the underlying 
table implementation. This method undoes the work of xCreate.

The xDisconnect method is called whenever a database connection
that uses a virtual table is closed. The xDestroy method is only 
called when a DROP TABLE statement is executed against the virtual table.

The xDestroy method is required for every virtual table implementation,
though it is acceptable for the xDisconnect and xDestroy methods to be
the same function if that makes sense for the particular virtual table.vtab.html#the_xdestroy_method
¬
˜ÂŽ¬ƒ]•ü[        W;†CThe Virtual Table Mechanism Of SQLite2.12. The xRowid Methodint (*xRowid)(sqlite3_vtab_cursor *pCur, sqlite_int64 *pRowid);


A successful invocation of this method will cause *pRowid to be
filled with the rowid of row that the
virtual table cursor pCur is currently pointing at.
This method returns SQLITE_OK on success.
It returns an appropriate error code on failure.

The xRowid method is required for every virtual table implementation.vtab.html#the_xrowid_methodˆ/•üZ   W='EThe Virtual Table Mechanism Of SQLite2.11. The xColumn Methodint (*xColumn)(sqlite3_vtab_cursor*, sqlite3_context*, int N);


The SQLite core invokes this method in order to find the value for 
the N-th column of the current row. N is zero-based so the first column 
is numbered 0. 
The xColumn method may return its result back to SQLite using one of the
following interface:



 sqlite3_result_blob()
 sqlite3_result_double()
 sqlite3_result_int()
 sqlite3_result_int64()
 sqlite3_result_null()
 sqlite3_result_text()
 sqlite3_result_text16()
 sqlite3_result_text16le()
 sqlite3_result_text16be()
 sqlite3_result_zeroblob()



If the xColumn method implementation calls none of the functions above,
then the value of the column defaults to an SQL NULL.

To raise an error, the xColumn method should use one of the result_text() 
methods to set the error message text, then return an appropriate
error code.  The xColumn method must return SQLITE_OK on success.

The xColumn method is required for every virtual table implementation.vtab.html#the_xcolumn_method…Q•üY W9‰sAThe Virtual Table Mechanism Of SQLite2.10. The xNext Methodint (*xNext)(sqlite3_vtab_cursor*);


The xNext method advances a virtual table cursor
to the next row of a result set initiated by xFilter. 
If the cursor is already pointing at the last row when this 
routine is called, then the cursor no longer points to valid 
data and a subsequent call to the xEof method must return true (non-zero). 
If the cursor is successfully advanced to another row of content, then
subsequent calls to xEof must return false (zero).

This method must return SQLITE_OK if successful, or an sqlite 
error code if an error occurs.

The xNext method is required for every virtual table implementation.vtab.html#the_xnext_methodŠc•üX     W;”EThe Virtual Table Mechanism Of SQLite2.9. The xFilter Methodint (*xFilter)(sqlite3_vtab_cursor*, int idxNum, const char *idxStr,
              int argc, sqlite3_value **argv);


This method begins a search of a virtual table. 
The first argument is a cursor opened by xOpen. 
The next two arguments define a particular search index previously 
chosen by xBestIndex. The specific meanings of idxNum and idxStr 
are unimportant as long as xFilter and xBestIndex agree on what 
that meaning is.

The xBestIndex function may have requested the values of 
certain expressions using the aConstraintUsage[].argvIndex values 
of the sqlite3_index_info structure. 
Those values are passed to xFilter using the argc and argv parameters.

If the virtual table contains one or more rows that match the
search criteria, then the cursor must be left point at the first row.
Subsequent calls to xEof must return false (zero).
If there are no rows match, then the cursor must be left in a state 
that will cause the xEof to return true (non-zero).
The SQLite engine will use
the xColumn and xRowid methods to access that row content.
The xNext method will be used to advance to the next row.

This method must return SQLITE_OK if successful, or an sqlite 
error code if an error occurs.

The xFilter method is required for every virtual table implementation.vtab.html#the_xfilter_methodxConnect or xCreate method made 
using the sqlite3_declare_vtab() call.  All hidden columns are included.

When doing an insert without a rowid (argc>1, argv[1] is an SQL NULL),
on a virtual table that uses ROWID (but not on a WITHOUT ROWID virtual table),
the implementation must set *pRowid to the rowid of the newly inserted row; 
this will become the value returned by the sqlite3_last_insert_rowid()
function. Setting this value in all the other cases is a harmless no-op;
the SQLite engine ignores the *pRowid return value if argc==1 or 
argv[1] is not an SQL NULL.

Each call to xUpdate will fall into one of cases shown below.
Not that references to argv&#91;i&#93; mean the SQL value
held within the argv&#91;i&#93; object, not the argv&#91;i&#93;
object itself.



argc = 1  argv[0] &ne; NULL

DELETE: The single row with rowid or PRIMARY KEY equal to argv[0] is deleted. 
No insert occurs.

argc &gt; 1  argv[0] = NULL

INSERT: A new row is inserted with column values taken from
argv[2] and following.  In a rowid virtual table, if argv[1] is an SQL NULL,
then a new unique rowid is generated automatically.  The argv[1] will be NULL
for a WITHOUT ROWID virtual table, in which case the implementation should
take the PRIMARY KEY value from the appropriate column in argv[2] and following.

argc &gt; 1  argv[0] &ne; NULL  argv[0] = argv[1]

UPDATE:
The row with rowid or PRIMARY KEY argv[0] is updated with new values 
in argv[2] and following parameters.

argc &gt; 1  argv[0] &ne; NULL  argv[0] &ne; argv[1]

UPDATE with rowid or PRIMARY KEY change:
The row with rowid or PRIMARY KEY argv[0] is updated with 
the rowid or PRIMARY KEY in argv[1] 
and new values in argv[2] and following parameters. This will occur 
when an SQL statement updates a rowid, as in the statement:

   UPDATE table SET rowid=rowid+1 WHERE ...; 




The xUpdate method must return SQLITE_OK if and only if it is
successful.  If a failure occurs, the xUpdate must return an appropriate
error code.  On a failure, the pVTab->zErrMsg element may optionally
be replaced with error message text stored in memory allocated from SQLite 
using functions such as sqlite3_mprintf() or sqlite3_malloc().

If the xUpdate method violates some constraint of the virtual table
(including, but not limited to, attempting to store a value of the wrong 
datatype, attempting to store a value that is too
large or too small, or attempting to change a read-only value) then the
xUpdate must fail with an appropriate error code.

If the xUpdate method is performing an UPDATE, then
sqlite3_value_nochange(X) can be used to discover which columns
of the virtual table were actually modified by the UPDATE
statement.  The sqlite3_value_nochange(X) interface returns
true for columns that do not change.
On every UPDATE, SQLite will first invoke
xColumn separately for each unchanging column in the table to 
obtain the value for that column.  The xColumn method can
check to see if the column is unchanged at the SQL level
by invoking sqlite3_vtab_nochange().  If xColumn sees that
the column is not being modified, it should return without setting 
a result using one of the sqlite3_result_xxxxx()
interfaces.  Only in that case sqlite3_value_nochange() will be
true within the xUpdate method.  If xColumn does
invoke one or more sqlite3_result_xxxxx()
interfaces, then SQLite understands that as a change in the value
of the column and the sqlite3_value_nochange() call for that
column within xUpdate will return false.

There might be one or more sqlite3_vtab_cursor objects open and in use 
on the virtual table instance and perhaps even on the row of the virtual
table when the xUpdate method is invoked.  The implementation of
xUpdate must be prepared for attempts to delete or modify rows of the table
out from other existing cursors.  If the virtual table cannot accommodate
such changes, the xUpdate method must return an error code.

The xUpdate method is optional.
If the xUpdate pointer in the sqlite3_module for a virtual table
is a NULL pointer, then the virtual table is read-only.vtab.html#the_xupdate_method

·
·ª<•ü\        W=ÓAEThe Virtual Table Mechanism Of SQLite2.13. The xUpdate Methodint (*xUpdate)(
  sqlite3_vtab *pVTab,
  int argc,
  sqlite3_value **argv,
  sqlite_int64 *pRowid
);


All changes to a virtual table are made using the xUpdate method.
This one method can be used to insert, delete, or update.

The argc parameter specifies the number of entries in the argv array. 
The value of argc will be 1 for a pure delete operation or N+2 for an insert
or replace or update where N is the number of columns in the table.  
In the previous sentence, N includes any hidden columns.

Every argv entry will have a non-NULL value in C but may contain the 
SQL value NULL.  In other words, it is always true that
argv&#91;i&#93;!=0 for i between 0 and argc-1.
However, it might be the case that
sqlite3_value_type(argv&#91;i&#93;)==SQLITE_NULL.

The argv[0] parameter is the rowid of a row in the virtual table 
to be deleted. If argv[0] is an SQL NULL, then no deletion occurs.

The argv[1] parameter is the rowid of a new row to be inserted 
into the virtual table. If argv[1] is an SQL NULL, then the implementation 
must choose a rowid for the newly inserted row. Subsequent argv[] 
entries contain values of the columns of the virtual table, in the 
order that the columns were declared. The number of columns will
match the table declaration that the ±
0È0…•ü^  W;ˆsCThe Virtual Table Mechanism Of SQLite2.15. The xBegin Methodint (*xBegin)(sqlite3_vtab *pVTab);


This method begins a transaction on a virtual table.
This is method is optional.  The xBegin pointer of sqlite3_module
may be NULL.

This method is always followed by one call to either the
xCommit or xRollback method.  Virtual table transactions do
not nest, so the xBegin method will not be invoked more than once
on a single virtual table
without an intervening call to either xCommit or xRollback.
Multiple calls to other methods can and likely will occur in between
the xBegin and the corresponding xCommit or xRollback.vtab.html#the_xbegin_methodš3•ü]  WI³QThe Virtual Table Mechanism Of SQLite2.14. The xFindFunction Methodint (*xFindFunction)(
  sqlite3_vtab *pVtab,
  int nArg,
  const char *zName,
  void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
  void **ppArg
);


This method is called during sqlite3_prepare() to give the virtual
table implementation an opportunity to overload functions. 
This method may be set to NULL in which case no overloading occurs.

When a function uses a column from a virtual table as its first 
argument, this method is called to see if the virtual table would 
like to overload the function. The first three parameters are inputs: 
the virtual table, the number of arguments to the function, and the 
name of the function. If no overloading is desired, this method
returns 0. To overload the function, this method writes the new 
function implementation into *pxFunc and writes user data into *ppArg 
and returns either 1 or a number between
SQLITE_INDEX_CONSTRAINT_FUNCTION and 255.

Historically, the return value from xFindFunction() was either zero
or one.  Zero means that the function is not overloaded and one means that
it is overload.  The ability to return values of 
SQLITE_INDEX_CONSTRAINT_FUNCTION or greater was added in
version 3.25.0 (2018-09-15).  If xFindFunction returns
SQLITE_INDEX_CONSTRAINT_FUNCTION or greater, than means that the function
takes two arguments and the function
can be used as a boolean in the WHERE clause of a query and that
the virtual table is able to exploit that function to speed up the query
result.  When xFindFunction returns SQLITE_INDEX_CONSTRAINT_FUNCTION or 
larger, the value returned becomes the sqlite3_index_info.aConstraint.op
value for one of the constraints passed into xBestIndex().  The first
argument to the function is the column identified by 
aConstraint[].iColumn field of the constraint and the second argument to the
function is the value that will be passed into xFilter() (if the
aConstraintUsage[].argvIndex value is set) or the value returned from
sqlite3_vtab_rhs_value().

The Geopoly module is an example of a virtual table that makes use
of SQLITE_INDEX_CONSTRAINT_FUNCTION to improve performance.
The xFindFunction() method for Geopoly returns
SQLITE_INDEX_CONSTRAINT_FUNCTION for the geopoly_overlap() SQL function
and it returns
SQLITE_INDEX_CONSTRAINT_FUNCTION+1 for the geopoly_within() SQL function.
This permits search optimizations for queries such as:

SELECT * FROM geopolytab WHERE geopoly_overlap(_shape, $query_polygon);
SELECT * FROM geopolytab WHERE geopoly_within(_shape, $query_polygon);


Note that infix functions (LIKE, GLOB, REGEXP, and MATCH) reverse 
the order of their arguments. So "like(A,B)" would normally work the same
as "B like A".
However, xFindFunction() always looks a the left-most argument, not
the first logical argument.
Hence, for the form "B like A", SQLite looks at the
left operand "B" and if that operand is a virtual table column
it invokes the xFindFunction() method on that virtual table.
But if the form "like(A,B)" is used instead, then SQLite checks
the A term to see if it is column of a virtual table and if so
it invokes the xFindFunction() method for the virtual table of
column A. 

The function pointer returned by this routine must be valid for
the lifetime of the sqlite3_vtab object given in the first parameter.vtab.html#the_xfindfunction_method

ž?
à̉.•üc      W{-The Virtual Table Mechanism Of SQLite2.20. The xSavepoint, xRelease, and xRollbackTo Methodsint (*xSavepoint)(sqlite3_vtab *pVtab, int);
int (*xRelease)(sqlite3_vtab *pVtab, int);
int (*xRollbackTo)(sqlite3_vtab *pVtab, int);



These methods provide the virtual table implementation an opportunity to
implement nested transactions.  They are always optional and will only be
called in SQLite version 3.7.7 (2011-06-23) and later.



When xSavepoint(X,N) is invoked, that is a signal to the virtual table X
that it should save its current state as savepoint N.  
A subsequent call
to xRollbackTo(X,R) means that the state of the virtual table should return
to what it was when xSavepoint(X,R) was last called.  
The call
to xRollbackTo(X,R) will invalidate all savepoints with N>R; none of the
invalided savepoints will be rolled back or released without first
being reinitialized by a call to xSavepoint().  
A call to xRelease(X,M) invalidates all savepoints where N>=M.



None of the xSavepoint(), xRelease(), or xRollbackTo() methods will ever
be called except in between calls to xBegin() and 
either xCommit() or xRollback().vtab.html#the_xsavepoint_xrelease_and_xrollbackto_methodsˆ•üb  W=ŽgEThe Virtual Table Mechanism Of SQLite2.19. The xRename Methodint (*xRename)(sqlite3_vtab *pVtab, const char *zNew);


This method provides notification that the virtual table implementation
that the virtual table will be given a new name. 
If this method returns SQLITE_OK then SQLite renames the table.
If this method returns an error code then the renaming is prevented.

The xRename method is optional.  If omitted, then the virtual
table may not be renamed using the ALTER TABLE RENAME command.

The PRAGMA legacy_alter_table setting is enabled prior to invoking this
method, and the value for legacy_alter_table is restored after this
method finishes.  This is necessary for the correct operation of virtual
tables that make use of shadow tables where the shadow tables must be
renamed to match the new virtual table name.  If the legacy_alter_format is
off, then the xConnect method will be invoked for the virtual table every
time the xRename method tries to change the name of the shadow table.vtab.html#the_xrename_method‚Z•üa  WAƒuIThe Virtual Table Mechanism Of SQLite2.18. The xRollback Methodint (*xRollback)(sqlite3_vtab *pVTab);


This method causes a virtual table transaction to rollback.
This is method is optional.  The xRollback pointer of sqlite3_module
may be NULL.

A call to this method always follows a prior call to xBegin.vtab.html#the_xrollback_method‚Z•ü` W=ƒ}EThe Virtual Table Mechanism Of SQLite2.17. The xCommit Methodint (*xCommit)(sqlite3_vtab *pVTab);


This method causes a virtual table transaction to commit.
This is method is optional.  The xCommit pointer of sqlite3_module
may be NULL.

A call to this method always follows a prior call to xBegin and
xSync.vtab.html#the_xcommit_method„]•ü_ W9ˆAThe Virtual Table Mechanism Of SQLite2.16. The xSync Methodint (*xSync)(sqlite3_vtab *pVTab);



This method signals the start of a two-phase commit on a virtual
table.
This is method is optional.  The xSync pointer of sqlite3_module
may be NULL.

This method is only invoked after call to the xBegin method and
prior to an xCommit or xRollback.  In order to implement two-phase
commit, the xSync method on all virtual tables is invoked prior to
invoking the xCommit method on any virtual table.  If any of the 
xSync methods fail, the entire transaction is rolled back.vtab.html#the_xsync_method
ÅøÅŠ.–„)  K#“[5The SQLITE_DBPAGE Virtual Table1. OverviewThe SQLITE_DBPAGE extension implements an eponymous-only virtual table that
provides direct access to the underlying database file by interacting
with the pager.  SQLITE_DBPAGE is capable of both reading and writing any
page of the database.  Because interaction is through the pager layer, all
changes are transactional.



Warning: writing to the SQLITE_DBPAGE virtual table can very easily
cause unrecoverably database corruption.  Do not allow untrusted components
to access the SQLITE_DBPAGE table.  Use appropriate care while using the
SQLITE_DBPAGE table.  Back up important data prior to experimenting with the
SQLITE_DBPAGE table.  Writes to the SQLITE_DBPAGE virtual table are
disabled when the SQLITE_DBCONFIG_DEFENSIVE flag is set.


The SQLITE_DBPAGE extension is included in the amalgamation though 
it is disabled
by default.  Use the SQLITE_ENABLE_DBPAGE_VTAB compile-time option to enable
the SQLITE_DBPAGE extension.  The SQLITE_DBPAGE extension makes use of
unpublished internal interfaces and is not run-time loadable.  The only way
to add SQLITE_DBPAGE to an application is to compile it in using the
SQLITE_ENABLE_DBPAGE_VTAB compile-time option.



The SQLITE_DBPAGE extension is enabled in default builds
of the command-line shell.dbpage.html#overview”•üd     WE¦?MThe Virtual Table Mechanism Of SQLite2.21. The xShadowName MethodSome virtual table implementations (ex: FTS3, FTS5, and RTREE) make
use of real (non-virtual) database tables to store content.  For example,
when content is inserted into the FTS3 virtual table, the data is ultimately
stored in real tables named "%_content", "%_segdir", "%_segments", "%_stat",
and "%_docsize" where "%" is the name of the original virtual table.  This
auxiliary real tables that store content for a virtual table are called
"shadow tables".  See
(1),
(2), and
(3) for additional information.

The xShadowName method exists to allow SQLite to determine whether a
certain real table is in fact a shadow table for a virtual table.

SQLite understands a real table to be a shadow table if all of
the following are true:


 The name of the table contains one or more "_" characters.
 The part of the name prior to the last "_" exactly matches
     the name of a virtual table that was created using CREATE VIRTUAL TABLE.
     (Shadow tables are not recognized for eponymous virtual tables
     and table-valued functions.)
 The virtual table contains an xShadowName method.
 The xShadowName method returns true when its input is the part
     of the table name past the last "_" character.



If SQLite recognizes a table as a shadow table, and if the
SQLITE_DBCONFIG_DEFENSIVE flag is set, then the shadow table is read-only
for ordinary SQL statements.  The shadow table can still be written, but
only by SQL that is invoked from within one of the methods of
some virtual table implementation.


The whole point of the xShadowName method is to protect the content of
shadow tables from being corrupted by hostile SQL.  Every virtual table
implementation that uses shadow tables should be able to detect and cope
with corrupted shadow table content.  However, bugs in particular virtual 
table implementation might allow a deliberately corrupted shadow table to
cause a crash or other malfunction.  The xShadowName mechanism seeks to 
avoid zero-day exploits by preventing ordinary SQL statements from
deliberately corrupting shadow tables.


Shadow tables are read/write by default.
Shadow tables only become read-only when the SQLITE_DBCONFIG_DEFENSIVE
flag is set using sqlite3_db_config().
Shadow tables need to be read/write by default in order to maintain
backwards compatibility.
For example, the SQL text generated by the .dump command of the CLI
writes directly into shadow tables.
This page last modified on  2022-12-05 12:38:46 UTCvtab.html#the_xshadowname_method
ùtüù‡~–Œ      '+ISTRICT Tables1. IntroductionSQLite strives to be flexible regarding the datatype of
the content that it stores.  For example, if a table column has a type of
"INTEGER", then SQLite tries to convert anything inserted into that column
into an integer.  So an attempt to insert the string '123' results
in an integer 123 being inserted.  But if the content cannot be losslessly
converted into an integer, for example if the input is 'xyz', then
the original string is inserted instead.
See the Datatypes In SQLite document for additional information.

Some developers appreciate the freedom that SQLite's flexible typing
rules provide and use that freedom to advantage.
But other developers are aghast at SQLite's
flagrant rule-breaking and prefer the traditional rigid type
system found in all other SQL database engines and in the
SQL standard.  For this latter group, SQLite supports a strict typing
mode, as of version 3.37.0 (2021-11-27), that is enabled
separately for each table.stricttables.html#introductionŠs–„+   Kk“YyThe SQLITE_DBPAGE Virtual Table2.1. Using SQLITE_DBPAGE On ATTACH-ed DatabasesThe SQLITE_DBPAGE table schema shown above is incomplete.  There is
a third hidden column named "schema" that determines which
ATTACH-ed database should be read or written.  Because
the "schema" column is hidden, it can be used as a parameter when
SQLITE_DBPAGE is invoked as a table-valued function.


For example, suppose an additional database is attached to the 
database connection using a statement like this:

ATTACH 'auxdata1.db' AS aux1;



Then to read the first page of that database file, one merely runs:

SELECT data FROM sqlite_dbpage('aux1') WHERE pgno=1;



If the "schema" is omitted, it defaults to the primary database
(usually called 'main', unless renamed using SQLITE_DBCONFIG_MAINDBNAME).
Hence, the following two queries are normally equivalent:

SELECT data FROM sqlite_dbpage('main') WHERE pgno=1;
SELECT data FROM sqlite_dbpage WHERE pgno=1;



The SQLITE_DBPAGE table can participate in a join just like any other
table.  Hence, to see the content of the first page to all connected
database files, one might run a statement like this:

SELECT dbpage.data, dblist.name
  FROM pragma_database_list AS dblist
  JOIN sqlite_dbpage(dblist.name) AS dbpage
 WHERE dbpage.pgno=1;

This page last modified on  2018-11-12 15:24:40 UTCdbpage.html#using_sqlite_dbpage_on_attach_ed_databases‰–„*  K‘/The SQLITE_DBPAGE Virtual Table2. UsageThe SQLITE_DBPAGE virtual table read/write table that provides direct
access to the underlying disk file on a page-by-page basis.  The
virtual table appears to have a schema like this:

CREATE TABLE sqlite_dbpage(
  pgno INTEGER PRIMARY KEY,
  data BLOB
);



An SQLite database file is divided into pages.
The first page is 1, the second page is 2, and so forth.
There is no page 0.
Every page is the same size.
The size of every page is a power of 2 between 512 and 65536.
See the file format documentation for further details.


The SQLITE_DBPAGE table allows an application to view or replace the
raw binary content of each page of the database file.
No attempt is made to interpret the content of the page.
Content is returned byte-for-byte as it appears on disk.


The SQLITE_DBPAGE table has one row for each page in the database file.
SQLITE_DBPAGE allows pages to be read or to be overwritten.
However the size of the database file cannot be changed.  It is not
possible to change the number of rows in the SQLITE_DBPAGE table by
running DELETE or INSERT operations against that table.dbpage.html#usage
»æ»Š&–Œ       '3“CQSTRICT Tables3. The ANY datatypeThe ability to host any type of data in a single column has proven to
be remarkably useful over the years.  In order to continue supporting this
ability, even in STRICT tables, the new ANY datatype name is introduced.
When the datatype of a column is "ANY", that means that any kind of data - 
integers, floating point values, strings, or binary blobs, can be inserted
into that table and its value and datatype will be preserved exactly as
it is inserted.  As far as we know, SQLite is the only SQL database engine
that supports this advanced capability.

The behavior of ANY is slightly different in a
STRICT table versus an ordinary non-strict table.  In a STRICT table,
a column of type ANY always preserves the data exactly as it is received.
For an ordinary non-strict table, a column of type ANY will attempt to
convert strings that look like numbers into a numeric value, and if
successful will store the numeric value rather than the original string.
For example:



STRICTordinary non-strict
CREATE TABLE t1(a ANY) STRICT;
INSERT INTO t1 VALUES('000123');
SELECT typeof(a), quote(a) FROM t1;
-- result: text '000123'

CREATE TABLE t1(a ANY);
INSERT INTO t1 VALUES('000123');
SELECT typeof(a), quote(a) FROM t1;
-- result: integer 123stricttables.html#the_any_datatype’–Œ   '-£-KSTRICT Tables2. STRICT TablesIn a CREATE TABLE statement, if the "STRICT" table-option keyword is
added to the end, after the closing ")", then strict typing rules apply
to that table. 
The STRICT keyword causes the following differences:



Every column definition must specify a datatype for that column.
The freedom to specify a column without a datatype is removed.


The datatype must be one of following:

 INT
 INTEGER
 REAL
 TEXT
 BLOB
 ANY

No other datatype names are allowed, though new types might be added in
future releases of SQLite.


Content inserted into the column with a datatype other than ANY
must be either a NULL (assuming there
is no NOT NULL constraint on the column) or the type specified.
SQLite attempts to coerce the data into the appropriate type using the usual
affinity rules, as PostgreSQL, MySQL, SQL Server,
and Oracle all do.  If the value cannot be
losslessly converted in the specified datatype, then an
SQLITE_CONSTRAINT_DATATYPE error is raised.


Columns with datatype ANY can accept any kind of data (except they will
reject NULL values if they have a NOT NULL constraint, of course).  No
type coercion occurs for a column of type ANY in a STRICT table.


Columns that are part of the PRIMARY KEY are implicitly NOT NULL.
However, even though the PRIMARY KEY has an implicit NOT NULL constraint,
when a NULL value is inserted into an INTEGER PRIMARY KEY column, the
NULL is automatically converted into a unique integer, using the same
rules for INTEGER PRIMARY KEY on ordinary, non-strict tables.


The PRAGMA integrity_check and PRAGMA quick_check commands check the
type of the content of all columns in STRICT tables and show errors if
anything is amiss.



Everything else about a STRICT table works the same as it does in an
ordinary non-strict table:


 CHECK constraints work the same.
 NOT NULL constraints work the same.
 FOREIGN KEY constraints work the same.
 UNIQUE constraints work the same.
 DEFAULT clauses work the same.
 COLLATE clauses work the same.
 Generated columns work the same.
 ON CONFLICT clauses work the same.
 Indexes work the same.
 AUTOINCREMENT works the same.
 An INTEGER PRIMARY KEY column is an alias for the rowid, but an
INT PRIMARY KEY column is not.
 The on-disk format for the table data is the same.stricttables.html#strict_tables
'“{'„O–Œ '9ˆ  WSTRICT Tables5. Other Table OptionsThe SQLite parser accepts a comma-separated list of table options after
the final close parenthesis in a CREATE TABLE statement.  As of this
writing (2021-08-23) only two options are recognized:


 STRICT
 WITHOUT ROWID


If there are multiple options, they can be specified in any order.
To keep things simple, the current parser accepts duplicate options without
complaining, but that might change in future releases, so applications
should not rely on it.
This page last modified on  2022-01-20 21:38:08 UTCstricttables.html#other_table_optionsŽ–Œ'šSTRICT Tables4.1. Accessing STRICT tables in earlier versions of SQLiteBecause of a quirk in the SQL language parser, versions of SQLite prior
to 3.37.0 can still read and write STRICT tables if they set
"PRAGMA writable_schema=ON" immediately after opening the database
file, prior to doing anything else that requires knowing the schema.
One of the features of PRAGMA writable_schema=ON is that it disables
errors in the schema parser.  This is intentional, because a big reason for
having PRAGMA writable_schema=ON is to facilitate recovery of database files
with corrupt schemas.  So with writable_schema=ON, when the schema
parser reaches the STRICT keyword, it says to itself "I don't know what
to do with this, but everything up to this point seems like a valid
table definition so I'll just use what I have."  Hence, the STRICT
keyword is effectively ignored.  Because nothing else about the file
format changes for STRICT tables, everything else will work normally.
Of course, rigid type enforcement will not occur because the earlier
versions of SQLite do not know how to do that.

The .dump command in the CLI sets PRAGMA writable_schema=ON, because
.dump is designed to extract as much content as it can even from a corrupt
database file.  Hence, if you are using an older version of SQLite and
you open a database with STRICT tables in the CLI and issue the ".dump"
command before doing anything else, you will be able to read and write
to the STRICT tables without rigid type enforcement.  This could, potentially,
corrupt the database, by allowing incorrect types into STRICT tables.
Reopening the database with a newer version of SQLite and running
"PRAGMA quick_check" will detect and report all such corruption.stricttables.html#accessing_strict_tables_in_earlier_versions_of_sqliteˆh–Œ    'A+_STRICT Tables4. Backwards CompatibilityThe STRICT keyword at the end of a CREATE TABLE statement is only
recognized by SQLite version 3.37.0 (2021-11-27) and later.  If
you try to open a database containing the STRICT keyword in an earlier
version of SQLite, it will not recognize the keyword and will report
an error (except as noted below).  But apart from the extra STRICT keyword,
the underlying file format of the database is identical.

Thus, in general, a database file that contains one or more STRICT
tables can only be read and written by SQLite version 3.37.0 or later.
However, a database created by SQLite 3.37.0 or later can still be
read and written by earlier versions of SQLite, going all the way back
to version 3.0.0 (2004-06-18) as long as the database does not contain
any STRICT tables or other features that were introduced after the older
version of SQLite.

The STRICT keyword may still be used as an identifier.
(It is only treated as a keyword in a certain part of the syntax,
and sqlite3_keyword_check(..) does not recognize it as a regular keyword.)stricttables.html#backwards_compatibility
+˜+S–›d       1K™geInvalid UTF Policy3. Best effort to preserve textSQLite does not promise to always preserve invalid UTF, but it does
make an effort.  Generally speaking, if you insert invalid UTF into
SQLite, you will get the exact same byte sequence back out, as long
as you do not ask SQLite to transform the text in any way.


For example, if you insert some UTF-16LE with invalid surrogates into
a TEXT column of a table of a database that has PRAGMA encoding=UTF16LE,
then later query that column using sqlite3_column_text16(), you will 
probably get back the same exact invalid UTF-16.  But if you insert the
same invalid UTF-16LE content in a PRAGMA encoding=UTF8 database,
the content must be converted into UTF8 when it is stored, which could
cause irreversible changes to the content.  Or if you insert that
same invalid UTF-16LE content into a PRAGMA encoding=UTF16LE database
but then read it out using sqlite3_column_text(), then a UTF16 to
UTF8 conversion must occur during the read-out and that conversion might
introduce irreversible changes.


Or, suppose you are doing everything using UTF-8 (the most common case).
Invalid UTF-8 will normally pass through the database without any change
in its byte sequence.  However, if you try to transform the invalid
UTF-8 with SQL function like substr() or replace()
or if you try to do string matching with the LIKE operator, then
you might get unexpected results.


So, in other words, SQLite does not actively try to subvert your
invalid text.  But when you ask SQLite to make transformations of invalid
UTF, there are no guarantees that those transformations will be reversible
or even sensible.
This page last modified on  2021-12-13 15:03:51 UTCinvalidutf.html#best_effort_to_preserve_textƒ–›c    1a„5{Invalid UTF Policy2. No enforcement of text formatting rulesSQLite does not try to enforce UTF formatting rules.  You can
insert invalid UTF into a TEXT field and SQLite will not complain
about this.  It stores the invalid TEXT as best it can.  SQLite
sees its role in the world as a storage engine, not a text format
validation engine.invalidutf.html#no_enforcement_of_text_formatting_rules‡-–›b
1kŒ]Invalid UTF Policy1.1. Invalid UTF will never cause memory errorsIf you insert invalid UTF into an SQLite database, then SQLite makes
no guarantees about what text you might get back out.  But it does
promise that invalid UTF will never cause memory errors
(array overruns, reads or writes of uninitialized memory, etc), at
least for the built-in processing of SQLite.
In other words, invalid UTF will not cause SQLite to crash.


This promise only applies to the core SQLite components, not
application-provided extensions, of course.
If an application adds new application-defined SQL functions or
virtual tables or collating sequences or other extensions, and a
database contains invalid UTF, then invalid UTF might get passed
into those extensions.  If the invalid UTF causes one of those
extensions to crash, then that is a problem with the extension,
not with SQLite.invalidutf.html#invalid_utf_will_never_cause_memory_errors‡1–›a 1A9YInvalid UTF Policy1. Garbage In, Garbage OutWith regard to invalid UTF, SQLite follows a policy of
Garbage-In, Garbage-Out (GIGO). If you insert invalid UTF
into an SQLite database, then try to query that data, what you get back out
might not be exactly what you put in.  If you put garbage in, then you
may not complain if you get different garbage back out.


For the purposes of this discussion, "invalid UTF" can mean any of
the following circumstances:



Invalid surrogate pairs in UTF-16.


Invalid multi-byte sequences in UTF-8.


Using more bytes of UTF-8 than necessary to represent a single
code point.  (Example:  encoding 'A' as the two-byte sequence
0xc1, 0x01 instead of just a single 0x41 byte.)


NUL characters (U+0000) embedded in strings.


Invalid sequences of combining characters.


UTF-8 or UTF-16 bytes sequences that encode numbers that are not
defined Unicode characters.invalidutf.html#garbage_in_garbage_out
ŽýŽŒj–«2
-y—?How SQLite Works1.1. SQLite Is Different From Most Other SQL DatabasesThere are many SQL-based database management systems available, besides
SQLite.  Common options include MySQL, PostgreSQL, and SQL-Server.
All these systems use the SQL langauge to communicate with the 
application, just like SQLite.  But these other systems different
from SQLite in important respects.



SQLite is a serverless software library, whereas the other
systems are client-server based.  With MySQL, PostgreSQL, SQL-Server,
and others, the application sends a message containing some SQL
over to a separate server thread or process. That separate
thread or process performs the requested I/O, then send the results
back to the application.  But there is no separate thread or
process with SQLite.  SQLite runs in the same address space as
the application, using the same program counter and heap storage.
SQLite does no interprocess communication (IPC).  When an application
sends an SQL statement into SQLite (by invoking a the appropriate
SQLite library subroutine), SQLite interprets the SQL
in the same thread as the caller.  When an SQLite API routine
returns, it does not leave behind any background tasks that
run separately from the application.


An SQLite database is a single ordinary file on disk
(with a well-defined file format).  With other
systems, a "database" is usually a large number of separate
files hidden away in obscure directories of the filesystem, or
even spread across multiple machines.  But with SQLite, a
complete database is just an ordinary disk file.howitworks.html#sqlite_is_different_from_most_other_sql_databases~–«1  -'›  AHow SQLite Works1. BackgroundSQLite is a software library
that translates high-level disk I/O requests generated by an application
into low-level I/O operations that
can be carried out by the operating system.  The application constructs 
high-level I/O requests using the
SQL language.
SQLite translates each high-level SQL statement into a sequence of
many low-level I/O requests (open a file, read a few bytes from a file,
write a few bytes into a file, etc.) that do the work requested by
the SQL.



An application program could do all its disk I/O by direct calls to
operating system I/O routines
or by using a key/value storage engine like 
Berkeley DB or
RocksDB (to name but two).
But there are advantages to using a higher-level interface based
on the SQL language.



SQL is a very high-level language.
A few lines of SQL can replace hundreds or thousands of lines of
procedural code.  SQL thus reduces
the amount of work needed to develop and maintain the application,
and thereby helps to reduce the number of bugs in the application.


SQL and SQLite are 
transactional.
The use of a transactional storage system makes it much easier to
reason about the behavior of the application, and to write applications
that are robust, even in the face of software bugs, hardware faults,
or power losses.


SQLite is often
faster than direct low-level I/O.
This is counterintuitive.  One would expect that a
high-level interface such as SQLite would impose a run-time penalty.
And, theoretically, that is correct.  But in practice, SQL-based
systems such as SQLite do so many behind-the-scenes optimizations
that an application developer would never have time to create and
maintain, that the SQL-based systems end up providing
a net performance gain.howitworks.html#background
ó6ó>–«4     -aŸwHow SQLite Works2.1. Programming Language Processing StepsAll programming languages are processed in two steps:



Translate the program source text into an executable format.

Run the executable generated in the previous step in order to
carry out the desired action.



All programming languages uses those two basic steps.
The main difference is in the executable format.


"Compiled" languages like C++ and Rust translate
the source text into machine code that can be directly executed
by the underlying hardware.  There exist SQL database systems
that do the same with SQL - they translate each SQL statement
directly into machine code.  But that approach is uncommon and
is not the approach taken by SQLite.


Other languages like Java, Perl, Python, and TCL
typically translate the program source text into bytecode.
This bytecode is then run through an interpreter that
reads the bytecode and carries out the desired operations.
SQLite uses this bytecode approach.  If you preceed
any SQL statement with the "EXPLAIN" keyword in SQLite,
it will show you the bytecode that is generated rather
than run the bytecode.


Another approach is to translate the program source text
into a tree of objects in memory.  This tree is the "executable".
An interpret runs the executable by walking the tree.
This is the technique used by MySQL, PostgreSQL, and
SQL-Server.


Of course, not every language fits neatly into one of the
above categories.  This applies to both SQL database engines
and more familiar imperative programming languages.  Javascript
is famous for using a hybrid execution model, where the code
is initially compiled into a tree of objects, but might be
further translating (using just-in-time compilation) down into
more efficient bytecode or machine code, as a means of boosting
performance.


The executable format really ends up being just an implementation
detail.  The key point is that all languages have a compiler
step which translates programs into an executable format and
a run step that executes the compiled program.howitworks.html#programming_language_processing_steps‡E–«3        -MKgHow SQLite Works2. SQL Is A Programming LanguageThe best way to understand how SQL database engines work is to
think of SQL as a programming language, not as a "query language".
Each SQL statement is a separate program.  Applications construct
SQL program source files and send them to the database engine.
The database engine compiles the SQL source code into executable
form, runs that executable, then sends the result back to the
application.


While SQL is a programming language, it is different from other
programming languages like C, Javascript, Python, or Go in that
SQL is a 
declarative language
where the others are
imperative languages.
This is an important difference that has implications for the
design of the compiler used to translate program source text into an
executable format. However, those details 
should not detract from the fact that
SQL is really just another programming language.howitworks.html#sql_is_a_programming_language
§   þªà¤§ƒx–³    5C†CWWAL-mode File Format1.1. The Main Database FileThe format of the main database file is as described in the
file format document.  The file format version numbers at offsets
18 and 19 into the main database must both be 2 to indicate that the
database is in WAL mode.  The main database may have an arbitrary
name allowed by the underlying filesystem.  No special file suffixes
are required, though ".db", ".sqlite", and ".sqlite3" seem to be
popular choices.walformat.html#the_main_database_file‚7–³      5-ƒiEWAL-mode File Format1. Files On DiskWhen in active use, the state of a WAL mode database is described
by three separate files:


 The main database file with an arbitrary name "X".
 The write-ahead log file, usually named "X-wal".
 The wal-index file, usually named "X-shm".walformat.html#files_on_disk…E–³    5
Š?+WAL-mode File FormatThis document describes low-level details on how WAL mode is
implemented on unix and windows.

The separate file format description provides details on the
structure of a database file and of the write-head log file used in
WAL mode.  But details of the locking protocol and of the format
of the WAL-index are deliberately omitted since those details
are left to discretion of individual VFS implementations.  This
document fills in those missing details for the unix and windows VFSes.

For completeness, some of the higher level formatting information
contains in the file format document and elsewhere is replicated here,
when it pertains to WAL mode processing.walformat.html#„O–«6    -1ˆKHow SQLite Works3. Further ReadingThe Atomic Commit document describes how SQLite implements
transactions.


The bytecode engine document has more information
on the bytecode format used by SQLite, and how to view and interpret
an SQLite prepared statement.


The SQLite query planner and
Next Generation Query Planner documents have further details
on the algorithms SQLite uses to implement SQL statements and
how it goes above choosing an appropriate algorithm for each
individual SQL statement.

This page last modified on  2022-06-16 15:42:19 UTChowitworks.html#further_reading‹}–«5 -I–G_How SQLite Works2.2. Compiling SQLite ProgramsWhen an SQL program is submitted to SQLite, the first step is
to split the source text into "tokens".  A token might be:


A language keyword like "SELECT" or "UPDATE".
An identifier for a table or column or variable.
Punctuation characters like "," or "==" or ";".
Literal values: numeric or string constants.
Whitespace or comments.



Whitespace and comment tokens are discarded.  All other tokens
are fed into an
LALR(1) Parser
that analyzes the structure of the input program and generates an
Abstract Syntax Tree (AST)
for the input program.


The parser forwards the AST on to the code generator.
The code generator is the heart of SQLite, and is where most of
the magic happens.
The code generator resolves symbolic names in the AST - matching
the names of columns and tables in the input SQL into actual
columns and tables of the database.  The code generator also does
various transformations on the AST to "optimize" it.  Finally
the code generator chooses appropriate algorithms to implement
the operations requested by the AST and constructs bytecode to
carry out those operations.


The bytecode generated by the code generator is called a
"prepared statement".  Translating SQL source text into a
prepared statement is analogous to converting a C++ program
into machine code by invoking gcc or clang.  Human-readable
source text (SQL or C++) goes in, and a machine readable executable
(bytecode or machine code) comes out.howitworks.html#compiling_sqlite_programs
m
Aöm…–³        5+‰?WAL-mode File Format1.5. VariationsWhen PRAGMA locking_mode=EXCLUSIVE (exclusive locking mode) is set,
only a single client is allowed to have the database open at one time.  Since
only a single client can use the database, the shm file is omitted.
The single client uses a buffer in heap memory as a substitute for the
memory-mapped shm file.

If a read/write client invokes
sqlite3_file_control(SQLITE_FCNTL_PERSIST_WAL) prior to shutdown,
then at shutdown a checkpoint is still run, but the shm file and wal
file are not deleted.
This allows subsequent read-only clients to connect to and read the
database.walformat.html#variations‡–³ 55ŒwIWAL-mode File Format1.4. File LifecyclesWhen a WAL mode database is in active use, all three of the above
files usually exist.  Except, the Wal-Index file is omitted if
exclusive locking mode is set.

If the last client using the database shuts down cleanly by
calling sqlite3_close(), then a checkpoint is run automatically
in order to transfer all information from the wal file
over into the main database, and both the shm file
and the wal file are unlinked.  Thus, when the database is not in
use by any client, it is usually the case that only the main
database file exists on disk.
However, if the last client did not call sqlite3_close() before it
shut down, or if the last client to disconnect was a read-only client,
then the final cleanup operation does not occur and the
shm and wal files may still exist on disk even when the database is
not in use.walformat.html#file_lifecycles‹=–³  5O•;]WAL-mode File Format1.3. The Wal-Index or "-shm" fileThe wal-index file or "shm" file is not actually used as a file.
Rather, individual database clients mmap the shm file and use it
as shared memory for coordinating access to the database and as a cache
for quickly locating frame within the wal file.  The name
of the shm file is the main database file name with the four characters
"-shm" appended.  Or, for 8+3 filesystems, the shm file is the main
database file with the suffix changed to ".SHM".

The shm does not contain any database content and is not required
to recover the database following a crash.  For that reason, the first
client to connect to a quiescent database will normally truncate the
shm file if it exists.  Since the content of the shm file does not need
to be preserved across a crash, the shm file is never fsync()-ed to disk.
In fact, if there were a mechanism by which SQLite could tell the 
operating system to never persist the shm file to disk but always hold
it in cache memory, SQLite would use that mechanism to avoid any
unnecessary disk I/O associated with the shm file.  However, no such
mechanism exists in standard posix.

Because the shm is only used to coordinate access between concurrent
clients, the shm file is omitted if exclusive locking mode
is set, as an optimization.  When exclusive locking mode is set,
SQLite uses heap memory in place of the memory-mapped shm file.walformat.html#the_wal_index_or_shm_file…:–³    5[‰iWAL-mode File Format1.2. The Write-Ahead-Log or "-wal" FileThe write-ahead log or "wal" file is a roll-forward journal
that records transactions that have been committed but not yet applied
to the main database.  Details on the format of the wal file are
describe in the WAL format subsection of the main file format
document.  The wal file is named by appending the four characters
"-wal" to the end of the name of the main database file.  Except
on 8+3 filesystems, such names are not allowed, and in that case
the file suffix is changed to ".WAL".  But as 8+3 filesystems are
increasingly rare, that exceptional case can usually be ignored.walformat.html#the_write_ahead_log_or_wal_file
W,W‘P–³!     5?¡{SWAL-mode File Format2.1. The WAL-Index HeaderThe first 136 bytes of the shm file are a header.  The shm header has
three main divisions as follows:


WAL-Index Header Divisions

BytesDescription
0..47First copy of the WAL Index Information
48..95Second copy of the WAL Index Information
96..135Checkpoint Information and Locks



Individual fields of the shm header, except for the
salt values copied from the WAL header, are unsigned integers
in the native byte-order of the host machine.  The salt values
are exact copies from the WAL header and are in whatever byte
order is used by the WAL file.
The size of integers may be 8, 16, 32, or 64 bits.
A detailed breakout of the individual fields of the shm header
follows:


WAL-Index Header Details

BytesNameMeaning

0..3iVersion
The WAL-index format version number.  Always 3007000.


4..7&nbsp;
Unused padding space.  Must be zero.


8..11iChange
Unsigned integer counter, incremented with each transaction


12isInit
The "isInit" flag.  1 when the shm file has been initialized.


13bigEndCksum
True if the WAL file uses big-ending checksums.  0 if the WAL
    uses little-endian checksums.


14..15szPage
The database page size in bytes, or 1 if the page size is 65536.


16..19mxFrame
Number of valid and committed frames in the WAL file.


20..23nPage
Size of the database file in pages.


24..31aFrameCksum
Checksum of the last frame in the WAL file.


32..39aSalt
The two salt value copied from the WAL file header.
These values are in the byte-order of the WAL file, which
might be different from the native byte-order of the
machine.


40..47aCksum
A checksum over bytes 0 through 39 of this header.


48..95&nbsp;
A copy of bytes 0 through 47 of this header.


96..99nBackfill
Number of WAL frames that have already been backfilled into the database
    by prior checkpoints


100..119read-mark&#91;0..4&#93;
Five "read marks".  Each read mark is a 32-bit unsigned integer (4 bytes).


120..127&nbsp;
Unused space set aside for 8 file locks.


128..132nBackfillAttempted
Number of WAL frames that have attempted to be backfilled but which might
    not have been backfilled successfully.


132..136&nbsp;
Unused space reserved for further expansion.walformat.html#the_wal_index_header‰O–³     5E‘i]WAL-mode File Format2. The WAL-Index File FormatThe WAL-index or "shm" file is used to coordinate access to the database
by multiple clients, and as a cache to help clients quickly locate frames
within the wal file.


Because the shm file is not involved in recovery, the shm file does not
need to be machine byte-order independent.  Hence, numeric values in
the shm file are written in the native byte order of the host computer,
rather than being converted into a specific cross-platform byte order as
is done with the main database file and the wal file.


The shm file consists of one or more hash tables, where each hash table
is 32768 bytes in size.  Except, a 136-byte header is carved out of the
front of the very first hash table, so the first hash table is only
32632 bytes in size.  The total size of the shm file is always a multiple
of 32768.  In most cases, the total size of the shm file is exactly 32768
bytes.  The shm file only needs to grow beyond a single hash table if
when the wal file grows very large (more than 4079 frames).  Since the
default automatic checkpoint threshold is
1000, WAL files rare reach the 4079 threshold needed to make the shm file
grow.walformat.html#the_wal_index_file_format
b
 1wb–³%     5AÊgUWAL-mode File Format2.2. WAL-Index Hash TablesThe hash tables in the shm file are designed to answer the
following question quickly:


FindFrame(P,M):
Given a page number P and a maximum WAL frame index M,
return the largest WAL frame index for page P that does not exceed M, 
or return NULL if there are no frames for page P that do not exceed M.



Let the datatypes "u8", "u16", and "u32" mean unsigned integers of
length 8, 16, and 32 bits, respectively.  Then, the first 32768-byte unit
of the shm file is organized as follows:


u8 aWalIndexHeader[136];
u32 aPgno[4062];
u16 aHash[8192];


The second and all subsequent 32768-byte units of the shm file are
like this:


u32 aPgno[4096];
u16 aHash[8192];


Collectively, the aPgno entries record the database page nuÀ…5–³$    5-‰m=WAL-mode File Format2.1.3. WAL LocksEight bytes of space are set aside in the header to support
file locking using the xShmLock() method in the sqlite3_io_methods
object.  These eight bytes are never read nor written by SQLite since
some VFSes (ex: Windows) might implement locks using mandatory file locks.

These are the eight locks supported:


WAL-Index Locks Controlled By xShmLock()

NameOffset
xShmLockFile

WAL_WRITE_LOCK
0
120



WAL_CKPT_LOCK
1
121



WAL_RECOVER_LOCK
2
122



WAL_READ_LOCK(0)
3
123



WAL_READ_LOCK(1)
4
124



WAL_READ_LOCK(2)
5
125



WAL_READ_LOCK(3)
6
126



WAL_READ_LOCK(4)
7
127






TBD:  More information about the headerwalformat.html#wal_locks…W–³#    5AŠ  QWAL-mode File Format2.1.2. The nBackfill fieldThe 32-bit unsigned integer at offset 128 in the WAL-index header
is called the "nBackfill".
this field holds the number of frames in the WAL file which
have been copied back into the main database.

The nBackfill number is never greater than mxFrame.
When nBackfill equals mxFrame, that means that the WAL content
has been completely written back into the database and it is
ok to reset the WAL if there are no locks held on any of WAL_READ_LOCK(N)
for N>0.

The nBackfill can only be increased while holding the
WAL_CKPT_LOCK.  However, nBackfill is changed to zero
during a WAL reset, and this happens while holding
the WAL_WRITE_LOCK.walformat.html#the_nbackfill_field‡n–³"      5=Ž?MWAL-mode File Format2.1.1. The mxFrame fieldThe 32-bit unsigned integer at offset 16 (and repeated at offset 64)
is the number of valid frames in the WAL.  Because WAL frame are numbered
starting with 1, mxFrame is also the index of the last valid commit frame
in the WAL. A commit frame is a frame that has a non-zero "size of database"
value in bytes 4 through 7 of the frame header, and that indicates the end
of a transaction.

When mxFrame field is zero, it indicates that the WAL is empty and that
all content should be obtained directly from the database file.

When mxFrame is equal to nBackfill, that indicates that all content
in the WAL has been written back into the database.
In that case, all content can be read directly from the database.
Furthermore, the next writer is free to reset the WAL if no other
connections hold locks on WAL_READ_LOCK(N) for N>0.

The mxFrame value is always greater than or equal to both
nBackfill and nBackfillAttempted.walformat.html#the_mxframe_fieldmber stored
in all frames of the WAL file.  The aPgno[0] entry on the first hash table
records the database page number stored in the very first frame in the WAL 
file. The aPgno[i] entry from the first hash table is the database page number
for the i-th frame in the WAL file.  The aPgno[k] entry for the second
hash table is the database page number for the (k+4062)-th frame in the
WAL file.  The aPgno[k] entry for the n-th 32768-byte hash table in the
shm file (for n>1) holds the database page number stored in the
(k+4062+4096*(n-2))-th frame of the WAL file.

Here is a slightly different way to describe the aPgno values:
If you think of all aPgno values as a contiguous array, then
the database page number stored in the i-th frame of the WAL file
is stored in aPgno[i].  Of course, aPgno is not a contiguous array.
The first 4062 entries are on the first 32768-byte unit of the shm
file and subsequent values are in 4096 entry chunks in later units
of the shm file.

One way to compute FindFrame(P,M) would be to scan the aPgno
array starting with the M-th entry and working backwards towards
the beginning and return J where aPgno[J]==P.  Such an algorithm would
work, and it would be faster than searching the whole WAL file for
the latest frame with page number P.  But the search can be made
much faster still by using the aHash structure.

A database page number P is mapped into a hash value
using the following hash function:


h = (P * 383)%8192


This function maps every page number into an integer between 0
and 8191 inclusive.  The aHash field of each 32768-byte shm file unit
maps P values into indexes of the aPgno field of the same unit as
follows:


 Compute the hash value: h = P * 383
 Let X be the largest set of consecutive integers {h, h+1, h+2, ..., h+N}
     such that for every j in X, aPgno&#91;j%8192]!=0.  The X set will be empty
     if aPgno&#91;h%8192]==0.  The X set is easily computed by starting with
     the value h%8192, and adding h%8192 to X and incrementing h until
     encountering the first aPgno&#91;h%8192] entry that is zero.
 The set X contains the index in aPgno of every entry in the current
     32768-byte unit of the shm file that might possible be a solution
     to the FindFrame(P,M) function.  Each of these entries must be
     checked separately to ensure that the aPgno value is P and that the
     frame number does not exceed M.  The largest frame number that passes
     those two tests is the answer.


Each entry in the aPgno array has a single corresponding entry
in the aHash array.  There are more available slots in aHash than
there are in aPgno.  The unused slots in aHash are filled with zero.
And since there are guaranteed to be unused slots in aHash, that means
the loop that computes X is guaranteed to terminate.  The expected size
of X is less than 2.  The worst case is that X will be the same as the
number of entries in aPgno, in which case the algorithm runs at about
the same speed as a linear scan of aPgno.  But that worst case performance
is exceedingly rare.  Usually, the size of X will be small and the use
of the aHash array allows one to compute FindFrame(P,M) much faster.

Here is an alternative way of describing the hash look-up algorithm:
Start with h = (P * 383)%8192 and look at aHash[h] and subsequent entries,
wrapping around to zero when h reaches 8192, until finding an entry with
aHash[h]==0.  All aPgno entries having a page number of P will have an
index that is one of the aHash[h] values thusly computed.
But not all the computed aHash[h] values will
meet the matching criteria, so you must check them independently.  The
speed advantage comes about because normally this set of h values is
very small.

Note that each 32768-byte unit of the shm file has its own aHash and
aPgno arrays.  The aHash array for a single unit is only helpful in finding
aPgno entries in that same unit.  The overall FindFrame(P,M) function
needs to do hash lookups beginning with the latest unit and working
backwards to the oldest unit until it finds an answer.walformat.html#wal_index_hash_tables
=¬–³'   5WÖigWAL-mode File Format2.3.1. How the various locks are usedThe following rules show how each of the locks is used.


SQLITE_LOCK_SHARED

All connections hold SQLITE_LOCK_SHARED continuously while attached
to a WAL-mode database.  This is true for both read/write connections
and read-only connections.
The SQLITE_LOCK_SHARED lock is held even by connections that are
not within transaction.
This is different from rollback mode, where the SQLITE_LOCK_SHARED is
released at the end of each transaction.

SQLITE_LOCK_EXCLUSIVE

Connections hold an exclusive lock when change in between WAL mode
and any of the various rollback-modes.  Connections might also attempt to
obtain an EXCLUSIVE lock when they disconnect from WAL mode.  If
a connection is able to obtain an EXCLUSIVE lock, that means it is the
only connection to the database and so it may attempt to checkpoint
and then delete the WAL-index and WAL files.

When a connection is holding a SHARED lock on the main database,
that will prevent any other connection from acquiring the EXCLUSIVE
lock, which in turn prevents the WAL-index and WAL files from being
deleted out from under other users, and prevents a transition out of
WAL-mode while other users are accessing the database in WAL-mode.


WAL_WRITE_LOCK

The WAL_WRITE_LOCK is only locked exclusively.  There is never a shared
lock taken on WAL_WRITE_LOCK.

An EXCLUSIVE WAL_WRITE_LOCK is held by any connection that is appending
content to the end of the WAL.  Hence, only a single process at a time
can append content to the WAL.  If a WAL res‡>–³&   53oGWAL-mode File Format2.3. Locking MatrixAccess is coordinated in WAL mode using both the legacy DELETE-mode
locks controlled by the xLock and xUnlock methods of the sqlite3_io_methods
object and the WAL locks controlled by the xShmLock method of the
sqlite3_io_methods object.

Conceptually, there is just a single DELETE-mode lock.  The DELETE-mode
lock for a single database connection can be in exactly one of the
following states:

 SQLITE_LOCK_NONE (unlocked)
 SQLITE_LOCK_SHARED (reading)
 SQLITE_LOCK_RESERVED (reading, waiting to write)
 SQLITE_LOCK_PENDING (new readers blocked, waiting to write)
 SQLITE_LOCK_EXCLUSIVE (writing)

The DELETE-mode locks are stored on the lock-byte page of the
main database file.
Only SQLITE_LOCK_SHARED and SQLITE_LOCK_EXCLUSIVE are factors for WAL-mode
databases.
The other locking states are used in rollback-mode, but not in WAL-mode.

The WAL-mode locks are described above.walformat.html#locking_matrixet occurs as a consequence of
a write, then the nBackfill field of the WAL-index header is reset to
zero while holding this lock.
An EXCLUSIVE is also held WAL_WRITE_LOCK, and on several other locking
bytes, when a connection is running recovery on the shared WAL-index.

WAL_CKPT_LOCK

The WAL_CKPT_LOCK is only locked exclusively.  There is never a shared
lock taken on WAL_CKPT_LOCK.

An EXCLUSIVE WAL_CKPT_LOCK is held by any connection that is running
a checkpoint.  The nBackfill field of the WAL-index header may be
increased while holding this exclusive lock, but it may not be decreased.
An EXCLUSIVE is also held WAL_CKPT_LOCK, and on several other locking
bytes, when a connection is running recovery on the shared WAL-index.

WAL_RECOVER_LOCK

The WAL_RECOVER_LOCK is only locked exclusively.  There is never a shared
lock taken on WAL_RECOVER_LOCK.

An EXCLUSIVE WAL_RECOVER_LOCK is held by any connection that is running
recovery to reconstruct the shared WAL-index.

A read-only connection that is rebuilding its private heap-memory WAL-index
does not hold this lock.  (It cannot, since read-only connections are not
allowed to hold any exclusive locks.)  This lock is only held when rebuilding
the global shared WAL-index contained in the memory-mapped SHM file.

In addition to locking this byte, a connection running recovery also
gets an exclusive lock on all other WAL locks except for WAL_READ_LOCK(0).

WAL_READ_LOCK(N)

There are five separate read locks, numbers 0 through 4.
Read locks may be either SHARED or EXCLUSIVE.
Connections obtain a shared lock on one of the read locks bytes while
they are within a transaction.
Connections also obtain an exclusive lock on read locks, one at a time,
for the brief moment while they are updating the values of the corresponding
read-marks.
Read locks 1 through 4 are held exclusively when running recovery.

Each read lock byte corresponds to one of the five 32-bit read-mark
integers located in bytes 100 through 119 of the WAL-index header, as
follows:


Lock NameLock offsetRead-mark nameRead-mark offset
WAL_READ_LOCK(0)123read-mark[0]100..103
WAL_READ_LOCK(1)124read-mark[1]104..107
WAL_READ_LOCK(2)125read-mark[2]108..111
WAL_READ_LOCK(3)126read-mark[3]112..115
WAL_READ_LOCK(4)127read-mark[4]116..119



When a connection holds a shared lock on WAL_READ_LOCK(N), that is a
promise by the connection that it will use the WAL and not the database
file for any database pages that are modified by the first
read-mark[N] entries in the WAL.
The read-mark[0] is always zero.  If a connection holds a shared lock
on WAL_READ_LOCK(0), that means the connection expects to be able to ignore
the WAL and read any content it wants from the main database.
If N>0 then the connection is free to use more of the WAL file beyond
read-mark[N] if it wants to, up to the first mxFrame frames.
But when a connection holds a shared lock on WAL_READ_LOCK(0), that is a
promise that it will never read content from the WAL
and will acquire all content directly from the main database.

When a checkpoint runs, if it sees a lock on WAL_READ_LOCK(N), then it
must not move WAL content into the main database for more than the first
read-mark[N] frames.  Were it to do so, it would overwrite content that
the process holding the lock was expecting to be able to read out of the
main database file.  A consequence of if this is that f the WAL file
contains more than read-mark[N] frames (if mxFrame>read-mark[N]
for any read-mark for which WAL_READ_LOCK(N) is held by another process),
then the checkpoint cannot run to completion.

When a writer wants to reset the WAL, it must ensure that there are
no locks on WAL_READ_LOCK(N) for N>0 because such locks indicate
that some other connection is still using the current WAL file and 
a WAL reset would delete content out from those other connections.  It is
ok for a WAL reset to occur if other connections are holding WAL_READ_LOCK(0)
because by holding WAL_READ_LOCK(0), those other connections are promising
not to use any content from the WAL.walformat.html#how_the_various_locks_are_used
%%—V–³(5¬G/WAL-mode File Format2.3.2. Operations that require locks and which locks those operations useTransition into and out of WAL-mode

The SQLITE_LOCK_EXCLUSIVE lock must be held by a connection that wants
to transition into our out of WAL mode.
Transitioning into WAL mode is, therefore, just like any other write
transaction, since every write transaction in rollback mode requires
the SQLITE_LOCK_EXCLUSIVE lock.
If the database file is already in WAL mode (hence if the desire it to change
it back into rollback mode) and if there are two
or more connections to the database, then each of these connections will
be holding an SQLITE_LOCK_SHARED lock.  That means that the
SQLITE_LOCK_EXCLUSIVE cannot be obtained, and the transition out of
WAL mode will not be allowed.  This prevents one connection from deleting
WAL mode out from under another.  It also means that the only way to move
a database from WAL mode into rollback mode is to close all but one
connection to the database.


Close a connection to a WAL mode database

When a database connection closes (via sqlite3_close() or
sqlite3_close_v2()), an attempt is made to acquire
SQLITE_LOCK_EXCLUSIVE.  If this attempt is successful, that means
the connection that is closing is the last connection to the database.
In that case, it is desirable to clean up the WAL and WAL-index files,
so the closing connection runs a checkpoint (while holding
SQLITE_LOCK_EXCLUSIVE) and the deletes both the WAL and WAL-index files.
The SQLITE_LOCK_EXCLUSIVE is not released until after both the
WAL and WAL-index files have been deleted.

If the application invokes
sqlite3_file_control(SQLITE_FCNTL_PERSIST_WAL) on the database
connection prior to closing, then the final checkpoint is still
run but the WAL and WAL-index files are
not deleted as they normally would be.
This leaves the database in a state that allows other processes
without write permission on the database, WAL, or WAL-index files
to open the database read-only.
If the WAL and WAL-index files are missing, then a process that
lacks permission to create and initialize those files will not be
able to open the database, unless the database is designated
as immutable using the immutable query parameter.

Reconstruct the global shared WAL-index during recovery

All of the WAL-index locks, except for WAL_READ_LOCK(0),
are held exclusively while reconstructing the global shared WAL-index
during recovery.  

Append a new transaction to the end of the WAL

An exclusive lock is held on WAL_WRITE_LOCK while adding new
frame onto the end of a WAL file.  

Read content from the database and WAL as part of a transaction

Run a checkpoint

Reset the WAL file

A WAL reset means to rewind the WAL and start adding new frames
at the beginning.  This occurs while appending new frames to a WAL
that has mxFrame equal to nBackfill and which has no locks on
WAL_READ_LOCK(1) through WAL_READ_LOCK(4).  The WAL_WRITE_LOCK is
held.walformat.html#operations_that_require_locks_and_which_locks_those_operations_use
»!p»‡0–»   /Ž1Generated Columns2. SyntaxSyntactically, generated columns are designated using a
"GENERATED ALWAYS" column-constraint.  For example:

CREATE TABLE t1(
   a INTEGER PRIMARY KEY,
   b INT,
   c TEXT,
   d INT GENERATED ALWAYS AS (a*abs(b)) VIRTUAL,
   e TEXT GENERATED ALWAYS AS (substr(c,b,b+1)) STORED
);


The statement above has three ordinary columns, "a" (the PRIMARY KEY),
"b", and "c", and two generated columns "d" and "e".

The "GENERATED ALWAYS" keywords at the beginning of the constraint
and the "VIRTUAL" or "STORED" keyword at the end are all optional.
Only the "AS" keyword and the parenthesized expression are required.
If the trailing "VIRTUAL" or "STORED" keyword is omitted, then
VIRTUAL is the default.  Hence, the example statement above could
be simplified to just:

CREATE TABLE t1(
   a INTEGER PRIMARY KEY,
   b INT,
   c TEXT,
   d INT AS (a*abs(b)),
   e TEXT AS (substr(c,b,b+1)) STORED
);gencol.html#syntaxƒ,–»       /+…c=Generated Columns1. IntroductionGenerated columns (also sometimes called "computed columns")
are columns of a table whose values are a function of other columns
in the same row.
Generated columns can be read, but their values can not be directly
written.  The only way to change the value of a generated column is to
modify the values of the other columns used to calculate
the generated column.gencol.html#introductionZ–³)      5#žC;WAL-mode File Format3. RecoveryRecovery is the process of rebuilding the WAL-index so that it is
synchronized with the WAL.


Recovery is run by the first thread to connect to a WAL-mode database.
Recovery restores the WAL-index so that it accurately describes the
WAL file.  If there is no WAL file present when the first thread connects
to the database, there is nothing to recover, but the recovery process
still runs to initialize the WAL-index.


If the WAL-index is implemented as a memory-mapped file and that file is
read-only to the first thread to connect, then that thread creates an
private heap-memory ersazt WAL-index and runs the recovery routine to
populate that private WAL-index.  The same data results, but it is held
privately rather that being written into the public shared memory area.


Recovery works by doing a single pass over the WAL, from beginning to end.
The checksums are verified on each frame of the WAL as it is read.  The
scan stops at the end of the file or at the first invalid checksum.
The mxFrame field is set to the index of the last valid commit frame
in WAL.  Since WAL frame numbers are indexed starting with 1, mxFrame is
also the number of valid frames in the WAL.  A "commit frame" is a frame
that has a non-zero value in bytes 4 through 7 of the frame header.
Since the recovery procedure has no way of knowing how many frames of the
WAL might have previously been copied back into the database, it initializes
the nBackfill value to zero.


During recovery of the global shared-memory WAL-index, exclusive locks are
held on WAL_WRITE_LOCK, WAL_CKPT_LOCK, WAL_RECOVER_LOCK, and WAL_READ_LOCK(1) through WAL_READ_LOCK(4).  In other words, all locks associated with the
WAL-index except for WAL_READ_LOCK(0) are held exclusively.  This prevents
any other thread from writing the database and from reading any transactions
that are held in the WAL, until the recovery is complete.
This page last modified on  2019-04-17 15:17:39 UTCwalformat.html#recovery

%      zŒm–»       /-˜e;Generated Columns2.3. LimitationsGenerated columns may not have a default value (they may not use the
"DEFAULT" clause).  The value of a generated column is always the value
specified by the expression that follows the "AS" keyword.


Generated columns may not be used as part of the PRIMARY KEY.
(Future versions of SQLite might relax this constraint for STORED columns.)


The expression of a generated column may only reference
constant literals and columns within the same row, and may only use
scalar deterministic functions.  The expression may not use subqueries,
aggregate functions, window functions, or table-valued functions.


The expression of a generated column may refer to other generated columns
in the same row, but no generated column can depend upon itself, either
directly or indirectly.  

The expression of a generated column may not directly reference
the ROWID, though it can reference the INTEGER PRIMARY KEY column,
which is often the same thing.


Every table must have at least one non-generated column.


It is not possible to ALTER TABLE ADD COLUMN a STORED column.
One can add a VIRTUAL column, however.


The datatype and collating sequence of the generated column are determined
only by the datatype and COLLATE clause on the column definition.
The datatype and collating sequence of the GENERATED ALWAYS AS expression
have no affect on the datatype and collating sequence of the column itself.


Generated columns are not included in the list of columns provided by
the PRAGMA table_info statement.  But they are included in the output of
the newer PRAGMA table_xinfo statement.gencol.html#limitations‡&–»     //S=Generated Columns2.2. CapabilitiesGenerated columns can have a datatype.  SQLite attempts to transform
the result of the generating expression into that datatype using the
same affinity rules as for ordinary columns.


Generated columns may have NOT NULL, CHECK, and UNIQUE constraints,
and foreign key constraints, just like ordinary columns.


Generated columns can participate in indexes, just like ordinary
columns.


The expression of a generated column can refer to any of the
other declared columns in the table, including other generated columns,
as long as the expression does not directly or indirectly refer back
to itself.


Generated columns can occur anywhere in the table definition.  Generated
columns can be interspersed among ordinary columns.  It is not necessary
to put generated columns at the end of the list of columns in the
table definition, as is shown in the examples above.gencol.html#capabilities…V–»       /Q‰o_Generated Columns2.1. VIRTUAL versus STORED columnsGenerated columns can be either VIRTUAL or STORED.  The value of
a VIRTUAL column is computed when read, whereas the value of a STORED
column is computed when the row is written.  STORED columns take up space
in the database file, whereas VIRTUAL columns use more CPU cycles when
being read.

From the point of view of SQL, STORED and VIRTUAL columns are almost
exactly the same.  Queries against either class of generated column
produce the same results.  The only functional difference is that
one cannot add new STORED columns using the
ALTER TABLE ADD COLUMN command.  Only VIRTUAL columns can be added
using ALTER TABLE.gencol.html#virtual_versus_stored_columns
Ûµ   æÇÛ…g–ÊS ?-ŠCAThe SQLite Zipfile Module3. Using ZipfileThe zipfile module provides three similar interfaces for accessing, updating
and creating zip file archives:


   A table-valued function, which provides read-only access to existing
       archives, either from the file-system or in-memory.
   A virtual table, which provides read and write access to archives
       stored in the file-system.
   An SQL aggregate function, which can be used to create new archives
       in memory.


The zipfile module provides two similar interfaces for accessing zip
archives. A table-valued function, which provides read-only access to
existing archives, and a virtual table interface, which provides both
read and write access.zipfile.html#using_zipfile†–ÊR   ?QŠaeThe SQLite Zipfile Module2. Obtaining and Compiling ZipfileThe code for the zipfile module is found in the 
ext/misc/zipfile.c
file of the
main SQLite source tree.
It may be compiled into an SQLite 
loadable extension using a command like:

gcc -g -fPIC -shared zipfile.c -o zipfile.so


Alternatively, the zipfile.c file may be compiled into the application. 
In this case, the following function should be invoked to register the
extension with each new database connection:

int sqlite3_zipfile_init(sqlite3 *db, void*, void*);


 The first argument passed should be the database handle to register the
extension with. The second and third arguments should both be passed 0.

 Zipfile is included in most builds of the command-line shell.zipfile.html#obtaining_and_compiling_zipfileƒJ–ÊQ ?#†7The SQLite Zipfile Module1. OverviewThe zipfile module provides read/write access to simple 
ZIP archives.
The current implementation has the following restrictions:


   Does not support encryption.
   Does not support ZIP archives that span multiple files.
   Does not support zip64 extensions.
   The only compression algorithm supported is
       "deflate".


 Some or all of these restrictions may be removed in the future.zipfile.html#overviewˆF–»      /-?Generated Columns3. CompatibilityGenerated column support was added with SQLite version 3.31.0
(2020-01-22).  If an earlier version of SQLite attempts to read
a database file that contains a generated column in its schema, then
that earlier version will perceive the generated column syntax as an
error and will report that the database schema is corrupt.

To clarify:  SQLite version 3.31.0 can read and write any database
created by any prior version of SQLite going back to 
SQLite 3.0.0 (2004-06-18).  And, earlier versions of SQLite,
prior to 3.31.0, can read and write databases created by SQLite
version 3.31.0 and later as long
as the database schema does not contain features, such as
generated columns, that are not understood by the earlier version.
Problems only arise if you create a new database that contains
generated columns, using SQLite version 3.31.0 or later, and then
try to read or write that database file using an earlier version of
SQLite that does not understand generated columns.
This page last modified on  2022-11-09 20:09:19 UTCgencol.html#compatibility
™‹™Ÿ|–ÊV       ?Y¾eThe SQLite Zipfile Module3.2.1. Adding Entries to a Zip ArchiveEntries may be added to a zip archive by inserting new rows. The easiest
way to do this is to specify values for the "name" and "data" columns only and
have zipfile fill in sensible defaults for other fields.  To insert a directory
into the archive, set the "data" column to NULL.  For example, to add the
directory "dir1" and the file "m.txt" containing the text "abcdefghi" to zip
archive "test.zip":

INSERT INTO tȇ–ÊU  ?mŒ{The SQLite Zipfile Module3.2. Virtual Table Interface (read/write access)In order to create or modify an existing zip file, a "zipfile" virtual 
table must be created in the database schema. The CREATE VIRTUAL TABLE
statement expects a path to the zip file as its only argument. For example, to
write to zip file "test.zip" in the current directory, a zipfile table may be
created using:

CREATE VIRTUAL TABLE temp.zip USING zipfile('test.zip');


Such a virtual table has the same columns as the table-valued function
described in the previous section. It may be read from using a SELECT 
statement in the same way as the table-valued function can. 

Using the virtual table interface, new entries may be added to a zip
archive by inserting new rows into the virtual table. Entries may be
removed by deleting rows or modified by updating them.zipfile.html#virtual_table_interface_read_write_access__–ÊT      ?gEuThe SQLite Zipfile Module3.1. Table-Valued Function (read-only access)For reading existing zip archives, the Zipfile module provides a
table-valued function that accepts a single argument. If the argument
is a text value, then it is a path to a zip archive to read from the
file-system. Or, if the argument is an SQL blob, then it is the zip
archive data itself.

For example, to inspect the contents of zip archive "test.zip" from 
the current directory:

SELECT * FROM zipfile('test.zip');


Or, from the SQLite shell tool (the readfile() 
function reads the contents of a file from the file-system and returns it as a
blob):

SELECT * FROM zipfile( readfile('test.zip') );


The table-valued function returns one row for each record (file, 
directory or symbolic link) in the zip archive. Each row has the 
following columns:


Column&nbsp;NameContents
name  File name/path for the zip file record.
mode  UNIX mode, as returned by stat(2) for the zip file record (an
                  integer). This identifies the type of record (file, directory
                  or symbolic link), and the associated user/group/all 
                  permissions.
mtime  UTC timestamp, in seconds since the UNIX epoch (an integer).
sz     Size of associated data in bytes after it has been 
                   uncompressed (an integer).
rawdata  Raw (possibly compressed) data associated with zip file
                     entry (a blob).
data  If the compression method for the record is either 0 or 8
                  (see below), then the uncompressed data associated with the
                  zip file entry. Or, if the compression method is not 0 or 8, 
                  this column contains a NULL value.
method  The compression method used to compress the data (an
                    integer). The value 0 indicates that the data is stored
                    in the zip archive without compression. 8 means the
                    raw deflate algorithm.zipfile.html#table_valued_function_read_only_access_emp.zip(name, data) VALUES('dir1', NULL);           -- Add directory 
INSERT INTO temp.zip(name, data) VALUES('m.txt', 'abcdefghi');   -- Add regular file 


When a directory is inserted, if the "name" value does not end with
a '/' character, the zipfile module appends one. This is necessary for
compatibility with other programs (most notably "info-zip") that 
manipulate zip archives.

To insert a symbolic link, the user must also supply a "mode" value.
For example, to add a symbolic link from "link.txt" to "m.txt":

INSERT INTO temp.zip(name, mode, data) VALUES('link.txt', 'lrwxrw-rw-', 'abcdefghi');


The following rules and caveats apply to the values specified as part of
each INSERT statement:


Columns  Notes
 name
   A non-NULL text value must be specified for the name column. 
       It is an error if the specified name already exists in the
       archive. 

 mode
   If NULL is inserted into the mode column, then the mode of the
       new archive entry is automatically set to either 33188 (-rw-r--r--)
       or 16877 (drwxr-xr-x), depending on whether or not the values 
       specified for columns "sz", "data" and "rawdata" indicate that
       the new entry is a directory.
       
       If the specified value is an integer (or text that looks like
       an integer), it is inserted verbatim. If the value is not a valid UNIX
       mode, some programs may behave unexpectedly when extracting files
       from the archive.

       Finally, if the value specified for this column is not an integer
       or a NULL, then it is assumed to be a UNIX permissions string similar
       to those output by the "ls -l" command (e.g. "-rw-r--r--", "drwxr-xr-x"
       etc.). In this case, if the string cannot be parsed it is an error.

 mtime
   If NULL is inserted into the mtime column, then the timestamp
       of the new entry is set to the current time. Otherwise, the specified
       value is interpreted as an integer and used as is.

 sz
   This column must be set to NULL. If a non-NULL value is inserted into
       this column, or if a new non-NULL value is provided using an UPDATE
       statement, it is an error.

 rawdata
   This column must be set to NULL. If a non-NULL value is inserted into
       this column, or if a new non-NULL value is provided using an UPDATE
       statement, it is an error.

 data

       To insert a directory into the archive, this field must be set to 
       NULL. In this case if a value was explicitly specified for the "mode"
       column, then it must be consistent with a directory (i.e. it must be
       true that (mode & 0040000)=0040000). 

       Otherwise, the value inserted into this field is the file contents
       for a regular file, or the target of a symbolic link.
 method

       This field must be set one of integer values 0 and 8, or else to
       NULL. 

       For a directory entry, any value inserted into this field is ignored.
       Otherwise, if it is set to 0, then the file data or symbolic link
       target is stored as is in the zip archive and the compression method
       set to 0. If it is set to 8, then the file data or link target is
       compressed using deflate compression before it is stored and the
       compression method set to 8. Finally, if a NULL value is written
       to this field, the zipfile module automatically decides whether
       or not to compress the data before storing it.


 Specifying an explicit value for the rowid field as part of an INSERT
statement is not supported. Any value supplied is ignored.zipfile.html#adding_entries_to_a_zip_archive
h‹hŒ–ÊY    ?[–]gThe SQLite Zipfile Module3.3.  The zipfile() Aggregate Function New zip archives may be constructed entirely within memory using the
zipfile() aggregate function. Each row visited by the aggregate function
adds an entry to the zip archive. The value returned is a blob containing
the entire archive image.

 The zipfile() aggregate function may be called with 2, 4 or 5 
arguments. If it is called with 5 arguments, then the entry added to
the archive is equivalent to inserting the same values into the "name", 
"mode", "mtime", "data" and "method" columns of a zipfile virtual table.

 If zipfile() is invoked with 2 arguments, then the entry added to
the archive is equivalent to that added by inserting the same two values into
the "name" and "data" columns of a zipfile virtual table, with all
other values set to NULL. If invoked with 4 arguments, it is equivalent
to inserting the 4 values into the "name", "mode", "mtime" and "data"
columns. In other words, the following pairs of queries are equivalent:

SELECT zipfile(name, data) ...
SELECT zipfile(name, NULL, NULL, data, NULL) ...

SELECT zipfile(name, mode, mtime, data) ...
SELECT zipfile(name, mode, mtime, data, NULL) ...


 For example, to create an archive containing two text files, "a.txt" and
"b.txt", containing the text "abc" and "123" respectively:

WITH contents(name, data) AS (
  VALUES('a.txt', 'abc') UNION ALL
  VALUES('b.txt', '123')
)
SELECT zipfile(name, data) FROM contents;

This page last modified on  2018-03-10 12:09:19 UTCzipfile.html#_the_zipfile_aggregate_function_†h–ÊX   ?i‹UuThe SQLite Zipfile Module3.2.3.  Updating Existing Zip Archive Entries Existing zip archive entries may be modified using UPDATE statements.

The three leftmost columns of a zipfile virtual table, "name", "mode" 
and "mtime", may each be set to any value that may be inserted into the same
column (see above). If either "mode" or "mtime" is set to NULL, the final 
value is determined as described for an INSERT of a NULL value - the current
time for "mtime" and either 33188 or 16877 for "mode", depending on whether 
or not the values specified for the next four columns of the zipfile table
indicate that the entry is a directory or a file.

It is an error to attempt to set the sz or rawdata field to any value
other than NULL. 

The data and method columns may also be set as described for an INSERT
above.zipfile.html#_updating_existing_zip_archive_entries_ˆ–ÊW ?WŽ/cThe SQLite Zipfile Module3.2.2.  Deleting Zip Archive Entries Records may be removed from an existing zip archive by deleting the
corresponding rows. For example, to remove file "m.txt" from zip archive
"test.zip" using the virtual table created above:

DELETE FROM temp.zip WHERE name = 'm.txt';


Note that deleting records from a zip archive does not reclaim the 
space used within the archive - it merely removes an entry from the
archives "Central Directory Structure", making the entry inaccessible.
One way to work around this inefficiency is to create a new zip 
archive based on the contents of the edited archive. For example, after
editing the archive accessed via virtual table temp.zzz:

-- Create a new, empty, archive: 
CREATE VIRTUAL TABLE temp.newzip USING zipfile('new.zip');

-- Copy the contents of the existing archive into the new archive
INSERT INTO temp.newzip(name, mode, mtime, data, method)
    SELECT name, mode, mtime, data, method FROM temp.zzz;zipfile.html#_deleting_zip_archive_entries_When querying the value of a setting, many pragmas return the number
rather than the keyword.

A pragma may have an optional schema-name
before the pragma name.
The schema-name is the name of an ATTACH-ed database 
or "main" or "temp" for the main and the TEMP databases.  If the optional
schema name is omitted, "main" is assumed.  In some pragmas, the schema
name is meaningless and is simply ignored.  In the documentation below,
pragmas for which the schema name is meaningful are shown with a
"schema." prefix.



PRAGMA functions



PRAGMAs that return results and that have no side-effects can be 
accessed from ordinary SELECT statements as table-valued functions.
For each participating PRAGMA, the corresponding table-valued function
has the same name as the PRAGMA with a 7-character "pragma_" prefix.
The PRAGMA argument and schema, if any, are passed as arguments to the
table-valued function, with the schema as an optional, last argument.

For example, information about the columns in an index can be
read using the index_info pragma as follows:


PRAGMA index_info('idx52');


Or, the same content can be read using:


SELECT * FROM pragma_index_info('idx52');


The advantage of the table-valued function format is that the query
can return just a subset of the PRAGMA columns, can include a WHERE clause,
can use aggregate functions, and the table-valued function can be just
one of several data sources in a join.
For example, to get a list of all indexed columns in a schema, one
could query:


SELECT DISTINCT m.name || '.' || ii.name AS 'indexed-columns'
  FROM sqlite_schema AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table'
 ORDER BY 1;



Additional notes:


Table-valued functions exist only for built-in PRAGMAs, not for PRAGMAs
defined using the SQLITE_FCNTL_PRAGMA file control.

Table-valued functions exist only for PRAGMAs that return results and
that have no side-effects.

This feature could be used to implement
information schema
by first creating a separate schema using

ATTACH ':memory:' AS 'information_schema';

Then creating
VIEWs in that schema that implement the official information schema
tables using table-valued PRAGMA functions.

This feature is experimental and is subject to change.  Further documentation
will become available if and when the table-valued functions for PRAGMAs
feature becomes officially supported.

The table-valued functions for PRAGMA feature was added
in SQLite version 3.16.0 (2017-01-02).  Prior versions of SQLite
cannot use this feature.



List Of PRAGMAs


analysis_limit
application_id
auto_vacuum
automatic_index
busy_timeout
cache_size
cache_spill
case_sensitive_like
cell_size_check
checkpoint_fullfsync
collation_list
compile_options
count_changes&sup1;
data_store_directory&sup1;
data_version
database_list
default_cache_size&sup1;
defer_foreign_keys
empty_result_callbacks&sup1;
encoding
foreign_key_check
foreign_key_list
foreign_keys
freelist_count
full_column_names&sup1;
fullfsync
function_list
hard_heap_limit
ignore_check_constraints
incremental_vacuum
index_info
index_list
index_xinfo
integrity_check
journal_mode
journal_size_limit
legacy_alter_table
legacy_file_format
locking_mode
max_page_count
mmap_size
module_list
optimize
page_count
page_size
parser_trace&sup2;
pragma_list
query_only
quick_check
read_uncommitted
recursive_triggers
reverse_unordered_selects
schema_version&sup3;
secure_delete
short_column_names&sup1;
shrink_memory
soft_heap_limit
stats&sup3;
synchronous
table_info
table_list
table_xinfo
temp_store
temp_store_directory&sup1;
threads
trusted_schema
user_version
vdbe_addoptrace&sup2;
vdbe_debug&sup2;
vdbe_listing&sup2;
vdbe_trace&sup2;
wal_autocheckpoint
wal_checkpoint
writable_schema&sup3;



Notes:

Pragmas whose names are struck through
are deprecated. Do not use them. They exist
for historical compatibility.
These pragmas are only available in builds using non-standard
compile-time options.
These pragmas are used for testing SQLite and are not recommended
for use in application programs.pragma.html#
……´n–Ú!        W
èu%Pragma statements supported by SQLitePRAGMA Statements



The PRAGMA statement is an SQL extension specific to SQLite and used to 
modify the operation of the SQLite library or to query the SQLite library for 
internal (non-table) data. The PRAGMA statement is issued using the same
interface as other SQLite commands (e.g. SELECT, INSERT) but is
different in the following important respects:


The pragma command is specific to SQLite and is
    not compatible with any other SQL database engine.
Specific pragma statements may be removed and others added in future
    releases of SQLite. There is no guarantee of backwards compatibility.
No error messages are generated if an unknown pragma is issued.
    Unknown pragmas are simply ignored. This means if there is a typo in 
    a pragma statement the library does not inform the user of the fact.
Some pragmas take effect during the SQL compilation stage, not the
    execution stage. This means if using the C-language sqlite3_prepare(), 
    sqlite3_step(), sqlite3_finalize() API (or similar in a wrapper 
    interface), the pragma may run during the sqlite3_prepare() call,
    not during the sqlite3_step() call as normal SQL statements do.
    Or the pragma might run during sqlite3_step() just like normal
    SQL statements.  Whether or not the pragma runs during sqlite3_prepare()
    or sqlite3_step() depends on the pragma and on the specific release
    of SQLite.
The EXPLAIN and EXPLAIN QUERY PLAN prefixes to SQL statements
    only affect the behavior of the statement during sqlite3_step().
    That means that PRAGMA statements that take effect during
    sqlite3_prepare() will behave the same way regardless of whether or
    not they are prefaced by "EXPLAIN".


The C-language API for SQLite provides the SQLITE_FCNTL_PRAGMA
file control which gives VFS implementations the
opportunity to add new PRAGMA statements or to override the meaning of
built-in PRAGMA statements.



PRAGMA command syntax
pragma-stmt:
hide
 
 

pragma-value:
hide
 
 

signed-number:
show
 
 







A pragma can take either zero or one argument.  The argument is may be either
in parentheses or it may be separated from the pragma name by an equal sign.
The two syntaxes yield identical results.
In many pragmas, the argument is a boolean.  The boolean can be one of:



1 yes true on0 no false off


Keyword arguments can optionally appear in quotes.  
(Example:  'yes' &#91;FALSE&#93;.) Some pragmas
takes a string literal as their argument.  When pragma takes a keyword
argument, it will usually also take a numeric equivalent as well.
For example, "0" and "no" mean the same thing, as does "1" and "yes".
Ê
q    „q†–Ú#        W9Š_OPragma statements supported by SQLite PRAGMA application_idPRAGMA schema.application_id;
     PRAGMA schema.application_id = integer ;
  
    The application_id PRAGMA is used to query or set the 32-bit
       signed big-endian "Application ID" integer located at offset
       68 into the database header.  Applications that use SQLite as their
       application file-format should set the Application ID integer to
       a unique integer so that utilities such as 
       file(1) can determine the specific
       file type rather than just reporting "SQLite3 Database".  A list of
       assigned application IDs can be seen by consulting the
       magic.txt file in the SQLite source repository.

   See also the user_version pragma.pragma.html#pragma_application_idŒw–Ú"      W9˜1OPragma statements supported by SQLite PRAGMA analysis_limitPRAGMA analysis_limit;
        PRAGMA analysis_limit = N;
   Query or change a limit on the approximate ANALYZE setting.
      This is the approximate number of
      rows examined in each index by the ANALYZE command.
      If the argument N is omitted, then the analysis limit
      is unchanged.
      If the limit is zero, then the analysis limit is disabled and
      the ANALYZE command will examine all rows of each index.
      If N is greater than zero, then the analysis limit is set to N
      and subsequent ANALYZE commands will stop analyzing
      each index after it has examined approximately N rows.
      If N is a negative number or something other than an integer value,
      then the pragma behaves as if the N argument was omitted.
      In all cases, the value returned is the new analysis limit used
      for subsequent ANALYZE commands.
   This pragma can be used to help the ANALYZE command run faster
      on large databases.  The results of analysis are not as good
      when only part of each index is examined, but the results are
      usually good enough.  Setting N to 100 or 1000 allows the
      ANALYZE command to run very quickly, even on multi-gigabyte
      database files.  This pragma is particularly useful in combination
      with PRAGMA optimize.
   This pragma was added in SQLite version 3.32.0 (2020-05-22).
      The current implementation only uses the lower 31 bits of the
      N value - higher order bits are silently ignored.  Future versions
      of SQLite might begin using higher order bits.pragma.html#pragma_analysis_limit
éu„m–Ú&   W5ˆ%KPragma statements supported by SQLite PRAGMA busy_timeoutPRAGMA busy_timeout;
         PRAGMA busy_timeout = milliseconds;
    Query or change the setting of the
    busy timeout.
    This pragma is an alternative to the sqlite3_busy_timeout() C-language
    interface which is made available as a pragma for use with language
    bindings that do not provide direct access to sqlite3_busy_timeout().

    Each database connection can only have a single
    busy handler.  This PRAGMA sets the busy handler
    for the process, possibly overwriting any previously set busy handler.pragma.html#pragma_busy_timeout‚o–Ú%  W;„QPragma statements supported by SQLite PRAGMA automatic_indexPRAGMA automatic_index;
     PRAGMA automatic_index = boolean;

    Query, set, or clear the automatic indexing capability.
    Automatic indexing is enabled by default as of 
    version 3.7.17 (2013-05-20),
    but this might change in future releases of SQLite.pragma.html#pragma_automatic_index––Ú$  W3ªsIPragma statements supported by SQLite PRAGMA auto_vacuumPRAGMA schema.auto_vacuum;
          PRAGMA schema.auto_vacuum = 
           0 | NONE | 1 | FULL | 2 | INCREMENTAL;

    Query or set the auto-vacuum status in the database.

    The default setting for auto-vacuum is 0 or "none",
    unless the SQLITE_DEFAULT_AUTOVACUUM compile-time option is used.
    The "none" setting means that auto-vacuum is disabled.
    When auto-vacuum is disabled and data is deleted data from a database,
    the database file remains the same size.  Unused database file 
    pages are added to a "freelist" and reused for subsequent inserts.  So
    no database file space is lost.  However, the database file does not
    shrink.  In this mode the VACUUM
    command can be used to rebuild the entire database file and
    thus reclaim unused disk space.

    When the auto-vacuum mode is 1  or "full", the freelist pages are
    moved to the end of the database file and the database file is truncated
    to remove the freelist pages at every transaction commit.
    Note, however, that auto-vacuum only truncates the freelist pages
    from the file.  Auto-vacuum does not defragment the database nor
    repack individual database pages the way that the
    VACUUM command does.  In fact, because
    it moves pages around within the file, auto-vacuum can actually
    make fragmentation worse.

    Auto-vacuuming is only possible if the database stores some
    additional information that allows each database page to be
    traced backwards to its referrer.  Therefore, auto-vacuuming must
    be turned on before any tables are created.  It is not possible
    to enable or disable auto-vacuum after a table has been created.

    When the value of auto-vacuum is 2 or "incremental" then the additional
    information needed to do auto-vacuuming is stored in the database file
    but auto-vacuuming does not occur automatically at each commit as it
    does with auto_vacuum=full.  In incremental mode, the separate
    incremental_vacuum pragma must
    be invoked to cause the auto-vacuum to occur.

    The database connection can be changed between full and incremental
    autovacuum mode at any time.  However, changing from
    "none" to "full" or "incremental" can only occur when the database 
    is new (no tables
    have yet been created) or by running the VACUUM command.  To
    change auto-vacuum modes, first use the auto_vacuum pragma to set
    the new desired mode, then invoke the VACUUM command to 
    reorganize the entire database file.  To change from "full" or
    "incremental" back to "none" always requires running VACUUM even
    on an empty database.
    

    When the auto_vacuum pragma is invoked with no arguments, it
    returns the current auto_vacuum mode.pragma.html#pragma_auto_vacuum
ZóZ‹–Ú(  W3”wIPragma statements supported by SQLite PRAGMA cache_spillPRAGMA cache_spill;
         PRAGMA cache_spill=boolean;
         PRAGMA schema.cache_spill=N;

    The cache_spill pragma enables or disables the ability of the pager
    to spill dirty cache pages to the database file in the middle of a 
    transaction.  Cache_spill is enabled by default and most applications
    should leave it that way as cache spilling is usually advantageous.
    However, a cache spill has the side-effect of acquiring an
    EXCLUSIVE lock on the database file.  Hence, some applications that
    have large long-running transactions may want to disable cache spilling
    in order to prevent the application from acquiring an exclusive lock
    on the database until the moment that the transaction COMMITs.
    The "PRAGMA cache_spill=N" form of this pragma sets a minimum
    cache size threshold required for spilling to occur. The number of pages
    in cache must exceed both the cache_spill threshold and the maximum cache
    size set by the PRAGMA cache_size statement in order for spilling to
    occur.
    The "PRAGMA cache_spill=boolean" form of this pragma applies
    across all databases attached to the database connection.  But the
    "PRAGMA cache_spill=N" form of this statement only applies to
    the "main" schema or whatever other schema is specified as part of the
    statement.pragma.html#pragma_cache_spill–Ú' W1¦cGPragma statements supported by SQLite PRAGMA cache_sizePRAGMA schema.cache_size;
       PRAGMA schema.cache_size = pages;
       PRAGMA schema.cache_size = -kibibytes;
    Query or change the suggested maximum number of database disk pages
    that SQLite will hold in memory at once per open database file.  Whether
    or not this suggestion is honored is at the discretion of the
    Application Defined Page Cache.
    The default page cache that is built into SQLite honors the request,
    however alternative application-defined page cache implementations
    may choose to interpret the suggested cache size in different ways
    or to ignore it all together.
    The default suggested cache size is -2000, which means the cache size
    is limited to 2048000 bytes of memory.
    The default suggested cache size can be altered using the
    SQLITE_DEFAULT_CACHE_SIZE compile-time options.
    The TEMP database has a default suggested cache size of 0 pages.

    If the argument N is positive then the suggested cache size is set 
    to N. 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.  SQLite remembers the number of pages in the page cache,
    not the amount of memory used.  So if you set the cache size using
    a negative number and subsequently change the page size (using the
    PRAGMA page_size command) then the maximum amount of cache
    memory will go up or down in proportion to the change in page size.

    Backwards compatibility note:
    The behavior of cache_size with a negative N
    was different prior to version 3.7.10 (2012-01-16).  In
    earlier versions, the number of pages in the cache was set
    to the absolute value of N.

    When you change the cache size using the cache_size pragma, the
    change only endures for the current session.  The cache size reverts
    to the default value when the database is closed and reopened.

    The default page cache implemention does not allocate
    the full amount of cache memory all at once.  Cache memory
    is allocated in smaller chunks on an as-needed basis.  The page_cache
    setting is a (suggested) upper bound on the amount of memory that the
    cache can use, not the amount of memory it will use all of the time.
    This is the behavior of the default page cache implementation, but an
    application defined page cache is free
    to behave differently if it wants.pragma.html#pragma_cache_size
q¿   øqƒ$–Ú-   W;…QPragma statements supported by SQLite PRAGMA compile_optionsPRAGMA compile_options;
    This pragma returns the names of compile-time options used when
    building SQLite, one option per row.  The "SQLITE_" prefix is omitted
    from the returned option names.  See also the
    sqlite3_compileoption_get() C/C++ interface and the
    sqlite_compileoption_get() SQL functions.pragma.html#pragma_compile_optionsY–Ú,    W9uOPragma statements supported by SQLite PRAGMA collation_listPRAGMA collation_list;
    Return a list of the collating sequences defined for the current
    database connection.pragma.html#pragma_collation_list…–Ú+  WEˆQ[Pragma statements supported by SQLite PRAGMA checkpoint_fullfsyncPRAGMA checkpoint_fullfsync
       PRAGMA checkpoint_fullfsync = boolean;
    Query or change the fullfsync flag for checkpoint operations.
    If this flag is set, then the F_FULLFSYNC syncing method is used
    during checkpoint operations on systems that support F_FULLFSYNC. 
    The default value of the checkpoint_fullfsync flag
    is off.  Only Mac OS-X supports F_FULLFSYNC.

    If the fullfsync flag is set, then the F_FULLFSYNC syncing
    method is used for all sync operations and the checkpoint_fullfsync
    setting is irrelevant.pragma.html#pragma_checkpoint_fullfsync„*–Ú*  W;‡QPragma statements supported by SQLite PRAGMA cell_size_checkPRAGMA cell_size_check
       PRAGMA cell_size_check = boolean;
    The cell_size_check pragma enables or disables additional sanity
    checking on database b-tree pages as they are initially read from disk.
    With cell size checking enabled, database corruption is detected earlier
    and is less likely to "spread".  However, there is a small performance
    hit for doing the extra checks and so cell size checking is turned off
    by default.pragma.html#pragma_cell_size_checkˆ<–Ú)  WC'YPragma statements supported by SQLite PRAGMA case_sensitive_likePRAGMA case_sensitive_like = boolean;
    The default behavior of the LIKE operator is to ignore case
    for ASCII characters. Hence, by default 'a' LIKE 'A' is
    true.  The case_sensitive_like pragma installs a new application-defined
    LIKE function that is either case sensitive or insensitive depending
    on the value of the case_sensitive_like pragma.
    When case_sensitive_like is disabled, the default LIKE behavior is
    expressed.  When case_sensitive_like is enabled, case becomes
    significant.  So, for example,
    'a' LIKE 'A' is false but 'a' LIKE 'a' is still true.

    This pragma uses sqlite3_create_function() to overload the
    LIKE and GLOB functions, which may override previous implementations
    of LIKE and GLOB registered by the application.  This pragma
    only changes the behavior of the SQL LIKE operator.  It does not
    change the behavior of the sqlite3_strlike() C-language interface,
    which is always case insensitive.pragma.html#pragma_case_sensitive_like
½
F½‹–Ú/     WE”3[Pragma statements supported by SQLite PRAGMA data_store_directoryPRAGMA data_store_directory;
      PRAGMA data_store_directory = 'directory-name';
    Query or change the value of the sqlite3_data_directory global
    variable, which windows operating-system interface backends use to
    determine where to store database files specified using a relative
    pathname.

    Changing the data_store_directory setting is not threadsafe.
    Never change the data_store_directory setting if another thread
    within the application is running any SQLite interface at the same time.
    Doing so results in undefined behavior.  Changing the data_store_directory
    setting writes to the sqlite3_data_directory global
    variable and that global variable is not protected by a mutex.

    This facility is provided for WinRT which does not have an OS
    mechanism for reading or changing the current working directory.
    The use of this pragma in any other context is discouraged and may
    be disallowed in future releases.

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.pragma.html#pragma_data_store_directory‹5–Ú.    W7•1MPragma statements supported by SQLite PRAGMA count_changesPRAGMA count_changes;
       PRAGMA count_changes = boolean;

    Query or change the count-changes flag. Normally, when the
    count-changes flag is not set, INSERT, UPDATE and DELETE statements
    return no data. When count-changes is set, each of these commands 
    returns a single row of data consisting of one integer value - the
    number of rows inserted, modified or deleted by the command. The 
    returned change count does not include any insertions, modifications
    or deletions performed by triggers, any changes made automatically
    by foreign key actions, or updates caused by an upsert.

    Another way to get the row change counts is to use the
    sqlite3_changes() or sqlite3_total_changes() interfaces.
    There is a subtle different, though.  When an INSERT, UPDATE, or
    DELETE is run against a view using an INSTEAD OF trigger,
    the count_changes pragma reports the number of rows in the view
    that fired the trigger, whereas sqlite3_changes() and
    sqlite3_total_changes() do not.

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.pragma.html#pragma_count_changes
®
D~®‡K–Ú3        WAIWPragma statements supported by SQLite PRAGMA defer_foreign_keysPRAGMA defer_foreign_keys
       PRAGMA defer_foreign_keys = boolean;
    When the defer_foreign_keys PRAGMA is on,
    enforcement of all foreign key constraints is delayed until the
    outermost transaction is committed.  The defer_foreign_keys pragma
    defaults to OFF so that foreign key constraints are only deferred if
    they are created as "DEFERRABLE INITIALLY DEFERRED".  The 
    defer_foreign_keys pragma is automatically switched off at each
    COMMIT or ROLLBACK.  Hence, the defer_foreign_keys pragma must be
    separately enabled for each transaction.  This pragma is
    only meaningful if foreign key constraints are enabled, of course.

    The sqlite3_db_status(db,SQLITE_DBSTATUS_DEFERRED_FKS,...)
    C-language interface can be used during a transaction to determine 
    if there are deferred and unresolved foreign key constraints.pragma.html#pragma_defer_foreign_keys‡A–Ú2     WA5WPragma statements supported by SQLite PRAGMA default_cache_sizePRAGMA schema.default_cache_size;
       PRAGMA schema.default_cache_size
            = Number-of-pages;

    This pragma queries or sets the suggested maximum number of pages
    of disk cache that will be allocated per open database file.
    The difference between this pragma and cache_size is that the
    value set here persists across database connections.
    The value of the default cache size is stored in the 4-byte
    big-endian integer located at offset 48 in the header of the
    database file.
    

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.pragma.html#pragma_default_cache_size„0–Ú1      W7‡'MPragma statements supported by SQLite PRAGMA database_listPRAGMA database_list;
    This pragma works like a query to return one row for each database
    attached to the current database connection.
    The second column is "main" for the main database file, "temp"
    for the database file used to store TEMP objects, or the name of the
    ATTACHed database for other database files.
    The third column is the name of the database file itself, or an empty
    string if the database is not associated with a file.pragma.html#pragma_database_list‹–Ú0  W5”OKPragma statements supported by SQLite PRAGMA data_versionPRAGMA schema.data_version;
    The "PRAGMA data_version" command provides an indication that the
    database file has been modified.
    Interactive programs that hold database content in memory or that
    display database content on-screen can use the PRAGMA data_version
    command to determine if they need to flush and reload their memory
    or update the screen display.

    The integer values returned by two
    invocations of "PRAGMA data_version" from the same connection
    will be different if changes were committed to the database 
    by any other connection in the interim.
    The "PRAGMA data_version" value is unchanged for commits made
    on the same database connection.
    The behavior of "PRAGMA data_version" is the same for all database
    connections, including database connections in separate processes
    and shared cache database connections.

    The "PRAGMA data_version" value is a local property of each
    database connection and so values returned by two concurrent invocations
    of "PRAGMA data_version" on separate database connections are 
    often different even though the underlying database is identical.
    It is only meaningful to compare the "PRAGMA data_version" values
    returned by the same database connection at two different points in
    time.pragma.html#pragma_data_version
͘~͉,–Ú6      W?‘UPragma statements supported by SQLite PRAGMA foreign_key_checkPRAGMA schema.foreign_key_check;
        PRAGMA schema.foreign_key_check(table-name);

    The foreign_key_check pragma checks the database, or the table
    called "table-name", for 
    foreign key constraints that are violated.  The foreign_key_check
    pragma returns one row output for each foreign key violation.
    There are four columns in each result row.
    The first column is the name of the table that contains the REFERENCES
    clause.  The second column is the rowid of the row that
    contains the invalid REFERENCES clause, or NULL if the child table is a
    WITHOUT ROWID table.  The third column is the name
    of the table that is referred to. The fourth column is the index of
    the specific foreign key constraint that failed.  The fourth column
    in the output of the foreign_key_check pragma is the same integer as
    the first column in the output of the foreign_key_list pragma.
    When a "table-name" is specified, the only foreign key constraints
    checked are those created by REFERENCES clauses in the
    CREATE TABLE statement for table-name.pragma.html#pragma_foreign_key_checkŒ–Ú5     W-—CPragma statements supported by SQLite PRAGMA encodingPRAGMA encoding;
       PRAGMA encoding = 'UTF-8';
       PRAGMA encoding = 'UTF-16';
       PRAGMA encoding = 'UTF-16le';
       PRAGMA encoding = 'UTF-16be';
    In first form, if the main database has already been
    created, then this pragma returns the text encoding used by the
    main database, one of 'UTF-8', 'UTF-16le' (little-endian UTF-16
    encoding) or 'UTF-16be' (big-endian UTF-16 encoding).  If the main
    database has not already been created, then the value returned is the
    text encoding that will be used to create the main database, if 
    it is created by this session.

    The second through fifth forms of this pragma
    set the encoding that the main database will be created with if
    it is created by this session. The string 'UTF-16' is interpreted
    as "UTF-16 encoding using native machine byte-ordering".  It is not
    possible to change the text encoding of a database after it has been
    created and any attempt to do so will be silently ignored.

    If no encoding is first set with this pragma,
    then the encoding with which the main database will be created
    defaults to one determined by the
    API used to open the connection.

    Once an encoding has been set for a database, it cannot be changed.

    Databases created by the ATTACH command always use the same encoding
    as the main database.  An attempt to ATTACH a database with a different
    text encoding from the "main" database will fail.pragma.html#pragma_encodingˆc–Ú4   WIi_Pragma statements supported by SQLite PRAGMA empty_result_callbacksPRAGMA empty_result_callbacks;
       PRAGMA empty_result_callbacks = boolean;

    Query or change the empty-result-callbacks flag.

    The empty-result-callbacks flag affects the sqlite3_exec() API only.
    Normally, when the empty-result-callbacks flag is cleared, the
    callback function supplied to the sqlite3_exec() is not invoked
    for commands that return zero rows of data.  When empty-result-callbacks
    is set in this situation, the callback function is invoked exactly once,
    with the third parameter set to 0 (NULL). This is to enable programs  
    that use the sqlite3_exec() API to retrieve column-names even when
    a query returns no data.

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.pragma.html#pragma_empty_result_callbacks
´Ñ     â       \´ƒ#–Ú;   W/…EPragma statements supported by SQLite PRAGMA fullfsyncPRAGMA fullfsync
       PRAGMA fullfsync = boolean;
    Query or change the fullfsync flag. This flag
    determines whether or not the F_FULLFSYNC syncing method is used
    on systems that support it.  The default value of the fullfsync flag
    is off.  Only Mac OS X supports F_FULLFSYNC.

    See also checkpoint_fullfsync.pragma.html#pragma_fullfsync‹>–Ú:     W?•3UPragma statements supported by SQLite PRAGMA full_column_namesPRAGMA full_column_names;
       PRAGMA full_column_names = boolean;

    Query or change the full_column_names flag. This flag together 
    with the short_column_names flag determine
    the way SQLite assigns names to result columns of SELECT statements.
    Result columns are named by applying the following rules in order:
    
    If there is an AS clause on the result, then the name of
        the column is the right-hand side of the AS clause.
    If the result is a general expression, not a just the name of
        a source table column,
        then the name of the result is a copy of the expression text.
    If the short_column_names pragma is ON, then the name of the
        result is the name of the source table column without the 
        source table name prefix:  COLUMN.
    If both pragmas short_column_names and full_column_names
        are OFF then case (2) applies.
        
    The name of the result column is a combination of the source table
        and source column name:  TABLE.COLUMN
    

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.pragma.html#pragma_full_column_names>–Ú9       W9?OPragma statements supported by SQLite PRAGMA freelist_countPRAGMA schema.freelist_count;
    Return the number of unused pages in the database file.pragma.html#pragma_freelist_count‰j–Ú8       W5’KPragma statements supported by SQLite PRAGMA foreign_keysPRAGMA foreign_keys;
       PRAGMA foreign_keys = boolean;
    Query, set, or clear the enforcement of foreign key constraints.

    This pragma is a no-op within a transaction; foreign key constraint
       enforcement may only be enabled or disabled when there is no pending
       BEGIN or SAVEPOINT.

    Changing the foreign_keys setting affects the execution of
       all statements prepared
       using the database connection, including those prepared before the
       setting was changed. Any existing statements prepared using the legacy 
       sqlite3_prepare() interface may fail with an SQLITE_SCHEMA error
       after the foreign_keys setting is changed.

    As of SQLite version 3.6.19, the default setting for foreign
       key enforcement is OFF.  However, that might change in a future
       release of SQLite.  The default setting for foreign key enforcement
       can be specified at compile-time using the SQLITE_DEFAULT_FOREIGN_KEYS
       preprocessor macro.  To minimize future problems, applications should
       set the foreign key enforcement flag as required by the application
       and not depend on the default setting.pragma.html#pragma_foreign_keys‚*–Ú7       W=ƒSPragma statements supported by SQLite PRAGMA foreign_key_listPRAGMA foreign_key_list(table-name);

    This pragma returns one row for each foreign key constraint
    created by a REFERENCES clause in the CREATE TABLE statement of
    table "table-name".pragma.html#pragma_foreign_key_list
¡
Í       }ñ¡ŠK–Ú@       W1“iGPragma statements supported by SQLite PRAGMA index_infoPRAGMA schema.index_info(index-name);
    This pragma returns one row for each key column in the named index.
    A key column is a column that is actually named in the CREATE INDEX
    index statement or UNIQUE constraint or PRIMARY KEY constraint that
    created the index.  Index entries also usually contain auxiliary
    columns that point back to the table row being indexed.  The auxiliary
    index-columns are not shown by the index_info pragma, but they are
    listed by the index_xinfo pragma.

    Output columns from the index_info pragma are as follows:
    
    The rank of the column within the index.  (0 means left-most.)
    The rank of the column within the table being indexed.
        A value of -1 means rowid and a value of -2 means that an
        expression is being used.
    The name of the column being indexed.  This columns is NULL
        if the column is the rowid or an expression.
    

    If there is no index named index-name but there is a
    WITHOUT ROWID table with that name, then (as of
    SQLite version 3.30.0 on 2019-10-04) this pragma returns the
    PRIMARY KEY columns of the WITHOUT ROWID table as they are used
    in the records of the underlying b-tree, which is to say with
    duplicate columns removed.pragma.html#pragma_index_info…–Ú?        WAˆAWPragma statements supported by SQLite PRAGMA incremental_vacuumPRAGMA schema.incremental_vacuum(N);
      PRAGMA schema.incremental_vacuum;
    The incremental_vacuum pragma causes up to N pages to
    be removed from the freelist.  The database file is truncated by
    the same amount.  The incremental_vacuum pragma has no effect if
    the database is not in
    auto_vacuum=incremental mode
    or if there are no pages on the freelist.  If there are fewer than
    N pages on the freelist, or if N is less than 1, or
    if the "(N)" argument is omitted, then the entire
    freelist is cleared.pragma.html#pragma_incremental_vacuum‚K–Ú>      WMƒ1cPragma statements supported by SQLite PRAGMA ignore_check_constraintsPRAGMA ignore_check_constraints  = boolean;

    This pragma enables or disables the enforcement of CHECK constraints.
    The default setting is off, meaning that CHECK constraints are
    enforced by default.pragma.html#pragma_ignore_check_constraints†E–Ú=        W;‹IQPragma statements supported by SQLite PRAGMA hard_heap_limitPRAGMA hard_heap_limit
          PRAGMA hard_heap_limit=N

    This pragma invokes the sqlite3_hard_heap_limit64() interface with
    the argument N, if N is specified and N is a positive integer that
    is less than the current hard heap limit.
    The hard_heap_limit pragma always returns the same integer
    that would be returned by the sqlite3_hard_heap_limit64(-1) C-language
    function.  That is to say, it always returns the value of the hard
    heap limit that is set after any changes imposed by this PRAGMA.
    

    This pragma can only lower the heap limit, never raise it.
    The C-language interface sqlite3_hard_heap_limit64() must be used
    to raise the heap limit.

    See also the soft_heap_limit pragma.pragma.html#pragma_hard_heap_limitƒd–Ú< W7†MPragma statements supported by SQLite PRAGMA function_listPRAGMA function_list;
    This pragma returns a list of SQL functions
    known to the database connection.  Each row of the result
    describes a single calling signature for a single SQL function.
    Some SQL functions will have multiple rows in the result set
    if they can (for example) be invoked with a varying number of
    arguments or can accept text in various encodings.pragma.html#pragma_function_list
8
D8Ž–ÚB  W3š]IPragma statements supported by SQLite PRAGMA index_xinfoPRAGMA schema.index_xinfo(index-name);
    This pragma returns information about every column in an index.
    Unlike this index_info pragma, this pragma returns information about
    every column in the index, not just the key columns.
    (A key column is a column that is actually named in the CREATE INDEX
    index statement or UNIQUE constraint or PRIMARY KEY constraint that
    created the index.  Auxiliary columns are additional columns needed to
    locate the table entry that corresponds to each index entry.)

    Output columns from the index_xinfo pragma are as follows:
    
    The rank of the column within the index. (0 means left-most.
         Key columns come before auxiliary columns.)
    The rank of the column within the table being indexed, or -1 if
         the index-column is the rowid of the table being indexed and -2
         if the index is on an expression.
    The name of the column being indexed, or NULL if the index-column
         is the rowid of the table being indexed or an
         expression.
    1 if the index-column is sorted in reverse (DESC) order by the
         index and 0 otherwise.
    The name for the collating sequence
         used to compare values in the index-column.
    1 if the index-column is a key column and 0 if the index-column
         is an auxiliary column.
    

    If there is no index named index-name but there is a
    WITHOUT ROWID table with that name, then (as of
    SQLite version 3.30.0 on 2019-10-04) this pragma returns the
    columns of the WITHOUT ROWID table as they are used
    in the records of the underlying b-tree, which is to say with
    de-duplicated PRIMARY KEY columns first followed by data columns.pragma.html#pragma_index_xinfo…7–ÚA        W1‰AGPragma statements supported by SQLite PRAGMA index_listPRAGMA schema.index_list(table-name);
    This pragma returns one row for each index associated with the
    given table.
    Output columns from the index_list pragma are as follows:
    
    A sequence number assigned to each index for internal tracking
          purposes.
    The name of the index.
    "1" if the index is UNIQUE and "0" if not.
    "c" if the index was created by a CREATE INDEX statement,
          "u" if the index was created by a UNIQUE constraint, or
          "pk" if the index was created by a PRIMARY KEY constraint.
    "1" if the index is a partial index and "0" if not.pragma.html#pragma_index_list
l^lŸe–ÚD  W5¾KPragma statements supported by SQLite PRAGMA journal_modePRAGMA schema.journal_mode;
        PRAGMA schema.journal_mode
              = DELETE | TRUNCATE | PERSIST | MEMORY | WAL | OFF

    This pragma queries or sets the journal mode for databases
    associated with the current database connection.

    The first form of this pragma queries the current journaling
    mode for database.  When database is omitted, the
    "main" database is queried.

    The second form chang×–ÚC      W;œyQPragma statements supported by SQLite PRAGMA integrity_checkPRAGMA schema.integrity_check;
      PRAGMA schema.integrity_check(N)
      PRAGMA schema.integrity_check(TABLENAME)
    This pragma does a low-level formatting and consistency check
    of the database.  The integrity_check pragma look for:
    
     Table or index entries that are out of sequence
     Misformatted records
     Missing pages
     Missing or surplus index entries
     UNIQUE, CHECK, and NOT NULL constraint errors
     Integrity of the freelist
     Sections of the database that are used more than once, or not at all
    
    If the integrity_check pragma finds problems, strings are returned
    (as multiple rows with a single column per row) which describe
    the problems.  Pragma integrity_check will return at most N
    errors before the analysis quits, with N defaulting
    to 100.  If pragma integrity_check finds no errors, a
    single row with the value 'ok' is returned.

    The usual case is that the entire database file is checked.  However,
    if the argument is TABLENAME, then checking is only performed for the
    the table named and its associated indexes.
    This is called a "partial integrity check".  Because only a subset of the
    database is checked, errors such as unused sections of the file or duplication
    use of the same section of the file by two or more tables cannot be detected.
    The freelist is only verified on a
    partial integrity check if TABLENAME is sqlite_schema or one of its
    aliases.  Support for partial integrity checks was added with
    version 3.33.0 (2020-08-14).

    PRAGMA integrity_check does not find
    FOREIGN KEY errors.  
    Use the PRAGMA foreign_key_check command to find errors in
    FOREIGN KEY constraints.

    See also the PRAGMA quick_check command which does most of the
    checking of PRAGMA integrity_check but runs much faster.pragma.html#pragma_integrity_checkes the journaling mode for "database"
    or for all attached databases if "database" is omitted.
    The new journal mode is returned.  If the journal mode
    could not be changed, the original journal mode is returned.

    The DELETE journaling mode is the normal behavior.  In the DELETE
    mode, the rollback journal is deleted at the conclusion of each
    transaction.  Indeed, the delete operation is the action that causes
    the transaction to commit.
    (See the document titled 
    Atomic Commit In SQLite for additional detail.)

    The TRUNCATE journaling mode commits transactions by truncating
    the rollback journal to zero-length instead of deleting it.  On many
    systems, truncating a file is much faster than deleting the file since
    the containing directory does not need to be changed.

    The PERSIST journaling mode prevents the rollback journal from
    being deleted at the end of each transaction.  Instead, the header
    of the journal is overwritten with zeros.  This will prevent other
    database connections from rolling the journal back.  The PERSIST
    journaling mode is useful as an optimization on platforms where
    deleting or truncating a file is much more expensive than overwriting
    the first block of a file with zeros.  See also:
    PRAGMA journal_size_limit and SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT.

    The MEMORY journaling mode stores the rollback journal in 
    volatile RAM.  This saves disk I/O but at the expense of database
    safety and integrity.  If the application using SQLite crashes in
    the middle of a transaction when the MEMORY journaling mode is set,
    then the database file will very likely 
    go corrupt.

    The WAL journaling mode uses a write-ahead log instead of a
    rollback journal to implement transactions.  The WAL journaling mode
    is persistent; after being set it stays in effect
    across multiple database connections and after closing and
    reopening the database.  A database in WAL journaling mode
    can only be accessed by SQLite version 3.7.0 (2010-07-21)
    or later.

    The OFF journaling mode disables the rollback journal completely.
    No rollback journal is ever created and hence there is never a rollback
    journal to delete.  The OFF journaling mode disables the atomic
    commit and rollback capabilities of SQLite. The ROLLBACK command
    no longer works; it behaves in an undefined way.  Applications must
    avoid using the ROLLBACK command when the journal mode is OFF.
    If the application crashes
    in the middle of a transaction when the OFF journaling mode is
    set, then the database file will very likely
    go corrupt. Without a journal, there is no way for
    a statement to unwind partially completed operations following
    a constraint error.  This might also leave the database in a corrupted
    state.  For example, if a duplicate entry causes a 
    CREATE UNIQUE INDEX statement to fail half-way through,
    it will leave behind a partially created, and hence corrupt, index.
    Because OFF journaling
    mode allows the database file to be corrupted using ordinary SQL,
    it is disabled when SQLITE_DBCONFIG_DEFENSIVE is enabled.

    Note that the journal_mode for an in-memory database
    is either MEMORY or OFF and can not be changed to a different value.
    An attempt to change the journal_mode of an in-memory database to
    any setting other than MEMORY or OFF is ignored.  Note also that
    the journal_mode cannot be changed while a transaction is active.pragma.html#pragma_journal_mode
‘m–ÚE     WA¢
WPragma statements supported by SQLite PRAGMA journal_size_limitPRAGMA schema.journal_size_limit
    PRAGMA schema.journal_size_limit = N ;

  If a database connection is operating in
  exclusive locking mode or in
  persistent journal mode 
  (PRAGMA journal_mode=persist) then
  after committing a transaction the rollback journal file may remain in
  the file-system. This increases performance for subsequent transactions
  since overwriting an existing file is faster than append to a file,
  but it also consumes
  file-system space. After a large transaction (e.g. a VACUUM),
  the rollback journal file may consume a very large amount of space.

  Similarly, in WAL mode, the write-ahead log file is not truncated
  following a checkpoint.  Instead, SQLite reuses the existing file
  for subsequent WAL entries since overwriting is faster than appending.

  The journal_size_limit pragma may be used to limit the size of 
  rollback-journal and WAL files left
  in the file-system after transactions or checkpoints.
  Each time a transaction is committed or a WAL file resets, SQLite 
  compares the size of the rollback journal file or WAL file left in 
  the file-system to the size limit
  set by this pragma and if the journal or WAL file is larger 
  it is truncated to the limit.

  The second form of the pragma listed above is used to set a new limit
  in bytes for the specified database.  A negative number implies no limit.
  To always truncate rollback journals and WAL files to their minimum size, 
  set the journal_size_limit to zero.
  Both the first and second forms of the pragma listed above return a single
  result row containing a single integer column - the value of the journal
  size limit in bytes. The default journal size limit is -1 (no limit).  The
  SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT preprocessor macro can be used to change
  the default journal size limit at compile-time.

  This pragma only operates on the single database specified prior
  to the pragma name (or on the "main" database if no database is specified.)
  There is no way to change the journal size limit on all attached databases
  using a single PRAGMA statement.  The size limit must be set separately for
  each attached database.pragma.html#pragma_journal_size_limit
ZæZƒ–ÚG        WA„AWPragma statements supported by SQLite PRAGMA legacy_file_formatPRAGMA legacy_file_format;
    This pragma no longer functions.  It has become a no-op.
    The capabilities formerly provided by PRAGMA legacy_file_format
    are now available using the SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
    option to the sqlite3_db_config() C-language interface.pragma.html#pragma_legacy_file_format–ÚF   WAž]WPragma statements supported by SQLite PRAGMA legacy_alter_tablePRAGMA legacy_alter_table;
       PRAGMA legacy_alter_table = boolean
    This pragma sets or queries the value of the legacy_alter_table
    flag.  When this flag is on, the ALTER TABLE RENAME
    command (for changing the name of a table) works as it did
    in SQLite 3.24.0 (2018-06-04) and earlier.  More specifically,
    when this flag is on
    the ALTER TABLE RENAME command only rewrites the initial occurrence
    of the table name in its CREATE TABLE statement and in any associated
    CREATE INDEX and CREATE TRIGGER statements.  Other references to the
    table are unmodified, including:
    
     References to the table within the bodies of triggers and views.
     References to the table within CHECK constraints in the original
         CREATE TABLE statement.
     References to the table within the WHERE clauses of partial indexes.
    
    The default setting for this pragma is OFF, which means that all
    references to the table anywhere in the schema are converted to the new name.
    This pragma is provided as a work-around for older programs that
    contain code that expect the incomplete behavior
    of ALTER TABLE RENAME found in older versions of SQLite.
    New applications should leave this flag turned off.
    For compatibility with older virtual table implementations,
    this flag is turned on temporarily while the sqlite3_module.xRename
    method is being run.  The value of this flag is restored after the 
    sqlite3_module.xRename method finishes.
    The legacy alter table behavior can also be toggled on and off
    using the SQLITE_DBCONFIG_LEGACY_ALTER_TABLE option to the
    sqlite3_db_config() interface.
    The legacy alter table behavior is a per-connection setting.  Turning
    this features on or off affects all attached database files within the
    database connection.
    The setting does not persist.  Changing this setting in one connection
    does not affect any other connections.pragma.html#pragma_legacy_alter_table
ŒKŒƒ:–ÚI       W9…7OPragma statements supported by SQLite PRAGMA max_page_countPRAGMA schema.max_page_count;
        PRAGMA schema.max_page_count = N;
    Query or set the maximum number of pages in the database file.
    Both forms of the pragma return the maximum page count.  The second
    form attempts to modify the maximum page count.  The maximum page
    count cannot be reduced below the current database size.pragma.html#pragma_max_page_count•0–ÚH      W5©+KPragma statements supported by SQLite PRAGMA locking_modePRAGMA schema.locking_mode;
    PRAGMA schema.locking_mode
                = NORMAL | EXCLUSIVE
    This pragma sets or queries the database connection locking-mode. 
    The locking-mode is either NORMAL or EXCLUSIVE.

    In NORMAL locking-mode (the default unless overridden at compile-time
    using SQLITE_DEFAULT_LOCKING_MODE), a database connection
    unlocks the database file at the conclusion of each read or
    write transaction. When the locking-mode is set to EXCLUSIVE, the
    database connection never releases file-locks. The first time the
    database is read in EXCLUSIVE mode, a shared lock is obtained and 
    held. The first time the database is written, an exclusive lock is
    obtained and held.

    Database locks obtained by a connection in EXCLUSIVE mode may be
    released either by closing the database connection, or by setting the
    locking-mode back to NORMAL using this pragma and then accessing the
    database file (for read or write). Simply setting the locking-mode to
    NORMAL is not enough - locks are not released until the next time
    the database file is accessed.

    There are three reasons to set the locking-mode to EXCLUSIVE.
    
    The application wants to prevent other processes from
        accessing the database file.
    The number of system calls for filesystem operations is reduced,
        possibly resulting in a small performance increase.
    WAL databases can be accessed in EXCLUSIVE mode without the
        use of shared memory. 
        (Additional information)
    
    

    When the locking_mode pragma specifies a particular database,
    for example:

    
PRAGMA main.locking_mode=EXCLUSIVE;
    

    then the locking mode applies only to the named database.  If no
    database name qualifier precedes the "locking_mode" keyword then
    the locking mode is applied to all databases, including any new
    databases added by subsequent ATTACH commands.

   The "temp" database (in which TEMP tables and indices are stored)
   and in-memory databases
   always uses exclusive locking mode.  The locking mode of temp and
   in-memory databases cannot
   be changed.  All other databases use the normal locking mode by default
   and are affected by this pragma.

   If the locking mode is EXCLUSIVE when first entering
   WAL journal mode, then the locking mode cannot be changed to
   NORMAL until after exiting WAL journal mode. 
   If the locking mode is NORMAL when first entering WAL
   journal mode, then the locking mode can be changed between NORMAL and
   EXCLUSIVE and back again at any time and without needing to exit
   WAL journal mode.pragma.html#pragma_locking_mode
¹–¹X–ÚK      W3IPragma statements supported by SQLite PRAGMA module_listPRAGMA module_list;
    This pragma returns a list of 
    virtual table modules registered with the database connection.pragma.html#pragma_module_listŽe–ÚJ   W/œ!EPragma statements supported by SQLite PRAGMA mmap_sizePRAGMA schema.mmap_size;
         PRAGMA schema.mmap_size=N

    Query or change the maximum number of bytes that are set
       aside for memory-mapped I/O on a single database.  The first form
       (without an argument) queries the current limit.  The second
       form (with a numeric argument) sets the limit for the specified
       database, or for all databases if the optional database name is
       omitted.  In the second form, if the database name is omitted, the
       limit that is set becomes the default limit for all databases that
       are added to the database connection by subsequent ATTACH
       statements.

    The argument N is the maximum number of bytes of the database file
       that will be accessed using memory-mapped I/O.  If N is zero then
       memory mapped I/O is disabled.  If N is negative, then the limit
       reverts to the default value determined by the most recent
       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE), or to the compile
       time default determined by SQLITE_DEFAULT_MMAP_SIZE if not
       start-time limit has been set.

    The PRAGMA mmap_size statement will never increase the amount
       of address space used for memory-mapped I/O above the
       hard limit set by the SQLITE_MAX_MMAP_SIZE compile-time option,
       nor the hard limit set at startup-time by the second argument to
       sqlite3_config(SQLITE_CONFIG_MMAP_SIZE)

    The size of the memory-mapped I/O region cannot be changed while
       the memory-mapped I/O region is in active use, to avoid unmapping
       memory out from under running SQL statements.  For this reason,
       the mmap_size pragma may be a no-op if the prior mmap_size is non-zero
       and there are other SQL statements running concurrently on the same
       database connection.pragma.html#pragma_mmap_size
Í1–ÚM    W15GPragma statements supported by SQLite PRAGMA page_countPRAGMA schema.page_count;
    Return the total number of pages in the database file.pragma.html#pragma_page_countš.–ÚL    W-³7CPragma statements supported by SQLite PRAGMA optimizePRAGMA 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.
  To achieve the best long-term query performance without the need to
  do a detailed engineering analysis of the application schema and SQL,
  it is recommended that applications run "PRAGMA optimize" (with no arguments)
  just before closing each database connection.  Long-running applications
  might also benefit from setting a timer to run "PRAGMA optimize" every
  few hours.
  
  This pragma is usually a no-op or nearly so and is very fast.
  However if SQLite feels
  that performing database optimizations (such as running ANALYZE
  or creating new indexes) will improve the performance of future queries, then
  some database I/O may be done.  Applications that want to limit the amount
  of work performed can set a timer that will invoke
  sqlite3_interrupt() if the pragma goes on for too long.
  Or, since SQLite 3.32.0, the application can use 
  PRAGMA analysis_limit=N for some small
  value of N (a few hundred or a few thousand) to limit the depth
  of analyze.
  
  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 MASK argument is a bitmask of optimizations to perform:
  
  
         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.
  
         Run ANALYZE on tables that might benefit.  On by default.
         See below for additional information.
  
         (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.
  
         (Not yet implemented)
         Create indexes that might have been helpful to recent queries.
  
  The default MASK is and always shall be 0xfffe.  The 0xfffe mask means
  perform all of the optimizations listed above except Debug Mode.  If new
  optimizations are added in the future that should be off by default, those
  new optimizations will be given a mask of 0x10000 or larger.

  To see all optimizations that would have been done without actually
  doing them, run "PRAGMA optimize(-1)".  To use only the ANALYZE
  optimization, run "PRAGMA optimize(0x02)".
  
  Determination Of When To Run Analyze
   In the current implementation, a table is analyzed if and only if 
      all of the following are true:
  
  
    MASK bit 0x02 is set.
  
    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.
  
    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.pragma.html#pragma_optimize
q‡     ¡‚ùq…–ÚS       W=ˆASPragma statements supported by SQLite PRAGMA read_uncommittedPRAGMA read_uncommitted;
       PRAGMA read_uncommitted = boolean;
    Query, set, or clear READ UNCOMMITTED isolation. The default isolation
    level for SQLite is SERIALIZABLE.  Any process or thread can select
    READ UNCOMMITTED isolation, but SERIALIZABLE will still be used except
    between connections that share a common page and schema cache.
    Cache sharing is enabled using the sqlite3_enable_shared_cache() API.
    Cache sharing is disabled by default.
    

    See SQLite Shared-Cache Mode for additional information.pragma.html#pragma_read_uncommitted…–ÚR    W3ˆWIPragma statements supported by SQLite PRAGMA quick_checkPRAGMA schema.quick_check;
      PRAGMA schema.quick_check(N)
      PRAGMA schema.quick_check(TABLENAME)
    The pragma is like integrity_check except that it does not verify
    UNIQUE constraints and does not verify
    that index content matches table content.  By skipping UNIQUE
    and index consistency checks, quick_check is able to run faster.
    PRAGMA quick_check runs in O(N) time whereas PRAGMA integrity_check
    requires O(NlogN) time where N is the total number of rows in the 
    database. Otherwise the two pragmas are the same.pragma.html#pragma_quick_check„–ÚQ        W1‡GPragma statements supported by SQLite PRAGMA query_onlyPRAGMA query_only;
      PRAGMA query_only = boolean;

    The query_only pragma prevents data changes on database files when
    enabled.  When this pragma is enabled, any attempt to CREATE, DELETE,
    DROP, INSERT, or UPDATE will result in an SQLITE_READONLY error.
    However, the database is not truly read-only.  You can still run
    a checkpoint or a COMMIT and the return value of the
    sqlite3_db_readonly() routine is not affected.pragma.html#pragma_query_onlyJ–ÚP    W3cIPragma statements supported by SQLite PRAGMA pragma_listPRAGMA pragma_list;
    This pragma returns a list of PRAGMA commands
    known to the database connection.pragma.html#pragma_pragma_list„–ÚO        W5†oKPragma statements supported by SQLite PRAGMA parser_tracePRAGMA parser_trace = boolean; 

    If SQLite has been compiled with the SQLITE_DEBUG compile-time
    option, then the parser_trace pragma can be used to turn on tracing
    for the SQL parser used internally by SQLite.
    This feature is used for debugging SQLite itself.

    
    
    This pragma is intended for use when debugging SQLite itself.  It
    is only available when the SQLITE_DEBUG compile-time option
    is used.pragma.html#pragma_parser_traceˆt–ÚN        W/?EPragma statements supported by SQLite PRAGMA page_sizePRAGMA schema.page_size;
       PRAGMA schema.page_size = bytes;
    Query or set the page size of the database. The page
    size must be a power of two between 512 and 65536 inclusive.
    

    When a new database is created, SQLite assigns a page size to
    the database based on platform and filesystem.  For many years,
    the default page size was almost always 1024 bytes, but beginning
    with SQLite version 3.12.0 (2016-03-29), 
    the default page size increased to 4096.
    The default page size is recommended for most applications.

    Specifying a new page size does not change the page size
    immediately.  Instead, the new page size is remembered and is used
    to set the page size when the database is first created, if it does
    not already exist when the page_size pragma is issued, or at the
    next VACUUM command that is run on the same database connection
    while not in WAL mode.

    The SQLITE_DEFAULT_PAGE_SIZE compile-time option can be used
    to change the default page size assigned to new databases.pragma.html#pragma_page_size
åDåŒZ–ÚU  WO—KePragma statements supported by SQLite PRAGMA reverse_unordered_selectsPRAGMA reverse_unordered_selects;
       PRAGMA reverse_unordered_selects = boolean;
    When enabled, this PRAGMA causes many SELECT statements without
    an ORDER BY clause to emit their results in the reverse order from what
    they normally would.  This can help debug applications that are
    making invalid assumptions about the result order.  
    The reverse_unordered_selects pragma works for most SELECT statements,
    however the query planner may sometimes choose an algorithm that is
    not easily reversed, in which case the output will appear in the same
    order regardless of the reverse_unordered_selects setting.
    SQLite makes no
    guarantees about the order of results if a SELECT omits the ORDER BY
    clause.  Even so, the order of results does not change from one
    run to the next, and so many applications mistakenly come to depend
    on the arbitrary output order whatever that order happens to be.  However, 
    sometimes new versions of SQLite will contain optimizer enhancements
    that will cause the output order of queries without ORDER BY clauses
    to shift.  When that happens, applications that depend on a certain
    output order might malfunction.  By running the application multiple
    times with this pragma both disabled and enabled, cases where the
    application makes faulty assumptions about output order can be
    identified and fixed early, reducing problems
    that might be caused by linking against a different version of SQLite.pragma.html#pragma_reverse_unordered_selects‰7–ÚT     WA‘!WPragma statements supported by SQLite PRAGMA recursive_triggersPRAGMA recursive_triggers;
       PRAGMA recursive_triggers = boolean;
    Query, set, or clear the recursive trigger capability.

    Changing the recursive_triggers setting affects the execution of
       all statements prepared
       using the database connection, including those prepared before the
       setting was changed. Any existing statements prepared using the legacy 
       sqlite3_prepare() interface may fail with an SQLITE_SCHEMA error
       after the recursive_triggers setting is changed.

    Prior to SQLite version 3.6.18 (2009-09-11), 
    recursive triggers were not supported.
    The behavior of SQLite was always as if this pragma was
    set to OFF.  Support for recursive triggers was added in version 3.6.18
    but was initially turned OFF by default, for compatibility.  Recursive
    triggers may be turned on by default in future versions of SQLite.
    

    The depth of recursion for triggers has a hard upper limit set by
    the SQLITE_MAX_TRIGGER_DEPTH compile-time option and a run-time
    limit set by sqlite3_limit(db,SQLITE_LIMIT_TRIGGER_DEPTH,...).pragma.html#pragma_recursive_triggers
·
O‡·…K–ÚX     WA‰IWPragma statements supported by SQLite PRAGMA short_column_namesPRAGMA short_column_names;
       PRAGMA short_column_names = boolean;

    Query or change the short-column-names flag. This flag affects
    the way SQLite names columns of data returned by SELECT statements.
    See the full_column_names pragma for full details.
    

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.pragma.html#pragma_short_column_namesC–ÚW      W7™MMPragma statements supported by SQLite PRAGMA secure_deletePRAGMA schema.secure_delete;
     PRAGMA schema.secure_delete = boolean|FAST
    Query or change the secure-delete setting. When secure_delete is
    on, SQLite overwrites deleted content with zeros.  The default
    setting for secure_delete is determined by the SQLITE_SECURE_DELETE
    compile-time option and is normally off.  The off setting for
    secure_delete improves performance by reducing the number of CPU cycles
    and the amount of disk I/O.  Applications that wish to avoid leaving
    forensic traces after content is deleted or updated should enable the
    secure_delete pragma prior to performing the delete or update, or else
    run VACUUM after the delete or update.

    The "fast" setting for secure_delete (added circa 2017-08-01)
    is an intermediate setting in between "on" and "off".
    When secure_delete is set to "fast",
    SQLite will overwrite deleted content with zeros only if doing so
    does not increase the amount of I/O.  In other words, the "fast"
    setting uses more CPU cycles but does not use more I/O.
    This has the effect of purging all old content from b-tree pages,
    but leaving forensic traces on freelist pages.

    
    When there are attached databases and no database
    is specified in the pragma, all databases have their secure-delete
    setting altered.
    The secure-delete setting for newly attached databases is the setting
    of the main database at the time the ATTACH command is evaluated.

    
    When multiple database connections share the same cache, changing
    the secure-delete flag on one database connection changes it for them
    all.pragma.html#pragma_secure_delete‹,–ÚV   W9•OPragma statements supported by SQLite PRAGMA schema_versionPRAGMA schema.schema_version; 
      PRAGMA schema.schema_version = integer ;

   The schema_version pragma will get or set
       the value of the schema-version integer at offset 40 in the
       database header. 

    SQLite automatically increments the schema-version whenever the
       schema changes. As each SQL statement runs, the schema version is
       checked to ensure that the schema has not changed since the SQL
       statement was prepared.
       Subverting this mechanism by using "PRAGMA schema_version=N"
       to change the value of the schema_version
       may cause SQL statement to run using an obsolete schema,
       which can lead to incorrect answers and/or
       database corruption.
       It is always safe to read the schema_version, but changing the
       schema_version can cause problems.  For this reason, attempts
       to change the value of schema_version are a silent no-op when
       defensive mode is enabled for a
       database connection.

       
    
    Warning:
    Misuse of this pragma can result in database corruption.
    
  

    For the purposes of this pragma, the VACUUM command is considered
       a schema change, since VACUUM will usually alter the "rootpage"
       values for entries in the sqlite_schema table.


    See also the application_id pragma and user_version pragma.pragma.html#pragma_schema_version

1èð
1…:–Ú[  W'‰[=Pragma statements supported by SQLite PRAGMA statsPRAGMA stats; 
    This pragma returns auxiliary information about tables and
    indices.  The returned information is used during testing to help
    verify that the query planner is operating correctly.  The format
    and meaning of this pragma will likely change from one release
    to the next. Because of its volatility, the behavior and output
    format of this pragma are deliberately undocumented.

    
    
    The intended use of this pragma is only for testing and validation of
    SQLite.  This pragma is subject to change without notice and is not
    recommended for use by application programs.pragma.html#pragma_statsƒs–ÚZ   W;†%QPragma statements supported by SQLite PRAGMA soft_heap_limitPRAGMA soft_heap_limit
          PRAGMA soft_heap_limit=N

    This pragma invokes the sqlite3_soft_heap_limit64() interface with
    the argument N, if N is specified and is a non-negative integer.
    The soft_heap_limit pragma always returns the same integer
    that would be returned by the sqlite3_soft_heap_limit64(-1) C-language
    function.
    
    See also the hard_heap_limit pragma.pragma.html#pragma_soft_heap_limit‚–ÚY W7‚mMPragma statements supported by SQLite PRAGMA shrink_memoryPRAGMA shrink_memory

    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().pragma.html#pragma_shrink_memory
ššœa–Ú\ W3¸IPragma statements supported by SQLite PRAGMA synchronousPRAGMA schema.synchronous;
        PRAGMA schema.synchronous = 
          0 | OFF | 1 | NORMAL | 2 | FULL | 3 | EXTRA;

    Query or change the setting of the "synchronous" flag.
    The first (query) form will return the synchronous setting as an 
    integer.  The second form changes the synchronous setting.
    The meanings of the various synchronous settings are as follows:
    
    EXTRA (3)
    
    EXTRA synchronous is like FULL with the addition that the directory
    containing a rollback journal is synced after that journal is unlinked
    to commit a transaction in DELETE mode.  EXTRA provides additional
    durability if the commit is followed closely by a power loss.
    FULL (2)
    
    When synchronous is FULL (2), the SQLite database engine will
    use the xSync method of the VFS to ensure that all content is safely
    written to the disk surface prior to continuing.
    This ensures that an operating system crash or power failure will
    not corrupt the database.
    FULL synchronous is very safe, but it is also slower.  FULL is the
    most commonly used synchronous setting when not in WAL mode.
    NORMAL (1)
    
    When synchronous is NORMAL (1), the SQLite database
    engine will still sync at the most critical moments, but less often
    than in FULL mode.  There is a very small (though non-zero) chance that
    a power failure at just the wrong time could corrupt the database in
    journal_mode=DELETE on an older filesystem.
    WAL mode is safe from corruption with synchronous=NORMAL, and probably
    DELETE mode is safe too on modern filesystems.  WAL mode is always consistent
    with synchronous=NORMAL, but WAL mode does lose durability.  A transaction
    committed in WAL mode with synchronous=NORMAL might roll back following
    a power loss or system crash.  Transactions are durable across application
    crashes regardless of the synchronous setting or journal mode.
    The synchronous=NORMAL setting is a good choice for most applications
    running in WAL mode.
    OFF (0)
    
    With synchronous OFF (0), SQLite continues without syncing
    as soon as it has handed data off to the operating system.
    If the application running SQLite crashes, the data will be safe, but
    the database might become corrupted if the operating system
    crashes or the computer loses power before that data has been written
    to the disk surface.  On the other hand, commits can be orders of
    magnitude faster with synchronous OFF.
    
    
 
    In WAL mode when synchronous is NORMAL (1), the WAL file is
    synchronized before each checkpoint and the database file is
    synchronized after each completed checkpoint and the WAL file
    header is synchronized when a WAL file begins to be reused after
    a checkpoint, but no sync operations occur during most transactions.
    With synchronous=FULL in WAL mode, an additional
    sync operation of the WAL file happens after each transaction commit.
    The extra WAL sync following each transaction helps ensure that 
    transactions are durable across a power loss.  Transactions are
    consistent with or without the extra syncs provided by
    synchronous=FULL.
    If durability is not a concern, then synchronous=NORMAL is normally
    all one needs in WAL mode.

    The TEMP schema always has synchronous=OFF since the content of
    of TEMP is ephemeral and is not expected to survive a power outage.
    Attempts to change the synchronous setting for TEMP are
    silently ignored.

    See also the fullfsync and checkpoint_fullfsync pragmas.pragma.html#pragma_synchronous
ŒdÌŒ„;–Ú_   W3‡EIPragma statements supported by SQLite PRAGMA table_xinfoPRAGMA schema.table_xinfo(table-name);
    This pragma returns one row for each column in the named table,
    including generated columns and hidden columns.
    The output has the same columns as for PRAGMA table_info plus
    a column, "hidden", whose value signifies a normal column (0),
    a dynamic or stored generated column (2 or 3),
    or a hidden column in a virtual table (1). The rows for which
    this field is non-zero are those omitted for PRAGMA table_info.pragma.html#pragma_table_xinfo‹–Ú^  W1”yGPragma statements supported by SQLite PRAGMA table_listPRAGMA table_list;
         PRAGMA schema.table_list;
         PRAGMA table_list(table-name);
    This pragma returns information about the tables and views in the schema,
    one table per row of output.  The table_list pragma first appeared
    in SQLite version 3.37.0 (2021-11-27).  As of its initial release
    the columns returned by the table_list pragma include those listed below.
    Future versions of SQLite will probably add additional columns of
    output.
    
    
     schema: the schema in which the table or view appears
    (for example "main" or "temp").
     name: the name of the table or view.
     type: the type of object - one of "table", "view",
           "shadow" (for shadow tables), or "virtual" for
           virtual tables.
     ncol: the number of columns in the table, including
         generated columns and hidden columns.
     wr: 1 if the table is a WITHOUT ROWID table or 0 if is not.
     strict: 1 if the table is a STRICT table or 0 if it is not.
     Additional columns will likely be added in future releases.
    
    
    The default behavior is to show all tables in all schemas.  If the
    schema. name appears before the pragma, then only tables in that
    one schema are shown.  If a table-name argument is supplied, then
    only information about that one table is returned.pragma.html#pragma_table_list‡–Ú]        W1GPragma statements supported by SQLite PRAGMA table_infoPRAGMA schema.table_info(table-name);
    This pragma returns one row for each normal column
    in the named table.
    Columns in the result set include: "name" (its name); "type"
    (data type if given, else ''); "notnull" (whether or not the column
    can be NULL); "dflt_value" (the default value for the column);
    and "pk" (either zero for columns that are not part of the primary key,
    or the 1-based index of the column within the primary key).
    The "cid" column should not be taken to mean more than
    "rank within the current result set".
    The table named in the table_info pragma can also be a view.
    This pragma does not show information about generated columns or
    hidden columns.  Use PRAGMA table_xinfo to get a more complete list
    of columns that includes generated and hidden columns.pragma.html#pragma_table_info
o
 o‘,–Úa     WE¡[Pragma statements supported by SQLite PRAGMA temp_store_directoryPRAGMA temp_store_directory;
      PRAGMA temp_store_directory = 'directory-name';
    Query or change the value of the sqlite3_temp_directory global
    variable, which many operating-system interface backends use to
    determine where to store temporary tables and indices.

    When the temp_store_directory setting is changed, all existing temporary
    tables, indices, triggers, and viewers in the database connection that
    issued the pragma are immediately deleted.  In
    practice, temp_store_directory should be set immediately after the first
    database connection for a process is opened.  If the temp_store_directory
    is changed for one database connection while other database connections
    are open in the same process, then the behavior is undefined and
    probably undesirable.

    Changing the temp_store_directory setting is not threadsafe.
    Never change the temp_store_directory setting if another thread
    within the application is running any SQLite interface at the same time.
    Doing so results in undefined behavior.  Changing the temp_store_directory
    setting writes to the sqlite3_temp_directory global
    variable and that global variable is not protected by a mutex.

    The value directory-name should be enclosed in single quotes.
    To revert the directory to the default, set the directory-name to
    an empty string, e.g., PRAGMA temp_store_directory = ''.  An
    error is raised if directory-name is not found or is not
    writable. 

    The default directory for temporary files depends on the OS.  Some
    OS interfaces may choose to ignore this variable and place temporary
    files in some other directory different from the directory specified
    here.  In that sense, this pragma is only advisory.

    
    
    This pragma is deprecated and exists
    for backwards compatibility only.  New applications
    should avoid using this pragma.  Older applications should discontinue
    use of this pragma at the earliest opportunity.  This pragma may be omitted
    from the build when SQLite is compiled using SQLITE_OMIT_DEPRECATED.pragma.html#pragma_temp_store_directory‹[–Ú`    W1–  GPragma statements supported by SQLite PRAGMA temp_storePRAGMA temp_store;
        PRAGMA temp_store = 
            0 | DEFAULT | 1 | FILE | 2 | MEMORY;

    Query or change the setting of the "temp_store" parameter.
    When temp_store is DEFAULT (0), the compile-time C preprocessor macro
    SQLITE_TEMP_STORE is used to determine where temporary tables and indices
    are stored.  When
    temp_store is MEMORY (2) temporary tables and indices are kept
    as if they were in pure in-memory databases.
    When temp_store is FILE (1) temporary tables and indices are stored
    in a file.  The temp_store_directory pragma can be used to specify
    the directory containing temporary files when
    FILE is specified.  When the temp_store setting is changed,
    all existing temporary tables, indices, triggers, and views are
    immediately deleted.

    It is possible for the library compile-time C preprocessor symbol
    SQLITE_TEMP_STORE to override this pragma setting.
    The following table summarizes
    the interaction of the SQLITE_TEMP_STORE preprocessor macro and the
    temp_store pragma:

    
    
    SQLITE_TEMP_STORE
        PRAGMAtemp_store
        Storage used forTEMP tables and indices
    0
        any
        file
    1
        0
        file
    1
        1
        file
    1
        2
        memory
    2
        0
        memory
    2
        1
        file
    2
        2
        memory
    3
        any
        memorypragma.html#pragma_temp_store
î
ÜÇMî„Z–Úf   W1ˆGPragma statements supported by SQLite PRAGMA vdbe_debugPRAGMA vdbe_debug = boolean;

    If SQLite has been compiled with the SQLITE_DEBUG compile-time
    option, then the vdbe_debug pragma is a shorthand for three other
    debug-only pragmas: vdbe_addoptrace, vdbe_listing, and vdbe_trace.
    This feature is used for debugging SQLite itself.  See the 
    VDBE documentation for more 
    information.

    
    
    This pragma is intended for use when debugging SQLite itself.  It
    is only available when the SQLITE_DEBUG compile-time option
    is used.pragma.html#pragma_vdbe_debug„u–Úe  W;ˆ)QPragma statements supported by SQLite PRAGMA vdbe_addoptracePRAGMA vdbe_addoptrace = boolean;

    If SQLite has been compiled with the SQLITE_DEBUG compile-time
    option, then the vdbe_addoptrace pragma can be used to cause a complete
    VDBE opcodes to be displayed as they are created during code generation.
    This feature is used for debugging SQLite itself.  See the 
    VDBE documentation for more 
    information.

    
    
    This pragma is intended for use when debugging SQLite itself.  It
    is only available when the SQLITE_DEBUG compile-time option
    is used.pragma.html#pragma_vdbe_addoptrace„–Úd     W5†kKPragma statements supported by SQLite PRAGMA user_versionPRAGMA schema.user_version;
      PRAGMA schema.user_version = integer ;

  
    The user_version pragma will get or set
       the value of the user-version integer at offset 60 in the
       database header.  The user-version is an integer that is
       available to applications to use however they want.  SQLite
       makes no use of the user-version itself.

    See also the application_id pragma and schema_version pragma.pragma.html#pragma_user_versionˆM–Úc   W9]OPragma statements supported by SQLite PRAGMA trusted_schemaPRAGMA trusted_schema;
      PRAGMA trusted_schema = boolean;
    The trusted_schema setting is a per-connection boolean that
    determines whether or not SQL functions and virtual tables that
    have not been security audited are allowed to be run by views,
    triggers, or in expressions of the schema such as CHECK constraints,
    DEFAULT clauses, generated columns, expression indexes, and/or
    partial indexes.  This setting can also be controlled using
    the sqlite3_db_config(db,SQLITE_DBCONFIG_TRUSTED_SCHEMA,...)
    C-language interface.
    In order to maintain backwards compatibility, this setting is
    ON by default.  There are advantages to turning it off, and most
    applications will be unaffected if it is turned off.  For that reason,
    all applications are encouraged to switch this setting off on every
    database connection as soon as that connection is opened.
    The -DSQLITE_TRUSTED_SCHEMA=0 compile-time option will cause
    this setting to default to OFF.pragma.html#pragma_trusted_schema…M–Úb       W+‰yAPragma statements supported by SQLite PRAGMA threadsPRAGMA threads;
      PRAGMA threads = N;
    Query or change the value of the 
    sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,...) limit for
    the current database connection.  This limit sets an upper bound
    on the number of auxiliary threads that a prepared statement is
    allowed to launch to assist with a query.  The default limit is 0
    unless it is changed using the SQLITE_DEFAULT_WORKER_THREADS
    compile-time option.  When the limit is zero, that means no
    auxiliary threads will be launched.

    This pragma is a thin wrapper around the
    sqlite3_limit(db,SQLITE_LIMIT_WORKER_THREADS,...) interface.pragma.html#pragma_threads
TÆ
kT†–Úi       WAŠWWPragma statements supported by SQLite PRAGMA wal_autocheckpointPRAGMA wal_autocheckpoint;
          PRAGMA wal_autocheckpoint=N;

    This pragma queries or sets the write-ahead log 
    auto-checkpoint interval.
    When the write-ahead log is enabled (via the
    journal_mode pragma) a checkpoint will be run automatically whenever
    the write-ahead log equals or exceeds N pages in length.
    Setting the auto-checkpoint size to zero or a negative value
    turns auto-checkpointing off.
    
    This pragma is a wrapper around the
    sqlite3_wal_autocheckpoint() C interface.
    All automatic checkpoints are PASSIVE.

    Autocheckpointing is enabled by default with an interval
    of 1000 or SQLITE_DEFAULT_WAL_AUTOCHECKPOINT.pragma.html#pragma_wal_autocheckpoint„V–Úh     W1‡GPragma statements supported by SQLite PRAGMA vdbe_tracePRAGMA vdbe_trace = boolean;

    If SQLite has been compiled with the SQLITE_DEBUG compile-time
    option, then the vdbe_trace pragma can be used to cause virtual machine
    opcodes to be printed on standard output as they are evaluated.
    This feature is used for debugging SQLite.  See the 
    VDBE documentation for more 
    information.

    
    
    This pragma is intended for use when debugging SQLite itself.  It
    is only available when the SQLITE_DEBUG compile-time option
    is used.pragma.html#pragma_vdbe_trace†5–Úg  W5‹5KPragma statements supported by SQLite PRAGMA vdbe_listingPRAGMA vdbe_listing = boolean;

    If SQLite has been compiled with the SQLITE_DEBUG compile-time
    option, then the vdbe_listing pragma can be used to cause a complete
    listing of the virtual machine opcodes to appear on standard output
    as each statement is evaluated.
    With listing is on, the entire content of a program is printed
    just prior to beginning execution.  The statement
    executes normally after the listing is printed.
    This feature is used for debugging SQLite itself.  See the 
    VDBE documentation for more 
    information.

    
    
    This pragma is intended for use when debugging SQLite itself.  It
    is only available when the SQLITE_DEBUG compile-time option
    is used.pragma.html#pragma_vdbe_listing
¢…–Úk       W;ˆWQPragma statements supported by SQLite PRAGMA writable_schemaPRAGMA writable_schema  = boolean;
         PRAGMA writable_schema = RESET

    When this pragma is on, and the SQLITE_DBCONFIG_DEFENSIVE flag
    is off, then the sqlite_schema table
    can be changed using ordinary UPDATE, INSERT, and DELETE
    statements.  If the argument is "RESET" then schema writing is
    disabled (as with "PRAGMA writable_schema=OFF") and, in addition, the
    schema is reloaded.  Warning:
    misuse of this pragma can easily result in
    a corrupt database file.


This page last modified on  2022-11-21 19:17:39 UTCpragma.html#pragma_writable_schema˜Y–Új      W9¯uOPragma statements supported by SQLite PRAGMA wal_checkpointPRAGMA schema.wal_checkpoint;
       PRAGMA schema.wal_checkpoint(PASSIVE);
       PRAGMA schema.wal_checkpoint(FULL);
       PRAGMA schema.wal_checkpoint(RESTART);
       PRAGMA schema.wal_checkpoint(TRUNCATE);
   

    If the write-ahead log is enabled (via the journal_mode pragma),
    this pragma causes a checkpoint operation to run on database
    database, or on all attached databases if database
    is omitted.  If write-ahead log mode is disabled, this pragma is a
    harmless no-op.

    Invoking this
    pragma without an argument is equivalent to calling the
    sqlite3_wal_checkpoint() C interface.
    Invoking this pragma with an argument is equivalent to calling the
    sqlite3_wal_checkpoint_v2() C interface with a 
    3rd parameter
    corresponding to the argument:

    
    PASSIVE
      Checkpoint as many frames as possible without waiting for any database 
      readers or writers to finish. Sync the db file if all frames in the log
      are checkpointed. This mode is the same as calling the
      sqlite3_wal_checkpoint() C interface. The
      busy-handler callback is never invoked in
      this mode.
   
    FULL
      This mode blocks 
      (invokes the 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. FULL blocks concurrent writers while it is
      running, but readers can proceed.
   
    RESTART
      This mode works the same way as FULL with the addition that after 
      checkpointing the log file it blocks (calls the 
      busy-handler callback)
      until all readers are finished with the log file. This ensures 
      that the next client to write to the database file restarts the log file 
      from the beginning. RESTART blocks concurrent writers while it is
      running, but allowed readers to proceed.
   
    TRUNCATE
      This mode works the same way as RESTART with the 
      addition that the WAL file is truncated to zero bytes upon successful
      completion.
    


    The wal_checkpoint pragma returns a single row with three
    integer columns.  The first column is usually 0 but will be
    1 if a RESTART or FULL or TRUNCATE checkpoint was blocked from completing,
    for example because another thread or process was actively
    using the database.  In other words, the first column is 0 if the
    equivalent call to sqlite3_wal_checkpoint_v2() would have returned
    SQLITE_OK or 1 if the equivalent call would have returned SQLITE_BUSY.
    The second column is the number of modified pages that have been
    written to the write-ahead log file.
    The third column is the number of pages in the write-ahead log file
    that have been successfully moved back into the database file at
    the conclusion of the checkpoint.
   The second and third column are -1 if there is no
    write-ahead log, for example if this pragma is invoked on a database
    connection that is not in WAL mode.pragma.html#pragma_wal_checkpoint

v        €Žs–ùC       {#œ-=The Bytecode() And Tables_Used() Table-Valued Functions2.1. SchemaThe schema of the bytecode table is:

CREATE TABLE bytecode(
  addr INT,
  opcode TEXT,
  p1 INT,
  p2 INT,
  p3 INT,
  p4 TEXT,
  p5 INT,
  comment TEXT,
  subprog TEXT,
  stmt HIDDEN
);



The first eight columns are the address, opcode, and operands for a
single bytecode in the virtual machine that implements the statement.
These columns are the same columns output when using EXPLAIN.  The
bytecode virtual tables shows all operations in the prepared statement,
both the main body of the prepared statement and in subprograms used
to implement triggers or foreign key actions.  The "subprog" field
is NULL for the main body of the prepared statement, or is the trigger
name or the string "(FK)" for triggers and foreign key actions.


The schema for the tables_used table is:

CREATE TABLE tables_used(
  type TEXT,
  schema TEXT,
  name TEXT,
  wr INT,
  subprog TEXT,
  stmt HIDDEN
);



The tables_used table is intended to show which btrees of the database file
are read or written by a prepared statement, both by the main statement
itself but also by related triggers and foreign key actions.  The columns
are as follows:


type &rarr; Either "table" or "index", depending on what role
the btree is serving.

schema &rarr; Which database file the btree is located in.
This will be "main" for the main database (the usual case), or "temp" for
TEMP tables and indexes, or the name assigned to attached databases by
the ATTACH statement.

name &rarr; The name of the table or index

wr &rarr; 0 if the object is read, 1 if the object is written

subprog &rarr;  The sub-program in which the object is
accessed.  NULL means the main body of the prepared statement.  Otherwise
this field is the name of a trigger or "(FK)" for a foreign key action.

This page last modified on  2020-05-20 17:42:32 UTCbytecodevtab.html#schema‡q–ùB        {Ž1;The Bytecode() And Tables_Used() Table-Valued Functions2. UsageThe bytecode and tables_used tables are only available if SQLite has
been compiled with the -DSQLITE_ENABLE_BYTECODE_VTAB compile-time option.
The CLI has been compiled that way, and so you can use the standard
CLI as a test platform to experiement.


Both virtual tables are read-only eponymous-only virtual tables.  You use them
by mentioning them directly in the FROM clause of a SELECT statement.
They both require a single argument which is the SQL statement to be
analyzed.  For example:

SELECT * FROM bytecode('SELECT * FROM bytecode(?1)');



The argument can be either the text of an SQL statement, in which case
the bytecode (or tables_used) for that statement is returned, or the
argument can be a parameter such as ?1 or $stmt that is later bound
to a prepared statement object using the
sqlite3_bind_pointer() interface.  Use a pointer type of
"stmt-pointer" for the sqlite3_bind_pointer() interface.bytecodevtab.html#usage…–ùA    {#ˆMAThe Bytecode() And Tables_Used() Table-Valued Functions1. OverviewBytecode and tables_used are virtual tables built into SQLite that
access information about prepared statements.
Both bytecode and tables_used operate as table-valued functions.
They take a single required argument which is either the text of
an SQL statement, or a pointer to an existing prepared statement.
The bytecode function returns one row of result for each bytecode
operation in the prepared statement.  The tables_used function returns
one row for each persistent btree (either a table or an index) accessed
by the prepared statement.bytecodevtab.html#overview
[
¯[ŠO—*       %”[-TH31.1. HistoryTH3 originated from an effort to test SQLite on 
SymbianOS.
Prior to TH3, all SQLite tests were run using the
TCL script language, but TCL would not (easily)
compile on SymbianOS which made testing difficult.  The first attempt
to remedy this problem was the "TH1" (Test Harness #1) scripting 
language - a reimplementation of parts of the TCL language in a 
more portable form that would compile and run on SymbianOS, and 
that was sufficient to run the SQLite tests.  TH1
did not survive as a standard testing tool for SQLite,
but it did find continued service as a
scripting language used to customize the 
Fossil version control system.
There was also a "Test Harness #2" which was an attempt to
create a simple scripting language using operator prefix notation
to drive tests. TH3 was the third attempt.

At about that same time, some avionics manufacturers were
expressing interest in SQLite, which prompted the SQLite developers
to design TH3 to support the rigorous testing standards of
DO-178B.

The first code for TH3 was laid down on 2008-09-25.
An intense effort over the next 10 months resulted in TH3 achieving
100% MC/DC on 2009-07-25.  The TH3 code continues to be improved and
expanded.

As of 2018-05-19, the TH3 source tree consists 
and well over 500,000 lines of source code in 1709 separate files.th3.html#historyŠL—) #”U/TH31. OverviewSQLite Test Harness #3 (hereafter "TH3") is one of
three test harnesses used for testing SQLite.
TH3 meets the following objectives:


 TH3 is able to run on embedded platforms that lack the support
     infrastructure of workstations.

 TH3 tests SQLite in an as-deployed configuration using only
     published and documented interfaces.
     In other words, TH3 tests the compiled object code, not
     the source code, thus verifying that no problems were introduced
     by compiler bugs.  "Test what you fly and fly what you test."

 TH3 checks SQLite's response to out-of-memory errors, disk I/O
     errors, and power loss during transaction commit. 

 TH3 exercises SQLite in a variety of run-time configurations
     (UTF8 vs UTF16, different pages sizes, varying journal modes, etc.)
     

 TH3 achieves 100% branch test coverage (and 100% 
    MC/DC)
    over the SQLite core.
    (Test coverage of extensions such as FTS and RTREE is less than 100%).
     


TH3 was originally written for validation testing only, but has
subsequently been used for development testing and debugging
as well, and has proven very helpful in those roles.  A full-coverage
test takes less than five minutes on a workstation and hence
serves as a fast regression test during day-to-day maintenance
of the SQLite code base.th3.html#overview
îî
—+        %ŸS1TH32. OperationTH3 is a test program generator.  The output of TH3 is a program
implemented in C-code and intended to be
linked against the SQLite library under test.  The generated test
program is compiled and run on the target platform in order to verify
correct operation of SQLite on that platform.

The inputs to TH3 are test modules written in C or SQL and
small configuration
files that determine how to initialize SQLite.  The
TH3 package includes  1,444 test
modules and more than 47 configurations (as of 2018-05-19).
New modules and configurations
can be added to customize TH3 for specialized applications.
Each time TH3 is run, it reads
a subset of the available test modules and configuration files to generate
a custom C program that performs all of the specified tests under all
specified configurations.  A complete test of SQLite normally involves running
TH3 multiple times to generate multiple test programs covering different
aspects of SQLite's operation, then linking all test programs against
a common SQLite library and running them separately on the target platform.


There are no arbitrary limits in TH3.  One could generate a
single test program that contained all test modules and all configuration files.
However, such a test program might be too large to deploy on embedded
platforms.  (As of 2018-05-19, a full-up TH3 test is over 850,000 lines and
58MB of C code.)  TH3 provides the ability to break the library of test
modules up into smaller, more easily digested pieces.

Each individual test module might contain dozens, hundreds, or thousands
of separate tests.  The test modules can be written in C or as scripts of
SQL or a mixture of the two.  About two-thirds of the existing test modules are
written in pure SQL with the remainder either in pure C or a combination 
of C and SQL.


Each test module file contains a header which describes the circumstances
under which the test is valid.  For a particular configuration, only those
modules that are compatible with the configuration are run.th3.html#operation
ƒƒœx—,   E¸iQTH33. Generating A Test ProgramThe TH3 program generator is a TCL script named "mkth3.tcl".
To generate a test program, one has merely to run this script and supply
the names of files containing test modules and configurations on the
command line.  Test modules are files that use the ".test" suffix
and configurations are files that use the ".cfg" suffix.  A
typical invocation of mkth3.tcl might look something like the following:

tclsh mkth3.tcl *.test *.cfg &gt;testprog1.c


The output from the mkth3.tcl script is a C program that contains
everything needed to run the tests - everything that is except for
the SQLite library itself.  The generated test program contains 
implementations for all of the support interfaces used by the test
modules and it contains the main() routine that drives the
tests.  To convert the test program into a working executable, simply
compile it against SQLite:

cc -o testprog1 testprog1.c sqlite3.c


The compilation step shown immediately above is merely representative.
In a working installation, one would normally want
to specify optimization parameters and compile-time switches on the
compiler command line.

For testing on embedded systems, the mkth3.tcl script and the compiler
steps shown above are performed on an ordinary workstation using
a cross-compiler, then the resulting test program is
transferred onto the device to be run.

Once the test program is generated, it is run with no arguments to
perform the tests.  Progress information as well as error diagnostics
appear on standard output.  (Alternative output arrangements can be made
using a compile-time option for embedded devices that lack a standard
output channel.) The program returns zero if there are no
errors and non-zero if any problems were detected.

Typical output from a single TH3 test program run looks like this:

With SQLite 3.8.11 2015-05-15 04:13:15 56ef98a04765c34c1c2f3ed7a6f03a732f3b886e
-DSQLITE_COVERAGE_TEST
-DSQLITE_NO_SYNC
-DSQLITE_SYSTEM_MALLOC
-DSQLITE_THREADSAFE=1
Config-begin c1.
Begin c1.pager08
End c1.pager08
Begin c1.build33
End c1.build33
Begin c1.orderby01
End c1.orderby01
... 15014 lines of output omitted ....
Begin 64k.syscall01
End 64k.syscall01
Begin 64k.build01
End 64k.build01
Begin 64k.auth01
End 64k.auth01
Config-end 64k. TH3 memory used: 6373738
Config-begin wal1.
Begin wal1.wal37
End wal1.wal37
Config-end wal1. TH3 memory used: 100961
All 226 VDBE coverage points reached
th3: 0 errors out of 1442264 tests in 213.741 seconds. 64-bit little-endian
th3: SQLite 3.8.11 2015-05-15 04:13:15 56ef98a04765c34c1c2f3ed7a6f03a732f3b886e


The output begins with a report of the SQLITE_SOURCE_ID
(cross-checked again sqlite3_sourceid()) for the
SQLite under test and the compile-time options used as reported
by sqlite3_compileoption_get().  The output concludes with a summary
of the test results and a repeat of the SQLITE_SOURCE_ID.  If any
errors are detected, additional lines detail the problem.  The error
reporting lines always begin with a single space character so that they
can be quickly extracted from large output files using:

grep "&#94; "


The default output shows the beginning and end of each configuration
and test module combination.  In the example above "c1" and "64k" are
configurations and "pager08", "build33", "orderby01", etc. are test modules.
Compile-time and run-time options are available to increase or decrease
the amount of output.
The output can be increased by showing each test case within each
test module.  The output can be decreased
by degrees: omitting test modules starts and stops,
omitting configuration starts and stops, and finally by omitting all output.th3.html#generating_a_test_program............ Ok   (00:09:03)
t11: quick.rc sqlite3ss.c ~MAX_ATTACHED=125.................... Ok   (00:04:39)
t12: quick.rc ~BYTEORDER=0 ++RTREE............................. Ok   (00:07:28)
t13: quick.rc ~DISABLE_INTRINSIC ++RTREE....................... Ok   (00:07:31)
t16: quick.rc ~TRACE_SIZE_LIMIT=15 cov1/main16.test............ Ok   (00:00:22)
t14: quick.rc ~DIRECT_OVERFLOW_READ -fsigned-char.............. Ok   (00:04:35)
t15: quick.rc ~UNTESTABLE ~EXTRA_IFNULLROW..................... Ok   (00:01:44)
t17: quick.rc ~MAX_MMAP_SIZE=0................................. Ok   (00:04:46)
t18: quick.rc ++NULL_TRIM ++OFFSET_SQL_FUNC.................... Ok   (00:04:47)
t19: quick.rc ++BATCH_ATOMIC_WRITE ++DESERIALIZE............... Ok   (00:05:41)
t20: lean1.rc quick.rc......................................... Ok   (00:03:09)
t22: test.rc alignment2.rc sqlite3udl.c........................ Ok   (00:44:22)
t21: test.rc alignment1.rc..................................... Ok   (01:02:32)
t23: memdebug1.rc extensions.rc................................ Ok   (01:49:58)
t25: valgrind1.rc -O3 extensions.rc............................ Ok   (00:56:08)
t24: memdebug2.rc extensions.rc................................ Ok   (01:43:34)
t27: test-ex1.rc............................................... Ok   (00:45:00)
t26: valgrind2.rc -O3 extensions.rc............................ Ok   (01:02:52)
t29: test-ex3.rc............................................... Ok   (00:31:48)
t28: test-ex2.rc............................................... Ok   (01:12:03)
t30: test-ex4.rc............................................... Ok   (01:09:47)
t32: test.rc alignment4.rc -m32 CC=clang....................... Ok   (00:48:31)
t31: test.rc alignment3.rc sqlite3udl.c........................ Ok   (01:22:29)
t34: test.rc alignment6.rc..................................... Ok   (00:35:31)
t33: test.rc alignment5.rc extensions.rc....................... Ok   (00:59:33)
t35: test.rc alignment7.rc..................................... Ok   (00:44:10)
t40: fast.rc alignment2.rc sqlite3udl.c........................ Ok   (00:15:46)
t39: fast.rc alignment1.rc extensions.rc -m32.................. Ok   (00:33:19)
t36: test.rc ~MUTATION_TEST.................................... Ok   (00:35:45)
t42: fast.rc alignment4.rc..................................... Ok   (00:13:03)
t43: fast.rc alignment5.rc..................................... Ok   (00:13:32)
t44: fast.rc alignment6.rc..................................... Ok   (00:11:41)
t41: fast.rc alignment3.rc sqlite3udl.c........................ Ok   (00:26:31)
t45: fast.rc alignment7.rc..................................... Ok   (00:12:57)
t46: fast.rc -fsanitize=undefined.............................. Ok   (00:38:18)
*******************************************************************************
0 failures on 44 th3makes and 198583082 tests in (07:16:01) 3 cores on bella
SQLite 3.24.0 2018-05-18 17:58:33 c6071ac99cfa4b6272ac4d739fc61a85acb544f6c1c2a


As can be seen above, a single run
of multitest.tcl invokes th3make dozens of times and takes between 12 and 24
CPU hours.  The middle section of the output shows the arguments to each
individual th3make run and the result and elapse time for that th3make.
All build products and output for the separate th3make runs are
captures in subdirectories for post-test analysis.
The two-line summary at the bottom shows the total number of errors and tests
over all th3make runs and the total elapse time, together with the 
SQLITE_SOURCE_ID information for the version of SQLite that was
tested.  This summary information is recorded in the
release
checklist during final testing.

Abbreviations are applied in the multitest.tcl output so that
each th3make invocation will fit on a single 80-column output line.
The initial "th3make" verb is omitted.
"~" is shorthand for "-DSQLITE_" and "++" is stands for
"-DSQLITE_ENABLE".  Hence, multitest.tcl output line

quick.rc ~DISABLE_INTRINSIC ++RTREE


Really means

th3make quick.rc -DSQLITE_DISABLE_INTRINSIC -DSQLITE_ENABLE_RTREEth3.html#test_automation_scripts
Îμ%—-   E÷GMTH33.1. Test Automation ScriptsTH3 comes with additional TCL scripts that help automate the testing
process on workstations.  The "th3make" script automatically runs "mkth3.tcl"
and "gcc" and then runs the resulting test program and checks the results.
Arguments to th3make include all of the "*.test" test modules and 
"*.cfg" configurations that are to be included in the test.  Additional
options to th3make can cause the test program to be compiled using different
compilers (GCC, Clang, MSVC), to use different output verbosity levels, to
run the test program under valgrind, to check the output for coverage using
gcov, and so forth.  The th3make script also accepts "*.rc" filenames as
arguments.  These *.rc files are just collections of other arguments that
are commonly used together for a single purpose.  For example, the "quick.rc"
file contains a set of eight arguments to th3make that run a fast (3-minute)
full-coverage test.  This allows the operator to type "./th3make quick.rc" as
a short-cut to typing out all of the required command-line options.  The
following are a few of the more than 40 available *.rc files:


alignmentN.rc - 
    These files contain -D options to the compiler that are used by
    various notable downstreams.
cov.rc - Options for measuring test coverage
extensions.rc - Options to enable FTS4, R-Trees,
    and STAT4.
fast.rc - Run most tests, including those not needed for
    coverage, skipping only soak tests, using delivery compiler options
    (ex: -O3)
memdebug.rc - like test.rc but also enable
    -DSQLITE_MEMDEBUG.
min.rc - Run the minimum set of tests needed for 100% coverage.
quick.rc - Run all tests required for 100% coverage tests
    using -Os and -DSQLITE_DEBUG.
test.rc - Run the same tests as in fast.rc but without
    compiler optimization and enabling options like
    -DSQLITE_DEBUG and
    -DSQLITE_ENABLE_EXPENSIVE_ASSERT.
test-ex.rc - long-running soak tests.


The TH3 repository also includes the "multitest.tcl" script, another
TCL script used to automate TH3 testing on workstations.  Multitest.tcl
automatically compiles SQLite, then
runs ./th3make repeatedly with a variety of alignments, and captures
the output in a succinct summary screen.  A typical multitest.tcl run
generates output that looks like this:

./multitest.tcl -q --jobs 3
start-time: 2018-05-19 03:17:12 UTC
file mkdir sqlite3bld
cd sqlite3bld
exec sh /ramdisk/sqlite/configure
file copy -force config.h ../config.h
exec make clean sqlite3.c
file rename sqlite3.c ../sqlite3.c
file rename sqlite3.h ../sqlite3.h
exec make clean sqlite3.c OPTS=-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1
file rename sqlite3.c ../sqlite3udl.c
exec make clean sqlite3.c OPTS=-DSQLITE_SMALL_STACK=1
file rename sqlite3.c ../sqlite3ss.c
cd ..
*******************************************************************************
t01: cov.rc.................................................... Ok   (00:03:42)
t02: cov.rc ++STAT4 ++DESERIALIZE -D_HAVE_SQLITE_CONFIG_H...... Ok   (00:04:45)
t03: vfs-cov.rc................................................ Ok   (00:03:59)
t04: demo.rc................................................... Ok   (00:00:05)
t07: test.rc ../th3private/*.test.............................. Ok   (00:00:21)
t08: test.rc ../th3private/*.test ++STAT4...................... Ok   (00:01:41)
t05: quick.rc.................................................. Ok   (00:04:26)
t09: quick.rc ~TEST_REALLOC_STRESS -funsigned-char............. Ok   (00:05:39)
t10: quick.rc ~THREADSAFE=0 -DLONGDOUBLE_TYPE=double........... Ok   (00:03:24)
t06: quick.rc extensions.rc -D_HAVE_SQLITE_CONFIG_Hë

ˆ¹…/—0     )Š5TH36. TH3 LicenseSQLite itself is in the public domain and
can be used for any purpose.  But TH3 is proprietary and requires a license.


Even though open-source users do not have direct access to TH3, all
users of SQLite benefit from TH3 indirectly since each version of SQLite is
validated running TH3 on multiple platforms (Linux, Windows, WinRT, Mac,
OpenBSD) prior to release.  So anyone using an official release
of SQLite can deploy their application with the confidence of knowing that
it has been tested using TH3.  They simply cannot rerun those tests
themselves without purchasing a TH3 license.
This page last modified on  2018-05-19 14:21:54 UTCth3.html#th3_licenseJ—/    3š1?TH35. Mutation TestingThe TH3 source tree contains a scripted name
"mutation-test.tcl" that automates the process of
mutation testing.

The mutation-test.tcl script takes care of all of the details for
running a mutation test:


 The script compiles the TH3 test harness into machine code ("th3.o") if
     necessary.
 The script compiles the sqlite3.c source file into assembly language
     ("sqlite3.s") if necessary.
 The script loops through instructions in the assembly language file
     to locate branch operations.
     
     The script makes a copy of the original sqlite3.s file.
     The copy is edited to change the branch instruction into either
         a no-op or an unconditional jump.
     The copy of sqlite3.s is assembled into sqlite3.o then linked
         again th3.o to generate the "th3" executable.
     The "th3" binary is run and the output checked for errors.
     
 The script shows progress for each cycle of the previous step then
     displays a summary of "survivors" at the end.  A "survivor" is a
     mutation that was not detected by TH3.


Mutation testing can be slow, since each test can take up to 5
minutes on a fast workstation, and there are two tests for each
branch instructions, and over 20,000 branch instructions.  Efforts are
made to expedite operation.  For example, TH3 is compiled in such a
way that it exits as soon as it finds the first error, and as many
of the mutations are easily detected,  many cycles happen in only
a few seconds.  Nevertheless, the mutation-test.tcl script includes
command-line options to limit the range of code lines tested so that
mutation testing only needs to be performed on blocks of code that
have recently changed.th3.html#mutation_testing„s—.    -‰9TH34. Test CoverageUsing one particular subset of the available TH3 test modules (the "cov1"
tests) SQLite obtained 
100% branch test coverage and 100% MC/DC as measured
by gcov
on Linux x86 and x86_64 hardware.  All releases of SQLite since
version 3.6.17 (2009-08-10) have been tested to this standard. 
The SQLite developers 
are committed to maintaining 100% branch coverage and MC/DC for all 
future releases of SQLite.

The cov1 test set used to obtain 100% branch test coverage are only a
subset of the tests currently implemented using TH3.  New test modules are
added on a regular basis.th3.html#test_coverage
§
ê       ,§—‰
Cu—_        Why SQLite Does Not Use Git2.1. Git does not provide good situational awarenessWhen I want to see what has been happening on SQLite, I visit the
timeline and in a single
screen I see a summary of the latest changes, on all branches.
In a few clicks, I can drill down as much detail as I
want.  I can even do this from a phone.


GitHub and GitLab offer nothing comparable.  The closest I have
found is the network,
which is slow to render (unless it is already cached), does not 
offer nearly as much details, and scarcely works at all on mobile.
The commits view
of GitHub provides more detail, renders quickly,
and works on mobile, but only shows a single branch at a time,
so I cannot easily know if I've seen all of the recent changes.
And even if GitHub/GitLab did offer better interfaces, both are
third-party services.  They are not a core part of Git.  Hence,
using them introduces yet another dependency into the project.


I am told that Git users commonly install third-party graphical
viewers for Git, many of which do a better job of showing recent 
activity on the project.  That is great, but these are still
more third-party applications that must be installed and
managed separately.  Many are platform-specific.  (One of the
better ones, GitUp, only works on Mac, for
example.)  All require that you first sync your local repository
then bring up their graphical interface on your desktop.  And
even with all that, I still cannot see what I typically want to 
see without multiple clicks.  Checking on project status from
a phone while away from the office is not an option.whynotgit.html#git_does_not_provide_good_situational_awarenessƒ9—‰ C!…{5Why SQLite Does Not Use Git1.1. EditsThis article has been revised multiple times in an attempt
to improve clarity, address concerns and misgivings,
and to fix errors.
The complete edit history for this document can be seen at
https://sqlite.org/docsrc/finfo/pages/whynotgit.in.
(Usage hint: Click on any two nodes of the graph for a diff.
BTW, are there any Git web interfaces that offers a similar
capability?)whynotgit.html#editsŠ—‰   C+“CWhy SQLite Does Not Use Git1. IntroductionSQLite does not use the
Git version control system.
SQLite uses
Fossil instead, which is a
version control system that was specifically designed
and written to support SQLite.


People often wonder why SQLite does not use the
Git version control system like everybody
else.
This article attempts to answer that question.  Also,
in section 3, 
this article provides hints to Git users
about how they can easily access the SQLite source code.


This article is not a comparison between Fossil
and Git.  See
https://fossil-scm.org/fossil/doc/trunk/www/fossil-v-git.wiki
for one comparison of the two systems.  Other third-party 
comparisons are available as well - use a search engine to find them.


This article is not advocating that you switch your projects
away from Git.  You can use whatever version control system you want.
If you are perfectly happy with Git, then by all means keep using
Git.  But, if Git is not working well for you or you are wondering 
if it can be improved or if there is something better,
then maybe try to understand the perspectives presented below.
Use the insights thus obtained to find or write a different and
better version control system, or to just make
improvements to Git itself.whynotgit.html#introduction
ÉëɈ—‰
CsŽWhy SQLite Does Not Use Git2.3. The mental model for Git is needlessly complexThe complexity of Git
distracts attention from the software under development.  A user of Git
needs to keep all of the following in mind:

 The working directory
 The "index" or staging area
 The local head
 The local copy of the remote head
 The actual remote head


Git has commands (and/or options on commands) for moving and
comparing content between all of these locations. 

In contrast,
Fossil users only need to think about their working directory and
the check-in they are working on.  That is 60% less distraction.
Every developer has a finite number of brain-cycles.  Fossil
requires fewer brain-cycles to operate, thus freeing up 
intellectual resources to focus on the software under development.

One user of both Git and Fossil
writes in HN:


Fossil gives me peace of mind that I have everything ... synced to 
the server with a single command....
I never get this peace of mind with git.whynotgit.html#the_mental_model_for_git_is_needlessly_complex’—‰C!¡)1Why SQLite Does Not Use Git2.2. Git makes it difficult to find successors (descendents)
of a check-inGit lets you look backwards in time, but not forwards.
Given some historical check-in, you can see what came before,
but it is challenging see what came next.


In contrast, Fossil offers helpful displays such as
https://sqlite.org/src/timeline?df=major-release
to show all check-ins that are derived from the most
recent major release.





All SQLite check-ins derived from the most recent major release



It is not impossible to find the descendents of a check-in
in Git.  It is merely difficult.  For example,
there is a 
stackoverflow page
showing the command sequence for finding the descendents of a check-in
in unix:

git rev-list --all --parents | grep ".\{40\}.*.*" | awk '{print $1}'




But this is not the same thing.  The command above gives
a list of descendents without showing the branching structure, which
is important for understanding what happened.  And the command only works
if you have a local clone of the repository; finding the descendents of
a check-in is not something you can do with web interfaces such
as GitHub or GitLab.


This is not really about just finding the descendents of a check-in
from time to time.  The fact that descendents are readily available in
Fossil means that the information pervades the web pages provided by
Fossil.  One example: Every Fossil check-in information page
(example) shows
a small "Context" graph of the immediate predecessor and successors 
to that check-in.  This helps the user maintain better situational
awareness, and it provides useful capabilities, such as the ability
click forward to the next check-in in sequence.  Another example:
Fossil easily shows the context around a specific check-in
(example)
which again helps to promote situational awareness and a deeper
understanding of what is happening in the code.  There is a
whole page of additional examples
in the Fossil documentation.


All of the above is theoretically possible with Git, given the right extensions
and tools and using the right commands.  But it is not easy to do,
and so it rarely gets done.  Consequently, developers have less awareness
of what is happening in the code.whynotgit.html#git_makes_it_difficult_to_find_successors_descendents_of_a_check_in
”

y§”‚—‰
CwsWhy SQLite Does Not Use Git3. A Git-User's Guide To Accessing SQLite Source CodeIf you are a devoted Git user, you can still easily access SQLite.  
This section gives some hints on how to do so.whynotgit.html#a_git_user_s_guide_to_accessing_sqlite_source_code…M—‰    C]‰+qWhy SQLite Does Not Use Git2.6. Git provides a poor user experienceThe following https://xkcd.com/1597/ cartoon is an
exaggeration, yet hits close to home:




Let's be real.  Few people dispute that Git provides
a suboptimal user experience.  A lot of 
the underlying implementation shows through into the user
interface.  The interface is so bad that there is even a
parody site that generates
fake git man pages.

Designing software is hard.  It takes a lot of focus.
A good version control system should provide the developer with
assistance, not frustration.  Git has gotten better in this
regard over the past decade, but it still has a long way to go.whynotgit.html#git_provides_a_poor_user_experience‰—‰  Cg{Why SQLite Does Not Use Git2.5. Git requires more administrative supportGit is complex software.
One needs an installer of some kind to put Git on a developer
workstation, or to upgrade to a newer version of Git.
Standing up a Git server is non-trivial, and so most developers
use a third-party service such as GitHub or GitLab,
and thus introduce additional dependencies.


In contrast, Fossil is a single standalone binary which is
installed by putting it on $PATH.  That one binary contains all
the functionality of core Git and also GitHub and/or GitLab.  It
manages a community server with wiki, bug tracking, and forums, 
provides packaged downloads for consumers, login managements, 
and so forth, with no extra software required.  Standing up a
community server for Fossil takes minutes.  And Fossil is efficient.
A Fossil server will run fine on a $5/month VPS or a Raspberry Pi,
whereas GitLab and similar require beefier hardware.


Less administration means that programmers spend more time working
on the software (SQLite in this case) and less time fussing with
the version control system.whynotgit.html#git_requires_more_administrative_support‹n—‰ Ck•QWhy SQLite Does Not Use Git2.4. Git does not track historical branch namesGit keeps the complete DAG of the check-in sequence.  But branch
tags are local information that is not synced and not retained
once a branch closes.
This makes review of historical
branches tedious.


As an example, suppose a customer asks you:
"What ever became of that 'prefer-coroutine-sort-subquery' branch
from two years ago?"
You might try to answer by consulting the history in
your version control system, thusly:


GitHub: https://github.com/sqlite/sqlite/commits/prefer-coroutine-sort-subquery
Fossil: https://sqlite.org/src/timeline?r=prefer-coroutine-sort-subquery



The Fossil view clearly shows that the branch was eventually merged back into
trunk.  It shows where the branch started, and it shows two occasions where changes
on trunk were merged into the branch.  GitHub shows none of this.  In fact, the
GitHub display is mostly useless in trying to figure out what happened.


Many readers have recommended various third-party GUIs for Git that
might do a better job of showing historical development activity.  Maybe
some of them do work better than native Git and/or GitHub, though they
will all be hampered by the fact that Git does not preserve historical
branch names across syncs.  And even if those other tools are better,
the fact that it is necessary to go to a third-party tool to get the information
desired does not speak well of the core system.whynotgit.html#git_does_not_track_historical_branch_names
9(m9Š/—‰ C1“GEWhy SQLite Does Not Use Git3.3. Fossil AccessFossil is easy to install and use.  Here are the steps for unix.
(Windows is similar.)



Download the self-contained Fossil executable from
https://fossil-scm.org/fossil/uv/download.html and put the executable
somewhere on your $PATH.
mkdir ~/fossils
fossil clone https://sqlite.org/src ~/fossils/sqlite.fossil
mkdir ~/sqlite; cd ~/sqlite
fossil open ~/fossils/sqlite.fossil



At this point you are ready to type "./configure; make"
(or on Windows with MSVC, "nmake /f Makefile.msc").


To change your checkout to a different version of Fossil use
the "update" command:


fossil update VERSION



Use "trunk" for VERSION to get the latest trunk version of SQLite.
Or use a prefix of a cryptographic hash name, or the name of some branch
or tag.  See
https://fossil-scm.org/fossil/doc/trunk/www/checkin_names.wiki for more
suggestions on what names can be used for VERSION.


Use the "fossil ui" command from within the ~/sqlite checkout to
bring up a local copy of the website.


Additional documentation on Fossil can be found at
https://fossil-scm.org/fossil/doc/trunk/www/permutedindex.html


Do not be afraid to explore and experiment.
Without a log-in you won't be able to
push back any changes you make, so you cannot damage the project.whynotgit.html#fossil_access‰6—‰      C+‘a?Why SQLite Does Not Use Git3.2. Web AccessThe SQLite Fossil Repository contains links
for downloading  a Tarball, ZIP Archive, or SQLite Archive for any
historical version of SQLite.  The URLs for these downloads are
simple and can be incorporated easily into automated tools.  The format is:


https://sqlite.org/src/tarball/VERSION/sqlite.tar.gz



Simply replace VERSION with some description of the version to be
downloaded.  The VERSION can be a prefix of the cryptographic hash
name of a specific check-in, or the name of a branch (in which case the
most recent version of the branch is fetched) or a tag for a specific
check-in like "version-3.23.1":


https://sqlite.org/src/tarball/version-3.23.1/sqlite.tar.gz



To get the latest release, use "release"
for VERSION, like this:


https://sqlite.org/src/tarball/release/sqlite.tar.gz



To get the latest trunk check-in, us "trunk" for VERSION:


https://sqlite.org/src/tarball/trunk/sqlite.tar.gz



And so forth.
For ZIP archives and SQLite Archives, simply change the "/tarball/" element
into either "/zip/" or "/sqlar/", and maybe also change the name of the
download file to have a ".zip" or ".sqlar" suffix.whynotgit.html#web_access‡S—‰        CK[_Why SQLite Does Not Use Git3.1. The Official GitHub MirrorAs of 2019-03-20, there is now an 
official Git mirror of the
SQLite sources on GitHub.

The mirror is an incremental export of the 
canonical Fossil repository for
SQLite.  A cron-job updates the GitHub repository once an hour.
This is a one-way, read-only code mirror.  No pull requests or 
changes are accepted via GitHub.  The GitHub repository merely copies
the content from the Fossil repository.  All changes are input via
Fossil.


The hashes that identify check-ins and files on the Git mirror are
different from the hashes in Fossil.  There are many reasons for
this, chief among them that Fossil uses a SHA3-256 hash whereas
Git uses a SHA1 hash.  During export, the original Fossil hash for
each check-in is added as a footer to check-in comments.  To avoid
confusion, always use the original Fossil hash, not the Git hash,
when referring to SQLite check-ins.whynotgit.html#the_official_github_mirror
¤¼“6—y     1O¥3[EXPLAIN QUERY PLAN1. The EXPLAIN QUERY PLAN CommandWarning: The data returned by the EXPLAIN QUERY PLAN command is 
intended for interactive debugging only.  The output format may change
between SQLite releases. Applications should not depend on the output
format of the EXPLAIN QUERY PLAN command.


Alert: As warned above, the EXPLAIN QUERY PLAN output format did
change substantially with the version 3.24.0 release (2018-06-04).
Additional minor changes occurred in version 3.36.0 (2021-06-18).
Further changes are possible in subsequent releases.


The EXPLAIN QUERY PLAN SQL command is used to obtain a high-level
description of the strategy or plan that SQLite uses to implement a specific
SQL query.  Most significantly, EXPLAIN QUERY PLAN reports on the way in 
which the query uses database indices. This document is a guide to
understanding and interpreting the EXPLAIN QUERY PLAN output.  Background
information is available separately:


 A primer on How SQLite Works.
 Notes on the query optimizer.
 How indexing works.
 The next generation query planner.


A query plan is represented as a tree.
In raw form, as returned by sqlite3_step(), each node of the tree
consists of four fields:  An integer node id, an integer parent id,
an auxiliary integer field that is not currently used, and a description
of the node.
The entire tree is therefore a table with four columns and zero or more
rows.
The command-line shell will usually intercept this table and renders
it as an ASCII-art graph for more convenient viewing.  To disable the
shells automatic graph rendering and to display EXPLAIN QUERY PLAN
output in its tabular format, run the command ".explain off" to set
the "EXPLAIN formatting mode" to off.  To restore automatic graph rendering,
run ".explain auto".  You can see the current "EXPLAIN formatting mode" 
setting using the ".show" command.

One can also set the CLI into automatic EXPLAIN QUERY PLAN mode
using the ".eqp on" command:

sqlite&gt; .eqp on


 In automatic EXPLAIN QUERY PLAN mode, the shell automatically runs
a separate EXPLAIN QUERY PLAN query for each statement you enter and
displays the result before actually running the query.  Use the
".eqp off" command to turn automatic EXPLAIN QUERY PLAN mode back off.

EXPLAIN QUERY PLAN is most useful on a SELECT statement,
but may also appear with other statements that read data from database
tables (e.g. UPDATE, DELETE, INSERT INTO ... SELECT).eqp.html#the_explain_query_plan_commandc—‰       C#‚G;Why SQLite Does Not Use Git4. See AlsoOther pages that talk about Fossil and Git include:

Fossil vs. Git
What others say about Fossil and Git

This page last modified on  2021-12-21 16:55:31 UTCwhynotgit.html#see_also†W—‰ CU‹OiWhy SQLite Does Not Use Git3.4. Verifying Source Code IntegrityIf you need to verify that the SQLite source code that you have is
authentic and has not been modified in any way (perhaps by an adversary)
that can be done using a few simple command-line tools.  At the root 
of the SQLite source tree is a file named "manifest".  The manifest 
file contains the name of every other file in the source tree together 
with either a SHA1 or SHA3-256 hash for that file.  (SHA1 is used for
older files and SHA3-256 for newer files.)  You can write a
script to extract these hashes and verify them against the source code 
files.  The hash name for the check-in is just the SHA3-256 hash of the
"manifest" file itself, possibly with the last line omitted if the
last line begins with "# Remove this line..."whynotgit.html#verifying_source_code_integrity
ÍÍž.—z   1A»CIEXPLAIN QUERY PLAN1.1. Table and Index ScansWhen processing a SELECT (or other) statement, SQLite may retrieve data from
  database tables in a variety of ways. It may scan through all the records in
  a table (a full-table scan), scan a contiguous subset of the records in a
  table based on the rowid index, scan a contiguous subset of the entries in a
  database index, or use a combination of the above strategies
  in a single scan. The various ways in which SQLite may retrieve data from a
  table or index are described in detail here.


  For each table read by the query, the output of EXPLAIN QUERY 
  PLAN includes a record for which the value in the "detail" column begins
  with either "SCAN" or "SEARCH". "SCAN" is used for a full-table scan,
  including cases where SQLite iterates through all records in a table
  in an order defined by an index. "SEARCH" indicates that only a subset of 
  the table rows are visited. Each SCAN or SEARCH record includes the
  following information:


   The name of the table, view, or subquery that data is read from.
   Whether or not an index or automatic index is used.
   Whether or not the covering index optimization applies.
   Which terms of the WHERE clause are used for indexing.



  For example, the following EXPLAIN QUERY PLAN command operates on a SELECT
  statement that is implemented by performing a full-table scan on table t1:
sqlite&gt; EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1;
QUERY PLAN
`--SCAN t1



  The example above shows
  SQLite picking full-table scan will visit all rows in the table.
  If the query were able to use an index, then the 
  SCAN/SEARCH record would include the name of the index and, for a
  SEARCH record, an indication of how the subset of rows visited is
  identified. For example:
sqlite&gt; CREATE INDEX i1 ON t1(a);
sqlite&gt; EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1;
QUERY PLAN
`--SEARCH t1 USING INDEX i1 (a=?)



  The previous example, SQLite uses index "i1" to optimize
  a WHERE clause term of the form (a=?) - in this case "a=1".
  The previous example could not use a covering index, but the following
  example can, and that fact is reflected in the output:
sqlite&gt; CREATE INDEX i2 ON t1(a, b);
sqlite&gt; EXPLAIN QUERY PLAN SELECT a, b FROM t1 WHERE a=1; 
QUERY PLAN
`--SEARCH t1 USING COVERING INDEX i2 (a=?)



  All joins in SQLite are implemented using nested scans. When a
  SELECT query that features a join is analyzed using EXPLAIN QUERY PLAN, one
  SCAN or SEARCH record is output for each nested loop. For example:
sqlite&gt; EXPLAIN QUERY PLAN SELECT t1.*, t2.* FROM t1, t2 WHERE t1.a=1 AND t1.b>2;
QUERY PLAN
|--SEARCH t1 USING INDEX i2 (a=? AND b>?)
`--SCAN t2



  The order of the entries indicates the nesting order. In
  this case, the scan of table t1 using index i2 is the outer loop (since it
  appears first)
  and the full-table scan of table t2 is the inner loop (since it appears
  last).
  In the following example, the positions of t1 and t2 in the FROM 
  clause of the SELECT are reversed. The query strategy remains the same.
  The output from EXPLAIN QUERY PLAN shows how the query is actually
  evaluated, not how it is specified in the SQL statement.
sqlite&gt; EXPLAIN QUERY PLAN SELECT t1.*, t2.* FROM t2, t1 WHERE t1.a=1 AND t1.b>2;
QUERY PLAN
|--SEARCH t1 USING INDEX i2 (a=? AND b>?)
`--SCAN t2





  If the WHERE clause of a query contains an OR expression, then SQLite might
  use the "OR by union" strategy (also known as the
  OR optimization). In this case there will be single top-level record
  for the search, with two sub-records, one for each index:
sqlite&gt; CREATE INDEX i3 ON t1(b);
sqlite&gt; EXPLAIN QUERY PLAN SELECT * FROM t1 WHERE a=1 OR b=2;
QUERY PLAN
`--MULTI-INDEX OR
   |--SEARCH t1 USING COVERING INDEX i2 (a=?)
   `--SEARCH t1 USING INDEX i3 (b=?)eqp.html#table_and_index_scans
A>A—x—|        1+¯3EXPLAIN QUERY PLAN1.3. SubqueriesIn all the examples above, there has only been a single SELECT statement.
  If a query contains sub-selects, those are shown as being children of
  the outer SELECT.  For example:

sqlite&gt; EXPLAIN QUERY PLAN SELECT (SELECT b FROM t1 WHERE a=0), (SELECT a FROM t1 WHERE b=t2.c) FROM t2;
|--SCAN TABLE t2 USING COVERING INDEX i4
|--SCALAR SUBQUERY
|  `--SEARCH t1 USING COVERING INDEX i2 (a=?)
`--CORRELATED SCALAR SUBQUERY
   `--SEARCH t1 USING INDEX i3 (b=?)



  The example above contains two "SCALAR" subqueries.  The subqueries
  are SCALAR in the sense that they return a single value - a one-row,
  one-column table.  If the actual query returns more than that, then
  only the first column of the first row is used.

  The first subquery above is constant with respect to the outer query.
  The value for the first subquery can be computed once and then reused
  for each row of the outer SELECT.  The second subquery, however, is
  "CORRELATED".  The value of the second subquery changes depending
  on values in the current row of the outer query.  Hence, the second
  subquery must be run once for each output row in the outer SELECT.


  Unless the flattening optimization is applied, if a subquery appears in
  the FROM clause of a SELECT statement, SQLite can either run the subquery and
  stores the results in a temporary table, or it can run the subquery as a
  co-routine.  The following query is an example of the latter.  The subquery
  is run by a co-routine.  The outer query blocks whenever it needs another
  row of input from the subquery.  Control switches to the co-routine which
  produces the desired output row, then control switches back to the main
  routine which continues processing.  

sqlite&gt; EXPLAIN QUERY PLAN SELECT count(*)
      &gt; FROM (SELECT max(b) AS x FROM t1 GROUP BY a) AS qqq
      &gt; GROUP BY x;
QUERY PLAN
|--CO-ROUTINE qqq
|  `--SCAN t1 USING COVERING INDEX i2
|--SCAN qqqq
`--USE TEMP B-TREE FOR GROUP BY



  
  If the flattening optimization is used on a subquery in the FROM clause
  of a SELECT statement, that effectively merges the subquery into the outer
  query.  The output of EXPLAIN QUERY PLAN reflects this, as in the following
  example:

sqlite&gt; EXPLAIN QUERY PLAN SELECT * FROM (SELECT * FROM t2 WHERE c=1) AS t3, t1;
QUERY PLAN
|--SEARCH t2 USING INDEX i4 (c=?)
`--SCAN t1




  If the content of a subquery might need to be visited more than once, then
  the use of a co-routine is undesirable, as the co-routine would then have to
  compute the data more than once.  And if the subquery cannot be flattened,
  that means the subquery must be manifested into a transient table.

sqlite&gt; SELECT * FROM
      &gt;   (SELECT * FROM t1 WHERE a=1 ORDER BY b LIMIT 2) AS x,
      &gt;   (SELECT * FROM t2 WHERE c=1 ORDER BY d LIMIT 2) AS y;
QUERY PLAN
|--MATERIALIZE x
|  `--SEARCH t1 USING COVERING INDEX i2 (a=?)
|--MATERIALIZE y
|  |--SEARCH t2 USING INDEX i4 (c=?)
|  `--USE TEMP B-TREE FOR ORDER BY
|--SCAN x
`--SCAN yeqp.html#subqueries‡=—{       1IQQEXPLAIN QUERY PLAN1.2. Temporary Sorting B-TreesIf a SELECT query contains an ORDER BY, GROUP BY or DISTINCT clause, 
  SQLite may need to use a temporary b-tree structure to sort the output
  rows. Or, it might use an index. Using an index is 
  almost always much more efficient than performing a sort.
  If a temporary b-tree is required, a record is added to the EXPLAIN
  QUERY PLAN output with the "detail" field set to a string value of
  the form "USE TEMP B-TREE FOR xxx", where xxx is one of "ORDER BY",
  "GROUP BY" or "DISTINCT". For example:

sqlite&gt; EXPLAIN QUERY PLAN SELECT c, d FROM t2 ORDER BY c;
QUERY PLAN
|--SCAN t2
`--USE TEMP B-TREE FOR ORDER BY



  In this case using the temporary b-tree can be avoided by creating an index
  on t2(c), as follows:

sqlite&gt; CREATE INDEX i4 ON t2(c);
sqlite&gt; EXPLAIN QUERY PLAN SELECT c, d FROM t2 ORDER BY c; 
QUERY PLAN
`--SCAN t2 USING INDEX i4eqp.html#temporary_sorting_b_trees
~~…—¨2  -5‰#MThe Schema Table2. Alternative NamesThe schema table can always be referenced using the name "sqlite_schema",
especially if qualifed by the schema name like 
"main.sqlite_schema" or "temp.sqlite_schema".  But for historical
compatibility, some alternative names are also recognized, including:


 sqlite_master
 sqlite_temp_schema
 sqlite_temp_master



Alternatives (2) and (3) only work for the TEMP database associated
with each database connection, but alternative (1) works anywhere.
For historical reasons, callbacks from the sqlite3_set_authorizer()
interface always refer to the schema table using names (1) or (3).schematab.html#alternative_names†
—¨1 -+‹!CThe Schema Table1. IntroductionEvery SQLite database contains a single "schema table" that stores the
schema for that database.  The schema for a database is a description of
all of the other tables, indexes, triggers, and views that are
contained within the database.  The schema table looks like this:


CREATE TABLE sqlite_schema(
  type text,
  name text,
  tbl_name text,
  rootpage integer,
  sql text
);


The sqlite_schema table contains one row for each table, index, view,
and trigger (collectively "objects") in the schema, except there
is no entry for the sqlite_schema table itself.  See the
schema storage subsection of the file format documentation for
additional information on how SQLite uses the sqlite_schema table
internally.schematab.html#introduction‰N—}     17’?EXPLAIN QUERY PLAN1.4. Compound QueriesEach component query of a compound query (UNION, UNION ALL, EXCEPT or 
  INTERSECT) is assigned computed separately and is given its own line in
  the EXPLAIN QUERY PLAN output.

sqlite&gt; EXPLAIN QUERY PLAN SELECT a FROM t1 UNION SELECT c FROM t2;
QUERY PLAN
`--COMPOUND QUERY
   |--LEFT-MOST SUBQUERY
   |  `--SCAN t1 USING COVERING INDEX i1
   `--UNION USING TEMP B-TREE
      `--SCAN t2 USING COVERING INDEX i4



  The "USING TEMP B-TREE" clause in the above output indicates that a 
  temporary b-tree structure is used to implement the UNION of the results
  of the two sub-selects.  An alternative method of computing a compound
  is to run each subquery as a co-routine, arrange for their outputs to
  appear in sorted order, and merge the results together.  When the query
  planner chooses this latter approach, the EXPLAIN QUERY PLAN output
  looks like this:

sqlite&gt; EXPLAIN QUERY PLAN SELECT a FROM t1 EXCEPT SELECT d FROM t2 ORDER BY 1;
QUERY PLAN
`--MERGE (EXCEPT)
   |--LEFT
   |  `--SCAN t1 USING COVERING INDEX i1
   `--RIGHT
      |--SCAN t2
      `--USE TEMP B-TREE FOR ORDER BY

This page last modified on  2021-03-23 20:19:29 UTCeqp.html#compound_queries
 H} ‚X—¸       9„C7Result and Error Codes OverviewMany of the routines in the SQLite C-language Interface return
numeric result codes indicating either success or failure, and 
in the event of a failure, providing some idea of the cause of
the failure.  This document strives to explain what each
of those numeric result codes means.rescode.html#overviewƒF—¨4
-m…
The Schema Table4. Creation and Modification Of The Schema TableSQLite creates the schema table upon database creation and modifies
its content as SQLite users submit DDL statements for execution. There
is no need for users to modify it under normal circumstances, and they
bear the risk of database corruption if they do modify it.
This page last modified on  2022-02-15 00:09:14 UTCschematab.html#creation_and_modification_of_the_schema_table—3—¨3    -W-oThe Schema Table3. Interpretation Of The Schema TableThe meanings of the fields of the schema table are as follows:


type

The sqlite_schema.type column will be one
of the following text strings:  'table', 'index', 'view', or 'trigger'
according to the type of object defined.  The 'table' string is used
for both ordinary and virtual tables.


name

The sqlite_schema.name column will hold the name of the object.
(UNIQUE and PRIMARY KEY constraints on tables cause SQLite to create
internal indexes with names of the form "sqlite_autoindex_TABLE_N"
where TABLE is replaced by the name of the table that contains the
constraint and N is an integer beginning with 1 and increasing by one
with each constraint seen in the table definition.
In a WITHOUT ROWID table, there is no sqlite_schema entry for the
PRIMARY KEY, but the "sqlite_autoindex_TABLE_N" name is set aside
for the PRIMARY KEY as if the sqlite_schema entry did exist.  This
will affect the numbering of subsequent UNIQUE constraints.
The "sqlite_autoindex_TABLE_N" name is never allocated for an
INTEGER PRIMARY KEY, either in rowid tables or WITHOUT ROWID tables.



tbl_name

The sqlite_schema.tbl_name column holds the name of a table or view
that the object is associated with.  For a table or view, the
tbl_name column is a copy of the name column.  For an index, the tbl_name
is the name of the table that is indexed.  For a trigger, the tbl_name
column stores the name of the table or view that causes the trigger 
to fire.


rootpage

The sqlite_schema.rootpage column stores the page number of the root
b-tree page for tables and indexes.  For rows that define views, triggers,
and virtual tables, the rootpage column is 0 or NULL.


sql

The sqlite_schema.sql column stores SQL text that describes the
object.  This SQL text is a CREATE TABLE, CREATE VIRTUAL TABLE,
CREATE INDEX,
CREATE VIEW, or CREATE TRIGGER statement that if evaluated against
the database file when it is the main database of a database connection
would recreate the object.  The text is usually a copy of the original
statement used to create the object but with normalizations applied so
that the text conforms to the following rules:


The CREATE, TABLE, VIEW, TRIGGER, and INDEX keywords at the beginning
of the statement are converted to all upper case letters.
The TEMP or TEMPORARY keyword is removed if it occurs after the 
initial CREATE keyword.
Any database name qualifier that occurs prior to the name of the
object being created is removed.
Leading spaces are removed.
All spaces following the first two keywords are converted into a single
space.


The text in the sqlite_schema.sql column is a copy of the original
CREATE statement text that created the object, except normalized as
described above and as modified by subsequent ALTER TABLE statements.
The sqlite_schema.sql is NULL for the internal indexes that are
automatically created by UNIQUE or PRIMARY KEY constraints.schematab.html#interpretation_of_the_schema_table
Ê™  Ñmʇ—¸   9CWResult and Error Codes4. Primary Result Code ListThe 31 result codes are 
   defined in sqlite3.h and are listed in
   alphabetical order below: 


SQLITE_ABORT&nbsp;(4)
SQLITE_AUTH&nbsp;(23)
SQLITE_BUSY&nbsp;(5)
SQLITE_CANTOPEN&nbsp;(14)
SQLITE_CONSTRAINT&nbsp;(19)
SQLITE_CORRUPT&nbsp;(11)
SQLITE_DONE&nbsp;(101)
SQLITE_EMPTY&nbsp;(16)
SQLITE_ERROR&nbsp;(1)
SQLITE_FORMAT&nbsp;(24)
SQLITE_FULL&nbsp;(13)
SQLITE_INTERNAL&nbsp;(2)
SQLITE_INTERRUPT&nbsp;(9)
SQLITE_IOERR&nbsp;(10)
SQLITE_LOCKED&nbsp;(6)
SQLITE_MISMATCH&nbsp;(20)
SQLITE_MISUSE&nbsp;(21)
SQLITE_NOLFS&nbsp;(22)
SQLITE_NOMEM&nbsp;(7)
SQLITE_NOTADB&nbsp;(26)
SQLITE_NOTFOUND&nbsp;(12)
SQLITE_NOTICE&nbsp;(27)
SQLITE_OK&nbsp;(0)
SQLITE_PERM&nbsp;(3)
SQLITE_PROTOCOL&nbsp;(15)
SQLITE_RANGE&nbsp;(25)
SQLITE_READONLY&nbsp;(8)
SQLITE_ROW&nbsp;(100)
SQLITE_SCHEMA&nbsp;(17)
SQLITE_TOOBIG&nbsp;(18)
SQLITE_WARNING&nbsp;(28)rescode.html#primary_result_code_list†_—¸      9)ŒA=Result and Error Codes3. DefinitionsAll result codes are integers.
Symbolic names for all result codes are created using
"#define" macros in the sqlite3.h header file.
There are separate sections in the sqlite3.h header file for
the result code definitions and the extended result code definitions.


Primary result code symbolic names are of the form "SQLITE_XXXXXX" where
XXXXXX is a sequence of uppercase alphabetic characters.  Extended
result code names are of the form "SQLITE_XXXXXX_YYYYYYY" where
the XXXXXX part is the corresponding primary result code and the
YYYYYYY is an extension that further classifies the result code.


The names and numeric values for existing result codes are fixed
and unchanging.  However, new result codes, and especially new extended
result codes, might appear in future releases of SQLite.rescode.html#definitions‰C—¸
9uo        Result and Error Codes2. Primary Result Codes versus Extended Result CodesResult codes are signed 32-bit integers.
The least significant 8 bits of the result code define a broad category
and are called the "primary result code".  More significant bits provide
more detailed information about the error and are called the
"extended result code"


Note that the primary result code is always a part of the extended
result code.  Given a full 32-bit extended result code, the application
can always find the corresponding primary result code merely by extracting
the least significant 8 bits of the extended result code.


All extended result codes are also error codes.  Hence the terms
"extended result code" and "extended error code" are interchangeable.


For historic compatibility, the C-language interfaces return
primary result codes by default.  
The extended result code for the most recent error can be
retrieved using the sqlite3_extended_errcode() interface.
The sqlite3_extended_result_codes() interface can be used to put
a database connection into a mode where it returns the
extended result codes instead of the primary result codes.rescode.html#primary_result_codes_versus_extended_result_codes‚b—¸   9QƒweResult and Error Codes1. Result Codes versus Error Codes"Error codes" are a subset of "result codes" that indicate that
something has gone wrong.  There are only a few non-error result
codes:  SQLITE_OK, SQLITE_ROW, and SQLITE_DONE.  The term
"error code" means any result code other than these three.rescode.html#result_codes_versus_error_codes
,,•O—¸       9E©iYResult and Error Codes5. Extended Result Code ListThe 74 extended result codes
  are defined in sqlite3.h and are
  listed in alphabetical order below:


SQLITE_ABORT_ROLLBACK&nbsp;(516)
SQLITE_AUTH_USER&nbsp;(279)
SQLITE_BUSY_RECOVERY&nbsp;(261)
SQLITE_BUSY_SNAPSHOT&nbsp;(517)
SQLITE_BUSY_TIMEOUT&nbsp;(773)
SQLITE_CANTOPEN_CONVPATH&nbsp;(1038)
SQLITE_CANTOPEN_DIRTYWAL&nbsp;(1294)
SQLITE_CANTOPEN_FULLPATH&nbsp;(782)
SQLITE_CANTOPEN_ISDIR&nbsp;(526)
SQLITE_CANTOPEN_NOTEMPDIR&nbsp;(270)
SQLITE_CANTOPEN_SYMLINK&nbsp;(1550)
SQLITE_CONSTRAINT_CHECK&nbsp;(275)
SQLITE_CONSTRAINT_COMMITHOOK&nbsp;(531)
SQLITE_CONSTRAINT_DATATYPE&nbsp;(3091)
SQLITE_CONSTRAINT_FOREIGNKEY&nbsp;(787)
SQLITE_CONSTRAINT_FUNCTION&nbsp;(1043)
SQLITE_CONSTRAINT_NOTNULL&nbsp;(1299)
SQLITE_CONSTRAINT_PINNED&nbsp;(2835)
SQLITE_CONSTRAINT_PRIMARYKEY&nbsp;(1555)
SQLITE_CONSTRAINT_ROWID&nbsp;(2579)
SQLITE_CONSTRAINT_TRIGGER&nbsp;(1811)
SQLITE_CONSTRAINT_UNIQUE&nbsp;(2067)
SQLITE_CONSTRAINT_VTAB&nbsp;(2323)
SQLITE_CORRUPT_INDEX&nbsp;(779)
SQLITE_CORRUPT_SEQUENCE&nbsp;(523)
SQLITE_CORRUPT_VTAB&nbsp;(267)
SQLITE_ERROR_MISSING_COLLSEQ&nbsp;(257)
SQLITE_ERROR_RETRY&nbsp;(513)
SQLITE_ERROR_SNAPSHOT&nbsp;(769)
SQLITE_IOERR_ACCESS&nbsp;(3338)
SQLITE_IOERR_AUTH&nbsp;(7178)
SQLITE_IOERR_BEGIN_ATOMIC&nbsp;(7434)
SQLITE_IOERR_BLOCKED&nbsp;(2826)
SQLITE_IOERR_CHECKRESERVEDLOCK&nbsp;(3594)
SQLITE_IOERR_CLOSE&nbsp;(4106)
SQLITE_IOERR_COMMIT_ATOMIC&nbsp;(7690)
SQLITE_IOERR_CONVPATH&nbsp;(6666)
SQLITE_IOERR_CORRUPTFS&nbsp;(8458)
SQLITE_IOERR_DATA&nbsp;(8202)
SQLITE_IOERR_DELETE&nbsp;(2570)
SQLITE_IOERR_DELETE_NOENT&nbsp;(5898)
SQLITE_IOERR_DIR_CLOSE&nbsp;(4362)
SQLITE_IOERR_DIR_FSYNC&nbsp;(1290)
SQLITE_IOERR_FSTAT&nbsp;(1802)
SQLITE_IOERR_FSYNC&nbsp;(1034)
SQLITE_IOERR_GETTEMPPATH&nbsp;(6410)
SQLITE_IOERR_LOCK&nbsp;(3850)
SQLITE_IOERR_MMAP&nbsp;(6154)
SQLITE_IOERR_NOMEM&nbsp;(3082)
SQLITE_IOERR_RDLOCK&nbsp;(2314)
SQLITE_IOERR_READ&nbsp;(266)
SQLITE_IOERR_ROLLBACK_ATOMIC&nbsp;(7946)
SQLITE_IOERR_SEEK&nbsp;(5642)
SQLITE_IOERR_SHMLOCK&nbsp;(5130)
SQLITE_IOERR_SHMMAP&nbsp;(5386)
SQLITE_IOERR_SHMOPEN&nbsp;(4618)
SQLITE_IOERR_SHMSIZE&nbsp;(4874)
SQLITE_IOERR_SHORT_READ&nbsp;(522)
SQLITE_IOERR_TRUNCATE&nbsp;(1546)
SQLITE_IOERR_UNLOCK&nbsp;(2058)
SQLITE_IOERR_VNODE&nbsp;(6922)
SQLITE_IOERR_WRITE&nbsp;(778)
SQLITE_LOCKED_SHAREDCACHE&nbsp;(262)
SQLITE_LOCKED_VTAB&nbsp;(518)
SQLITE_NOTICE_RECOVER_ROLLBACK&nbsp;(539)
SQLITE_NOTICE_RECOVER_WAL&nbsp;(283)
SQLITE_OK_LOAD_PERMANENTLY&nbsp;(256)
SQLITE_READONLY_CANTINIT&nbsp;(1288)
SQLITE_READONLY_CANTLOCK&nbsp;(520)
SQLITE_READONLY_DBMOVED&nbsp;(1032)
SQLITE_READONLY_DIRECTORY&nbsp;(1544)
SQLITE_READONLY_RECOVERY&nbsp;(264)
SQLITE_READONLY_ROLLBACK&nbsp;(776)
SQLITE_WARNING_AUTOINDEX&nbsp;(284)rescode.html#extended_result_code_listúOCKED in that
  SQLITE_BUSY indicates a conflict with a
  separate database connection, probably in a separate process,
  whereas SQLITE_LOCKED 
  indicates a conflict within the same database connection (or sometimes
  a database connection with a shared cache).




(7) SQLITE_NOMEM

  The SQLITE_NOMEM result code indicates that SQLite was unable to allocate
  all the memory it needed to complete the operation.  In other words, an
  internal call to sqlite3_malloc() or sqlite3_realloc() has failed in
  a case where the memory being allocated was required in order to continue
  the operation.




(9) SQLITE_INTERRUPT

  The SQLITE_INTERRUPT result code indicates that an operation was
  interrupted by the sqlite3_interrupt() interface.
  See also: SQLITE_ABORT




(11) SQLITE_CORRUPT

  The SQLITE_CORRUPT result code indicates that the database file has
  been corrupted.  See the How To Corrupt Your Database Files for
  further discussion on how corruption can occur.




(13) SQLITE_FULL

  The SQLITE_FULL result code indicates that a write could not complete
  because the disk is full.  Note that this error can occur when trying
  to write information into the main database file, or it can also
  occur when writing into temporary disk files.
  
  Sometimes applications encounter this error even though there is an
  abundance of primary disk space because the error occurs when writing
  into temporary disk files on a system where temporary files are stored
  on a separate partition with much less space that the primary disk.




(15) SQLITE_PROTOCOL

  The SQLITE_PROTOCOL result code indicates a problem with the file locking
  protocol used by SQLite.  The SQLITE_PROTOCOL error is currently only
  returned when using WAL mode and attempting to start a new transaction.
  There is a race condition that can occur when two separate 
  database connections both try to start a transaction at the same time
  in WAL mode.  The loser of the race backs off and tries again, after
  a brief delay.  If the same connection loses the locking race dozens
  of times over a span of multiple seconds, it will eventually give up and
  return SQLITE_PROTOCOL.  The SQLITE_PROTOCOL error should appear in practice
  very, very rarely, and only when there are many separate processes all
  competing intensely to write to the same database.




(17) SQLITE_SCHEMA

  The SQLITE_SCHEMA result code indicates that the database schema
  has changed.  This result code can be returned from sqlite3_step() for
  a prepared statement that was generated using sqlite3_prepare() or
  sqlite3_prepare16().  If the database schema was changed by some other
  process in between the time that the statement was prepared and the time
  the statement was run, this error can result.
  
  If a prepared statement is generated from sqlite3_prepare_v2() then
  the statement is automatically re-prepared if the schema changes, up to
  SQLITE_MAX_SCHEMA_RETRY times (default: 50).  The sqlite3_step()
  interface will only return SQLITE_SCHEMA back to the application if 
  the failure persists after these many retries.




(19) SQLITE_CONSTRAINT

  The SQLITE_CONSTRAINT error code means that an SQL constraint violation
  occurred while trying to process an SQL statement.  Additional information
  about the failed constraint can be found by consulting the
  accompanying error message (returned via sqlite3_errmsg() or
  sqlite3_errmsg16()) or by looking at the extended error code.
  
  The SQLITE_CONSTRAINT code can also be used as the return value from
  the xBestIndex() method of a virtual table implementation.  When
  xBestIndex() returns SQLITE_CONSTRAINT, that indicates that the particular
  combination of inputs submitted to xBestIndex() cannot result in a
  usable query plan and should not be given further consideration.




(21) SQLITE_MISUSE

  The SQLITE_MISUSE return code might be returned if the application uses
  any SQLite interface in a way that is undefined or unsupported.  For
  example, using a prepared statement after that prepared statement has
  been finaliûzed might result in an SQLITE_MISUSE error.
  
  SQLite tries to detect misuse and report the misuse using this result code.
  However, there is no guarantee that the detection of misuse will be
  successful.  Misuse detection is probabilistic.  Applications should
  never depend on an SQLITE_MISUSE return value.
  
  If SQLite ever returns SQLITE_MISUSE from any interface, that means that
  the application is incorrectly coded and needs to be fixed.  Do not ship
  an application that sometimes returns SQLITE_MISUSE from a standard
  SQLite interface because that application contains potentially serious bugs.




(23) SQLITE_AUTH

  The SQLITE_AUTH error is returned when the
  authorizer callback indicates that an
  SQL statement being prepared is not authorized.




(25) SQLITE_RANGE

  The SQLITE_RANGE error indices that the parameter number argument
  to one of the sqlite3_bind routines or the
  column number in one of the sqlite3_column
  routines is out of range.




(27) SQLITE_NOTICE

  The SQLITE_NOTICE result code is not returned by any C/C++ interface.
  However, SQLITE_NOTICE (or rather one of its extended error codes)
  is sometimes used as the first argument in an sqlite3_log() callback
  to indicate that an unusual operation is taking place.




(100) SQLITE_ROW

  The SQLITE_ROW result code returned by
  sqlite3_step() indicates that another row of output is available.




(256) SQLITE_OK_LOAD_PERMANENTLY

  The sqlite3_load_extension() interface loads an 
  extension into a single
  database connection.  The default behavior is for that extension to be
  automatically unloaded when the database connection closes.  However,
  if the extension entry point returns SQLITE_OK_LOAD_PERMANENTLY instead
  of SQLITE_OK, then the extension remains loaded into the process address
  space after the database connection closes.  In other words, the
  xDlClose methods of the sqlite3_vfs object is not called for the
  extension when the database connection closes.
  
  The SQLITE_OK_LOAD_PERMANENTLY return code is useful to 
  loadable extensions that register new VFSes, for example.




(261) SQLITE_BUSY_RECOVERY

  The SQLITE_BUSY_RECOVERY error code is an extended error code
  for SQLITE_BUSY that indicates that an operation could not continue
  because another process is busy recovering a WAL mode database file
  following a crash.  The SQLITE_BUSY_RECOVERY error code only occurs
  on WAL mode databases.




(264) SQLITE_READONLY_RECOVERY

  The SQLITE_READONLY_RECOVERY error code is an extended error code
  for SQLITE_READONLY.  The SQLITE_READONLY_RECOVERY error code indicates
  that a WAL mode database cannot be opened because the database file
  needs to be recovered and recovery requires write access but only
  read access is available.




(267) SQLITE_CORRUPT_VTAB

  The SQLITE_CORRUPT_VTAB error code is an extended error code
  for SQLITE_CORRUPT used by virtual tables.  A virtual table might
  return SQLITE_CORRUPT_VTAB to indicate that content in the virtual table
  is corrupt.




(275) SQLITE_CONSTRAINT_CHECK

  The SQLITE_CONSTRAINT_CHECK error code is an extended error code
  for SQLITE_CONSTRAINT indicating that a CHECK constraint failed.




(283) SQLITE_NOTICE_RECOVER_WAL

  The SQLITE_NOTICE_RECOVER_WAL result code is
  passed to the callback of
  sqlite3_log() when a WAL mode database file is recovered.




(513) SQLITE_ERROR_RETRY

  The SQLITE_ERROR_RETRY is used internally to provoke sqlite3_prepare_v2()
  (or one of its sibling routines for creating prepared statements) to
  try again to prepare a statement that failed with an error on the
  previous attempt.




(517) SQLITE_BUSY_SNAPSHOT

  The SQLITE_BUSY_SNAPSHOT error code is an extended error code
  for SQLITE_BUSY that occurs on WAL mode databases when a database
  connection tries to promote a read transaction into a write transaction
  but finds that another database connection has already written to the
  database and thus invalidated prior reads.
  
  The following scenario illustrates how an SQLITE_BUSY_SNAPSHOT error
  might arüise:
  
   Process A starts a read transaction on the database and does one
       or more SELECT statement.  Process A keeps the transaction open.
   Process B updates the database, changing values previous read by
       process A.
   Process A now tries to write to the database.  But process A's view
       of the database content is now obsolete because process B has
       modified the database file after process A read from it.  Hence
       process A gets an SQLITE_BUSY_SNAPSHOT error.
  




(520) SQLITE_READONLY_CANTLOCK

  The SQLITE_READONLY_CANTLOCK error code is an extended error code
  for SQLITE_READONLY.  The SQLITE_READONLY_CANTLOCK error code indicates
  that SQLite is unable to obtain a read lock on a WAL mode database
  because the shared-memory file associated with that database is read-only.




(523) SQLITE_CORRUPT_SEQUENCE

  The SQLITE_CORRUPT_SEQUENCE result code means that the schema of
  the sqlite_sequence table is corrupt.  The sqlite_sequence table
  is used to help implement the AUTOINCREMENT feature.  The
  sqlite_sequence table should have the following format:
  
  CREATE TABLE sqlite_sequence(name,seq);
  
  If SQLite discovers that the sqlite_sequence table has any other
  format, it returns the SQLITE_CORRUPT_SEQUENCE error.




(531) SQLITE_CONSTRAINT_COMMITHOOK

  The SQLITE_CONSTRAINT_COMMITHOOK error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a
  commit hook callback returned non-zero that thus
  caused the SQL statement to be rolled back.




(769) SQLITE_ERROR_SNAPSHOT

  The SQLITE_ERROR_SNAPSHOT result code might be returned when attempting
  to start a read transaction on an historical version of the database
  by using the sqlite3_snapshot_open() interface.  If the historical
  snapshot is no longer available, then the read transaction will fail
  with the SQLITE_ERROR_SNAPSHOT.  This error code is only possible if
  SQLite is compiled with -DSQLITE_ENABLE_SNAPSHOT.




(776) SQLITE_READONLY_ROLLBACK

  The SQLITE_READONLY_ROLLBACK error code is an extended error code
  for SQLITE_READONLY.  The SQLITE_READONLY_ROLLBACK error code indicates
  that a database cannot be opened because it has a hot journal that
  needs to be rolled back but cannot because the database is readonly.




(779) SQLITE_CORRUPT_INDEX

  The SQLITE_CORRUPT_INDEX result code means that SQLite detected
  an entry is or was missing from an index.  This is a special case of
  the SQLITE_CORRUPT error code that suggests that the problem might
  be resolved by running the REINDEX command, assuming no other
  problems exist elsewhere in the database file.




(787) SQLITE_CONSTRAINT_FOREIGNKEY

  The SQLITE_CONSTRAINT_FOREIGNKEY error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a foreign key constraint failed.




(1034) SQLITE_IOERR_FSYNC

  The SQLITE_IOERR_FSYNC error code is an extended error code
  for SQLITE_IOERR indicating an I/O error in the VFS layer
  while trying to flush previously written content out of OS and/or
  disk-control buffers and into persistent storage.  In other words,
  this code indicates a problem with the fsync() system call in unix
  or the FlushFileBuffers() system call in windows.




(1043) SQLITE_CONSTRAINT_FUNCTION

  The SQLITE_CONSTRAINT_FUNCTION error code is not currently used
  by the SQLite core.  However, this error code is available for use
  by extension functions.




(1290) SQLITE_IOERR_DIR_FSYNC

  The SQLITE_IOERR_DIR_FSYNC error code is an extended error code
  for SQLITE_IOERR indicating an I/O error in the VFS layer
  while trying to invoke fsync() on a directory.  The unix VFS attempts
  to fsync() directories after creating or deleting certain files to
  ensure that those files will still appear in the filesystem following
  a power loss or system crash.  This error code indicates a problem
  attempting to perform that fsync().




(1299) SQLITE_CONSTRAINT_NOTNULL

  The SQLITE_CONSTRAINT_NOTNULL error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a NOT NULL constraint failed.




(1546) SQLITE_IOERR_TRUNCATE

  The SQLITE_IOERR_TRUNCATE error code is an extended error code
  for SQLITE_IOERR indicating an I/O error in the VFS layer
  while trying to truncate a file to a smaller size.




(1555) SQLITE_CONSTRAINT_PRIMARYKEY

  The SQLITE_CONSTRAINT_PRIMARYKEY error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a PRIMARY KEY constraint failed.




(1811) SQLITE_CONSTRAINT_TRIGGER

  The SQLITE_CONSTRAINT_TRIGGER error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a RAISE function within
  a trigger fired, causing the SQL statement to abort.




(2067) SQLITE_CONSTRAINT_UNIQUE

  The SQLITE_CONSTRAINT_UNIQUE error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a UNIQUE constraint failed.




(2323) SQLITE_CONSTRAINT_VTAB

  The SQLITE_CONSTRAINT_VTAB error code is not currently used
  by the SQLite core.  However, this error code is available for use
  by application-defined virtual tables.




(2579) SQLITE_CONSTRAINT_ROWID

  The SQLITE_CONSTRAINT_ROWID error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that a rowid is not unique.




(2835) SQLITE_CONSTRAINT_PINNED

  The SQLITE_CONSTRAINT_PINNED error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that an UPDATE trigger attempted
  do delete the row that was being updated in the middle of the update.




(3091) SQLITE_CONSTRAINT_DATATYPE

  The SQLITE_CONSTRAINT_DATATYPE error code
  is an extended error code
  for SQLITE_CONSTRAINT indicating that an insert or update attempted
  to store a value inconsistent with the column's declared type
  in a table defined as STRICT.




(3594) SQLITE_IOERR_CHECKRESERVEDLOCK

  The SQLITE_IOERR_CHECKRESERVEDLOCK error code is
  an extended error code
  for SQLITE_IOERR indicating an I/O error
  within the xCheckReservedLock method on the sqlite3_io_methods object.




(4106) SQLITE_IOERR_CLOSE

  The SQLITE_IOERR_ACCESS error code is an extended error code
  for SQLITE_IOERR indicating an I/O error
  within the xClose method on the sqlite3_io_methods object.




(4618) SQLITE_IOERR_SHMOPEN

  The SQLITE_IOERR_SHMOPEN error code is an extended error code
  for SQLITE_IOERR indicating an I/O error
  within the xShmMap method on the sqlite3_io_methods object
  while trying to open a new shared memory segment.




(5130) SQLITE_IOERR_SHMLOCK

  The SQLITE_IOERR_SHMLOCK error code is no longer used.




(5642) SQLITE_IOERR_SEEK

  The SQLITE_IOERR_SEEK error code is an extended error code
  for SQLITE_IOERR indicating an I/O error
  within the xRead or xWrite methods on the sqlite3_io_methods object
  while trying to seek a file descriptor to the beginning point of the
  file where the read or write is to occur.




(6154) SQLITE_IOERR_MMAP

  The SQLITE_IOERR_MMAP error code is an extended error code
  for SQLITE_IOERR indicating an I/O error
  within the xFetch or xUnfetch methods on the sqlite3_io_methods object
  while trying to map or unmap part of the database file into the
  process address space.




(6666) SQLITE_IOERR_CONVPATH

  The SQLITE_IOERR_CONVPATH error code is an extended error code
  for SQLITE_IOERR used only by Cygwin VFS and indicating that
  the cygwin_conv_path() system call failed.
  See also: SQLITE_CANTOPEN_CONVPATH




(7178) SQLITE_IOERR_AUTH

  The SQLITE_IOERR_AUTH error code is a code reserved for use
  by extensions.  It is not used by the SQLite core.




(7690) SQLITE_IOERR_COMMIT_ATOMIC

  The SQLITE_IOERR_COMMIT_ATOMIC error code indicates that the
  underlying operating system reported and error on the
  SQLITE_FCNTL_COMMIT_ATOMIC_WRITE file-control.  This only comes
  up when SQLITE_ENABLE_ATOMIC_WRITE is enabled and the database
  is hosted on a filesystem that supports atomic writes.




(8202) SQLITE_IOERR_DATA

  The SQLITE_IOERR_DATA error code is an extended error code
  for SQLITE_IOERR used only by checksum VFS shim to indicate that
  the checksum on a page of the database file is incorrect.rescode.html#result_code_meanings
Èš–ȇI—¿j        7%Ž;The Checksum VFS Shim2. CompilingThe checksum VFS module is a loadable extension.  It is not
included in the amalgamation.  It must be added to SQLite
either at compile-time or at run-time.  The source code to
the checksum VFS module is in the
ext/misc/cksumvfs.c
source file in the
SQLite source tree.

To build the checksum VFS module into a run-time loadable
extension, use commands similar to the following:


(linux) &rarr; gcc -fPIC -shared cksumvfs.c -o cksumvfs.so
(mac) &rarr; clang -fPIC -dynamiclib cksumvfs.c -o cksumvfs.dylib
(windows) &rarr; cl cksumvfs.c -link -dll -out:cksumvfs.dll


You may want to add additional compiler options, of course,
according to the needs of your project.

To statically link this extension with your product,
compile it like any other C-language module but add the
"-DSQLITE_CKSUMVFS_STATIC" option so that this module knows that
it is being statically linked rather than dynamically linked.cksumvfs.html#compilingƒ—¿i       7#‡
9The Checksum VFS Shim1. OverviewThe checksum VFS extension is a VFS shim that adds an 8-byte
checksum to the end of every page in an SQLite database.  The checksum
is added as each page is written and verified as each page is read.
The checksum is intended to help detect database corruption caused by
random bit-flips in the mass storage device.

The checksum VFS extension requires 
SQLite version 3.32.0 (2020-05-22) or later.  It will not
work with earlier versions of SQLite.cksumvfs.html#overviewŽL—¸
9;‚›uOResult and Error Codes6. Result Code MeaningsThe meanings for all 105
result code values are shown below,
in numeric order.



(1) SQLITE_ERROR

  The SQLITE_ERROR result code is a generic error code that is used when
  no other more specific error code is available.




(3) SQLITE_PERM

  The SQLITE_PERM result code indicates that the requested access mode
  for a newly created database could not be provided.




(5) SQLITE_BUSY

  The SQLITE_BUSY result code indicates that the database file could not
  be written (or in some cases read) because of concurrent activity by 
  some other database connection, usually a database connection in a
  separate process.
  
  For example, if process A is in the middle of a large write transaction
  and at the same time process B attempts to start a new write transaction,
  process B will get back an SQLITE_BUSY result because SQLite only supports
  one writer at a time.  Process B will need to wait for process A to finish
  its transaction before starting a new transaction.  The
  sqlite3_busy_timeout() and sqlite3_busy_handler() interfaces and
  the busy_timeout pragma are available to process B to help it deal
  with SQLITE_BUSY errors.
  
  An SQLITE_BUSY error can occur at any point in a transaction: when the
  transaction is first started, during any write or update operations, or
  when the transaction commits.
  To avoid encountering SQLITE_BUSY errors in the middle of a transaction,
  the application can use BEGIN IMMEDIATE instead of just BEGIN to
  start a transaction.  The BEGIN IMMEDIATE command might itself return
  SQLITE_BUSY, but if it succeeds, then SQLite guarantees that no 
  subsequent operations on the same database through the next COMMIT 
  will return SQLITE_BUSY.
  
  See also:  SQLITE_BUSY_RECOVERY and SQLITE_BUSY_SNAPSHOT.
  
  The SQLITE_BUSY result code differs from SQLITE_Lù
———‡—¿m     7EŒO[The Checksum VFS Shim5. Verification Of ChecksumsIf any checksum is incorrect, the "PRAGMA quick_check" command
will find it.  To verify that checksums are actually enabled
and running, use SQL like the following:

SELECT count(*), verify_checksum(data)
  FROM sqlite_dbpage
 GROUP BY 2;


There are three possible outputs from the verify_checksum()
function: 1, 0, and NULL.  1 is returned if the checksum is
correct.  0 is returned if the checksum is incorrect.  NULL
is returned if the page is unreadable.  If checksumming is
enabled, the read will fail if the checksum is wrong, so the
usual result from verify_checksum() on a bad checksum is NULL.

If everything is OK, the query above should return a single
row where the second column is 1.  Any other result indicates
either that there is a checksum error, or checksum validation
is disabled.cksumvfs.html#verification_of_checksumsŒt—¿l        7™3The Checksum VFS Shim4. UsageOpen database connections using the sqlite3_open() or 
sqlite3_open_v2() interfaces, as normal.  Ordinary database files
(without a checksum) will operate normally.  Databases with 
checksums will return an SQLITE_IOERR_DATA error if a page is
encountered that contains an invalid checksum.

Checksumming only works on databases that have a reserve bytes
value of exactly 8.  The default value for reserve-bytes is 0.
Hence, newly created database files will omit the checksum by
default.  To create a database that includes a checksum, change
the reserve-bytes value to 8 by running code similar to this:

int n = 8;
sqlite3_file_control(db, 0, SQLITE_FCNTL_RESERVE_BYTES, &n);


If you do this immediately after creating a new database file,
before anything else has been written into the file, then that
might be all that you need to do.  Otherwise, the API call
above should be followed by:

sqlite3_exec(db, "VACUUM", 0, 0, 0);


It never hurts to run the VACUUM, even if you don't need it.
If the database is in WAL mode, you should shutdown and
reopen all database connections before continuing.

From the CLI, use the ".filectrl reserve_bytes 8" command, 
followed by "VACUUM;".

Note that SQLite allows the number of reserve-bytes to be
increased but not decreased.  So if a database file already
has a reserve-bytes value greater than 8, there is no way to
activate checksumming on that database, other than to dump
and restore the database file.  Note also that other extensions
might also make use of the reserve-bytes.  Checksumming will
be incompatible with those other extensions.cksumvfs.html#usageˆd—¿k    7![7The Checksum VFS Shim3. LoadingTo load this extension as a shared library, you first have to
bring up a dummy SQLite database connection to use as the argument
to the sqlite3_load_extension() API call.  Then you invoke the
sqlite3_load_extension() API and shutdown the dummy database
connection.  All subsequent database connections that are opened
will include this extension.  For example:

sqlite3 *db;
sqlite3_open(":memory:", &db);
sqlite3_load_extension(db, "./cksumvfs");
sqlite3_close(db);


If this extension is compiled with -DSQLITE_CKSUMVFS_STATIC and
statically linked against the application, initialize it using
a single API call as follows:

sqlite3_cksumvfs_init();


Cksumvfs is a VFS shim. When loaded, "cksmvfs" becomes the new
default VFS, and it uses the prior default VFS as the next VFS
down in the stack.  This is normally what you want.  However, in
complex situations where multiple VFS shims are being loaded,
it might be important to ensure that cksumvfs is loaded in the
correct order so that it sequences itself into the default VFS
Shim stack in the right order.cksumvfs.html#loading
†—ÇQ  A#‹  5SQLite's Built-in printf()1. OverviewSQLite contains its own implementation of the string formatting routine "printf()",
accessible via the following interfaces:


 format() &rarr; an SQL function returning the formatted string
 sqlite3_mprintf() &rarr; Store the formatted string in memory obtained
     sqlite3_malloc64().
 sqlite3_snprintf() &rarr; Store the formatted string in a static buffer
 sqlite3_str_appendf() &rarr; Append formatted text to a dynamic string
 sqlite3_vmprintf() &rarr; Varargs version of sqlite3_mprintf()
 sqlite3_vsnprintf() &rarr; Varargs version of sqlite3_snprintf()
 sqlite3_str_vappendf() &rarr; Varargs version of sqlite3_str_appendf()


The same core string formatter is also used internally by SQLite.printf.html#overview‰`—¿n      7U‘kkThe Checksum VFS Shim6. Controlling Checksum VerificationThe cksumvfs extension implements a new PRAGMA statement that can
be used to disable, re-enable, or query the status of checksum
verification:

PRAGMA checksum_verification;          -- query status
PRAGMA checksum_verification=OFF;      -- disable verification
PRAGMA checksum_verification=ON;       -- re-enable verification


The "checksum_verification" pragma will return "1" (true) or "0"
(false) if checksum verification is enabled or disabled, respectively.
"Verification" in this context means the feature that causes
SQLITE_IOERR_DATA errors if a checksum mismatch is detected while
reading.  Checksums are always kept up-to-date as long as the
reserve bytes value of the database is 8, regardless of the setting
of this pragma.  Checksum verification can be disabled (for example)
to do forensic analysis of a database that has previously reported
a checksum error.

The "checksum_verification" pragma will always respond with "0" if
the database file does not have a reserve bytes value of 8.  The
pragma will return no rows at all if the cksumvfs extension is
not loaded.
This page last modified on  2020-12-10 10:53:35 UTCcksumvfs.html#controlling_checksum_verification
¸”¸‰W—ÇS        A1’?SQLite's Built-in printf()1.2. DisadvantagesIn fairness, having a built-in implementation of printf() also comes with
some disadvantages.  To wit:



The built-in printf() implementation uses extra code space 
(about 7800 bytes on GCC 5.4 with -Os).


The floating-point to text conversion subfunction for the built-in printf()
is limited in precision to 16 significant digits or 26 significant digits
if the "!" alternate-form-2 flag is used.
Every IEEE-754 double can be represented exactly as a decimal floating-point
value, but some doubles require more than 16 or 26 significant digits.


The order of the buffer pointer and buffer size parameters in the built-in
snprintf() implementation is reversed from the order used in standard-library
implementations.


The built-in printf() implementation does not handle posix positional referencing
modifiers that allow the order of arguments to printf() to be different from the
order of the %-substitutions.  In the built-in printf(), the order of the arguments
must exactly match the order of the %-substitutions.



In spite of the disadvantages, the developers believe that having a built-in
printf() implementation inside of SQLite is a net positive.printf.html#disadvantages’g—ÇR       A+¤K9SQLite's Built-in printf()1.1. AdvantagesWhy does SQLite have its own private built-in printf() implementation?
Why not use the printf() implementation from the standard C library?
Several reasons:




By using its own built-in implementation, SQLite guarantees that the
output will be the same on all platforms and in all LOCALEs.
This is important for consistency and for testing.  It would be problematic
if one machine gave an answer of "5.25e+08" and another gave an answer
of "5.250e+008".  Both answers are correct, but it is better when SQLite
always gives the same answer.


We know of no way to use the standard library printf() C interface to
implement the format() SQL function feature of SQLite.  The built-in
printf() implementation can be easily adapted to that task, however.


The printf() in SQLite supports new non-standard substitution
types (%q, %Q, %w, and %z), and enhanced substitution
behavior (%s and %z) that are useful both internally to SQLite
and to applications using SQLite.
Standard library printf()s cannot normally be extended in this way.


Via the sqlite3_mprintf() and sqlite3_vmprintf() interfaces,
the built-in printf() implementation supports the ability to render an
arbitrary-length string into a memory buffer obtained from sqlite3_malloc64().
This is safer and less error prone than trying to precompute an upper size
limit on the result string, allocate an appropriately sized buffer, and
then calling snprintf().


The SQLite-specific printf() supports a new flag (!) called the
"alternate-form-2" flag.  The alternate-form-2 flag changes the processing
of floating-point conversions in subtle ways so that the output is always
an SQL-compatible text representation of a floating-point number - something
that is not possible to achieve with standard-library printf().  For
string substitutions, the alternate-form-2 flag causes the width and
precision to be measured in characters instead of bytes, which simplifies
processing of strings containing multi-byte UTF8 characters.


The built-in SQLite has compile-time options such as
SQLITE_PRINTF_PRECISION_LIMIT that provide defense against 
denial-of-service attacks for application that expose the
printf() functionality to untrusted users.


Using a built-in printf() implementation means that SQLite has one
fewer dependency on the host environment, making it more portable.printf.html#advantages

R
R…)—ÇT   A7‰3ISQLite's Built-in printf()2. Formatting DetailsThe format string for printf() is a template for the generated
string.  Substitutions are made whenever a "%" character appears in
the format string.  The "%" is followed by one or more additional
characters that describe the substitution.  Each substitution has
the following format:


%&#91;flags&#93;&#91;width&#93;&#91;.precision&#93;&#91;length&#93;type


All substitutions begin with a single "%" and end with a single type character.
The other elements of the substitution are optional.

To include a single "%" character in the output, put two consecutive
"%" characters in the template.printf.html#formatting_details
ôôœ—ÇU A;¶kISQLite's Built-in printf()2.1. Substitution TypesThe following chart shows the substitution types supported by SQLite:




Substitution TypeMeaning

%
Two "%" characters in a row are translated into a single "%" in the output,
    without substituting any values.

d, i
The argument is a signed integer which is displayed in decimal.

u
The argument is an unsigned integer which is displayed in decimal.

f
The argument is a double which is displayed in decimal.

e, E
The argument is a double which is displayed in exponential notation.
    The exponent character is 'e' or 'E' depending on the type.

g, G
The argument is a double which is displayed in either normal decimal
    notation or if the exponent is not close to zero, in exponential
    notation.

x, X
The argument is an integer which is displayed in hexadecimal.
    Lower-case hexadecimal is used for %x and upper-case is used
    for %X

o
The argument is an integer which is displayed in octal.

s, z



    The argument is either a zero-terminated string that is displayed,
    or a null pointer which is treated as an empty string.  For
    the %z type in C-language interfaces, sqlite3_free() is invoked
    on the string after it has been copied into the output. The %s and %z
    substitutions are identical for the SQL printf() function, with
    a NULL argument treated as an empty string.
    The %s substitution is universal among printf functions, but
    the %z substitution and safe treatment of null pointers
    are SQLite enhancements, not found in other
    printf() implementations.

c
For the C-language interfaces, the argument is an integer which
    is interpreted as a character.  For the format() SQL function the
    argument is a string from which the first character is extracted and
    displayed.

p
The argument is a pointer which is displayed as a hexadecimal address.
    Since the SQL language has no concept of a pointer, the %p substitution
    for the format() SQL function works like %x.

n
The argument is a pointer to an integer.  Nothing is displayed for
    this substitution type.  Instead, the integer to which the argument
    points is overwritten with the number of characters in the generated
    string that result from all format symbols to the left of the %n.

q, Q


    The argument is a zero-terminated string.  The string is printed with
    all single quote (') characters doubled so that the string can safely
    appear inside an SQL string literal.  The %Q substitution type also
    puts single-quotes on both ends of the substituted string.
    If the argument
    to %Q is a null pointer then the output is an unquoted "NULL".  In other
    words, a null pointer generates an SQL NULL, and a non-null pointer generates
    a valid SQL string literal.  If the argument to %q is a null pointer
    then no output is generated.  Thus a null-pointer to %q is the same as
    an empty string.
    For these  substitutions, the precision is the number of bytes or
    characters taken from the argument, not the number of bytes or characters that
    are written into the output.
    
    The %q and %Q substitutions are SQLite enhancements, not found in
    most other printf() implementations.

w


    This substitution works like %q except that it doubles all double-quote
    characters (") instead of single-quotes, making the result suitable for
    using with a double-quoted identifier name in an SQL statement.
    
    The %w substitution is an SQLite enhancements, not found in
    most other printf() implementations.printf.html#substitution_types
`u÷`‹—ÇX    AO”Y]SQLite's Built-in printf()2.4. The Optional Precision FieldThe precision field, if it is present, must follow the width separated
by a single "." character.  If there is no width, then the "." that introduces
the precision immediately follows either the flags (if there are any) or
the initial "%".

For string substitutions (%s, %z, %q, %Q, or %w) the precision is the number
of byte or character used from the argument.  The number is bytes by default but
is characters if the "!" flag is present.  If there is no precision, then the
entire string is substituted.  Examples:  "%.3s" substitutes the first 3 bytes
of the argument string.  "%!.3s" substitutes the first three characters of the
argument string.

For integer substitutions (%d, %i, %x, %X, %o, and %p) the precision specifies
minimum number of digits to display.  Leading zeros are added if necessary, to
expand the output to the minimum number of digits.

For floating-point substitutions (%e, %E, %f, %g, %G) the precision specifies 
the number of digits to display to the right of the decimal point.

For the character substitution (%c) a precision N greater than 1 causes the
character to be repeated N times.  This is a non-standard extension found only
in SQLite.

If the precision is a single "*" character instead of a number, then the
actual precision value is read as an integer from the argument list.printf.html#the_optional_precision_fieldˆy—ÇW       AG7USQLite's Built-in printf()2.3. The Optional Width FieldThe width field specifies the minimum width of the substituted value in
the output.  If the string or number that is written into the output is shorter
than the width, then the value is padded.  Padding is on the left (the
value is right-justified) by default.  If the "-" flag is used, then the
padding is on the right and the value is left-justified.

The width is measured in bytes by default.  However, if the "!" flag is
present then the width is in characters.  This only makes a difference for
multi-byte utf-8 characters, and those only occur on string substitutions.

If the width is a single "*" character instead of a number, then the
actual width value is read as an integer from the argument list.  If the
value read is negative, then the absolute value is used for the width and
the value is left-justified as if the "-" flag were present.

If the value being substituted is larger than the width, then full value
is added to the output.  In other words, the width is the minimum width of
the value as it is rendered in the output.printf.html#the_optional_width_field‡—ÇV     AIŒMWSQLite's Built-in printf()2.2. The Optional Length FieldThe length of the argument value can be specified by one or more letters
that occur just prior to the substitution type letter.  In SQLite, the
length only matter for integer types.  The length is ignored for the
format() SQL function which always uses 64-bit values.  The following
table shows the length specifiers allowed by SQLite:




Length Specifier
Meaning

(default)
An "int" or "unsigned int".  32-bits on all modern systems.

l
A "long int" or "long unsigned int".  Also 32-bits on all modern systems.

ll
A "long long int" or "long long unsigned" or an "sqlite3_int64" or
    "sqlite3_uint64" value.  These are 64-bit integers on all modern systems.



Only the "ll" length modifier ever makes a difference for SQLite.  And
it only makes a difference when using the C-language interfaces.printf.html#the_optional_length_field
ŸŒŸ‰h—ÇZ      AG’YSQLite's Built-in printf()3. Implementation And HistoryThe core string formatting routine is the sqlite3VXPrintf() function found in the
printf.c source file.  All the
various interfaces invoke (sometimes indirectly) this one core function.
The sqlite3VXPrintf() function began as code written by the first author
of SQLite (Hipp) when he was a graduate student at Duke University in the
late 1980s.  Hipp kept this printf() implementation in his personal toolbox until
he started working on SQLite in 2000.  The code was incorporated into the
SQLite source tree on 2000-10-08
for SQLite version 1.0.9.


The Fossil Version Control System uses its own
printf() implementation that is derived from an early version of the SQLite
printf() implementation, but those two implementations have since diverged.


The sqlite3_snprintf() function has its buffer pointer and buffer size
arguments reversed from what is found in the standard C library snprintf()
routine. This is because there was no snprintf() routine in the
standard C library
when Hipp was first implementing his version, and he chose a different order
than the designers of the standard C library.
This page last modified on  2022-02-15 13:32:30 UTCprintf.html#implementation_and_historyo—ÇY  AE 'SSQLite's Built-in printf()2.5. The Options Flags FieldFlags consist of zero or more characters that immediately follow the
"%" that introduces the substitution.  The various flags and their meanings
are as follows:




Flag
Meaning

-
Left-justify the value in the output.  The default is to right-justify.
If the width is zero or is otherwise less than the length of the value being
substituted, then there is no padding and the "-" flag is a no-op.

+
For signed numeric substitutions, include a "+" sign before positive numbers.
A "-" sign always appears before negative numbers regardless of flag settings.

(space)
For signed numeric substitutions, prepend a single space before positive
numbers.

0
Prepend as many "0" characters to numeric substitutions as necessary to
expand the value out to the specified width.  If the width field is omitted,
then this flag is a no-op.

#
This is the "alternate-form-1" flag.
For %g and %G substitutions, this causes trailing zeros to be removed.
This flag forces a decimal point to appear for all floating-point substitutions.
For %o, %x, and %X substitutions, the alternate-form-1 flag cause the value
to be prepended with "0", "0x", or "0X", respectively.

,
This flag causes comma-separators to be added to the output of %d and %i
substitutions, between every 3 digits from the left.  This can help humans
to more easily discern the magnitude of large integer values.  For example,
the value 2147483647 would be rendered as "2147483647" using "%d" but would
appear as "2,147,483,647" with "%,d".  This flag is a non-standard extension.

!
This is the "alternate-form-2 flag.
For string substitutions, this flag causes the width and precision to be understand
in terms of characters rather than bytes.
For floating point substitutions, the alternate-form-2 flag increases the 
maximum number of significant digits displayed from 16 to 26,
forces the display of the decimal point and causes at least one digit
to appear after the decimal point.
The alternate-form-2 flag is a non-standard extension that appears in no
other printf() implementations, as far as we know.printf.html#the_options_flags_field
‡‡Ž6—Ï:       GQ›]Command Line Shell For SQLite2. Double-click Startup On WindowsWindows users can double-click on the sqlite3.exe icon to cause
the command-line shell to pop-up a terminal window running SQLite.  However,
because double-clicking starts the sqlite3.exe without command-line arguments,
no database file will have been specified, so SQLite will use a temporary
database that is deleted when the session exits.
To use a persistent disk file as the database, enter the ".open" command
immediately after the terminal window starts up:

SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite&gt; .open ex1.db
sqlite&gt;


The example above causes the database file named "ex1.db" to be opened
and used.  The "ex1.db" file is created if it does not previously exist.
You might want to
use a full pathname to ensure that the file is in the directory that you
think it is in.  Use forward-slashes as the directory separator character.
In other words use "c:/work/ex1.db", not "c:\work\ex1.db".

Alternatively, you can create a new database using the default temporary
storage, then save that database into a disk file using the ".save" command:

SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite&gt; ... many SQL commands omitted ...
sqlite&gt; .save ex1.db
sqlite&gt;


Be careful when using the ".save" command as it will overwrite any
preexisting database files having the same name without prompting for
confirmation.  As with the ".open" command, you might want to use a
full pathname with forward-slash directory separators to avoid ambiguity.cli.html#double_click_startup_on_windows9—Ï9  G1Ÿ_=Command Line Shell For SQLite1. Getting StartedThe SQLite project provides a simple command-line program named
sqlite3 (or sqlite3.exe on Windows)
that allows the user to manually enter and execute SQL
statements against an SQLite database or against a
ZIP archive.  This document provides a brief
introduction on how to use the sqlite3 program.

Start the sqlite3 program by typing "sqlite3" at the
command prompt, optionally followed 
by the name of the file that holds the SQLite database
(or ZIP archive).  If the named
file does not exist, a new database file with the given name will be
created automatically.  If no database file is specified on the
command-line, a temporary database is created and automatically deleted when 
the "sqlite3" program exits.

On startup, the sqlite3 program will show a brief banner
message then prompt you to enter SQL.  Type in SQL statements (terminated
by a semicolon), press "Enter" and the SQL will be executed.

For example, to create a new SQLite database named "ex1" 
with a single table named "tbl1", you might do this:

$ sqlite3 ex1
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.
sqlite&gt; create table tbl1(one text, two int);
sqlite&gt; insert into tbl1 values('hello!',10);
sqlite&gt; insert into tbl1 values('goodbye', 20);
sqlite&gt; select * from tbl1;
hello!|10
goodbye|20
sqlite&gt;


Terminate the sqlite3 program by typing your system
End-Of-File character (usually a Control-D).  Use the interrupt
character (usually a Control-C) to stop a long-running SQL statement.

Make sure you type a semicolon at the end of each SQL command!
The sqlite3 program looks for a semicolon to know when your SQL command is
complete.  If you omit the semicolon, sqlite3 will give you a
continuation prompt and wait for you to enter more text to 
complete the SQL command.  This feature allows you to
enter SQL commands that span multiple lines.  For example:


sqlite&gt; CREATE TABLE tbl2 (
   ...&gt;   f1 varchar(30) primary key,
   ...&gt;   f2 text,
   ...&gt;   f3 real
   ...&gt; );
sqlite&gt;cli.html#getting_startedn|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
.connection &#91;close&#93; &#91;#&#93;  Open or close an auxiliary database connection
.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 ?OBJECTS?          Render database content as SQL
.echo on|off             Turn command echo on or off
.eqp on|off|full|...     Enable or disable automatic EXPLAIN QUERY PLAN
.excel                   Display the output of next command in spreadsheet
.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
.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
.imposter INDEX TABLE    Create imposter table TABLE on index INDEX
.indexes ?TABLE?         Show names of indexes
.limit ?LIMIT? ?VAL?     Display or change the value of an SQLITE_LIMIT
.lint OPTIONS            Report potential schema issues.
.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
.nonce STRING            Disable safe mode for one command if the nonce matches
.nullvalue STRING        Use STRING in place of NULL values
.once ?OPTIONS? ?FILE?   Output for the next SQL command only to FILE
.open ?OPTIONS? ?FILE?   Close existing database and reopen FILE
.output ?FILE?           Send output to FILE or stdout if FILE is omitted
.parameter CMD ...       Manage SQL parameter bindings
.print STRING...         Print literal STRING
.progress N              Invoke progress handler after every N opcodes
.prompt MAIN CONTINUE    Replace the standard prompts
.quit                    Exit this program
.read FILE               Read input from FILE
.recover                 Recover as much data as possible from corrupt db.
.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
.selftest ?OPTIONS?      Run tests defined in the SELFTEST table
.separator COL ?ROW?     Change the column and row separators
.session ?NAME? CMD ...  Create or control sessions
.sha3sum ...             Compute a SHA3 hash of database content
.shell CMD ARGS...       Run CMD ARGS... in a system shell
.show                    Show the current values for various settings
.stats ?ARG?             Show stats or turn stats on or off
.system CMD ARGS...      Run CMD ARGS... in a system shell
.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
.timeout MS              Try opening locked tables for MS milliseconds
.timer on|off            Turn SQL timer on or off
.trace ?OPTIONS?         Output each SQL statement as it is run
.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 minimum column widths for columnar output
sqlite&gt;cli.html#special_commands_to_sqlite3_dot_commands_
ÒJÜÒ‚5—Ï>    GAƒ;ICommand Line Shell For SQLite4.3. Dot-command executionThe dot-commands
are interpreted by the sqlite3.exe command-line program, not by
SQLite itself.  So none of the dot-commands will work as an argument
to SQLite interfaces such as sqlite3_prepare() or sqlite3_exec().cli.html#dot_command_execution‰K—Ï=    GA‘gICommand Line Shell For SQLite4.2. Dot-command argumentsThe arguments passed to dot-commands are parsed from the command tail, 
  per these rules:

  The trailing newline and any other trailing whitespace is discarded;
  Whitespace immediately following the dot-command name, or any argument
    input end bound is discarded;
  An argument input begins with any non-whitespace character;
  An argument input ends with a character which
    depends upon its leading character thusly:
  
    for a leading single-quote ('), a single-quote acts
      as the end delimiter;
    for a leading double-quote ("), an unescaped double-quote
      acts as the end delimiter;
    for any other leading character, the end delimiter is
      any whitespace; and
    the command tail end acts as the end delimiter for any argument;
  
  Within a double-quoted argument input, a backslash-escaped double-quote
    is part of the argument rather than its terminating quote;
  Within a double-quoted argument, traditional C-string literal, backslash
    escape sequence translation is done; and
  Argument input delimiters (the bounding quotes or whitespace)
    are discarded to yield the passed argument.cli.html#dot_command_argumentsˆi—Ï<      G3?;Command Line Shell For SQLite4.1. Line StructureThe CLI's input is parsed into a sequence consisting of:
  
    SQL statements;
    dot-commands; or
    CLI comments
  
SQL statements are free-form, and can be spread across multiple lines,
  with whitespace or SQL comments embedded anywhere.
  They are terminated by either a ';' character at the end of an input line,
  or a '/' character or the word "go" on a line by itself.
  When not at the end of an input line, the ';' character
  acts to separate SQL statements.
  Trailing whitespace is ignored for purposes of termination.
A dot-command has a more restrictive structure:

It must begin with its "." at the left margin
    with no preceding whitespace.
It must be entirely contained on a single input line.
It cannot occur in the middle of an ordinary SQL
    statement.  In other words, it cannot occur at a
    continuation prompt.
There is no comment syntax for dot-commands.

The CLI also accepts whole-line comments that
begin with a '#' character and extend to the end of the line.
There can be no with whitespace prior to the '#'.cli.html#line_structure§)—Ï;   GgÌUqCommand Line Shell For SQLite3. Special commands to sqlite3 (dot-commands)Most of the time, sqlite3 just reads lines of input and passes them
on to the SQLite library for execution.
But input lines that begin with a dot (".")
are intercepted and interpreted by the sqlite3 program itself.
These "dot commands" are typically used to change the output format
of queries, or to execute certain prepackaged query statements.
There were originally just a few dot commands, but over the years
many new features have accumulated so that today there are over 60.



For a listing of the available dot commands, you can enter ".help" with
no arguments.  Or enter ".help TOPIC" for detailed information about TOPIC.
The list of available dot-commands follows:


sqlite&gt; .help
.archive ...             Manage SQL archives
.auth ON|OFF             Show authorizer callbacks
.backup ?DB? FILE        Backup DB (default "main") to FILE
.bail o "markdown" modes)
the width of columns adjusts automatically.  But you can override this,
providing a speicified width for each column using the ".width" command.
The arguments to ".width" are integers which are the number of
characters to devote to each column.  Negative numbers mean right-justify.
Thus:

sqlite&gt; .width 12 -6
sqlite&gt; select * from tbl1;
one              two
------------  ------
hello!            10
goodbye           20
sqlite&gt;


A width of 0 means the column width is chosen automatically.
Unspecified column widths become zero.  Hence, the command
".width" with no arguments resets all column widths to zero and
hence causes all column widths to be determined automatically.

The "column" mode is a tabular output format.  Other
tabular output formats are "box", "markdown", and "table":

sqlite&gt; .width
sqlite&gt; .mode markdown
sqlite&gt; select * from tbl1;
|   one   | two |
|---------|-----|
| hello!  | 10  |
| goodbye | 20  |
sqlite&gt; .mode table
sqlite&gt; select * from tbl1;
+---------+-----+
|   one   | two |
+---------+-----+
| hello!  | 10  |
| goodbye | 20  |
+---------+-----+
sqlite&gt; .mode box
sqlite&gt; select * from tbl1;
┌─────────┬─────â”
│   one   │ two │
├─────────┼─────┤
│ hello!  │ 10  │
│ goodbye │ 20  │
└─────────┴─────┘
sqlite&gt;





The columnar modes accept some addition options to control formatting.
The "--wrap N" option (where N is an integer) causes columns
to wrap text that is longer than N characters.  Wrapping is disabled if
N is zero.

sqlite&gt; insert into tbl1 values('The quick fox jumps over a lazy brown dog.',90);
sqlite&gt; .mode box --wrap 30
sqlite&gt; select * from tbl1 where two&gt;50;
┌────────────────────────────────┬─────â”
│              one               │ two │
├────────────────────────────────┼─────┤
│ The quick fox jumps over a laz │ 90  │
│ y brown dog.                   │     │
└────────────────────────────────┴─────┘
sqlite&gt;


Wrapping happens after exactly N characters, 
which might be in the middle of a word.
To wrap at a word boundary, add the "--wordwrap on" option 
(or just "-ww" for short):

sqlite&gt; .mode box --wrap 30 -ww
sqlite&gt; select * from tbl1 where two&gt;50;
┌─────────────────────────────┬─────â”
│             one             │ two │
├─────────────────────────────┼─────┤
│ The quick fox jumps over a  │ 90  │
│ lazy brown dog.             │     │
└─────────────────────────────┴─────┘
sqlite&gt;


The "--quote" option causes the results in each column to be
quoted like an SQL literal, as in the "quote" mode.  See the on-line
help for additional options.



The command ".mode box --wrap 60 --quote" is so useful for general-purpose
database queries that it is given its own alias.  Instead of typing out
that whole 27-character command, you can just say ".mode qbox".

Another useful output mode is "insert".  In insert mode, the output
is formatted to look like SQL INSERT statements.  Use insert
mode to generate text that can later be used to input data into a 
different database.

When specifying insert mode, you have to give an extra argument
which is the name of the table to be inserted into.  For example:

sqlite&gt; .mode insert new_table
sqlite&gt; select * from tbl1 where two&lt;50;
INSERT INTO "new_table" VALUES('hello',10);
INSERT INTO "new_table" VALUES('goodbye',20);
sqlite&gt;



Other output modes include "csv", "json", and "tcl".  Try these
yourself to see what they do.cli.html#changing_output_formats
óó´—Ï?        GAæMMCommand Line Shell For SQLite5. Changing Output FormatsThe sqlite3 program is able to show the results of a query
in 14 different output formats:


 ascii
 box
 csv
 column
 html
 insert
 json
 line
 list
 markdown
 quote
 table
 tabs
 tcl


You can use the ".mode" dot command to switch between these output
formats.
The default output mode is "list".  In
list mode, each row of a query result is written on one line of
output and each column within that row is separated by a specific
separator string.  The default separator is a pipe symbol ("|").
List mode is especially useful when you are going to send the output
of a query to another program (such as AWK) for additional processing.

sqlite&gt; .mode list
sqlite&gt; select * from tbl1;
hello!|10
goodbye|20
sqlite&gt;


Type ".mode" with no arguments to show the current mode:

sqlite&gt; .mode
current output mode: list
sqlite&gt;


Use the ".separator" dot command to change the separator.
For example, to change the separator to a comma and
a space, you could do this:

sqlite&gt; .separator ", "
sqlite&gt; select * from tbl1;
hello!, 10
goodbye, 20
sqlite&gt;


The next ".mode" command might reset the ".separator" back to some
default value (depending on its arguments).
So you will likely need to repeat the ".separator" command whenever you
change modes if you want to continue using a non-standard separator.



In "quote" mode, the output is formatted as SQL literals.  Strings are
enclosed in single-quotes and internal single-quotes are escaped by doubling.
Blobs are displayed in hexadecimal blob literal notation (Ex: x'abcd').
Numbers are displayed as ASCII text and NULL values are shown as "NULL".
All columns are separated from each other by a comma (or whatever alternative
character is selected using ".separator").

sqlite&gt; .mode quote
sqlite&gt; select * from tbl1;
'hello!',10
'goodbye',20
sqlite&gt;


In "line" mode, each column in a row of the database
is shown on a line by itself.  Each line consists of the column
name, an equal sign and the column data.  Successive records are
separated by a blank line.  Here is an example of line mode
output:

sqlite&gt; .mode line
sqlite&gt; select * from tbl1;
one = hello!
two = 10

one = goodbye
two = 20
sqlite&gt;





In column mode, each record is shown on a separate line with the
data aligned in columns.  For example:

sqlite&gt; .mode column
sqlite&gt; select * from tbl1;
one       two       
--------  ---
hello!    10        
goodbye   20        
sqlite&gt;


In "column" mode (and also in "box", "table", and
ððœ—Ï@ GK¶OWCommand Line Shell For SQLite6. Querying the database schemaThe sqlite3 program provides several convenience commands that
are useful for looking at the schema of the database.  There is
nothing that these commands do that cannot be done by some other
means.  These commands are provided purely as a shortcut.



For example, to see a list of the tables in the database, you
can enter ".tables".


sqlite&gt; .tables
tbl1 tbl2
sqlite&gt;



The ".tables" command is similar to setting list mode then
executing the following query:

SELECT name FROM sqlite_schema 
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
ORDER BY 1


But the ".tables" command does more.  It queries the sqlite_schema table
for all attached databases, not just the primary database.  And it arranges
its output into neat columns.

The ".indexes" command works in a similar way to list all of
the indexes. If the ".indexes" command is given an argument which is
the name of a table, then it shows just indexes on that table.



The ".schema" command shows the complete schema for the database,
or for a single table if an optional tablename argument is provided:

sqlite&gt; .schema
create table tbl1(one varchar(10), two smallint)
CREATE TABLE tbl2 (
  f1 varchar(30) primary key,
  f2 text,
  f3 real
);
sqlite&gt; .schema tbl2
CREATE TABLE tbl2 (
  f1 varchar(30) primary key,
  f2 text,
  f3 real
);
sqlite&gt;



The ".schema" command is roughly the same as setting
list mode, then entering the following query:

SELECT sql FROM sqlite_schema
ORDER BY tbl_name, type DESC, name


As with ".tables", the ".schema" command shows the schema for
all attached databases.  If you only want to see the schema for
a single database (perhaps "main") then you can add an argument
to ".schema" to restrict its output:

sqlite&gt; .schema main.*


The ".schema" command can be augmented with the "--indent" option,
in which case it tries to reformat the various CREATE statements of
the schema so that they are more easily readable by humans.



The ".databases" command shows a list of all databases open in
the current connection.  There will always be at least 2.  The first
one is "main", the original database opened.  The second is "temp",
the database used for temporary tables. There may be additional 
databases listed for databases attached using the ATTACH statement.
The first output column is the name the database is attached with, 
and the second result column is the filename of the external file.
There may be a third result column which will be either "'r/o'" or
"'r/w'" depending on whether the database file is read-only or read-write.
And there might be a fourth result column showing the result of
sqlite3_txn_state() for that database file.

sqlite&gt; .databases




The ".fullschema" dot-command works like the ".schema" command in
that it displays the entire database schema.  But ".fullschema" also
includes dumps of the statistics tables "sqlite_stat1", "sqlite_stat3",
and "sqlite_stat4", if they exist.  The ".fullschema" command normally
provides all of the information needed to exactly recreate a query
plan for a specific query.  When reporting suspected problems with
the SQLite query planner to the SQLite development team, developers
are requested to provide the complete ".fullschema" output as part
of the trouble report.  Note that the sqlite_stat3 and sqlite_stat4
tables contain samples of index entries and so might contain sensitive
data, so do not send the ".fullschema" output of a proprietary database
over a public channel.cli.html#querying_the_database_schema
l|l—ÏB      GIžWQCommand Line Shell For SQLite8.1. Writing results to a fileBy default, sqlite3 sends query results to standard output.  You
can change this using the ".output" and ".once" commands.  Just put 
the name of an output file as an argument to .output and all subsequent
query results will be written to that file.  Or use the .once command
instead of .output and output will only be redirected for the single next
command before reverting to the console.  Use .output with no arguments to
begin writing to standard output again.  For example:

sqlite&gt; .mode list
sqlite&gt; .separator |
sqlite&gt; .output test_file_1.txt
sqlite&gt; select * from tbl1;
sqlite&gt; .exit
$ cat test_file_1.txt
hello|10
goodbye|20
$


If the first character of the ".output" or ".once" filename is a pipe
symbol ("|") then the remaining characters are treated as a command and the
output is sent to that command.  This makes it easy to pipe the results
of a query into some other process.  For example, the 
"open -f" command on a Mac opens a text editor to display the content that
it reads from standard input.  So to see the results of a query
in a text editor, one could type:

sqlite&gt; .once | open -f
sqlite&gt; SELECT * FROM bigTable;


If the ".output" or ".once" commands have an argument of "-e" then
output is collected into a temporary file and the system text editor is
invoked on that text file.  Thus, the command ".once -e" achieves the
same result as ".once '|open -f'" but with the benefit of being portable
across all systems.

If the ".output" or ".once" commands have a "-x" argument, that causes
them to accumulate output as Comma-Separated-Values (CSV) in a temporary
file, then invoke the default system utility for viewing CSV files
(usually a spreadsheet program) on the result.  This is a quick way of
sending the result of a query to a spreadsheet for easy viewing:

sqlite&gt; .once -x
sqlite&gt; SELECT * FROM bigTable;




The ".excel" command is an alias for ".once -x".  It does exactly the same
thing.cli.html#writing_results_to_a_fileŽ—ÏA   G?œOKCommand Line Shell For SQLite7. Opening Database FilesThe ".open" command opens a new database connection, after first closing the
previously opened database command.  In its simplest form, the ".open" command merely
invokes sqlite3_open() on the file named as its argument.  Use the name ":memory:"
to open a new in-memory database that disappears when the CLI exits or when the
".open" command is run again.

If the --new option is included with ".open", then the database is reset prior
to being opened.  Any prior data is destroyed.  This is a destructive overwrite of
prior data and no confirmation is requested, so use this option carefully.

The --readonly option opens the database in read-only mode.  Write will be
prohibited.

The --deserialize option causes the entire content of the on-disk file to be
read into memory and then opened as an in-memory database using the
sqlite3_deserialize() interface.  This will, of course, require a lot of memory
if you have a large database.  Also, any changes you make to the database will not
be saved back to disk unless you explicitly save them using the ".save" or ".backup"
commands.

The --append option causes the SQLite database to be appended to an existing
file rather than working as a stand-alone file.  See the 
appendvfs extension for
more information.

The --zip option causes the specified input file to be interpreted as a ZIP archive
instead of as an SQLite database file.

The --hexdb option causes the database content to be to be read from subsequent
lines of input in a hex format, rather than from a separate file on disk.  
The "dbtotxt" command-line tool can be used to generate
the appropriate text for a database.  The --hexdb option is intended for use by the
SQLite developers for testing purposes.  We do not know of any use cases for this
option outside of internal SQLite testing and development.cli.html#opening_database_files
\
î\‰
—ÏD     G;wCCommand Line Shell For SQLite8.3. File I/O FunctionsThe command-line shell adds two application-defined SQL functions that
facilitate reading content from a file into a table column, and writing the
content of a column into a file, respectively.

The readfile(X) SQL function reads the entire content of the file named
X and returns that content as a BLOB.  This can be used to load content into
a table.  For example:

sqlite&gt; CREATE TABLE images(name TEXT, type TEXT, img BLOB);
sqlite&gt; INSERT INTO images(name,type,img)
   ...&gt;   VALUES('icon','jpeg',readfile('icon.jpg'));


The writefile(X,Y) SQL function write the blob Y into the file named X
and returns the number of bytes written.  Use this function to extract
the content of a single table column into a file.  For example:

sqlite&gt; SELECT writefile('icon.jpg',img) FROM images WHERE name='icon';


Note that the readfile(X) and writefile(X,Y) functions are extension
functions and are not built into the core SQLite library.  These routines
are available as a loadable extension in the
ext/misc/fileio.c
source file in the SQLite source code repositories.cli.html#file_i_o_functionsŠ
—ÏC     GE’cMCommand Line Shell For SQLite8.2. Reading SQL from a fileIn interactive mode, sqlite3 reads input text (either SQL statements
or dot-commands) from the keyboard.  You can also redirect input from
a file when you launch sqlite3, of course, but then you do not have the
ability to interact with the program.  Sometimes it is useful to run an
SQL script contained in a file entering other commands from the command-line.
For this, the ".read" dot-command is provided.

The ".read" command takes a single argument which is (usually) the name
of a file from which to read input text.

sqlite&gt; .read myscript.sql


The ".read" command temporarily stops reading from the keyboard and instead
takes its input from the file named.  Upon reaching the end of the file,
input reverts back to the keyboard.  The script file may contain dot-commands,
just like ordinary interactive input.

If the argument to ".read" begins with the "|" character, then instead of
opening the argument as a file, it runs the argument (without the leading "|")
as a command, then uses the output of that command as its input.  Thus, if you
have a script that generates SQL, you can execute that SQL directly using
a command similar to the following:

sqlite&gt; .read |myscript.batcli.html#reading_sql_from_a_file
     -      -ŒN—ÏE   GE—iICommand Line Shell For SQLite8.4. The edit() SQL functionThe CLI has another built-in SQL function named edit().  Edit() takes
one or two arguments.  The first argument is a value - often a large
multi-line string to be edited.  The second argument is the invocation
for a text editor. (It may include options to affect the editor's
behavior.) If the second argument is omitted, the VISUAL environment
variable is used.  The edit() function writes its first argument into a
temporary file, invokes the editor on the temporary file, rereads the file
back into memory after the editor is done, then returns the edited text.

The edit() function can be used to make changes to large text
values.  For example:

sqlite&gt; UPDATE docs SET body=edit(body) WHERE name='report-15';


In this example, the content of the docs.body field for the entry where
docs.name is "report-15" will be sent to the editor.  After the editor returns,
the result will be written back into the docs.body field.

The default operation of edit() is to invoke a text editor.  But by using
an alternative edit program in the second argument, you can also get it to edit
images or other non-text resources.  For example, if you want to modify a JPEG
image that happens to be stored in a field of a table, you could run:

sqlite&gt; UPDATE pics SET img=edit(img,'gimp') WHERE id='pic-1542';


The edit program can also be used as a viewer, by simply ignoring the
return value.  For example, to merely look at the image above, you might run:

sqlite&gt; SELECT length(edit(img,'gimp')) WHERE id='pic-1542';cli.html#the_edit_sql_function
ŽŽ”m—ÏF      Ge§cmCommand Line Shell For SQLite8.5. Importing files as CSV or other formatsUse the ".import" command to import CSV (comma separated value)
or similarly delimited data into an SQLite table.
The ".import" command takes two arguments which are the
source from which data is to be read and the name of the
SQLite table into which the data is to be inserted. The source argument
is the name of a file to be read or, if it begins with a "|" character,
it specifies a command which will be run to produce the input data.

Note that it may be important to set the "mode" before running the
 ".import" command.  This is prudent to prevent the command-line shell
from trying to interpret the input file text as some format other than
how the file is structured. If the --csv or --ascii options are used,
they control import input delimiters. Otherwise, the delimiters are
those in effect for the current output mode.

To import into a table not in the "main" schema, the --schema option
may be used to specify that the table is in some other schema. This can
be useful for ATTACH'ed databases or to import into a TEMP table.

When .import is run, its treatment of the first input row depends
upon whether the target table already exists. If it does not exist,
the table is automatically created and the content of the first input
row is used to set the name of all the columns in the table. In this
case, the table data content is taken from the second and subsequent
input rows. If the target table already exists, every row of the
input, including the first, is taken to be actual data content.  If
the input file contains an initial row of column labels, you can make
the .import command skip that initial row using the "--skip 1" option.

Here is an example usage, loading a pre-existing temporary table
from a CSV file which has column names in its first row:

sqlite&gt; .import --csv --skip 1 --schema temp C:/work/somedata.csv tab1


While reading input data in modes other than 'ascii', ".import"
interprets input as records composed of fields according to the RFC 4180
specification with this exception: The input record and field separators
are as set by the mode or by use of the .separator command. Fields are
always subject to quote removal to reverse quoting done per RFC 4180,
except in ascii mode.

To import data with arbitrary delimiters and no quoting,
first set ascii mode (".mode&nbsp;ascii"), then set the field
and record delimiters using the ".separators" command. This
will suppress dequoting. Upon ".import", the data will be split
into fields and records according to the delimiters so specified.cli.html#importing_files_as_csv_or_other_formats

%›„—ÏI  Ge†9gCommand Line Shell For SQLite8.6.2.  Export to TSV (tab separated values)Exporting to pure TSV, without any field quoting, can be done by
entering ".mode tabs" before running a query. However, the output
will not be read correctly in tabs mode by the ".import" command
if it contains doublequote characters. To get TSV quoted per
RFC 4180 so that it can be input in tabs mode with ".import",
first enter ".mode&nbsp;csv", then enter '.separator&nbsp;"\t"'
before running a query.cli.html#_export_to_tsv_tab_separated_values_‰—ÏH       G=gACommand Line Shell For SQLite8.6.1.  Export to Excel To simplify export to a spreadsheet, the CLI provides the
".excel" command which captures the output of a single query and sends
that output to the default spreadsheet program on the host computer.
Use it like this:

sqlite&gt; .excel
sqlite&gt; SELECT * FROM tab;



The command above writes the output of the query as CSV into a temporary
file, invokes the default handler for CSV files (usually the preferred
spreadsheet program such as Excel or LibreOffice), then deletes the
temporary file.  This is essentially a short-hand method of doing
the sequence of ".csv", ".once", and ".system" commands described above.


The ".excel" command is really an alias for ".once -x".  The -x option
to .once causes it to writes results as CSV into a temporary file that
is named with a ".csv" suffix, then invoke the systems default handler
for CSV files.


There is also a ".once -e" command which works similarly, except that
it names the temporary file with a ".txt" suffix so that the default
text editor for the system will be invoked, instead of the default
spreadsheet.cli.html#_export_to_excel_‹V—ÏG     G1–9Command Line Shell For SQLite8.6. Export to CSVTo export an SQLite table (or part of a table) as CSV, simply set
the "mode" to "csv" and then run a query to extract the desired rows
of the table. The output will formatted as CSV per RFC 4180.

sqlite&gt; .headers on
sqlite&gt; .mode csv
sqlite&gt; .once c:/work/dataout.csv
sqlite&gt; SELECT * FROM tab1;
sqlite&gt; .system c:/work/dataout.csv


In the example above, the ".headers on" line causes column labels to
be printed as the first row of output.  This means that the first row of
the resulting CSV file will contain column labels.  If column labels are
not desired, set ".headers off" instead. (The ".headers off" setting is
the default and can be omitted if the headers have not been previously
turned on.)

The line ".once FILENAME" causes all query output to go into
the named file instead of being printed on the console.  In the example
above, that line causes the CSV content to be written into a file named
"C:/work/dataout.csv".

The final line of the example (the ".system c:/work/dataout.csv")
has the same effect as double-clicking on the c:/work/dataout.csv file
in windows.  This will typically bring up a spreadsheet program to display
the CSV file.

That command only works as written on Windows.  
The equivalent line on a Mac would be:

sqlite&gt; .system open dataout.csv


On Linux and other unix systems you will need to enter something like:


sqlite&gt; .system xdg-open dataout.csvcli.html#export_to_csv
|   »Ð|†O—ÏL       Gm‹wCommand Line Shell For SQLite10. Converting An Entire Database To A Text FileUse the ".dump" command to convert the entire contents of a
database into a single UTF-8 text file.  This file can be converted
back into a database by piping it back into sqlite3.

A good way to make an archival copy of a database is this:


$ sqlite3 ex1 .dump | gzip -c &gt;ex1.dump.gz



This generates a file named ex1.dump.gz that contains everything
you need to reconstruct the database at a later time, or on another
machine.  To reconstruct the database, just type:


$ zcat ex1.dump.gz | sqlite3 ex2



The text format is pure SQL so you
can also use the .dump command to export an SQLite database
into other popular SQL database engines.  Like this:


$ createdb ex2
$ sqlite3 ex1 .dump | psql ex2cli.html#converting_an_entire_database_to_a_text_file‡f—ÏK        Ga]iCommand Line Shell For SQLite9.1. How ZIP archive access is implementedThe command-line shell uses the Zipfile virtual table to
access ZIP archives.  You can see this by running the ".schema"
command when a ZIP archive is open:

sqlite&gt; .schema
CREATE VIRTUAL TABLE zip USING zipfile('document.docx')
/* zip(name,mode,mtime,sz,rawdata,data,method) */;


When opening a file, if the command-line client discovers that the
file is ZIP archive instead of an SQLite database, it actually opens
an in-memory database and then in that in-memory database it creates
an instance of the Zipfile virtual table that is attached to the
ZIP archive.

The special processing for opening ZIP archives is a trick of the
command-line shell, not the core SQLite library.  So if you want to
open a ZIP archive as a database in your application, you will need to
activate the Zipfile virtual table module then run an appropriate
CREATE VIRTUAL TABLE statement.cli.html#how_zip_archive_access_is_implementedŒ@—ÏJ      Gc—  oCommand Line Shell For SQLite9. Accessing ZIP Archives As Database FilesIn addition to reading and writing SQLite database files,
the sqlite3 program will also read and write ZIP archives.
Simply specify a ZIP archive filename in place of an SQLite database
filename on the initial command line, or in the ".open" command,
and sqlite3 will automatically detect that the file is a
ZIP archive instead of an SQLite database and will open it as such.
This works regardless of file suffix.  So you can open JAR, DOCX,
and ODP files and any other file format that is really a ZIP
archive and SQLite will read it for you.

A ZIP archive appears to be a database containing a single table
with the following schema:

CREATE TABLE zip(
  name,     // Name of the file
  mode,     // Unix-style file permissions
  mtime,    // Timestamp, seconds since 1970
  sz,       // File size after decompression
  rawdata,  // Raw compressed file data
  data,     // Uncompressed file content
  method    // ZIP compression method code
);


So, for example, if you wanted to see the compression efficiency
(expressed as the size of the compressed content relative to the
original uncompressed file size) for all files in the ZIP archive,
sorted from most compressed to least compressed, you could run a
query like this:

sqlite&gt; SELECT name, (100.0*length(rawdata))/sz FROM zip ORDER BY 2;


Or using file I/O functions, you can extract elements of the
ZIP archive:

sqlite&gt; SELECT writefile(name,content) FROM zip
   ...&gt; WHERE name LIKE 'docProps/%';cli.html#accessing_zip_archives_as_database_files
ÅŘ6—ÏM   Ga®{kCommand Line Shell For SQLite11. Recover Data From a Corrupted DatabaseLike the ".dump" command, ".recover" attempts to convert the entire 
contents of a database file to text. The difference is that instead of
reading data using the normal SQL database interface, ".recover"
attempts to reassemble the database based on data extracted directly from 
as many database pages as possible. If the database is corrupt, ".recover"
is usually able to recover data from all uncorrupted parts of the database,
whereas ".dump" stops when the first sign of corruption is encountered.

If the ".recover" command recovers one or more rows that it cannot 
attribute to any database table, the output script creates a "lost_and_found"
table to store the orphaned rows. The schema of the lost_and_found
table is as follows:

CREATE TABLE lost_and_found(
    rootpgno INTEGER,             -- root page of tree pgno is a part of
    pgno INTEGER,                 -- page number row was found on
    nfield INTEGER,               -- number of fields in row
    id INTEGER,                   -- value of rowid field, or NULL
    c0, c1, c2, c3...             -- columns for fields of row
);


The "lost_and_found" table contains one row for each orphaned row recovered
from the database. Additionally, there is one row for each recovered index
entry that cannot be attributed to any SQL index. This is because, in an
SQLite database, the same format is used to store SQL index entries and
WITHOUT ROWID table entries.


  ColumnContents
  rootpgno Even though it may not be possible to attribute the 
      row to a specific database table, it may be part of a tree structure
      within the database file. In this case, the root page number of that
      tree structure is stored in this column. Or, if the page the row was
      found on is not part of a tree structure, this column stores a copy of
      the value in column "pgno" - the page number of the page the row was
      found on. In many, although not all, cases, all rows in the
      lost_and_found table with the same value in this column belong to the
      same table.

  pgno The page number of the page on which this row was found.

  nfield The number of fields in this row.

  id If the row comes from a WITHOUT ROWID table, this column 
      contains NULL. Otherwise, it contains the 64-bit integer rowid value for
      the row.

  c0,&nbsp;c1,&nbsp;c2... The values for each column of the row
      are stored in these columns. The ".recover" command creates the
      lost_and_found table with as many columns as required by the longest
      orphaned row.


If the recovered database schema already contains a table named
"lost_and_found", the ".recover" command uses the name "lost_and_found0". If
the name "lost_and_found0" is also already taken, "lost_and_found1", and so
on. The default name "lost_and_found" may be overridden by invoking ".recover"
with the --lost-and-found switch. For example, to have the output script call
the table "orphaned_rows":

sqlite&gt; .recover --lost-and-found orphaned_rowscli.html#recover_data_from_a_corrupted_database
Tµ¤TŠK—ÏP     GK“QUCommand Line Shell For SQLite14. Database Content Self-TestsThe ".selftest" command attempts to verify that a database is
intact and is not corrupt.  
The .selftest command looks for a table in schema named "selftest"
and defined as follows:

CREATE TABLE selftest(
  tno INTEGER PRIMARY KEY,  -- Test number
  op TEXT,                  -- 'run' or 'memo'
  cmd TEXT,                 -- SQL command to run, or text of "memo"
  ans TEXT                  -- Expected result of the SQL command
);


The .selftest command reads the rows of the selftest table in
selftest.tno order.
For each 'memo' row, it writes the text in 'cmd' to the output.  For
each 'run' row, it runs the 'cmd' text as SQL and compares the result
to the value in 'ans', and shows an error message if the results differ.

If there is no selftest table, the ".selftest" command runs
PRAGMA integrity_check.

The ".selftest --init" command creates the selftest table if it
does not already exists, then appends entries that check the SHA3
hash of the content of all tables.  Subsequent runs of ".selftest"
will verify that the database has not been changed in any way.  To
generate tests to verify that a subset of the tables is unchanged,
simply run ".selftest --init" then DELETE the selftest rows that
refer to tables that are not constant.cli.html#database_content_self_testsˆ—ÏO GeŽoCommand Line Shell For SQLite13. Cryptographic Hashes Of Database ContentThe ".sha3sum" dot-command computes a
SHA3 hash of the content
of the database.  To be clear, the hash is computed over the database content,
not its representation on disk.  This means, for example, that a VACUUM
or similar data-preserving transformation does not change the hash.

The ".sha3sum" command supports options "--sha3-224", "--sha3-256", 
"--sha3-384", and "--sha3-512" to define which variety of SHA3 to use
for the hash.  The default is SHA3-256.

The database schema (in the sqlite_schema table) is not normally
included in the hash, but can be added by the "--schema" option.

The ".sha3sum" command takes a single optional argument which is a
LIKE pattern.  If this option is present, only tables whose names match
the LIKE pattern will be hashed.

The ".sha3sum" command is implemented with the help of the
extension function "sha3_query()"
that is included with the command-line shell.cli.html#cryptographic_hashes_of_database_contentˆF—ÏN     G9kCCommand Line Shell For SQLite12. Loading ExtensionsYou can add new custom application-defined SQL functions,
collating sequences, virtual tables, and VFSes to the command-line
shell at run-time using the ".load" command.  First, build the
extension as a DLL or shared library (as described in the
Run-Time Loadable Extensions document) then type:

sqlite&gt; .load /path/to/my_extension


Note that SQLite automatically adds the appropriate extension suffix
(".dll" on windows, ".dylib" on Mac, ".so" on most other unixes) to the
extension filename.  It is generally a good idea to specify the full
pathname of the extension.

SQLite computes the entry point for the extension based on the extension
filename.  To override this choice, simply add the name of the extension
as a second argument to the ".load" command.

Source code for several useful extensions can be found in the
ext/misc
subdirectory of the SQLite source tree.  You can use these extensions
as-is, or as a basis for creating your own custom extensions to address
your own particular needs.cli.html#loading_extensions
˜‚{—ÏR     GW„]Command Line Shell For SQLite15.1.  SQLite Archive Create Command Create a new archive, overwriting any existing archive (either in the current
"main" db or in the file specified by a --file option). Each argument following
the options is a file to add to the archive. Directories are imported
recursively. See above for examples.cli.html#_sqlite_archive_create_command_–c—ÏQ       GA¬KCommand Line Shell For SQLite15. SQLite Archive SupportThe ".archive" dot-command and the "-A" command-line option
provide built-in support for the 
SQLite Archive format. The interface is similar to
that of the "tar" command on unix systems. Each invocation of the ".ar"
command must specify a single command option. The following commands
are available for ".archive":


  OptionLong&nbsp;OptionPurpose
  -c--createCreate a new archive containing specified files.
  -x--extractExtract specified files from archive.
  -i--insertAdd files to existing archive.
  -r--removeRemove files from the archive.
  -t--listList the files in the archive.
  -u--updateAdd files to existing archive if they have changed.


As well as the command option, each invocation of ".ar" may specify
one or more modifier options. Some modifier options require an argument,
some do not. The following modifier options are available:


  OptionLong&nbsp;OptionPurpose
  -v--verboseList each file as it is processed.
  -f FILE--file FILEIf specified, use file FILE as the
  archive. Otherwise, assume that the current "main" database is the 
  archive to be operated on.
  -a FILE--append FILELike --file, use file FILE as the
  archive, but open the file using the 
  apndvfs VFS so that
  the archive will be appended to the end of FILE if FILE already exists.
  -C DIR--directory DIRIf specified, interpret all relative
  paths as relative to DIR, instead of the current working directory.
  -g--globUse glob(Y,X) to match arguments
  against names in the archive.
  -n--dryrunShow the SQL that would be run to carry out the
                       archive operation, but do not actually change anything.
  ----All subsequent command line words are command arguments,
  not options.



For command-line usage, add the short style command-line options immediately
following the "-A", without an intervening space.  All subsequent arguments
are considered to be part of the .archive command.  For example, the following 
commands are equivalent:

sqlite3 new_archive.db -Acv file1 file2 file3
sqlite3 new_archive.db ".ar -cv file1 file2 file3"



Long and short style options may be mixed. For example, the following are
equivalent:

-- Two ways to create a new archive named "new_archive.db" containing
-- files "file1", "file2" and "file3".
.ar -c --file new_archive.db file1 file2 file3
.ar -f new_archive.db --create file1 file2 file3


Alternatively, the first argument following to ".ar" may be the concatenation
of the short form of all required options (without the "-" characters). In 
this case arguments for options requiring them are read from the command line
next, and any remaining words are considered command arguments. For example:

-- Create a new archive "new_archive.db" containing files "file1" and
-- "file2" from directory "dir1".
.ar cCf dir1 new_archive.db file1 file2 file3cli.html#sqlite_archive_support
q
–È„B—ÏW      GQ‡7WCommand Line Shell For SQLite15.6.  Operations On ZIP Archives If FILE is a ZIP archive rather than an SQLite Archive, the ".archive"
command and the "-A" command-line option still work.  This is accomplished
using of the zipfile extension.
Hence, the following commands are roughly equivalent,
differing only in output formatting:


  Traditional CommandEquivalent sqlite3.exe Command
  unzip archive.zipsqlite3 -Axf archive.zip
  unzip -l archive.zipsqlite3 -Atvf archive.zip
  zip -r archive2.zip dirsqlite3 -Acf archive2.zip dircli.html#_operations_on_zip_archives_‚;—ÏV        GWƒ]Command Line Shell For SQLite15.5.  SQLite Archive Remove Command The --remove command deletes files and directories which match the
provided arguments (if any) as affected by the --glob option.
It is an error to provide arguments which match nothing in the archive.cli.html#_sqlite_archive_remove_command_‡        —ÏU     GoŒ  uCommand Line Shell For SQLite15.4.  SQLite Archive Insert And Update Commands The --update and --insert commands work like --create command, except that 
they do not delete the current archive before commencing. New versions of
files silently replace existing files with the same names, but otherwise
the initial contents of the archive (if any) remain intact.

 For the --insert command, all files listed are inserted into the archive.
For the --update command, files are only inserted if they do not previously
exist in the archive, or if their "mtime" or "mode" is different from what
is currently in the archive.

 Compatibility node:  Prior to SQLite version 3.28.0 (2019-04-16) only
the --update option was supported but that option worked like --insert in that
it always reinserted every file regardless of whether or not it had changed.cli.html#_sqlite_archive_insert_and_update_commands_ƒV—ÏT   GS…[YCommand Line Shell For SQLite15.3.  SQLite Archive List Command List the contents of the archive. If no arguments are specified, then all
files are listed. Otherwise, only those which match the arguments,
as affected by the --glob option, are listed. Currently,
the --verbose option does not change the behaviour of this command. That may
change in the future.

-- List contents of archive in current "main" db..
.ar --listcli.html#_sqlite_archive_list_command_‡
—ÏS     GYŒ7_Command Line Shell For SQLite15.2.  SQLite Archive Extract Command Extract files from the archive (either to the current working directory or
to the directory specified by a --directory option). 
Files or directories whose names match the arguments,
as affected by the --glob option, are extracted. 
Or, if no arguments follow the options, all files and directories are extracted.
Any specified directories are extracted recursively. It is an error if any
specified names or match patterns cannot be found in the archive.

-- Extract all files from the archive in the current "main" db to the
-- current working directory. List files as they are extracted. 
.ar --extract --verbose

-- Extract file "file1" from archive "ar.db" to directory "dir1".
.ar fCx ar.db dir1 file1

-- Extract files with ".h" extension to directory "headers".
.ar -gCx headers *.hcli.html#_sqlite_archive_extract_command_
««ŽP—ÏX
G{š}Command Line Shell For SQLite15.7.  SQL Used To Implement SQLite Archive Operations The various SQLite Archive Archive commands are implemented using SQL statements.
Application developers can easily add SQLite Archive Archive reading and writing
support to their own projects by running the appropriate SQL.

To see what SQL statements are used to implement an SQLite Archive
operation, add the --dryrun or -n option.  This causes the SQL to be
displayed but inhibits the execution of the SQL.

The SQL statements used to implement SQLite Archive operations make use of
various loadable extensions.  These extensions are all available in
the SQLite source tree in the
ext/misc/ subfolder.
The extensions needed for full SQLite Archive support include:



fileio.c &mdash;
This extension adds SQL functions readfile() and writefile() for
reading and writing content from files on disk.  The fileio.c
extension also includes fsdir() table-valued function for listing
the contents of a directory and the lsmode() function for converting
numeric st_mode integers from the stat() system call into human-readable
strings after the fashion of the "ls -l" command.


sqlar.c &mdash;
This extension adds the sqlar_compress() and sqlar_uncompress()
functions that are needed to compress and uncompress file content
as it is inserted and extracted from an SQLite Archive.


zipfile.c &mdash;
This extension implements the "zipfile(FILE)" table-valued function
which is used to read ZIP archives.  This extension is only needed
when reading ZIP archives instead of SQLite archives.


appendvfs.c &mdash;
This extension implements a new VFS that allows an SQLite database
to be appended to some other file, such as an executable.  This
extension is only needed if the --append option to the .archive
command is used.cli.html#_sql_used_to_implement_sqlite_archive_operations_
ÏÏ–,—ÏY        G1«G;Command Line Shell For SQLite16. SQL ParametersSQLite allows bound parameters to appear in an SQL statement anywhere
that a literal value is allowed.  The values for these parameters are set
using the sqlite3_bind_...() family of APIs.

Parameters can be either named or unnamed.  An unnamed parameter is a single
question mark ("?").  Named parameters are a "?" followed immediately by a number
(ex: "?15" or "?123") or one of the characters "$", ":", or "@" followed by an
alphanumeric name (ex: "$var1", ":xyz", "@bingo").

This command-line shell leaves unnamed parameters unbound, meaning that they
will have a value of an SQL NULL, but named parameters might be assigned values.
If there exists a TEMP table named "sqlite_parameters" with a schema like this:

CREATE TEMP TABLE sqlite_parameters(
  key TEXT PRIMARY KEY,
  value
) WITHOUT ROWID;


And if there is an entry in that table where the key column exactly matches
the name of parameter (including the initial "?", "$", ":", or "@" character)
then the parameter is assigned the value of the value column.  If no entry exists,
the parameter defaults to NULL.

The ".parameter" command exists to simplify managing this table.  The
".parameter init" command (often abbreviated as just ".param init") creates
the temp.sqlite_parameters table if it does not already exist.  The ".param list"
command shows all entries in the temp.sqlite_parameters table.  The ".param clear"
command drops the temp.sqlite_parameters table.  The ".param set KEY VALUE" and
".param unset KEY" commands create or delete entries from the 
temp.sqlite_parameters table.

The VALUE passed to ".param set KEY VALUE" can be either a SQL literal
or any other SQL expression or query which can be evaluated to yield a value.
This allows values of differing types to be set.
If such evaluation fails, the provided VALUE is instead quoted and inserted
as text.
Because such initial evaluation may or may not fail depending upon
the VALUE content, the reliable way to get a text value is to enclose it
with single-quotes protected from the above-described command-tail parsing.
For example, (unless one intends a value of -1365):
.parameter init
.parameter set @phoneNumber "'202-456-1111'"

Note that the double-quotes serve to protect the single-quotes
and ensure that the quoted text is parsed as one argument.

The temp.sqlite_parameters table only provides values for parameters in the
command-line shell.  The temp.sqlite_parameter table has no effect on queries
that are run directly using the SQLite C-language API.  Individual applications
are expected to implement their own parameter binding.  You can search for 
"sqlite_parameters" in the 
command-line shell source code
to see how the command-line shell does parameter binding, and use that as
a hint for how to implement it yourself.cli.html#sql_parameters
ööž—ÏZ      G_ºgCommand Line Shell For SQLite17. Index Recommendations (SQLite Expert)Note: This command is experimental. It may be removed or the 
interface modified in incompatible ways at some point in the future.

For most non-trivial SQL databases, the key to performance is creating
the right SQL indexes. In this context "the right SQL indexes" means those
that cause the queries that an application needs to optimize run fast. The
".expert" command can assist with this by proposing indexes that might
assist with specific queries, were they present in the database.

The ".expert" command is issued first, followed by the SQL query 
on a separate line. For example, consider the following session:

sqlite&gt; CREATE TABLE x1(a, b, c);                  -- Create table in database 
sqlite&gt; .expert
sqlite&gt; SELECT * FROM x1 WHERE a=? AND b&gt;?;        -- Analyze this SELECT 
CREATE INDEX x1_idx_000123a7 ON x1(a, b);

0|0|0|SEARCH TABLE x1 USING INDEX x1_idx_000123a7 (a=? AND b&gt;?)

sqlite&gt; CREATE INDEX x1ab ON x1(a, b);             -- Create the recommended index 
sqlite&gt; .expert
sqlite&gt; SELECT * FROM x1 WHERE a=? AND b&gt;?;        -- Re-analyze the same SELECT 
(no new indexes)

0|0|0|SEARCH TABLE x1 USING INDEX x1ab (a=? AND b&gt;?)


In the above, the user creates the database schema (a single table - "x1"),
and then uses the ".expert" command to analyze a query, in this case 
"SELECT * FROM x1 WHERE a=? AND b&gt;?". The shell tool recommends that the
user create a new index (index "x1_idx_000123a7") and outputs the plan
that the query would use in EXPLAIN QUERY PLAN format. The user then creates
an index with an equivalent schema and runs the analysis on the same query
again. This time the shell tool does not recommend any new indexes, and 
outputs the plan that SQLite will use for the query given the existing 
indexes.

The ".expert" command accepts the following options:


 Option  Purpose
 &#8209;&#8209;verbose
     If present, output a more verbose report for each query analyzed.
 &#8209;&#8209;sample&nbsp;PERCENT 
     This parameter defaults to 0, causing the ".expert" command to
         recommend indexes based on the query and database schema alone.
         This is similar to the way the SQLite query planner selects
         indexes for queries if the user has not run the ANALYZE command
         on the database to generate data distribution statistics. 
         
         If this option is passed a non-zero argument, the ".expert" command
         generates similar data distribution statistics for all indexes
         considered based on PERCENT percent of the rows currently stored in
         each database table. For databases with unusual data distributions,
         this may lead to better index recommendations, particularly if the
         application intends to run ANALYZE.
         
         For small databases and modern CPUs, there is usually no reason not
         to pass "--sample 100". However, gathering data distribution
         statistics can be expensive for large database tables. If the
         operation is too slow, try passing a smaller value for the --sample
         option.


The functionality described in this section may be integrated into other
applications or tools using the 

SQLite expert extension code.

A database schema which incorporate SQL custom functions made available
via the extension load mechanism may need special provision to work with
the .expert feature. Because the feature uses additional connections to
implement its functionality, those custom functions must be made available
to those additional connections. This can be done by means of the extension
load/usage options described at 

Automatically Load Statically Linked Extensions
and 
Persistent Loadable Extensions.cli.html#index_recommendations_sqlite_expert_
œËÌÎœ„-—Ï_     G[†ueCommand Line Shell For SQLite22. Marking The End Of An SQL StatementSQLite commands are normally terminated by a semicolon.  In the CLI
you can also use the word "GO" (case-insensitive) or a slash character 
"/" on a line by itself to end a command.  These are used by SQL Server 
and Oracle, respectively, and are supported by the SQLite CLI for
compatibility.  These won't work in sqlite3_exec(), 
because the CLI translates these inputs into a semicolon before passing 
them down into the SQLite core.cli.html#marking_the_end_of_an_sql_statement‡y—Ï^        GSŽ]Command Line Shell For SQLite21. Using sqlite3 in a shell scriptOne way to use sqlite3 in a shell script is to use "echo" or
"cat" to generate a sequence of commands in a file, then invoke sqlite3
while redirecting input from the generated command file.  This
works fine and is appropriate in many circumstances.  But as
an added convenience, sqlite3 allows a single SQL command to be
entered on the command line as a second argument after the
database name.  When the sqlite3 program is launched with two
arguments, the second argument is passed to the SQLite library
for processing, the query results are printed on standard output
in list mode, and the program exits.  This mechanism is designed
to make sqlite3 easy to use in conjunction with programs like
"awk".  For example:

$ sqlite3 ex1 'select * from tbl1' \
&gt;  | awk '{printf "&lt;tr&gt;&lt;td&gt;%s&lt;td&gt;%s\n",$1,$2 }'
&lt;tr&gt;&lt;td&gt;hello&lt;td&gt;10
&lt;tr&gt;&lt;td&gt;goodbye&lt;td&gt;20
$cli.html#using_sqlite3_in_a_shell_scriptz—Ï]  G9‚SCCommand Line Shell For SQLite20. Other Dot CommandsThere are many other dot-commands available in the command-line
shell.  See the ".help" command for a complete list for any particular
version and build of SQLite.cli.html#other_dot_commands„X—Ï\    GU‡W_Command Line Shell For SQLite19. Miscellaneous Extension FeaturesThe CLI is built with several SQLite extensions that are not
included with the SQLite library. A few add features
not described in the preceding sections, namely:

the UINT collating sequence which treats
unsigned integers embedded in text according to
their value, along with other text, for ordering;
decimal arithmetic as provided by the decimal extension;
the generate_series() table-valued function; and
support for POSIX extended regular expressions
bound to the REGEXP operator.cli.html#miscellaneous_extension_features‰S—Ï[     Gi‘%sCommand Line Shell For SQLite18. Working With Multiple Database ConnectionsBeginning with version 3.37.0 (2021-11-27), the CLI has the ability to
hold multiple database connections open at once.  Only one database connection
is active at a time.  The inactive connections are still open but are idle.


Use the ".connection" dot-command (often abbreviated as just ".conn") to see a
list of database connections and an indication of which one is currently active.
Each database connection is identified by an integer between 0 and 9.  (There
can be at most 10 simultaneously open connections.)  Change to another database
connection, creating it if it does not already exist, by typing the ".conn"
command followed by its number.  Close a database connection by typing
".conn close N" where N is the connection number.


Though the underlying SQLite database connections are completely independent
of one another, many of the CLI settings, such as the output format, are
shared across all database connections.  Thus, changing the output mode in
one connection will change it in them all.  On the other hand, some
dot-commands such as .open only affect the current connection.cli.html#working_with_multiple_database_connections
yy——Ï`       G=¬[GCommand Line Shell For SQLite23. Command-line OptionsThere are many command-line options available to the CLI.  Use the --help
command-line option to see a list:

$ sqlite3 --help
Usage: ./sqlite3 &#91;OPTIONS&#93; FILENAME &#91;SQL&#93;
FILENAME is the name of an SQLite database. A new database is created
if the file does not previously exist.
OPTIONS include:
   -A ARGS...           run ".archive ARGS" and exit
   -append              append the database to the end of the file
   -ascii               set output mode to 'ascii'
   -bail                stop after hitting an error
   -batch               force batch I/O
   -box                 set output mode to 'box'
   -column              set output mode to 'column'
   -cmd COMMAND         run "COMMAND" before reading stdin
   -csv                 set output mode to 'csv'
   -deserialize         open the database using sqlite3_deserialize()
   -echo                print commands before execution
   -init FILENAME       read/process named file
   -&#91;no&#93;header          turn headers on or off
   -help                show this message
   -html                set output mode to HTML
   -interactive         force interactive I/O
   -json                set output mode to 'json'
   -line                set output mode to 'line'
   -list                set output mode to 'list'
   -lookaside SIZE N    use N entries of SZ bytes for lookaside memory
   -markdown            set output mode to 'markdown'
   -maxsize N           maximum size for a --deserialize database
   -memtrace            trace all memory allocations and deallocations
   -mmap N              default mmap size set to N
   -newline SEP         set output row separator. Default: '\n'
   -nofollow            refuse to open symbolic links to database files
   -nonce STRING        set the safe-mode escape nonce
   -nullvalue TEXT      set text string for NULL values. Default ''
   -pagecache SIZE N    use N slots of SZ bytes each for page cache memory
   -quote               set output mode to 'quote'
   -readonly            open the database read-only
   -safe                enable safe-mode
   -separator SEP       set output column separator. Default: '|'
   -stats               print memory stats before each finalize
   -table               set output mode to 'table'
   -tabs                set output mode to 'tabs'
   -version             show SQLite version
   -vfs NAME            use NAME as the default VFS
   -zip                 open the file as a ZIP Archive


The CLI is flexible regarding command-line option formatting.
Either one or two leading "-" characters are permitted.
Thus "-box" and "--box" mean the same thing.
Command-line options are processed from left to right.
Hence a "--box" option will override a prior "--quote" option.


Most of the command-line options are self-explanatory, but a few merit additional
discussion below.cli.html#command_line_options
í
ëúí—Ïc GiŽsCommand Line Shell For SQLite24. Compiling the sqlite3 program from sourcesTo compile the command-line shell on unix systems and on Windows with MinGW,
the usual configure-make command works:

sh configure; make



The configure-make works whether you are building from the canonical sources
from the source tree, or from an amalgamated bundle.  There are few
dependencies.  When building from canonical sources, a working 
tclsh is required.
If using an amalgamation bundle, all the preprocessing work normally 
done by tclsh will have already been carried out and only normal build
tools are required.


A working zlib compression library is
needed in order for the .archive command to operate.


On Windows with MSVC, use nmake with the Makefile.msc:

nmake /f Makefile.msc



For correct operation of the .archive command, make a copy of the
zlib source code into the compat/zlib subdirectory 
of the source tree and compile this way:

nmake /f Makefile.msc USE_ZLIB=1cli.html#compiling_the_sqlite3_program_from_sources‰l—ÏbG‘+Command Line Shell For SQLite23.1.1. Bypassing --safe restrictions for specific commandsIf the "--nonce NONCE" option is also included on the command-line, for some
large and arbitrary NONCE string, then the ".nonce NONCE" command (with the
same large nonce string) will permit the next SQL statement or dot-command
to bypass the --safe restrictions.

Suppose you want to run a suspicious script and the script requires one or
two of the features that --safe normally disables.  For example, suppose it
needs to ATTACH one additional database.  Or suppose the script needs to load
a specific extension. This can be accomplished by preceding the (carefully
audited) ATTACH statement or the ".load" command with an appropriate ".nonce"
command and supplying the same nonce value using the "--nonce" command-line
option.  Those specific commands will then be allowed to execute normally,
but all other unsafe commands will still be restricted.

The use of ".nonce" is dangerous in the sense that a mistake can allow a
hostile script to damage your system.  Therefore, use ".nonce" carefully,
sparingly, and as a last resort when there are no other ways to get a
script to run under --safe mode.cli.html#bypassing_safe_restrictions_for_specific_commandsŠ—Ïa GU’OWCommand Line Shell For SQLite23.1. The --safe command-line optionThe --safe command-line option attempts to disable all features of the CLI that
might cause any changes to the host computer other than changes to the specific database
file named on the command-line.  The idea is that if you receive a large SQL script
from an unknown or untrusted source, you can run that script to see what it does without
risking an exploit by using the --safe option.  The --safe option disables (among other
things):


 The .open command, unless the --hexdb option is used or the filename is ":memory:".
     This prevents the script from reading or writing any database files not named on
     the original command-line.
 The ATTACH SQL command.
 SQL functions that have potentially harmful side-effects, such as
     edit(), fts3_tokenizer(), load_extension(), readfile() and writefile().
 The .archive command.
 The .backup and .save commands.
 The .import command.
 The .load command.
 The .log command.
 The .shell and .system commands.
 The .excel, .once and .output commands.
 Other commands that can have deleterious side effects.



Basically, any feature of the CLI that reads or writes from a file on disk other
than the main database file is disabled.cli.html#the_safe_command_line_option
Ú·(ÚˆI—ær   I%?35% Faster Than The Filesystem1.1. Caveats&sup1;The 35% figure above is approximate.  Actual timings vary
depending on hardware, operating system, and the
details of the experiment, and due to random performance fluctuations
on real-world hardware.  See the text below for more detail.
Try the experiments yourself.  Report significant deviations on
the SQLite forum.



The 35% figure is based on running tests on every machine
that the author has easily at hand.
Some reviewers of this article report that SQLite has higher 
latency than direct I/O on their systems.  We do not yet understand
the difference.  We also see indications that SQLite does not
perform as well as direct I/O when experiments are run using
a cold filesystem cache.


So let your take-away be this: read/write latency for
SQLite is competitive with read/write latency of individual files on
disk.  Often SQLite is faster.  Sometimes SQLite is almost
as fast.  Either way, this article disproves the common
assumption that a relational database must be slower than direct
filesystem I/O.fasterthanfs.html#caveats‰
—æq     I!‘
?35% Faster Than The Filesystem1. SummarySQLite reads and writes small blobs (for example, thumbnail images)
35% faster&sup1; than the same blobs
can be read from or written to individual files on disk using
fread() or fwrite().

Furthermore, a single SQLite database holding
10-kilobyte blobs uses about 20% less disk space than
storing the blobs in individual files.

The performance difference arises (we believe) because when
working from an SQLite database, the open() and close() system calls
are invoked only once, whereas
open() and close() are invoked once for each blob
when using blobs stored in individual files.  It appears that the
overhead of calling open() and close() is greater than the overhead
of using the database.  The size reduction arises from the fact that
individual files are padded out to the next multiple of the filesystem
block size, whereas the blobs are packed more tightly into an SQLite
database.


The measurements in this article were made during the week of 2017-06-05
using a version of SQLite in between 3.19.2 and 3.20.0.  You may expect
future versions of SQLite to perform even better.fasterthanfs.html#summaryˆD—Ïd GGOMCommand Line Shell For SQLite24.1.  Do-It-Yourself Builds The source code to the sqlite3 command line interface is in a single
file named "shell.c".  The shell.c source file is generated from other
sources, but most of the code for shell.c can be found in
src/shell.c.in.
(Regenerate shell.c by typing "make shell.c" from the canonical source tree.)
Compile the shell.c file (together
with the sqlite3 library source code) to generate
the executable.  For example:

gcc -o sqlite3 shell.c sqlite3.c -ldl -lpthread -lz -lm



The following additional compile-time options are recommended in order to
provide a full-featured command-line shell:


 -DSQLITE_THREADSAFE=0
 -DSQLITE_ENABLE_EXPLAIN_COMMENTS
 -DSQLITE_HAVE_ZLIB
 -DSQLITE_INTROSPECTION_PRAGMAS
 -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
 -DSQLITE_ENABLE_STMTVTAB
 -DSQLITE_ENABLE_DBPAGE_VTAB
 -DSQLITE_ENABLE_DBSTAT_VTAB
 -DSQLITE_ENABLE_OFFSET_SQL_FUNC
 -DSQLITE_ENABLE_JSON1
 -DSQLITE_ENABLE_RTREE
 -DSQLITE_ENABLE_FTS4
 -DSQLITE_ENABLE_FTS5

This page last modified on  2022-12-27 16:51:24 UTCcli.html#_do_it_yourself_builds_
ÚÆÚ§_—æt  IQÍWo35% Faster Than The Filesystem2. How These Measurements Are MadeI/O performance is measured using the
kvtest.c program
from the SQLite source tree.
To compile this test program, first gather the kvtest.c source file
into a directory with the SQLite amalgamation source
files "sqlite3.c" and "sqlite3.h".  Then on unix, run a command like
the following:

gcc -Os -I. -DSQLITE_DIRECT_OVERFLOW_READ &#92;
  kvtest.c sqlite3.c -o kvtest -ldl -lpthread


Or on Windows with MSVC:

cl -I. -DSQLITE_DIRECT_OVERFLOW_READ kvtest.c sqlite3.c


Instructions for compiling for Android
are shown below.


Use the resulting "kvtest" program to
generate a test database with 100,000 random uncompressible
blobs, each with a random
size between 8,000 and 12,000 bytes
using a command like this:

./kvtest init test1.db --count 100k --size 10k --variance 2k



If desired, you can verify the new database by running this command:

./kvtest stat test1.db



Next, make copies of all the blobs into indiviˆ5—æs   I5?O35% Faster Than The Filesystem1.2. Related StudiesJim Gray
and others studied the read performance of BLOBs
versus file I/O for Microsoft SQL Server and found that reading BLOBs 
out of the 
database was faster for BLOB sizes less than between 250KiB and 1MiB.
(Paper).
In that study, the database still stores the filename of the content even
if the content is held in a separate file.  So the database is consulted
for every BLOB, even if it is only to extract the filename.  In this
article, the key for the BLOB is the filename, so no preliminary database
access is required.  Because the database is never used at all when
reading content from individual files in this article, the threshold
at which direct file I/O becomes faster is smaller than it is in Gray's
paper.


The Internal Versus External BLOBs article on this website is an
earlier investigation (circa 2011) that uses the same approach as the
Jim Gray paper &mdash; storing the blob filenames as entries in the
database &mdash; but for SQLite instead of SQL Server.fasterthanfs.html#related_studiesdual files in a directory
using a command like this:

./kvtest export test1.db test1.dir



At this point, you can measure the amount of disk space used by
the test1.db database and the space used by the test1.dir directory
and all of its content.  On a standard Ubuntu Linux desktop, the
database file will be 1,024,512,000 bytes in size and the test1.dir
directory will use 1,228,800,000 bytes of space (according to "du -k"),
about 20% more than the database.


The "test1.dir" directory created above puts all the blobs into a single
folder.  It was conjectured that some operating systems would perform 
poorly when a single directory contains 100,000 objects.  To test this,
the kvtest program can also store the blobs in a hierarchy of folders with no
more than 100 files and/or subdirectories per folder.  The alternative
on-disk representation of the blobs can be created using the --tree
command-line option to the "export" command, like this:

./kvtest export test1.db test1.tree --tree



The test1.dir directory will contain 100,000 files
with names like "000000", "000001", "000002" and so forth but the
test1.tree directory will contain the same files in subdirectories like
"00/00/00", "00/00/01", and so on.  The test1.dir and test1.test
directories take up approximately the same amount of space, though
test1.test is very slightly larger due to the extra directory entries.


All of the experiments that follow operate the same with either 
"test1.dir" or "test1.tree".  Very little performance difference is
measured in either case, regardless of operating system.


Measure the performance for reading blobs from the database and from
individual files using these commands:

./kvtest run test1.db --count 100k --blob-api
./kvtest run test1.dir --count 100k --blob-api
./kvtest run test1.tree --count 100k --blob-api



Depending on your hardware and operating system, you should see that reads 
from the test1.db database file are about 35% faster than reads from 
individual files in the test1.dir or test1.tree folders.  Results can vary
significantly from one run to the next due to caching, so it is advisable
to run tests multiple times and take an average or a worst case or a best
case, depending on your requirements.

The --blob-api option on the database read test causes kvtest to use
the sqlite3_blob_read() feature of SQLite to load the content of the
blobs, rather than running pure SQL statements.  This helps SQLite to run
a little faster on read tests.  You can omit that option to compare the
performance of SQLite running SQL statements.
In that case, the SQLite still out-performs direct reads, though
by not as much as when using sqlite3_blob_read().
The --blob-api option is ignored for tests that read from individual disk
files.


Measure write performance by adding the --update option.  This causes
the blobs are overwritten in place with another random blob of
exactly the same size.

./kvtest run test1.db --count 100k --update
./kvtest run test1.dir --count 100k --update
./kvtest run test1.tree --count 100k --update



The writing test above is not completely fair, since SQLite is doing
power-safe transactions whereas the direct-to-disk writing is not.
To put the tests on a more equal footing, add either the --nosync
option to the SQLite writes to disable calling fsync() or
FlushFileBuffers() to force content to disk, or using the --fsync option
for the direct-to-disk tests to force them to invoke fsync() or
FlushFileBuffers() when updating disk files.


By default, kvtest runs the database I/O measurements all within
a single transaction.  Use the --multitrans option to run each blob
read or write in a separate transaction.  The --multitrans option makes
SQLite much slower, and uncompetitive with direct disk I/O.  This
option proves, yet again, that to get the most performance out of
SQLite, you should group as much database interaction as possible within
a single transaction.


There are many other testing options, which can be seen by running
the command:

./kvtest helpfasterthanfs.html#how_these_measurements_are_made
è蘗æu   IQ®Ck35% Faster Than The Filesystem2.1. Read Performance MeasurementsThe chart below shows data collected using 
kvtest.c on five different
systems:


Win7: A circa-2009 Dell Inspiron laptop, Pentium dual-core
    at 2.30GHz, 4GiB RAM, Windows7.
Win10: A 2016 Lenovo YOGA 910, Intel i7-7500 at 2.70GHz,
    16GiB RAM, Windows10.
Mac: A 2015 MacBook Pro, 3.1GHz intel Core i7, 16GiB RAM,
    MacOS 10.12.5
Ubuntu: Desktop built from Intel i7-4770K at 3.50GHz, 32GiB RAM,
    Ubuntu 16.04.2 LTS
Android: Galaxy S3, ARMv7, 2GiB RAM


All machines use SSD except Win7 which has a
hard-drive. The test database is 100K blobs with sizes uniformly
distributed between 8K and 12K, for a total of about 1 gigabyte
of content.  The database page size
is 4KiB.  The -DSQLITE_DIRECT_OVERFLOW_READ compile-time option was
used for all of these tests.
Tests were run multiple times.
The first run was used to warm up the cache and its timings were discarded.


The chart below shows average time to read a blob directly from the
filesystem versus the time needed to read the same blob from the SQLite 
database.
The actual timings vary considerably from one system to another 
(the Ubuntu desktop is much
faster than the Galaxy S3 phone, for example).  
This chart shows the ratio of the
times needed to read blobs from a file divided by the time needed to
from the database.  The left-most column in the chart is the normalized
time to read from the database, for reference.


In this chart, an SQL statement ("SELECT v FROM kv WHERE k=?1") 
is prepared once.  Then for each blob, the blob key value is bound 
to the ?1 parameter and the statement is evaluated to extract the
blob content.


The chart shows that on Windows10, content can be read from the SQLite
database about 5 times faster than it can be read directly from disk.
On Android, SQLite is only about 35% faster than reading from disk.






Chart 1:  SQLite read latency relative to direct filesystem reads.
100K blobs, avg 10KB each, random order using SQL



The performance can be improved slightly by bypassing the SQL layer
and reading the blob content directly using the
sqlite3_blob_read() interface, as shown in the next chart:






Chart 2:  SQLite read latency relative to direct filesystem reads.
100K blobs, avg size 10KB, random order
using sqlite3_blob_read().



Further performance improves can be made by using the
memory-mapped I/O feature of SQLite.  In the next chart, the
entire 1GB database file is memory mapped and blobs are read
(in random order) using the sqlite3_blob_read() interface.
With these optimizations, SQLite is twice as fast as Android
or MacOS-X and over 10 times faster than Windows.






Chart 3:  SQLite read latency relative to direct filesystem reads.
100K blobs, avg size 10KB, random order
using sqlite3_blob_read() from a memory-mapped database.



The third chart shows that reading blob content out of SQLite can be
twice as fast as reading from individual files on disk for Mac and
Android, and an amazing ten times faster for Windows.fasterthanfs.html#read_performance_measurements
$é$‡@—æw   I+iE35% Faster Than The Filesystem2.3. VariationsThe -DSQLITE_DIRECT_OVERFLOW_READ compile-time option causes SQLite
to bypass its page cache when reading content from overflow pages.  This
helps database reads of 10K blobs run a little faster, but not all that much
faster.  SQLite still holds a speed advantage over direct filesystem reads
without the SQLITE_DIRECT_OVERFLOW_READ compile-time option.

Other compile-time options such as using -O3 instead of -Os or
using -DSQLITE_THREADSAFE=0 and/or some of the other
recommended compile-time options might help SQLite to run even faster
relative to direct filesystem reads.

The size of the blobs in the test data affects performance.
The filesystem will generally be faster for larger blobs, since
the overhead of open() and close() is amortized over more bytes of I/O,
whereas the database will be more efficient in both speed and space
as the average blob size decreases.fasterthanfs.html#variations˜—æv    IS®=m35% Faster Than The Filesystem2.2. Write Performance MeasurementsWrites are slower.
On all systems, using both direct I/O and SQLite, write performance is
between 5 and 15 times slower than reads.


Write performance measurements were made by replacing (overwriting)
an entire blob with a different blob.  All of the blobs in these
experiment are random and incompressible.  Because writes are so much
slower than reads, only 10,000 of the 100,000 blobs in the database
are replaced.  The blobs to be replaced are selected at random and
are in no particular order.


The direct-to-disk writes are accomplished using fopen()/fwrite()/fclose().
By default, and in all the results shown below, the OS filesystem buffers are
never flushed to persistent storage using fsync() or
FlushFileBuffers().  In other words, there is no attempt to make the
direct-to-disk writes transactional or power-safe.
We found that invoking fsync() or FlushFileBuffers() on each file
written causes direct-to-disk storage
to be about 10 times or more slower than writes to SQLite.


The next chart compares SQLite database updates in WAL mode
against raw direct-to-disk overwrites of separate files on disk.
The PRAGMA synchronous setting is NORMAL.
All database writes are in a single transaction.
The timer for the database writes is stopped after the transaction
commits, but before a checkpoint is run.
Note that the SQLite writes, unlike the direct-to-disk writes,
are transactional and power-safe, though because the synchronous
setting is NORMAL instead of FULL, the transactions are not durable.






Chart 4:  SQLite write latency relative to direct filesystem writes.
10K blobs, avg size 10KB, random order,
WAL mode with synchronous NORMAL,
exclusive of checkpoint time



The android performance numbers for the write experiments are omitted
because the performance tests on the Galaxy S3 are so random.  Two
consecutive runs of the exact same experiment would give wildly different
times.  And, to be fair, the performance of SQLite on android is slightly
slower than writing directly to disk.


The next chart shows the performance of SQLite versus direct-to-disk
when transactions are disabled (PRAGMA journal_mode=OFF)
and PRAGMA synchronous is set to OFF.  These settings put SQLite on an
equal footing with direct-to-disk writes, which is to say they make the
data prone to corruption due to system crashes and power failures.






Chart 5:  SQLite write latency relative to direct filesystem writes.
10K blobs, avg size 10KB, random order,
journaling disabled, synchronous OFF.



In all of the write tests, it is important to disable anti-virus software
prior to running the direct-to-disk performance tests.  We found that
anti-virus software slows down direct-to-disk by an order of magnitude
whereas it impacts SQLite writes very little.  This is probably due to the
fact that direct-to-disk changes thousands of separate files which all need
to be checked by anti-virus, whereas SQLite writes only changes the single
database file.fasterthanfs.html#write_performance_measurements
¤ƒn¤‡E—îY        SŽ5Dynamic Memory Allocation In SQLite OverviewSQLite uses dynamic memory allocation to obtain
memory for storing various objects
(ex: database connections and prepared statements) and to build
a memory cache of the database file and to hold the results of queries.
Much effort has gone into making the dynamic memory allocation subsystem
of SQLite reliable, predictable, robust, secure, and efficient.

This document provides an overview of dynamic memory allocation within 
SQLite.  The target audience is software engineers who are tuning their
use of SQLite for peak performance in demanding environments.
Nothing in this document is required knowledge for using SQLite.  The
default settings and configuration for SQLite will work well in most
applications.  However, the information contained in this document may
be useful to engineers who are tuning SQLite to comply with special
requirements or to run under unusual circumstances.malloc.html#overviewˆ—æy    IWŽ1q35% Faster Than The Filesystem4.1. Compiling And Testing on AndroidThe kvtest program is compiled and run on Android as follows.
First install the Android SDK and NDK.  Then prepare a script
named "android-gcc" that looks approximately like this:

#!/bin/sh
#
NDK=/home/drh/Android/Sdk/ndk-bundle
SYSROOT=$NDK/platforms/android-16/arch-arm
ABIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin
GCC=$ABIN/arm-linux-androideabi-gcc
$GCC --sysroot=$SYSROOT -fPIC -pie $*


Make that script executable and put it on your $PATH.  Then
compile the kvtest program as follows:

android-gcc -Os -I. kvtest.c sqlite3.c -o kvtest-android


Next, move the resulting kvtest-android executable to the Android
device:

adb push kvtest-android /data/local/tmp


Finally use "adb shell" to get a shell prompt on the Android device,
cd into the /data/local/tmp directory, and begin running the tests
as with any other unix host.
This page last modified on  2021-03-01 12:55:48 UTCfasterthanfs.html#compiling_and_testing_on_androidˆx—æx      I3EQ35% Faster Than The Filesystem3. General FindingsSQLite is competitive with, and usually faster than, blobs stored in
separate files on disk, for both reading and writing.


SQLite is much faster than direct writes to disk on Windows
when anti-virus protection is turned on.  Since anti-virus software
is and should be on by default in Windows, that means that SQLite
is generally much faster than direct disk writes on Windows.


Reading is about an order of magnitude faster than writing, for all
systems and for both SQLite and direct-to-disk I/O.


I/O performance varies widely depending on operating system and hardware.
Make your own measurements before drawing conclusions.


Some other SQL database engines advise developers to store blobs in separate
files and then store the filename in the database.  In that case, where
the database must first be consulted to find the filename before opening
and reading the file, simply storing the entire blob in the database
gives much faster read and write performance with SQLite.
See the Internal Versus External BLOBs article for more information.fasterthanfs.html#general_findings
››¡,—î[ S#ÁO5Dynamic Memory Allocation In SQLite2.  TestingMost of the code in the SQLite source tree is devoted purely to 
testing and verification.  Reliability is important to SQLite.
Among the tasks of the test infrastructure is to ensure that
SQLite does not misuse dynamically allocated memory, that SQLite
does not leak memory, and that SQLite responds
correctly to a dynamic memory allocation failure.

The test infrastructure verifies that SQLite does not misuse
dynamically allocated"–n—îZ    S%¬O7Dynamic Memory Allocation In SQLite1.  FeaturesThe SQLite core and its memory allocation subsystem provides the 
following capabilities:



Robust against allocation failures.
If a memory allocation ever fails (that is to say, 
if malloc() or realloc() ever return NULL)
then SQLite will recover gracefully.   SQLite will first attempt
to free memory from unpinned cache pages then retry the allocation
request.  
Failing that, SQLite will either stop what
it is doing and return the
SQLITE_NOMEM error code back up to the application or it will
make do without the requested memory.



No memory leaks.
The application is responsible for destroying any objects it allocates.
(For example, the application must use sqlite3_finalize() on 
every prepared statement and sqlite3_close() on every 
database connection.)   But as long as
the application cooperates, SQLite will never leak memory.  This is
true even in the face of memory allocation failures or other system
errors.



Memory usage limits.
The sqlite3_soft_heap_limit64() mechanism allows the application to
set a memory usage limit that SQLite strives to stay below.  SQLite
will attempt to reuse memory from its caches rather than allocating new
memory as it approaches the soft limit.



Zero-malloc option.
The application can optionally provide SQLite with several buffers of bulk memory
at startup and SQLite will then use those provided buffers for all of
its memory allocation needs and never call system malloc() or free().



Application-supplied memory allocators.
The application can provide SQLite with pointers to alternative 
memory allocators at start-time.  The alternative memory allocator
will be used in place of system malloc() and free().



Proof against breakdown and fragmentation.
SQLite can be configured so that, subject to certain usage constraints
detailed below, it is guaranteed to never fail a memory allocation
or fragment the heap.
This property is important to long-running, high-reliability
embedded systems where a memory allocation error could contribute
to an overall system failure.



Memory usage statistics.
Applications can see how much memory they are using and detect when
memory usage is approaching or exceeding design boundaries.




Plays well with memory debuggers.
Memory allocation in SQLite is structured so that standard
third-party memory debuggers (such as dmalloc or 
valgrind) can be used to verify correct
memory allocation behavior.


Minimal calls to the allocator.
The system malloc() and free() implementations are inefficient
on many systems.  SQLite strives to reduce overall processing time
by minimizing its use of malloc() and free().



Open access.
Pluggable SQLite extensions or even the application itself can 
access to the same underlying memory allocation
routines used by SQLite through the
sqlite3_malloc(), sqlite3_realloc(), and sqlite3_free() interfaces.malloc.html#_features memory by using a specially instrumented
memory allocator.  The instrumented memory allocator is enabled
at compile-time using the SQLITE_MEMDEBUG option.  The instrumented
memory allocator is much slower than the default memory allocator and
so its use is not recommended in production.  But when
enabled during testing, 
the instrumented memory allocator performs the following checks:


Bounds checking.
The instrumented memory allocator places sentinel values at both ends
of each memory allocation to verify that nothing within SQLite writes
outside the bounds of the allocation.

Use of memory after freeing.
When each block of memory is freed, every byte is overwritten with a
nonsense bit pattern.  This helps to ensure that no memory is ever
used after having been freed.

Freeing memory not obtained from malloc.
Each memory allocation from the instrumented memory allocator contains
sentinels used to verify that every allocation freed came
from prior malloc.

Uninitialized memory.
The instrumented memory allocator initializes each memory allocation
to a nonsense bit pattern to help ensure that the user makes no
assumptions about the content of allocation memory.


Regardless of whether or not the instrumented memory allocator is
used, SQLite keeps track of how much memory is currently checked out.
There are hundreds of test scripts used for testing SQLite.  At the
end of each script, all objects are destroyed and a test is made to
ensure that all  memory has been freed.  This is how memory
leaks are detected.  Notice that memory leak detection is in force at
all times, during test builds and during production builds.  Whenever
one of the developers runs any individual test script, memory leak
detection is active.  Hence memory leaks that do arise during development
are quickly detected and fixed.


The response of SQLite to out-of-memory (OOM) errors is tested using
a specialized memory allocator overlay that can simulate memory failures.
The overlay is a layer that is inserted in between the memory allocator
and the rest of SQLite.  The overlay passes most memory allocation
requests straight through to the underlying allocator and passes the
results back up to the requester.  But the overlay can be set to 
cause the Nth memory allocation to fail.  To run an OOM test, the overlay
is first set to fail on the first allocation attempt.  Then some test
script is run and verification that the allocation was correctly caught
and handled is made.  Then the overlay is set to fail on the second
allocation and the test repeats.  The failure point continues to advance
one allocation at a time until the entire test procedure runs to
completion without hitting a memory allocation error.  This whole
test sequence run twice.  On the first pass, the
overlay is set to fail only the Nth allocation.  On the second pass,
the overlay is set to fail the Nth and all subsequent allocations.

Note that the memory leak detection logic continues to work even
when the OOM overlay is being used.  This verifies that SQLite
does not leak memory even when it encounters memory allocation errors.
Note also that the OOM overlay can work with any underlying memory
allocator, including the instrumented memory allocator that checks
for memory allocation misuse.  In this way it is verified that 
OOM errors do not induce other kinds of memory usage errors.

Finally, we observe that the instrumented memory allocator and the
memory leak detector both work over the entire SQLite test suite and
the TCL test suite provides over 99% statement test coverage and that
the TH3 test harness provides 100% branch test coverage
with no leak leaks. This is
strong evidence that dynamic memory allocation is used correctly
everywhere within SQLite.malloc.html#_testing
nÛ²‡%—î_        SSŒi]Dynamic Memory Allocation In SQLite3.1.1. The default memory allocatorBy default, SQLite uses the malloc(), realloc(), and free() routines
from the standard C library for its memory allocation needs.  These routines
are surrounded by a thin wrapper that also provides a "memsize()" function
that will return the size of an existing allocation.  The memsize() function
is needed to keep an accurate count of the number of bytes of outstanding
memory; memsize() determines how many bytes to remove from the outstanding
count when an allocation is freed.  The default allocator implements
memsize() by always allocating 8 extra bytes on each malloc() request and
storing the size of the allocation in that 8-byte header.

The default memory allocator is recommended for most applications.
If you do not have a compelling need to use an alternative memory
allocator, then use the default.malloc.html#the_default_memory_allocator‚$—î^   Sg‚;uDynamic Memory Allocation In SQLite3.1.  Alternative low-level memory allocatorsThe SQLite source code includes several different memory allocation
modules that can be selected at compile-time, or to a limited extent
at start-time.malloc.html#_alternative_low_level_memory_allocatorsƒ—î] S/„{ADynamic Memory Allocation In SQLite3.  ConfigurationThe default memory allocation settings in SQLite are appropriate
for most applications.  However, applications with unusual or particularly
strict requirements may want to adjust the configuration to more closely
align SQLite to their needs.
Both compile-time and start-time configuration options are available.malloc.html#_configuration‘
—î\    SC WODynamic Memory Allocation In SQLite2.1.  Use of reallocarray()The reallocarray() interface is a recent innovation (circa 2014)
from the OpenBSD community that grow out of efforts to prevent the
next "heartbleed" bug by avoiding 32-bit integer
arithmetic overflow on memory allocation size computations.  The
reallocarray() function has both unit-size and count parameters.
To allocate memory sufficient to hold an array of N elements each X-bytes
in size, one calls "reallocarray(0,X,N)".  This is preferred over
the traditional technique of invoking "malloc(X*N)" as reallocarray()
eliminates the risk that the X*N multiplication will overflow and
cause malloc() to return a buffer that is a different size from what
the application expected.

SQLite does not use reallocarray().  The reason is that reallocarray()
is not useful to SQLite.  It turns out that SQLite never does memory
allocations that are the simple product of two integers.  Instead, SQLite
does allocations of the form "X+C" or "N*X+C" or "M*N*X+C" or
"N*X+M*Y+C", and so forth.  The reallocarray() interface is not helpful
in avoiding integer overflow in those cases.

Nevertheless, integer overflow in the computation of memory allocation
sizes is a concern that SQLite would like to deal with.  To prevent
problems, all SQLite internal memory allocations occur using thin wrapper
functions that take a signed 64-bit integer size parameter.  The SQLite 
source code is audited to ensure that all size computations are carried 
out using 64-bit signed integers as well.  SQLite will
refuse to allocate more than about 2GB of memory at one go.  (In common
use, SQLite seldom ever allocates more than about 8KB of memory at a time
so a 2GB allocation limit is not a burden.)  So the 64-bit size parameter
provides lots of headroom for detecting overflows.  The same audit that
verifies that all size computations are done as 64-bit signed integers
also verifies that it is impossible to overflow a 64-bit integer
during the computation.

The code audits used to ensure that memory allocation size computations
do not overflow in SQLite are repeated prior to every SQLite release.malloc.html#_use_of_reallocarray_
Ú  jÚ…—îa       S]ˆ!gDynamic Memory Allocation In SQLite3.1.3. The Win32 native memory allocatorIf SQLite is compiled for Windows with the SQLITE_WIN32_MALLOC
compile-time option, then a different, thin wrapper is used around
HeapAlloc(), HeapReAlloc(), and HeapFree().  The thin wrapper uses the
configured SQLite heap, which will be different from the default process
heap if the SQLITE_WIN32_HEAP_CREATE compile-time option is used.  In
addition, when an allocation is made or freed, HeapValidate() will be
called if SQLite is compiled with assert() enabled and the
SQLITE_WIN32_MALLOC_VALIDATE compile-time option.malloc.html#the_win32_native_memory_allocator—î`     SW˜9aDynamic Memory Allocation In SQLite3.1.2. The debugging memory allocatorIf SQLite is compiled with the SQLITE_MEMDEBUG compile-time option,
then a different, heavy wrapper is used around system malloc(), realloc(), 
and free().
The heavy wrapper allocates around 100 bytes of extra space
with each allocation.  The extra space is used to place sentinel values 
at both ends of the allocation returned to the SQLite core.  When an
allocation is freed,
these sentinels are checked to make sure the SQLite core did not overrun
the buffer in either direction.  When the system library is GLIBC, the 
heavy wrapper also makes use of the GNU backtrace() function to examine
the stack and record the ancestor functions of the malloc() call.  When
running the SQLite test suite, the heavy wrapper also records the name of
the current test case.  These latter two features are useful for
tracking down the source of memory leaks detected by the test suite.

The heavy wrapper that is used when SQLITE_MEMDEBUG is set also
makes sure each new allocation is filled with nonsense data prior to
returning the allocation to the caller.  And as soon as an allocation
is free, it is again filled with nonsense data.  These two actions help
to ensure that the SQLite core does not make assumptions about the state
of newly allocated memory and that memory allocations are not used after
they have been freed.

The heavy wrapper employed by SQLITE_MEMDEBUG is intended for use
only during testing, analysis, and debugging of SQLite.  The heavy wrapper
has a significant performance and memory overhead and probably should not
be used in production.malloc.html#the_debugging_memory_allocator
¶U¶—îc       SW˜KaDynamic Memory Allocation In SQLite3.1.5. Experimental memory allocatorsThe name "memsys5" used for the zero-malloc memory allocator implies
that there are several additional memory allocators available, and indeed
there are.  The default memory allocator is "memsys1".  The debugging
memory allocator is "memsys2".  Those have already been covered.

If SQLite is compiled with SQLITE_ENABLE_MEMSYS3 then another
zero-malloc memory allocator, similar to memsys5, is included in the
source tree.  The memsys3 allocator, like memsys5, must be activated
by a call to sqlite3_config(SQLITE_CONFIG_HEAP,...).  Memsys3
uses the memory buffer supplied as its source for all memory allocations.
The difference between memsys3 and memsys5 is that memsys3 uses a
different memory allocation algorithm that seems to work well in
practice, but which does not provide mathematical
guarantees against memory fragmentation and breakdown.  Memsys3 was
a predecessor to memsys5.  The SQLite developers now believe that 
memsys5 is superior to
memsys3 and that all applications that need a zero-malloc memory
allocator should use memsys5 in preference to memsys3.  Memsys3 is
considered both experimental and deprecated and will likely be removed 
from the source tree in a future release of SQLite.

Memsys4 and memsys6 were experimental memory allocators
introduced in around 2007 and subsequently removed from the
source tree in around 2008, after it became clear that they
added no new value.

Other experimental memory allocators might be added in future releases
of SQLite.  One may anticipate that these will be called memsys7, memsys8,
and so forth.malloc.html#experimental_memory_allocators&—îb    SSœk]Dynamic Memory Allocation In SQLite3.1.4. Zero-malloc memory allocatorWhen SQLite is compiled with the SQLITE_ENABLE_MEMSYS5 option, an
alternative memory allocator that does not use malloc() is included in the
build.  The SQLite developers refer to this alternative memory allocator
as "memsys5".  Even when it is included in the build, memsys5 is 
disabled by default.
To enable memsys5, the application must invoke the following SQLite 
interface at start-time:


sqlite3_config(SQLITE_CONFIG_HEAP, pBuf, szBuf, mnReq);


In the call above, pBuf is a pointer to a large, contiguous chunk
of memory space that SQLite will use to satisfy all of its memory
allocation needs.   pBuf might point to a static array or it might
be memory obtained from some other application-specific mechanism.
szBuf is an integer that is the number of bytes of memory space
pointed to by pBuf.  mnReq is another integer that is the
minimum size of an allocation.  Any call to sqlite3_malloc(N) where
N is less than mnReq will be rounded up to mnReq.  mnReq must be
a power of two.  We shall see later that the mnReq parameter is
important in reducing the value of n and hence the minimum memory
size requirement in the Robson proof.

The memsys5 allocator is designed for use on embedded systems, 
though there is nothing to prevent its use on workstations.
The szBuf is typically between a few hundred kilobytes up to a few
dozen megabytes, depending on system requirements and memory budget.

The algorithm used by memsys5 can be called "power-of-two,
first-fit".  The sizes of all memory allocation 
requests are rounded up to a power of two and the request is satisfied
by the first free slot in pBuf that is large enough.  Adjacent freed
allocations are coalesced using a buddy system. When used appropriately,
this algorithm provides mathematical guarantees against fragmentation and
breakdown, as described further below.malloc.html#zero_malloc_memory_allocator
Õ        Õ†>—îf      SQ‹[Dynamic Memory Allocation In SQLite3.1.8. No-op memory allocator stubIf SQLite is compiled with the SQLITE_ZERO_MALLOC option, then
the default memory allocator is omitted and replaced by a stub
memory allocator that never allocates any memory.  Any calls to the
stub memory allocator will report back that no memory is available.

The no-op memory allocator is not useful by itself.  It exists only
as a placeholder so that SQLite has a memory allocator to link against
on systems that may not have malloc(), free(), or realloc() in their
standard library.
An application that is compiled with SQLITE_ZERO_MALLOC will need to
use sqlite3_config() together with SQLITE_CONFIG_MALLOC or
SQLITE_CONFIG_HEAP to specify a new alternative memory allocator
before beginning to use SQLite.malloc.html#no_op_memory_allocator_stub…e—îe     SM‰uWDynamic Memory Allocation In SQLite3.1.7. Memory allocator overlaysAn application can insert layers or "overlays" in between the
SQLite core and the underlying memory allocator.
For example, the out-of-memory test logic
for SQLite uses an overlay that can simulate memory allocation
failures.

An overlay can be created by using the


sqlite3_config(SQLITE_CONFIG_GETMALLOC, pOldMem);


interface to obtain pointers to the existing memory allocator.
The existing allocator is saved by the overlay and is used as
a fallback to do real memory allocation.  Then the overlay is
inserted in place of the existing memory allocator using
the sqlite3_config(SQLITE_CONFIG_MALLOC,...) as described
above.malloc.html#memory_allocator_overlays‡y—îd        SemoDynamic Memory Allocation In SQLite3.1.6. Application-defined memory allocatorsNew memory allocators do not have to be part of the SQLite source tree
nor included in the sqlite3.c amalgamation.  Individual applications can
supply their own memory allocators to SQLite at start-time.

To cause SQLite to use a new memory allocator, the application
simply calls:


sqlite3_config(SQLITE_CONFIG_MALLOC, pMem);


In the call above, pMem is a pointer to an sqlite3_mem_methods object
that defines the interface to the application-specific memory allocator.
The sqlite3_mem_methods object is really just a structure containing
pointers to functions to implement the various memory allocation primitives.


In a multi-threaded application, access to the sqlite3_mem_methods
is serialized if and only if SQLITE_CONFIG_MEMSTATUS is enabled.
If SQLITE_CONFIG_MEMSTATUS is disabled then the methods in
sqlite3_mem_methods must take care of their own serialization needs.malloc.html#application_defined_memory_allocators
*HV*Œ'—îi      S?—IDynamic Memory Allocation In SQLite3.3.1. Two-Size LookasideBeginning with SQLite version 3.31.0 (2020-01-22),
lookaside supports two memory pools, each with a different size
slot.  The small-slot pool uses 128-byte slots and the large-slot
pool uses whatever size is specified by SQLITE_DBCONFIG_LOOKASIDE
(defaulting to 1200 bytes).  Splitting the pool in two like this
allows memory allocations to be covered by lookaside more often
while at the same time reducing per-database-connection heap usage
from 120KB down to 48KB.


Configuration continues to use the SQLITE_DBCONFIG_LOOKASIDE or
SQLITE_CONFIG_LOOKASIDE configuration options, as described above,
with parameters "sz" and "cnt".  The total heap space used for
lookaside continues to be sz*cnt bytes.  But the space is allocated
between the small-slot lookaside and big-slot lookaside, with
preference given to small-slot lookaside.  The total number of
slots will usually exceed "cnt", since "sz" is typically much
larger than the small-slot size of 128 bytes.


The default lookaside configuration has changed from 100 slots
of 1200 bytes each (120KB) to be 40 slots of 1200 bytes each
(48KB).  This space ends up being allocated as 93 slots of
128 bytes each and 30 slots of 1200 bytes each.  So more lookaside
slots are available but much less heap space is used.


The default lookaside configuration, the size of the small-slots,
and the details of how heap space is allocated between small-slots
and big-slots, are all subject to change from one release to the
next.malloc.html#two_size_lookasideŸn—îh        SM¾[Dynamic Memory Allocation In SQLite3.3.  Lookaside memory allocatorSQLite database connections make many
small and short-lived memory allocations.
This occurs most commonly when compiling SQL statements using
sqlite3_prepare_v2() but also to a lesser extent when running
prepared statements using sqlite3_step().  These small memory
allocations are used to hold things such as the names of tables
and columns, parse tree nodes, individual query results values,
and B-Tree cursor o(3—îg      S;1IDynamic Memory Allocation In SQLite3.2.  Page cache memoryIn most applications, the database page cache subsystem within 
SQLite uses more dynamically allocated memory than all other parts
of SQLite combined.  It is not unusual to see the database page cache
consume over 10 times more memory than the rest of SQLite combined.

SQLite can be configured to make page cache memory allocations from
a separate and distinct memory pool of fixed-size
slots.  This can have two advantages:



Because allocations are all the same size, the memory allocator can
operate much faster.  The allocator need not bother with coalescing 
adjacent free slots or searching for a slot
of an appropriate size.  All unallocated memory slots can be stored on
a linked list.  Allocating consists of removing the first entry from the
list.  Deallocating is simply adding an entry to the beginning of the list.



With a single allocation size, the n parameter in the
Robson proof is 1, and the total memory space required by the allocator
(N) is exactly equal to maximum memory used (M).  
No additional memory is required to cover fragmentation overhead, thus 
reducing memory requirements.  This is particularly important for the
page cache memory since the page cache constitutes the largest component
of the memory needs of SQLite.



The page-cache memory allocator is disabled by default.
An application can enable it at start-time as follows:


sqlite3_config(SQLITE_CONFIG_PAGECACHE, pBuf, sz, N);


The pBuf parameter is a pointer to a contiguous range of bytes that
SQLite will use for page-cache memory allocations.  The buffer must be
at least sz*N bytes in size.  The "sz" parameter
is the size of each page-cache allocation.  N is the maximum 
number of available allocations.

If SQLite needs a page-cache entry that is larger than "sz" bytes or
if it needs more than N entries, it falls back to using the
general-purpose memory allocator.malloc.html#_page_cache_memorybjects.  There are consequently
many calls to malloc() and free() - so many calls that malloc() and
free() end up using a significant fraction of the CPU time assigned
to SQLite.

SQLite version 3.6.1 (2008-08-06)
introduced the lookaside memory allocator to
help reduce the memory allocation load.  In the lookaside allocator,
each database connection preallocates a single large chunk of memory
(typically in the range of 60 to 120 kilobytes) and divides that chunk
up into small fixed-size "slots" of around 100 to 1000 byte each.  This
becomes the lookaside memory pool.  Thereafter, memory allocations
associated with the database connection and that are not too large
are satisfied using one of the lookaside pool slots rather than by calling
the general-purpose memory allocator.  Larger allocations continue to
use the general-purpose memory allocator, as do allocations that occur
when the lookaside pool slots are all checked out.  
But in many cases, the memory
allocations are small enough and there are few enough outstanding that
the new memory requests can be satisfied from the lookaside
pool.

Because lookaside allocations are always the same size, the allocation
and deallocation algorithms are very quick.  There is no
need to coalesce adjacent free slots or search for a slot
of a particular size.  Each database connection maintains a singly-linked
list of unused slots.  Allocation requests simply pull the first
element of this list.  Deallocations simply push the element back onto
the front of the list.
Furthermore, each database connection is assumed to already be
running in a single thread (there are mutexes already in
place to enforce this) so no additional mutexing is required to 
serialize access to the lookaside slot freelist.
Consequently, lookaside memory
allocations and deallocations are very fast.  In speed tests on
Linux and Mac OS X workstations, SQLite has shown overall performance
improvements as high as 10% and 15%, depending on the workload how
and lookaside is configured.

The size of the lookaside memory pool has a global default value
but can also be configured on a connection-by-connection basis.
To change the default size of the lookaside memory pool at
compile-time, use the 
-DSQLITE_DEFAULT_LOOKASIDE=SZ,N
option.
To change the default size of the lookaside memory pool at
start-time, use the sqlite3_config() interface:


sqlite3_config(SQLITE_CONFIG_LOOKASIDE, sz, cnt);


The "sz" parameter is the size in bytes of each lookaside slot.
The "cnt" parameter is
the total number of lookaside memory slots per database connection.
The total amount
of lookaside memory allocated to each database connection is
sz*cnt bytes. 


The lookaside pool can be changed for an individual
database connection "db" using this call:


sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE, pBuf, sz, cnt);


The "pBuf" parameter is a pointer to memory space that will be
used for the lookaside memory pool.  If pBuf is NULL, then SQLite
will obtain its own space for the memory pool using sqlite3_malloc().
The "sz" and "cnt" parameters are the size of each lookaside slot
and the number of slots, respectively.  If pBuf is not NULL, then it
must point to at least sz*cnt bytes of memory.

The lookaside configuration can only be changed while there are
no outstanding lookaside allocations for the database connection.
Hence, the configuration should be set immediately after creating the 
database connection using sqlite3_open() (or equivalent) and before
evaluating any SQL statements on the connection.malloc.html#_lookaside_memory_allocator
m„mŠ—îk       SO’G]Dynamic Memory Allocation In SQLite3.5.  Setting memory usage limitsThe sqlite3_soft_heap_limit64() interface can be used to set an
upper bound on the total amount of outstanding memory that the
general-purpose memory allocator for SQLite will allow to be outstanding
at one time.  If attempts are made to allocate more memory than specified
by the soft heap limit, then SQLite will first attempt to free cache
memory before continuing with the allocation request.  The soft heap
limit mechanism only works if memory statistics are enabled and
it works best
if the SQLite library is compiled with the SQLITE_ENABLE_MEMORY_MANAGEMENT
compile-time option.

The soft heap limit is "soft" in this sense:  If SQLite is not able
to free up enough auxiliary memory to stay below the limit, it goes
ahead and allocates the extra memory and exceeds its limit.  This occurs
under the theory that it is better to use additional memory than to fail
outright.

As of SQLite version 3.6.1 (2008-08-06), 
the soft heap limit only applies to the
general-purpose memory allocator.  The soft heap limit does not know
about or interact with
the pagecache memory allocator or the lookaside memory allocator.
This deficiency will likely be addressed in a future release.malloc.html#_setting_memory_usage_limits’w—îj      S3¤IADynamic Memory Allocation In SQLite3.4.  Memory statusBy default, SQLite keeps statistics on its memory usage.  These
statistics are useful in helping to determine how much memory an
application really needs.  The statistics can also be used in
high-reliability system to determine
if the memory usage is coming close to or exceeding the limits 
of the Robson proof and hence that the memory allocation subsystem is 
liable to breakdown.

Most memory statistics are global, and therefore the tracking of
statistics must be serialized with a mutex.  Statistics are turned 
on by default, but an option exists to disable them.  By disabling 
memory statistics,
SQLite avoids entering and leaving a mutex on each memory allocation
and deallocation.  That savings can be noticeable on systems where
mutex operations are expensive.  To disable memory statistics, the
following interface is used at start-time:


sqlite3_config(SQLITE_CONFIG_MEMSTATUS, onoff);


The "onoff" parameter is true to enable the tracking of memory
statistics and false to disable statistics tracking.

Assuming statistics are enabled, the following routine can be used
to access them:


sqlite3_status(verb, &amp;current, &amp;highwater, resetflag);


The "verb" argument determines what statistic is accessed.
There are various verbs defined.  The
list is expected to grow as the sqlite3_status() interface matures.
The current value the selected parameter is written into integer 
"current" and the highest historical value
is written into integer "highwater".  If resetflag is true, then
the high-water mark is reset down to the current value after the call
returns.

A different interface is used to find statistics associated with a
single database connection:


sqlite3_db_status(db, verb, &amp;current, &amp;highwater, resetflag);


This interface is similar except that it takes a pointer to
a database connection as its first argument and returns statistics about
that one object rather than about the entire SQLite library.
The sqlite3_db_status() interface currently only recognizes a
single verb SQLITE_DBSTATUS_LOOKASIDE_USED, though additional verbs
may be added in the future.

The per-connection statistics do not use global variables and hence
do not require mutexes to update or access.  Consequently the
per-connection statistics continue to function even if
SQLITE_CONFIG_MEMSTATUS is turned off.malloc.html#_memory_status
11—J—îlS  ¬;Dynamic Memory Allocation In SQLite4.  Mathematical Guarantees Against Memory Allocation FailuresThe problem of dynamic memory allocation, and specifically the
problem of a memory allocator breakdown, has been studied by
J. M. Robson and the results published as:


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 us use the following notation (similar but not identical to
Robson's notation):



N

The amount of raw memory needed by the memory allocation system
in order to guarantee that no memory allocation will ever fail.

M

The maximum amount of memory that the application ever has checked out
at any point in time.

n

The ratio of the largest memory allocation to the smallest.  We assume
that every memory allocation size is an integer multiple of the smallest memory
allocation size.




Robson proves the following result:


N = M*(1 + (log2 n)/2) - n + 1


Colloquially, the Robson proof shows that in order to guarantee
breakdown-free operation, any memory allocator must use a memory pool
of size N which exceeds the maximum amount of memory ever
used M by a multiplier that depends on n, 
the ratio of the largest to the smallest allocation size.  In other
words, unless all memory allocations are of exactly the same size
(n=1) then the system needs access to more memory than it will
ever use at one time.  Furthermore, we see that the amount of surplus
memory required grows rapidly as the ratio of largest to smallest
allocations increases, and so there is strong incentive to keep all
allocations as near to the same size as possible.

Robson's proof is constructive. 
He provides an algorithm for computing a sequence of allocation
and deallocation operations that will lead to an allocation failure due to
memory fragmentation if available memory is as much as one byte
less than N.
And, Robson shows that a power-of-two first-fit memory allocator
(such as implemented by memsys5) will never fail a memory allocation
provided that available memory is N or more bytes.

The values M and n are properties of the application.
If an application is constructed in such a way that both M and
n are known, or at least have known upper bounds, and if the
application uses
the memsys5 memory allocator and is provided with N bytes of
available memory space using SQLITE_CONFIG_HEAP
then Robson proves that no memory allocation request will ever fail
within the application.
To put this another way, the application developer can select a value
for N that will guarantee that no call to any SQLite interface
will ever return SQLITE_NOMEM.  The memory pool will never become
so fragmented that a new memory allocation request cannot be satisfied.
This is an important property for
applications where a software fault could cause injury, physical harm, or
loss of irreplaceable data.malloc.html#_mathematical_guarantees_against_memory_allocation_failuresed.  In the common case, the application will only
have a single database connection and so the lookaside memory pool
can consist of a single large buffer.


sqlite3_db_config(db, SQLITE_DBCONFIG_LOOKASIDE, aStatic, 256, 500);


The lookaside memory allocator is really intended as performance
optimization, not as a method for assuring breakdown-free memory allocation,
so it is not unreasonable to completely disable the lookaside memory
allocator for safety-critical operations.

The general purpose memory allocator is the most difficult memory pool
to manage because it supports allocations of varying sizes.  Since 
n is a multiplier on M we want to keep n as small
as possible.  This argues for keeping the minimum allocation size for
memsys5 as large as possible.  In most applications, the
lookaside memory allocator is able to handle small allocations.  So
it is reasonable to set the minimum allocation size for memsys5 to
2, 4 or even 8 times the maximum size of a lookaside allocation.  
A minimum allocation size of 512 is a reasonable setting.

Further to keeping n small, one desires to keep the size of
the largest memory allocations under control.
Large requests to the general-purpose memory allocator
might come from several sources:


SQL table rows that contain large strings or BLOBs.
Complex SQL queries that compile down to large prepared statements.
SQL parser objects used internally by sqlite3_prepare_v2().
Storage space for database connection objects.
Page cache memory allocations that overflow into the general-purpose
    memory allocator.
Lookaside buffer allocations for new database connections.


The last two allocations can be controlled and/or eliminated by
configuring the pagecache memory allocator,
and lookaside memory allocator appropriately, as described above.
The storage space required for database connection objects depends
to some extent on the length of the filename of the database file, but
rarely exceeds 2KB on 32-bit systems.  (More space is required on
64-bit systems due to the increased size of pointers.)
Each parser object uses about 1.6KB of memory.  Thus, elements 3 through 6
above can easily be controlled to keep the maximum memory allocation
size below 2KB.

If the application is designed to manage data in small pieces,
then the database should never contain any large strings or BLOBs
and hence element 1 above should not be a factor.  If the database
does contain large strings or BLOBs, they should be read using
incremental BLOB I/O and rows that contain the
large strings or BLOBs should never be update by any means other
than incremental BLOB I/O.  Otherwise, the 
sqlite3_step() routine will need to read the entire row into
contiguous memory at some point, and that will involve at least
one large memory allocation.

The final source of large memory allocations is the space to hold
the prepared statements that result from compiling complex SQL
operations.  Ongoing work by the SQLite developers is reducing the
amount of space required here.  But large and complex queries might
still require prepared statements that are several kilobytes in
size.  The only workaround at the moment is for the application to
break complex SQL operations up into two or more smaller and simpler 
operations contained in separate prepared statements.

All things considered, applications should normally be able to
hold their maximum memory allocation size below 2K or 4K.  This
gives a value for log2(n) of 2 or 3.  This will
limit N to between 2 and 2.5 times M.

The maximum amount of general-purpose memory needed by the application
is determined by such factors as how many simultaneous open 
database connection and prepared statement objects the application
uses, and on the complexity of the prepared statements.  For any
given application, these factors are normally fixed and can be
determined experimentally using SQLITE_STATUS_MEMORY_USED.
A typical application might only use about 40KB of general-purpose
memory.  This gives a value of N of around 100KB.malloc.html#_computing_and_controlling_parameters_m_and_n
³¿³‚I—îo       SQƒ-cDynamic Memory Allocation In SQLite5.  Stability Of Memory InterfacesUpdate: As of SQLite version 3.7.0 (2010-07-21), 
all of SQLite memory allocation interfaces
are considered stable and will be supported in future releases.
This page last modified on  2022-01-28 19:28:24 UTCmalloc.html#_stability_of_memory_interfaces‹9—în     S7•EEDynamic Memory Allocation In SQLite4.2.  Ductile failureIf the memory allocation subsystems within SQLite are configured
for breakdown-free operation but the actual memory usage exceeds
design limits set by the Robson proof, SQLite will usually continue 
to operate normally.
The pagecache memory allocator
and the lookaside memory allocator automatically failover
to the memsys5 general-purpose memory allocator.  And it is usually the
case that the memsys5 memory allocator will continue to function
without fragmentation even if M and/or n exceeds the limits
imposed by the Robson proof.  The Robson proof shows that it is 
possible for a memory allocation to break down and fail in this 
circumstance, but such a failure requires an especially
despicable sequence of allocations and deallocations - a sequence that
SQLite has never been observed to follow.  So in practice it is usually
the case that the limits imposed by Robson can be exceeded by a
considerable margin with no ill effect.

Nevertheless, application developers are admonished to monitor
the state of the memory allocation subsystems and raise alarms when
memory usage approaches or exceeds Robson limits.  In this way,
the application will provide operators with abundant warning well
in advance of failure.
The memory statistics interfaces of SQLite provide the application with
all the mechanism necessary to complete the monitoring portion of
this task.malloc.html#_ductile_failure®4—îm     SqÚGDynamic Memory Allocation In SQLite4.1.  Computing and controlling parameters M and nThe Robson proof applies separately to each of the memory allocators
used by SQLite:


The general-purpose memory allocator (memsys5).
The pagecache memory allocator.
The lookaside memory allocator.


For allocators other than memsys5,
all memory allocations are of the same size.  Hence, n=1
and therefore N=M.  In other words, the memory pool need
be no larger than the largest amount of memory in use at any given moment.

The usage of pagecache memory is somewhat harder to control in
SQLite version 3.6.1, though mechanisms are planned for subsequent
releases that will make controlling pagecache memory much easier.
Prior to the introduction of these new mechanisms, the only way
to control pagecache memory is using the cache_size pragma.

Safety-critical applications will usually want to modify the
default lookaside memory configuration so that when the initial
lookaside memory buffer is allocated during sqlite3_open() the
resulting memory allocation is not so large as to force the n
parameter to be too large.  In order to keep n under control,
it is best to try to keep the largest memory allocation below 2 or 4
kilobytes.  Hence, a reasonable default setup for the lookaside
memory allocator might any one of the following:


sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 32, 32);  /* 1K */
sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 64, 32);  /* 2K */
sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 32, 64);  /* 2K */
sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 64, 64);  /* 4K */


Another approach is to initially disable the lookaside memory
allocator:


sqlite3_config(SQLITE_CONFIG_LOOKASIDE, 0, 0);


Then let the application maintain a separate pool of larger
lookaside memory buffers that it can distribute to database connections
as they are creat+
È   E@ˆ…w—þ+ 5/ŠgEDatabase File Format1.1. Hot JournalsIf the application or
host computer crashes before the transaction completes, then the rollback
journal or write-ahead log contains information needed 
to restore the main database file to a consistent state.  When a rollback 
journal or write-ahead log contains information necessary for recovering 
the state of the database, they are called a "hot journal" or "hot WAL file".
Hot journals and WAL files are only a factor during error recovery
scenarios and so are uncommon, but they are part of the state of an SQLite
database and so cannot be ignored.  This document defines the format
of a rollback journal and the write-ahead log file, but the focus is
on the main database file.fileformat.html#hot_journals‚k—þ*     55„?ODatabase File Format1. The Database FileThe complete state of an SQLite database is usually
contained in a single file on disk called the "main database file".

During a transaction, SQLite stores additional information 
in a second file called the "rollback journal", or if SQLite is in
WAL mode, a write-ahead log file.fileformat.html#the_database_file3—þ) 5
‚-Database File FormatThis document describes and defines the on-disk database file
format used by all releases of SQLite since 
version 3.0.0 (2004-06-18).fileformat.html#„—öC        I#‡5The dbhash.exe Utility Program3. BuildingTo build a copy of the dbhash utility program on unix, get a copy of the
canonical SQLite source code and enter:

./configure
make dbhash


On Windows, enter:

nmake /f makefile.msc dbhash.exe


The dbhash program is implemented by a single file of C-code
called dbhash.c.
To build the dbhash program manually, simply compile the dbhash.c source file
and link it against the SQLite library.
This page last modified on  2016-07-13 13:57:06 UTCdbhash.html#building„~—öB    I‰  /The dbhash.exe Utility Program2. UsageDbhash is a command-line utility.
To run it, type "dbhash" on a command-line prompt followed by the names of
one or more SQLite database files that are to be hashed.
The database hashes will be displayed on standard output.
For example:

drh@bella:~/sqlite/bld$ dbhash ~/Fossils/sqlite.fossil
8d3da9ff87196312aaa33076627ccb7943ef79e3 /home/drh/Fossils/sqlite.fossil


Dbhash supports command-line options that can restrict the tables of the
database file that are hashed, or restrict the hash to only content or only
the schema.  Run "dbhash --help" for further information.dbhash.html#usageˆ3—öA I#g5The dbhash.exe Utility Program1. OverviewThe dbhash (or dbhash.exe on Windows) utility is a
command-line program that computes the SHA1 hash of the schema and content 
for an SQLite database.

Dbhash ignores extraneous formatting details and hashes only the database
schema and content.  Hence the hash is constant even if the database file
is modified by:


 VACUUM
 PRAGMA page_size
 PRAGMA journal_mode
 REINDEX
 ANALYZE
 copied via the backup API
 ... and so forth


The operations above can potentially cause vast changes the raw database file,
and hence cause very different SHA1 hashes at the file level.
But since the content represented in the database file is unchanged by these
operations, the hash computed by dbhash is also unchanged.

Dbhash can be used to compare two databases to confirm that they
are equivalent, even though their representation on disk is quite different.
Dbhash might also be used to verify the content of a remote database without having
to transmit the entire content of the remote database over a slow link.dbhash.html#overview
l—þ-        5=š5SDatabase File Format1.3. The Database HeaderThe first 100 bytes of the database file comprise the database file 
header.  The database file header is divided into fields as shown by
the table below.  All multibyte fields in the database file header are
stored with the most significant byte first (big-endian).


Database Header Format

OffsetSizeDescription
016
The header string: "SQLite format 3\000"
162
The database page size in bytes.  Must be a power of two between 512
and 32768 inclusive, or the value 1 representing a page size of 65536.
181
File format write version.  1 for legacy; 2 for WAL.
191
File format read version.  1 for legacy; 2 for WAL.
201
Bytes of unused "reserved" space at the end of each page.  Usually 0.
211
Maximum embedded payload fraction.  Must be 64.
221
Minimum embedded payload fraction.  Must be 32.
231
Leaf payload fraction.  Must be 32.
244
File change counter.
284
Size of the database file in pages.  The "in-header database size".
324
Page number of the first freelist trunk page.
364
Total number of freelist pages.
404
The schema cookie.
444
The schema format number.  Supported schema formats are 1, 2, 3, and 4.
484
Default page cache size.
524
The page number of the largest root b-tree page when in auto-vacuum or
incremental-vacuum modes, or zero otherwise.
564
The database text encoding.  A value of 1 means UTF-8.  A value of 2
means UTF-16le.  A value of 3 means UTF-16be.
604
The "user version" as read and set by the user_version pragma.
644
True (non-zero) for incremental-vacuum mode.  False (zero) otherwise.
684
The "Application ID" set by PRAGMA application_id.
7220
Reserved for expansion.  Must be zero.
924
The version-valid-for number.
964
SQLITE_VERSION_NUMBERfileformat.html#the_database_headerz—þ,   5!¡  7Database File Format1.2. PagesThe main database file consists of one or more pages.  The size of a
page is a power of two between 512 and 65536 inclusive.  All pages within
the same database are the same size.  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.

Pages are numbered beginning with 1.  The maximum page number is
4294967294 (232 - 2).  The minimum size
SQLite database is a single 512-byte page.
The maximum size database would be 2147483646 pages at 65536 bytes per
page or 281,474,976,579,584 bytes (about 281 terabytes).  Usually SQLite will
hit the maximum file size limit of the underlying filesystem or disk
hardware long before it hits its own internal size limit.

In common use, SQLite databases tend to range in size from a few kilobytes
to a few gigabytes, though terabyte-size SQLite databases are known to exist
in production.

At any point in time, every page in the main database has a single
use which is one of the following:

The lock-byte page
A freelist page

A freelist trunk page
A freelist leaf page

A b-tree page

A table b-tree interior page
A table b-tree leaf page
An index b-tree interior page
An index b-tree leaf page

A payload overflow page
A pointer map page



All reads from and writes to the main database file begin at a page
boundary and all writes are an integer number of pages in size.  Reads
are also usually an integer number of pages in size, with the one exception
that when the database is first opened, the first 100 bytes of the
database file (the database file header) are read as a sub-page size unit.

Before any information-bearing page of the database is modified, 
the original unmodified content of that page is written into the 
rollback journal.  If a transaction is interrupted and needs to be 
rolled back, the rollback journal can then be used to restore the
database to its original state.  Freelist leaf pages bear no
information that would need to be restored on a rollback and so they
are not written to the journal prior to modification, in order to
reduce disk I/O.fileformat.html#pages
±©u¬±ƒv—þ2      5=†MODatabase File Format1.3.5. Payload fractionsThe maximum and minimum embedded payload fractions and the leaf
payload fraction values must be 64, 32, and 32.  These values were
originally intended to be tunable parameters that could be used to
modify the storage format of the b-tree algorithm.  However, that
functionality is not supported and there are no current plans to add
support in the future.  Hence, these three bytes are fixed at the
values specified.fileformat.html#payload_fractions‡D—þ1 5IQ[Database File Format1.3.4. Reserved bytes per pageSQLite has the ability to set aside a small number of extra bytes at
the end of every page for use by extensions.  These extra bytes are
used, for example, by the SQLite Encryption Extension to store a nonce
and/or cryptographic checksum associated with each page.  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.
This value is usually 0.  The value can be odd.



The "usable size" of a database page is the page size specified by the
2-byte integer at offset 16 in the header less the "reserved" space size
recorded in the 1-byte integer at offset 20 in the header.  The usable
size of a page might be an odd number.  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.fileformat.html#reserved_bytes_per_page…a—þ0      5Q‰{cDatabase File Format1.3.3. File format version numbersThe file format write version and file format read version at offsets
18 and 19 are intended to allow for enhancements of the file format
in future versions of SQLite.  In current versions of SQLite, both of
these values are 1 for rollback journalling modes and 2 for WAL
journalling mode.  If a version of SQLite coded to the current
file format specification encounters a database file where the read
version is 1 or 2 but the write version is greater than 2, then the database
file must be treated as read-only.  If a database file with a read version
greater than 2 is encountered, then that database cannot be read or written.fileformat.html#file_format_version_numbers†I—þ/    5-Œ?Database File Format1.3.2. Page SizeThe two-byte value beginning at offset 16 determines the page size of 
the database.  For SQLite versions 3.7.0.1 (2010-08-04)
and earlier, this value is 
interpreted as a big-endian integer and must be a power of two between
512 and 32768, inclusive.  Beginning with SQLite version 3.7.1
(2010-08-23), a page
size of 65536 bytes is supported.  The value 65536 will not fit in a
two-byte integer, so to specify a 65536-byte page size, the value
at offset 16 is 0x00 0x01.
This value can be interpreted as a big-endian
1 and thought of as a magic number to represent the 65536 page size.
Or one can view the two-byte field as a little endian number and say
that it represents the page size divided by 256.  These two 
interpretations of the page-size field are equivalent.fileformat.html#page_size‚R—þ.    5Aƒ}SDatabase File Format1.3.1. Magic Header StringEvery 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.  This byte sequence
corresponds to the UTF-8 string "SQLite format 3" including the nul
terminator character at the end.fileformat.html#magic_header_string
hëSÝh„p—þ6       55ˆQGDatabase File Format1.3.9. Schema cookieThe schema cookie is a 4-byte big-endian integer at offset 40
that is incremented whenever the database schema changes.  A 
prepared statement is compiled against a specific version of the
database schema.  When the database schema changes, the statement
must be reprepared.  When a prepared statement runs, it first checks
the schema cookie to ensure the value is the same as when the statement
was prepared and if the schema cookie has changed, the statement either
automatically reprepares and reruns or it aborts with an SQLITE_SCHEMA 
error.fileformat.html#schema_cookie‚q—þ5        57„OIDatabase File Format1.3.8. Free page listUnused pages in the database file are stored on a freelist.  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.
The 4-byte big-endian integer at offset 36 stores the total 
number of pages on the freelist.fileformat.html#free_page_list‹—þ4     5I”o[Database File Format1.3.7. In-header database sizeThe 4-byte big-endian integer at offset 28 into the header 
stores the size of the database file in pages.  If this in-header
datasize size is not valid (see the next paragraph), then the database 
size is computed by looking
at the actual size of the database file. Older versions of SQLite
ignored the in-header database size and used the actual file size
exclusively.  Newer versions of SQLite use the in-header database
size if it is available but fall back to the actual file size if
the in-header database size is not valid.

The in-header database size is only considered to be valid if
it is non-zero and if the 4-byte change counter at offset 24
exactly matches the 4-byte version-valid-for number at offset 92.
The in-header database size is always valid 
when the database is only modified using recent versions of SQLite,
versions 3.7.0 (2010-07-21) and later.
If a legacy version of SQLite writes to the database, it will not
know to update the in-header database size and so the in-header
database size could be incorrect.  But legacy versions of SQLite
will also leave the version-valid-for number at offset 92 unchanged
so it will not match the change-counter.  Hence, invalid in-header
database sizes can be detected (and ignored) by observing when
the change-counter does not match the version-valid-for number.fileformat.html#in_header_database_size†—þ3     5AŠySDatabase File Format1.3.6. File change counterThe file change counter is a 4-byte big-endian integer at
offset 24 that is incremented whenever the database file is unlocked
after having been modified.
When two or more processes are reading the same database file, each 
process can detect database changes from other processes by monitoring 
the change counter.
A process will normally want to flush its database page cache when
another process modified the database, since the cache has become stale.
The file change counter facilitates this.

In WAL mode, changes to the database are detected using the wal-index
and so the change counter is not needed.  Hence, the change counter might
not be incremented on each transaction in WAL mode.fileformat.html#file_change_counter
>  U):>w—þ;       5C‚ESDatabase File Format1.3.14. User version numberThe 4-byte big-endian integer at offset 60 is the user version which
is set and queried by the user_version pragma.  The user version is
not used by SQLite.fileformat.html#user_version_numberƒj—þ:     57†CGDatabase File Format1.3.13. Text encodingThe 4-byte big-endian integer at offset 56 determines the encoding
used for all text strings stored in the database.  
A value of 1 means UTF-8.
A value of 2 means UTF-16le.
A value of 3 means UTF-16be.
No other values are allowed.
The sqlite3.h header file defines C-preprocessor macros SQLITE_UTF8 as 1,
SQLITE_UTF16LE as 2, and SQLITE_UTF16BE as 3, to use in place of
the numeric codes for the text encoding.fileformat.html#text_encoding†'—þ9      5S‹cDatabase File Format1.3.12. Incremental vacuum settingsThe two 4-byte big-endian integers at offsets 52 and 64 are used
to manage the auto_vacuum and incremental_vacuum modes.  If
the integer at offset 52 is zero then pointer-map (ptrmap) pages are
omitted from the database file and neither auto_vacuum nor
incremental_vacuum are supported.  If the integer at offset 52 is
non-zero then it is the page number of the largest root page in the
database file, the database file will contain ptrmap pages, and the
mode must be either auto_vacuum or incremental_vacuum.  In this latter
case, the integer at offset 64 is true for incremental_vacuum and
false for auto_vacuum.  If the integer at offset 52 is zero then
the integer at offset 64 must also be zero.fileformat.html#incremental_vacuum_settingsƒ%—þ8     5E…UDatabase File Format1.3.11. Suggested cache sizeThe 4-byte big-endian signed integer at offset 48 is the suggested
cache size in pages for the database file.  The value is a suggestion
only and SQLite is under no obligation to honor it.  The absolute value
of the integer is used as the suggested size.  The suggested cache size
can be set using the default_cache_size pragma.fileformat.html#suggested_cache_size‹|—þ7        5E–KUDatabase File Format1.3.10. Schema format numberThe schema format number is a 4-byte big-endian integer at offset 44.
The schema format number is similar to the file format read and write
version numbers at offsets 18 and 19 except that the schema format number
refers to the high-level SQL formatting rather than the low-level b-tree
formatting.  Four schema format numbers are currently defined:


Format 1 is understood by all versions of SQLite back to
version 3.0.0 (2004-06-18).
Format 2 adds the ability of rows within the same table
to have a varying number of columns, in order to support the
ALTER TABLE ... ADD COLUMN functionality.  Support for
reading and writing format 2 was added in SQLite 
version 3.1.3 on 2005-02-20.
Format 3 adds the ability of extra columns added by
ALTER TABLE ... ADD COLUMN to have non-NULL default
values.  This capability was added in SQLite version 3.1.4
on 2005-03-11.
Format 4 causes SQLite to respect the
DESC keyword on
index declarations.  (The DESC keyword is ignored in indexes for 
formats 1, 2, and 3.)
Format 4 also adds two new boolean record type values (serial types
8 and 9).  Support for format 4 was added in SQLite 3.3.0 on
2006-01-10.


New database files created by SQLite use format 4 by default.
The legacy_file_format pragma can be used to cause SQLite
to create new database files using format 1.
The format version number can be made to default to 1 instead of 4 by
setting SQLITE_DEFAULT_FILE_FORMAT=1 at compile-time.fileformat.html#schema_format_number
ï
|5
OïŠ[—þ?       5;”QDatabase File Format1.4. The Lock-Byte PageThe lock-byte page is the single page of the database file
that contains the bytes at offsets between 1073741824 and 1073742335,
inclusive.  A database file that is less than or equal to 1073741824 bytes 
in size contains no lock-byte page.  A database file larger than
1073741824 contains exactly one lock-byte page.


The lock-byte page is set aside for use by the operating-system specific
VFS implementation in implementing the database file locking primitives.
SQLite does not use the lock-byte page.  The SQLite core 
will never read or write the lock-byte page,
though operating-system specific VFS 
implementations may choose to read or write bytes on the lock-byte 
page according to the 
needs and proclivities of the underlying system.  The unix and win32
VFS implementations that come built into SQLite do not write to the
lock-byte page, but third-party VFS implementations for
other operating systems might.

The lock-byte page arose from the need to support Win95 which was the
predominant operating system when this file format was designed and which 
only supported mandatory file locking.  All modern operating systems that
we know of support advisory file locking, and so the lock-byte page is
not really needed any more, but is retained for backwards compatibility.fileformat.html#the_lock_byte_pagea—þ> 5cYsDatabase File Format1.3.17. Header space reserved for expansionAll other bytes of the database file header are reserved for
future expansion and must be set to zero.fileformat.html#header_space_reserved_for_expansion„B—þ=5†?Database File Format1.3.16. Write library version number and version-valid-for numberThe 4-byte big-endian integer at offset 96 stores the 
SQLITE_VERSION_NUMBER value for the SQLite library that most
recently modified the database file.  The 4-byte big-endian integer at
offset 92 is the value of the change counter when the version number
was stored.  The integer at offset 92 indicates which transaction
the version number is valid for and is sometimes called the
"version-valid-for number".fileformat.html#write_library_version_number_and_version_valid_for_number„—þ<       59ˆiIDatabase File Format1.3.15. Application IDThe 4-byte big-endian integer at offset 68 is an "Application ID" that
can be set by the PRAGMA application_id command in order to identify the
database as belonging to or associated with a particular application.
The application ID is intended for database files used as an
application file-format.  The application ID can be used by utilities 
such as file(1) to determine the specific
file type rather than just reporting "SQLite3 Database".  A list of
assigned application IDs can be seen by consulting the
magic.txt
file in the SQLite source repository.fileformat.html#application_id
ææ—þ@      5/Ÿ#EDatabase File Format1.5. The FreelistA database file might contain one or more pages that are not in
active use.  Unused pages can come about, for example, when information
is deleted from the database.  Unused pages are stored on the freelist
and are reused when additional pages are required.

The freelist is organized as a linked list of freelist trunk pages
with each trunk page containing page numbers for zero or more freelist
leaf pages.

A freelist trunk page consists of an array of 4-byte big-endian integers.
The size of the array is as many integers as will fit in the usable space
of a page.  The minimum usable space is 480 bytes so the array will always
be at least 120 entries in length.  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.  The second integer on a freelist
trunk page is the number of leaf page pointers to follow.  
Call the second integer on a freelist trunk page L.
If L is greater than zero then integers with array indexes between 2 and
L+1 inclusive contain page numbers for freelist leaf pages.

Freelist leaf pages contain no information.  SQLite avoids reading or
writing freelist leaf pages in order to reduce disk I/O.

A bug in SQLite versions prior to 3.6.0 (2008-07-16)
caused the database to be
reported as corrupt if any of the last 6 entries in the freelist trunk page 
array contained non-zero values.  Newer versions of SQLite do not have
this problem.  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.

The number of freelist pages is stored as a 4-byte big-endian integer
in the database header at an offset of 36 from the beginning of the file.
The database header also stores the page number of the first freelist trunk
page as a 4-byte big-endian integer at an offset of 32 from the beginning
of the file.fileformat.html#the_freelist5ge is either a table b-tree page or an index b-tree page.
All pages within each complete b-tree are of the same type: either table
or index.  There is one table b-trees in the database file
for each rowid table in the database schema, including system tables
such as sqlite_schema.  There is one index b-tree
in the database file for each index in the schema, including implied indexes
created by uniqueness constraints.  There are no b-trees associated with
virtual tables.  Specific virtual table implementations might make use
of shadow tables for storage, but those shadow tables will have separate
entries in the database schema.  WITHOUT ROWID tables use index b-trees
rather than a table b-trees, so there is one
index b-tree in the database file for each WITHOUT ROWID table.
The b-tree corresponding to the sqlite_schema table is always a table
b-tree and always has a root page of 1.
The sqlite_schema table contains the root page number for every other 
table and index in the database file.

Each entry in a table b-tree consists of a 64-bit signed integer key
and up to 2147483647 bytes of arbitrary data.  (The key of a table b-tree
corresponds to the rowid of the SQL table that the b-tree implements.)
Interior table b-trees hold only keys and pointers to children.
All data is contained in the table b-tree leaves.

Each entry in an index b-tree consists of an arbitrary key of up
to 2147483647 bytes in length and no data.



Define the "payload" of a cell to be the arbitrary length section
of the cell.  For an index b-tree, the key is always arbitrary in length
and hence the payload is the key.  There are no arbitrary length elements
in the cells of interior table b-tree pages and so those cells have no
payload.  Table b-tree leaf pages contain arbitrary length content and
so for cells on those pages the payload is the content.
When the size of payload for a cell exceeds a certain threshold (to
be defined later) then only the first few bytes of the payload
are stored on the b-tree page and the balance is stored in a linked list
of content overflow pages.

A b-tree page is divided into regions in the following order:


The 100-byte database file header (found on page 1 only)
The 8 or 12 byte b-tree page header
The cell pointer array
Unallocated space
The cell content area
The reserved region.



The 100-byte database file header is found only on page 1, which is
always a table b-tree page.  All other b-tree pages in the database file
omit this 100-byte header.

The reserved region is an area of unused space at the end of every
page (except the locking page) that extensions can use to hold per-page
information.  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.
The size of the reserved region is usually zero.

The b-tree page header is 8 bytes in size for leaf pages and 12
bytes for interior pages.  All multibyte values in the page header
are big-endian.
The b-tree page header is composed of the following fields:


B-tree Page Header Format

OffsetSizeDescription
01
The one-byte flag at offset 0 indicating the b-tree page type.
A value of 2 (0x02) means the page is an interior index b-tree page.
A value of 5 (0x05) means the page is an interior table b-tree page.
A value of 10 (0x0a) means the page is a leaf index b-tree page.
A value of 13 (0x0d) means the page is a leaf table b-tree page.
Any other value for the b-tree page type is an error.
12
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.
32
The two-byte integer at offset 3 gives the number of cells on the page.
52
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.
71
The one-byte integer at offset 7 gives the number of fragmented free
bytes within the cell content area.
84
The four-byte page number at offset 8 is the right-most pointer.  This
value appears in the header of interior b-tree pages only and is omitted from
all oth6er pages.


The cell pointer array of a b-tree page immediately follows the b-tree
page header.  Let K be the number of cells on the btree.  The cell pointer
array consists of K 2-byte integer offsets to the cell contents.  The
cell pointers are arranged in key order with left-most cell (the cell with the
smallest key) first and the right-most cell (the cell with the largest
key) last.

Cell content is stored in the cell content region of the b-tree page.
SQLite strives to place cells as far toward the end of the b-tree page as
it can, in order to leave space for future growth of the cell pointer array.
The area in between the last cell pointer array entry and the beginning of
the first cell is the unallocated region.


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.
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.

A freeblock is a structure used to identify unallocated space within
a b-tree page.  Freeblocks are organized as a chain.  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.  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.  Freeblocks are always connected in order 
of increasing offset.  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.  In a well-formed b-tree page, there will always be at least one cell
before the first freeblock.

A freeblock requires at least 4 bytes of space.  If there is an isolated
group of 1, 2, or 3 unused bytes within the cell content area, those bytes
comprise a fragment.  The total number of bytes in all fragments is stored
in the fifth field of the b-tree page header.  In a well-formed b-tree page,
the total number of bytes in fragments may not exceed 60.

The total amount of free space on a b-tree page consists of the size
of the unallocated region plus the total size of all freeblocks plus the
number of fragmented free bytes.  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.  This is called 
"defragmenting" the b-tree page.




A variable-length integer or "varint" is a static Huffman encoding
of 64-bit twos-complement integers that uses less space for small positive 
values. 
A varint is between 1 and 9 bytes in length.  The varint consists of either
zero or more bytes which have the high-order bit set followed by a single byte
with the high-order bit clear, or nine bytes, whichever is shorter.
The lower seven bits of each of the first eight bytes and all 8 bits of
the ninth byte are used to reconstruct the 64-bit twos-complement integer.
Varints are big-endian: bits taken from the earlier byte of the varint
are more significant than bits taken from the later bytes. 

The format of a cell depends on which kind of b-tree page the cell
appears on.  The following table shows the elements of a cell, in
order of appearance, for the various b-tree page types.


Table B-Tree Leaf Cell (header 0x0d):

A varint which is the total number of bytes of payload, including any
overflow
A varint which is the integer key, a.k.a. "rowid"
The initial portion of the payload that does not spill to overflow
pages.
A 4-byte big-endian integer page number for the first page of the
overflow page list - omitted if all payload fits on the b-tree page.


Table B-Tree Interior Cell (header 0x05):

A 4-byte big-endian page number which is the left child pointer.
A varint which is the integer key


Index B-Tree Leaf Cell (header 0x0a):

A varint which is the total number of bytes of key payload, including any
overflow
The initial portion of the payload that does not spill to overflow
pages.
A 4-byte big-endian integer page number for the first page of the
overflow page list - omitted if all payload fits on the b-tree page.


Index B-Tree Interior Cell (header 0x02):

A 4-byte big-endian page number which is the left child pointer.
A varint which is the total number of bytes of key payload, including any
overflow
The initial portion of the payload that does not spill to overflow
pages.
A 4-byte big-endian integer page number for the first page of the
overflow page list - omitted if all payload fits on the b-tree page.



The information above can be recast into a table format as follows:




B-tree Cell Format

Datatype
    Appears in...
    Description
Table Leaf (0x0d)
    Table Interior (0x05)
    Index Leaf (0x0a)
    Index Interior (0x02)
4-byte integer
    &nbsp;
    &#x2714;
    &nbsp;
    &#x2714;
    Page number of left child
varint
    &#x2714;
    &nbsp;
    &#x2714;
    &#x2714;
    Number of bytes of payload
varint
    &#x2714;
    &#x2714;
    &nbsp;
    &nbsp;
    Rowid
byte array
    &#x2714;
    &nbsp;
    &#x2714;
    &#x2714;
    Payload
4-byte integer
    &#x2714;
    &nbsp;
    &#x2714;
    &#x2714;
    Page number of first overflow page



The amount of payload that spills onto overflow pages also depends on
the page type.  For the following computations, let U be the usable size
of a database page, the total page size less the reserved space at the
end of each page.  And let P be the payload size.  In the following,
symbol X represents the maximum amount of payload that can be stored directly
on the b-tree page without spilling onto an overflow page and symbol M
represents the minimum amount of payload that must be stored on the btree
page before spilling is allowed.


Table B-Tree Leaf Cell:

Let X be U-35.  If the payload size P is less than or equal to X then
the entire payload is stored on the b-tree leaf page.
Let M be ((U-12)*32/255)-23 and let K be M+((P-M)%(U-4)).
If P is greater than X
then the number of bytes stored on the table b-tree leaf page is K
if K is less or equal to X or M otherwise.
The number of bytes stored on the leaf page is never less than M.


Table B-Tree Interior Cell:

Interior pages of table b-trees have no payload and so there is never
any payload to spill.


Index B-Tree Leaf Or Interior Cell:

Let X be ((U-12)*64/255)-23.  If the payload size P is less than
or equal to X then the entire payload is stored on the b-tree page.
Let M be ((U-12)*32/255)-23 and let K be M+((P-M)%(U-4)).
If P is greater than X then the number
of bytes stored on the index b-tree page is K if K is less than or
equal to X or M otherwise.
The number of bytes stored on the index page is never less than M.



Here is an alternative description of the same computation:


X is U-35 for table btree leaf pages or
    ((U-12)*64/255)-23 for index pages.
M is always ((U-12)*32/255)-23.
Let K be M+((P-M)%(U-4)).
If P&lt;=X then all P bytes of payload are stored directly on the 
    btree page without overflow.
If P&gt;X and K&lt;=X then the first K bytes of P are stored on the 
    btree page and the remaining P-K bytes are stored on overflow pages.
If P&gt;X and K&gt;X then the first M bytes of P are stored on the
    btree page and the remaining P-M bytes are stored on overflow pages.


The overflow thresholds are designed to give a minimum fanout of
4 for index b-trees and to make sure enough of the payload
is on the b-tree page that the record header can usually be accessed
without consulting an overflow page.  In hindsight, the designer of
the SQLite b-tree logic realized that these thresholds could have been
made much simpler.  However, the computations cannot be changed
without resulting in an incompatible file format.  And the current computations
work well, even if they are a little complex.fileformat.html#b_tree_pages
zpzƒq—þB        5M†cDatabase File Format1.7. Cell Payload Overflow PagesWhen the payload of a b-tree cell is too large for the b-tree page,
the surplus is spilled onto overflow pages.  Overflow pages form a linked
list.  The first four bytes of each overflow page are a big-endian
integer which is the page number of the next page in the chain, or zero
for the final page in the chain.  The fifth byte through the last usable
byte are used to hold overflow content.fileformat.html#cell_payload_overflow_pagesú{—þA
5/ômEDatabase File Format1.6. B-tree PagesThe b-tree algorithm provides key/data storage with unique and
ordered keys on page-oriented storage devices.
For background information on b-trees, see
Knuth, The Art Of Computer Programming, Volume 3 "Sorting
and Searching", pages 471-479.  Two variants of b-trees are used by
SQLite.  "Table b-trees" use a 64-bit signed integer key and store
all data in the leaves.  "Index b-trees" use arbitrary keys and store no
data at all.

A b-tree page is either an interior page or a leaf page.
A leaf page contains keys and in the case of a table b-tree each
key has associated data.  An interior page contains
K keys together with K+1 pointers to child b-tree pages.
A "pointer" in an interior b-tree page is just the 32-bit 
unsigned integer page number of the child page.

The number of keys on an interior b-tree page, K,
is almost always at least 2 and is usually much more than 2.
The only exception is when page 1 is an interior b-tree page.
Page 1 has 100 fewer bytes of storage space available,
due to the presence of the database header at the beginning of that page,
and so sometimes (rarely) if page 1 is an interior b-tree page, it can
end up holding just a a single key.  In all other cases, K is 2 or more.
The upper bound on K is as many keys as will fit on the page. Large keys
on index b-trees are split up into overflow pages so that no single key
uses more than one fourth of the available storage space on the page
and hence every internal page is able to store at least 4 keys.
The integer keys of table b-trees are never large enough to
require overflow, so key overflow only occurs on index b-trees.

Define the depth
of a leaf b-tree to be 1 and the depth of any interior b-tree to be one
more than the maximum depth of any of its children.  In a well-formed
database, all children of an interior b-tree have the same depth.

In an interior b-tree page, the pointers and keys logically alternate 
with a pointer on both ends. (The previous sentence is to be understood
conceptually - the actual layout of the keys and
pointers within the page is more complicated and will be described in
the sequel.)  All keys within the same page are unique and are logically
organized in ascending order from left to right.  (Again, this ordering
is logical, not physical.  The actual location of keys within the page
is arbitrary.) For any key X, pointers to the left
of a X refer to b-tree pages on which all keys are less than or equal to X.
Pointers to the right of X refer to pages where all keys are 
greater than X.

Within an interior b-tree page, each key and the pointer to its
immediate left are combined into a structure called a "cell".  The
right-most pointer is held separately.  A leaf b-tree page has no
pointers, but it still uses the cell structure to hold keys for
index b-trees or keys and content for table b-trees.  Data is also
contained in the cell.


Every b-tree page has at most one parent b-tree page.
A b-tree page without a parent is called a root page.  A root b-tree page
together with the closure of its children form a complete b-tree.
It is possible (and in fact rather common) to have a complete b-tree
that consists of a single page that is both a leaf and the root.
Because there are pointers from parents to children, every page of a
complete b-tree can be located if only the root page is known.  Hence,
b-trees are identified by their root page number.



A b-tree pa4
øZø‚]—þD     5+„7EDatabase File Format2. Schema LayerThe foregoing text describes low-level aspects of the SQLite file
format.  The b-tree mechanism provides a powerful and efficient means of
accessing a large data set.  This section will describe how the
low-level b-tree layer is used to implement higher-level SQL
capabilities.fileformat.html#schema_layer™!—þC  5M°cDatabase File Format1.8. Pointer Map or Ptrmap PagesPointer map or ptrmap pages are extra pages inserted into the database
to make the operation of auto_vacuum and incremental_vacuum modes
more efficient.  Other page types in the database typically have pointers
from parent to child.  For example, an interior b-tree page contains pointers
to its child b-tree pages and an overflow chain has a pointer
from earlier to later links in the chain.  A ptrmap page contains linkage
information going in the opposite direction, from child to parent.

Ptrmap pages must exist in any database file which has a non-zero
largest root b-tree page value at offset 52 in the database header.
If the largest root b-tree page value is zero, then the database must not
contain ptrmap pages.

In a database with ptrmap pages, the first ptrmap page is page 2.
A ptrmap page consists of an array of 5-byte entries.  Let J be the
number of 5-byte entries that will fit in the usable space of a page.
(In other words, J=U/5.)  The first ptrmap page will contain back pointer
information for pages 3 through J+2, inclusive.  The second pointer map
page will be on page J+3 and that ptrmap page will provide back pointer
information for pages J+4 through 2*J+3 inclusive.  And so forth for
the entire database file.

In a database that uses ptrmap pages, all pages at locations identified
by the computation in the previous paragraph must be ptrmap page and no
other page may be a ptrmap page.  Except, if the byte-lock page happens to
fall on the same page number as a ptrmap page, then the ptrmap is moved
to the following page for that one case.

Each 5-byte entry on a ptrmap page provides back-link information about 
one of the pages that immediately follow the pointer map.  If page B is a
ptrmap page then back-link information about page B+1 is provided by
the first entry on the pointer map.  Information about page B+2 is
provided by the second entry.  And so forth.

Each 5-byte ptrmap entry consists of one byte of "page type" information
followed by a 4-byte big-endian page number.  Five page types are recognized:



A b-tree root page.  The
page number should be zero.
A freelist page.  The page number should be
zero.
The first page of a
cell payload overflow chain.  The page number is the b-tree page that
contains the cell whose content has overflowed.
A page in an overflow chain
other than the first page.  The page number is the prior page of the
overflow chain.
A non-root b-tree page.  The
page number is the parent b-tree page.


In any database file that contains ptrmap pages, all b-tree root pages 
must come before any non-root b-tree page, cell payload overflow page, or
freelist page.  This restriction ensures that a root page will never
be moved during an auto-vacuum or incremental-vacuum.  The auto-vacuum
logic does not know how to update the root_page field of the sqlite_schema
table and so it is necessary to prevent root pages from being moved
during an auto-vacuum in order to preserve the integrity of the
sqlite_schema table.  Root pages are moved to the beginning of the
database file by the CREATE TABLE, CREATE INDEX, DROP TABLE, and
DROP INDEX operations.fileformat.html#pointer_map_or_ptrmap_pages
¾¾š=—þE   51³oGDatabase File Format2.1. Record FormatThe data for a table b-tree leaf page and the key
of an index b-tree page was characterized above
as an arbitrary sequence of bytes.
The prior discussion mentioned one key being less than another, but
did not define what "less than" meant.  The current section will address
these omissions.

Payload, either table b-tree data or index b-tree keys, 
is always in the "record format".
The record format defines a sequence of values corresponding
to columns in a table or index.  The record format specifies the number
of columns, the datatype of each column, and the content of each column.

The record format makes extensive use of the 
variable-length integer or varint
representation of 64-bit signed integers defined above.



A record contains a header and a body, in that order.  
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.  Following the size varint are
one or more additional varints, one per column.  These additional varints
are called "serial type" numbers and
determine the datatype of each column, according to the following chart:


Serial Type Codes Of The Record Format

Serial TypeContent SizeMeaning
00
Value is a NULL.
11
Value is an 8-bit twos-complement integer.
22
Value is a big-endian 16-bit twos-complement integer.
33
Value is a big-endian 24-bit twos-complement integer.
44
Value is a big-endian 32-bit twos-complement integer.
56
Value is a big-endian 48-bit twos-complement integer.
68
Value is a big-endian 64-bit twos-complement integer.
78
Value is a big-endian IEEE 754-2008 64-bit floating point number.
80
Value is the integer 0. (Only available for schema format 4 and higher.)
90
Value is the integer 1. (Only available for schema format 4 and higher.)
10,11
    variable
Reserved for internal use.  These serial type codes will
   never appear in a well-formed database file, but they
   might be used in transient and temporary database files
   that SQLite sometimes generates for its own use.
   The meanings of these codes can shift from one release
   of SQLite to the next.
N&#x2265;12 and even
    (N-12)/2
Value is a BLOB that is (N-12)/2 bytes in length.
N&#x2265;13 and odd
    (N-13)/2
Value is a string in the text encoding and (N-13)/2 bytes in length.
The nul terminator is not stored.


The header size varint
and serial type varints will usually consist of a single byte.  The
serial type varints for large strings and BLOBs might extend to two or three
byte varints, but that is the exception rather than the rule. 
The varint format is very efficient at coding the record header.

The values for each column in the record immediately follow the header.
For serial types 0, 8, 9, 12, and 13, the value is zero bytes in
length.  If all columns are of these types then the body section of the
record is empty.

A record might have fewer values than the number of columns in the
corresponding table.  This can happen, for example, after an
ALTER TABLE ... ADD COLUMN SQL statement has increased
the number of columns in the table schema without modifying preexisting rows
in the table.
Missing values at the end of the record are filled in using the
default value for the corresponding columns defined in the table schema.fileformat.html#record_format
æ&æŠ;—þG       5O“/eDatabase File Format2.3. Representation Of SQL TablesEach ordinary SQL table in the database schema is represented on-disk
by a table b-tree.  Each entry in the table b-tree corresponds to a row
of the SQL table.  The rowid of the SQL table is the 64-bit signed
integer key for each entry in the table b-tree.

 The content of each SQL table row is stored in the database file by
first combining the values in the various columns into a byte array
in the record format, then storing that byte array as the payload in
an entry in the table b-tree.  The order of values in the record is
the same as the order of columns in the SQL table definition.
When an SQL table includes an
INTEGER PRIMARY KEY column (which aliases the rowid) then that
column appears in the record as a NULL value.  SQLite will always use
the table b-tree key rather than the NULL value when referencing the
INTEGER PRIMARY KEY column.

 If the affinity of a column is REAL and that column contains a
value that can be converted to an integer without loss of information
(if the value contains no fractional part and is not too large to be
represented as an integer) then the column may be stored in the record
as an integer.  SQLite will convert the value back to floating
point when extracting it from the record.fileformat.html#representation_of_sql_tables‘U—þF      59¢ODatabase File Format2.2. Record Sort OrderThe order of keys in an index b-tree is determined by the sort order of
the records that the keys represent.  Record comparison progresses column
by column.  Columns of a record are examined from left to right.  The
first pair of columns that are not equal determines the relative order
of the two records.  The sort order of individual columns is as
follows:


NULL values (serial type 0) sort first.
Numeric values (serial types 1 through 9) sort after NULLs
      and in numeric order.
Text values (odd serial types 13 and larger) sort after numeric
    values in the order determined by the columns collating function.
BLOB values (even serial types 12 and larger) sort last and in the order 
    determined by memcmp().


A collating function for each column is necessary in order to compute
the order of text fields.
SQLite defines three built-in collating functions:



BINARY
     The built-in BINARY collation compares strings byte by byte
        using the memcmp() function
        from the standard C library.
NOCASE
     The NOCASE collation is like BINARY except that uppercase
        ASCII characters ('A' through 'Z')
        are folded into their lowercase equivalents prior to running the
        comparison.  Only ASCII characters are case-folded.
        NOCASE
        does not implement a general purpose unicode caseless comparison.
RTRIM
     RTRIM is like BINARY except that extra spaces at the end of either
         string do not change the result.  In other words, strings will
         compare equal to one another as long as they
         differ only in the number of spaces at the end.


Additional application-specific collating functions can be added to
SQLite using the sqlite3_create_collation() interface.

The default collating function for all strings is BINARY.
Alternative collating functions for table columns can be specified in the
CREATE TABLE statement using the COLLATE clause on the column definition.
When a column is indexed, the same collating function specified in the
CREATE TABLE statement is used for the column in the index, by default,
though this can be overridden using a COLLATE clause in the 
CREATE INDEX statement.fileformat.html#record_sort_order
¿jE¿‰—þJ   5Q7gDatabase File Format2.5. Representation Of SQL IndicesEach SQL index, whether explicitly declared via a CREATE INDEX statement
or implied by a UNIQUE or PRIMARY KEY constraint, corresponds to an 
index b-tree in the database file.
Each entry in the index b-tree corresponds to a single row in the 
associated SQL table.
The key to an index b-tree is
a record composed of the columns that are being indexed followed by the
key of the corresponding table row.  For ordinary tables, the row key is
the rowid, and for WITHOUT ROWID tables the row key is the PRIMARY KEY.
Because every row in the table has a unique row key,
all keys in an index are unique.

In a normal index, there is a one-to-one mapping between rows in a 
table and entries in each index associated with that table.
However, in a partial index, the index b-tree only contains entries
corresponding to table rows for which the WHERE clause expression on the
CREATE INDEX statement is true.
Corresponding rows in the index and table b-trees share the same rowid
or primary key values and contain the same value for all indexed columns.fileformat.html#representation_of_sql_indicesˆ —þI59-CDatabase File Format2.4.1. Suppression of redundant columns in the PRIMARY KEY
    of WITHOUT ROWID tablesIf the PRIMARY KEY of a WITHOUT ROWID tables uses the same columns
with the same collating sequence more than once, then the second and
subsequent occurrences of that column in the PRIMARY KEY definition are
ignored.  For example, the following CREATE TABLE statements all specify
the same table, which will have the exact same representation on disk:


CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,c)) WITHOUT ROWID);
CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,c,a,c)) WITHOUT ROWID);
CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,A,a,C)) WITHOUT ROWID);
CREATE TABLE t1(a,b,c,d,PRIMARY KEY(a,a,a,a,c)) WITHOUT ROWID);


The first example above is the preferred definition of the table,
of course.  All of the examples create a WITHOUT ROWID table with
two PRIMARY KEY columns, "a" and "c", in that order, followed by
two data columns "b" and "d", also in that order.fileformat.html#suppression_of_redundant_columns_in_the_primary_key_of_without_rowid_tables‰—þH       5c3yDatabase File Format2.4. Representation of WITHOUT ROWID TablesIf an SQL table is created using the "WITHOUT ROWID" clause at the
end of its CREATE TABLE statement, then that table is a WITHOUT ROWID
table and uses a different on-disk representation.  A WITHOUT ROWID
table uses an index b-tree rather than a table b-tree for storage.
The key for each entry in the WITHOUT ROWID b-tree is a record composed
of the columns of the PRIMARY KEY followed by all remaining columns of
the table.  The primary key columns appear in the order that they were
declared in the PRIMARY KEY clause and the remaining columns appear in
the order they occur in the CREATE TABLE statement.

Hence, the content encoding for a WITHOUT ROWID table is the same
as the content encoding for an ordinary rowid table, except that the
order of the columns is rearranged so that PRIMARY KEY columns come
first, and the content is used as the key in an index b-tree rather
than as the data in a table b-tree.
The special encoding rules for columns with REAL affinity
apply to WITHOUT ROWID tables the same as they do with rowid tables.fileformat.html#representation_of_without_rowid_tables
ÚÚ!—þK5#S5Database File Format2.5.1. Suppression of redundant columns in WITHOUT ROWID secondary indexes
In an index on a WITHOUT ROWID table, if a column of the PRIMARY KEY
is also a column in the index and has a matching collating sequence, then the
indexed column is not repeated in the table-key suffix on the
end of the index record.  As an example, consider the following SQL:


CREATE TABLE ex25(a,b,c,d,e,PRIMARY KEY(d,c,a)) WITHOUT rowid;
CREATE INDEX ex25ce ON ex25(c,e);
CREATE INDEX ex25acde ON ex25(a,c,d,e);
CREATE INDEX ex25ae ON ex25(a COLLATE nocase,e);


Each row in the ex25ce index is a record
with these columns: c, e, d, a.  The first two columns are
the columns being indexed, c and e.  The remaining columns are the primary
key of the corresponding table row.  Normally, the primary key would be
columns d, c, and a, but because column c already appears earlier in the
index, it is omitted from the key suffix.

In the extreme case where the columns being indexed cover all columns
of the PRIMARY KEY, the index will consist of only the columns being
indexed.  The ex25acde example above demonstrates this.  Each entry in
the ex25acde index consists of only the columns a, c, d, and e, in that
order.

Each row in ex25ae contains five columns: a, e, d, c, a.  The "a"
column is repeated since the first occurrence of "a" has a collating
function of "nocase" and the second has a collating sequence of "binary".
If the "a" column is not repeated and if the table contains two or more
entries with the same "e" value and where "a" differs only in case, then
all of those table entries would correspond to a single entry in the
index, which would break the one-to-one correspondence between the table
and the index.

 The suppression of redundant columns in the key suffix of an index
entry only occurs in WITHOUT ROWID tables.  In an ordinary rowid table,
the index entry always ends with the rowid even if the INTEGER PRIMARY KEY
column is one of the columns being indexed.fileformat.html#suppression_of_redundant_columns_in_without_rowid_secondary_indexes_
ÒÒœ)—þL 5[¶sqDatabase File Format2.6. Storage Of The SQL Database SchemaPage 1 of a database file is the root page of a table b-tree that
holds a special table named "sqlite_schema".  This b-tree is known
as the "schema table" since it stores the complete
database schema.  The structure of the sqlite_schema table is as
if it had been created using the following SQL:


CREATE TABLE sqlite_schema(
  type text,
  name text,
  tbl_name text,
  rootpage integer,
  sql text
);


The sqlite_schema table contains one row for each table, index, view,
and trigger (collectively "objects") in the database schema, except there
is no entry for the sqlite_schema table itself.  The sqlite_schema table
contains entries for internal schema objects in addition to application-
and programmer-defined objects.


The sqlite_schema.type column will be one
of the following text strings:  'table', 'index', 'view', or 'trigger'
according to the type of object defined.  The 'table' string is used
for both ordinary and virtual tables.

The sqlite_schema.name column will hold the name of the object.
UNIQUE and PRIMARY KEY constraints on tables cause SQLite to create
internal indexes with names of the form "sqlite_autoindex_TABLE_N"
where TABLE is replaced by the name of the table that contains the
constraint and N is an integer beginning with 1 and increasing by one
with each constraint seen in the table definition.
In a WITHOUT ROWID table, there is no sqlite_schema entry for the
PRIMARY KEY, but the "sqlite_autoindex_TABLE_N" name is set aside
for the PRIMARY KEY as if the sqlite_schema entry did exist.  This
will affect the numbering of subsequent UNIQUE constraints.
The "sqlite_autoindex_TABLE_N" name is never allocated for an
INTEGER PRIMARY KEY, either in rowid tables or WITHOUT ROWID tables.


The sqlite_schema.tbl_name column holds the name of a table or view
that the object is associated with.  For a table or view, the
tbl_name column is a copy of the name column.  For an index, the tbl_name
is the name of the table that is indexed.  For a trigger, the tbl_name
column stores the name of the table or view that causes the trigger 
to fire.

The sqlite_schema.rootpage column stores the page number of the root
b-tree page for tables and indexes.  For rows that define views, triggers,
and virtual tables, the rootpage column is 0 or NULL.

The sqlite_schema.sql column stores SQL text that describes the
object.  This SQL text is a CREATE TABLE, CREATE VIRTUAL TABLE,
CREATE INDEX,
CREATE VIEW, or CREATE TRIGGER statement that if evaluated against
the database file when it is the main database of a database connection
would recreate the object.  The text is usually a copy of the original
statement used to create the object but with normalizations applied so
that the text conforms to the following rules:


The CREATE, TABLE, VIEW, TRIGGER, and INDEX keywords at the beginning
of the statement are converted to all upper case letters.
The TEMP or TEMPORARY keyword is removed if it occurs after the 
initial CREATE keyword.
Any database name qualifier that occurs prior to the name of the
object being created is removed.
Leading spaces are removed.
All spaces following the first two keywords are converted into a single
space.


The text in the sqlite_schema.sql column is a copy of the original
CREATE statement text that created the object, except normalized as
described above and as modified by subsequent ALTER TABLE statements.
The sqlite_schema.sql is NULL for the internal indexes that are
automatically created by UNIQUE or PRIMARY KEY constraints.fileformat.html#storage_of_the_sql_database_schema
Þ
PÞŠm—þN    5I”#[Database File Format2.6.2. Internal Schema ObjectsIn addition to the tables, indexes, views, and triggers created by
the application and/or the developer using CREATE statements SQL, the
sqlite_schema table may contain zero or more entries for 
internal schema objects that are created by SQLite for its 
own internal use.  The names of internal schema objects
always begin with "sqlite_" and any table, index, view, or trigger
whose name begins with "sqlite_" is an internal schema object.
SQLite prohibits applications from creating objects whose names begin
with "sqlite_".  

Internal schema objects used by SQLite may include the following:


Indices with names of the form "sqlite_autoindex_TABLE_N" that
       are used to implement UNIQUE and PRIMARY KEY constraints on
       ordinary tables.

A table with the name "sqlite_sequence" that is used to keep track
       of the maximum historical INTEGER PRIMARY KEY for a table
       using AUTOINCREMENT.

Tables with names of the form "sqlite_statN" where N is an integer.
       Such tables store database statistics gathered by the ANALYZE
       command and used by the query planner to help determine the best
       algorithm to use for each query.


New internal schema objects names, always beginning with "sqlite_",
may be added to the SQLite file format in future releases.fileformat.html#internal_schema_objects…+—þM  5gˆcyDatabase File Format2.6.1. Alternative Names For The Schema TableThe name "sqlite_schema" does not appear anywhere in the file format.
That name is just a convention used by the database implementation.
Due to historical and operational considerations, the
"sqlite_schema" table can also sometimes be called by one of the
following aliases:


 sqlite_master
 sqlite_temp_schema
 sqlite_temp_master


Because the name of the schema table does not appear anywhere in
the file format, the meaning of the database file is not changed if
the application chooses to refer to the schema table by one of
these alternative names.fileformat.html#alternative_names_for_the_schema_table
pp‘—þO  5M W_Database File Format2.6.3. The sqlite_sequence tableThe sqlite_sequence table is an internal table used to help implement
AUTOINCREMENT.  The sqlite_sequence table is created automatically
whenever any ordinary table with an AUTOINCREMENT integer primary
key is created.  Once created, the sqlite_sequence table exists in the
sqlite_schema table forever; it cannot be dropped.
The schema for the sqlite_sequence table is:


CREATE TABLE sqlite_sequence(name,seq);


There is a single row in the sqlite_sequence table for each ordinary
table that uses AUTOINCREMENT.  The name of the table (as it appears in
sqlite_schema.name) is in the sqlite_sequence.name field and the largest
INTEGER PRIMARY KEY ever inserted into that table is 
in the sqlite_sequence.seq field.  
New automatically generated integer primary keys for AUTOINCREMENT
tables are guaranteed to be larger than the sqlite_sequence.seq field for
that table.
If the sqlite_sequence.seq field of an AUTOINCREMENT table is already at
the largest integer value (9223372036854775807) then attempts to add new
rows to that table with an automatically generated integer primary will fail
with an SQLITE_FULL error.
The sqlite_sequence.seq field is automatically updated if required when
new entries are inserted to an AUTOINCREMENT table.  
The sqlite_sequence row for an AUTOINCREMENT table is automatically deleted
when the table is dropped.
If the sqlite_sequence row for an AUTOINCREMENT table does not exist when
the AUTOINCREMENT table is updated, then a new sqlite_sequence row is created.
If the sqlite_sequence.seq value for an AUTOINCREMENT table is manually 
set to something other than an integer and there is a subsequent attempt to
insert the or update the AUTOINCREMENT table, then the behavior is undefined.

Application code is allowed to modify the sqlite_sequence table, to add
new rows, to delete rows, or to modify existing rows.  However, application
code cannot create the sqlite_sequence table if it does not already exist.
Application code can delete all entries from the sqlite_sequence table,
but application code cannot drop the sqlite_sequence table.fileformat.html#the_sqlite_sequence_table
—d—þP      5G®YDatabase File Format2.6.4. The sqlite_stat1 tableThe sqlite_stat1 is an internal table created by the ANALYZE command
and used to hold supplemental information about tables and indexes that the
query planner can use to help it find better ways of performing queries.
Applications can update, delete from, insert into or drop the sqlite_stat1
table, but may not create or alter the sqlite_stat1 table.
The schema of the sqlite_stat1 table is as follows:


CREATE TABLE sqlite_stat1(tbl,idx,stat);


 There is normally one row per index, with the index identified by the
name in the sqlite_stat1.idx column.  The sqlite_stat1.tbl column is
the name of the table to which the index belongs.  In each such row, 
the sqlite_stat.stat column will be
a string consisting of a list of integers followed by zero or more 
arguments.  The first integer in this
list is the approximate number of rows in the index.  (The number of
rows in the index is the same as the number of rows in the table,
except for partial indexes.)
The second integer is the approximate number of rows in the index
that have the same value in the first column of the index.  The third 
integer is the 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 estimated 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 arguments, each of which is a sequence of non-space characters.
All arguments are preceded by a single space.
Unrecognized arguments are silently ignored.

If the "unordered" argument is present, then the query planner assumes
that the index is unordered and will not use the index for a range query
or for sorting.

The "sz=NNN" argument (where NNN represents a sequence of 1 or more digits)
means that the average row size over all records of the table or
index is NNN bytes per row.  The SQLite query planner might use the
estimated row size information provided by the "sz=NNN" token
to help it choose smaller tables and indexes that require less disk I/O.

The presence of the "noskipscan" token on the sqlite_stat1.stat field
of an index prevents that index from being used with the
skip-scan optimization.

New text tokens may be added to the end of the stat column in future
enhancements to SQLite.  For compatibility, unrecognized tokens at the end
of the stat column are silently ignored.

If the sqlite_stat1.idx column is NULL, then the sqlite_stat1.stat
column contains a single integer which is the approximate number of
rows in the table identified by sqlite_stat1.tbl.
If the sqlite_stat1.idx column is the same as the sqlite_stat1.tbl
column, then the table is a WITHOUT ROWID table and the sqlite_stat1.stat
field contains information about the index btree that implements the
WITHOUT ROWID table.fileformat.html#the_sqlite_stat1_table
P
,PW—þR   5G{YDatabase File Format2.6.6. The sqlite_stat3 tableThe sqlite_stat3 is only used if SQLite is compiled
with SQLITE_ENABLE_STAT3 or SQLITE_ENABLE_STAT4
and if the SQLite version number is 3.7.9 (2011-11-01) or greater.
The sqlite_stat3 table is neither read nor written by any
version of SQLite before 3.7.9.
If the SQLITE_ENABLE_STAT4 compile-time option is used and the
SQLite version number is 3.8.1 (2013-10-17) or greater,
then sqlite_stat3 might be read but not written.
The sqlite_stat3 table contains additional information
about the distribution of keys within an index, information that the
query planner can use to devise better and faster query algorithms.
The schema of the sqlite_stat3 table is as follows:


CREATE TABLE sqlite_stat3(tbl,idx,nEq,nLt,nDLt,sample);


There are usually multiple entries in the sqlite_stat3 table for each index.
The sqlite_stat3.sample column holds the value of the left-most field of an
index identified by sqlite_stat3.idx and sqlite_stat3.tbl.
The sqlite_stat3.nEq column holds the approximate
number of entries in the index whose left-most column exactly matches
the sample.
The sqlite_stat3.nLt holds the approximate number of entries in the
index whose left-most column is less than the sample.
The sqlite_stat3.nDLt column holds the approximate
number of distinct left-most entries in the index that are less than
the sample.

There can be an arbitrary number of sqlite_stat3 entries per index.
The ANALYZE command will typically generate sqlite_stat3 tables
that contain between 10 and 40 samples that are distributed across
the key space and with large nEq values.

In a well-formed sqlite_stat3 table, the samples for any single
index must appear in the same order that they occur in the index.  
In other words, if the entry with left-most column S1 is earlier in
the index b-tree than the
entry with left-most column S2, then in the sqlite_stat3 table, 
sample S1 must have a smaller rowid than sample S2.fileformat.html#the_sqlite_stat3_table‹O—þQ  5G•kYDatabase File Format2.6.5. The sqlite_stat2 tableThe 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 (2009-09-11) and 3.7.8 (2011-09-19).
The sqlite_stat2 table is neither read nor written by any
version of SQLite before 3.6.18 nor after 3.7.8.
The sqlite_stat2 table contains additional information
about the distribution of keys within an index.
The schema of the sqlite_stat2 table is as follows:


CREATE TABLE sqlite_stat2(tbl,idx,sampleno,sample);


The sqlite_stat2.idx column and the sqlite_stat2.tbl column in each 
row of the sqlite_stat2 table identify an index described by that row.
There are usually 10 rows in the sqlite_stat2
table for each index.

The sqlite_stat2 entries for an index that have sqlite_stat2.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 C be the number of rows in the index.
Then the sampled rows are given by


     rownumber = (i*C*2 + C)/20


The variable i in the previous expression varies between 0 and 9.
Conceptually, the index space is divided into
10 uniform buckets and the samples are the middle row from each bucket.

The format for sqlite_stat2 is recorded here for legacy reference.  
Recent versions of SQLite no longer support sqlite_stat2 and the
sqlite_stat2 table, if is exists, is simply ignored.fileformat.html#the_sqlite_stat2_table
ððœ—þS        5G¶cYDatabase File Format2.6.7. The sqlite_stat4 tableThe sqlite_stat4 is only created and is only used if SQLite is compiled
with SQLITE_ENABLE_STAT4 and if the SQLite version number is
3.8.1 (2013-10-17) or greater.
The sqlite_stat4 table is neither read nor written by any
version of SQLite before 3.8.1.
The sqlite_stat4 table contains additional information
about the distribution of keys within an index or the distribution of
keys in the primary key of a WITHOUT ROWID table.
The query planner can sometimes use the additional information in
the sqlite_stat4 table to devise better and faster query algorithms.
The schema of the sqlite_stat4 table is as follows:


CREATE TABLE sqlite_stat4(tbl,idx,nEq,nLt,nDLt,sample);


There are typically between 10 to 40 entries in the sqlite_stat4 table for
each index for which statistics are available, however these limits are
not hard bounds.
The meanings of the columns in the sqlite_stat4 table are as follows:



tbl:
    The sqlite_stat4.tbl column holds name of the table that owns
    the index that the row describes

idx:
    The sqlite_stat4.idx column holds name of the index that the
    row describes, or in the case of
    an sqlite_stat4 entry for a WITHOUT ROWID table, the
    name of the table itself.

sample:
    The sqlite_stat4.sample column holds a BLOB
    in the record format that encodes the indexed columns followed by
    the rowid for a rowid table or by the columns of the primary key 
    for a WITHOUT ROWID table.
    The sqlite_stat4.sample BLOB for the WITHOUT ROWID table itself 
    contains just the columns of the primary key.
    Let the number of columns encoded by the sqlite_stat4.sample blob be N.
    For indexes on an ordinary rowid table, N will be one more than the number 
    of columns indexed.
    For indexes on WITHOUT ROWID tables, N will be the number of columns
    indexed plus the number of columns in the primary key.
    For a WITHOUT ROWID table, N will be the number of columns in the
    primary key.

nEq:
    The sqlite_stat4.nEq column holds a list of N integers where 
    the K-th integer is the approximate number of entries in the index
    whose left-most K columns exactly match the K left-most columns
    of the sample.

nLt:
    The sqlite_stat4.nLt column holds a list of N integers where
    the K-th integer is the approximate number of entries in the
    index whose K left-most columns are collectively less than the 
    K left-most columns of the sample.

nDLt:
    The sqlite_stat4.nDLt column holds a list of N integers where
    the K-th integer is the approximate
    number of entries in the index that are distinct in the first K columns and
    where the left-most K columns are collectively less than the left-most
    K columns of the sample.



The sqlite_stat4 is a generalization of the sqlite_stat3 table.  The
sqlite_stat3 table provides information about the left-most column of an
index whereas the sqlite_stat4 table provides information about all columns
of the index.

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 that are distributed across
the key space and with large nEq values.

In a well-formed sqlite_stat4 table, the samples for any single
index must appear in the same order that they occur in the index.  
In other words, if entry S1 is earlier in the index b-tree than 
entry S2, then in the sqlite_stat4 table, sample S1 must have a
smaller rowid than sample S2.fileformat.html#the_sqlite_stat4_tablee will be 
detected and the journal will be automatically played back to restore the
database to its state at the start of the incomplete transaction.

A rollback journal is only considered to be valid if it exists and
contains a valid header.  Hence a transaction can be committed in one
of three ways:

The rollback journal file can be deleted,
The rollback journal file can be truncated to zero length, or
The header of the rollback journal can be overwritten with
invalid header text (for example, all zeros).


These three ways of committing a transaction correspond to the DELETE,
TRUNCATE, and PERSIST settings, respectively, of the journal_mode pragma.



A valid rollback journal begins with a header in the following format:


Rollback Journal Header Format

OffsetSizeDescription
0
    8
    Header string:  0xd9, 0xd5, 0x05, 0xf9, 0x20, 0xa1, 0x63, 0xd7
8
    4
    The "Page Count" - The number of pages in the next segment of the 
        journal, or -1 to
        mean all content to the end of the file
12
    4
    A random nonce for the checksum
16
    4
    Initial size of the database in pages
20
    4
    Size of a disk sector assumed by the process that wrote this
        journal.
24
    4
    Size of pages in this journal.



A rollback journal header is padded with zeros out to the size of a 
single sector (as defined by the sector size integer at offset 20).
The header is in a sector by itself so that if a power loss occurs while
writing the sector, information that follows the header will be
(hopefully) undamaged.

After the header and zero padding are zero or more page records.  Each
page record stores a copy of the content of a page from the database file
before it was changed.  The same page may not appear more than once
within a single rollback journal.
To rollback an incomplete transaction, a process
has merely to read the rollback journal from beginning to end and
write pages found in the journal back into the database file at the
appropriate location.

Let the database page size (the value of the integer at offset 24 
in the journal header) be N.
Then the format of a page record is as follows:


Rollback Journal Page Record Format

OffsetSizeDescription
0
    4
    The page number in the database file
4
    N
    Original content of the page prior to the start of the transaction
N+4
    4
    Checksum




The checksum is an unsigned 32-bit integer computed as follows:


Initialize the checksum to the checksum nonce value found in the
journal header at offset 12.
Initialize index X to be N-200 (where N is the size of a database page
in bytes.
Interpret the byte at offset X into the page as an 8-bit unsigned integer
 and add the value of that integer to the checksum.
Subtract 200 from X.
If X is greater than or equal to zero, go back to step 3.


The checksum value is used to guard against incomplete writes of
a journal page record following a power failure.  A different random nonce
is used each time a transaction is started in order to minimize the risk
that unwritten sectors might by chance contain data from the same page
that was a part of prior journals.  By changing the nonce for each
transaction, stale data on disk will still generate an incorrect checksum
and be detected with high probability.  The checksum only uses a sparse sample
of 32-bit words from the data record for performance reasons - design studies 
during the planning phases of SQLite 3.0.0 showed
a significant performance hit in checksumming the entire page.

Let the page count value at offset 8 in the journal header be M.
If M is greater than zero then after M page records the journal file
may be zero padded out to the next multiple of the sector size and another
journal header may be inserted.  All journal headers within the same
journal must contain the same database page size and sector size.

If M is -1 in the initial journal header, then the number of page records
that follow is computed by computing how many page records will fit in
the available space of the remainder of the journal file.fileformat.html#the_rollback_journal
œ
t”S—þV  55¨KDatabase File Format4.1. WAL File FormatA 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 reused 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:


WAL Header Format

OffsetSizeDescription
04
    Magic number.  0x377f0682 or 0x377f0683
44
    File format version.  Currently 3007000.
84
    Database page size.  Example: 1024
124
    Checkpoint sequence number
164
    Salt-1: random integer incremented with each checkpoint
204
    Salt-2: a different random number for each checkpoint
244
    Checksum-1: First part of a checksum on the first 24 bytes of header
284
    Checksum-2: Second part of the checksum on the 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 page-size bytes
of page data. The frame-header is six big-endian 32-bit unsigned 
integer values, as follows:


WAL Frame Header Format

OffsetSizeDescription
04
    Page number
44
    For commit records, the size of the database file in pages
        after the commit.  For all other records, zero.
84
    Salt-1 copied from the WAL header
124
    Salt-2 copied from the WAL header
164
    Checksum-1:  Cumulative checksum up through and including this page
204
    Checksum-2:  Second half of the cumulative checksum.



A frame is considered valid if and only if the following conditions are
true:


The salt-1 and salt-2 values in the frame-header match
       salt values in the wal-header

The checksum values in the final 8 bytes of the frame-header
       exactly match the checksum computed consecutively on the
       first 24 bytes of the WAL header and the first 8 bytes and
       the content of all frames
       up to and including the current frame.fileformat.html#wal_file_format„#—þU       59‡'SDatabase File Format4. The Write-Ahead LogBeginning with version 3.7.0 (2010-07-21), 
SQLite supports a new transaction
control mechanism called "write-ahead log" or "WAL".
When a database is in WAL mode, all connections to that database must
use the WAL.  A particular database will use either a rollback journal
or a WAL, but not both at the same time.
The WAL is always located in the same directory as the database
file and has the same name as the database file but with the string
"-wal" appended.fileformat.html#the_write_ahead_log¦W—þT        5;ÌUDatabase File Format3. The Rollback JournalThe rollback journal is a file associated with each SQLite database
file that holds information used to restore the database file to its initial
state during the course of a transaction.
The rollback journal file is always located in the same 
directory as the database
file and has the same name as the database file but with the string
"-journal" appended.  There can only be a single rollback journal
associated with a give database and hence there can only be one write
transaction open against a single database at one time.

If a transaction is aborted due to an application crash, an operating
system crash, or a hardware power failure or crash, then the database may
be left in an inconsistent state.  The next time SQLite attempts to open
the database file, the presence of the rollback journal filC
·žé·†-—þY     5)‹_?Database File Format4.4. WAL ResetAfter a complete checkpoint, if no other connections are in transactions
that use the WAL, then subsequent write transactions can
overwrite the WAL file from the beginning.  This is called "resetting the
WAL".  At the start of the first new
write transaction, the WAL header salt-1 value is incremented
and the salt-2 value is randomized.  These changes to the salts invalidate
old frames in the WAL that have already been checkpointed but not yet
overwritten, and prevent them from being checkpointed again.

The WAL file can optionally be truncated on a reset, but it need not be.
Performance is usually a little better if the WAL is not truncated, since
filesystems generally will overwrite an existing file faster than they
will grow a file.fileformat.html#wal_reset‡0—þX 5?9UDatabase File Format4.3. Checkpoint AlgorithmOn a checkpoint, the WAL is first flushed to persistent storage using
the xSync method of the VFS. 
Then valid content of the WAL is transferred into the database file.
Finally, the database is flushed to persistent storage using another
xSync method call.
The xSync operations serve as write barriers - all writes launched
before the xSync must complete before any write that launches after the
xSync begins.

A checkpoint need not run to completion.  It might be that some
readers are still using older transactions with data that is contained
in the database file.  In that case, transferring content for newer
transactions from the WAL file into the database would delete the content
out from under readers still using the older transactions.  To avoid that,
checkpoints only run to completion if all reader are using the
last transaction in the WAL.fileformat.html#checkpoint_algorithmˆ]—þW   5;QDatabase File Format4.2. Checksum AlgorithmThe checksum is computed by interpreting the input as
an even number of unsigned 32-bit integers: x(0) through x(N).
The 32-bit integers are big-endian if the
magic number in the first 4 bytes of the WAL header is 0x377f0683 and
the integers are 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 algorithm only works for content which is a multiple of
8 bytes in length.  In other words, if the inputs are x(0) through x(N)
then N must be odd.
The checksum algorithm is as follows:

 
s0 = s1 = 0
for i from 0 to n-1 step 2:
   s0 += x(i) + s1;
   s1 += x(i+1) + s0;
endfor
# result in s0 and s1


The outputs 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 integer
terms of the sequence whereas s0 omits the final term.fileformat.html#checksum_algorithm
”
#”
—þ[     57œ}MDatabase File Format4.6. WAL-Index FormatConceptually, the wal-index is shared memory, though the current
VFS implementations use a memory-mapped file for operating-system
portability.  The memory-mapped
file is in the same directory as the database and has the same name
as the database with a "-shm" suffix appended.  Because
the wal-index is shared memory, SQLite does not support 
journal_mode=WAL 
on a network filesystem when clients are on different machines, as
all clients of the database must be able to share the same memory.

The purpose of the wal-index is to answer this question quickly:


Given a page number P and a maximum WAL frame index M,
return the largest WAL frame index for page P that does not exceed M, 
or return NULL if there are no frames for page P that do not exceed M.


The M value in the previous paragraph is the "mxFrame" value
defined in section 4.4 that is read at the start 
of a transaction and which defines the maximum frame from the WAL that 
the reader will use.

The wal-index is transient.  After a crash, the wal-index is
reconstructed from the original WAL file.  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 stores multi-byte values in the native
byte order of the host computer.

This document is concerned with the persistent state of the database
file, and since the wal-index is a transient structure, no further 
information about the format of the wal-index will be provided here.
Additional details on the format of the wal-index are contained in
the separate WAL-index File Format document.
This page last modified on  2022-08-10 18:45:48 UTCfileformat.html#wal_index_format‹X—þZ        57–MDatabase File Format4.5. Reader AlgorithmTo 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 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 number of value
frames in the WAL as "mxFrame".  (More detail)
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 subsequently appended content, the reader 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.fileformat.html#reader_algorithm
8
8—b˜z    E;®ORun-Time Loadable Extensions2. Loading An ExtensionAn SQLite extension is a shared library or DLL.  To load it, you
need to supply SQLite with the name of the file containing the
shared library or DLL and an entry point to initialize the extension.
In C code, this information is supplied using the
sqlite3_load_extension() API.  See the documentation on that
routine for additional information.

Note that different operating systems use different filename
suffixes for their shared libraries.  Windows uses ".dll", Mac uses
".dylib", and most unixes other than mac use ".so".  If you want to
make your code portable, you can omit the suffix from the shared
library filename and the appropriate suffix will be added automatically
by the sqlite3_load_extension() interface.

There is also an SQL function that can be used to load extensions:
load_extension(X,Y).  It works just like the sqlite3_load_extension()
C interface.

Both methods for loading an extension allow you to specify
the name of an entry point for the extension.  
You can leave this argument blank - passing in
a NULL pointer for the sqlite3_load_extension() C-language interface
or omitting the second argument for the load_extension() SQL interface -
and the extension loader logic will attempt to figure out the entry point
on its own.  It will first try the generic extension name
"sqlite3_extension_init".  If that does not work, it constructs a
entry point using the template "sqlite3_X_init" where the X is replaced
by the lowercase equivalent of every ASCII character in the filename
after the last "/" and before the first following "." omitting the
first three characters if they happen to be "lib".  So, for example,
if the filename is "/usr/lib/libmathfunc-4.8.so" the entry point name
would be "sqlite3_mathfunc_init".  Or if the filename is 
"./SpellFixExt.dll" then the entry point would be called
"sqlite3_spellfixext_init".

For security reasons, extension loading is turned off by default.
In order to use either the C-language or SQL extension loading functions,
one must first enable extension loading using the
sqlite3_db_config(db,SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION,1,NULL)
C-language API in your application.

From the command-line shell, extensions can be loaded using the
".load" dot-command.  For example:


.load ./YourCode


Note that the command-line shell program has already enabled
extension loading for you (by calling the sqlite3_enable_load_extension()
interface as part of its setup) so the command above works without
any special switches, setup, or other complications.

The ".load" command with one argument invokes sqlite3_load_extension()
with the zProc parameter set to NULL, causing SQLite to first look for
an entry point named "sqlite3_extension_init" and then "sqlite3_X_init"
where "X" is derived from the filename.  If your extension has an entry
point with a different name, simply supply that name as the second
argument.  For example:


.load ./YourCode nonstandard_entry_pointloadext.html#loading_an_extension…\˜y  E#Š;7Run-Time Loadable Extensions1. OverviewSQLite has the ability to load extensions (including new
application-defined SQL functions,
collating sequences, virtual tables, and VFSes) at run-time.
This feature allows the code for extensions to be developed and
tested separately from the application and then loaded
on an as-needed basis.

Extensions can also be statically linked with the application.
The code template shown below will work just as well as a statically
linked extension as it does as a run-time loadable extension except that
you should give the entry point function ("sqlite3_extension_init")
a different name to avoid name collisions if your application contains
two or more extensions.loadext.html#overview
õ½õ“C˜| EQ¥-eRun-Time Loadable Extensions4. Programming Loadable ExtensionsA template loadable extension contains the following three elements:



Use "#include &lt;sqlite3ext.h&gt;" at the top of your source
code files instead of "#include &lt;sqlite3.h&gt;".



Put the macro "SQLITE_EXTENSION_INIT1" on a line by itself 
right after the "#include &lt;sqlite3ext.h&gt;" line.



Add an extension loading entry point routine that looks like 
something the following:

#ifdef _WIN32
__declspec(dllexport)
#endif
int sqlite3_extension_init( /* &lt;== Change this name, maybe */
  sqlite3 *db, 
  char **pzErrMsg, 
  const sqlite3_api_routines *pApi
){
  int rc = SQLITE_OK;
  SQLITE_EXTENSION_INIT2(pApi);
  /* insert code to initialize your extension here */
  return rc;
}


You will do well to customize the name of your entry point to
correspond to the name of the shared library you will be generating,
rather than using the generic "sqlite3_extension_init" name.  Giving
your extension a custom entry point name will enable you to statically
link two or more extensions into the same program without a linker
conflict, if you later decide to use static linking rather than run-time
linking.
If your shared library ends up being named "YourCode.so" or
"YourCode.dll" or "YourCode.dylib" as shown in the compiler examples
above, then the correct entry point name would be
"sqlite3_yourcode_init".


Here is a complete template extension that you can copy/paste 
to get started:

/* Add your header comment here */
#include &lt;sqlite3ext.h&gt; /* Do not use &lt;sqlite3.h&gt;! */
SQLITE_EXTENSION_INIT1

/* Insert your extension code here */

#ifdef _WIN32
__declspec(dllexport)
#endif
/* TODO: Change the entry point name so that "extension" is replaced by
** text derived from the shared library filename as follows:  Copy every
** ASCII alphabetic character from the filename after the last "/" through
** the next following ".", converting each character to lowercase, and
** discarding the first three characters if they are "lib".
*/
int sqlite3_extension_init(
  sqlite3 *db, 
  char **pzErrMsg, 
  const sqlite3_api_routines *pApi
){
  int rc = SQLITE_OK;
  SQLITE_EXTENSION_INIT2(pApi);
  /* Insert here calls to
  **     sqlite3_create_function_v2(),
  **     sqlite3_create_collation_v2(),
  **     sqlite3_create_module_v2(), and/or
  **     sqlite3_vfs_register()
  ** to register the new features that your extension adds.
  */
  return rc;
}loadext.html#programming_loadable_extensionsˆ>˜{      EO'cRun-Time Loadable Extensions3. Compiling A Loadable ExtensionLoadable extensions are C-code.  To compile them on
most unix-like operating
systems, the usual command is something like this:


gcc -g -fPIC -shared YourCode.c -o YourCode.so


Macs are unix-like, but they do not follow the usual shared library
conventions.  To compile a shared library on a Mac, use a command like
this:


gcc -g -fPIC -dynamiclib YourCode.c -o YourCode.dylib


If when you try to load your library you get back an error message
that says "mach-o, but wrong architecture" then you might need to add
command-line options "-arch i386" or "arch x86_64" to gcc, depending
on how your application is built.

To compile on Windows using MSVC, a command similar to the following
will usually work:


cl YourCode.c -link -dll -out:YourCode.dll


To compile for Windows using MinGW, the command line is just like it
is for unix except that the output file suffix is changed to ".dll" and
the -fPIC argument is omitted:


gcc -g -shared YourCode.c -o YourCode.dllloadext.html#compiling_a_loadable_extension
u
ÁuG˜~      EOŸ9cRun-Time Loadable Extensions5. Persistent Loadable ExtensionsThe default behavior for a loadable extension is that it is unloaded
from process memory when the database connection that originally invoked
sqlite3_load_extension() closes.  (In other words, the xDlClose method
of the sqlite3_vfs object is called for all extensions when a database
connection closes.)  However, if the initialization procedure returns
SQLITE_OK_LOAD_PERMANENTLY instead of SQLITE_OK, then the extension will
not be unloaded (xDlClose will not be invoked) and the extension will remain
in process memory indefinitely.  The SQLITE_OK_LOAD_PERMANENTLY return
value is useful for extensions that want to register new VFSes.

To clarify: an extension for which the initialization function returns
SQLITE_OK_LOAD_PERMANENTLY continues to exist in memory after the database
connection closes.  However, the extension is not automatically
registered with subsequent database connections.  This makes it possible
to load extensions that implement new VFSes.
To persistently load and register an extension that implements new SQL
functions, collating sequences, and/or virtual tables, such that those
added capabilities are available to all subsequent database connections,
then the initialization routine should also invoke sqlite3_auto_extension()
on a subfunction that will register those services.

The vfsstat.c extension
show an example of a loadable extension that persistently registers both
a new VFS and a new virtual table.  The
sqlite3_vfsstat_init()
initialization routine in that extension is called only once, when the
extension is first loaded.  It registers the new "vfslog" VFS just that
one time, and it returns SQLITE_OK_LOAD_PERMANENTLY so that the code used
to implement the "vfslog" VFS will remain in memory. The initialization routine
also invokes sqlite3_auto_extension() on a pointer to the "vstatRegister()"
function so that all subsequent database connections will invoke the
"vstatRegister()" function as they start up, and hence register the
"vfsstat" virtual table.loadext.html#persistent_loadable_extensionsŠ:˜}        E;“KKRun-Time Loadable Extensions4.1. Example ExtensionsMany examples of complete and working loadable extensions can be 
seen in the SQLite source tree in the
ext/misc subdirectory.
Each file in that directory is a separate extension.  Documentation
is provided by a header comment on the file.
Here are brief notes on a few of the extensions in 
the ext/misc subdirectory:



carray.c &mdash;
Implementation of the carray table-valued function.

compress.c &mdash;
Implementation of application-defined SQL functions compress() and
uncompress() that do zLib compression of text or blob content.

json1.c &mdash;
Implementation of JSON SQL functions and table-valued functions.
This is a larger and more complex extension.

memvfs.c &mdash;
Implementation of a new VFS that stores all content in-memory.

rot13.c &mdash;
Implementation of a rot13() 
SQL function.  This is a very simple example of an extension function
and is useful as a template for creating new extensions.

series.c &mdash;
Implementation of the generate_series virtual table and
table-valued function.  This is a relatively simple example of a
virtual table implementation which can serve as a template for writing
new virtual tables.


Other and more complex extensions can be found in subfolders
under ext/ other than ext/misc/.loadext.html#example_extensions
Xúv‚b˜J
Ykƒ        How To Corrupt An SQLite Database File1.  File overwrite by a rogue thread or processSQLite database files are ordinary disk files.
That means that any process can open the file and 
overwrite it with garbage.  There is nothing that the SQLite
library can do to defend against this.howtocorrupt.html#_file_overwrite_by_a_rogue_thread_or_process„˜I       YˆgAHow To Corrupt An SQLite Database File OverviewAn SQLite database is highly resistant to corruption.
If an application crash, or an operating-system crash, or even
a power failure occurs in the middle of a transaction, the partially
written transaction should be automatically rolled back the next time
the database file is accessed.  The recovery process is fully
automatic and does not require any action on the part of the user
or the application.


Though SQLite is resistant to database corruption, it is not immune.
This document describes the various ways that an SQLite database might
go corrupt.howtocorrupt.html#overview†Y˜Ž      E?‹}SRun-Time Loadable Extensions7. Implementation DetailsSQLite implements run-time extension loading using the
xDlOpen(), xDlError(), xDlSym(), and xDlClose() methods of the
sqlite3_vfs object.  These methods are implemented using
the dlopen() library on unix (which explains why SQLite commonly
needs to be linked against the "-ldl" library on unix systems)
and using LoadLibrary() API on Windows.  In a custom VFS for
unusual systems, these methods can all be omitted, in which case
the run-time extension loading mechanism will not work (though
you will still be able to statically link the extension code, assuming
the entry pointers are uniquely named).
SQLite can be compiled with
SQLITE_OMIT_LOAD_EXTENSION to omit the extension loading code
from the build.
This page last modified on  2022-03-08 04:52:03 UTCloadext.html#implementation_details#˜
Esœ'Run-Time Loadable Extensions6. Statically Linking A Run-Time Loadable ExtensionThe exact same source code can be used for both a run-time loadable
shared library or DLL and as a module that is statically linked with your
application.  This provides flexibility and allows you to reuse the same
code in different ways.

To statically link your extension, simply add the -DSQLITE_CORE
compile-time option.  The SQLITE_CORE macro causes the SQLITE_EXTENSION_INIT1
and SQLITE_EXTENSION_INIT2 macros to become no-ops.  Then modify your
application to invoke the entry point directly, passing in a NULL pointer
as the third "pApi" parameter.

It is particularly important to use an entry point name that is
based on the extension filename, rather than the generic
"sqlite3_extension_init" entry point name, if you will be statically
linking two or more extensions.  If you use the generic name, there
will be multiple definitions of the same symbol and the link will fail.

If you will be opening multiple database connections in your application,
rather than invoking the extension entry points for each database
connection separately, you might want to consider using the
sqlite3_auto_extension() interface to register your extensions and
to cause them to be automatically started as each database connection
is opened.  You only have to register each extension once, and you can
do so near the beginning of your main() routine.  Using the
sqlite3_auto_extension() interface to register your extensions makes
your extensions work as if they were built into the core SQLite - they
automatically exist whenever you open a new database connection
without needing to be initialized.  Just be sure to complete any
configuration you need to accomplish using sqlite3_config() before
registering your extensions, since the sqlite3_auto_extension()
interface implicitly calls sqlite3_initialize().loadext.html#statically_linking_a_run_time_loadable_extension
Þž/Þ†L˜M YE‹=_How To Corrupt An SQLite Database File1.3.  Deleting a hot journalSQLite normally stores all content in a single disk file.  However,
while performing a transaction, information necessary to recover the
database following a crash or power failure is stored in auxiliary
journal files.  Such journal files are described as "hot".
The journal files have the same name as the
original database file with the addition
of -journal or -wal suffix.

SQLite must see the journal files in order to recover from a crash
or power failure.  If the hot journal files are moved, deleted, or renamed
after a crash or power failure, then automatic recovery will not work
and the database may go corrupt.

Another manifestation of this problem is
database corruption caused by inconsistent use of 8+3 filenames.howtocorrupt.html#_deleting_a_hot_journal†j˜L
Yw‹How To Corrupt An SQLite Database File1.2.  Backup or restore while a transaction is activeSystems that run automatic backups in the background might try to
make a backup copy of an SQLite database file while it is in the middle
of a transaction.  The backup copy then might contain some old and some
new content, and thus be corrupt.

The best approach to make reliable backup copies of an SQLite database
is to make use of the backup API that is part of the SQLite library.
Failing that, it is safe to make a copy of an SQLite database file as long
as there are no transactions in progress by any process.  If the previous
transaction failed, then it is important that any rollback journal
(the *-journal file) or write-ahead log (the *-wal file)
be copied together with the database file itself.howtocorrupt.html#_backup_or_restore_while_a_transaction_is_activeŽ]˜KYšC+How To Corrupt An SQLite Database File1.1.  Continuing to use a file descriptor after it has been closedWe have seen multiple cases where a file descriptor was open on a file,
then that file descriptor was closed and reopened on an SQLite database.
Later, some other thread continued to write into the
old file descriptor, not realizing that the original file had been closed
already.  But because the file descriptor had been reopened by SQLite,
the information that was intended to go into the original file ended up
overwriting parts of the SQLite database, leading to corruption of the
database.

One example of this occurred circa 2013-08-30 on the canonical repository
for the Fossil DVCS.  In that event,
file descriptor 2 (standard error) was being erroneously closed (by
stunnel, we suspect) prior to 
sqlite3_open_v2() so that the file descriptor used for the
repository database file was 2.  Later, an application 
bug caused an assert() statement to emit
an error message by invoking write(2,...).  But since file descriptor 2 was 
now connected to a database file, the error message
overwrote part of the database.  To guard against this kind of problem,
SQLite version 3.8.1 (2013-10-17)
and later refuse to use low-numbered file descriptors
for database files. 
(See SQLITE_MINIMUM_FILE_DESCRIPTOR for additional information.)

Another example of corruption caused by using a closed file
descriptor was 
reported by facebook engineers in a blog post on 2014-08-12.

Another example of this error was reported against
Fossil on 2019-07-11.  A file descriptor would
be opened for debugging output, but then closed and reopened by SQLite.
But the debugging logic continued to write into the original file
descriptor. See the
forum discussion
for the bug report and a link to the fix.howtocorrupt.html#_continuing_to_use_a_file_descriptor_after_it_has_been_closed
ª^
$ªŽu˜QYše1How To Corrupt An SQLite Database File2.2.  Posix advisory locks canceled by a separate thread doing close()The default locking mechanism used by SQLite on unix platforms is
POSIX advisory locking.  Unfortunately, POSIX advisory locking has design
quirks that make it prone to misuse and failure. In particular, any
thread in the same process with a file descriptor that is holding a POSIX
advisory lock can override that lock using a different file descriptor.
One particularly pernicious problem is that the close() system
call will cancel all POSIX advisory locks on the same file for all
threads and all file descriptors in the process.

So, for example, suppose a multi-thread process has
two or more threads with separate SQLite database connections to the
same database file.  Then a third thread comes along and wants to read
something out of that same database file on its own, without using the 
SQLite library.
The third thread does an open(), a read() and then
a close().
One would think this would be harmless.
But the close() system call caused the
locks held on the database by all the other threads to be dropped.  Those
other threads have no way of knowing that their locks have just been
trashed (POSIX does not provide any mechanism to determine this) and so
they keep on running under the assumption that their locks are still valid.
This can lead to two or more threads or processes trying to write to the
database at the same time, resulting in database corruption.

Note that it is perfectly safe for two or more threads to access the
same SQLite database file using the SQLite library.  The unix drivers for
SQLite know about the POSIX advisory locking quirks and work around them.
This problem only arises when a thread tries to bypass the SQLite library
and read the database file directly.howtocorrupt.html#_posix_advisory_locks_canceled_by_a_separate_thread_doing_close_…˜PY‡Q!How To Corrupt An SQLite Database File2.1.  Filesystems with broken or missing lock implementationsSQLite depends on the underlying filesystem to do locking as the
documentation says it will.  But some filesystems contain bugs in their
locking logic such that the locks do not always behave as advertised.
This is especially true of network filesystems and NFS in particular.
If SQLite is used on a filesystem where the locking primitives contain
bugs, and if two or more threads or processes try to access the same
database at the same time, then database corruption might result.howtocorrupt.html#_filesystems_with_broken_or_missing_lock_implementationsƒ˜O        Y?„Y]How To Corrupt An SQLite Database File2.  File locking problemsSQLite uses file locks on the database file, and on the 
write-ahead log or WAL file, to coordinate access between concurrent
processes.  Without coordination, two threads or processes might try
to make incompatible changes to a database file at the same time,
resulting in database corruption.howtocorrupt.html#_file_locking_problems‡˜N
YoΠ        How To Corrupt An SQLite Database File1.4.  Mispairing database files and hot journals The previous example is a specific case of a more general problem:
The state of an SQLite database is controlled by both the
database file and the journal file.  In a quiescent state, the journal
file does not exist and only the database file matters.
But if the journal file does exist, it must be
kept together with the database to avoid corruption.  The following
actions are all likely to lead to corruption:

 Swapping journal files between two different databases.
 Overwritting a journal file with a different journal file.
 Moving a journal file from one database to another.
 Copying a database file without also copying its journal.
 Overwriting a database file with another without also
     deleting any hot journal associated with the original database.howtocorrupt.html#_mispairing_database_files_and_hot_journals_
7
m–7ŠZ˜T
Y}’gHow To Corrupt An SQLite Database File2.4.  Unlinking or renaming a database file while in useIf two processes have open connections to the same database file and
one process closes its connection, unlinks the file, then creates a new
database file in its place with the same name and reopens the new file,
then the two processes will be talking to different database files with 
the same name.  (Note that this is only possible on Posix and Posix-like
systems that permit a file to be unlinked while it is still open for
reading and writing.  Windows does not allow this to occur.)
Since rollback journals and WAL files are based on the name of the database
file, the two different database files will share the same rollback
journal or WAL file.  A rollback or recovery for one of the databases
might use content from the other database, resulting in corruption.
A similar problem occurs if a database file is renamed while it is
opened and a new file is created with the old name.

In other words, unlinking or renaming an open database file 
results in behavior that is undefined and probably undesirable.

Beginning with SQLite version 3.7.17 (2013-05-20),
the unix OS interface will
send SQLITE_WARNING messages to the error log if a database file is unlinked
while it is still in use.howtocorrupt.html#_unlinking_or_renaming_a_database_file_while_in_use‡R˜S
YwŒcHow To Corrupt An SQLite Database File2.3.  Two processes using different locking protocolsThe default locking mechanism used by SQLite on unix platforms is
POSIX advisory locking, but there are other options.  By selecting an
alternative sqlite3_vfs using the sqlite3_open_v2() interface, an
application can make use of other locking protocols that might be more
appropriate to certain filesystems.  For example, dot-file locking might
be select for use in an application that has to run on an NFS filesystem
that does not support POSIX advisory locking.

It is important that all connections to the same database file use 
the same locking protocol.
If one application is using POSIX advisory locks and another application
is using dot-file locking, then the two applications will not see each
other's locks and will not be able to coordinate database access, possibly
leading to database corruption.howtocorrupt.html#_two_processes_using_different_locking_protocols‹˜RY“-%How To Corrupt An SQLite Database File2.2.1. Multiple copies of SQLite linked into the same applicationAs pointed out in the previous paragraph, SQLite takes steps to work
around the quirks of POSIX advisory locking.  Part of that work-around involves
keeping a global list (mutex protected) of open SQLite database files.
But, if multiple copies of SQLite are linked into the same application,
then there will be multiple instances of this global list.
Database connections opened using one copy of the SQLite library
will be unaware of database connections opened using the other copy,
and will be unable to work around the POSIX advisory locking quirks.
A close() operation on one connection might unknowingly 
clear the locks on a different database connection, leading to database
corruption.

The scenario above sounds far-fetched.
But the SQLite developers are aware of at 
least one commercial product that was released
with exactly this bug.  The vendor came to the SQLite developers seeking
help in tracking down some infrequent database corruption issues they were
seeing on Linux and Mac.  The problem was eventually traced to the
fact that the application was linking against two separate copies of SQLite.
The solution was to change the application build procedures to link against
just one copy of SQLite instead of two.howtocorrupt.html#multiple_copies_of_sqlite_linked_into_the_same_application
Åwʼn-˜W  Y3‘QHow To Corrupt An SQLite Database File3.  Failure to syncIn order to guarantee that database files are always consistent, SQLite
will occasionally ask the operating system to flush all pending writes to
persistent storage then wait for that flush to complete.  This is 
accomplished using the fsync() system call under unix and
FlushFileBuffers() under Windows.  We call this flush of
pending writes a "sync".

Actually, if one is only concerned with atomic and consistent writes and
is willing to forego durable writes, the sync operation does not need
to wait until the content is completely stored on persistent media.  Instead,
the sync operation can be thought of as an I/O barrier.  As long as all
writes that occur before the sync are completed before any write that happens
after the sync, no database corruption will occur.  If sync is operating as
an I/O barrier and not as a true sync, then a power failure or system crash
might cause one or more previously committed transactions to roll back
(in violation of the "durable" property of "ACID") but the database will at
least continue to be consistent, and that is what most people care about.howtocorrupt.html#_failure_to_sync‡˜VY‹aHow To Corrupt An SQLite Database File2.6.  Carrying an open database connection across a fork() Do not open an SQLite database connection, then fork(), then try
to use that database connection in the child process.  All kinds of
locking problems will result and you can easily end up with a corrupt
database.  SQLite is not designed to support that kind of behavior.
Any database connection that is used in a child process must be opened
in the child process, not inherited from the parent.

 Do not even call sqlite3_close() on a database connection from a
child process if the connection was opened in the parent.  It is safe
to close the underlying file descriptor, but the sqlite3_close()
interface might invoke cleanup activities that will delete content out
from under the parent, leading to errors and perhaps even database
corruption.howtocorrupt.html#_carrying_an_open_database_connection_across_a_fork_‰c˜U  YW‘GqHow To Corrupt An SQLite Database File2.5.  Multiple links to the same fileIf a single database file has multiple links (either hard or soft links)
then that is just another way of saying that the file has multiple names.
If two or more processes open the database using different names, then
they will use different rollback journals and WAL files.  That means that
if one process crashes, the other process will be unable to recover the
transaction in progress because it will be looking in the wrong place
for the appropriate journal.

In other words, opening and using a database file that has two or
more names results in behavior that is undefined and probably undesirable.

Beginning with SQLite version 3.7.17 (2013-05-20),
the unix OS interface will
send SQLITE_WARNING messages to the error log if a database file has 
multiple hard links.

Beginning with SQLite version 3.10.0 (2016-01-06), 
the unix OS interface will
attempt to resolve symbolic links and open the database file by its
canonical name.  Prior to version 3.10.0, opening a database file 
through a symbolic link was similar to opening a database file
that had multiple hard links and resulted in undefined behavior.howtocorrupt.html#_multiple_links_to_the_same_file
b"]b…˜[       Yeˆ#How To Corrupt An SQLite Database File4.1.  Non-powersafe flash memory controllersWe are told that in some flash memory controllers the wear-leveling logic
can cause random filesystem damage if power is interrupted during a write.
This can manifest, for example, as random changes in the middle of a file
that was not even open at the time of the power loss.  So, for example,
a device would be writing content into an MP3 file in flash memory when a
power loss occurs, and that could result in an SQLite database being
corrupted even though the database was not even in use at the time of the
power loss.howtocorrupt.html#_non_powersafe_flash_memory_controllers‚R˜Z       Y]ƒ{How To Corrupt An SQLite Database File4.  Disk Drive and Flash Memory FailuresAn SQLite database can become corrupt if the file content changes 
due to a disk drive or flash memory failure.  It is very rare, but disks 
will occasionally flip a bit in the middle of a sector.howtocorrupt.html#_disk_drive_and_flash_memory_failures…@˜Y     YQ‰
kHow To Corrupt An SQLite Database File3.2.  Disabling sync using PRAGMAsThe sync operations that SQLite performs to help ensure integrity
can be disabled at run-time using the synchronous pragma.  By setting
PRAGMA synchronous=OFF, all sync operations are omitted.  This makes
SQLite seem to run faster, but it also allows the operating system to freely
reorder writes, which could result in database corruption if a power failure
or hard reset occurs prior to all content reaching persistent storage.

For maximum reliability and for robustness against database corruption,
SQLite should always be run with its default synchronous setting of FULL.howtocorrupt.html#_disabling_sync_using_pragmas‘Y˜X
Yo¡        How To Corrupt An SQLite Database File3.1.  Disk drives that do not honor sync requestsUnfortunately, most consumer-grade mass storage devices lie about
syncing.  Disk drives will report that content is safely on persistent
media as soon as it reaches the track buffer and before actually being
written to oxide.  This makes the disk drives seem to operate faster
(which is vitally important to the manufacturer so that they can show
good benchmark numbers in trade magazines).  And in fairness, the lie
normally causes no harm, as long as there is no power loss or hard reset
prior to the track buffer actually being written to oxide.  But if a
power loss or hard reset does occur, and if that results in content that
was written after a sync reaching oxide while content written before
the sync is still in a track buffer, then database corruption can occur.

USB flash memory sticks seem to be especially pernicious liars 
regarding sync requests.  One can easily see this by committing a large
transaction to an SQLite database on a USB memory stick.  The COMMIT
command will return relatively quickly, indicating that the memory stick
has told the operating system and the operating system has told SQLite that
all content is safely in persistent storage, and yet the LED on the end
of the memory stick will continue flashing for several more seconds. 
Pulling out the memory stick while the LED is still flashing will frequently
result in database corruption.

Note that SQLite must believe whatever the operating system and hardware
tell it about the status of sync requests.  There is no way for SQLite to
detect that either is lying and that writes might be occurring out-of-order.
However, SQLite in WAL mode is far more forgiving of
out-of-order writes than in the default rollback journal modes.  In WAL
mode, the only time that a failed sync operation can cause database corruption
is during a checkpoint operation.  A sync failure during a COMMIT might
result in loss of durability but not in a corrupt database file.  Hence,
one line of defense against database corruption due to failed sync operations
is to use SQLite in WAL mode and to checkpoint as infrequently as possible.howtocorrupt.html#_disk_drives_that_do_not_honor_sync_requests
Ã
¯     ¯Îfǘ`   YKŒYaHow To Corrupt An SQLite Database File6.2.  Failures of mmap() on QNXThere exists some subtle problem with mmap() on QNX such that making
a second mmap() call against a single file descriptor can cause
the memory obtained from the first mmap() call to be zeroed.  SQLite on
unix uses mmap() to create a shared memory region for transaction 
coordination in WAL mode, and it will call mmap() multiple times
for large transactions.  The QNX mmap() has been demonstrated to corrupt
database file under that scenario.  QNX engineers are aware of this problem
and are working on a solution; the problem may have already been fixed by
the time you read this.

When running on QNX, it is recommended that memory-mapped I/O never
be used.  Furthermore, to use WAL mode, it is recommended that applications
employ the exclusive locking mode in order to 
use WAL without shared memory.howtocorrupt.html#_failures_of_mmap_on_qnx†c˜_   Y3ŒMHow To Corrupt An SQLite Database File6.1.  Linux ThreadsSome older versions of Linux used the LinuxThreads library for thread
support.  LinuxThreads is similar to Pthreads, but is subtly different
with respect to handling of POSIX advisory locks.  SQLite versions
2.2.3 through 3.6.23 recognized that LinuxThreads were being used at
runtime and took appropriate action to work around the non-standard
behavior of LinuxThreads.  But most modern Linux implementations make
use of the newer, and correct, NPTL implementation of Pthreads.  Beginning
with SQLite version 3.7.0 (2010-07-21), the use of NPTL is assumed.
No checks are 
made.  Hence, recent versions of SQLite will subtly malfunction and may 
corrupt database files if used in multi-threaded application that run
on older linux systems that make use of LinuxThreads.howtocorrupt.html#_linux_threadsƒ\˜^      YS…=qHow To Corrupt An SQLite Database File6.  Other operating system problemsSometimes operating systems will exhibit non-standard behavior which
can lead to problems.  Sometimes this non-standard behavior is deliberate,
and sometimes it is a mistake in the implementation.  But in any event,
if the operating performs differently from they way SQLite expects it to
perform, the possibility of database corruption exists.howtocorrupt.html#_other_operating_system_problems‡{˜]  Y7Ž3UHow To Corrupt An SQLite Database File5.  Memory corruptionSQLite is a C-library that runs in the same address space as the 
application that it serves.  That means that stray pointers, buffer
overruns, heap corruption, or other malfunctions in the application can
corrupt internal SQLite data structure and ultimately result in a
corrupt database file.  Normally these kinds of problems manifest themselves
as segfaults prior to any database corruption occurring, but there have
been instances where application code errors have caused SQLite to
malfunction subtly so as to corrupt the database file rather than
panicking.

The memory corruption problem becomes more acute when
using memory-mapped I/O.
When all or part of the database file is mapped into the application's
address space, then a stray pointer that overwrites any part of that
mapped space will immediately corrupt the database file, without
requiring the application to do a subsequent write() system call.howtocorrupt.html#_memory_corruption„L˜\      YI‡5cHow To Corrupt An SQLite Database File4.2.  Fake capacity USB sticksThere are many fraudulent USB sticks in circulation that report to have
a high capacity (ex: 8GB) but are really only capable of storing a much
smaller amount (ex: 1GB).   Attempts to write on these devices will
often result in unrelated files being overwritten.  Any use of a fraudulent
flash memory device can easily lead to database corruption, therefore.
Internet searches such as "fake capacity usb" will turn up lots of
disturbing information about this problem.howtocorrupt.html#_fake_capacity_usb_sticks
ß
D q¡ß…=˜d
Y}ˆ-How To Corrupt An SQLite Database File8.1.  False corruption reports due to database shrinkageIf a database is written by SQLite version 3.7.0 or later and then
written again by SQLite version 3.6.23 or earlier in such a way as to
make the size of the database file decrease, then the next time that
SQLite version 3.7.0 access the database file, it might report that the
database file is corrupt.  The database file is not really corrupt, however.
Version 3.7.0 was simply being overly zealous in its corruption detection.

The problem was fixed on 2011-02-20.  The fix first appears in
SQLite version 3.7.6 (2011-04-12).howtocorrupt.html#_false_corruption_reports_due_to_database_shrinkage‰K˜c    Y1‘_OHow To Corrupt An SQLite Database File8.  Bugs in SQLiteSQLite is very carefully tested to help ensure that it is
as bug-free as possible.  Among the many tests that are carried out for
every SQLite version are tests that simulate power failures, I/O errors,
and out-of-memory (OOM) errors and verify that no database corruption occurs
during any of these events.  SQLite is also field-proven with approximately
two billion active deployments with no serious problems.

Nevertheless, no software is 100% perfect.  There have been a few
historical bugs in SQLite (now fixed) that could cause database corruption.
And there may be yet a few more that remain undiscovered.  Because of the
extensive testing and widespread use of SQLite, bugs that result in
database corruption tend to be very obscure.  The likelihood
of an application encountering an SQLite bug is small.  To illustrate this,
an account is given below 
of all database-corruption bugs found in SQLite during the
four-year period from 2009-04-01 to 2013-04-15.
This account should give the reader an intuitive sense of the
kinds of bugs in SQLite that manage to slip through testing procedures
and make it into a release.howtocorrupt.html#_bugs_in_sqlite‡N˜b       YI5gHow To Corrupt An SQLite Database File7. SQLite Configuration ErrorsSQLite has many built-in protections against database corruption.
But many of these protections can be disabled by configuration options.
If protections are disabled, database corruption may occur.

The following are examples of disabling the built-in protection
mechanisms of SQLite:


Setting PRAGMA synchronous=OFF can cause the database to
go corrupt if there is an operating-system crash or power failure,
though this setting is safe from damage due to application crashes.

Changing the PRAGMA schema_version while other database
connections are open.

Using PRAGMA journal_mode=OFF or PRAGMA journal_mode=MEMORY
and taking an application crash in the middle of a write transaction.

Setting PRAGMA writable_schema=ON and then changing the
database schema using DML statements can render the database completely
unreadable, if not done carefully.howtocorrupt.html#sqlite_configuration_errors…7˜a    YC‰]How To Corrupt An SQLite Database File6.3.  Filesystem CorruptionSince SQLite databases are ordinary disk files, any malfunction in the
filesystem can corrupt the database.  Filesystems in modern operating systems
are very reliable, but errors do still occur.  For example, on 2013-10-01
the SQLite database that holds the
Wiki for Tcl/Tk went corrupt a few days
after the host computer was moved to a dodgy build of the (linux) kernel
that had issues in the filesystem layer.  In that event, the filesystem
eventually became so badly corrupted that the machine was unusable, but
the earliest symptom of trouble was the corrupted SQLite database.howtocorrupt.html#_filesystem_corruption

àý…f˜hYˆa%How To Corrupt An SQLite Database File8.5.  Corruption following alternating writes from 3.6 and 3.7.SQLite version 3.7.0 introduced a number of new enhancements to
the SQLite database file format (such as but not limited to WAL).
The 3.7.0 release was a shake-out release for these new features. 
We expected to find problems and were not disappointed.

If a database were originally created using SQLite version 3.7.0,
then written by SQLite version 3.6.23.1 such that the size of the database
file increased, then written again by SQLite version 3.7.0, the database
file could go corrupt.

This problem was fixed on 2010-08-04 for SQLite version 3.7.1.howtocorrupt.html#_corruption_following_alternating_writes_from_3_6_and_3_7_…^˜g
Yo‰        How To Corrupt An SQLite Database File8.4.  Database pages leak from the free page listWhen content is deleted from an SQLite database, pages that are no
longer used are added to a free list and are reused to hold content
added by subsequent inserts.  A bug in SQLite that was present in
version 3.6.16 through 3.7.2 might cause pages to go missing out of
the free list when incremental_vacuum was used.  This would not cause
data loss.  But it would result in the database file being larger than
necessary.  And it would cause the integrity_check pragma to report
pages missing from the free list.

This problem was fixed on 2010-08-23 for SQLite version 3.7.2.howtocorrupt.html#_database_pages_leak_from_the_free_page_listˆC˜fYŽ/How To Corrupt An SQLite Database File8.3.  I/O error while obtaining a lock leads to corruptionIf the operating system returns an I/O error while attempting to obtain
a certain lock on shared memory in WAL mode then SQLite might fail 
to reset its cache,
which could lead to database corruption if subsequent writes are attempted.

Note that this problem only occurs if the attempt to acquire the lock
resulted in an I/O error.  If the lock is simply not granted (because some
other thread or process is already holding a conflicting lock) then no
corruption will ever occur.  We are not aware of any operating systems that
will fail with an I/O error while attempting to get a file lock on shared
memory.  So this is a theoretical problem rather than a real problem.
Needless to say, this problem has never been observed in the wild.  The
problem was discovered while doing stress testing of SQLite in a test
harness that simulates I/O errors.

This problem was fixed on 2010-09-20 for SQLite version 3.7.3.howtocorrupt.html#_i_o_error_while_obtaining_a_lock_leads_to_corruption…S˜eYˆ/+How To Corrupt An SQLite Database File8.2.  Corruption following switches between rollback and WAL modesRepeatedly switching an SQLite database in and out of WAL mode
and running the VACUUM command in between switches, in one process or
thread, can cause another process or thread that has the database file
open to miss the fact that the database has changed.  That second process
or thread might then try to modify the database using a stale cache and
cause database corruption.

This problem was discovered during internal testing and has never been
observed in the wild.  The problem was fixed on 2011-01-27 and in version
3.7.5.howtocorrupt.html#_corruption_following_switches_between_rollback_and_wal_modes
®žE®ƒ˜¥1       Q#…5The Carray() Table-Valued Function1. OverviewCarray() is a table-valued function with a single column (named
"value") and zero or more rows.
The "value" of each row in the carray() is taken from a C-language array
supplied by the application via parameter binding.
In this way, the carray() function provides a convenient mechanism to
bind C-language arrays to SQL queries.carray.html#overviewT˜jY/uIHow To Corrupt An SQLite Database File8.7.  Boundary value error in the secondary journals used by nested transactions.When a nested transaction is started using SAVEPOINT, SQLite uses
a secondary rollback journal to track the changes for the nested
transaction, in case the inner transaction needs to be rolled back.  Secondary
journals are not involved in protecting the database from corruption due
to program crashes or power outages.  The secondary journals only come into
play when rolling back an inner transaction of a nested transaction.

These secondary journals can be held either in memory or as temporary
files on disk.  The default behavior is to store them on disk.  But that 
can be changed using the -DSQLITE_TEMP_STORE compile-time option,
or at run-time using the PRAGMA temp_store statement.  The bug
only arises when secondary journals are held in memory.

In SQLite version 3.35.0 (2021-03-12), a new optimization was
added so that when SQLite is holding secondary journals in memory,
less memory will be used. Unfortunately, an boundary check in
the new logic was coded incorrectly.
What should have been a "&lt;" operator was coded as "&lt;=".  This
error might cause the secondary journal to enter an inconsistent state
if it is ever rolled back.  If additional changes are made and the
outer transaction eventually commits, the database might be left in
an inconsistent state.

This problem was discovered by an 
independent researcher
who was attempting to find bugs in SQLite using a fuzzer.  The fuzzer found a
failure in an assert() statement that is used
to help verify the internal state of the secondary journal.  The bug was a
sufficiently obscure corner-case that it might have gone unnoticed for many
years, had it not been for the intensive use of assert() statements in SQLite,
the persistence and tenacity of the security researchers, and their
customized state-of-the-art fuzzer.

This problem was fixed
in version 3.37.2 (2022-01-06).
This page last modified on  2022-02-12 22:18:19 UTChowtocorrupt.html#_boundary_value_error_in_the_secondary_journals_used_by_nested_transactions_ˆ]˜i
Ys
How To Corrupt An SQLite Database File8.6.  Race condition in recovery on windows system.SQLite version 3.7.16.2 fixes a subtle race condition in the locking
logic on Windows systems.  When a database file is in need
of recovery because the previous process writing to it crashed in the
middle of a transaction and two or more processes try to open the 
that database at the same time, then the race condition might cause
one of those processes to get a false indication that the recovery 
has already completed, allowing that process to continue using the
database file without running recovery first.  If that process writes
to the file, then the file might go corrupt.  This race condition
had apparently existed in all prior versions of SQLite for Windows going
back to 2004.  But the race was very tight.  Practically speaking, you
need a fast multi-core machine in which you launch two processes to run
recovery at the same moment on two separate cores.  This defect was
on Windows systems only and did not affect the posix OS interface.howtocorrupt.html#_race_condition_in_recovery_on_windows_system_
VMr%VƒJ˜¥5  Q†/The Carray() Table-Valued Function4. UsageThe carray() function can be used in the FROM clause of a query.
For example, to query two entries from the OBJ table using rowids
taken from a C-language array at address $PTR.

SELECT obj.* FROM obj, carray($PTR, 10) AS x
 WHERE obj.rowid=x.value;


This query gives the same result:

SELECT * FROM obj WHERE rowid IN carray($PTR, 10);

This page last modified on  2020-11-18 14:36:04 UTCcarray.html#usageŽH˜¥4       QC›MQThe Carray() Table-Valued Function3.1. Single-Argument CARRAYThe single-argument form of carray() requires a special C-language
interface named "sqlite3_carray_bind()" in order to attach values:


  int sqlite3_carray_bind(
    sqlite3_stmt *pStmt,         /* Statement containing the CARRAY */
    int idx,                     /* Parameter number for CARRAY argument */
    void *aData,                 /* Data array */
    int nData,                   /* Number of entries in the array */
    int mFlags,                  /* Datatype flag */
    void (*xDestroy)(void*)      /* Destructor for aData */
  );


The mFlags parameter to sqlite3_carray_bind() must be one of:


  #define CARRAY_INT32   0
  #define CARRAY_INT64   1
  #define CARRAY_DOUBLE  2
  #define CARRAY_TEXT    3


Higher order bits of the mFlags parameter must all be zero for now,
though they may be used in future enhancements.  The definitions for the
constants that specify the datatype and a prototype for the
sqlite3_carray_bind() function are both available in the auxiliary
header file
ext/misc/carray.h.

The xDestroy argument to sqlite3_carray_bind() routine is a pointer
to a function that frees the input array.  SQLite will invoke this
function after it has finished with the data.  The xDestroy argument
may optionally be one of the following constants defined in
"sqlite3.h":



     SQLITE_STATIC &rarr;  This means that the application that invokes
     sqlite3_carray_bind() maintains ownership of the data array and that
     the application promises SQLite that it will not change or deallocate
     the data until after the prepared statement is finialized.


     SQLITE_TRANSIENT &rarr;  This special value instructs SQLite to make
     its own private copy of the data before the 
     sqlite3_carray_bind() interface returns.carray.html#single_argument_carray…V˜¥3    Q!Š)3The Carray() Table-Valued Function3. DetailsThe carray() function takes one, two, or three arguments.

For the two- and three-argument versions of carray(),
the first argument is a pointer to an array.  Since pointer values cannot
be specified directly in SQL, the first argument must be a parameter that
is bound to a pointer value using the sqlite3_bind_pointer() interface
using a pointer-type of "carray".
The second argument is the number of elements in the array.  The optional
third argument is a string that determines the datatype of the elements
in the C-language array.  Allowed values for the third argument are:


 'int32'
 'int64'
 'double'
 'char*'


The default datatype is 'int32'.carray.html#detailsƒ.˜¥2        Q+…E=The Carray() Table-Valued Function2. AvailabilityThe carray() function is not compiled into SQLite by default.
It is available as a loadable extension in the
ext/misc/carray.c
source file.

The carray() function was first added to SQLite in version 3.14
(2016-08-08).  The sqlite3_carray_bind() interface and the
single-argument variant of carray() was added in SQLite version 3.34.0
(2020-12-01).carray.html#availability
m(m“6˜µ        5'¥w;SQLite Autoincrement2. BackgroundIn SQLite, table rows normally have a 64-bit signed integer ROWID
which is unique among all rows in the same table.
(WITHOUT ROWID tables are the exception.)



You can access the ROWID of an SQLite table using one of the special column
names ROWID, _ROWID_, or OID.
Except if you declare an ordinary table column to use one of those special
names, then the use of that name will refer to the declared column not
to the internal ROWID.



If a table contains a column of type INTEGER PRIMARY KEY, then that
column becomes an alias for the ROWID.  You can then access the ROWID
using any of four different names, the original three names described above
or the name given to the INTEGER PRIMARY KEY column.  All these names are
aliases for one another and work equally well in any context.



When a new row is inserted into an SQLite table, the ROWID can either
be specified as part of the INSERT statement or it can be assigned
automatically by the database engine.  To specify a ROWID manually,
just include it in the list of values to be inserted.  For example:


CREATE TABLE test1(a INT, b TEXT);
INSERT INTO test1(rowid, a, b) VALUES(123, 5, 'hello');



If no ROWID is specified on the insert, or if the specified ROWID has a value
of NULL, then an appropriate ROWID is created
automatically.  The usual algorithm is to give the newly created row
a ROWID that is one larger than the largest ROWID in the table prior
to the insert.  If the table is initially empty, then a ROWID of 1 is
used.  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.
If no unused ROWID can be found after a reasonable number of attempts,
the insert operation fails with an SQLITE_FULL error.
If no negative ROWID values are inserted explicitly, then automatically 
generated ROWID values will always be greater than zero.



The normal ROWID selection algorithm described above
will generate monotonically increasing
unique ROWIDs as long as you never use the maximum ROWID value and you never
delete the entry in the table with the largest ROWID. 
If you ever delete rows or if you ever create a row with the maximum possible
ROWID, then ROWIDs from previously deleted rows might be reused when creating
new rows and newly created ROWIDs might not be in strictly ascending order.autoinc.html#background‡S˜µ 5!Ž=5SQLite Autoincrement1. SummaryThe AUTOINCREMENT keyword imposes extra CPU, memory, disk space,
  and disk I/O overhead and should be avoided if not strictly needed.
  It is usually not needed.

  In SQLite, a column with type INTEGER PRIMARY KEY is an alias for the ROWID
  (except in WITHOUT ROWID tables) which is always a 64-bit signed integer.

  On an INSERT, if the ROWID or INTEGER PRIMARY KEY column is not 
  explicitly given a value, then it
  will be filled automatically with an unused integer, usually
  one more than the largest ROWID currently in use.
  This is true regardless of whether or not the AUTOINCREMENT keyword is used.

  If the AUTOINCREMENT keyword appears after INTEGER PRIMARY KEY, that
  changes the automatic ROWID assignment algorithm to prevent
  the reuse of ROWIDs over the lifetime of the database.  In other words,
  the purpose of AUTOINCREMENT is to prevent the reuse of ROWIDs from
  previously deleted rows.autoinc.html#summary
|Ê|†I˜ÄQ 9+ŒAList Of Virtual Tables1. IntroductionA virtual table is an object that presents an SQL table
interface but which is not stored in the database file, at least
not directly.  The virtual table mechanism is a feature
of SQLite that allows SQLite to access and manipulate resources
other than bits in the database file using the powerful SQL
query language.


The table below lists a few of the virtual tables implementations
available for SQLite.  Developers can deploy these virtual tables
in their own applications, or use the implementations shown below
as templates for writing their own virtual tables.


The list below is not exhaustive.
Other virtual table implementation exist in the SQLite source tree
and elsewhere.
The list below tries to capture the more interesting virtual table
implementations.vtablist.html#introduction–1˜µ 5E«1YSQLite Autoincrement3. The AUTOINCREMENT KeywordIf a column has the type INTEGER PRIMARY KEY AUTOINCREMENT then a slightly
different ROWID selection algorithm is used.  
The ROWID chosen for the new row is at least one larger than the largest ROWID
that has ever before existed in that same table.  If the table has never
before contained any data, then a ROWID of 1 is used.  If the largest possible
ROWID has previously been inserted, then
new INSERTs are not allowed and any attempt to insert a new row will
fail with an SQLITE_FULL error.  
Only ROWID values from previous transactions that
were committed are considered.  ROWID values that were rolled back
are ignored and can be reused.



SQLite keeps track of the largest ROWID
using an internal table named "sqlite_sequence".
The sqlite_sequence table is created
and initialized automatically whenever a normal table that contains an
AUTOINCREMENT column is created.  The content of the sqlite_sequence table
can be modified using ordinary UPDATE, INSERT, and DELETE statements.
But making modifications to this table will likely perturb the AUTOINCREMENT
key generation algorithm.  Make sure you know what you are doing before
you undertake such changes.
The sqlite_sequence table does not track ROWID changes associated with
UPDATE statement, only INSERT statements.



The behavior implemented by the AUTOINCREMENT keyword is subtly different
from the default behavior.  With AUTOINCREMENT, rows with automatically
selected ROWIDs are guaranteed to have ROWIDs that have never been used
before by the same table in the same database.  And the automatically generated
ROWIDs are guaranteed to be monotonically increasing.  These are important
properties in certain applications.  But if your application does not
need these properties, you should probably stay with the default behavior
since the use of AUTOINCREMENT requires additional work to be done
as each row is inserted and thus causes INSERTs to run a little slower.


Note that "monotonically increasing" does not imply that the ROWID always
increases by exactly one.  One is the usual increment.  However, if an
insert fails due to (for example) a uniqueness constraint, the ROWID of
the failed insertion attempt might not be reused on subsequent inserts,
resulting in gaps in the ROWID sequence.  AUTOINCREMENT guarantees that
automatically chosen ROWIDs will be increasing but not that they will be
sequential.

Because AUTOINCREMENT keyword changes the behavior of the ROWID selection
algorithm, AUTOINCREMENT is not allowed on WITHOUT ROWID tables or on any
table column other than INTEGER PRIMARY KEY.  Any attempt to use 
AUTOINCREMENT on a WITHOUT ROWID table or on a column other than the
INTEGER PRIMARY KEY column results in an error.
This page last modified on  2017-02-02 23:55:23 UTCautoinc.html#the_autoincrement_keywordby the CLI to help implement tab-completion.
csv
A virtual table that represents a comma-separated-value or CSV file
    (RFC 4180) as a read-only
    table so that it can be used as part of a larger query.
dbstat
Provides information about the purpose and use of each page in a
    database file.  Used in the implementation of the
    sqlite3_analyzer utility program.
files_of_checkin
Provides information about all files in a single check-in in the
    Fossil version control system.  This
    virtual table is not part of the SQLite project but is included because
    it provides an example of how to use virtual tables and because it is
    used to help version control the SQLite sources.
fsdir
A table-valued function returning one row for each file in a
    selected file hierarchy of the host computer.  Used by the
    CLI to help implement the .archive command.
FTS3
A high-performance full-text search index.
FTS5
A higher-performance full-text search index
generate_series
A table-valued function returning a sequence of increasing
    integers, modeled after the table-valued function by the same
    name in PostgreSQL.
json_each
A table-valued function for decomposing a JSON string.
json_tree
A table-valued function for decomposing a JSON string.
OsQuery
Hundreds of virtual tables that publish various aspects of the
    host computer, such as the process table, user lists, active network
    connections, and so forth.
    OsQuery is a separate project, started by Facebook, hosted on
    GitHub, and intended for
    security analysis and intrusion detection
    OsQuery is not a part of the SQLite project, but is included in this
    list because it demonstrates how the SQL language and the
    SQLite virtual table mechanism
    can be leveraged to provide elegant solutions
    to important real-world problems.
pragma
Built-in table-valued functions that return the results of PRAGMA
    statements for use within ordinary SQL queries.
RTree
An implementation of the Guttmann R*Tree spatial index idea.
spellfix1
A virtual table that implements a spelling correction engine.
sqlite_btreeinfo
This experimental table-valued function provides information about
    a single B-tree in a database file, such as the depth, and estimated
    number of pages and number of entries, and so forth.
sqlite_dbpage
Key/value store for the raw database file content.  The key is the
    page number and the value is binary page content.
sqlite_memstat
Provides SQL access to the sqlite3_status64() and
    sqlite3_db_status() interfaces.
sqlite_stmt
A table-valued function containing one row for each
    prepared statement associated with an open database connection.
swarmvtab
An experimental module providing on-demand read-only access to
    multiple tables spread across multiple databases, via a single
    virtual table abstraction.
tables_used
A table-valued function that shows the tables and indexes that
    are accessed by a prepared statement.
tclvar
Represents the global variables of a 
    TCL Interpreter as an SQL
    table. Used as part of the SQLite test suite.
templatevtab
A template virtual table implementation useful as a starting point
    for developers who want to write their own virtual tables
unionvtab
An experimental module providing on-demand read-only access to
    multiple tables spread across multiple databases, via a single
    virtual table abstraction.
vfsstat
A table-valued function which, in combination with a
    co-packaged VFS shim provides information on the number of
    system calls performed by SQLite.
vtablog
A virtual table that prints diagnostic information
    on stdout when its key methods are invoked.  Intended for
    interactive analysis and debugging of virtual table interfaces.
wholenumber
A virtual table returns all integers between 1 and 4294967295.
zipfile
Represent a
    ZIP Archive
    as an SQL table.  Works for both reading and writing.  Used by
    the CLI to implement the ability to read and write ZIP Archives.


This page last modified on  2022-06-15 10:18:44 UTCvtablist.html#virtual_tables
b
Âb‚[˜Ü
        C#„99The UINT Collating Sequence2. Example:COLLATE binaryCOLLATE uint

'0000123457'
'123456'
'abc0000000010xyz'
'abc0010xyy'
'abc10xzz'
'abc674xyz'
'abc87xyz'
'abc9xyz'

'123456'
'0000123457'
'abc9xyz'
'abc0010xyy'
'abc0000000010xyz'
'abc10xzz'
'abc87xyz'
'abc674xyz'


This page last modified on  2020-05-14 00:36:17 UTCuintcseq.html#example_Š˜Ü           C#“)9The UINT Collating Sequence1. OverviewThe UINT collating sequences is a loadable extension for
SQLite that implements a new collating sequence that compares text
containing unsigned integers in numeric order.

 The UINT collating sequence is not a standard part of SQLite.
It must be loaded as a separate extension.  The source code to
UINT is in the uint.c source file
in the ext/misc/ folder of the
SQLite source tree.

 The UINT collating sequence is not included in standard builds of
the SQLite library, but it is loaded by default in the CLI.  This
is typical of the CLI which loads various extensions above and beyond
what are available in the standard SQLite library.

 The UINT collating sequence works just like the default
BINARY collating sequence 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 to integers that can be expressed as a
64-bit machine integer.uintcseq.html#overview¤˜ÄR      9/Ç'EList Of Virtual Tables2. Virtual TablesNameDescription
approximate_match
A demonstration of how to use a virtual table to implement
    approximate string matching.
bytecode
A table-valued function that shows the bytecodes of a prepared
    statement.
carray
A table-valued function that allows a C-language array of integers,
    doubles, or strings to be used as table in a query.
closure
Compute the transitive closure of a set.
completion
Suggests completions for partially-entered words during interactive
    SQL input.  Used W
FôèÝÑŹ-¡•‰~rfZOC7, üðäÙÍÁµ©‘…ymaUI=1%

ö
ë
à
Ô
È
¼
±
¦
›

„
y
n
c
X
L
@
4
(


úîâ×ËÀ´©’‡|qfZOC7+       ýñåÚÏĸ-¡–Šsg[OD8-"
ÿ
ó
è
Ü
Ñ
Å
¹
-
¢
—
‹

s
g
[
O
C
7
*


       ö       é       Ü       Ð       à       ·       «       ž       ‘       …       x       l       `       S       G       :       -                      úíàÓǺ®¡”ˆ|obUH;/#
ýðãÖɽ°£—Š}pdWK>2&ÿòåØ˾±¥˜ŒsfYL?3&
õèÜÏöªž’…xk^QD7*õèÛÎÀ³¦™‹~qdWJ=0# üïâÕÈ»®¡”‡zm`SF
‚ƒ1
‚ŒA
‚ƒk
‚ˆU
‚‚E
‚–W
‚„0
‚¹
‚›8
‚Þ
‚’x
‚…W
‚Q
‚“9
‚»E
‚n
‚™:
‚p
‚
‚w
‚“?
‚š@
‚
B
‚       ‘4
ŠV
‚£‚¥F
‚‡Q
‚”
‚‹‚‘<
‚†
‚‹p
ŸG~˜T
}¥
|
{
z-R
y‰k
x‰z
w„$
vœ*
u£8
t…6
s
‚>  r5     q!5     p Y
o„d    nb
m‚    l\
kƒB      j
8     iS
h      g{
f‰    e\
d ƒ~
c
b#
a    `H
_‚    ^
H
]1    \t
[X
Z
Y„

XB
WŠ
V
ƒ
U
T”

S‚(    R}     Q*
P‚      OX
N ‰    M3
L
V
K      
J„    I{
H ‚
Gƒ@    F:
EŠ
D‚X
C)”X
B‚N
A

@|    ?W     >     = .
<h
;
 
:…g
9‚E
8…j    7s       6 K
5S
4T    3 
2
?    1S
0<
/B
.      -"
,†N
+‚    * 2
)ƒ
(…
'
&2
%‚t
$L
#„J
"‚"    !      S

‚<
@    %
 ‚r
‚Y
…d
|
…)
‡X
d
‚
h    O
'    4     N
‡    z

d
B         
2
          ƒ4    *

‚V

ˆ
‚|

‚
‚C
ƒ(    /
C
~‚(
} 
|  *
{    ‚~
z  l
y
„U    xa      wX
vL
u       
t‚$       sg
r     q  &
pQ
o     n!-
m:     l}      kG
jƒL     i
2
h
|
gw
f
‰
eW     d=
c‚w     b  q
a     `%
_‚     ^  E     ]~      \  [
[
ZK
YP
X  '    Wp        V6
U.
Tk
Sr     R
Q     Pl        OY      N=      MY      L.
K1       JC
IB       H  }
G0     F5
E‚
D     C
B
A‚        @9
?  „1
>ƒ
=7
<‚j     ;Kq      :7      9      8-      7c
6  ‚+    5J      4  -     3*
2"
1
0     /<      .9
-ƒ       ,  "
+‚ 
*„a
)„|
(‚
'ƒA
&„8
%…S
$£C
#’u
"‰:
!‚u
 †       
 
†
„q
F
‚f     0
‡^
„^
‡Q
…G
ª8
–{     {
5
˜y     L
ˆ
‹/

R     .
‚L

Š
        „o


ƒz
Š
‚d     @
_
„R
 !óæÙÌ¿²¥˜‹~qdWJ=0#        üïâÕÈ»®¡”‡zm`SF9,
ø
ë
Þ
Ñ
Ä
·
ª


„
w
j
]
P
C
6
)


õèÛÎÁ´§š€sfYL?2%þñä×ʽ°£–‰|obUI</!
ú
í
à
Ô
Ç
º
-
 
“
†
y
l
_
R
E
8
+


       ÷       é       Û       Í       ¿       ±       ¤       –       ‰       {       m       _       Q       C       5       '              ÷êÜÎÀ³¥—Š|naTF8+ôæÙ˽°£•‡yk]OA3&ýðâÕǹ«‚tfYK=/"øêÜÎÀ²¤–ˆzm_QC6)óå×É»- ’„vi[M@3&ýðãÕǹ¬ž‚tfYK=/!
Ð
Ð3
Ð,
È"…    È!&
È ‚r
È       ~
È       „
Ȇp
ȃ'   Èk
È&
È„

Àp„_   Ào2    Àn=
Àm,
Àl   Àk:    Àj,    Ài1    ÀhY
ÀgA
ÀfŠh   Àee
ÀdK
Àc‚Y
Àb       „     Àa{
À`‚S
À_†V
À^Œi
À]ƒ
À\†
À[†k
ÀZ‚x   ÀYH    ÀX#    ÀW<    ÀVM
ÀUZ
ÀTƒ
ÀS:   ÀR
ÀQ‚?
ÀPJ
ÀO‚8
ÀNƒ.
ÀM
ÀL~
ÀK„
ÀJ
ÀI.
ÀHƒ
ÀGƒ
ÀFƒ   ÀEh
ÀDx
ÀC‚1
ÀB9   ÀAi
À@„
À?{
À>c   À==
À<‚0
À;‚
À:‚g
À9m   À8z
À7   À6t
À5B   À4v
À3?   À2\
À1†"
¸\ƒ"
¸[ƒ<
¸Z/
¸Y
¸Xx
¸W‚}
¸V‚=   ¸Ui    ¸T
¸S‚
¸R4     ¸Q
¸Pb
¸O<
¸N+
¸M…-   ¸Lt    ¸K5
¸J|
¸I"   ©I      ©z
¨
¨~ƒ     ¨}j
¨|k
¨{…!     ¨z_
¨y
™0V
™/ƒ]   ™.I    ™-!
™,
™+   ™*3    ™)^
‘D‚+
‘Cc
‘B       g
‘Aƒo
‰Z‚)
‰Yq
z#
yƒu   xJ
w‚'
v‚8
uf
t…b
s„+
r‚
qƒ5
Žú?
Žúm
Žú‚4
Žú       ‚
Žú„Y
Žú
Žúa
Žú
       Žút
Žú   ŽúV
Žú

Žú
Žú 
Žú

Žú      ƒt
ƒŠo
ƒm
ƒŽ8
ƒ…
Ġ9
ƒƒ&
ƒ‡|
ƒ„U
ƒ„
ƒ
¨
ƒ‰{
ƒ)
ƒ
…L
ƒ       ñP
‚V
ƒ²C
ƒ–7    ƒ
ƒ…
ƒÕL
ƒ’m
ƒ‡J
ƒ™>‚‚Œ:
‚~…a
‚}ŠR    ‚|
‚{>
‚z’}
‚y–e
‚x„!
‚w±^
‚vŠW
‚u‰>
‚tá!
‚s„B
‚r
‚qŸ<
‚p‡
‚o¤O
‚nŠ?
‚m‚6
‚l…
‚kƒE
‚jŠ<
‚i„E
‚hÒR
‚gÆH
‚f–
‚e}
‚d«.
‚c«[
‚b”X
‚a*
‚`‹;
‚_Œx
‚^„t
‚]"
‚\Ÿ 
‚[ C
‚ZŽ
‚YŽo
‚X
‚W~
‚Vó~
‚UªX
‚T–7
‚S©=
‚Rˆq
‚QƒV    ‚P
‚Oƒ"
‚Ns
‚Mƒ
‚L…l
‚K ‘y
‚J†
‚Iš
‚H‹u
‚G‚8
‚F”
‚E‚l
‚D„,
‚CÐo
‚B
‚A‰
‚@"
‚?¨
‚>†

‚=‘Y
‚<‰k
‚;‰
‚:„U
‚9…
‚8O
‚7ˆ@
‚6…J
‚5‰K
‚4Œ~
‚39
‚2ƒ
‚1†
‚0
‚/ƒS
‚.‡,
‚-ƒ%
‚,-K
‚+“
‚*Šx
‚)…)
‚(‡T
‚'Œr
‚&
‚%Ñ

‚$j
‚#C
‚"…6
‚!¢
‚ y
óå×ʽ°¢”‡yk]OB4'þðãÕȺ- “†xj\NA3&

ý
ð
ã
Ö
È
º
¬
ž

‚
t
f
X
J
<
.
 

öèÚÍ¿±£–ˆzm`SE7)
ÿòäÖÈ»® ’„wj]PB4'
þ
ð
â
Ô
Æ
¸
ª
œ
Ž

t
g
Y
K
>
0
"

       ú       ì       ß       Ñ       à       ¶       ¨       ›                     r       e       X       K       >       0       #              ÷éÛÎÀ²¤–ˆ{m`SE8*ôçÙ˽¯¢”†yl_RD6(þðãÕǺ-Ÿ‘ƒugZM?1$úìÞÐõ¨šŒ~pbTG9+ôçÚÍÀ²¤–ˆzm_QD6(
ÿòå×ʼ®¡“†yl_QD6) ’ÖTs    ’ÖSm
’ÖR     ’ÖQ&
’Îk„   ’Îjx    ’Îig    ’¿K      ’¿z
’¿   ’¿j
’ˆF'
’ˆEƒ7   ’ˆDJ
’ˆC   ’ˆBR    ’ˆA$
’€`‚`   ’€_I
’€^       C
’€]q
’€\‚6   ’€[
’€Zo
’€Y+   ‘ÙT.
‘ÙS,
‘ÙRs
‘ÙQ^
Լ;(
Լ:,   Լ9q      Լ8F      Լ7^    Լ6N    Լ5k
Լ4d
Լ35
Լ2
Լ1&
‘²L   ‘²K/
‘²J
‘²I
Իe
‘ªdƒ#
‘ªc‚
ԻbE   ԻaG
‘¢z‚     ‘¢y9
‘›‹&
‘›6
‘›
‘›
ƒ1
‘›‚
‘›ƒ   ‘“,
‘“+
‚
‘“*c   ‘“)    ‘‹gy
‘‹f
‘‹e]
‘‹dD
‘‹c‚C
‘‹b   ‘‹aG    ‘‹`j
‘‹_Y
‘‹^
   ‘‹]%
‘‹\
‘‹[ƒ5
‘‹Z‚
‘‹YB
‘‹Xy
‘‹W‚

‘‹V‚   ‘‹U!    ‘‹T    ‘‹SC    ‘‹R]
‘‹Q#
‘‹P‚   ‘‹O]
‘‹NS
‘‹M‚
‘‹L
‘‹KU   ‘‹JD    ‘‹I    ‘‹H'
‘‹Gƒ
‘‹F‚
‘‹E‚   ‘‹DE
‘‹C„M   ‘‹B<    ‘‹AI
û|ƒf   û{-
ûz
ûy”
ûx
ûw˜u
ûv‡3   ûuI
ût–&
ûs…
ûr†   ûq^
ô1   ô(
ô
F     ôz
ô\
ôU
ôƒ
ô
U   ô9    ôK
ô
‚{
ô      w
ì#‚[
ì"
ì!W   Ü_-      Ü^       7      Ü]
L
Ü\‚
Ü[‚d   ÜZ
r
ÜY‚   ÜXp    ÜWk      ÜV;    ÜU[    ÜTl
ÜSƒ*
ÜR   ÜQj
Ôk¹z   Ôj
Ôi#
¥|
˜"     ¥{
7
¥z     ¥yD    ŽEa
ŽD„"
ŽCA
ŽBƒ,   ŽAS
†o‚H
†n       ƒv     †m       )      †l=    †k%
†j]
†iV
†h=
†gB
†fƒ>
†eƒ
†d‚v
†c
†b
†a    †`    †_2
†^
†])   †\|    †[o    †ZY    †Yo
ÿ
ÿ‚
ÿ‚   ÿ      ÿ8
ÿƒ~
ÿb
ÿˆ.   ÿD
ÿƒ
ÿƒl
ÿ‰r
ÿƒ8
ÿ‚R
ÿ
/   ÿS    ÿ~    ÿ
]
ÿ      ‚
       ÿX
ÿ‚*
ÿ‰(
ÿ‚K   ÿS
ÿ‚R
ÿ….
ÿ       †h
þ
þ~†P
þ}‚~
þ|ƒ
þ{       ‚
þz       „R
þyŠC
þx‚
þw‚
þv†y
þu„t
þtƒK
þs‚J
þr‚
þq   ÷    ÷3    ÷
\      ÷ 
÷S
÷
ƒ;      ÷      Y
ï0   ï/8
ï.
ï-‚}
ï,       ƒo
ï+

     ï*B      ï)
`      ï(P    ï'x
ï&   ï%B
ï$B   ï#
ï"‚   ï!9
ßZün
ßY‰Z   ßXQ
ßWP   ßV{
ßUE
ßT‚\
ßS"
ßR            ßQd
Ð
Ð
R      Ð             <      Ðj
Ð?
Ð   ÐD
óå×É»®¡“…xk]OB4'
óå×ɼ¯¢•ˆ{m_RD6(

ÿ
ò
å
×
É
»
-
 
’
„
w
i
[
M
?
1
#
úíàÒÄ¶©›€seXJ</!ùëÝÐõ¨›ŽtfXK>1#
ú
ì
ß
Ñ
Ã
µ
§
™
‹
}
p
b
T
G
:
,


       ö       è       Ú       Í       À       ³       ¥       —       Š       |       n       `       R       D       6       (              õçÙ̾°¢”†xj\NA4&
ýðâÔǹ¬Ÿ‘ƒuhZL>1#ùëÝÏÁ³¥—Š|obUG:- øëÞÑö©œ‚ugZM?2%
üîàÓƹ«seXJ=/!÷éÜÎÀ²¥—Š|oaTF8*
•¶‚x
•¶‚
•¦Q‚
•¦P…   •¦O_
•¦NL   •¦Md
•¦Lf   •¦KV
•¦J
t     •¦I
•žn2
•žmj
•žlƒ     •žkG
•žjƒn
•ži„ 
•žh5
•žg‚
•žf‚Y
•že‚   •žd~
•žc„I   •žb2
•žaP
•‚=
•‚g
•q
•ƒ.
•‚>   •g    •    ”ÿK'
”ÿJ
”ÿI‚/
”ÿHH   ”ÿG       d
”ÿFt   ”ÿE8    ”ÿDU
”ÿCw   ”ÿBf    ”ÿAd
”÷nl   ”÷mO    ”÷l~    ”÷k=    ”÷jN    ”÷iN    ”÷h,
”÷g     ”÷fG    ”÷e    ”÷dt    ”÷c    ”÷bp
”÷a‚   ”÷`F    ”÷_    ”÷^P
”÷]   ”÷\K    ”÷[)    ”÷Z0
”÷Y)   ”èo
”è†O
ӏl
”èŠ
ӏ:
”è‚x
”è„o
ӏ
‚
”è‚N
”è‚>
ӏ
‚

”è      „
      ӈ,d
”à+ƒd
ӈ*3
”à)„&   ”à(
”à'‚5
”à&‚W
”à%‚}   ”à$u    ”à#6
ӈ"A   ӈ!Z
”ØL       ‚
ӯKT   ӯJ    ӯIy
”ØH†S
”ØGƒc
”ØF‚g   ”ØEH    ”ØD:
ӯCe
”ØB„
”ØA       ‚I
ӯ@O
”Ø?‚R
ӯ>N
ӯ=
ӯ<D
”Ø;‚   ”Ø:5
ӯ9f
”©J‚N   ”©I?
”¡d‚L
”¡c              ”¡b9    ”¡aK    ”š        M
”š        ‚    ”š
   +     ”š         i
”          6
”š        +    ”š       -       ”š                <
”š            ”š             ”š             ”š             ”š        o     ”™        a     ”™~         
”™}        F
”™|            ”™{        '
”™z        ^
”™y        $
”’-
”’       
”’
”’       
”’!   ”‚Ht
”‚G`
”‚Fw   ”‚E<    ”‚Dk    ”‚Ci
”‚B
”‚Aƒw   “ú[Y    “úZF
“úY

“ÛhA
“Ûgƒ&     “ÛfF    “ÛeG
“Ûd;
“Ûc‚   “Ûb;
“Ûao
“Û`„
“Û_y
“Û^       ‚I
“Û]C
“Û\
“Û[‚>   “ÛZL
“ÛY‚

“ÛX       „>
“ÛW~   “ÛV!
“ÛU   “ÛT~    “ÛSU    “ÛRs
“ÛQ
“ÛPZ     “ÛOS    “ÛN?    “ÛMN    “ÛLz    “ÛK       %
“ÛJo   “ÛIz    “ÛHG
“ÛGl
“ÛFƒ   “ÛEK      “ÛD5
“ÛCi
“ÛB

       “ÛA`
“Û@^
“Û?   “Û>~
“Û={   “Û<}    “Û;5
“Û:Š
“Û9]   “Ób:
“Óa‚

“Ó`       F
“Ó_
‚     “Ó^)      “Ó]F
“Ó\‚8   “Ó[~
“ÓZD
“ÓY       ƒ
“ÓX\
“ÓWƒ(
“ÓVƒu
“ÓUk
“ÓTƒ   “ÓS
“ÓR‚H
“ÓQc   “Ël6
“Ëk‚B
“Ëj…     
“Ëi
“¬R„   “¬Q9    “¬P
“¬O‚i
“¬N‚,   “¬M      
“¬L
/
“¬Kƒ1
“¬JB   “¬Iu
“œ
ƒ@
“œ~‚   “œ};    “œ|Y    “œ{_    “œz^    “œyS    “…H       m
“…Gƒ
“…F„#
“…E„   “…Dz    “…C0    “…B{    “…AH    ’ý^J
’ý]   ’ý\x
’ý[       q
’ýZ‚y   ’ýY       N      ’õsI
’õrf
’õqƒ   ’îB    ’îv
’î
‚~
’î
’îo
’î
      ’î      Z
òä×É»-Ÿ‘„vh[M@2$úìÞд¦˜Š|oaSE7*
ó
å
×
É
»
-
Ÿ
‘
ƒ
u
g
Y
K
=
/
!

øêÜÎÀ²¤–ˆ{m_QC5'þðãÕȺ¬ž‚tfXJ=/"
ú
í
ß
Ò
Ä
·
©
›
Ž

t
g
Y
K
=
/
!

       ÷       é       Û       Í       À       ²       ¤       —       ‰       {       m       _       Q       C       6       )                     ýðãÖȺ¬ž‚tfYK>1#úíàÓÅ·©œ‚tfXK=0"ûîáÓƸªœŽ€seXJ=/"úíàÓÅ·©›ŽtgYK=0"ùìßÒŸ«ƒugYK=/!ùëÞд¦˜‹~pbTF9+
—z…-
—y     —‰
—‰
—‰U
—‰C
—‰   —‰    —‰f
—‰,
—‰       j
—‰

—‰‚d
—‰       ‚     —‰A
—‰R   —0n
—/‚   —.e
—-ˆ
—,„B
—+‚Y
—*f
—)O
–ùC‚3
–ùB   –ùAT    –ÚkN
–Újƒ=   –ÚiX    –ÚhH    –Úgh    –ÚfD    –ÚeJ    –Úd=
–Úc
       –ÚbV
–Úa‚
–Ú`.   –Ú_M
–Ú^N
–Ú]
–Ú\„   –Ú[Z    –ÚZ1    –ÚY    –ÚXM
–ÚWu
–ÚV6
–ÚUV
–ÚT   –ÚSD    –ÚRO    –ÚQ@    –ÚP    –ÚO?
–ÚN*   –ÚM

–ÚLƒq   –ÚK
–ÚJ‚   –ÚI3
–ÚH‚   –ÚG!
–ÚF‚
–ÚE‚Z
–ÚD„N
–ÚC‚
–ÚB‚   –ÚAb
–Ú@S   –Ú?T    –Ú>    –Ú=j    –Ú<=    –Ú;.
–Ú:D   –Ú9

–Ú8   –Ú7
–Ú6%
–Ú5n
–Ú4
       –Ú3k    –Ú2v    –Ú1L
–Ú05
–Ú/*
–Ú.?   –Ú-)    –Ú,    –Ú+H    –Ú*@
–Ú)
–Ú(F
–Ú'ƒ
   –Ú&G    –Ú%%
–Ú$ƒ    –Ú#`
–Ú"t
–Ú!‡@
–ÊYp
–ÊX
–ÊW
–ÊV       …
–ÊU       
–ÊT‚     –ÊSd    –ÊRq    –ÊQ7
–»;
–»~
–»     –»j
–»   –»?
–³)‚[
–³(
ƒX
–³'       ‡=
–³&
–³%     –³$]    –³#p
–³")
–³!‚q
–³ U   –³a
–³
–³w     –³       j      –³G    –³+    –³m    –«6Q
–«5i
–«4‚>
–«3
–«2
l
–«1‚0
–›d‚   –›c3
–›b       
–›a   –ŒV
–Œ
‚
–Œ@
–ŒX
–Œ‚z
–Œ!
–„+F
–„*B
–„)1
•üdƒ

•üc)
•üb   •üa&    •ü`(    •ü_X    •ü^\
•ü]ƒq
•ü\‡    •ü[9
•üZ   •üYi
•üXO   •üW4    •üVL
•üU   •üTd    •üSg
•üR
‚[     •üQi
•üP‡,
•üO‡N
•üN†\
•üMƒ
•üL[
•üKM
•üJ<
•üI…
•üH?   •üGE
•üF†P   •üEj
•üDU   •üC
•üBV
•üA‚J
•ôs
•ôrX
•ôq
•ôpp
•ôo$
•ôn„   •ôm0
•ôl‚8
•ôk‚e
•ôj…
•ôi,
•ôh
•ôg     
•ôf‚\
•ôe)
•ôd‚h
•ôc
‚3     •ôb
,
•ôa†w
•ô`D
•ô_…
•ô^‡X
•ô]„
•ô\
•ô[‚7
•ôZƒ     
•ôY
•ì{‚
•ìz
•ìy6
•ìx„{
•ìw]
•ìvy
•ìu+   •ìt}
•ìs„U
•ìr       !     •ìq7
•Ý)‚=
•Ý(„J
•Ý'‰3
•Ý&„Z   •Ý%{
•Ý$‡E
•Ý#‚D
•Ý"‰+
•Ý!3
•ÕG
•ÕF       …g
•ÕEs
•ÕD`
•ÕC       ‰'
•ÕB‚c
•ÕA       ƒ
•Õ@‚#
•Õ?ƒ/
•Õ>ƒ            •Õ=j
•Õ<ƒ
       •Õ;z
•Õ:‚%
•Õ97   •¾
•¾ƒ=
•¾2
•¾^
•¾‚
•¾C   •¾a
•¶…
•¶‚d
Ö›òäÖɼ®¡”‡yl_QC6(þðãÕǺ¬ž‚tfXJ<. 
÷
é
Û
Í
¿
±
£
•
‡
z
l
^
Q
C
5
'

þñä×Ê½¯¡“…xk]PB4&
üîàÒĶ¨šŒ~pbTG:,
õ
è
Û
Î
À
²
¤
–
ˆ
z
l
^
Q
C
6
)


       ô       æ       Ù       Ë       ¾       °       £       –       ˆ       {       n       `       S       F       9       ,                     þðâÔǹ«‚tgYK=/!ùìÞÐö©œŽ€rdVI;- ùëÞÑö©›ŽsfYK=0#ûíßÑĶ¨›      ˜Ü

˜Ü      J
˜ÄR…9   ˜ÄQ{
˜µƒ5
˜µƒ(
˜µ   ˜¥5K
˜¥4e   ˜¥3j    ˜¥2=    ˜¥19
˜j
‚B
˜i       (     ˜hj    ˜g
l
˜f'   ˜e
^      ˜d       h
˜cA   ˜b~    ˜aa
˜`
       ˜_}    ˜^4
˜]   ˜\L    ˜[b    ˜Z%    ˜YZ
˜X
‚h
˜W;   ˜V
|
˜UB
˜TU
˜S
˜RG
˜Q‚&   ˜P       Q      ˜O/    ˜N|      ˜Mx
˜L

˜K
‚   ˜J       "      ˜I[    ˜Žy
˜‚
˜~‚
˜}H
˜|‚E
˜{-
˜zƒB   ˜yh
—þ[‚N
—þZy   —þY~
—þX

—þWC
—þVƒ*   —þUU
—þT†Q
—þS„N
—þR‚B
—þQp
—þP„

—þO‚:
—þNC   —þM       U
—þL„>
—þK‚b
—þJA
—þI"
—þHC
—þGk
—þF‚Q
—þE„O   —þD/
—þC„>   —þBM
—þA—+
—þ@‚r
—þ?V   —þ>      —þ=E    —þ<_    —þ;    —þ:N    —þ9z    —þ8;
—þ7‚            —þ6Y    —þ58
—þ4u   —þ3t    —þ2F
—þ1&   —þ0r
—þ/   —þ.1
—þ-‚%
—þ,ƒ   —þ+u    —þ*0    —þ)    —öCQ    —öB[
—öA$   —îo'
—înU
—îm       
—îlƒ^
—îkF
—îj‚Z
—îiu
—îh„o
—îg‚6   —îfo      —îe^    —îd~
—îck
—îb‚/   —îaK
—î`‚
—î_   —î^    —î],
—î\‚_
—î[…#
—îZƒ&
—îY
—æy
—æx.
—æw

—ævƒf
—æuƒ|
—æt†B
—æs/
—ær)
—æq9
—Ïd
—Ïc
—Ïb       7
—Ïa=
—Ï`‚~   —Ï_J
—Ï^'   —Ï]    —Ï\I
—Ï[5
—ÏZ„9
—ÏYƒ:
—ÏX       ‚
     —ÏWE    —ÏV!    —ÏU      —ÏT;    —ÏS}    —ÏR,
—ÏQƒ.
—ÏPL
—ÏO
—ÏN&
—ÏMƒX   —ÏL       
—ÏK
—ÏJo   —ÏI       G
—ÏH5
—ÏG‚
—ÏF       ƒB
—ÏE‚
—ÏD:
—ÏCM
—ÏB‚S
—ÏA‚6
—Ï@„5
—Ï?     —Ï>#
—Ï=&
—Ï<0
—Ï;…1
—Ï:‚,
—Ï9‚W
—ÇZ<
—ÇY‚X
—ÇX]
—ÇW@
—ÇV
—ÇU„6   —ÇT[
—ÇS:
—ÇR‚m   —ÇQS
—¿n*
—¿m
—¿l‚
—¿k!
—¿j   —¿iS
—¸“J
—¸o   —¸m    —¸{
—¸&     —¸(    —¸0    —¨49
—¨3ƒ]   —¨2M    —¨1k
—}B
—|„
—{'
âóâ
$LL—ƒÂ
""ŸV„€€€€¿000P
### (#
')2


[cX
&
#)    )  (9!99
&
&&YH$!!/S
    +,"
G'{w'b

          0ƒMˆtƒvi0a†sNNd†sQQ&bb9c9ce4f465e6ac321ced2a9d0062dc364669’        1‚?
WIMI[?‚7h‚K))&8d317b1257ce68a92908b05c9c7cf1494050d0   2Q|‚/q[<‚z"t‚+49d9aecf69948d†HH%ea166372bdb2ef9d8dfbb05e78a97609673a8        3/$ƒ[‚ƒe>-.1e262a89b6a9d21111>6ebf729e4b21035d7f4f8e35a6f705e6bf99887889e2dc14ebf2242e7930ddˆ      4,

^‚ot777:C@`925dee41a21f†'&ac0b75b1716541b2b97704f4809cb7ef19cccf‰       5QE:Cz‚'‚]

v‚Eg3D&b4b1f2a937c06c90db70c09890038f6c98ec40       6k(>‚'\>ƒ‚q‚\
796225f59c057cˆ&d77b42a3e70609f8d4bbb97caf53652f1082cb‰7d‚!*P†Bm%d6a0453dŽP8 ƒ7AN13JL‚7c>X9;‚_‚6‚Q~‚-|v:*b&1570e46d04e84b67228e0bdbcd6e1fb60c6bdb‘U     3420fc0eb7cba7†.
4d39a4c95ee4Ž'a54d76566728c2ba96292a49b138e4f69a7c391a%6693a3c24aa3217098afab1b6fecccdedfd23Ž      'b34f0de356a3f21b9dfc761f3b7821b6353c570?c1fcf4711a2e66c813aed38cf41cd3e2123ee8eb6db98118086764c4ba83350„       4df46116e90f92‰_>55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2171d†Q     d3200f4f3bcd3a3...=84704e1c66026228336d1e91771d295bf688c9c44c7a44f25a4c16c26ab3c† eab1ac759‰b70d77cb05bb2272N>ca3dd3d38b31c92b49ca2d311128b74584714d9e7de895b1a6286ef959a1dd…  >e482a1e0eae22e08edc8978c9733a96603d4509645f348ebf55b579e89636b‡4  ?fbac6b6999f894184899431fb77b9792324c61246b2a010d736694ccaa6d613Sc59f908bPx00ˆ_123abcŽ-
8000000000000000ˆ\e000•1
‚!!!!!!!r‚0
z!3D>‚3*    ‚8
w  f/j$0 2^
M4‚bSEvs-}3[:
*A0ˆ;„…Fx
‚w24Š+‡879ad19993d13fa„D>e20c0b43500cfb9bbc0eaa061c57514f715d87238f4d835880cd846b9ebd1fƒ@     fb063b11ŽS1 1Nƒ4o‚EJs-?<'UXMw@3*0(&36863c76576110e710dd5d69ab6bf347c65e36‰1   &8a3b35693b134d56ebd780123b7fd6f1497668Q   >c14992660d5ac713ea8bea48dc5e6123f26bc8d3075fe5585d1a217d090233…d5aa455e0d98f3c1e6a08Ž&2 "
,)ƒv&8
88
%
%%OIcf; a)4Fv@ƒd ..f-
%F.s.d .8oU./-/GF!EFFG "0+/F..F
  ŸX„€€€€¿4|“N         01200ˆ;kb„ //3c9ba32130a6c9†P=5ˆ;       …4ˆ8ˆQ‰5
3u]8A‚K)'SuDL[,&>v
$8X0)2994c8b1063bfb‚E!433482


59472&98ba8e4043550a533cdd0834bfdad1c9eab0f4‹X4n !

ƒM‚5N66!JU‚6AmY    0a67d3d2‚:!!!!!>e166f40dbfa6e055543f8301525f2ca2e96a02a57269818b9e69e162e98918       5;)2R;$0q)#((1,ƒXS$%

(‚(%4ddbc17120be2915eb03edc52af1225eb7cb5’U   6 ƒ)7[W?2A' % 2 ‚,ZrLNy
$
#
v      ‚*1     c9801ceba49Š:gb‘N7ƒzD<@‚6GO5‚,
4afeae5734d42d*////&efb4209f97fb4971656086b138599a91a75ff9‹>  8m!O@[P>l'$Udu‚.x   X,>db032d058f1436ce3dea84081f4ee5a0f2259ad97301d43c426bc7f3df1b0b„F     9uULn "%{7ƒ‚ A*‚

0c2507ˆ`69df4168c‰^?a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827†g    84668dcfdebaf12415d…Q?b2302e7a54cc99c84ff699a299f61f069a28e1ed090b89e4430ca80ae2aab06…w=56d97b553a9611efca188a3d995a2fff712759044ba480f9a0c9e98fae886‚J  =b01c382295cba85ec4685cedc52a7477cdae71cc37f1ad0f48719a17af1e1‚=e0c457869c1f7eba58c3b5097b9ec307a15be338308bee8e5be8570bcf5d1‡N'c4013876f50bbaa3e6f0f98e0147c76287684c1Œd958d90596593a774„u>bae33bff261f979d0042338f72c9e734b11a80720fb32498bae9150cc576e7…e39b966ae9ee739†,999…Bc41379c9c1e400‰gib„r!!!{2)




ƒ###;,       „qN==C:ƒ
}    6.
"h
!0‚iW
‚H~$o$$jU00Š0^
$
#
6’(8“j'11’:

2‘;
        
3‰

†$#45Œ

6‰!$7†g8…;9„F-20ƒM
1~

!2       
>6df47ebc49cd1710ac0dd716ce5de5854826536993f4feab7a49d136b85069†R1d‚2ƒk„V2m2q&‚*„X!‚Eb73•'3Qƒ^NN821•3•4•

6c258d02ead33;34•9•41•5•9•%a3275d03a287434ace3ccdf1afb208e6b0e92Š54•64•91•4d‚I:JKƒ<‚k03•4•9•18•'&6987605d0503c700a08b9ee99a6b5d67454aabR82b32700384a0f115k‚.$.E6-C
r$.vFdGGEEE/#F >b              (6AEEOY1"-;XFL
(
                
        
                -


M
                
.
!!ŸW„€€€€¿2u‡Ml…1„g„=
02500cdb9be05H)&4419c36766225ca542ae873ed38255e3fb8588‹W       6


!

5”p
e335f802ddˆH+6R2„0d…X.>2ba071e960a8a0a6ce39307ae30244a2b0dc9fe1c4c09d0e1070d4353cd92cc40”fb970c43ŽU
86”c7*_‚\‚M(+3‚*&392118af4c38c5203a04b8013e1afdb1cebd0dM  754b74ddf64†+8‚†%g‰
04”H
1ƒP
22”G/32”F">a94eb282822cad1d1420f2dad6bf65e4b8b9062eda4a0b9ee8270b2c608e40‡{       9;'„Q„B,"bO‚}13”A27”443”7&dbef4b8585f753861a36d6dd102ca634197bd6‰a            a5629202f’>8e87aaa414ac2d45ace8eb74e710935423607a8de0fafcb36bbde5b952d157‚*&b564bf9655b7c7b97ab85cafc8a48329b27f93Ž      >c9003de44da7dafa3fbb1915ac5725a9275c86bf2f3b7aa19321bf1460b386…v   'b413611f5e3e3b6ef5f618f2a9209cdf25cbcff‘Q8aed9f7c9e61e8†-
&ebdc3f24911c0d12b6d6c0123c3f84d6946b08ˆcc6c8689fb5f3d2f‚8!'d25bd1a73dc40f538f3a81c28e6efa5999bdf0cŽf0107bˆ[+++
6bbf1b8ca8†+//  ea3e9fe63ŽT&f4f3a5b1d1d0c4338f8243d40a2452cc1f7fe4Œ    f1b168ab4d4844‰>c273cf8032b601c9e06207efa0ae80eb73d5a1d283eb91096c815fa9640257Rgib3
P!!! &#;2[cX
$1
#''(7!77     
$
      $
$TH$
0
"‚.3       %E+

        3
D
%
H#
    !0‚‚'#„{b$F‚wƒ             027b613b4ˆ^(15”60”"93”#1ŠFU&0a1faeb9332a3cd8d1f53b4a2e055abf537bdcŽs2‚J
"""Z„*


A„2@
ƒ?
575”s766ƒ_kV
ib“3‚4/!/////8ƒ~…=!>4eaf776db9d09a4e69d6012c266bc837107edc2c981739ef82081cb11c5723ˆ%%987fb50dcc09f1429a653d6b47672f5a96f19o>ed868b21b62ce1d0352ed88bdbd9880a42f29046497a222df6459fc32a356f„4‚4 !     ‚ˆMT‚<
3634942dd54ab†*BB97“o
a579141b2c5ac‰>c23ff91631ae10354f8c9d62fd7d65732b3d7f3acfd0bbae31ff4a62fe28af…gd55d68e0Œ~1to35”j5z
    
ŒK;u…  &2362bc01660edfbda08179d60f09e2038a2f49   &4f6223490b30fd5320b4066b1535e4ce33988dˆv737281“`4“_to36”6‚)„X…x‚507259d3c2>8f1d31272b1739f804bcfa5485e5de62678015c4adbe575003ded85c164bb8‡59d57fb8e5ccdff06f1Ž'
fae083b450e3a†*ff7bƒqƒK†‚(61“R74“N7“P
>8629bf2ea546f73eee84063c5358439a12f7300e433f18c9e1bddd948dea62‚   91“O%8ƒ41“F4“G58“Ha5b56b9’%79“Ea97a87a6‹5'''b1ae018fp$>c210fdd258658321c85ec9c01a072fda3ada94540e3239d29b34dc547a8cbcb     9‚‚o/.‚4    ,F

B.$
        

FD


.F.F/.&/.E…n=


.c   
9F-F9
FW..
        ,F!

        F

        

F
##ŸU„€€€€¿.j†3‹03929“:a88d85f36704eebe1Ž? &d2f5ba3a4a3e3e51a1dac9fda9224b359f0261Ž
b4450072511e621†PL&7b72c4685aa5cf5e675c2c47ebec10d9704221Ž   &e71d99121fe5b17f057011025bcf84e7cc6c84Œ\>fa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837bb4d6„$     'd862f207e3adc00f78066799ac5a8c282430a5f‹!  &a832fd2af36eaedb05d61a8f4c2bb9f3d54265‹'e0da808d2f5b4d12046e05980ca04578f581177’D    rd”\4‹>;;5



1ƒxZ'!      x&0m†"""$Hˆ096Š+              ‡A0–#>fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1babm    1;„‚>‚u…7>1efca996b65448d9798eb203d6ebe9627b7161a646f5d00911e2902a57b2e9„l22„

80‰D
!

…2‘b>4a0d380332858ee55bdebc4af3789f74e70a2b3ba1cf29d84b9b4bcf3e2e37ˆ7     3ƒv„Aˆ>&74b7e83ea0a3fbc3691f9c0c936272862f32f2’Q    4…v‹"5,ƒ‚…J;„>586e4df74de3a43f3a1f8c7a78c3c3f02edce01af7d10cafe68bb94476a5c5…T6„Š3>35f4a69c8c2a8df242b384a992aea71224e39a2ccab42d8c0b0602f1e826e8Q &85ca86c2ea0649ed9f59a500013e90b3fe6d037S… b2581aa9bfecec†P#8ˆ7kb„ **9„k|‚J0~‚…S
&f1c3ae347e1327b5aaa6c7f76126bdf09c6f42#ba5abf65c5b0f9a96a7a†a46491212947‰>b2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b†3   >ed3dc2dc905ff55e2c21fd2725551fc0ca50912a9c96c6af712a4289cb24fa†C?c5e6c200adc8afe0814936c67a971efc516d1bd739cb620235592f18f40be2aƒ    86b126f2Žh&&&?d6800e9032ff349376fe612e422b49ba5eb4e378fac0b3e405235d09dd366abe8e4857d32d401f„$$f7e3cfcaŽlfeb3159c6bc3f7e33959…th5
5ˆGƒ+""‡5
0‡M‚†T       S0ˆQ1RŒ0cde277783b5fb…J(((2ˆ;‰'ae9cad317a1“
2ƒ‚(Š5E32c9777fe4fb13'5deb7a67fbd647†55&7231bc67285f01fb18d4451b28f61da3c4e39d‘       =8b8a26bf5ffd4c7b4647b5b799f86e8fb1a075f715b87a414e94fba3d09db‚j3ƒ$G…6S\[k&0a1ee7dc2435f80960ce4710a3c2d2bfaaccc5-      4„$5;q‚x,†%746f9e65ŽW9733b09e‰6„‡S‚;‚9&dcf5e931a9e1fa12fc2d600cd91d3bf9b639cdŽ,kbˆ;7‚%ƒ-‚6‚97N&41f47d1bc38aa0a8c38f09e60a5fe0031f272d‘9&e2104a0f7b3f528e7f6b7a8e553e2357ccd2e1’
ec374ae1d0a1dŒ8m‚    „‰\
540ce22dcd‚B!99“j$9„6ƒZ48e09b8c415bc45d„z8f5f7596b055‘7">98789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a„        'bbe79e206ae5ffeeca760dbd0d66862228db551’R?c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafa66e5‚)   >d4c65779dab868b285519b19e4cf9d451d50c6048f06f653aa701ec212df45‚i   e3c886796e5512Š=&6d1873a32d82c2cf8581f143649940cac8ae49Œ1'fdf596b29bb426001f28b488ff356ae14d5a5a6‘cthq6ˆG‚E‡K2 ‚+09(((97cb92745327a1ˆ
1Ž!fe9745‡,2Ž/       „0&aaecaacab3a4bf4a8fe4aec1cfdc1571fe9a44‘V3

&8abb77965332c956dbbd2c8e4248e84da4eb63rd4‡~jƒ/ƒHW!6?E/
#%22c7d69866f5ea3db0968f67ee596e7114544N&7e77e853e81a5effeb4c33477910400a67ba86Ž     84e6ce678fffab„!66&97cbbaad47220bd41e2e4216c54706e7ae95d4’)kib“
5536“...F/./
\4     F<F'   F.'FE.     0.FFG$F
@  &.EA.  % .
3..!
"F/GF ./N   ".
.n-..
99Ÿ?„€€€€¿_A065750d1e506f416a0b0b9dd22d171379679c733e3460549754dc68c92705b5dc†4bdeb9739Žkeb38f6e46de8c75e188a17ec…R'6d5f2b76750f3520eb7a495f6247206758f5b90‘5        709574d2a8d8M+899137afb6da41o$?98edb77537b67c41adc68f9b892db56bcf9a55e00371a61420f3ddd668e6603d     d642332d25aa3b7315a6d385…O
'b85b767d0ff7975146156a99ad673f2c1a23318‘;         fb98dfc0cq$c9b5514077fed34551‡.



&f0c7b46975a87a0dc3fba69c229a7de61b0c21?d13fcf1c31133da541d1eb8a83552d746f39b81a0657bd4077fed0221749511v&326d44fd1d626aae0e8456e5fa2049f1ce0789‘o        ee8cb6ae5†
f2222d550f5b0ee72,,,,
)7‰ƒD‚l  %           3
  H60Ž&7875582fcba352b4906a595ad89198d84711d8‰@   9fcd17810f65f717„v159Œ9a11e1314d1c704$f6891abcd9c459b5460b191d731cd12a3643Œr?2c08830da9b5d1cb397c612c0e870d7f5eb41a323b41aa3d8aa5ae9ccedb2c4…<%64f05cd9babb9c0f9b3c82536d83be7804b1cŽD'308ab891ca1b2ebc596025cfe4dc36f1ee89cf6‘6
10e2fb3d046a5†*>6b53f57f70b23172c30880186dce7ad9baa3b74e3838cae5847cffb98f5cd2†B >a740d881735bef9de7f7bce8c9e6b9e57fe3e77fa7d76a6e8fc5c262fbaedfƒ1c2b50211d3ae26~,486aa54b968e9b†f5‡
&ee38c8c6fd175ec85a47276dfcefe8a262827a>54ƒS'67c1727fec4ce11b83f25b3f1bfcfe68a2c8b02Œ0      '757fc721220e136620a89c9d28247f28bbbc098V  >bb46233db03a3338bacf7e56f439be3dfd1926ea0c44d252eeafa7a7b31c06ˆ$   >8d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9f   ?99a7be90651fc7296113b641a70b028c142d767b25af1d0a78f93dcf1a2bf20ƒA>b7f3b977360456350219cba0ba0e5eb55910565eab68ea83edda2f968ebe95‡cad5e4b2e219dd197242e9…F    'a91ceceac9bcf47ceb8219126276e5518f7ff5a‘b3328086a5c116c‰bfb7d442’&&c194957238c61b1a47f301270286be5bc5208cŽ]e932dfa60a8a6b3b26bcf76…G?c16541a0efb3985578181171c9f2bb3fdc4bad6a2ec85c6e31ab96f3eff201fu      6d876f84e6e7e2ƒf
e4e71c1b7251b†'d68a42face3ab14ed88407d4331872f5b243fdfŽ    7525cb01b68Š$--&d4968f235d6e1ca9547cda9cf3bd570e1609ef~   ?ebdfa80be8e8e73324b8d66b3460222eb74c7e9dfd655b48d6ca7e1933cc8fdƒg f7f8026eda38Š(a8049685b50b5aeb0c2†&de638e94287d2c‡2f3120e4ft4d1ca1d2ad4ecˆI8†sAA‚‚M  ;


"ƒmsD     0177f0c226ff54†*((369eddd5c94‹:&6577fd524dd5f3bfd8d4d27392ed2752bc9701’V10dc8038872e212ƒe23779d31eb09cda†+zz?4c181c0283d0320f488357fc8aab51898370c157601459ebee49d779036fe03†h'5ce79948116aa9a087ec345c9d2ce2c1d3cd8afW&e4e1c08c7df28ef61bb9759a0d466e0eefbaa2
601–C
&54aa9540fe9fd210899d83d17f3f407096c004’   ba67afafded936ƒ]////?72ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5d17a0‚     3cae2b6e25bŒV  ?84b4b7e502b4e991677b53971277adfaf0a04a284f8e483e2553d0f83156b50„k  92fc34f173e99d8†y>c459e766ea7e9165d0beeb124708b955a4950d0f4792f457465d71b158d318       >e099fbe5e13c33e683bef07361231ca525b88f7907be7092058007b75036f2…S   a2adec1Œ##&8ffc862e96f57aa698f93de10dee28e69f6e09"       b‚&

!
c‚:!63ff0ecaŽj%%%%9458e7ˆ]?d3a7ea6c5690d6b7c3767558f4f01b511c55463e3f9e64506801fe9b74dce34‡        f157e8010b22af0ƒf
d39115d8f46ŒW9ˆM.            ?$++…!ƒ-1Žg%$%$%$%$‚';(5#>5afb3f29c2d217ea0c283326a9df7d505e6c73b40236f0b33ded91f812d174‚&aea4cc722371d58aae3d22e94d2a4165276905ŽH /    F /).F.,o    .",G-/FF   .
//FFGF-/!..F/.G.G/..%GG&EF.GNF
  ŸX„€€€€¿4©A091ca6c0a30ebfdba4420bb35f4fd9149d13e45fc853d86ad7527db363e282683ƒ223372036854775807B
8Ž



%…<9B*%dc59fd5ad66f646666042eb04195e3a61a9e8ŠF        3Žg'&'&'&'&‚'; (      5%>b1a6d69b48dc39697d1d3a1e4c30b55da0bdd2cad0c054462f91081832954a‡4†I‹a%91ba7d738528f168657adb43a198238abde19ŽC  ?501e22dfeebdcefa783575e47c60b514d7c2e0cad73b2a496c0bc4b680900a8‡  >47e2c38a1c6f751a77d4d796894dec4dc5d8f5d79b1cd39e1ffc50df7b3be4@  6c1454c‰?7744701c3bd414e6c9d7182639d8c2ce7cf124c4fce625071ae65658ac61713…, &9f04392853b8053817a3eea2fc679947b437fdˆu   8•&1329adeef51011052‡/
825a79ce14Žq>9e3ff37f2b5eea8e42205f808ccf0ba86c6ea6aa928ad2c011f33a108ac45d†%a07da78f71b0275e8d9c510486877adc31dbeAd973b8f5Ž$9…?



&0004ef2d0eec6a339e4caa562423897fe02bf0236b2fa443fec03ff25…E''''>6b2aff37b6e0c6663d0312cd921bbdf6826c989cbbb07dadde5e9672889bca‡f9ƒ_



$06bf63e6cef63d6f3d7f8526ac4a70e76559a6daf340df99ba93cŽ<#8b09f8e6ŽA'b9171b1e6ce7a980e6b714e9c0d9112657ad552Š#
e4716c0d7bbd13'd6c1880fb75660bbabd693175579529785f8a6b=       ed02582f‚A!fb26d37cefaba40ƒf_‚4H!HHHHH_builtin_add_overflowˆ<bswap32ˆ9mul_overflowˆ<       sub_overflowˆ<byteswap_ulongˆ9file_offset_bitŽcmsize’aI-I-     """""!  
+!    
!   
!       
!            !
 

 
  
1.7
1.7 1.7 
1.7      1.7      1.7       














6
&<


<

<

"
&
:
/


    
&
:
/

&
:

&
:      D 
3
x,
6%3
x,
6%!+B&5;     
.7    .7   

        



        



        



        


!



!



!





 
    
     
 
 















H(      -F-GFG.     (F- .)F,//"&

&&ŸR„€€€€¿(«Š=    
     
            




              
 

 
 


    3

  





       

  




  




  5



        


        


        
        
   



 

       






       


      L





   
*


  

       

      


   


 
?"
        


        

    



)0a12d8059770df4bca59e321c266410344242bf7b‰{    79fe7465n#$#?202a950ab401cda052e81259e96d6e64ad91faaaaf5690d769f64c2ab962f27‚ >6b6597e3ae272231b96f9982c3bcc17ddec2f2b6eb4df06a224b91089fed5bƒM >9f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309;    306e56ff68b8fa5Š%&5e83eac7b185f4d363d7fa51677f2fdfa27695’X       4e06e75a9ab61a12†~59ae93ee990a555c8ed66ca_>fca0b9f8cbf80ac89b97193378c719d4af4b7d647729d8df9c0c0fca7b1388„7'611fa96c4a848614efe899130359c9f6fb889c3Žr   &5a62893ca8319e89e48b8a38cf8a59c69a8209ˆb   >9af0a88d59271a2dd3c846a3e93cbd29e7c499864f6c0462a3b4160bee1762n'721fc0d89495518fe5612e2e3bbc60befd2e90dŒC    
b7803e8d1e869‘:&  8a0d2996aŽR
a5a0431c99‚?!
98619ad08ddca†fTb†Pfa–b•q>8da6bc754642989e67d581f26683dc705b068cea671970f0a7d32cfacbad19!ilƒUG        ‚HL‚!y‚F‚B&‚l               ƒ;k*v



‚6$

g/
=ƒq
9‚  ort3 !ƒ   _rollbackŽ#ut

                     ƒ<        ;
b
!

4a  ‚pf ƒW
v‚D!stractŽ
c00f496b7e2’'661962a2aeab3c331Œ“l0GFE.%F/.F/                 EcC&
""ŸV„€€€¿0º0accent–7pt   ‚  !                            Y/C
)‚uˆss‚#
*[[[/)
W!-sƒ$$$ES)d‚9Wident†W.„SommodA(rd‰[†runt†*ˆ/


6        umul•|r[aci8>d63062eb06748bfe9e4886639e4f2b54ea6a496a83f10716abbaba4115500bƒ0    hiev“#quir•rossŠ0ƒ.tion„V…bvƒV ‚ual'                  ƒ^,ƒMG|„GU d
      
      
      
      
      

         


6


6
        
)
###

        

6CC
!



           
  



        d
\


 

           !

         
 
2559db380abf8‹&a05cfa86ad7f5645450ac7a2a21c9aa6e57d2cˆK     d 
%     F\˜A.
""ŸV„€€€€   ¿0«gw
     '
    

            
   
      
    [






** 
       {T!- 
o 
     




  
$GD      F

)$*     <


0additƒ5

V###6‰'wl'zu%ressŒjustˆa‰m
‚]
\vantag†STers„

?ea12399bf1fdc76af43499d4624c3afa17c3e6c2459b71c195804bb98def66aƒ$  'f0d91adf497f5f36ec3813f04235a6e195a605f’G  bbcb5b72‚>!fect3          …DMinƒD



N&n‚F„c‚
„Nterƒ62     2ET
w-‚GG+W
%  &2%‚:
$G   ward’9gain‹=A/e



…
M
stp%BBBB-ƒ^‚_‚$# ogregqqJ!U W                                Q
ƒH„4*$#

‚=qss„W‹-
5„re’T
head†P*Q



‹#ixŽdlertŽ`gorithmˆ7K!‰M
?Cia$$$$$
$’s;
„s
gn‘Dz*E/l


    
))))))D
<
<
<
<
<
<   3
31::: .GG3/#[/#[.#   1!

Q

|% O$        C
U7(,




w
foc

ƒg



?<<<g


…%ƒz
}        
S3w`         `    
u':b':b':b':b
':b      ':b6de;
S               !                       ‚       {
 0
 "         # 
8 (*5(4)_uri_authorkong„c2pha”b    ‚/readi„cT/*ƒD
so‚4!ˆk#G/p9=U+
&HH*…">
""ŸV„€€€€
¿0¼mƒ;
mM         Gƒ%‚9""""@ C,0alt1†W&2†W(er,P!4!4!ƒK!„„‚KB!n
„c$$$‡„U‚qwai‚1&!&&&&&1W4RqUUA
        

ƒI               
    !!!!       


‚+*malgam†ae"‚="4ˆ$

-tch@ericanŒx
"ong‚%ƒ5unt†rƒ                 ‚A‚M‚A8cnpp
    

K84$


K84$

K84$

K84
K84
K84^T^TB!$

$
$
$
7
        
       
     
"
     

     
"
     


7
h.D$
7
h.D$  <   GJ
3


>
>
#0          $!-
     
                               
!        "!      "& 





     

*

  





        








"1        
  



    ( 


       
        )

&
0


 
       
"

9alogˆ?
!ysi’$s_limitƒY



t





zƒY‚888„ha
   2    ‚
}d
         

         













   


  


  


  


      


"""      

!J;
/

!J;
/

!J;
/

!J;
/


!J;
/

!J;
/;        ;   
(   y;Tc,&jŽK"#
""ŸV„€€€€¿0Ãƒ%        
"
"     
O            +$
5"             +$
5"    +$
5"      .(      
(       
(    
(   


J                1^  1^

!. 1

=

=










 


       

          
                 
          
          
   
                          
              
              
                   
    

        
"

  
"+       


$     

$

$


4

    



       


"
       
        
        
!

P       #             

"
                   ! 


.4


                        

      

<
      


0ani&)
)
)
)
)
&

!0C                    g0ƒ
%%%%
>‚Wnouncƒcoth†ƒV‚2‚.‚‚NCsi–twer

666666‚)‚'f

>4*""""6ti’=cip$$ycollseq‡(how„"th†s66wher8    pi    ƒ~9R3P    q:;
†L$#™‚3W
T

""ŸV„€€€€¿0µ‘L‚w2/H]0appear†)OOecS!x
‚_‚‚Fnd†:
4lŒFEvf‚7!li2‚zZ




‚,cI‚e$‚Ec22N;-y
#    ^cH$:CK



)$


$
;0
"0]ation_id9ropri‚2N!NNNNN‚iQQ`…?=‚R„
ximƒY


„3…'''‚mƒc
r
     D1
     D1
   
)"))
    
  
  
  
  
  
  
%=

%=
4

&&&       


(
(

><<
bi
(              




#








      
       R
H       
 
 
 
$    e$#!
2  
7       24


,


UC6
3 !
bitrariƒRƒT‡ƒt        chitectur?S…    v„KB*
efileapisansi•?gumentT
%       
%       
%       
%       
%
%ff;

"# 
=ƒ[         [‚)
+#"K$+BBjis""thmetƒRm*\
        7•        
ound„x&22„AnPb



‚'      ƒ Prai„qƒ0‹ng”1t†ˆƒ|s\       \   5


&&&&&&JJ             
         
CO         

        
\&\
\&\%F%^^
      -

     
8
+++





*


,



   
     
I|#‚1`Šk?"‚N6"       A

""ŸV„€€€€
¿0‰`      
-*       

C)('
&

TC+
0ascend3               iiƒa



‚…szƒ|ƒsert/ƒCYcCYcM
<†|*†fign9oci1



‚>[r)ƒ#=y!‚,umƒUAŠ6"ync„saaahron“It.******       
 !     O 5
 
xZZv#dlu2     '

!,(#

-+\*P           om†SDtach‚1!ƒ
$$u      v„T‚‚&s;k†'empt‚#!SEEƒ
!‚@g       SCK[
9
~ugmentthŠentŽ#or‡l!†@„#o‰          ‰[_extens“ftvaccum”K       uum‡3[Œ(/conf‹3incr†]]‚U
     
mat(

(
(

(((
AAAA-

C
>>
M'

3    jo06"5]
R-        ,
#‚)on•sergŽGƒ,   vacuum•_pagsxiliariƒ:‚=‡{vailv((&ƒh
HJ    Mw‚5/ƒ<G5erag‹zƒoid;;
    II^TGTG
O:



  
`f‚B~m+$#

W
%>'wai’k‹4b…x00 „VIV*ƒ2h
?05ef42ed234009b4b3dfb36c5f5ccf6d728da80f25ee560291269cf6cfe635f=bd014f2776b9f9508a3fc6432f70e2436bf54475369f88f0aeef75b0eec93ˆ&c22e5f15f5ba2afd017ecd990ea507918afe1c.'1ed4f2a34ba66c29b130f8d13e9092758019212Ž\        '2a68d5783f48dba6a8cb50d8bf69b238c5ec53aŽ
fa5424e6fcb15ŽB41031ea2b537237…I000  52a020ce4‚C+!++?62b77ee1c561a69a71bb557694aaa5141f1714c1ff6cc1ba8aa8733c92d4f52ƒh>3af6c3bd33152742648d5d2e8dc5d5fcbcdd27df409272b6aea00a6f761760†   706351ce2ecf59aƒf
%347f4b4c2a840e6ba12040093d606bd16ea2165a9ca6b0ŽV'81bfa27d3e09caf3251475863b1ce6dd9f6ab66’Y50dd159918af56†

99b6042f97f5†fu&e92227a469de677a66da62e4361f099c0b79d0Œq       918d4b4e546d†+##&2ca988ebb6df02ac0c8f866dbf3256740408ac‹o3be8729a895a528e2‡-



a7cbfaedc7e6Ž%082a4a41eac1Ick~(ŠX,†T{M"end“
     portŒslash‰up„seeep„p†4
ward%%n…ƒ…}ƒ'‚ilƒ5q3Fƒ
;3 6‚=
$*#!ƒrGE.//!GF-/..(+
@[
  ŸX„€€€€¿4›q•N0balanc7
Q‹C



†nnerŽ`reˆ[!!!†srier‹~se†        …„c)„linŒ…R/i”)b4bdb9f7f654b0bb9„~8a9fd4a9b7fce5‚;!&baa68061e925bd4d7d18d7e1270935c5f7e39a‘<&d85d235f7037c6a033a9690534391ffeacecc8‰       c115541132dad136†8d94f0fbd633fd9a„}&c4a1989db45e7f223191f2d0f66c1c28946383‰b?d41822c7424d393a30e92ff6cb254d25c26769889c1499a18a0b9339f5d6c8a‚     =9a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0f6d7…&a77dda9697c463c3d0704014d51627fceee328Œ     e#$
#$

                     <

@,6
@,6
@,6
@,6'
@,6'
@,6'h? 
h?   O
5    


!      *@!,TX        ,TX        




   

    @    
                     %&               
     


%$

%Z





7 







"
     



$E)+        #4#
7

436a7f4587ce5†f+caus„!†S„R($#ƒh2%d16877f4f9b281b91c97e106089497d71bb47’;om‹e†Renƒ688$jyC


‚r)))KNx<$v
"ni(
‚for&‚[#5UUU   Uˆ/ƒ6‚V
‚(gin‚%/!/////     ‚####CC1„k‚   ‚th
k,hav…2Giorv&&+
!7Kq;;/Oi3‚d&&&ƒ`„R7
)low‹%ne”bta”Or0ter
3
3
3
3
3

3H
(     



5‚-,;c




BQ$1_!"PAween„uDC$55v‚W
[



S

‚i‚  "yond])))e
?f8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9…;   %cd74a655636b592c5dba6d0d5729c0f8e3b4d’E>fbaafa94706f0ed234f183af3eb46e6485e7e2c75983173ded76e0da805f11eia†t==s†KDnari#ƒb_‡@
‡K
y64ƒSd





‚uP‚_blob64Žfallback„bparameter_index–unam—oint†k





text64Žzeroblob•64ŒTt‰                j},sg6$#      @! F$'       # ..".GE.‰M-)L1*
3‚r&G-E      @2
""ŸV„€€€€¿0£–>/  
#0bitvec”=lobCC‚9‚?L†.ƒI
Q7V+n_readopenˆJŠ%writck‹9|…#M
I‚gom
        
        

under”cnf”odi8…##mƒa))))‚eBBolean„rOOOŠ-$#jƒxst.†eth$


    
‚Dd//!‚‚<!d

r%‚)fXx95er“#Mundƒ:W       '((ŠY;c     ari„^ …Jˆx‚>!V        Žranch“8eak‹,###ƒ


„{.pointŽ(4w“Ling”Boke„")ught”wsertree7   …00
/.„h‡ƒ(info†J#ubbl“]ffer0



Šƒe…GGg#                  &&&&&& :4





'l
b
  

 

       %


       (
        gi”6ild
(
9&&&&1$EEE5‚p!p          K



&&&&p
 ‚9|_"F   t       eF::5‚O           (0
`k

†)/Ck7lletŽ5si
„*‚0
       5        y_reserved_lock—snapshotrtimeout‘Etz"!8%%% 4999
3**Q)*„:"pGz-'

v$(y     
        !!!!!

0l
#=5
o!
+
  HL(
‚)[2\
  ŸX„€€€€¿4¶k!


        
          
==LA#
LA#

 
ff:      
T            7
#/
%
%


1
1
1     


       
&      
&


                      
''''
#









   
                

 -
"

         /
"        
    

3
n0bypass’2te/ 

PC           P )             …^  tLƒ+/cod
<!lJJJƒ@swapˆ9c









tt




        
       $       -2        2










(





    

   
  
<
0.L.'03e47e152ddb9c342b84ffb39448bf4a2bd4288ŒD&d89d4a9752922f9e367362366efde4f1b06f2a‘b      &e09560d26f0a6456be9dd3447f5311eb4f238f‘8   ?20a35336432025445f9f7e289d0cc3e4003fb17f45a4ce74c6269c407c6e09f„T  a19d81652f40568cŒd16f997‘m?30326aa1a9cc342061b755725eac9270109acf878bc59200dd4b1cea6bc2908‡|4d0557f7Ži5ea805691bfc4204b1cb93'78be6d786c19073b3a6730dfe3fb1be54f5657a`    %c6050ef060877ebe77b41d959e9df13f8c9b5’:   >ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca†   8d3b9f0a750a529ƒf94369cae9b561b1f996d0054b…H++++?a011a10ee8515b33e5643444b98ee3d74dc45d3ac766c3700320def52bc6aba…-ch7H„#

o.DJ

‚=
3        7
    
5_ ;hHe_sŠ'2J       …@:pil‹%„grindŒS../$d1ab4cb7b0fc‡0llƒ;

X‚6
‚wƒW



A‹‚\ˆ/..G'G,/-F0G}+%
""ŸV„€€€€¿0«   *   $    #    9    (
5<
*        #,
X
   0callback‡l‚Cƒep   3
ƒyme‚n



%2!22222>>


(3M\/
5e                                              
             
R'



W@



        &


$





#d&



+
        !              C
             
#
':      

;



      

celI7
_auto_extensldidH
…knotƒ5gg‚N…ƒp"($#on&ƒo
pabl†S†]<ƒ\)*"
it’7reless†W1raiƒ:ƒ!""‚@!y_bindƒ:iag‡scad

e7U                  

!-
-
-
---     ;

;
  
Yo99‚


!(///mK((((‚Y       $    #    LLm*o_sensitive_lik„aeƒtŽ%
-        $    ‚I-us*
*!S

  $3
3333
3.:-



%
       $              $              $       #w`w`"L    L       



L                (
;    

@`



b
        >  J        J

"
#




'
     

B?                    
+%           )b3aa0641d9a4‹9
91bf4290c211d†
U&a2be96d27cb51978cd4a200397a4ad178986ebŠv&ea02d93865ce0e06789db95fd9168ebac970c7u >f322df1f76be57fb3be84f3da1fc71d1d3dfdb7e7c2757fb0ff630b3bc2e5dˆ8'c7d708bb073c44102a59ed63ce6142da1f174d1ˆLd†s%0b37c52658bfdf992b1e3dc467bae1835a94a‘P e68383bf6aba†|  
ll_size_checkŒLrtain…5J„j

…TƒQ'f538e2783e468bbc25e7cb2a9ee64d3e0e80b2fŒ[      &975957b9ae671f34bb65f049acf351e650d437   hacha20in„^Lng!   !       l         !

!F,Y



Q"


J
   
   
   
Z5,
(xC 
"!e‡#J#C
+‚s(3‡D..F/-//.
))ŸO„€€€€¿"›’#A6*>?E


!
1 '
0changes64wet†'
apply_invert…:      
fuzz…:
start_invert…:r‡       †|1$#act/Q                N9'''' RR



       
f‚'csPe$b‚G
$eck*%



5G
G
  G
G
)%!'      %!'      
   yc


a[‚W
{
M)!|er“Lpoint†V}„=…
_fullfsync†V!Œtrunc%sumƒ[rrypick„Eoos’[ƒromium2‘\unkircular„q


mst…E…ƒ…
‚Olassifi‚B!us$$$ $$""
""""
      
      
      

%4i
1


%4i
1


%4i
1


%4i
1
%4i
1
%4i
15  5)   )MMMMA&A&
#







!3*              " 



J                             $!
                 

      
      
      




&      "E+
9K!
(
       
eanlib$#up“$)srli†i
y      







                

==9
.





#


   
r
ockLneŽ_se„sppp'‡2
c



ƒi_v2‘Yr„Zur@
m”Od‹2


o†'&
„(

.ƒtalesc“#/de$

R


A#              T
‚C%‚*
(

B   

7&5a

90

+       3           F
PI
point•
ercion•kher“_llatƒ`===
=‚=W:B$!…`             !
  ‚a#      i    y
ect)’2GG‚‚l
.7‰f‚s  
        A
„
8
""ŸV„€€€€¿0º0colloc”?
umn

n*#*#*#*#
**


u!         

u!              
u!              u!               u!        u!               $     $     $     11     
#                         % %      %      %
'




A

           
       "       "
    "           
2
" 4 +    +   +   

'

(








&G? 

!   
_blob•      countˆanam†{ars‹$m„j%bin“?!ƒe†SEu$$$ˆ=maˆ!‹Pndy'''''













    
@
B5&B5&B5&

   
         
         
    
    99
0
!!
       
      
      

   
   

               
     








               
               
=    



&#

1.8ent†~…`x3$Uy[it~)

…c!†{-‚{    Rj(]on‚0
    
  
  

ƒ‚*


|_&&‚I†`parg
!
 
ison#Š=‚‚ „L   t&&
  
T

K00=     ƒnj"""„]ƒ'x   8       et“0il, ,,,"!>(       }

r$
G                
                    
G
ˆo

)   **‹'NS$Ba

55ŸC„€€€€¿
‡                   -
     -        -      - 
<!!!!

       
        $  

     
      G%4&  
0compile_opt‰K!‰
option_get“usŒ{†let†‚<&x†*--8@ˆ7$#WƒiŒ‰panc”3                tv&&&c…LŒRon†Šf$ƒuund*ˆ5„J 1   y+
Oress’`ut__$
ƒ$‚  
==
‚g@‚U       
    (f
4‚*Zjj
"ncernˆ]‚urr…@ˆo‚"…Kdit‰
ˆexfig„A!)))…(((‚G…!s      _getpcach’  e2’logo‚n    
okasid”
memdb_maxs„r***      utex”pagecach+…      cach’
e2’_hdrsz+      masz*                 scratch”
   mall_malloc†_
      tmtjrnl_spilŠ.)))ur…Mzr3
‚8
    
D‚
x

e    lict‚-
!




‰           ‚ƒ-
f
%uuenc…Enect
  O,,
\//>H]Qay
"@       t$#;
                 ,6./,    F,f
             sid†8.ƒg
ƒ

D‚k cer…/st†{t–qant‚'444444+gddddcR‡=&„d19        Arainƒ6aaƒZˆo$#„c

t((
((     (        (          {{{{{{6     6        $                     0,
LLt


0!%
%       ‚   
#
               

    
   
   
,%
'


L,   '%#6uct‡]
or‘}ult–gmpt”=tain&&







%
%
%
%
%
%'"


u!XX;
S` !Z$



~$ /
$ #"@Q
#!O"H&>&ent
>
>„'
k;d-#&/         
ˆ:TE‚/[„#5@      F;2Y
+
w‚Ha
       -A„!
„
""ŸV„€€€€¿0‘0context_db_handl”(inu…?VVVV…‚j.
…$_rol‚1
!




l

!$Y
J\Y‚r‚xB(               ‚7        veni8t‰Z    ‚rs†*@@‹i  ‚U
t%%‚k!kkkkk‚llll22‚  „6%…&N"Ph  uinc‚C!pi‚666666
…wre’/?‚#ner‡2outin‘Crect44‚#!‚N$$$##N<cI
ƒ 
&8
‚SdRli!






W!4))‚

_
z    
l‚8v                          ƒ?#Q
       %n      l‚4?


KNNƒ/†)„spond„†"'upt#D

9t



 K   7p7p
C



 !z*arA*!F
       
.


Z0


BN
    ,    
# io”vstƒ6           ƒ.<<‚I! ‚G#QO$#+uld##‚/
‚\Z‚p  !        s



‚1vP


#
"   *       J7
5K@nt‚3!Œ"0
ƒo  ‚F_chang’8=@er…5ƒ_‡-
$
#part’less“M‚9plŽverƒ!@@Z†F†/ agŽbƒ=Zn   
S        5pu



…g

3
ƒ/…   rŽ@ashƒV



ƒ:!‚YT‚(Xm\Z;
&eat& ƒh/   


eZZ   ~~)
!!Q




)  y‚(T        .5(
        
@            e_col•ofilenamƒ^  unct5„
‚}
ion_v2’zmodul‘j
e_v2‘jitic‹}ˆln?nlŽ@:oss”k
5uft—svƒa‚D‚f!„Af     ;vƒA te‚0!‚#umulŽrrent‚8!

ƒ‰‚!E‚J"F_d–_  tim–_estamp–_sor‚;!stomŠ1ˆ!tcv“.e2ycl

…|3‚{/gwinŽeD$#…@g7;/
7ƒ        x<ƒ&
x‚?*
:9u     ƒ"

!
a)N
"   m
22ŸF„€€€€¿w0dˆ"""?00b7fffa6d33af2303430eaf394321da2960604d25a4471c7af566344f2abf9ƒX2e1406a58ea02d‘R6a25c84454a‹866b26f83e9c55e3„|2889096e7bdeac6Ž=(?33c709cc0af66bc5b6dc6216eba9f1f0b40960b9ae83694c986fbf4c1d6f08fR >402f49871152670a62f4f28cacb15d814f2c1644e9347ad7d258e562978e45,   &60d7eda3a9dccd291aed2a9fda868b9b120a10’%6b54789dff4fb0238b9232e74896deaefab94v&7594b8a02f6cf58e91fb673e96cb1b397aace0’H&94e8d81607f0515d4f386156fb0fd86d5ba7df‘p>d66feffad66ea82073fbb97ae9c84e3615887ebc5168226ccee28d82424517A'545b24892278272ce4e40e0567d69c8babf12ea‰|&cd1535053a50aa8633725e3595740b33709ac5%e98057028abcf7217d0d2b2e29bbbcdf09d6dŠ 6ec09eccf68cfc†*HH75e67654aa96†+ss8dc2b3a58cd5dc2918a1†96eba87698a428c1d„y>a5daf7697a827f4b2638276ce639fa04e8e8bb5fd3a6b683cfad10f1c81b12„]>c439cacad5e4992d0d25989cfd27a4c4f59a3183c97873bc03f0ad1aa78b7aanger>tao          !)M

‚Rqqƒ‚o@#„w‚ }_count’.store_directori4vers‚3!!!!!!!‰vbas




      u! 
! 
! 


                                          ? ?


$B
2
I
%
%








P
   

       
!*       
    
   
   



     

!@

$&&&




%




     
" &
/

           
H    ,

      

#      
e_file_objectƒ^typ†*??ƒd                   ƒu„

e
R!ƒ\‚ƒu$#ƒ
‚bŠ…M            ‚T87229497Ž$_cacheflush‹(onfig„!     !&‚B#‰"filenam’handl–:mutex“snam%readonliƒ5MM†y


ƒgƒ-lease_memori’statu†"ƒ!…gM:  ;

|config„[+6  _defens „xqs_ddl„Vml„V
enable_fts3_token„!…Oload_extensŠqpsg†ytrigg‚1!view‚1!
legacy_file_format„!
        maindbnam‰
no_ckpt_on_closˆO

reset_databas†

trusted_schema„
writable_schema„edata„Yhash‰P!infopag†astat„          ‡R=
us_cache_hit’+miss’+spil†"us“ed_shar‰G!writ‘q
deferred_fki




lookaside_hit’fmiss_ful’fs’f
        schema_us“%G"GF.-..F/.-#FF
w:Š$L6g

1Q#
*&:!?
   
""ŸV„€€€€¿0y0dbstatus_stmt_us“totxt„sc3f932f5a147771†PY
6ebeda9396087Š!9b1c91Š<dl#e†X3403bf5a†{$$>465c64f09529429a38cbdf637acce4dfda6897f93e3db3594009e0fed56d27„%&5a5898ebd3a3477d4652db143746d008b24c83ŠG7db14784a08053‚D!activ„!
‰adlock‘L„,lˆ`loc„s>>>bug.‚o%%%%>>>‚~`!gŽ(*cid†t44mƒ.‘Os†,ƒPlarƒ]****‚Nƒonstruct„depli_





„     fault?!43                     b‚   
R'';=(((((B.
)  
b3      _automatic_indexn        cache_sŠ+        foreign_kei’h     lookasidˆ:   page_sŠ+
cache_initszˆ>    synchronŠ                       wal_synchronŠ:
orker_threadŽect‚D‚_nd’=s…8r'…j‹v„
_foreign_keiŠ8„{in7ƒeP„r
 ƒ/s8‚?*it‚5’+rag•) let      /    !                    
‚P
\  ‚T>6ƒ
ƒ1]
8       2        
W
+F3giber…PWta„dmonstrvŽE       $    #    ƒ@pend‚8!ƒ‰T‚d'q2Rk
loi„".rec4‰!p„*$#d
th‡/„referz$$&        !                    ‚hh‚Z;!encŽ?sc†P;‡U‡fend„!33… 
!

ƒ#„0‚j
't‡/rib‚:!]555pt[erit‚N
(1
(1
(1galize_readonli„r000ign†mktin‚3-!-----‹*$ƒEroi• uctor‘j     tach†T‚G       ŒN   sil5>                                             Y#!###…8‚ ‰X   ectƒU"l                    /(                     ex2J„mY}  rminƒ5KK ‚,,ƒ       ‚_Bƒu
‚K/          ist‚8!„b†velopo


‚94'f01436c5fcfe72d1a95bc172158219796e1a90b‹"46dfb631f75694…>5c253c0b3dd24916e4ec7cf77d3db5294cc9fd45ae7b9c5e82ad8197f38a24   have_strchrnul7iagnostŽ)ram‚A!;Š\…5&d…J‚lƒp†4fferƒ]''''ˆ?
ƒ16wƒ(
git‡
"
"
"ˆF$lig’|rect†a    
‡C‚*_overflow_readˆE‰mli„Œonli„ri„c1!ƒS 
\„L‚B
‚ 
2sabl
\!\\\\\     
     _
        F.  V      :+ƒB"4
../83
.AI.\F*
O 0$q;"/E%04G2#%G
22ŸF„€€€€¿w†\"‚w
                      ‚k


‚zz1  R$
0disable_fts4_def‘_        intrinsˆ<llow*…]l„Rmbigu))))))cardVV‘lontinuE…@v2,„8^
      F,„
junct‰C!kFF„%n@Z
#ƒ

ˆDc:plai<‚hruptˆatanci
$
#
inct                                        ‚=

ƒ
+…G   &0
‚[=G TDll‰Z†eY†ml3o(AM             

%%%% P$\$\h


!
d



B




r@\
P6!
M
X        cidYument4?!4888„<Q***
„X"" Y!$4L3$2HdgiƒU'ƒ*et<  <      <      
<
<<4V-K`DDr,
!

        


p            (        ƒ"""$8THK0.-
n’.evƒ1†,trwƒ)


F                ‚O‚-
$
#
R*fil’ubl„VŠ$„v‚:wn|  
    s--u  ƒ      †B$#zen‰X!Œ@riveŠ*'D      ˆn„ar‘hƒ$Xop‚,                    ‹ƒ.b@a} 3H5_modul„;sqlite_allow_rowid_in_view‚#!    dq„V&  enable_dbpage_vtab†aeseri‚$
explain_com‰\json1
math_funct‚+
!




offset_sql_func†O         has_codec‹; 
omit_autoinit6deseri‚$introspection_pragma„?json%%%%%%w‹<
        trusted_schema„      untest†/
ue‚;"!""*<<…D‚A‚$#t   ‚bmp‚6 !                4vII‰n‚u{plic‚;!„1†DrablŠy‚ e†+JJƒg‰Fvc„dylib?Wnam†  Tzero_argument_generate_seriv+++e20dd54ab0e4383†f>&920fb885569d14197c9b7958e6f1db573ee669367f31901ea8700ƒf9d032577ŽQ>42291343e8f03940e57fffcf1631e7921013b94419c2f943e816d3edf4e1bb‚Ka18565a36884b00edfŽ
0%b094f8afce0817f4074e823fabe59fc29ebb4Ž+               636a050b7G>a50effb021858c200e885664611ed3c5e949413ff2dca452ac7ee336b9de1d-e962d6b0f06f46ˆJf1f2e34dceeb1ed6„{$$$S&XQ:„`‚‚s 4,{,        q"
&+!%        t6+$-.F-F
  ŸX„€€€€¿4†)0e7c26a7be3e431dd06898f8d262c4ef240c07366‰2'816dd924619db5f766de6df74ea2194f3e3b538@    275b415a2f03be…Nd439c77685eca6‰V!>edc7b1512a2e050d548d0840bec6eef83cc297af1426c34c0ee8720f378a11ƒ
9654505cfdŽX'&bb4cf40f4971974a74468ef922bdee481c988bŠu   &a3317a4803d71d88183b29f1d3086f46d68a001   >80f3002f4120f5dcee76e8779dfdc88e1e096c5cdd06904c20fd26d50c3827ƒ   ch//////S!9GGO

‚0

              a



f1‚?1^sUrli…?!!!!‚      erƒ6  ‚†i

sƒ<ier=‚b„y


A‡9b703ba7b50c1a5ˆ       &b18593350779850e3e1a930eb84a70fca8c1d1Š`cdic‚B!&d01a8deffb5024a5d7494eef800d2366d97204’( ?c02243ea6ce33b090870ae55ab8aa2534b54d216d45c4aa2fdbb00e86861e8cƒv  
32177c99ccac2†*44d‰
              >b4e819b0c058c7d74d27ebd14cc5ceb2bad6a6144a486a970182b7afe3f8b9‡M   it…8Y
2†eƒ- $    #    _cost_ti$#lin‹3‚xf360601‰`9318757b152e3a†P0c02f9779“5fectd&&&ŠB_‚=„]ici‰x         „+ƒEcj   @ort’1ither„gDaaƒ‹lement&*****mbedƒ
{‹RUUerg‹p



pti„‚9


†U‚1?y_result_callback†0
nabl      ;     ‚

III   g
`

‚3!
""0}‚J3
L‚'e_api_armor(batch_atomic_writ†Scolumn_metadata',,,dbstat_vtabŒz
     eseri†

explain_comŠ„0fts3_parenthesi-’r
token5‹rjson1‹qlocking_mod’W$styl”>memory_manag’|norm…6 ull_trimˆ=qpsg†y     
selecttracŽ(        
hared_cach”k        orter_refer†      tat2’,/M3„CŠ\‚}
4…R‰### #
mt_scanstatu&tree_explainŽ)ƒ{
unknown_sql_funct‰T!      pdate_delete_limit†N-  wheretracŽ(cod/‘A‚`
xlunt++…1 Irag„Vrypt‹                     …
d‚4A!AAAAA22…Kƒ

(

'‚{(
*
D   Eian•     less…JforcˆŠ,
%gag’8in       !        jŒ|
$
‚
h!'‚Rhanc
           
( 
( 
( 
!
!

!            %2222
       ???
   ,

0/ F..Fb*%j ..GF+*GJ$!ag‚8"&'#+(## /%"J
""ŸV„€€€€¿0£‡q
%
;t



P(      
c0ensur‚8!d"



|j
J‚@



]

&1‚.ter""ir‚/222222$Ž^tSs
ri     …5'      !‚U

:!‚
viron…8‰b

…CphemerŽ`onym†J$‚~oqp„sAAA'%ƒLualŽm†i   ival::o$#rrmsg†i

or4    4444495__0h

!

     R
    R       EO.Lz/
$"6<               'R,
,
!



$/_offset//////str‘=scap‚4G!GGGGG3R
g&&&&WYY3i„!‡#peci†!„


„b$#$}   etablish„jimƒ6ƒ**;;‚I! 


‚G#
'      ‚<5tilq•Sval†0G

†                   uB!99ƒII‚I!ƒ?„kFen(

B      B        B        BBB
7l    ^^_2‚,!1‚5


T
{                {`'
        RT@Itu•=ri…@!ˆV1yth‰x†x'!'7
actliRR†@ˆ‚~        min†t$$pl…?kkkk8I:#
#
#
„G
…e   
ceŠ.


ed•&ingli’%lƒa----‚?^pt…3„!‹}
ss…5z



g

‡‚@     l’bud„^sƒ7*'
:    4V>ecutƒ3!!ƒQƒSŠS‚    
ist‚& !     ‚

†oX\p/@4 9…FG.ƒ
9m#]

 J    
:)
""ŸV„€€€€¿0Ž…?LLLL&        <
       <!   r‚p!ƒƒU>
I   dL0exitK
pandƒTiiied_sql‰Q!s’lect„Zq77
riment†M ‚‚3



‡$%T
Gt†M!ir–\lain‚!‚>UX#ƒH

„'     ‚SR";icit•       li•2oit\$#on’5rt†Mbs“6qr„‘?ess
%

%
‚
S]

S]

S]

S]
S]
S]z

,


;;&W07        
     
     
     
                          aC

i   6 
$
u#E6!

~tjendr(((:‚z †    ‚(-'#"„:      ed_errcod“vs




                            #7
7
/
?

?  

?



P\uu




(






        !                




M                          "                    

!
'   H
AGion_init?rn“#=ra…IFF1

‚##Š_durŠ:        ct!!„D‚CC2em•@f04393dd47205a4ee2b98ff737dc51a3fdbcc14c055b88d58f5b27d0672158f5„U%7920ce16971e573bc6ec9a48b118c9de2b3a7‹
    ?17a2a57f7eebc72d405f3b640b4a49bcd02364a9c36e04feeb145eccafa3f8dƒw        2369304e4Oad7de056ab1dc9200ŒUf†S'38df08547efae0ff4343da607b723f588bbd66b’d
45ac567eaa9f9‹
84b65f3d62305†*TT'5b5a13f7394dc143aa136f1d4faba6839eaa6dc‘k        '64cd21e2e23ed7cff48f7dafa5e76adde9321c25  >5082298127e2ddae6539beb94f5204b591df64ba2c7da83c7d0faffd6959d8<%6f7a17b78ba617acde90fc810107f34f1a1f2 8bf68513a1c15f‰U!
dc596c4e6018d‡)>95ae21abf045e4ee77980a67ab2c6e03275009e593ee860a2eabf840482372„b96e3076J>affdd41608946fcfcea914ece149038a8b25a62bbe719ed2561c649b86d824„6   >d7b988f40217821a382bc298180e9e6794f3ed79a83c6ef5cae048989b3f86‡e   '7088b19d97cd7a1c805ee95c696abd54f01de4f‹?&3337e3e289915a76ca96e7a05a1a8d4e890d55n   f8c97e97597Š ?96fafe4c110ed7d77fc70a7d690e5edd1e64fefb84b3b5969a722d885de1f2d„G7c4637102a3ae72b799111&d43fa363d54beab6f45db005abac0a7c0c47a7’c     
_fullfsync–Isync–Iab2c2b07b5d3†+NNc496b61722daf2†,ilFit•4tƒeŠz6$or5‚g
W&il&'''''‚ZŠ
ƒN
D    
^        I   w0urƒ4‚VrŠ`A.DllbackŠ!s‚2n!nn         
t

„;j‡
U /
H-G   ///E- $FFF/.G$.

. q<
""ŸV„€€€€¿0nƒnn‚   GŠ_0familiˆŠnout‹zst†      …erƒ3[WfL!'ƒ$%+…9ult†DYdDYdNB†|<…r-ti‚?!ƒg‡A?b90e7189ae6d62e77ba3a308ca5d683f90bbe633cf681865365b8e92792d1c7…f     &a106f8f6493c66eeed08a2dfff0907de54ae76‰A>d895b0655a337b2cd657675f314188a4e9fe614444cc63dfeb3f066f674514ƒN'c49f556e48970561d7ab6a2f24fdd7d9eb81ff2Š"      >79e27fd030226c07691b7d7c23aa81c8d46bc3bef5af39060e1507c82b0523ƒ%bd6358fj#$###>82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6„\    >a8dc8b578f215a969cd899336378966156154710873e68b3d9ac5881b0ff3fƒW   cbde530aŽghown‘h
ntl_busyhandl‘Gchunk_s    data_vers…C
file_point’u
journal_point‹8overwrit’/pragma’          size_hint’Wlimit„r           ync_omit’nwin32_get_handlˆU'd0a50f0797d154fefff724624f00548b5320566‹n   cloexec”{a22108‡3[tasync–    'e7d3b75fe1bde41511b323925af8ae1b910bc4dŠ_      atur‚5




s^8‡D$
‚@
&~edŒf4bb4bd9185ec8f‰wƒ6ˆ<+er
       †:n     'f0a771d6252545740ba9685e312b0e3bb6a641b‘l5be73de’%ield‹$‚;Df#8#"ylew-   -       -1II

M
&





 )W          + '
        
        
        l


       
  

        %0'    SA   

0E            

   
        /I,%
           
control’uflag_random_access”[ctrl‚3 !     34444Mio†*ss
‡jnamB!8‚<‚>efƒ[
e
.    %
/5e
                 e_databas„
journ„
w„system†S‰rƒter

‚M‚^



nŒQ

…sal%%‚!ƒ6dƒU       ƒ‹,Nish†f(Œ/re“2fox†cNst*""""


‚!XDDDD‡'8ƒ5@MF
tW$#ƒ  x


#
R$MG.F/FFF +//#)/`†J>I +3

""ŸV„€€€€¿0Å‚G







?!$($($($(
4)*Y
4)*Y3







(!!$$$           ))))
 

   

           &

       
      &
   0fkei†M/‚
lag&}w 111

iq$ƒ$h
†$‚<ttenaa‚A!AAAAA2(,`
`

        
        
    
Š3‚exibl?
oat†*YY
‚Eƒ‚
<(E= 4i-ush•*8old‹:    er•Rlow                         P<  L\&f
;.!..a|š&*


  ŸX„€€€€¿4Ñ}„(F    91!o
0footprint–=(
pen‘ur          
       
           
       
       
  
     
        


,"
"

"
        "*"*"







        
2


2


2

     j%)
3  j%)
3       j%)
 j%)     &
*   &
*
#g

         
      G

         
      G



  


  


  

)








&
&&  *
*
*

    
          !!
     
       ****
       




,





5



,
                 )
)      i      


         

8
""ŸV„€€€€¿0•”Z
           &

        
           
    0forcŒY
ƒd<     eign‚2
!




ƒ



hZ


„$#1

,+_kei“*y_check†vˆ]$#
listm$#ger†W4k9m‚2`!`````


‚Y„





c;
‚^ƒ   $
)    at‚}U
Sx    m‚{KpnY!ƒ-l
Berli‚#
!ƒ^^m…Fˆ!um*


-!/,//,//,/j)))ward–Lssil„dŽD
delta„dund‚&999999fjj=„'OˆvrƒTƒ‰%ractiongment‚!me„eeƒ=ƒ)''„/…$#f>filenamƒ^dom•K8litst…AŠ[$#ƒ[    _count”yquentŽ
.6„3om        
   
   
   
   

   ;:::::: ((
((

.



{
N
N"        .r
.r

%
%    
%                !(






        
Z



?f  

'
   )
      

      

      
$#
                 



    
$"LI     3!>
b               nt‰…sdir†ll
trict•.ync†V†[ˆt …P
runcat“*s1•8    2•
73-ƒv    Tv


„#
ƒ /
$
8 &(
?]_max_expr_depthptoken„g…OtokenC4†*FFA                         A
auxi‚5{

)(


        ‚N
                       _api†k  vocab†b‚-ul”c       lNN
                  ‚^r`nY‚   -s        ~`=G?

?wfsync†V$i$$‰A!ƒ}kei†schemaŠ
„nction%4

‚J"8     !LG
u#A5ˆ
+4!*
'F#
""ŸV„€€€€ ¿0žW
'
'
'
'
'
'6
6
 
            
 
    











!      
! 
!" R7 R7<[m     ]]                  



                   
        
        
        
        





       




    

'$#)
D"
1
Y!   

%
.0function_list„rther…/>ƒ$+++…_46tur†m[.jzzˆ_%ƒo          
    checkŒOerŒx
ƒ-iŒx
"                 gather’~ƒ0ccŒS::0†Y;
dal†+ooener  S



  -+=00>
Si       
 @G



\    e    &41+    1?
kate_seriv00‚lfkei“:+
opoli…9y_ccw…9  regular…9t
ƒkˆb$     y
 ‚Wp*
_autocommit–;igabyt‘zt„hub„j$ve„"8A:HHHm%‡_     ‚
>ƒrn…/‰
lob†L&‚E!%„"†Gal]ƒVƒQnumak–$oŽ
%ƒM#odƒU,fiŠŠn
gl†"rammar=phƒ3‚Kve–7eaterŽ2$#li†@Œoup(ƒaal6=†7,1‚^ƒ_concatŽW„owt„uarante†y‰6h„#’6
a${w!wwwww'"$#C'‚*e!!h'''% &


)1`'!$l
")#.Z*i
:6d–Iltˆndiiq444444‚o!



F


J!‚LD




+!ui       ]
$i
l…8


     ^ƒ)ƒP.4cn
;3JŠ($3!$'7„+!

J_


#   
ƒ    ‚
""ŸV„€€€€!¿0Ž–{0handler‘G…>
r>d“_heap_limit„

64„en†'

mless++…?„‚&A$‚KEsh†W"            Š[$ve
I




7    7[,,  /"7      W       Wg!‚V&&&"/w%
4‚!

(hV2
%     _isnan“Lposix_fallocu


‚'     strchrnulŽzard•eaderƒTO    ‚3‰c‚Sq p„ &&„Š$\
:viŠ(ldŠ.p                       K']      -++„py
„F1ƒerŽnc…H‹>7%x•4       adecimŽ-db„idden…3Š&…&gh“#er†T„„w"nt‚0
'
'
'


ƒ4†YK
ƒ3stogram“0r‘ji…oldy!ƒ%‚H                k‚pƒ(me“Lno

ƒoo+...…a…%„pe†tSSƒrrend†st“‚`tŠ!‰        lurƒcˆXwv†2…'‚B$#ƒ@ev](&&&„/p‹


‡X        tml”Y tp„
ugeAndrƒ9„yoi†!`‚<
!




9„W
SW.
a,cu:”G
     dentŽ%+1
if“4i‚D
!
ƒ;o„P
‚e


ƒ@eeeƒS
O754ƒS2Œlf    
&   &&'+>

'+>
'+>'+>'+>'+>``
 h=





>>       
>   >       #

:_
:_9)
8
2-
2-
             
G        '     
   
       

       

      
     
       *

y     




           
     

      V
<"   




)



defŒnul“#-gnor    





Z!ƒ?

7==‚@!w



‚„6
E   ?Jifƒ\llŒ

mmediƒ7ŠM ‚N$#…@utŽI    pact‚lement
D!9|      

?


   …"         b#‚~$4/t
+       
 h     
k
Q?&

|Š{3

""ŸV„€€€€"¿0ÊŒ@
K                        %        2/1
$
#

5       0j4%=
0z8        0implicˆZort&&&&&&K,,



‚e;;…j
!f
7†=stˆXrovr4

4
4
5      5      5      
55
5
R
R2gP00
               |4
                              j0. )"
-
4)
:
'RnZ
      
Z
      


    




&
&
&
&
&
&&
&
&       
      

*.<


*.<


*.<


*.<


*.<


*.<
:,      :,      6/
!$$$

%
""     !I"S
"S"S&
  
  &
  
  &
  
  &
  

&
  

1      
)% '    

1      
)% '    "
S    9&QQ

     

     

     

     










 "



"

    
"

 
     
P†u
""ŸV„€€€€#¿0ÀŠ}


        


        


        








       

$ 

$   

$     

$     



      




  




     


     


     
!
  




&
  
                          
        
     


       

    

     

        -



 !       +



"       
   
            0inappropriƒ<clud‚(         …O!ƒ####?      [M(+BY;ompat„!&&‚68g))0‚d6‚h"g,>N
letƒU$†FnsistƒV‚z>„e‡Yrrect*
&
)      
)
)
)
)
)‚*!t*!t$\d


k
."!
!!!A$#i  &U
        =
li‚G!'‚8(reasƒPhQ/4+F$$0
‚
$#'ment“w
        al_vacuum‚>!Y$#fNdent„sNNN„x…3termin‚#x
       
   tL        L        L        L        L        L   
 
      
     2L4



----9z9z

>0T.    ”,)ƒ(36"
!!ŸW„€€€€$¿2¨0R†|0
      
      
      
      
        
               
      !        

    
                
    
         
v#      

      
      
+#" 



!        
O
C0
+#4
$#0index_constraint_limitoffsetusagŠ/info„:†Zƒk($#listm$#xinfo„:ˆQic$:1!11111‚‰$c1$#
Q1; 21
@#
R     vidu†D     0ˆeƒf•in…Bit$$%!%%‚B+„formƒ]22220BQ..‚C        !        $,
,    ,ƒ-
:47ƒN4heritŠ)itƒ[[“i/…V*??‚‚9



‚‚S      B0ner†&…!1+"K‚(ocu„od…@putu!!!!+gBI



k„z[Tsert‚.
!




%%%%Y^


‚Xƒ@$p!$#
5
Y
k2id„By!!p  ZˆV
j‚K"ktanc†b
XPt•Fead‚"!‚_

!

„N   %       $    #    .
        7%=
,  2

(%
    C
r‰ˆ*tŒUw



-ƒ~64_typˆ?eg9…qaa%y/


(c
     *
    w"H$
6C?
6"      Vr‘s  ity_checkƒ8p_

„J
‚0$#7!‚      nd•4ract„V‚Vcept†fac
!
0!
0!
0!
0
!
0!
0        
      

 B^B^B^e
"                 p


!
…}7'7U,       X-XXY       ‚?.‚ <
"
""ŸV„€€€€%¿0¼‹+                





                       ,
Z#


0$#
$

         

        

,
M
    /
 0interferŠ<‡K
n2ƒ‚ƒ&„*
„v<dYation•‚pret†VVƒg>            ‡t
rupt„„Œ&;o&&!6
!6
!6
!6
!6!6;;

,rrrr
66g$           f@Z(t%$#L@8 
 Y
7 roduck)nPcXc$$)4!44^D>      ‚1
$
%F%

a4R" spect†J(valid‡"0‡F$#)S‚BocWk‡„j?&‚?q:
5\   lv‚2!‚MM† WK$#@‚&
ocap_immutŽNpowersafe_overwrit’
tl–Ierr”i
_delete_no‘Hs
5
5   
         
         
           
         
      
,

,  
,
,





#0
   340
        34
0
        34  0
       34E
0
        34E  0
       34E8R8R&@
&@  &@&@
       %"      "     "     
2%22%2)% 

cC  

cC
6&A3-   

;
5

5
    
    
    
            
             V    :






  

   

      


               


                 


        8





…= O7/ƒ:
H
U      
  ŸX„€€€€&¿4Á[



%        

!



   
!!!       



    


@

    

    *   
          
      
     
4             

%         0isnan“Lo–C        l–su„ni,i,‚)7##Vf


N
%    4L:$#‚_t(    
(      
    
    
        
                           
                                        
                                              <0                  
                   ee        !&                


I
II       
                          


)        




):4
     

*

*
   
            

    

            
                 



                                         +





  
   
q  
$#>     
+
        R?

)                
       '
em‚&     





self‚;!xƒ@Œ$job‚C!R †[               ‡u$
‚L        innn
   W
I<I<I<I<I<I<M+F
       "
          "
^6$





    p       
^<

%
                  

m"W    

E*    urnal3ƒM

…rU
…-\
(*
_modŠ-‚N



…^
son
 
 
 
 
 
 o
C‚|                                    i1‡              *   !        xT      ‡
    
EŒ%(2;…&@V
""ŸV„€€€€'¿0Œ  
0json_each†xtract‡'group_arrai‹-object‹-patch‡quot‰R!uliandaiqstƒQb„mƒ|ƒ@4V?^(keeprˆŠ!Xi..
!




‚$
C%7(
‚‚(A               r?
      
,+JyinfoŽ
word„a'   g,,ƒƒO
&„      ‚GD_check
ount
       namindo“Bnow„a0‚            ‹knlabel†}ck†E‚‡‚k'ƒ
lr“nguagƒH!…]ƒ_ueidY‚2ptop†crg@@sD!ƒ5((!.p‚\ƒZE

_
h_er‰IƒI‚$#ƒ4ystBrB3st„9

‚PPƒ‡F‚V
n
_insert_rowidˆterƒCCƒ
!‹UWyer“

I  5B&XBout„"ead†


„~      /ƒ[

      
w
  
<     0]
k„q|((%‰l$#‚8:st„"6‡Pl„=vƒV
s+++†b$‡ftmm ":    
:       
:    :               "
"
])


z!!!p  
!   !   
       6=‚"W
D#

mostŽYgaci11`%%*:9„n!sƒ`ƒ`/     y_alter_t…2file_format„]‚6
iblƒ<mon†5z!'„[ƒ_ngth…OˆP4‚1Q}        $ssy!‚pfMfMˆ
‚w9
'2i
V5t“vel„Y9
BPh‰ibc•Q  rari„s,‚!v‚# 
               (-ƒ
Js(&ght‚;!!!!keyH6<6<6<6<6<6<&8
I  bO$)E



_-"CP$#pB
%!B
+#'
%U

_doesnt_match_blob‹.lihood8



Kmit


!!<
d^$
22 ‚


"

"

"
"‚K$#HI,H'_compound_select,
sql_length,vdbe_opˆ!/B'‚
I&,
BEJ
        ;*5%X*0ƒl&F8x    )ƒ3$#‚i' 
""ŸV„€€€€(¿0“ˆ00limit_worker_threadŽ!ned


TT.666




s        
 
 
            
    !            a           
        l



            #"

*    .7
?c           nois†s†/  k   *     *     *     *     *ƒ‰ƒ?‚mƒHt†M.‚
ux’st„sLLL

"))8‚



‚„8ƒ        ter„VXVVO…'„    ‚H       +tll•=oad<<ƒLBBBB-t†}…
_extensŠ†#Jablƒ[



       
tfCƒ*;6cal"tim…))kƒ9†!‚|…     
Xn9A


5>i      ing_mod’q‚:
        styl“~g‚&‚H               ‹‚T   ic‡,                #   „‚Vwbwm
c…Gng






&))))))6
Y!@*-t'r
(((x4‚\l2‚er?!E   4ƒV‚<l?$#h‚      ‚   CstƒTpathVokƒ6[[y''''ahead’@sid„‚=

0…/„Z
upƒ6**‚Sƒ>"!""„&p%%„


+

$
      
      +."rƒI"ƒe
pŒx
"



ss1„ts$…{w„Y
Best†bt„mac†V‹DK@  t hin‚3!ƒ
Ž
| to6ro‡~†<
       „       ^,B?&de~#//////‰K
'
„sKugic”

nitud‹5%%%†H   i‚-!ƒ4J„BB/8‚$K‚d%g]l†n‚1!
..ƒ-99‚A!‹
Stain„j‹U
enƒ<jor“$ke3S
!|IIIIg              YO!3Be
       Zd$#!$=
J    %
K1%        $b
#       fil‹  +                …q‚7wVlform‹6unct…L4iciƒc                           ƒz‹loc”V„gD
iM     /)*i1T‚FJ
$
N+8'$
1KXY"UƒC63
  ŸX„€€€€)¿4‚
”^&D+           0malloc64Ž
_s’usable_s’n–Oago„i)t;;;#!ƒ'='=„;
#



‚&8@nZ&fest‘Cp‹„Wrk‚"…b‰0‚5'9downƒTerˆ
sk‰[s”gt„>"V"V††`erŠ-‹Dtchƒa
AAAA‚ZE!„\
b
+BH
infoŒ…geriHH




4& & &ƒyŒGh‚+!&x‚2
!




ƒŠ

$
#
k‚r
_allocation_s
ttachŽ/„0memoriˆpage_s“schema_retri=imumƒP‚Yii„Mƒ#ƒ[U'siz„rK,K,K,bc‹2ean†V‹!ingless•*.sur†#‚‚P,,/"…       4‚chanŽ)‚‚-
dia•(gabyt†+@@m3”^
_ephemŽcmpg$#pi.‡db‚%
_default_maxs„r---mov•ori


@

v

/ ;;;-b''                           }!!!?)
 5$##    7"

#
 
2#
$y_alarm‹|highwatŒXusŒXsys4“y
5 “_6“ytrac„s444ntion‡#



u„[(rgˆ+†\  $    ]ssag555555U!5*      
     S
     S(ˆs
#‚rFta•edata†xhod‚C!5Hu     
#ƒ"
<‚zoE<@Yicro‰{?/optim)…gsoftŽnddl†ˆ
‚+-+„ght))<
###i       
iiiii
Z""R7[‚)$LLR]
to

leag”
lisecond‰X!n‚2 !                    (:‚vŠ
$#ƒ]gw–limˆaum_file_descriptorUor+.%B    †}0ƒ30 


?7/uˆ$$$rror„sbehav„";     ior†-cj


ellan
„J|%*W{h†o"
       N+
        6+.(C8$P

„^             9{
U@&"‚8C

‚J

%%ŸS„€€€€*¿*•~|        0miscountfeatur„VinformƒU3matchd$#readzs'''‚#ƒƒG4‚v!‚E‚6/takenli”us:„G
pŠ_U     xŽqed_endian_64bit_float•    kdir’odeo





@!7XX
?$$w            w‚

B
j
HR
&XDof‰if†WƒD‰vi
            
J<c-                 3GB-FƒN
SH! ul„…%„-$#BF6>o
e_list„?mentˆ]nitor“|th‹9re              X
"""
""1111HZ--
        
     

m/                       !! 
!

    
!


!

       /***-        
*


     
! 
 # 55=|"&7
=$#1st…?;;;;Qf‚E
„V
‚$lG$pEli„sve†tˆ(C„Aprintfˆ…c„#n0tester>sŽ vc‡1ƒ„@   „My–luch„[ 2
‚ {ltiƒCCy++++‚G
\…X


Iƒ&
plr


!9‚4‚B"ƒ}="
&!1Bj
M'$   +ex’-Ki‰thread•xst„a3IƒW     tex4„†U…;Q[
_appdef”static_vfs1ŒPysql…  "n‚-GL-L-L-K$$‡‚
        ame
  +++++
...&?&?y%


h
B
Bt###‚!



rM






:C*       4
2
o       !wn“LVtali†ivM(ur‰I!bspB4earA*/$cessari





J!Eˆu
li†)Ced!!




'/>!>>>>>
…iƒ<‚$#;LC
‚:
gŠ'†U st„DƒI„H"ƒa


:V)uY
tbsd’Tver'x‚    ‚RVV…G&//‚{D‚\
\1 ‚H‚Z„;o90   E       "cXT6tƒf

\Y
""ŸV„€€€€+¿0«0new$.          $.   $.     $.   $.$.







OOD


0     (JJJ#,,H       |          40


„

l $#`
;
      
6*:     
    A?       
li’nX!ƒqEE             nam…>xt**…,YYYY'‡wo_charq


stmt”char@gqpylŽ@nnS‡#
o'''              +L=    
=      
        =       
????+8yN
<      
n
a" A     Dq    

,
[+bodi”bcas–
deˆ9(lockŽIn

‚!ƒWWƒ!„
B


~‚c‹}e‰+…5‚-rm†(al‚=!vjjj‰I†ized_sql„siƒ

t22
 

 
  

Q=Q=Q=Q=Q=Q=&#'''9!
!

)

)

    =       c%E
%E
   
Y  



     




D!
.#"#"#" $58<       +!i#
       '

-     )0
a”bt„etˆ   dfound’m
ice_recover_rollback:
w:f•Yi–ndexŽZvicŽ`w(




      !
3.             3.       
        
                      
               <      

-((uj$\†K
PN ƒ-
'?"Š=     8
                    
""ŸV„€€€€,¿0¼Œ;

<!       !  !  
!  4 '1$2
D6!        38
*

:

     
@0nre“,srcŽduisanc“hƒll33t------ 
"

"RRRRRR

             *.f.f  ;!C9

        

        

        


        




‚R#$
R

56
  $
 , valu‘M
    mber'
'
‚&&!&&P
                          2
9*@

‚9!j!A &j"$#&#+)EjU3        *er

„?%p*‰H@@O
a Oo†"`‚<!


9„W
SW
.a   ,36bject„g6"
*X                    ?
„1
x;‚^;   xVscurz;|

[
‚q,!,,rf]
$ƒl1`>1 tainŠ;ƒ/ƒVviat”-
ccasion“:ur{ƒ7[
‚6:
) 
)
)
'+   HP   lT
V6


   7l"/f$,
$,
+&  +&        +& +&+        1!            1!               1!               1!           1      1


GU
,  
      
GU
,  
      GU
,  
      
GU
,GU
,GU
,
F
%

F
%

!

      






                :
                             
     
"
-1
!1
!1
!

$ 

$






/
        J
J
- 




"
D
"
D


   ‚m„H‚Gtzm(‚
""ŸV„€€€€-¿0ˆ4   

                

                

                
 
 


      


      


      
,










        

###                   
    

                               



             
            
             
       
             
              
         


                 
             
      



             ,



             



            

     !        
 









&       






     
     
'#
        
 
"        
*







0off„V"…AN‚4_‚?&‚S_Ler†kic„ji„t‚=           set„
ˆi3
$
#
aten‚#†;     k:_load_perman‰F    !        ld†r/!‚~†Lb‚/=
er…244NY‡5ƒg53$nam…>mitu
    !ƒ[qsO7
f
vBL)$#f‚P_–Nautoinit‘Z
reset…Jbuiltin_testˆZdeprec‹floating_point‘Z@  ‚smemory_alloc”Zrge_sortr$truncate_optim“t
windowfunc.



nE
E

                       /

/
/
        O<
O<
O<

O<
O<
O<


D
”Fc
G     6K$" 
""ŸV„€€€€.¿0µ„"!                            

/

      

/

      

/

     
8     )
         )
     )
   )
    
        0:@830   :@830t /      %
B&%
B&












 

       !  !     !      
    











        


%/        
%/
  
     
  
  (
%%


   *  


      






           
$(

&
' 
             
         

                         '
0oncSSq++++++F!$%!$%!$%!$%!$%
!$%0000ƒ†^‚li



$$$[
>QZ6T,=M!)F


FXf'
$#A/*

LY
./WW'1Fob{mƒa""""p„!>>>„AL†S‚._affin“#_columnŽ
:
„    idxdelet”-f“9
snul“#^
makerecord”-ustbeint“#aoncˆpendup‚seekscan‚2! PPcod‚;!;QQ„E!†ƒZc
enwiiQ!b
0T
N‚HX
-j&$#0‚ Z     _exrescodxnofollow&ƒmutex”privatecach“3
sharedcach“3v2&!!!!!}y           fSbsd>†Xr77












I
*
*
*
*
*
‘;ZƒO]  3`u.
G
  ŸX„€€€€/¿4Ìƒ*YYI

1111'        O
       O'
U,                                

       
$


>                          D?
      )&
c!1n

   

(33(
J    !5!     ;      
   0operandjj„Cp*portun•K3tim
     

      


      

  
       I
     +
     

     +
     

     +
     +

     +
     +      
       
       """"H         
,

2a
a
        




* 

3
3)
  
        
        
                       @
"
"
"
"  










5


$


    
!;
A
     
        
*
 

on
.
..$
!




8        8 
%
%
%

%              
*

H
P.P.P.9

!FFr               

  
      
      
      





                             E


/ ///"       #

6$F
       
         )    
-%B"!r                "

       "
       """
!!
!


d
d
d
d
d
d


&?…z3Še‹V
""ŸV„€€€€0¿0«„
"
"
""R

.pe
.pe

x'5> **



###(       
           
        
  
 #     #  #               1)))!"         4                                             X       
     
    
!";)       
    
-      

&Y1I
60order55

        
      

!




   )=93            *



f"/          
       


0
0 G
1N
                #
$
 
M        <JQ

Ainari…0y88g„jigin





…6„



†~"U=s&‰8j??/5ƒ
3P :
("     :
_unix“dsˆ_$fuzz†+
B&
B&%
ther"+ S>_7
777S8D'$)X3"""‚%1'


 &      *        $$N    5  0wisŠ.


†
$ut'*‚\""""S$^
„####h$$%z:
       m&!6
er"




'ƒ5ƒ['„?ƒn
>

put0
+
+
+
7''''''&4    -&RR/UU#        ‚G

‚$8

        w"%"   I
sid†tver†$i‡o*$‚0$‚zal.†du"flow9†-z\OƒaƒO$#Y
   +
‚'!&C
        head†Slap‘vƒi


-$#oad‘j
read‹ƒeidƒb



z*den’
!un‹*ˆAwrit’ƒA                ten†rwn“LF‚*p9    ackZge7…
5

!((32'''q

‚q




    ‡X…,        `
    &ƒK qƒ'Oo#%      
""ŸV„€€€€1¿0
“U5       m     %?
0page_count’7cs—cachŽ*info’-
r“<b Cramet       D
(D,
),
)}p


L,      *~"        X6
Y         ent‚2E!EEEEEhes„xŽ>s    …;



„gO.4
‚Her„>rc






!‚ƒ`
‚M    It„w    0bb$'‚Ff


†:‚Eiƒcal„M//D                 g



u!cular†fˆ_  t‚<<<<<<ss†G
      ^
†!HƒbtŽ5tchc"!"""""ˆ‡‚h&-----ƒ

84Gmm
olog…5tern‚4@!@@@@@2}+Še  ƒcach”
e_method’s2’endŽƒr

:Xopl„Zr„ ++„‹ncentiljformQ
Q
3339!99999       V
V5)G22<






`& &&#>m#A#A

 D{:=
!


!K%       -?>
chap„V#miss„=bƒtŒJ‚t       sist†]$$‚:!Š
\       hone‘?i‹=ck”G)gkchrƒ<            pe‚38!88888linƒ5k[
$
#
lace„!Š‚-!$!#!=‚Bi”Mn„skkkn‚!!Z]
      
%5Q)77u3:„E‚
‚g;     ner             &    
 


  ]        C
M
&
"[
"[D


=$                    

P ~
            :*$

tform„'#Zpug•0gabl•oint†*ZZ‚E!‚="E5
dE=
4ier      _##&!81gg)‚;!‚_‚lygon…9  ol„
        
     pen‘uular„"+rt”Babl–lsit…
x’T_fallocusibl9A‚M8>     (‚)O)?(A      c<}
0„T6     #8„$
-

#      
  ŸX„€€€€2¿4Ÿ†f&


bg

„      }
d‚!3O 
0post*.P
*
*
*gresql#    kwu3ponƒ6++†Otenti‚%!‚m6&6&x„ZT<5    $    #    
!c+,V/werˆ„|„p$saf’    
e_overwrit’ractic++“$‚,gma:
(!S                 
               

PPP
+
+    4& 
]
#S q



             
#   
                           

"
 #       
+.1    
 1-C_list„?         eadŠ3              llocŒ

ced„^Š„uisƒR        ‚Q‡W
„#‚bompil–jut†existp,
fero„"‡j
2"""„ ixgƒtU\o:)
^ormPpar‚3!1
‚„m       
‚d##‚Y
+e16_v3†pno_vtab„qrm„o persist†q     v2„oƒt‹h

3„


Rflag†processorŽn„^scriptoenc1t„a„7v‚v             ‚R5JƒArvz‚psur’SttiŠvent„        
       tDD5yyy‡=}%Siou‚2!‡O?
‡k!sƒT%4   4     4     ‡:imari…Q‚@(…:A$#{ƒ.itƒ9ntŠ„ƒ ƒOf„<K


‡…_or…2ƒ/


‡"^#J),itiH#v”uatwng„n
obablPlem,


"8+;4

ii
{C         M>

g4
    {*        ?
I6$#        ',.^2 16goE@‡'
AAB9:%E*Z'kOV

""ŸV„€€€€3¿0›•?
0procŠ;ep%%%ƒdurss%%%%
%%<
      

&x,,#<e


$ƒ‚NL  
*>@%%Dor• duct‚ ’Ifil„slll„1!‚E†:
gram‚9 !            444+55…
T             *Tess„sXXXM   _handl„s]]]hibit‹
ject†+pp#mot‰


ˆapag‚'ƒccccer”Cti„

____ŠJPos…/tect4ocolƒV/ŠZ†typ’Tvid
222222

..HOO
!!+
‚Q

8    &                  f+8
6‚
xi“eseudo”
ow’thread‹‡:r†k#
       #
       Tublishˆ]$$ll‡"rg†r--‚!!!sh‚
‚|ƒadownŒtˆ…ˆp writeŠ3qbox######nxŽc‚'ualifi;tiŽ;ntiti•
eri
[
[""       ""
>
_%

>
_%
>
_%
>
_%>
_%>
_%                     

"
"
"
" $+
%

%E0"E"E
        +       
    
    

    -     -




>   %                     
         !
       

     
     
       





      

        

          /1
(              *
        iy_onlih        ick_check†[         r„J
„L[
li†KtKotIAAAAAA''(


=~$„}7

„
c8
a’ _ferror‘i      ile_avail‘ir†0
+ „}~‚3!‚R
aceŠ!ƒ…Axis‚##
!
‚b+‚f
6 ! 
:
‚T

$D.%

E
        V      a2
!!ŸW„€€€€4¿2|…aŽ]0rand_†comŽN„blob•4g„^"„5ˆ^
a
re7ƒj  ‚*‰Y$‚
r†k





spberri‹=ther,,q,,,,,,h&]






EWWZQ…,‚`: 
fKw„Y      3
ŽY
bu„=ƒ($!=Xc4eŽ&…acquir•dZ6           6       6!

#+
       Opp
R
‚j





&$#A
/

 ^n!cfil„c‰Rlin†s„0onli„rNNy_dbmov6
rollbackU$#lŽ…%‚4li†..&Poc64Žrrang1„dsonˆbound’ouild//cent‚;%!%%ogn…uƒn?
\I
$
Rmmend„WYput..„j  ‚ƒnstruct‘Xrd†1=#      ‚vƒB…F†…eriƒB(Œd$#reat”M4ursƒ‚
„y„    /‚R ive_trigg“1
design”jirect‚35!55555uc)ƒ"$$‚‚+!;


‚CVt‚D
-^l<
t„z


//;Œ‚nd„}'ƒAenabl‹gin” factorŽ^?ƒ/hter‚F!;O!
!
!!‚
!/X„2$#enc‡tiŠil•*AlectˆZormat†gardless’exp/             5‡!%„g $#…ion’{‚st†.„VƒN             ‚}
‚   
ress1ˆu'!''ˆwR      -:     implement”mndex–fstat•ject‰l†'†@/,„C
‚at‹5  ‚ƒY‚ionship†x”Meas++
####
##$$$C                xV""/"B#
ƒ*‚####}&  !De_memori”ki
main’_emb†k--T…Govu„wwNƒG‚0‚T

+'UiV-P%P0!(        e_diacrit„pnam,



ƒ
       

"
       

"
       
       ‚a†2‚~    „/e_parŽUderƒ<‹ƒgmopenŽ
rder•K:Ugan“dpairŽl?$#Ors‰S!ˆ?‚
lac„{        5        5Q  \\



j\
6/5uI‚^+
x:!7*q&5?)8$


Z;E+;  &3
"0 
""ŸV„€€€€5¿0–Špƒd
ƒ)      15'
 0replic”n
ortƒ2]
] ‚-       }ƒ                            xsu
!$_.     c‚nreparŽ3ƒsent„:Žrquest’!Vir/       
7@&&&^





†"****|6! !! ‚[‚
search—rv”#?!‚#t„W!…k4!ƒƒistŠolutŽl4$#‚Vdv&n



 ‚yurc„qpect#;!ons‚8!ˆI
‡vtart’%    or‚#(†        ‚<A‡rictˆz


ˆIult       #%%%<;
,        w
K+!+!1
&                        


        
t&
&
          9K...

3          <:           .
!

#  G&'6#     5&n       7_blob64Žerror†$
_cod”Cpoint†f
subtyp‹[text64Ž
zeroblob64ŒTtainri=urn$5    :Hm  
                7
e
!

„
).    " 
LR616       
&       S5typ„b  us‡$                       Œ=versŽ%e_unordered_select†f^ƒ?‚f…_t„0is‹p                   work“$     ƒ
fc„…      !        ‚ƒh†thh‚P
_ˆ5idicul’5ghthh
      3       &3       &
3       &3       &    33ƒVT T       
T    T       e
$
!

‚LC

&
*/(f1,    $iN#E(08
skˆ=i;mdir’obust|‚XŽ"gll~‘T
‚Hback„)))…‚}
0|$#F$,
+2F2'*}ot†++und„Z
     ƒZ3tin†(&„(.U



gƒ
H
    >wX+X+((()(((Qmmm@
@@@"I
I*
I
I*
C

               !‚iAV   
*<  eC]
ygid//‚

‚_cc8PGA
c7<=><12„@'%
ƒ3@
B)ƒ
        2w„       
!!ŸW„€€€€6¿2‡\K       d!"[     /  $     M~4M0rtreea$#?e     *  _int_onli‘yquery_callbackŽHcheck†Fim”0ule•kn

‚!Q               6")

#)!2Fg        I        
>$#^J$rE       H8timi$#s„Bˆ



†9Uafed


‰g†B!ime

W""/A
‚::T<
":

*
M       6
p*  O@!""plŽBndbox’?iti…Itisfi
“veŽ_point~ˆ*‡]calar„‚„s.nOOƒ@
 R‚                            ‚E@             !   6           *.ner•aenarioƒV*hemak
             
!




     ""9999** ---'
2     

`  !        

,‚0$#
,48$    _vers•,ope‹ratch†_‡Kiptƒ<

†g
…?‚6 50
earchŠU‚<

4     g‚"?Icondƒ     ?‰†]
48ariˆ^tor’"ƒur„O‚ƒle_delet†Œ
?e3>....Y!H----‚o:
4
4…_42ƒ  ' -#%kƒ00‹)m‚25!55555=n„j!Dgfault„D
fyy&c%k…] @!

K#Ement”F,ldom

ect(I


&9‚{J$??‚ B



G
'        PE/

+

E8tracŽ(fŠ„…testˆ         mantu‰Vicolon‡1ns‰N!ibl    tˆ;parh::::::S
!

X,L‚   
!

ƒ" ‚EA `?5qu†
Y)Y)‚T              encƒ`>>>
>ƒ$!„9


$ƒ`      #;bti[ri‚$ƒ{aliz–
vŠ‡:,erƒ3i&
‚k3?‚t

((-‚tnNC/.‚ (ƒ+        U0

!!ŸW„€€€€7¿2›ƒK’20session…:ƒUA!      WW&                  !


sSS2@       )
)
ƒ


O///"8"
-R,7v%
8               q
_author•Yxdata:Šlast_insert_rowidˆha1‡~$$$      !$-


$#
    


3


!

sumˆdow8„9rd’xe‚%ƒ…  ‚
‚,       
B      U    ell…BP
;
  
       
       
       

!


          



l

                                        
*



F
‚^

      
imƒ[
‚?9‚~
!

mƒV
‚oortˆJ
Šli”Auld""g‚"
0.            ‹n[
wƒ5CCOK999     ‚9     !        5        ,#         <                        ‚jRan‚3
‚f C$Œrink_memori’utb$#down“BVidex555555 %%%‚A"pUF


7o!‚L#,"63
]$i2a

gnˆ%%%ƒal”,tur“gifico$     antliˆ=lent                              Z!…aŠ
9      ‚vanovich† milar&#####Š:$$li†,ˆ:pl†4I…5†i‚2m!mmmmmf“8i…85aˆp„Uultan”d
ncƒ3    .‚‚5vi$$$W


$   ‚Zƒ3
glr+++#o‚E|ƒZ‚$#>G     6B:ze
   X‚P>AA       ,ql(       (  (       [
'w


k         8B8    
    2       
V
kip‚"?UPm)Q'ƒ@6*†2lightli…@$otˆ
    
     
     w‚&„

‹'mall,…#&…‚S2„] "
er†Lq
o


†_„K
fƒ#‚}‚4
„C
TPCz$

F0" p‚1$[
""ŸV„€€€€8¿0¥
—
        0smallestB"(napshotr   _fre‹+
get‹+
open‹+eak„{ippetprintf•




     )
    
         )
    
    
     )
    
               )      )  )#




$         

2(x
(x


           
                     
* 9"      
              hV            

?      N
(0'%
&  ft”r  _heap_limitQƒ,
n64’|&war’=lari–utƒUme00




2!"(UC8+     ++‚j*
 <(‚G>
L   @1
Zth–Kimƒaˆ2‚H$ƒGrtŠ'tcX
„*er†iHH‡
‚W
$
H_pmasz*urcz
       &&&7

…
              ‚
,   3   $    ‚&AN
‚%e_id


!

                   !$-


$#
    




id†W'‚Zˆpace…9ƒ
‡{      ‚|o
J}nr:::ƒ{3‚>rc“>ƒ
ecial„’Ef{(((ƒ&…Dƒq/‚bi‚0!G'''ˆj
1zO„Qed





;„&!Œ?   3Ftest1ŒS11/'lls$fix@    1‹ <B/$#ill†"‚_        wteƒU0litŠ0ˆ    readsheet†Mgintf>„|Puriouq$
Œm
)
‚
JU*:…#+0)nYS0+
!
  ŸX„€€€€9¿4†0sql







    !


        

                   
SV66
Z/


  !Al
"
$   '$#)2H     +0G%1          ?
$!L     diff‚9!†E!-
 
ite

‚   
=

/                    %EE
=3I‚@5
      



 ‚9$6;"
$% 
/  '
(       :3


!

!$
     -


$#
    


‚I, _analyz†x„hb‚=ƒ


uto_extens“ft
vacuum_pags      backup“H

ind_blob64Žparameter_index–unam—oint†k





text64Žzeroblob•64ŒT
lob‡"LŠ6

_readopenˆJŠ%writ        cancel_auto_extensl    rray_bindƒ:
hangŒZ‡es64w
lose_v2‘Y

olumn_blob• countˆanam†{mpileoption_get“usŒ{†nfig„r)))…(((‚G…!s
text_db_handl”(
        reate_col•ofilenamƒ^unct5„
‚}ion_v2’zmodul‘je_v2‘j       
data_count’.
base_file_objectƒ^
b_cacheflush‹(
onfig„! !&‚B#‰"filenam’handl–:mutex“snam%readonliƒ5MM†y


ƒgƒ-lease_memori’statu†"ƒ!…gM:  ;

|
eserit‚2g
        rop_modul„;    enable_shared_cach”k
rrmsg†i

       or_offset//////str‘=
xpanded_sql‰Q!
tended_errcod“v    sion_init? file_control’u
nam  e_databas„journ„w„nŒQ

…s
ree_filenamƒ^       get_autocommit–;   hard_heap_limit64„   index_constraint_usagŠ/info‹$ƒkiti‹~



‡Xterrupt„„!Œa        
keyword_checkount
nam   last_insert_rowidˆ
imit,†SUƒT…#O%
$
P
'g

1Q>H"' *#
,,ŸL„€€€€:¿'p10sqlite3_load_extensŠ†#Jg“malloc64Ž

emory_alarm‹|highwatŒXusŒX
odul‹$
printfˆ…c„#n0
sŽ                 next_stmt”
orm†(
alized_sql„    open_v2&!!!!!}y       fS        
pcache_method’s2’
repar…5
ƒ;e16_v3†p_v2„oƒt‹h
3„


Rofil‰Q!‚Egress_handl„s]]]        quota_ferror‘i    ile_avail‘i random9„n
ealloc64Žlease_memori”ksetŒQ
ult_blob64Ž
error†$_cod”Cpoint†f
subtyp‹[text64Ž
zeroblob64ŒT
tree_query_callbackŽH      seri‚$ƒ{t_author•Yxdata:Š
last_insert_rowidˆ
hutdown“BV
napshot_fre‹+get‹+open‹+printf•
oft_heap_limit’}
n64’|&urceid†W'‹

tatu”      s64epW…p5mt_busiŽ>ƒY       isexplain„#<readonli’i
   scanstatu&tatu†u

ˆWƒ[r†      glob      icmp’lik        ‹nicmp’
/
ystem_errnoŠ9    table_column_metadata'

emp_directori]
st_controlŽb

otal_chang“u
es64w
rac‰Q!„‚&
r.6ƒW
e_v2†DI




xn_stƒ2O
O     
unlock_notifi“S

ri_boolean’
int64’
kei„
paramet„               value_dupŒGencodfreŒGombind„#Cnochang†Gsubtyp‹xtextˆ_
f“gs_regist‘W#
snprintf’e
tab_col†Hnfig„Ždistinct$
innochang†Grhs_valu   wal_checkpoint_v2%„i x_init?atof†Lchangeset_appli†'start_v2…:ext„# ossectors•(rbu_bp_progressŠ7treeviewexprŽ(selectŽ( _”abortŽ!ƒ
       _rollbackŽ# llow_uri_authork        pi”u        btreeinfo†J# usi
†Z
D5y_reserved_lock—snapshotrcase_sensitive_lik–5      hangesetapply_invert…:      start_invert…:
eckpoint_trunc%    ompileoption_get“us“

nfig_getpcach’     e2’logo‚n  okasid”
memdb_maxs„r***utex”pagecach+…cach’e2’_hdrsz+masz*               scratch”
mall_malloc†_
tmtjrnl_spilŠ.)))straint…/‹%    $    #    
rrupt†[Š$dbconfig_defens „xqs_ddl„Vml„Venable_fts3_token„!…Oload_extensŠqpsg†ytrigg‚1!view‚1!legacy_file_format„!    maindbnam‰no_ckpt_on_closˆO
reset_databas†
trusted_schema„writable_schema„e
data„Y
pag†a
status_cache_hit’+miss’+spil†"us“ed_shar‰G!writ‘qdeferred_fki



lookaside_hit’fmiss_ful’f s’f   schema_us“tmt_us“   ebug.„GGGƒ
fault_automatic_indexn!        "0  $L
::!'#&$ '        ,!71
       A#)8!      !
'%

+
+
*&:!
   6
66ŸB„€€€€;=0sqlite_default_cache_sŠ+foreign_kei’hlookasidˆ:page_sŠ+cache_initszˆ>synchronŠ                  wal_synchronŠ:orker_threadŽ
serialize_readonli„r000
        terminist„‹
      irect_overflow_readˆE‰monli„
sable_fts4_def‘_intrinsˆ<    on’.enable_api_armor(batch_atomic_writ†Scolumn_metadata',,,,dbstat_vtabŒz
eseri†

explain_comŠ„0
fts3_parenthesi-’rtoken5‹rjson1‹qlocking_mod’W$styl”>memory_manag’|)norm…6ull_trimˆ=qpsg†y          
selecttracŽ(orter_refer†tat2’,/M3„CŠ\‚}
4…R‰### #mt_scanstatu&tree_explainŽ)ƒ{
unknown_sql_funct‰T!pdate_delete_limit†N-    wheretracŽ( rror’mR9  xtra_durŠ: fcntl_busyhandl‘Gchunk_s    data_vers…C
file_point’u
journal_point‹8overwrit’/pragma’          size_hint’Wlimit„r             ync_omit’nwin32_get_handlˆU       ts3_max_expr_depthp     ul”c        
have_isnan“L        istori…8index_constraint_limitoffset
it–Q
nocu„
t64_typˆ?  
ocap_immutŽNpowersafe_overwrit’
err”i
_delete_no‘Hlike_doesnt_match_blob‹.
mit_compound_select,
sql_length,vdbe_opˆ
worker_threadŽ!    ockmast„>"V"V††`
x_allocation_s

ttachŽ/„0memoriˆpage_s“schema_retri=  emdb_default_maxs„r---      inimum_file_descriptorU
sus‘jU   
xed_endian_64bit_float•            utex_appdef”static_vfs1ŒPnotfound’m
ice_recover_rollback:
w:offset„p k:
_load_perman‰F      !                mit_–Nautoinit‘Zreset…J
builtin_testˆZ
deprec‹
floating_point‘Z@   ‚s
memory_alloc”Zrge_sortr$
truncate_optim“t
windowfunc.



  pen_exrescodxnofollow&ƒmutex”
privatecach“3
sharedcach“3powersafe_overwrit’        repare_no_vtab„qrm„opersist†q
iv”u
otocolƒV/ŠZ†read‡
only_dbmov6rollbackU$#
name_parŽU
verse_unordered_select)    
tree_int_onli‘yschema     R ecure_delet“%?
qu†
Y)Y)‚T                        orter_pmasz*
urce_id


!

                   !$-


$#
    




        tat1ƒU(†F…84Ž
   us_pagecache_s”     scratch_s”
mt0…x($!%
'&'#+(## $ +$7'
(* 9#      (       " .
 -3 0"…&
""ŸV„€€€€<¿0y0sqlite_stmtjrnl_spilŠ."""status_memus†ureprepar†uun†uvm_stepf      ubtyp„ temp_directori—
stctrl_byteordŽOexplain_stmt’$vdbe_coveragŽb    mpdir]    race_size_limit<
uint64_typˆ?        ntestˆZ                     
tf16_align•ovtab_directonli„
innocu„warn„n‹ 
ing_autoindexozero_malloc“zserver†{""rc„jzlistŽdtabil†yl”b ck‡/H‡{‚|GleŽ
nd,
d
Y"@‚@(ƒU„ƒard#‰%bYF                          …6H3
Wrtv11„E&s%%%‚F



†st‚3!‚Wƒb„b
‚O1ƒU(†F…84‚2Z!ZZZZZ‚}22‡^
   eƒ2ment


        


!!!








"
       U           )
]]:              (3[






/      



nK



#      J;  
X  4
ic‹3gƒW>„Ast‚3!‚>>Œ>ƒuƒ5EEG        4    s64_pagecache_s”  scratch_s”dcall‰Zio’ 
ep‚3!33.UUU‚†R$ƒEp5icki”ill      ‚!ƒJ##‡(B
 bƒ9j mt0?!EnnnL_busiŽ>ƒY      isexplain„#<readonli’i
   scanstatu&tatu†u

ˆWƒ[ jrnl_spilŠ."""status_memus†ureprepar†u
un†uvm_stepfopŽ(1ragq       $    R‚ne…9ƒ
ŠM, K!r†   ai‹*tegiŒx
casecmp–Phrnul7py•
spn†Ldup•Qength„z            .
.   en…Pss4                  ftime•A
glob  icmp’tVliv###ngAA„;nBB[f>iƒU6"!QU~

@6
,
ve’lik     ‹ncmpg$#icmp’
/uctur„"


pW;
ˆ~‚=udioŽnyleoƒryub‚2
=g%!
=g%
=g%
=g%
=g%
=g%ƒ&#
G
+d]=ˆ2*=
zYR '
 %      !
'

‚-!
""ŸV„€€€€=¿0Ÿd$‡d$‡^




0subdirectorijexpress†*""‰
„dfieldp$ject‹iƒ:optim‡*plan‹queridd`        !(
9l$
sO"O"
F0

B:F   ‚             DR      |Hlroutin†L1sequƒVƒTƒ6t†8‹
titut†#>>rƒ

XH9     um‰Q!ystem”Vtyp„  vert†W6cce“wssƒeh~_!$"„,…&2ƒC
ffixggest†mit“
b2m•m"per”Xflu’
gsetŽFpli’{ortG

777             




      4
    =38
    
       
/         




(
)


%'      "


     
ressJ‚YeEre…?JJJJƒ}‚AZ$#q
~Cplu‡1vgƒ<warm†`ymbol*****ƒ

‹M„C\link‹nc†V6‚Dˆƒ       "
hro

Š‡]ƒ9$tact‚4
!




’
x‚                     ;  ja        ]*…
ƒ]X&
!
Fstem†Y.(!„T)


F
(      
-%
+)_errnoŠ9zStƒ=
’n1†abR  R     ƒ(          l    
       
                         

'

'

'

' 

      


 
  
     
  
%/       %/
   -




        
                
         
              
            
GR"    W           
GR"    W

+E
   k'" T‚1a
ˆn=L6=+          E
!!ŸW„€€€€>¿2¦‡'
 
     

      
   

  




!
!
!                











=
                             
           
  
        
    
   


        
% 
!'
       '         
            +
 
      
8
)
; 
    
      0table1•)2•)_column_metadata'info…3
„!†T„listqxinfo…3g„ke†*‡j6
k"‚c
rbal‹

get‚-!Ž"Y‚
bƒPl_name„>cl„EEEX3‰             
0
y#:Y/   8•Xsqlite_init–Qeam“`mpt†i†-
„`](
/
_directori]‡'stor~
e_directori4            orariŠg

ƒN4f‚|1    
li„"7rm*%%%%#t






D

D‚S==5!          
YZ*)q      $#6

     
"‚AN:inz3$#‚sq
st2+      ‚J!         7qKK†




%%%%Q06:Z
    d@

&+5Y_async”`controlŽb      multiplex’xquota‘i     %!regexp`$#        superlock’wcas‰


trl„[#     byteordŽO
explain_stmt’$
vdbe_coveragŽbxtl





I,$„!I/   
'$#@,
   @ han##q------=
#!#####&&T8888       gN  gN
F8"8"WJ


e4X‚vC
$/)P;
N      Lp  
(te"        
e"       

           

           

           

           
‰\      'A
C6               _O
‚u.‚#‚)ƒZ
""ŸV„€€€€?¿0Ò



















            .  


k0*
1


    


k0*
1


    


k0*
1

    


k0*
1
   


k0*
1   


k0*
1VV)

+$+   
$
    

               

  

        

:0  

:0

:

:  
2$d3$d3#:M3  
C

)
C          



)
C          



       




       




       




       


                         



   
        









"         

       

      

                            

#      




#       



#       




    

     $          
   

      

##




              


              

              

       


!!!
     ""      

              &                 
    





     !


                         
    
@

        




""ŸV„€€€€@¿0Гg     


)            


       
       


 
  


0the     


(

       
            


(

       


     


      



     


      


     


      


     





      




    


      




    


      




    


      




    


      




    


      





&





       

#1

        
           

#1

        
       

#1

                    

#1

         

#1

            

#1

         

         
 .


                      



                      



                      



                              



        

!
                  



        

!
    
              

              


  






       
        

             
        

          
        







        
"
       





         

"
       





     ‚|
!!ŸW„€€€€A¿2Ó…c  "
       





     "
       





       
 

  

*
          #      

  

*
          #  &


&
   


      



     
$




          


           


 




          


           


 







        
            
     
            
  
            

    
    
     


     

     
         


              

             



              



              


       










   
     
            







   
     
            




   
     
            



     






     




     
                  


     
                  

     
             
                



 


                



 

                



 
                




""ŸV„€€€€B¿0 ÒŒ>      

    


       

    


               


             
           

       





      




   



      




      

  






       
    

   

    


    


    


    

       
      

        
     

    
        





   




   




   




      






       







       






       
  



"

    
              


           
 




            



      
      $    


      
        




 



        


 

     

  
   

  ŸX„€€€€C¿4µ”
   

    


        

    


     



         
    



     
  



                      


   



       

  


     





    

  






    0thei]
   ]
>




B( ((((
(c       aUUt


'



o

\
        


     $$$#<!k<r99„@††$$tg 
    xm‚&‚!
;]ŠD;‚kselv“`n~%59!99999‚====&SJ„3




„>J       ‚oret’%iƒ]7
*re‚$D!DDDDD

iKKKK&        ;;  ;;†c‚
b‚    
RBq biD2
seƒc…O!


‡<i
`/   /  /  ///$4++/B__       F    7
$  #!##c                  
                
4'',                /   
BF
'"1(
#$        
@=ngoŒS…_k„ZrdƒcŒr&oseu
 <<|

„@w‚I''''„4!‚,L
ugh''’g.sandˆoread3A0-00-00-0j !   ‚+†
†

1>'


saf4•VeŒS##„LsholdŠAough‡!>w„cƒe%u'‚:HH‚***ˆ1‡=icket‚8        
      
J     ..551
##
##
#&*/'&*/'&*/'&*%

     
"##‰s‚}]>$;:„/z%+E)!H
""ŸV„€€€€D¿0LJ2**'5**

 9,,

&&&""04+0+0+0+        /(#/"'

&$#$#$#$#0h(*""3"""!%$#f-
$     

0


!.

0tighterZ
li


me








       
--
#5#=      #)       ]
9
 

r
%


    
P

         



 $$            .
.
        .
.
"               
.3"J%$
       
1
gE
 lin5       >out†+II‡orL…zon”;mpdir
o










     


          
!        


          
!        


          
     


          
  


          
  


          

     
/3
' 

/3
' 
/3
' 
/3
'
/3
'

/3
'

T      

T  $ %
 %
 %
      %

  
    
        




d
  
F
    
F
  ‰tˆ2U
!!ŸW„€€€€E¿2Ó    …
F
  



$H$H$H$H
@    
W"6F
W"6F+
=$(1

+
* 

+
*










                       
     


%




        






      



      


      


      
        )

      

!
   

!  

!       

!   
+

 


     
     
     
     


     
          














.


      
            


      
            


       
            




           




 







      


        N      




       


-
     


            $   

        


  ŸX„€€€€F¿4†•





     


      
       

          
0togeth‰H!‰ƒ\integX   ken‚"
‚!b†XE‚_class=ler’!o‚:!‹F‡[l‹7p†trealX      tal_chang“u
es64wypXuch‡ 



ward†KG)@@rac‰Q!„‚&
r.6ƒWe„B3B3B3‹&6p!_size_limit<v2†DI



k…'|nsact~(4‚}„#‚7"7              h
.`$&T=      fer‡#Ž= Worm‚23!33333‚ientŽ:„H*t…?^^^^ƒ\
!

†3$#‚       latˆ_
‚Seat‚8!Œd


epb      '''g      0+11      ƒ8



{*
      ~
+
9+W    h3‚)i„[$@‡cgger      

   %'%'%''Q  &>               )+&               ‚#59„)ES       
ramƒ8m•ue‚2p!ppppp46)         ]    ]ˆ
ncat„~„-     !    ƒ      …P
+JkŠ†A$#sted_schema„y‚:                  ‚*aaaa

     
    
    
    
…F    r9!5m
ƒesanŠ>urn'‚X „~      !                
<          ‡@%S‚v
*&weakŽ;„DiceŒSo

‚e        

3*EH66L
!
S
!


ƒ1%
‚/
L=1
xn_stƒ2O
Oype


""""
‚…s

                    …]
defof…OŒ#ic
–voƒ>e_‚myu†MM8Žd



buntuŒS55/+intƒ`<<<
<64_typˆ?ltimŠmask„c<Œ$#nabl–|
chang„cZf...…

‚{ommit–v“Ddefin‹,,,,r…EQ„!‚6‚U gon“$li6„odGstand‚!!
!

†[‹>ocu‹|



|‡Lexpectˆa#icodŠ†<$#ƒne61Ž2Eniti†.joG
;;4‚R
  ˆ$#i
qu„}‚Sƒ$
B$
7'/D%9C*‚,$‚8   Wbi‚;$.-
   +t(+(
""ŸV„€€€€G¿0ªŽ.    

@gƒ^"6>0unix&B!‚C^  ‚2



!

    `}$
              $    #    <7#
&\@       W    }
epoch





†jknown‚F!ƒdV]less„„x
)‚_8ƒBik8



K‚VnkŠy…*d
ock_notifi“S       necessari'




‚:JJ ^UUa‰<

[V]korthodoxƒ]pack”-quotŽY!read‹}…Sƒ       cogn’mver‹}l‡"strict†,olˆ9/support‚C!testˆZ          il'‚:11ƒ "wŽ
rustˆusƒ6BBi\‰2ƒ&AƒUu‚9!’gp; 000000     \\y((((R"F…o‚i  $    #    ‚,bql
dat
.





   
          GK
 * *  
` U‚;

gY
0
$
$#+E-
A;[
O    
&grad„‹C*
ƒon’
perƒ_Isertz!‚ward’ri‰

ƒ1ƒ    /&boolean’int64’kei„paramet„s@
@

       

       


, , ,       ,,
,)))!J
!J
!J
!J
!J!J    
/ 
/
!          

!
$
d
      
      
      0

3+3+3+3+
  

$!:

&


?   
OF

        
OF








     




        
 
        

           
      
   

 
 
 
       D‚6,c%*'
?-#/„-
7IA

""ŸV„€€€€H¿0¦ŒS--+





#       
    









%                              



          




        


  

$   #0      

  

         

             
#

0usabl†t22D


g„ ((‚1Jn


ƒ?
„W
eŽ?r…

ƒ‚9=



-ƒW!g.*_vers•Dtc†o++„f†s@@Ž16o$!‚     _align•o8/Š?‡
il‚9!_>‚>!o7
‚=uid„‘x‹0‡X
v†k..Tacuu‚!w((+
i






    ‚F6
‚J‚^1@%)H81lgrind“#idz$2!22222‚]

        ‚]   B    …Y
u####   
000
00  0!55(%%%

F
F
F
F%

5+5+      l&&



        







  )"""
(.


{!)C
&-\=
e_dupŒGencodfreŒG        ombind„#Cnochang†Gsubtyp‹xtextˆ_riŒSCC/9…        &gabl…8ƒ‡

„8
 int†M'‡S‡veti•< ouƒPK'|ƒ


‚1ƒ$       #0f5m!n     dbe‹      ƒ


‚]8,
_addoptracf$#debugf$#trac„sQQQerb„4‰}



ƒg

si,?!‚Šq
$
'&i`#fi((ƒ8„1u†sionk&------8,
M


     ##&&666    #
           ˆA"b        
"!.
‚  _† ;,KIz0
  ŸX„€€€€I¿4#ŠS
             #



 
/-"‚%5 L
               %               DH"        0vestig•/f‚%!^




55m


‚(    
          
          
      ‚H

fp

$
#

          

QE6+
s_regist‘W#e‹

†)  ZK
info‹1listŠ~stat‰H!ia„Š'ƒ2
‚"ewJJ






     
%)
'
)
'))
  ]



SI^
‚G$#‚g
olatp***Œˆrtual0                          J





,




V
&
          
!
tt‚      ==
‚%
i
$#J     .  

        
%"%       ]3u’=
ƒ$siblŽ

†:ualŽnstudio‹        †Jm”4step‚3!s20130nprintf’etab_col†Hnfig„Ž
directonli„stinct$
innocu„nochang†Grhs_valuxwork†Ywap'

3       

3    3 !'~~#
DCD                  *
     
+
     
#F >‚<-        3V#$U

b

*iv†F$O_ƒa+$#‚/‚7t‘flƒ9
E‚
h###‚+[B



#H*


_checkpoint%„i     _v2%„ilLrn--

‚uk2„Y‚&?
ƒ+
ing_autoindexosme##„N/1&8N

[
b

sit”Odg•"ll„AŽ
.    ƒEre‚")!)))))6JwƒI…7‚)>jhatƒbK}‰i!$#^‚
ev„r###notƒden..
 
       
       
       &
&
5     5       5

‚@‚3#!ƒ"†   %
?#)ƒDi (*    )*

 yF
  ŸX„€€€€J¿4·‚t



P               P       "
          $$$$ &"  
[ T

[ Tn
'*
G70
     0
     "*
    



                                         


     

   

       (
 
      
      
#

*




   
         
  
                  

       +   #





    )
      


?e    

$

0whenevo           re!b$*G$*G$*G$*G$*G$*G
       >(Vhhhh
1%
:1%
:

!C              
    







r!
!o&      
!
 

"\+T       G 
$**     in†tracŽ(
ƒther„_
ichLL      9
!


BC.




        \V



%%!mfb9/!$"T:    
.>
le~‚"„!‚Z
y#‚5ƒ1‚0tespac‚"   
       
       
ˆmˆ7oo‚Flenumb‚C!=se†AAˆƒ\y• ide„"-r”+th†#‹o
ldcardƒb„EŠ  5‚:l&&&&&&u###‚)            ++„fyL(Z$##        ,d!9        
  n2k•C32‰…Nƒ+R95•Jc• 
      
dow6|
&!
&
&
&
&
&g    

              
 

 

 k        ƒ7b


h‚np        .K$
K: 16A/sqlite3‰Zth




                            !  !!
Št†H
ƒd\G       ?F)
‚5
""ŸV„€€€€K¿0¬‚2
03
#
03
#

03
#

03

03
03 
'   
'   :F        
F    
F      


 W      $W       $W        $W  a
,e   a
,e
@6E

88                    
                            
                 2  




        
           E 99













/                  ""
"
'            %@s&#



      
c+




     #      


 
0within''„gWWWWJ
‚)


ƒz, 
7 out..„!8Q;7
V
d]
/     
!
!
!
!I
     $#+'F‚nul†wonki…K::rdwrapk'
 




               
   

  

  

(
(
H     1a
        
             1      1
5      $




                          
      




!o!m



+    
  
I      
                
  a

"hC#     
1
<0erŽ!load
ˆqƒ'3'3/)…   )guld‚2+‚SCC‡O1$‚!Hrapper’itabl†U     e schema ‚R##e8>‚OVVƒJ„>>}_vers•fil„U)‰RrƒVten†?D
ong…H‡68ˆ$x‚2
a!
a
a
a
a
a;
‚‚Aƒ>
'[

@t1V      $    #    64ŒS88/._init?%access”,       bestindex‚C!‚,~0ƒR?


column†$nnect„

       urrenttim‹delet‘HvicecharacteristŽNlsym“gfer‰Œn1‚('†<
FW$
9
      5=
J


)
)…O„€€€€L‹"±‰>ˆ_    
0xfilecontrol’mgetlasterror‹syscal’^tempnam”h
nV
$
#
       extsyscal’^releas’K  ollbackto’K        savepoint’Ketsyscal’^temcal’ync’%Iyƒ?
‚=†b
&
ƒ             ear†P …,



t‚-!ieldŒR‚X.ou‘W
rŒS@@/6…pz”;ero‚>!ƒXX$!c„~
=‚sq ^
_malloc“zblob„~ƒ4                 …aip†J
Cfil†&Tulu”;- "
7

2ª
ú
Ñ´Ö³èPÆ2
9greleaselog/3_40_1.html3.40.1
 Miscellaneous performance optimizations result in about 1% fewer CPU cycles
     used on typical workloads.
9Sreleaselog/3_40_1.html3.40.1 Allow two or more indexes to have the same name as long as they are all in
     separate schemas.
9oreleaselog/3_40_1.html3.40.1 Change the algorithm used by SQLite's built-in pseudo-random number generator (PRNG)
     from RC4 to Chacha20.
H
9‚Ureleaselog/3_40_1.html3.40.1
 Provide the new <a href="../compile.html#max_allocation_size">SQLITE_MAX_ALLOCATION_SIZE</a> compile-time option for limiting
     the size of memory allocations.
‚       9„releaselog/3_40_1.html3.40.1      Enhance the <a href="../c3ref/strglob.html">sqlite3_strglob()</a> and <a href="../c3ref/strlike.html">sqlite3_strlike()</a> APIs so that they are able
     to accept NULL pointers for their string parameters and still generate a sensible
     result.
9‚{releaselog/3_40_1.html3.40. Enhance the <a href="../lang_vacuum.html#vacuuminto">VACUUM INTO</a> statement so that it honors the
     <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous</a> setting.
„9‡yreleaselog/3_40_1.html3.40.1 Enhancements to the <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> statement:
     <ol type="a">
     <li> Columns in non-STRICT tables with TEXT affinity should not contain numeric values.
     </li><li> Columns in non-STRICT tables with NUMERIC affinity should not
          contain TEXT values that could be converted into numbers.
     </li><li> Verify that the rows of a <a href="../withoutrowid.html">WITHOUT ROWID</a> table are in the correct order.
     </li></ol>
‚J9„Yreleaselog/3_40_1.html3.40.1 Security enhancement: <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigdefensive">SQLITE_DBCONFIG_DEFENSIVE</a> is augmented to prohibit
     changing the <a href="../pragma.html#pragma_schema_version">schema_version</a>.  The schema_version
     becomes read-only in defensive mode.
x95releaselog/3_40_1.html3.40.1 Add the <a href="../c3ref/value_blob.html">sqlite3_value_encoding()</a> interface.
ƒ%9†releaselog/3_40_1.html3.40.1 A new typedef named <a href="../c3ref/filename.html">sqlite3_filename</a> is added and used to represent
     the name of a database file.  Various interfaces are
     modified to use the new typedef instead of "char*".  This interface
     change should be fully backwards compatible, though it might cause
     (harmless) compiler warnings when rebuilding some legacy applications.
‡79Ž3releaselog/3_40_1.html3.40.1 Query planner enhancements:
     <ol type="a">
     <li> Recognize <a href="../queryplanner.html#covidx">covering indexes</a> on tables with more than 63 columns where
          columns beyond the 63rd column are used in the query and/or are
          referenced by the index.
     </li><li> Extract the values of expressions contained within <a href="../expridx.html">expression indexes</a>
          where practical, rather than recomputing the expression.
     </li><li> The NOT NULL and IS NULL operators (and their equivalents) avoid
          loading the content of large strings and BLOB values from disk.
     </li><li> Avoid materializing a view on which a full scan is performed
          exactly once.  Use and discard the rows of the view as they are computed.
     </li><li> Allow flattening of a subquery that is the right-hand operand of
          a LEFT JOIN in an aggregate query.
     </li></ol>
-9‚releaselog/3_40_1.html3.40.1 Add the <a href="../recovery.html">recovery extension</a> that might be able to recover some content
     from a corrupt database file.
‚S9 „mreleaselog/3_40_1.html3.40.1 Add support for compiling <a href="https://sqlite.org/wasm">SQLite to WASM</a>
     and running it in web browsers.  NB:  The WASM build and its interfaces
     are considered "beta" and are subject to minor changes if the need
     arises.  We anticipate finalizing the interface for the next release.


—ù
Ï
AÁk
»Yß’u—[9‚{releaselog/3_40_0.html3.40. Enhance the <a href="../lang_vacuum.html#vacuuminto">VACUUM INTO</a> statement so that it honors the
     <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous</a> setting.
„9‡yreleaselog/3_40_0.html3.40.0 Enhancements to the <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> statement:
     <ol type="a">
     <li> Columns in non-STRICT tables with TEXT affinity should not contain numeric values.
     </li><li> Columns in non-STRICT tables with NUMERIC affinity should not
          contain TEXT values that could be converted into numbers.
     </li><li> Verify that the rows of a <a href="../withoutrowid.html">WITHOUT ROWID</a> table are in the correct order.
     </li></ol>
‚J9„Yreleaselog/3_40_0.html3.40.0 Security enhancement: <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigdefensive">SQLITE_DBCONFIG_DEFENSIVE</a> is augmented to prohibit
     changing the <a href="../pragma.html#pragma_schema_version">schema_version</a>.  The schema_version
     becomes read-only in defensive mode.
x95releaselog/3_40_0.html3.40.0 Add the <a href="../c3ref/value_blob.html">sqlite3_value_encoding()</a> interface.
ƒ%9†releaselog/3_40_0.html3.40.0 A new typedef named <a href="../c3ref/filename.html">sqlite3_filename</a> is added and used to represent
     the name of a database file.  Various interfaces are
     modified to use the new typedef instead of "char*".  This interface
     change should be fully backwards compatible, though it might cause
     (harmless) compiler warnings when rebuilding some legacy applications.
‡79Ž3releaselog/3_40_0.html3.40.0 Query planner enhancements:
     <ol type="a">
     <li> Recognize <a href="../queryplanner.html#covidx">covering indexes</a> on tables with more than 63 columns where
          columns beyond the 63rd column are used in the query and/or are
          referenced by the index.
     </li><li> Extract the values of expressions contained within <a href="../expridx.html">expression indexes</a>
          where practical, rather than recomputing the expression.
     </li><li> The NOT NULL and IS NULL operators (and their equivalents) avoid
          loading the content of large strings and BLOB values from disk.
     </li><li> Avoid materializing a view on which a full scan is performed
          exactly once.  Use and discard the rows of the view as they are computed.
     </li><li> Allow flattening of a subquery that is the right-hand operand of
          a LEFT JOIN in an aggregate query.
     </li></ol>
-9‚releaselog/3_40_0.html3.40.0 Add the <a href="../recovery.html">recovery extension</a> that might be able to recover some content
     from a corrupt database file.
‚S9 „mreleaselog/3_40_0.html3.40.0 Add support for compiling <a href="https://sqlite.org/wasm">SQLite to WASM</a>
     and running it in web browsers.  NB:  The WASM build and its interfaces
     are considered "beta" and are subject to minor changes if the need
     arises.  We anticipate finalizing the interface for the next release.
~9Areleaselog/3_40_1.html3.40.1SHA3-256 for sqlite3.c: 4d6800e9032ff349376fe612e422b49ba5eb4e378fac0b3e405235d09dd366ab

9[releaselog/3_40_1.html3.40.1SQLITE_SOURCE_ID: 2022-12-28 14:03:47 df5c253c0b3dd24916e4ec7cf77d3db5294cc9fd45ae7b9c5e82ad8197f38a24
A9Ireleaselog/3_40_1.html3.40.1 Various other obscure fixes.
d9ƒ
releaselog/3_40_1.html3.40.1 Fix a potential infinite loop in the <a href="../malloc.html#memsys5">memsys5</a> alternative memory allocator.  This
     bug was introduced by a performance optimization in version 3.39.0.
‚9 ƒOreleaselog/3_40_1.html3.40.1 Fix the <a href="../cli.html#safemode">--safe command-line option</a> to the <a href="../cli.html">CLI</a> such that it correctly disallows the
     use of SQL functions like writefile() that can cause harmful side-effects.

ïÝ
zð\ÎN
Å       5‰½–”Iï‚W,9„sreleaselog/3_39_4.html3.39.4 Fix a long-standing problem with <a href="../lang_altertable.html#altertabrename">ALTER TABLE RENAME</a> that can only arise
     if the <a href="../c3ref/limit.html">sqlite3_limit</a>(<a href="../c3ref/c_limit_attached.html#sqlitelimitsqllength">SQLITE_LIMIT_SQL_LENGTH</a>) is set to a very small value.
I+9Yreleaselog/3_39_4.html3.39.4 Fix some harmless compiler warnings.
‚n*9 …#releaselog/3_39_4.html3.39.4 Fix an incorrect result from a query that uses a view that contains a compound
     SELECT in which only one arm contains a RIGHT JOIN and where the view is not
     the first FROM clause term of the query that contains the view.
     <a href="https://sqlite.org/forum/forumpost/174afeae5734d42d">forum post 174afeae5734d42d</a>.
)9areleaselog/3_39_4.html3.39. Many <a href="../cpu.html#microopt">microoptimizations</a> collectively reduce CPU cycles by about 2.3%.
‚$(9„
releaselog/3_39_4.html3.39.4 The <a href="../lang_select.html#resultset">HAVING clause</a> of a <a href="../lang_select.html">SELECT statement</a> is now allowed on any aggregate query,
     even queries that do not have a <a href="../lang_select.html#resultset">GROUP BY clause</a>.
I'9‚Wreleaselog/3_39_4.html3.39.4 Defer materializing views until the materialization
     is actually needed, thus avoiding unnecessary work if the materialization turns
     out to never be used.
ƒ)&9†releaselog/3_39_4.html3.39.4 The unix os interface resolves all symbolic links in database
     filenames to create a canonical name for the database before the
     file is opened.
     If the <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_NOFOLLOW</a> flag is used with <a href="../c3ref/open.html">sqlite3_open_v2()</a>
     or similar, the open will fail if any element of the path is a
     symbolic link.
p%9%releaselog/3_39_4.html3.39.4 Added the <a href="../c3ref/db_name.html">sqlite3_db_name()</a> interface.
j$9ƒreleaselog/3_39_4.html3.39.4 Add a new return code (value "3") from the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a>
     interface that indicates a query that has both DISTINCT and ORDER BY
     clauses.
‚.#9„!releaselog/3_39_4.html3.39.4 Add new binary comparison operators <a href="../lang_expr.html#isdf">IS NOT DISTINCT FROM</a> and <a href="../lang_expr.html#isdf">IS DISTINCT FROM</a>
     that are equivalent to IS and IS NOT, respective, for compatibility with
     PostgreSQL and SQL standards.
"9 Sreleaselog/3_39_4.html3.39.4 Add (long overdue) support for <a href="../lang_select.html#rjoin">RIGHT and FULL OUTER JOIN</a>.
~!9Areleaselog/3_40_0.html3.40.0SHA3-256 for sqlite3.c: ab8da6bc754642989e67d581f26683dc705b068cea671970f0a7d32cfacbad19

 9[releaselog/3_40_0.html3.40.0SQLITE_SOURCE_ID: 2022-11-16 12:10:08 89c459e766ea7e9165d0beeb124708b955a4950d0f4792f457465d71b158d318
9greleaselog/3_40_0.html3.40.0
 Miscellaneous performance optimizations result in about 1% fewer CPU cycles
     used on typical workloads.
9Sreleaselog/3_40_0.html3.40.0 Allow two or more indexes to have the same name as long as they are all in
     separate schemas.
9oreleaselog/3_40_0.html3.40.0 Change the algorithm used by SQLite's built-in pseudo-random number generator (PRNG)
     from RC4 to Chacha20.
H9‚Ureleaselog/3_40_0.html3.40.0
 Provide the new <a href="../compile.html#max_allocation_size">SQLITE_MAX_ALLOCATION_SIZE</a> compile-time option for limiting
     the size of memory allocations.
‚ 9„releaselog/3_40_0.html3.40.0   Enhance the <a href="../c3ref/strglob.html">sqlite3_strglob()</a> and <a href="../c3ref/strlike.html">sqlite3_strlike()</a> APIs so that they are able
     to accept NULL pointers for their string parameters and still generate a sensible
     result.

Eÿ
òõf¬
ª       †Ï¤¤2¬ÜNÎE=9 Sreleaselog/3_39_3.html3.39.3 Add (long overdue) support for <a href="../lang_select.html#rjoin">RIGHT and FULL OUTER JOIN</a>.
~<9Areleaselog/3_39_4.html3.39.4SHA3-256 for sqlite3.c: f65082298127e2ddae6539beb94f5204b591df64ba2c7da83c7d0faffd6959d8

;9[releaselog/3_39_4.html3.39.4SQLITE_SOURCE_ID: 2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309
M:9‚_releaselog/3_39_4.html3.39.4 Fix a misuse of the <a href="../c3ref/get_auxdata.html">sqlite3_set_auxdata()</a> interface in the
     <a href="https://sqlite.org/src/dir/ext/icu">ICU Extension</a>.
99Kreleaselog/3_39_4.html3.39.4 Fix a possible integer overflow in the size computation for a memory allocation
     in FTS3.
‚o89…#releaselog/3_39_4.html3.39.4 Enhance <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigdefensive">SQLITE_DBCONFIG_DEFENSIVE</a> so that it disallows <a href="../lang_createtrigger.html">CREATE TRIGGER</a>
     statements if one or more of the statements in the body of the trigger write
     into <a href="../vtab.html#xshadowname">shadow tables</a>.
}79ƒ?releaselog/3_39_4.html3.39.4 Fix a long-standing problem in the btree balancer that might, in rare cases,
     cause database corruption if the application uses an
     <a href="../c3ref/pcache_methods2.html">application-defined page cache</a>.
j69  releaselog/3_39_4.html3.39.4 Fix the build on Windows so that it works with -DSQLITE_OMIT_AUTOINIT
<59‚=releaselog/3_39_4.html3.39.4 Other bug and warning fixes.  See the
     <a href="https://sqlite.org/src/timeline?p=version-3.39.3&bt=version-3.39.2">timeline</a>
     for details.
ƒ449†-releaselog/3_39_4.html3.39.4 Use a mutex to protect the <a href="../pragma.html#pragma_temp_store_directory">PRAGMA temp_store_directory</a> and
     <a href="../pragma.html#pragma_data_store_directory">PRAGMA data_store_directory</a> statements, even though they are deprecated and
     documented as not being threadsafe. See
     <a href="https://sqlite.org/forum/forumpost/719a11e1314d1c70">forum post 719a11e1314d1c70</a>.
‚!39 „       releaselog/3_39_4.html3.39.4 Use a statement journal on DML statement affecting two or more database
     rows if the statement makes use of a SQL functions that might abort.  See
     <a href="https://sqlite.org/forum/forumpost/9b9e4716c0d7bbd1">forum thread 9b9e4716c0d7bbd1</a>.
29ƒCreleaselog/3_39_4.html3.39.4 Apply fixes for CVE-2022-35737,  Chromium bugs 1343348 and 1345947,
     <a href="https://sqlite.org/forum/forumpost/3607259d3c">forum post 3607259d3c</a>, and
     other minor problems discovered by internal testing.
719 ‚5releaselog/3_39_4.html3.39.4 Fix a performance regression in the query planner associated with rearranging
     the order of FROM clause terms in the presences of a LEFT JOIN.
09]releaselog/3_39_4.html3.39.4 Enhance the <a href="../stmt.html">sqlite_stmt</a> virtual table so that it buffers all of its output.
z/9ƒ9releaselog/3_39_4.html3.39.4 Fix the initial-prefix optimization for the <a href="../lang_expr.html#regexp">REGEXP</a> extension so that it works
     correctly even if the prefix contains characters that require a 3-byte UTF8
     encoding.
‚
.9ƒYreleaselog/3_39_4.html3.39.4 Fix the build so that is works when the <a href="../compile.html#debug">SQLITE_DEBUG</a> and
     <a href="../compile.html#omit_windowfunc">SQLITE_OMIT_WINDOWFUNC</a> compile-time options are both provided at the
     same time.
~-9ƒAreleaselog/3_39_4.html3.39.4 Fix a long-standing problem in <a href="../fts3.html">FTS3</a> that can only arise when compiled with
     the <a href="../compile.html#enable_fts3_parenthesis">SQLITE_ENABLE_FTS3_PARENTHESIS</a> compile-time option.

ÔÏ
â
pÄ
ø       Ñ       @Ï„*)ÖÔM9ƒCreleaselog/3_39_3.html3.39.3 Apply fixes for CVE-2022-35737,  Chromium bugs 1343348 and 1345947,
     <a href="https://sqlite.org/forum/forumpost/3607259d3c">forum post 3607259d3c</a>, and
     other minor problems discovered by internal testing.
7L9 ‚5releaselog/3_39_3.html3.39.3 Fix a performance regression in the query planner associated with rearranging
     the order of FROM clause terms in the presences of a LEFT JOIN.
K9]releaselog/3_39_3.html3.39.3 Enhance the <a href="../stmt.html">sqlite_stmt</a> virtual table so that it buffers all of its output.
zJ9ƒ9releaselog/3_39_3.html3.39.3 Fix the initial-prefix optimization for the <a href="../lang_expr.html#regexp">REGEXP</a> extension so that it works
     correctly even if the prefix contains characters that require a 3-byte UTF8
     encoding.
‚
I9ƒYreleaselog/3_39_3.html3.39.3 Fix the build so that is works when the <a href="../compile.html#debug">SQLITE_DEBUG</a> and
     <a href="../compile.html#omit_windowfunc">SQLITE_OMIT_WINDOWFUNC</a> compile-time options are both provided at the
     same time.
~H9ƒAreleaselog/3_39_3.html3.39.3 Fix a long-standing problem in <a href="../fts3.html">FTS3</a> that can only arise when compiled with
     the <a href="../compile.html#enable_fts3_parenthesis">SQLITE_ENABLE_FTS3_PARENTHESIS</a> compile-time option.
‚WG9„sreleaselog/3_39_3.html3.39.3 Fix a long-standing problem with <a href="../lang_altertable.html#altertabrename">ALTER TABLE RENAME</a> that can only arise
     if the <a href="../c3ref/limit.html">sqlite3_limit</a>(<a href="../c3ref/c_limit_attached.html#sqlitelimitsqllength">SQLITE_LIMIT_SQL_LENGTH</a>) is set to a very small value.
IF9Yreleaselog/3_39_3.html3.39.3 Fix some harmless compiler warnings.
‚nE9 …#releaselog/3_39_3.html3.39.3 Fix an incorrect result from a query that uses a view that contains a compound
     SELECT in which only one arm contains a RIGHT JOIN and where the view is not
     the first FROM clause term of the query that contains the view.
     <a href="https://sqlite.org/forum/forumpost/174afeae5734d42d">forum post 174afeae5734d42d</a>.
D9areleaselog/3_39_3.html3.39. Many <a href="../cpu.html#microopt">microoptimizations</a> collectively reduce CPU cycles by about 2.3%.
‚$C9„
releaselog/3_39_3.html3.39.3 The <a href="../lang_select.html#resultset">HAVING clause</a> of a <a href="../lang_select.html">SELECT statement</a> is now allowed on any aggregate query,
     even queries that do not have a <a href="../lang_select.html#resultset">GROUP BY clause</a>.
IB9‚Wreleaselog/3_39_3.html3.39.3 Defer materializing views until the materialization
     is actually needed, thus avoiding unnecessary work if the materialization turns
     out to never be used.
ƒ)A9†releaselog/3_39_3.html3.39.3 The unix os interface resolves all symbolic links in database
     filenames to create a canonical name for the database before the
     file is opened.
     If the <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_NOFOLLOW</a> flag is used with <a href="../c3ref/open.html">sqlite3_open_v2()</a>
     or similar, the open will fail if any element of the path is a
     symbolic link.
p@9%releaselog/3_39_3.html3.39.3 Added the <a href="../c3ref/db_name.html">sqlite3_db_name()</a> interface.
j?9ƒreleaselog/3_39_3.html3.39.3 Add a new return code (value "3") from the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a>
     interface that indicates a query that has both DISTINCT and ORDER BY
     clauses.
‚.>9„!releaselog/3_39_3.html3.39.3 Add new binary comparison operators <a href="../lang_expr.html#isdf">IS NOT DISTINCT FROM</a> and <a href="../lang_expr.html#isdf">IS DISTINCT FROM</a>
     that are equivalent to IS and IS NOT, respective, for compatibility with
     PostgreSQL and SQL standards.

ùÜ
%fØX
Ï       ?“Ç žSù‚W]9„sreleaselog/3_39_2.html3.39.2 Fix a long-standing problem with <a href="../lang_altertable.html#altertabrename">ALTER TABLE RENAME</a> that can only arise
     if the <a href="../c3ref/limit.html">sqlite3_limit</a>(<a href="../c3ref/c_limit_attached.html#sqlitelimitsqllength">SQLITE_LIMIT_SQL_LENGTH</a>) is set to a very small value.
I\9Yreleaselog/3_39_2.html3.39.2 Fix some harmless compiler warnings.
‚n[9 …#releaselog/3_39_2.html3.39.2 Fix an incorrect result from a query that uses a view that contains a compound
     SELECT in which only one arm contains a RIGHT JOIN and where the view is not
     the first FROM clause term of the query that contains the view.
     <a href="https://sqlite.org/forum/forumpost/174afeae5734d42d">forum post 174afeae5734d42d</a>.
Z9areleaselog/3_39_2.html3.39. Many <a href="../cpu.html#microopt">microoptimizations</a> collectively reduce CPU cycles by about 2.3%.
‚$Y9„
releaselog/3_39_2.html3.39.2 The <a href="../lang_select.html#resultset">HAVING clause</a> of a <a href="../lang_select.html">SELECT statement</a> is now allowed on any aggregate query,
     even queries that do not have a <a href="../lang_select.html#resultset">GROUP BY clause</a>.
IX9‚Wreleaselog/3_39_2.html3.39.2 Defer materializing views until the materialization
     is actually needed, thus avoiding unnecessary work if the materialization turns
     out to never be used.
ƒ)W9†releaselog/3_39_2.html3.39.2 The unix os interface resolves all symbolic links in database
     filenames to create a canonical name for the database before the
     file is opened.
     If the <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_NOFOLLOW</a> flag is used with <a href="../c3ref/open.html">sqlite3_open_v2()</a>
     or similar, the open will fail if any element of the path is a
     symbolic link.
pV9%releaselog/3_39_2.html3.39.2 Added the <a href="../c3ref/db_name.html">sqlite3_db_name()</a> interface.
jU9ƒreleaselog/3_39_2.html3.39.2 Add a new return code (value "3") from the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a>
     interface that indicates a query that has both DISTINCT and ORDER BY
     clauses.
‚.T9„!releaselog/3_39_2.html3.39.2 Add new binary comparison operators <a href="../lang_expr.html#isdf">IS NOT DISTINCT FROM</a> and <a href="../lang_expr.html#isdf">IS DISTINCT FROM</a>
     that are equivalent to IS and IS NOT, respective, for compatibility with
     PostgreSQL and SQL standards.
S9 Sreleaselog/3_39_2.html3.39.2 Add (long overdue) support for <a href="../lang_select.html#rjoin">RIGHT and FULL OUTER JOIN</a>.
~R9Areleaselog/3_39_3.html3.39.3SHA3-256 for sqlite3.c: 2fc273cf8032b601c9e06207efa0ae80eb73d5a1d283eb91096c815fa9640257

Q9[releaselog/3_39_3.html3.39.3SQLITE_SOURCE_ID: 2022-09-05 11:02:23 4635f4a69c8c2a8df242b384a992aea71224e39a2ccab42d8c0b0602f1e826e8
<P9‚=releaselog/3_39_3.html3.39.3 Other bug and warning fixes.  See the
     <a href="https://sqlite.org/src/timeline?p=version-3.39.3&bt=version-3.39.2">timeline</a>
     for details.
ƒ4O9†-releaselog/3_39_3.html3.39.3 Use a mutex to protect the <a href="../pragma.html#pragma_temp_store_directory">PRAGMA temp_store_directory</a> and
     <a href="../pragma.html#pragma_data_store_directory">PRAGMA data_store_directory</a> statements, even though they are deprecated and
     documented as not being threadsafe. See
     <a href="https://sqlite.org/forum/forumpost/719a11e1314d1c70">forum post 719a11e1314d1c70</a>.
‚!N9 „       releaselog/3_39_3.html3.39.3 Use a statement journal on DML statement affecting two or more database
     rows if the statement makes use of a SQL functions that might abort.  See
     <a href="https://sqlite.org/forum/forumpost/9b9e4716c0d7bbd1">forum thread 9b9e4716c0d7bbd1</a>.

—ÿ
òõf¬
ª
       œ       âõƒ×äSâ—Io9Yreleaselog/3_39_1.html3.39.1 Fix some harmless compiler warnings.
‚nn9 …#releaselog/3_39_1.html3.39.1 Fix an incorrect result from a query that uses a view that contains a compound
     SELECT in which only one arm contains a RIGHT JOIN and where the view is not
     the first FROM clause term of the query that contains the view.
     <a href="https://sqlite.org/forum/forumpost/174afeae5734d42d">forum post 174afeae5734d42d</a>.
m9areleaselog/3_39_1.html3.39. Many <a href="../cpu.html#microopt">microoptimizations</a> collectively reduce CPU cycles by about 2.3%.
‚$l9„
releaselog/3_39_1.html3.39.1 The <a href="../lang_select.html#resultset">HAVING clause</a> of a <a href="../lang_select.html">SELECT statement</a> is now allowed on any aggregate query,
     even queries that do not have a <a href="../lang_select.html#resultset">GROUP BY clause</a>.
Ik9‚Wreleaselog/3_39_1.html3.39.1 Defer materializing views until the materialization
     is actually needed, thus avoiding unnecessary work if the materialization turns
     out to never be used.
ƒ)j9†releaselog/3_39_1.html3.39.1 The unix os interface resolves all symbolic links in database
     filenames to create a canonical name for the database before the
     file is opened.
     If the <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_NOFOLLOW</a> flag is used with <a href="../c3ref/open.html">sqlite3_open_v2()</a>
     or similar, the open will fail if any element of the path is a
     symbolic link.
pi9%releaselog/3_39_1.html3.39.1 Added the <a href="../c3ref/db_name.html">sqlite3_db_name()</a> interface.
jh9ƒreleaselog/3_39_1.html3.39.1 Add a new return code (value "3") from the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a>
     interface that indicates a query that has both DISTINCT and ORDER BY
     clauses.
‚.g9„!releaselog/3_39_1.html3.39.1 Add new binary comparison operators <a href="../lang_expr.html#isdf">IS NOT DISTINCT FROM</a> and <a href="../lang_expr.html#isdf">IS DISTINCT FROM</a>
     that are equivalent to IS and IS NOT, respective, for compatibility with
     PostgreSQL and SQL standards.
f9 Sreleaselog/3_39_1.html3.39.1 Add (long overdue) support for <a href="../lang_select.html#rjoin">RIGHT and FULL OUTER JOIN</a>.
~e9Areleaselog/3_39_2.html3.39.2SHA3-256 for sqlite3.c: bffbaafa94706f0ed234f183af3eb46e6485e7e2c75983173ded76e0da805f11

d9[releaselog/3_39_2.html3.39.2SQLITE_SOURCE_ID: 2022-07-21 15:24:47 698edb77537b67c41adc68f9b892db56bcf9a55e00371a61420f3ddd668e6603
c9ƒCreleaselog/3_39_2.html3.39.2 Apply fixes for CVE-2022-35737,  Chromium bugs 1343348 and 1345947,
     <a href="https://sqlite.org/forum/forumpost/3607259d3c">forum post 3607259d3c</a>, and
     other minor problems discovered by internal testing.
7b9 ‚5releaselog/3_39_2.html3.39.2 Fix a performance regression in the query planner associated with rearranging
     the order of FROM clause terms in the presences of a LEFT JOIN.
a9]releaselog/3_39_2.html3.39.2 Enhance the <a href="../stmt.html">sqlite_stmt</a> virtual table so that it buffers all of its output.
z`9ƒ9releaselog/3_39_2.html3.39.2 Fix the initial-prefix optimization for the <a href="../lang_expr.html#regexp">REGEXP</a> extension so that it works
     correctly even if the prefix contains characters that require a 3-byte UTF8
     encoding.
‚
_9ƒYreleaselog/3_39_2.html3.39.2 Fix the build so that is works when the <a href="../compile.html#debug">SQLITE_DEBUG</a> and
     <a href="../compile.html#omit_windowfunc">SQLITE_OMIT_WINDOWFUNC</a> compile-time options are both provided at the
     same time.
~^9ƒAreleaselog/3_39_2.html3.39.2 Fix a long-standing problem in <a href="../fts3.html">FTS3</a> that can only arise when compiled with
     the <a href="../compile.html#enable_fts3_parenthesis">SQLITE_ENABLE_FTS3_PARENTHESIS</a> compile-time option.

Þ¦
¥˜›
~       þ       DWå9mFµ'¦ÞD9   ‚Oreleaselog/3_38_5.html3.38.5 Added <a href="../json1.html#jptr">the -> and ->> operators</a> for easier processing of JSON.
     The new operators are compatible with MySQL and PostgreSQL.
~9Areleaselog/3_39_0.html3.39.0
SHA3-256 for sqlite3.c: d9c439cacad5e4992d0d25989cfd27a4c4f59a3183c97873bc03f0ad1aa78b7a

9[releaselog/3_39_0.html3.39.0  SQLITE_SOURCE_ID: 2022-06-25 14:57:57 14e166f40dbfa6e055543f8301525f2ca2e96a02a57269818b9e69e162e98918
~9areleaselog/3_39_0.html3.39. Many <a href="../cpu.html#microopt">microoptimizations</a> collectively reduce CPU cycles by about 2.3%.
‚$}9„
releaselog/3_39_0.html3.39.0 The <a href="../lang_select.html#resultset">HAVING clause</a> of a <a href="../lang_select.html">SELECT statement</a> is now allowed on any aggregate query,
     even queries that do not have a <a href="../lang_select.html#resultset">GROUP BY clause</a>.
I|9‚Wreleaselog/3_39_0.html3.39.0 Defer materializing views until the materialization
     is actually needed, thus avoiding unnecessary work if the materialization turns
     out to never be used.
ƒ){9†releaselog/3_39_0.html3.39.0 The unix os interface resolves all symbolic links in database
     filenames to create a canonical name for the database before the
     file is opened.
     If the <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_NOFOLLOW</a> flag is used with <a href="../c3ref/open.html">sqlite3_open_v2()</a>
     or similar, the open will fail if any element of the path is a
     symbolic link.
pz9%releaselog/3_39_0.html3.39.0 Added the <a href="../c3ref/db_name.html">sqlite3_db_name()</a> interface.
jy9ƒreleaselog/3_39_0.html3.39.0 Add a new return code (value "3") from the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a>
     interface that indicates a query that has both DISTINCT and ORDER BY
     clauses.
‚.x9„!releaselog/3_39_0.html3.39.0 Add new binary comparison operators <a href="../lang_expr.html#isdf">IS NOT DISTINCT FROM</a> and <a href="../lang_expr.html#isdf">IS DISTINCT FROM</a>
     that are equivalent to IS and IS NOT, respective, for compatibility with
     PostgreSQL and SQL standards.
w9 Sreleaselog/3_39_0.html3.39.0 Add (long overdue) support for <a href="../lang_select.html#rjoin">RIGHT and FULL OUTER JOIN</a>.
~v9Areleaselog/3_39_1.html3.39.1   SHA3-256 for sqlite3.c: 6d13fcf1c31133da541d1eb8a83552d746f39b81a0657bd4077fed0221749511

u9[releaselog/3_39_1.html3.39.SQLITE_SOURCE_ID: 2022-07-13 19:41:41 7c16541a0efb3985578181171c9f2bb3fdc4bad6a2ec85c6e31ab96f3eff201f
t9]releaselog/3_39_1.html3.39.1 Enhance the <a href="../stmt.html">sqlite_stmt</a> virtual table so that it buffers all of its output.
zs9ƒ9releaselog/3_39_1.html3.39.1 Fix the initial-prefix optimization for the <a href="../lang_expr.html#regexp">REGEXP</a> extension so that it works
     correctly even if the prefix contains characters that require a 3-byte UTF8
     encoding.
‚
r9ƒYreleaselog/3_39_1.html3.39.1 Fix the build so that is works when the <a href="../compile.html#debug">SQLITE_DEBUG</a> and
     <a href="../compile.html#omit_windowfunc">SQLITE_OMIT_WINDOWFUNC</a> compile-time options are both provided at the
     same time.
~q9ƒAreleaselog/3_39_1.html3.39.1 Fix a long-standing problem in <a href="../fts3.html">FTS3</a> that can only arise when compiled with
     the <a href="../compile.html#enable_fts3_parenthesis">SQLITE_ENABLE_FTS3_PARENTHESIS</a> compile-time option.
‚Wp9„sreleaselog/3_39_1.html3.39.1 Fix a long-standing problem with <a href="../lang_altertable.html#altertabrename">ALTER TABLE RENAME</a> that can only arise
     if the <a href="../c3ref/limit.html">sqlite3_limit</a>(<a href="../c3ref/c_limit_attached.html#sqlitelimitsqllength">SQLITE_LIMIT_SQL_LENGTH</a>) is set to a very small value.


c}÷Ö
º0SéFc_9ƒreleaselog/3_38_5.html3.38.5 Fix the <a href="../lang_datefunc.html#localtime">localtime modifier</a> of the <a href="../lang_datefunc.html">date and time functions</a> so that
     it preserves fractional seconds.

9    ‚releaselog/3_38_5.html3.38.5 Fix problems with the new Bloom filter optimization that might cause
     some obscure queries to get an incorrect answer.
‚2     9„)releaselog/3_38_5.html3.38.5      The <a href="../lang_altertable.html">ALTER TABLE</a> statement is changed to silently ignores entries in the
     <a href="../schematab.html">sqlite_schema table</a> that do not parse when <a href="../pragma.html#pragma_writable_schema">PRAGMA writable_schema=ON</a>.
‚09„%releaselog/3_38_5.html3.38. Query planner enhancements:
     <ol type="a">
     <li> Use a Bloom filter to speed up large analytic queries.
     </li><li> Use a balanced merge tree to evaluate UNION or UNION ALL
          compound SELECT statements that have an ORDER BY clause.
     </li></ol>
…Y9Šwreleaselog/3_38_5.html3.38.5 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> <a href="../cli.html#clmnr">Columnar output modes</a> are enhanced to correctly handle tabs
          and newlines embedded in text.
     </li><li> Added options like "--wrap N", "--wordwrap on", and "--quote"
          to the <a href="../cli.html#clmnr">columnar output modes</a>.
     </li><li> Added the <a href="../cli.html#qbox">.mode qbox</a> alias.
     </li><li> The <a href="../cli.html#csv">.import command</a> automatically disambiguates column names.
     </li><li> Use the new <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface to provide better
          error messages.
     </li></ol>
‡9Qreleaselog/3_38_5.html3.38.5 Enhanced the interface to <a href="../vtab.html">virtual tables</a> as follows:
     <ol type="a">
     <li> Added the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a> interface.
     </li><li> Added the <a href="../c3ref/vtab_rhs_value.html">sqlite3_vtab_rhs_value()</a> interface.
     </li><li> Added new operator types <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_LIMIT</a>
          and <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_OFFSET</a>.
     </li><li> Added the <a href="../c3ref/vtab_in.html">sqlite3_vtab_in()</a> interface (and related) to enable
          a virtual table to process <a href="../lang_expr.html#in_op">IN operator</a> constraints all at once,
          rather than processing each value of the right-hand side of the
          IN operator separately.
     </li></ol>
‚9ƒureleaselog/3_38_5.html3.38.5 Added the <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface, which can sometimes
     help to localize an SQL error to a specific character in the input
     SQL text, so that applications can provide better error messages.
‚9ƒreleaselog/3_38_5.html3.38.5 Rename the <a href="../lang_corefunc.html#printf">printf() SQL function</a> to <a href="../lang_corefunc.html#format">format()</a> for better
     compatibility.  The original printf() name is retained as an alias
     for backwards compatibility.
ƒ9…Ireleaselog/3_38_5.html3.38.5 Enhancements to <a href="../lang_datefunc.html">date and time functions</a>:
     <ol type="a">
     <li> Added the <a href="../lang_datefunc.html#uepch">unixepoch() function</a>.
     </li><li> Added the <a href="../lang_datefunc.html#automod">auto modifier</a> and the <a href="../lang_datefunc.html#jdmod">julianday modifier</a>.
     </li></ol>
‚9…Creleaselog/3_38_5.html3.38.5 The JSON functions are now built-ins.  It is no longer necessary
     to use the <a href="../compile.html#enable_json1">-DSQLITE_ENABLE_JSON1</a> compile-time option to enable JSON
     support.  JSON is on by default.  Disable the JSON interface using
     the new <a href="../compile.html#omit_json">-DSQLITE_OMIT_JSON</a> compile-time option.

~
ÊÒB
1®ø_ÐO‡~ƒ9…Ireleaselog/3_38_4.html3.38.4 Enhancements to <a href="../lang_datefunc.html">date and time functions</a>:
     <ol type="a">
     <li> Added the <a href="../lang_datefunc.html#uepch">unixepoch() function</a>.
     </li><li> Added the <a href="../lang_datefunc.html#automod">auto modifier</a> and the <a href="../lang_datefunc.html#jdmod">julianday modifier</a>.
     </li></ol>
‚9…Creleaselog/3_38_4.html3.38.4 The JSON functions are now built-ins.  It is no longer necessary
     to use the <a href="../compile.html#enable_json1">-DSQLITE_ENABLE_JSON1</a> compile-time option to enable JSON
     support.  JSON is on by default.  Disable the JSON interface using
     the new <a href="../compile.html#omit_json">-DSQLITE_OMIT_JSON</a> compile-time option.
D9        ‚Oreleaselog/3_38_4.html3.38.4 Added <a href="../json1.html#jptr">the -> and ->> operators</a> for easier processing of JSON.
     The new operators are compatible with MySQL and PostgreSQL.
~9Areleaselog/3_38_5.html3.38.5SHA3-256 for sqlite3.c: b05ef42ed234009b4b3dfb36c5f5ccf6d728da80f25ee560291269cf6cfe635f

9[releaselog/3_38_5.html3.38.5SQLITE_SOURCE_ID: 2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe
9        qreleaselog/3_38_5.html3.38.5 Fix <a href="../news.html#2022-05-06">a blunder</a> in the <a href="../cli.html">CLI</a> of the 3.38.4 release.

29‚)releaselog/3_38_5.html3.38.5 Other minor patches.  See the
     <a href="https://sqlite.org/src/timeline?p=branch-3.38&bt=version-3.38.3">timeline</a> for
     details.

‚9        …Ereleaselog/3_38_5.html3.38.5 Fix a byte-code problem in the Bloom filter pull-down optimization added by release
     3.38.0 in which an error in the byte code causes the byte code engine to enter an
     infinite loop when the pull-down optimization encounters a NULL key.
     <a href="https://sqlite.org/forum/forumpost/2482b32700384a0f">Forum thread 2482b32700384a0f</a>.
59‚/releaselog/3_38_5.html3.38.5 Other minor patches.  See the
     <a href="https://sqlite.org/src/timeline?p=version-3.38.3&bt=version-3.38.2">timeline</a> for
     details.

ƒ9        …}releaselog/3_38_5.html3.38.5 Fix a case of the query planner be overly aggressive with optimizing automatic-index
     and Bloom-filter construction, using inappropriate ON clause terms to restrict the
     size of the automatic-index or Bloom filter, and resulting in missing rows in the
     output.
     <a href="https://sqlite.org/forum/forumpost/0d3200f4f3bcd3a3">Forum thread 0d3200f4f3bcd3a3</a>.
59‚/releaselog/3_38_5.html3.38.5 Other minor patches.  See the
     <a href="https://sqlite.org/src/timeline?p=version-3.38.2&bt=version-3.38.1">timeline</a> for
     details.

ƒ9        …_releaselog/3_38_5.html3.38.5 Fix a user-discovered problem with the new Bloom filter optimization
     that might cause an incorrect answer when doing a LEFT JOIN with a WHERE
     clause constraint that says that one of the columns on the right table of
     the LEFT JOIN is NULL. See
     <a href="https://sqlite.org/forum/forumpost/031e262a89b6a9d2">forum thread 031e262a89b6a9d2</a>.
t9ƒ-releaselog/3_38_5.html3.38.5 Other minor fixes to assert() statements, test cases, and documentation.
     See the <a href="https://sqlite.org/src/timeline?p=version-3.38.1&bt=version-3.38.0">source code timeline</a>
     for details.

‚3
9„+releaselog/3_38_5.html3.38.5 Fix <a href="../rowvalue.html#rvinop">row value IN operator</a> constraints on <a href="../vtab.html">virtual tables</a> so that they
     work correctly even if the virtual table implementation relies on bytecode
     to filter rows that do not satisfy the constraint.
{9ƒ;releaselog/3_38_5.html3.38.5 Fix the <a href="../lang_corefunc.html#sqlite_offset">sqlite_offset SQL function</a> so that it works correctly even
     in corner cases such as when the argument is a virtual column or the
     column of a view.

>ß
Ã
9\(òOlm6>t%9ƒ-releaselog/3_38_4.html3.38.4 Other minor fixes to assert() statements, test cases, and documentation.
     See the <a href="https://sqlite.org/src/timeline?p=version-3.38.1&bt=version-3.38.0">source code timeline</a>
     for details.

‚3$9„+releaselog/3_38_4.html3.38.4 Fix <a href="../rowvalue.html#rvinop">row value IN operator</a> constraints on <a href="../vtab.html">virtual tables</a> so that they
     work correctly even if the virtual table implementation relies on bytecode
     to filter rows that do not satisfy the constraint.
{#9ƒ;releaselog/3_38_4.html3.38.4 Fix the <a href="../lang_corefunc.html#sqlite_offset">sqlite_offset SQL function</a> so that it works correctly even
     in corner cases such as when the argument is a virtual column or the
     column of a view.
_"9ƒreleaselog/3_38_4.html3.38.4 Fix the <a href="../lang_datefunc.html#localtime">localtime modifier</a> of the <a href="../lang_datefunc.html">date and time functions</a> so that
     it preserves fractional seconds.
!9        ‚releaselog/3_38_4.html3.38.4 Fix problems with the new Bloom filter optimization that might cause
     some obscure queries to get an incorrect answer.
‚2 9„)releaselog/3_38_4.html3.38.4  The <a href="../lang_altertable.html">ALTER TABLE</a> statement is changed to silently ignores entries in the
     <a href="../schematab.html">sqlite_schema table</a> that do not parse when <a href="../pragma.html#pragma_writable_schema">PRAGMA writable_schema=ON</a>.
‚09„%releaselog/3_38_4.html3.38. Query planner enhancements:
     <ol type="a">
     <li> Use a Bloom filter to speed up large analytic queries.
     </li><li> Use a balanced merge tree to evaluate UNION or UNION ALL
          compound SELECT statements that have an ORDER BY clause.
     </li></ol>
…Y9Šwreleaselog/3_38_4.html3.38.4 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> <a href="../cli.html#clmnr">Columnar output modes</a> are enhanced to correctly handle tabs
          and newlines embedded in text.
     </li><li> Added options like "--wrap N", "--wordwrap on", and "--quote"
          to the <a href="../cli.html#clmnr">columnar output modes</a>.
     </li><li> Added the <a href="../cli.html#qbox">.mode qbox</a> alias.
     </li><li> The <a href="../cli.html#csv">.import command</a> automatically disambiguates column names.
     </li><li> Use the new <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface to provide better
          error messages.
     </li></ol>
‡9Qreleaselog/3_38_4.html3.38.4 Enhanced the interface to <a href="../vtab.html">virtual tables</a> as follows:
     <ol type="a">
     <li> Added the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a> interface.
     </li><li> Added the <a href="../c3ref/vtab_rhs_value.html">sqlite3_vtab_rhs_value()</a> interface.
     </li><li> Added new operator types <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_LIMIT</a>
          and <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_OFFSET</a>.
     </li><li> Added the <a href="../c3ref/vtab_in.html">sqlite3_vtab_in()</a> interface (and related) to enable
          a virtual table to process <a href="../lang_expr.html#in_op">IN operator</a> constraints all at once,
          rather than processing each value of the right-hand side of the
          IN operator separately.
     </li></ol>
‚9ƒureleaselog/3_38_4.html3.38.4 Added the <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface, which can sometimes
     help to localize an SQL error to a specific character in the input
     SQL text, so that applications can provide better error messages.
‚9ƒreleaselog/3_38_4.html3.38.4 Rename the <a href="../lang_corefunc.html#printf">printf() SQL function</a> to <a href="../lang_corefunc.html#format">format()</a> for better
     compatibility.  The original printf() name is retained as an alias
     for backwards compatibility.


p
·_  Ü       NËE$‚29ƒureleaselog/3_38_3.html3.38.3 Added the <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface, which can sometimes
     help to localize an SQL error to a specific character in the input
     SQL text, so that applications can provide better error messages.
‚19ƒreleaselog/3_38_3.html3.38.3 Rename the <a href="../lang_corefunc.html#printf">printf() SQL function</a> to <a href="../lang_corefunc.html#format">format()</a> for better
     compatibility.  The original printf() name is retained as an alias
     for backwards compatibility.
ƒ09…Ireleaselog/3_38_3.html3.38.3 Enhancements to <a href="../lang_datefunc.html">date and time functions</a>:
     <ol type="a">
     <li> Added the <a href="../lang_datefunc.html#uepch">unixepoch() function</a>.
     </li><li> Added the <a href="../lang_datefunc.html#automod">auto modifier</a> and the <a href="../lang_datefunc.html#jdmod">julianday modifier</a>.
     </li></ol>
‚/9…Creleaselog/3_38_3.html3.38.3 The JSON functions are now built-ins.  It is no longer necessary
     to use the <a href="../compile.html#enable_json1">-DSQLITE_ENABLE_JSON1</a> compile-time option to enable JSON
     support.  JSON is on by default.  Disable the JSON interface using
     the new <a href="../compile.html#omit_json">-DSQLITE_OMIT_JSON</a> compile-time option.
D.9        ‚Oreleaselog/3_38_3.html3.38.3 Added <a href="../json1.html#jptr">the -> and ->> operators</a> for easier processing of JSON.
     The new operators are compatible with MySQL and PostgreSQL.
~-9Areleaselog/3_38_4.html3.38.4SHA3-256 for sqlite3.c: e6a50effb021858c200e885664611ed3c5e949413ff2dca452ac7ee336b9de1d

,9[releaselog/3_38_4.html3.38.4SQLITE_SOURCE_ID: 2022-05-04 15:45:55 d402f49871152670a62f4f28cacb15d814f2c1644e9347ad7d258e562978e45e
2+9‚)releaselog/3_38_4.html3.38.4 Other minor patches.  See the
     <a href="https://sqlite.org/src/timeline?p=branch-3.38&bt=version-3.38.3">timeline</a> for
     details.

‚*9        …Ereleaselog/3_38_4.html3.38.4 Fix a byte-code problem in the Bloom filter pull-down optimization added by release
     3.38.0 in which an error in the byte code causes the byte code engine to enter an
     infinite loop when the pull-down optimization encounters a NULL key.
     <a href="https://sqlite.org/forum/forumpost/2482b32700384a0f">Forum thread 2482b32700384a0f</a>.
5)9‚/releaselog/3_38_4.html3.38.4 Other minor patches.  See the
     <a href="https://sqlite.org/src/timeline?p=version-3.38.3&bt=version-3.38.2">timeline</a> for
     details.

ƒ(9        …}releaselog/3_38_4.html3.38.4 Fix a case of the query planner be overly aggressive with optimizing automatic-index
     and Bloom-filter construction, using inappropriate ON clause terms to restrict the
     size of the automatic-index or Bloom filter, and resulting in missing rows in the
     output.
     <a href="https://sqlite.org/forum/forumpost/0d3200f4f3bcd3a3">Forum thread 0d3200f4f3bcd3a3</a>.
5'9‚/releaselog/3_38_4.html3.38.4 Other minor patches.  See the
     <a href="https://sqlite.org/src/timeline?p=version-3.38.2&bt=version-3.38.1">timeline</a> for
     details.

ƒ&9        …_releaselog/3_38_4.html3.38.4 Fix a user-discovered problem with the new Bloom filter optimization
     that might cause an incorrect answer when doing a LEFT JOIN with a WHERE
     clause constraint that says that one of the columns on the right table of
     the LEFT JOIN is NULL. See
     <a href="https://sqlite.org/forum/forumpost/031e262a89b6a9d2">forum thread 031e262a89b6a9d2</a>.

2v      e/Œ©ªs{ë25=9‚/releaselog/3_38_3.html3.38.3 Other minor patches.  See the
     <a href="https://sqlite.org/src/timeline?p=version-3.38.2&bt=version-3.38.1">timeline</a> for
     details.

ƒ<9        …_releaselog/3_38_3.html3.38.3 Fix a user-discovered problem with the new Bloom filter optimization
     that might cause an incorrect answer when doing a LEFT JOIN with a WHERE
     clause constraint that says that one of the columns on the right table of
     the LEFT JOIN is NULL. See
     <a href="https://sqlite.org/forum/forumpost/031e262a89b6a9d2">forum thread 031e262a89b6a9d2</a>.
t;9ƒ-releaselog/3_38_3.html3.38.3 Other minor fixes to assert() statements, test cases, and documentation.
     See the <a href="https://sqlite.org/src/timeline?p=version-3.38.1&bt=version-3.38.0">source code timeline</a>
     for details.

‚3:9„+releaselog/3_38_3.html3.38.3 Fix <a href="../rowvalue.html#rvinop">row value IN operator</a> constraints on <a href="../vtab.html">virtual tables</a> so that they
     work correctly even if the virtual table implementation relies on bytecode
     to filter rows that do not satisfy the constraint.
{99ƒ;releaselog/3_38_3.html3.38.3 Fix the <a href="../lang_corefunc.html#sqlite_offset">sqlite_offset SQL function</a> so that it works correctly even
     in corner cases such as when the argument is a virtual column or the
     column of a view.
_89ƒreleaselog/3_38_3.html3.38.3 Fix the <a href="../lang_datefunc.html#localtime">localtime modifier</a> of the <a href="../lang_datefunc.html">date and time functions</a> so that
     it preserves fractional seconds.
79        ‚releaselog/3_38_3.html3.38.3 Fix problems with the new Bloom filter optimization that might cause
     some obscure queries to get an incorrect answer.
‚269„)releaselog/3_38_3.html3.38.3  The <a href="../lang_altertable.html">ALTER TABLE</a> statement is changed to silently ignores entries in the
     <a href="../schematab.html">sqlite_schema table</a> that do not parse when <a href="../pragma.html#pragma_writable_schema">PRAGMA writable_schema=ON</a>.
‚059„%releaselog/3_38_3.html3.38. Query planner enhancements:
     <ol type="a">
     <li> Use a Bloom filter to speed up large analytic queries.
     </li><li> Use a balanced merge tree to evaluate UNION or UNION ALL
          compound SELECT statements that have an ORDER BY clause.
     </li></ol>
…Y49Šwreleaselog/3_38_3.html3.38.3 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> <a href="../cli.html#clmnr">Columnar output modes</a> are enhanced to correctly handle tabs
          and newlines embedded in text.
     </li><li> Added options like "--wrap N", "--wordwrap on", and "--quote"
          to the <a href="../cli.html#clmnr">columnar output modes</a>.
     </li><li> Added the <a href="../cli.html#qbox">.mode qbox</a> alias.
     </li><li> The <a href="../cli.html#csv">.import command</a> automatically disambiguates column names.
     </li><li> Use the new <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface to provide better
          error messages.
     </li></ol>
‡39Qreleaselog/3_38_3.html3.38.3 Enhanced the interface to <a href="../vtab.html">virtual tables</a> as follows:
     <ol type="a">
     <li> Added the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a> interface.
     </li><li> Added the <a href="../c3ref/vtab_rhs_value.html">sqlite3_vtab_rhs_value()</a> interface.
     </li><li> Added new operator types <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_LIMIT</a>
          and <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_OFFSET</a>.
     </li><li> Added the <a href="../c3ref/vtab_in.html">sqlite3_vtab_in()</a> interface (and related) to enable
          a virtual table to process <a href="../lang_expr.html#in_op">IN operator</a> constraints all at once,
          rather than processing each value of the right-hand side of the
          IN operator separately.
     </li></ol>

#a
¨
˜Ð
ǦŠ#…YH9Šwreleaselog/3_38_2.html3.38.2 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> <a href="../cli.html#clmnr">Columnar output modes</a> are enhanced to correctly handle tabs
          and newlines embedded in text.
     </li><li> Added options like "--wrap N", "--wordwrap on", and "--quote"
          to the <a href="../cli.html#clmnr">columnar output modes</a>.
     </li><li> Added the <a href="../cli.html#qbox">.mode qbox</a> alias.
     </li><li> The <a href="../cli.html#csv">.import command</a> automatically disambiguates column names.
     </li><li> Use the new <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface to provide better
          error messages.
     </li></ol>
‡G9Qreleaselog/3_38_2.html3.38.2 Enhanced the interface to <a href="../vtab.html">virtual tables</a> as follows:
     <ol type="a">
     <li> Added the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a> interface.
     </li><li> Added the <a href="../c3ref/vtab_rhs_value.html">sqlite3_vtab_rhs_value()</a> interface.
     </li><li> Added new operator types <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_LIMIT</a>
          and <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_OFFSET</a>.
     </li><li> Added the <a href="../c3ref/vtab_in.html">sqlite3_vtab_in()</a> interface (and related) to enable
          a virtual table to process <a href="../lang_expr.html#in_op">IN operator</a> constraints all at once,
          rather than processing each value of the right-hand side of the
          IN operator separately.
     </li></ol>
‚F9ƒureleaselog/3_38_2.html3.38.2 Added the <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface, which can sometimes
     help to localize an SQL error to a specific character in the input
     SQL text, so that applications can provide better error messages.
‚E9ƒreleaselog/3_38_2.html3.38.2 Rename the <a href="../lang_corefunc.html#printf">printf() SQL function</a> to <a href="../lang_corefunc.html#format">format()</a> for better
     compatibility.  The original printf() name is retained as an alias
     for backwards compatibility.
ƒD9…Ireleaselog/3_38_2.html3.38.2 Enhancements to <a href="../lang_datefunc.html">date and time functions</a>:
     <ol type="a">
     <li> Added the <a href="../lang_datefunc.html#uepch">unixepoch() function</a>.
     </li><li> Added the <a href="../lang_datefunc.html#automod">auto modifier</a> and the <a href="../lang_datefunc.html#jdmod">julianday modifier</a>.
     </li></ol>
‚C9…Creleaselog/3_38_2.html3.38.2 The JSON functions are now built-ins.  It is no longer necessary
     to use the <a href="../compile.html#enable_json1">-DSQLITE_ENABLE_JSON1</a> compile-time option to enable JSON
     support.  JSON is on by default.  Disable the JSON interface using
     the new <a href="../compile.html#omit_json">-DSQLITE_OMIT_JSON</a> compile-time option.
DB9        ‚Oreleaselog/3_38_2.html3.38.2 Added <a href="../json1.html#jptr">the -> and ->> operators</a> for easier processing of JSON.
     The new operators are compatible with MySQL and PostgreSQL.
~A9Areleaselog/3_38_3.html3.38.3SHA3-256 for sqlite3.c: d4d66feffad66ea82073fbb97ae9c84e3615887ebc5168226ccee28d82424517

@9[releaselog/3_38_3.html3.38.3SQLITE_SOURCE_ID: 2022-04-27 12:03:15 9547e2c38a1c6f751a77d4d796894dec4dc5d8f5d79b1cd39e1ffc50df7b3be4
5?9‚/releaselog/3_38_3.html3.38.3 Other minor patches.  See the
     <a href="https://sqlite.org/src/timeline?p=version-3.38.3&bt=version-3.38.2">timeline</a> for
     details.

ƒ>9        …}releaselog/3_38_3.html3.38.3 Fix a case of the query planner be overly aggressive with optimizing automatic-index
     and Bloom-filter construction, using inappropriate ON clause terms to restrict the
     size of the automatic-index or Bloom filter, and resulting in missing rows in the
     output.
     <a href="https://sqlite.org/forum/forumpost/0d3200f4f3bcd3a3">Forum thread 0d3200f4f3bcd3a3</a>.

—Ì
–ó      âR™
‰Á>¸—‚W9ƒreleaselog/3_38_1.html3.38.1 Rename the <a href="../lang_corefunc.html#printf">printf() SQL function</a> to <a href="../lang_corefunc.html#format">format()</a> for better
     compatibility.  The original printf() name is retained as an alias
     for backwards compatibility.
ƒV9…Ireleaselog/3_38_1.html3.38.1 Enhancements to <a href="../lang_datefunc.html">date and time functions</a>:
     <ol type="a">
     <li> Added the <a href="../lang_datefunc.html#uepch">unixepoch() function</a>.
     </li><li> Added the <a href="../lang_datefunc.html#automod">auto modifier</a> and the <a href="../lang_datefunc.html#jdmod">julianday modifier</a>.
     </li></ol>
‚U9…Creleaselog/3_38_1.html3.38.1 The JSON functions are now built-ins.  It is no longer necessary
     to use the <a href="../compile.html#enable_json1">-DSQLITE_ENABLE_JSON1</a> compile-time option to enable JSON
     support.  JSON is on by default.  Disable the JSON interface using
     the new <a href="../compile.html#omit_json">-DSQLITE_OMIT_JSON</a> compile-time option.
DT9        ‚Oreleaselog/3_38_1.html3.38.1 Added <a href="../json1.html#jptr">the -> and ->> operators</a> for easier processing of JSON.
     The new operators are compatible with MySQL and PostgreSQL.
~S9Areleaselog/3_38_2.html3.38.2SHA3-256 for sqlite3.c: 0fbac6b6999f894184899431fb77b9792324c61246b2a010d736694ccaa6d613

R9[releaselog/3_38_2.html3.38.2SQLITE_SOURCE_ID: 2022-03-26 13:51:10 d33c709cc0af66bc5b6dc6216eba9f1f0b40960b9ae83694c986fbf4c1d6f08f
5Q9‚/releaselog/3_38_2.html3.38.2 Other minor patches.  See the
     <a href="https://sqlite.org/src/timeline?p=version-3.38.2&bt=version-3.38.1">timeline</a> for
     details.

ƒP9        …_releaselog/3_38_2.html3.38.2 Fix a user-discovered problem with the new Bloom filter optimization
     that might cause an incorrect answer when doing a LEFT JOIN with a WHERE
     clause constraint that says that one of the columns on the right table of
     the LEFT JOIN is NULL. See
     <a href="https://sqlite.org/forum/forumpost/031e262a89b6a9d2">forum thread 031e262a89b6a9d2</a>.
tO9ƒ-releaselog/3_38_2.html3.38.2 Other minor fixes to assert() statements, test cases, and documentation.
     See the <a href="https://sqlite.org/src/timeline?p=version-3.38.1&bt=version-3.38.0">source code timeline</a>
     for details.

‚3N9„+releaselog/3_38_2.html3.38.2 Fix <a href="../rowvalue.html#rvinop">row value IN operator</a> constraints on <a href="../vtab.html">virtual tables</a> so that they
     work correctly even if the virtual table implementation relies on bytecode
     to filter rows that do not satisfy the constraint.
{M9ƒ;releaselog/3_38_2.html3.38.2 Fix the <a href="../lang_corefunc.html#sqlite_offset">sqlite_offset SQL function</a> so that it works correctly even
     in corner cases such as when the argument is a virtual column or the
     column of a view.
_L9ƒreleaselog/3_38_2.html3.38.2 Fix the <a href="../lang_datefunc.html#localtime">localtime modifier</a> of the <a href="../lang_datefunc.html">date and time functions</a> so that
     it preserves fractional seconds.
K9        ‚releaselog/3_38_2.html3.38.2 Fix problems with the new Bloom filter optimization that might cause
     some obscure queries to get an incorrect answer.
‚2J9„)releaselog/3_38_2.html3.38.2  The <a href="../lang_altertable.html">ALTER TABLE</a> statement is changed to silently ignores entries in the
     <a href="../schematab.html">sqlite_schema table</a> that do not parse when <a href="../pragma.html#pragma_writable_schema">PRAGMA writable_schema=ON</a>.
‚0I9„%releaselog/3_38_2.html3.38. Query planner enhancements:
     <ol type="a">
     <li> Use a Bloom filter to speed up large analytic queries.
     </li><li> Use a balanced merge tree to evaluate UNION or UNION ALL
          compound SELECT statements that have an ORDER BY clause.
     </li></ol>

Oä}IpŽW_ÐO~c9Areleaselog/3_38_1.html3.38.1SHA3-256 for sqlite3.c: 262ba071e960a8a0a6ce39307ae30244a2b0dc9fe1c4c09d0e1070d4353cd92c

b9[releaselog/3_38_1.html3.38.1SQLITE_SOURCE_ID: 2022-03-12 13:37:29 38c210fdd258658321c85ec9c01a072fda3ada94540e3239d29b34dc547a8cbc
ta9ƒ-releaselog/3_38_1.html3.38.1 Other minor fixes to assert() statements, test cases, and documentation.
     See the <a href="https://sqlite.org/src/timeline?p=version-3.38.1&bt=version-3.38.0">source code timeline</a>
     for details.

‚3`9„+releaselog/3_38_1.html3.38.1 Fix <a href="../rowvalue.html#rvinop">row value IN operator</a> constraints on <a href="../vtab.html">virtual tables</a> so that they
     work correctly even if the virtual table implementation relies on bytecode
     to filter rows that do not satisfy the constraint.
{_9ƒ;releaselog/3_38_1.html3.38.1 Fix the <a href="../lang_corefunc.html#sqlite_offset">sqlite_offset SQL function</a> so that it works correctly even
     in corner cases such as when the argument is a virtual column or the
     column of a view.
_^9ƒreleaselog/3_38_1.html3.38.1 Fix the <a href="../lang_datefunc.html#localtime">localtime modifier</a> of the <a href="../lang_datefunc.html">date and time functions</a> so that
     it preserves fractional seconds.
]9        ‚releaselog/3_38_1.html3.38.1 Fix problems with the new Bloom filter optimization that might cause
     some obscure queries to get an incorrect answer.
‚2\9„)releaselog/3_38_1.html3.38.1  The <a href="../lang_altertable.html">ALTER TABLE</a> statement is changed to silently ignores entries in the
     <a href="../schematab.html">sqlite_schema table</a> that do not parse when <a href="../pragma.html#pragma_writable_schema">PRAGMA writable_schema=ON</a>.
‚0[9„%releaselog/3_38_1.html3.38. Query planner enhancements:
     <ol type="a">
     <li> Use a Bloom filter to speed up large analytic queries.
     </li><li> Use a balanced merge tree to evaluate UNION or UNION ALL
          compound SELECT statements that have an ORDER BY clause.
     </li></ol>
…YZ9Šwreleaselog/3_38_1.html3.38.1 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> <a href="../cli.html#clmnr">Columnar output modes</a> are enhanced to correctly handle tabs
          and newlines embedded in text.
     </li><li> Added options like "--wrap N", "--wordwrap on", and "--quote"
          to the <a href="../cli.html#clmnr">columnar output modes</a>.
     </li><li> Added the <a href="../cli.html#qbox">.mode qbox</a> alias.
     </li><li> The <a href="../cli.html#csv">.import command</a> automatically disambiguates column names.
     </li><li> Use the new <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface to provide better
          error messages.
     </li></ol>
‡Y9Qreleaselog/3_38_1.html3.38.1 Enhanced the interface to <a href="../vtab.html">virtual tables</a> as follows:
     <ol type="a">
     <li> Added the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a> interface.
     </li><li> Added the <a href="../c3ref/vtab_rhs_value.html">sqlite3_vtab_rhs_value()</a> interface.
     </li><li> Added new operator types <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_LIMIT</a>
          and <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_OFFSET</a>.
     </li><li> Added the <a href="../c3ref/vtab_in.html">sqlite3_vtab_in()</a> interface (and related) to enable
          a virtual table to process <a href="../lang_expr.html#in_op">IN operator</a> constraints all at once,
          rather than processing each value of the right-hand side of the
          IN operator separately.
     </li></ol>
‚X9ƒureleaselog/3_38_1.html3.38.1 Added the <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface, which can sometimes
     help to localize an SQL error to a specific character in the input
     SQL text, so that applications can provide better error messages.


‘8
µ/     òh‹W!‘m9]releaselog/3_38_0.html3.38.0
SQLITE_SOURCE_ID: 2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab

‚2l9„)releaselog/3_38_0.html3.38.0  The <a href="../lang_altertable.html">ALTER TABLE</a> statement is changed to silently ignores entries in the
     <a href="../schematab.html">sqlite_schema table</a> that do not parse when <a href="../pragma.html#pragma_writable_schema">PRAGMA writable_schema=ON</a>.
‚0k9„%releaselog/3_38_0.html3.38. Query planner enhancements:
     <ol type="a">
     <li> Use a Bloom filter to speed up large analytic queries.
     </li><li> Use a balanced merge tree to evaluate UNION or UNION ALL
          compound SELECT statements that have an ORDER BY clause.
     </li></ol>
…Yj9Šwreleaselog/3_38_0.html3.38.0 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> <a href="../cli.html#clmnr">Columnar output modes</a> are enhanced to correctly handle tabs
          and newlines embedded in text.
     </li><li> Added options like "--wrap N", "--wordwrap on", and "--quote"
          to the <a href="../cli.html#clmnr">columnar output modes</a>.
     </li><li> Added the <a href="../cli.html#qbox">.mode qbox</a> alias.
     </li><li> The <a href="../cli.html#csv">.import command</a> automatically disambiguates column names.
     </li><li> Use the new <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface to provide better
          error messages.
     </li></ol>
‡i9Qreleaselog/3_38_0.html3.38.0 Enhanced the interface to <a href="../vtab.html">virtual tables</a> as follows:
     <ol type="a">
     <li> Added the <a href="../c3ref/vtab_distinct.html">sqlite3_vtab_distinct()</a> interface.
     </li><li> Added the <a href="../c3ref/vtab_rhs_value.html">sqlite3_vtab_rhs_value()</a> interface.
     </li><li> Added new operator types <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_LIMIT</a>
          and <a href="../c3ref/c_index_constraint_eq.html">SQLITE_INDEX_CONSTRAINT_OFFSET</a>.
     </li><li> Added the <a href="../c3ref/vtab_in.html">sqlite3_vtab_in()</a> interface (and related) to enable
          a virtual table to process <a href="../lang_expr.html#in_op">IN operator</a> constraints all at once,
          rather than processing each value of the right-hand side of the
          IN operator separately.
     </li></ol>
‚h9ƒureleaselog/3_38_0.html3.38.0 Added the <a href="../c3ref/errcode.html">sqlite3_error_offset()</a> interface, which can sometimes
     help to localize an SQL error to a specific character in the input
     SQL text, so that applications can provide better error messages.
‚g9ƒreleaselog/3_38_0.html3.38.0 Rename the <a href="../lang_corefunc.html#printf">printf() SQL function</a> to <a href="../lang_corefunc.html#format">format()</a> for better
     compatibility.  The original printf() name is retained as an alias
     for backwards compatibility.
ƒf9…Ireleaselog/3_38_0.html3.38.0 Enhancements to <a href="../lang_datefunc.html">date and time functions</a>:
     <ol type="a">
     <li> Added the <a href="../lang_datefunc.html#uepch">unixepoch() function</a>.
     </li><li> Added the <a href="../lang_datefunc.html#automod">auto modifier</a> and the <a href="../lang_datefunc.html#jdmod">julianday modifier</a>.
     </li></ol>
‚e9…Creleaselog/3_38_0.html3.38.0 The JSON functions are now built-ins.  It is no longer necessary
     to use the <a href="../compile.html#enable_json1">-DSQLITE_ENABLE_JSON1</a> compile-time option to enable JSON
     support.  JSON is on by default.  Disable the JSON interface using
     the new <a href="../compile.html#omit_json">-DSQLITE_OMIT_JSON</a> compile-time option.
Dd9        ‚Oreleaselog/3_38_0.html3.38.0 Added <a href="../json1.html#jptr">the -> and ->> operators</a> for easier processing of JSON.
     The new operators are compatible with MySQL and PostgreSQL.

‹½ÊL        ²       S™EŒ7ôdí‹_}9releaselog/3_37_2.html3.37.2 Other minor fixes to assert() statements and test cases.

t|9-releaselog/3_37_2.html3.37.2 Improved robustness of the --safe option in the <a href="../cli.html">CLI</a>.
{9]releaselog/3_37_2.html3.37.2 Fix an OOB read that can occur in <a href="../fts5.html">FTS5</a> when reading corrupt database files.
‚?z9        „Ereleaselog/3_37_2.html3.37.2 Fix a bug introduced by the <a href="../lang_upsert.html">UPSERT</a> enhancements of <a href="../releaselog/3_35_0.html">version 3.35.0</a> that
     can cause incorrect byte-code to be generated for some obscure but valid
     SQL, possibly resulting in a NULL-pointer dereference.
Ry9kreleaselog/3_37_2.html3.37.2 Use less memory to hold the database schema.

5x9‚/releaselog/3_37_2.html3.37.2
 Added the <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_EXRESCODE</a> flag option to <a href="../c3ref/open.html">sqlite3_open_v2()</a>.
;w9‚;releaselog/3_37_2.html3.37.2  Added new <a href="../c3ref/changes.html">sqlite3_changes64()</a> and <a href="../c3ref/total_changes.html">sqlite3_total_changes64()</a> interfaces.
ƒv9…greleaselog/3_37_2.html3.37. The <a href="../series.html">generate_series</a> table-valued function extension is modified so that
     the first parameter ("START") is now required.  This is done as a way to
     demonstrate how to write table-valued functions with required parameters.
     The legacy behavior is available using the -DZERO_ARGUMENT_GENERATE_SERIES
     compile-time option.
6u9‚1releaselog/3_37_2.html3.37.2 The query planner now omits ORDER BY clauses on subqueries and views 
     if removing those clauses does not change the semantics of the query.
Ut9‚oreleaselog/3_37_2.html3.37.2 The <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> does not and has never worked for the TEMP
     database.  That limitation is now noted in the documentation.
s9Ireleaselog/3_37_2.html3.37.2 Added the <a href="../c3ref/autovacuum_pages.html">sqlite3_autovacuum_pages()</a> interface.
…r9‰qreleaselog/3_37_2.html3.37.2 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> Add the <a href="../cli.html#dotconn">.connection</a> command, allowing the CLI to keep multiple database
          connections open at the same time.
     </li><li> Add the <a href="../cli.html#safemode">--safe command-line option</a> that disables
          <a href="../cli.html#dotcmd">dot-commands</a> and SQL statements that might cause side-effects that extend
          beyond the single database file named on the command-line.
     </li><li> Performance improvements when reading SQL statements
          that span many lines.
     </li></ol>
{q9;releaselog/3_37_2.html3.37.2 Added the <a href="../pragma.html#pragma_table_list">PRAGMA table_list</a> statement.
ƒop9‡#releaselog/3_37_2.html3.37.2 When adding columns that contain a
     <a href="../lang_createtable.html#ckconst">CHECK constraint</a> or a <a href="../gencol.html">generated column</a> containing a <a href="../lang_createtable.html#notnullconst">NOT NULL constraint</a>,
     the <a href="../lang_altertable.html#altertabaddcol">ALTER TABLE ADD COLUMN</a> now checks new constraints against
     preexisting rows in the database and will only proceed if no constraints
     are violated.
>o9        ‚Creleaselog/3_37_2.html3.37.2 <a href="../stricttables.html">STRICT tables</a> provide a prescriptive style of data type management,
     for developers who prefer that kind of thing.
~n9Areleaselog/3_38_0.html3.38.0SHA3-256 for sqlite3.c: a69af0a88d59271a2dd3c846a3e93cbd29e7c499864f6c0462a3b4160bee1762


‚
Ÿ1Ì=
¼       ‰ïiÖA‚;‚9‚;releaselog/3_37_1.html3.37.1     Added new <a href="../c3ref/changes.html">sqlite3_changes64()</a> and <a href="../c3ref/total_changes.html">sqlite3_total_changes64()</a> interfaces.
ƒ‚
9…greleaselog/3_37_1.html3.37. The <a href="../series.html">generate_series</a> table-valued function extension is modified so that
     the first parameter ("START") is now required.  This is done as a way to
     demonstrate how to write table-valued functions with required parameters.
     The legacy behavior is available using the -DZERO_ARGUMENT_GENERATE_SERIES
     compile-time option.
6‚     9‚1releaselog/3_37_1.html3.37.1 The query planner now omits ORDER BY clauses on subqueries and views 
     if removing those clauses does not change the semantics of the query.
U9‚oreleaselog/3_37_1.html3.37.1 The <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> does not and has never worked for the TEMP
     database.  That limitation is now noted in the documentation.
‚9Ireleaselog/3_37_1.html3.37.1 Added the <a href="../c3ref/autovacuum_pages.html">sqlite3_autovacuum_pages()</a> interface.
…‚9‰qreleaselog/3_37_1.html3.37.1 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> Add the <a href="../cli.html#dotconn">.connection</a> command, allowing the CLI to keep multiple database
          connections open at the same time.
     </li><li> Add the <a href="../cli.html#safemode">--safe command-line option</a> that disables
          <a href="../cli.html#dotcmd">dot-commands</a> and SQL statements that might cause side-effects that extend
          beyond the single database file named on the command-line.
     </li><li> Performance improvements when reading SQL statements
          that span many lines.
     </li></ol>
{‚9;releaselog/3_37_1.html3.37.1 Added the <a href="../pragma.html#pragma_table_list">PRAGMA table_list</a> statement.
ƒo‚9‡#releaselog/3_37_1.html3.37.1 When adding columns that contain a
     <a href="../lang_createtable.html#ckconst">CHECK constraint</a> or a <a href="../gencol.html">generated column</a> containing a <a href="../lang_createtable.html#notnullconst">NOT NULL constraint</a>,
     the <a href="../lang_altertable.html#altertabaddcol">ALTER TABLE ADD COLUMN</a> now checks new constraints against
     preexisting rows in the database and will only proceed if no constraints
     are violated.
>‚9        ‚Creleaselog/3_37_1.html3.37.1 <a href="../stricttables.html">STRICT tables</a> provide a prescriptive style of data type management,
     for developers who prefer that kind of thing.
~‚9Areleaselog/3_37_2.html3.37.2SHA3-256 for sqlite3.c: 1bb01c382295cba85ec4685cedc52a7477cdae71cc37f1ad0f48719a17af1e1e

‚9[releaselog/3_37_2.html3.37.2SQLITE_SOURCE_ID: 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5d17a0
b‚9       releaselog/3_37_2.html3.37.2 Other minor fixes that should not impact production builds.

‚j9…releaselog/3_37_2.html3.37.2 Fix a long-standing problem with ON DELETE CASCADE and ON UPDATE CASCADE
     in which a cache of the <a href="../opcode.html">bytecode</a> used to implement the cascading change
     was not being reset following a local DDL change.
     <a href="https://sqlite.org/src/info/5232c9777fe4fb13">Check-in 5232c9777fe4fb13</a>.
„]~9        ‰releaselog/3_37_2.html3.37.2 Fix <a href="https://sqlite.org/forum/forumpost/b03d86f9516cb3a2">a bug</a> introduced
     in <a href="../releaselog/3_35_0.html">version 3.35.0</a> (2021-03-12) that 
     <a href="../howtocorrupt.html#svptbug">can cause database corruption</a>
     if a <a href="../lang_savepoint.html">SAVEPOINT</a> is rolled back while in <a href="../pragma.html#pragma_temp_store">PRAGMA temp_store=MEMORY</a> mode,
     and other changes are made, and then the outer transaction commits.
     <a href="https://sqlite.org/src/info/73c2b50211d3ae26">Check-in 73c2b50211d3ae26</a>

CGò
¯
¨F·6
iã
P»üC5‚9‚/releaselog/3_37_0.html3.37.0
 Added the <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_EXRESCODE</a> flag option to <a href="../c3ref/open.html">sqlite3_open_v2()</a>.
;‚9‚;releaselog/3_37_0.html3.37.0  Added new <a href="../c3ref/changes.html">sqlite3_changes64()</a> and <a href="../c3ref/total_changes.html">sqlite3_total_changes64()</a> interfaces.
ƒ‚9…greleaselog/3_37_0.html3.37. The <a href="../series.html">generate_series</a> table-valued function extension is modified so that
     the first parameter ("START") is now required.  This is done as a way to
     demonstrate how to write table-valued functions with required parameters.
     The legacy behavior is available using the -DZERO_ARGUMENT_GENERATE_SERIES
     compile-time option.
6‚9‚1releaselog/3_37_0.html3.37.0 The query planner now omits ORDER BY clauses on subqueries and views 
     if removing those clauses does not change the semantics of the query.
U‚9‚oreleaselog/3_37_0.html3.37.0 The <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> does not and has never worked for the TEMP
     database.  That limitation is now noted in the documentation.
‚9Ireleaselog/3_37_0.html3.37.0 Added the <a href="../c3ref/autovacuum_pages.html">sqlite3_autovacuum_pages()</a> interface.
…‚9‰qreleaselog/3_37_0.html3.37.0 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> Add the <a href="../cli.html#dotconn">.connection</a> command, allowing the CLI to keep multiple database
          connections open at the same time.
     </li><li> Add the <a href="../cli.html#safemode">--safe command-line option</a> that disables
          <a href="../cli.html#dotcmd">dot-commands</a> and SQL statements that might cause side-effects that extend
          beyond the single database file named on the command-line.
     </li><li> Performance improvements when reading SQL statements
          that span many lines.
     </li></ol>
{‚9;releaselog/3_37_0.html3.37.0 Added the <a href="../pragma.html#pragma_table_list">PRAGMA table_list</a> statement.
ƒo‚9‡#releaselog/3_37_0.html3.37.0 When adding columns that contain a
     <a href="../lang_createtable.html#ckconst">CHECK constraint</a> or a <a href="../gencol.html">generated column</a> containing a <a href="../lang_createtable.html#notnullconst">NOT NULL constraint</a>,
     the <a href="../lang_altertable.html#altertabaddcol">ALTER TABLE ADD COLUMN</a> now checks new constraints against
     preexisting rows in the database and will only proceed if no constraints
     are violated.
>‚9        ‚Creleaselog/3_37_0.html3.37.0 <a href="../stricttables.html">STRICT tables</a> provide a prescriptive style of data type management,
     for developers who prefer that kind of thing.
~‚9Areleaselog/3_37_1.html3.37.1SHA3-256 for sqlite3.c: 915afb3f29c2d217ea0c283326a9df7d505e6c73b40236f0b33ded91f812d174

‚9[releaselog/3_37_1.html3.37.1SQLITE_SOURCE_ID: 2021-12-30 15:30:28 378629bf2ea546f73eee84063c5358439a12f7300e433f18c9e1bddd948dea62
_‚9releaselog/3_37_1.html3.37.1 Other minor fixes to assert() statements and test cases.

t‚9-releaselog/3_37_1.html3.37.1 Improved robustness of the --safe option in the <a href="../cli.html">CLI</a>.
‚9]releaselog/3_37_1.html3.37.1 Fix an OOB read that can occur in <a href="../fts5.html">FTS5</a> when reading corrupt database files.
‚?‚9        „Ereleaselog/3_37_1.html3.37.1 Fix a bug introduced by the <a href="../lang_upsert.html">UPSERT</a> enhancements of <a href="../releaselog/3_35_0.html">version 3.35.0</a> that
     can cause incorrect byte-code to be generated for some obscure but valid
     SQL, possibly resulting in a NULL-pointer dereference.
R‚
9kreleaselog/3_37_1.html3.37.1 Use less memory to hold the database schema.

5‚9‚/releaselog/3_37_1.html3.37.1
 Added the <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_EXRESCODE</a> flag option to <a href="../c3ref/open.html">sqlite3_open_v2()</a>.

L«›
ˆ
M       €ÒŠ        ’WOL‚/9ƒCreleaselog/3_35_5.html3.35.5 Use less memory when running <a href="../lang_vacuum.html">VACUUM</a> on databases containing very large
     TEXT or BLOB values.  It is no longer necessary to hold the entire TEXT
     or BLOB in memory all at once.
‚‚.9ƒMreleaselog/3_35_5.html3.35.5 Add support for the <a href="../lang_returning.html">RETURNING</a> clause on <a href="../lang_delete.html">DELETE</a>, <a href="../lang_insert.html">INSERT</a>, and
     <a href="../lang_update.html">UPDATE</a> statements.
‚7‚-9„3releaselog/3_35_5.html3.35.5 Generalize <a href="../lang_upsert.html">UPSERT</a>:
     <ol type="a">
     <li> Allow multiple ON CONFLICT clauses that are evaluated in order,
     </li><li> The final ON CONFLICT clause may omit the conflict target and
          yet still use DO UPDATE.
     </li></ol>
‚,9Qreleaselog/3_35_5.html3.35.5 Added support for <a href="../lang_altertable.html#altertabdropcol">ALTER TABLE DROP COLUMN</a>.
i‚+9        ƒreleaselog/3_35_5.html3.35.5 Added <a href="../lang_mathfunc.html">built-in SQL math functions()</a>. (Requires the
     <a href="../compile.html#enable_math_functions">-DSQLITE_ENABLE_MATH_FUNCTIONS</a> compile-time option.)
~‚*9Areleaselog/3_36_0.html3.36.0
SHA3-256 for sqlite3.c: 2a8e87aaa414ac2d45ace8eb74e710935423607a8de0fafcb36bbde5b952d157

‚)9[releaselog/3_36_0.html3.36.0 SQLITE_SOURCE_ID: 2021-06-18 18:36:39 5c9a6c06871cb9fe42814af9c039eb6da5427a6ec28f187af7ebfb62eafa66e5
5‚(9‚/releaselog/3_36_0.html3.36. The <a href="https://sqlite.org/src/file/ext/misc/regexp.c">REGEXP extension</a> is
     now included in <a href="../cli.html">CLI</a> builds.

*‚'9‚releaselog/3_36_0.html3.36.0 Improve the <a href="../optoverview.html#constprop">constant-propagation optimization</a> so that it works on
     non-join queries.
l‚&9ƒreleaselog/3_36_0.html3.36.0 Back out the EXISTS-to-IN optimization (item 8b in the
     <a href="../releaselog/3_35_0.html">SQLite 3.35.0 change log</a>)
     as it was found to slow down queries more often than speed them up.
Y‚%9‚wreleaselog/3_36_0.html3.36.0 The "memdb" VFS now allows the same in-memory database to be shared among
     multiple database connections in the same process as long as the
     database name begins with "/".
ƒ7‚$9†3releaselog/3_36_0.html3.36.0 The <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> and <a href="../c3ref/serialize.html">sqlite3_serialize()</a> interfaces are now
     enabled by default.  The -DSQLITE_ENABLE_DESERIALIZE compile-time option is
     no longer required.  Instead, there is a new <a href="../compile.html#omit_deserialize">-DSQLITE_OMIT_DESERIALIZE</a>
     compile-time option to omit those interfaces.
‚|‚#9…=releaselog/3_36_0.html3.36.0 An error is raised on any attempt to access the <a href="../lang_createtable.html#rowid">rowid</a> of a VIEW or subquery.
     Formerly, the rowid of a VIEW would be indeterminate and often would be NULL.
     The -DSQLITE_ALLOW_ROWID_IN_VIEW compile-time option is available to restore
     the legacy behavior for applications that need it.
{‚"9;releaselog/3_36_0.html3.36.0 Byte-order marks at the start of a token are skipped as if they
     were whitespace.
‚!9        ireleaselog/3_36_0.html3.36.0 Improvement to the <a href="../eqp.html">EXPLAIN QUERY PLAN</a> output to make it easier to
     understand.
~‚ 9Areleaselog/3_37_0.html3.37.0
SHA3-256 for sqlite3.c: a202a950ab401cda052e81259e96d6e64ad91faaaaf5690d769f64c2ab962f27

‚9[releaselog/3_37_0.html3.37.0SQLITE_SOURCE_ID: 2021-11-27 14:13:22 bd41822c7424d393a30e92ff6cb254d25c26769889c1499a18a0b9339f5d6c8a
R‚9kreleaselog/3_37_0.html3.37.0 Use less memory to hold the database schema.


®sš <›®i‚59  ƒreleaselog/3_35_5.html3.35.5 Fix <a href="https://www.sqlite.org/src/info/1c24a659e6d7f3a1">a bug</a> in the new DROP COLUMN
     feature when used on columns that are indexed and that are quoted in the index
     definition.
…‚49‰releaselog/3_35_5.html3.35.5
 Bug fixes:
     <ol type="a">
     <li> Fix a potential NULL pointer dereference when processing a
          syntactically incorrect SELECT statement with a correlated WHERE
          clause and a "HAVING 0" clause.  (Also fixed in the 3.34.1 patch release.)
     </li><li> Fix a <a href="https://www.sqlite.org/src/info/ee51301f316c09e9">bug in the IN-operator optimization</a>
          of version 3.33.0 that can cause an incorrect answer.
     </li><li> Fix incorrect answers from the <a href="../lang_expr.html#like">LIKE operator</a> if the pattern ends with "%" and there
          is an "ESCAPE '_'" clause.
     </li></ol>
„`‚39‰releaselog/3_35_5.html3.35.5  <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> Enhance the ".stats" command to accept new arguments "stmt" and
          "vmstep", causing prepare statement statistics and only the
          virtual-machine step count to be shown, respectively.
     </li><li> Add the ".filectrl data_version" command.
     </li><li> Enhance the ".once" and ".output" commands so that if the destination argument
          begins with "|" (indicating that output is redirected into a pipe) then the
          argument does not need to be quoted.
     </li></ol>
‹v‚29—1releaselog/3_35_5.html3.35. Query planner/optimizer improvements:
     <ol type="a">
     <li> Enhancements to the <a href="../optoverview.html#minmax">min/max optimization</a> so that it works better
          with the IN operator and the OP_SeekScan optimization of the 
          previous release.
     </li><li> Attempt to process EXISTS operators in the WHERE clause as if
          they were IN operators, in cases where this is a valid transformation
          and seems likely to improve performance.
     </li><li> Allow UNION ALL sub-queries to be <a href="../optoverview.html#flattening">flattened</a> even if the parent query is a join.
     </li><li> Use an index, if appropriate, on IS NOT NULL expressions in the WHERE clause,
          even if STAT4 is disabled.
     </li><li> Expressions of the form "x IS NULL" or "x IS NOT NULL" might be converted to simply
          FALSE or TRUE, if "x" is a column that has a "NOT NULL" constraint and is not
          involved in an outer join.
     </li><li> Avoid checking foreign key constraints on an UPDATE statement if the UPDATE does
          not modify any columns associated with the foreign key.
     </li><li> Allow WHERE terms to be <a href="../optoverview.html#pushdown">pushed down</a> into sub-queries
          that contain window functions,
          as long as the WHERE term is made up of entirely of constants and copies of expressions
          found in the PARTITION BY clauses of all window functions in the sub-query.
     </li></ol>
ƒU‚19†oreleaselog/3_35_5.html3.35.5 The <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenabletrigger">SQLITE_DBCONFIG_ENABLE_TRIGGER</a> and <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableview">SQLITE_DBCONFIG_ENABLE_VIEW</a>
     settings are modified so that they only control triggers and views
     in the main database schema or in attached database schemas and not in
     the TEMP schema. TEMP triggers and views are always allowed.
ƒ       ‚09…Wreleaselog/3_35_5.html3.35.5 Add support for the <a href="../lang_with.html#mathint">MATERIALIZED</a> and <a href="../lang_with.html#mathint">NOT MATERIALIZED</a> hints when
     specifying <a href="../lang_with.html">common table expressions</a>.  The default behavior was
     formerly NOT MATERIALIZED, but is now changed to MATERIALIZED for
     CTEs that are used more than once.

®Y
He?      €«\Mp‚®P‚D9 ‚greleaselog/3_35_5.html3.35.5 Fix a defect in the query planner optimization identified by 
     item 8b above.  Ticket
     <a href="https://sqlite.org/src/info/de7db14784a08053">de7db14784a08053</a>.
ƒj‚C9‡releaselog/3_35_5.html3.35.5  Improvements the <a href="../vtab.html#xbestindex">xBestIndex</a> method in the implementation of the
     (unsupported) <a href="https://sqlite.org/src/file/ext/misc/wholenumber.c">wholenumber virtual table</a>
     extension so that it does a better job of convincing the query planner to
     avoid trying to materialize a table with an infinite number of rows.
     <a href="https://sqlite.org/forum/forumpost/b52a020ce4">Forum post b52a020ce4</a>.
Y‚B9‚wreleaselog/3_35_5.html3.35. Fix the EBCDIC character classifier so that it understands newlines as whitespace.
     <a href="https://sqlite.org/forum/forumpost/58540ce22dcd5fdcd">Forum post 58540ce22dcd</a>.
‚‚A9ƒ[releaselog/3_35_5.html3.35.5 Fix to the <a href="../syntax/select-stmt.html">SELECT statement syntax diagram</a> so that the FROM clause
     syntax is shown correctly.  
     <a href="https://sqlite.org/forum/forumpost/9ed02582fe">Forum post 9ed02582fe</a>.
L‚@9_releaselog/3_35_5.html3.35.5 Fix some incorrect assert() statements.
Q‚?9‚greleaselog/3_35_5.html3.35.5 Improvements to error messages generated by faulty common table expressions.
     <a href="https://sqlite.org/forum/forumpost/aa5a0431c99e631">Forum post aa5a0431c99e</a>.
ƒ‚>9…areleaselog/3_35_5.html3.35.5 Fix the <a href="../cli.html#dotmode">"box" output mode</a> in the <a href="../cli.html">CLI</a> so that it works with statements that
     returns one or more rows of zero columns (such as <a href="../pragma.html#pragma_incremental_vacuum">PRAGMA incremental_vacuum</a>).
     <a href="https://sqlite.org/forum/forumpost/afbbcb5b72">Forum post afbbcb5b72</a>.
y‚=97releaselog/3_35_5.html3.35.5 Fix a problem in the filename normalizer of the unix <a href="../vfs.html">VFS</a>.
‚ ‚<9„releaselog/3_35_5.html3.35.5 When materializing correlated <a href="../lang_with.html">common table expressions</a>, do so separately for each
     use case, as that is required for correctness.  This fixes a problem that was
     introduced by the MATERIALIZED hint enhancement.
ƒ       ‚;9  …Yreleaselog/3_35_5.html3.35.5 Enhance the OP_OpenDup opcode of the <a href="../opcode.html">bytecode engine</a> so that it works even if the
     cursor being duplicated itself came from OP_OpenDup.  Fix for
     <a href="https://www.sqlite.org/src/info/bb8a9fd4a9b7fce5">ticket bb8a9fd4a9b7fce5</a>.
     This problem only came to light due to the recent MATERIALIZED hint enhancement.
‚"‚:9„      releaselog/3_35_5.html3.35.5 Limit the new UNION ALL optimization described by item 8c in the
     3.35.0 release so that it does not try to make too many new subqueries.
     See <a href="https://sqlite.org/forum/forumpost/140a67d3d2">forum thread 140a67d3d2</a>
     for details.
_‚99ƒreleaselog/3_35_5.html3.35.5 Fix a problem in the <a href="../sqldiff.html">sqldiff</a> utility program having to do with
     unusual whitespace characters in a <a href="../vtab.html">virtual table</a> definition.
‚D‚89„Mreleaselog/3_35_5.html3.35.5 Ensure that date/time functions with no arguments (which generate
     responses that depend on the current time) are treated as
     <a href="../deterministic.html">non-deterministic functions</a>. Ticket
     <a href="https://sqlite.org/src/info/2c6c8689fb5f3d2f">2c6c8689fb5f3d2f</a>
E‚79        ‚Qreleaselog/3_35_5.html3.35.5 Fix a problem in the 
     <a href="http://www.sqlite.org/src/file/ext/misc/appendvfs.c">appendvfs.c</a>
     extension that was introduced into version 3.35.0.
#‚69‚releaselog/3_35_5.html3.35.5 Improve the built-in documentation for the <a href="../cli.html#dump">.dump</a> command in the <a href="../cli.html">CLI</a>.

.,
VÌL½<
O       Š‚òƒU‚R9†oreleaselog/3_35_4.html3.35.4 The <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenabletrigger">SQLITE_DBCONFIG_ENABLE_TRIGGER</a> and <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableview">SQLITE_DBCONFIG_ENABLE_VIEW</a>
     settings are modified so that they only control triggers and views
     in the main database schema or in attached database schemas and not in
     the TEMP schema. TEMP triggers and views are always allowed.
ƒ       ‚Q9…Wreleaselog/3_35_4.html3.35.4 Add support for the <a href="../lang_with.html#mathint">MATERIALIZED</a> and <a href="../lang_with.html#mathint">NOT MATERIALIZED</a> hints when
     specifying <a href="../lang_with.html">common table expressions</a>.  The default behavior was
     formerly NOT MATERIALIZED, but is now changed to MATERIALIZED for
     CTEs that are used more than once.
‚P9ƒCreleaselog/3_35_4.html3.35.4 Use less memory when running <a href="../lang_vacuum.html">VACUUM</a> on databases containing very large
     TEXT or BLOB values.  It is no longer necessary to hold the entire TEXT
     or BLOB in memory all at once.
‚‚O9ƒMreleaselog/3_35_4.html3.35.4 Add support for the <a href="../lang_returning.html">RETURNING</a> clause on <a href="../lang_delete.html">DELETE</a>, <a href="../lang_insert.html">INSERT</a>, and
     <a href="../lang_update.html">UPDATE</a> statements.
‚7‚N9„3releaselog/3_35_4.html3.35.4 Generalize <a href="../lang_upsert.html">UPSERT</a>:
     <ol type="a">
     <li> Allow multiple ON CONFLICT clauses that are evaluated in order,
     </li><li> The final ON CONFLICT clause may omit the conflict target and
          yet still use DO UPDATE.
     </li></ol>
‚M9Qreleaselog/3_35_4.html3.35.4 Added support for <a href="../lang_altertable.html#altertabdropcol">ALTER TABLE DROP COLUMN</a>.
i‚L9        ƒreleaselog/3_35_4.html3.35.4 Added <a href="../lang_mathfunc.html">built-in SQL math functions()</a>. (Requires the
     <a href="../compile.html#enable_math_functions">-DSQLITE_ENABLE_MATH_FUNCTIONS</a> compile-time option.)
~‚K9Areleaselog/3_35_5.html3.35.5SHA3-256 for sqlite3.c: e42291343e8f03940e57fffcf1631e7921013b94419c2f943e816d3edf4e1bbe

‚J9[releaselog/3_35_5.html3.35.5SQLITE_SOURCE_ID: 2021-04-19 18:32:05 1b256d97b553a9611efca188a3d995a2fff712759044ba480f9a0c9e98fae886
}‚I9?releaselog/3_35_5.html3.35.5 Fix an obscure query optimizer problem that might cause an incorrect
     query result.
‚H9        Sreleaselog/3_35_5.html3.35.5 Fix defects in the new ALTER TABLE DROP COLUMN feature that could
     corrupt the database file.
R‚G9‚ireleaselog/3_35_5.html3.35.5 Fix an assertion associated with aggregate function processing that
     was incorrectly triggered by the <a href="../optoverview.html#pushdown">push-down optimization</a>.
~‚F9ƒAreleaselog/3_35_5.html3.35.5 Fix the new <a href="../lang_returning.html">RETURNING</a> feature so that it raises an error if one of
     the terms in the RETURNING clause references a unknown table, instead
     of silently ignoring that error.
N‚E9‚areleaselog/3_35_5.html3.35.5 Fix a defect in the new <a href="../lang_returning.html">RETURNING</a> syntax.  Ticket
     <a href="https://sqlite.org/src/info/132994c8b1063bfb">132994c8b1063bfb</a>.

y
¢m¤\y_‚Z9ƒreleaselog/3_35_4.html3.35.4 Fix a problem in the <a href="../sqldiff.html">sqldiff</a> utility program having to do with
     unusual whitespace characters in a <a href="../vtab.html">virtual table</a> definition.
‚D‚Y9„Mreleaselog/3_35_4.html3.35.4 Ensure that date/time functions with no arguments (which generate
     responses that depend on the current time) are treated as
     <a href="../deterministic.html">non-deterministic functions</a>. Ticket
     <a href="https://sqlite.org/src/info/2c6c8689fb5f3d2f">2c6c8689fb5f3d2f</a>
E‚X9        ‚Qreleaselog/3_35_4.html3.35.4 Fix a problem in the 
     <a href="http://www.sqlite.org/src/file/ext/misc/appendvfs.c">appendvfs.c</a>
     extension that was introduced into version 3.35.0.
#‚W9‚releaselog/3_35_4.html3.35.4 Improve the built-in documentation for the <a href="../cli.html#dump">.dump</a> command in the <a href="../cli.html">CLI</a>.
i‚V9        ƒreleaselog/3_35_4.html3.35.4 Fix <a href="https://www.sqlite.org/src/info/1c24a659e6d7f3a1">a bug</a> in the new DROP COLUMN
     feature when used on columns that are indexed and that are quoted in the index
     definition.
…‚U9‰releaselog/3_35_4.html3.35.4
 Bug fixes:
     <ol type="a">
     <li> Fix a potential NULL pointer dereference when processing a
          syntactically incorrect SELECT statement with a correlated WHERE
          clause and a "HAVING 0" clause.  (Also fixed in the 3.34.1 patch release.)
     </li><li> Fix a <a href="https://www.sqlite.org/src/info/ee51301f316c09e9">bug in the IN-operator optimization</a>
          of version 3.33.0 that can cause an incorrect answer.
     </li><li> Fix incorrect answers from the <a href="../lang_expr.html#like">LIKE operator</a> if the pattern ends with "%" and there
          is an "ESCAPE '_'" clause.
     </li></ol>
„`‚T9‰releaselog/3_35_4.html3.35.4  <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> Enhance the ".stats" command to accept new arguments "stmt" and
          "vmstep", causing prepare statement statistics and only the
          virtual-machine step count to be shown, respectively.
     </li><li> Add the ".filectrl data_version" command.
     </li><li> Enhance the ".once" and ".output" commands so that if the destination argument
          begins with "|" (indicating that output is redirected into a pipe) then the
          argument does not need to be quoted.
     </li></ol>
‹v‚S9—1releaselog/3_35_4.html3.35. Query planner/optimizer improvements:
     <ol type="a">
     <li> Enhancements to the <a href="../optoverview.html#minmax">min/max optimization</a> so that it works better
          with the IN operator and the OP_SeekScan optimization of the 
          previous release.
     </li><li> Attempt to process EXISTS operators in the WHERE clause as if
          they were IN operators, in cases where this is a valid transformation
          and seems likely to improve performance.
     </li><li> Allow UNION ALL sub-queries to be <a href="../optoverview.html#flattening">flattened</a> even if the parent query is a join.
     </li><li> Use an index, if appropriate, on IS NOT NULL expressions in the WHERE clause,
          even if STAT4 is disabled.
     </li><li> Expressions of the form "x IS NULL" or "x IS NOT NULL" might be converted to simply
          FALSE or TRUE, if "x" is a column that has a "NOT NULL" constraint and is not
          involved in an outer join.
     </li><li> Avoid checking foreign key constraints on an UPDATE statement if the UPDATE does
          not modify any columns associated with the foreign key.
     </li><li> Allow WHERE terms to be <a href="../optoverview.html#pushdown">pushed down</a> into sub-queries
          that contain window functions,
          as long as the WHERE term is made up of entirely of constants and copies of expressions
          found in the PARTITION BY clauses of all window functions in the sub-query.
     </li></ol>

Ú
M)-
       ÷èIwuŸ~‚j9Areleaselog/3_35_4.html3.35.4SHA3-256 for sqlite3.c: 528b8a26bf5ffd4c7b4647b5b799f86e8fb1a075f715b87a414e94fba3d09dbe

‚i9[releaselog/3_35_4.html3.35.4SQLITE_SOURCE_ID: 2021-04-02 15:20:15 5d4c65779dab868b285519b19e4cf9d451d50c6048f06f653aa701ec212df45e
R‚h9‚ireleaselog/3_35_4.html3.35.4 Fix an assertion associated with aggregate function processing that
     was incorrectly triggered by the <a href="../optoverview.html#pushdown">push-down optimization</a>.
~‚g9ƒAreleaselog/3_35_4.html3.35.4 Fix the new <a href="../lang_returning.html">RETURNING</a> feature so that it raises an error if one of
     the terms in the RETURNING clause references a unknown table, instead
     of silently ignoring that error.
N‚f9‚areleaselog/3_35_4.html3.35.4 Fix a defect in the new <a href="../lang_returning.html">RETURNING</a> syntax.  Ticket
     <a href="https://sqlite.org/src/info/132994c8b1063bfb">132994c8b1063bfb</a>.
P‚e9        ‚greleaselog/3_35_4.html3.35.4 Fix a defect in the query planner optimization identified by 
     item 8b above.  Ticket
     <a href="https://sqlite.org/src/info/de7db14784a08053">de7db14784a08053</a>.
ƒj‚d9‡releaselog/3_35_4.html3.35.4  Improvements the <a href="../vtab.html#xbestindex">xBestIndex</a> method in the implementation of the
     (unsupported) <a href="https://sqlite.org/src/file/ext/misc/wholenumber.c">wholenumber virtual table</a>
     extension so that it does a better job of convincing the query planner to
     avoid trying to materialize a table with an infinite number of rows.
     <a href="https://sqlite.org/forum/forumpost/b52a020ce4">Forum post b52a020ce4</a>.
Y‚c9‚wreleaselog/3_35_4.html3.35. Fix the EBCDIC character classifier so that it understands newlines as whitespace.
     <a href="https://sqlite.org/forum/forumpost/58540ce22dcd5fdcd">Forum post 58540ce22dcd</a>.
‚‚b9ƒ[releaselog/3_35_4.html3.35.4 Fix to the <a href="../syntax/select-stmt.html">SELECT statement syntax diagram</a> so that the FROM clause
     syntax is shown correctly.  
     <a href="https://sqlite.org/forum/forumpost/9ed02582fe">Forum post 9ed02582fe</a>.
L‚a9_releaselog/3_35_4.html3.35.4 Fix some incorrect assert() statements.
Q‚`9‚greleaselog/3_35_4.html3.35.4 Improvements to error messages generated by faulty common table expressions.
     <a href="https://sqlite.org/forum/forumpost/aa5a0431c99e631">Forum post aa5a0431c99e</a>.
ƒ‚_9…areleaselog/3_35_4.html3.35.4 Fix the <a href="../cli.html#dotmode">"box" output mode</a> in the <a href="../cli.html">CLI</a> so that it works with statements that
     returns one or more rows of zero columns (such as <a href="../pragma.html#pragma_incremental_vacuum">PRAGMA incremental_vacuum</a>).
     <a href="https://sqlite.org/forum/forumpost/afbbcb5b72">Forum post afbbcb5b72</a>.
y‚^97releaselog/3_35_4.html3.35.4 Fix a problem in the filename normalizer of the unix <a href="../vfs.html">VFS</a>.
‚ ‚]9„releaselog/3_35_4.html3.35.4 When materializing correlated <a href="../lang_with.html">common table expressions</a>, do so separately for each
     use case, as that is required for correctness.  This fixes a problem that was
     introduced by the MATERIALIZED hint enhancement.
ƒ       ‚\9  …Yreleaselog/3_35_4.html3.35.4 Enhance the OP_OpenDup opcode of the <a href="../opcode.html">bytecode engine</a> so that it works even if the
     cursor being duplicated itself came from OP_OpenDup.  Fix for
     <a href="https://www.sqlite.org/src/info/bb8a9fd4a9b7fce5">ticket bb8a9fd4a9b7fce5</a>.
     This problem only came to light due to the recent MATERIALIZED hint enhancement.
‚"‚[9„      releaselog/3_35_4.html3.35.4 Limit the new UNION ALL optimization described by item 8c in the
     3.35.0 release so that it does not try to make too many new subqueries.
     See <a href="https://sqlite.org/forum/forumpost/140a67d3d2">forum thread 140a67d3d2</a>
     for details.

ã‰
NFC        ¶Ýã‹v‚r9—1releaselog/3_35_3.html3.35. Query planner/optimizer improvements:
     <ol type="a">
     <li> Enhancements to the <a href="../optoverview.html#minmax">min/max optimization</a> so that it works better
          with the IN operator and the OP_SeekScan optimization of the 
          previous release.
     </li><li> Attempt to process EXISTS operators in the WHERE clause as if
          they were IN operators, in cases where this is a valid transformation
          and seems likely to improve performance.
     </li><li> Allow UNION ALL sub-queries to be <a href="../optoverview.html#flattening">flattened</a> even if the parent query is a join.
     </li><li> Use an index, if appropriate, on IS NOT NULL expressions in the WHERE clause,
          even if STAT4 is disabled.
     </li><li> Expressions of the form "x IS NULL" or "x IS NOT NULL" might be converted to simply
          FALSE or TRUE, if "x" is a column that has a "NOT NULL" constraint and is not
          involved in an outer join.
     </li><li> Avoid checking foreign key constraints on an UPDATE statement if the UPDATE does
          not modify any columns associated with the foreign key.
     </li><li> Allow WHERE terms to be <a href="../optoverview.html#pushdown">pushed down</a> into sub-queries
          that contain window functions,
          as long as the WHERE term is made up of entirely of constants and copies of expressions
          found in the PARTITION BY clauses of all window functions in the sub-query.
     </li></ol>
ƒU‚q9†oreleaselog/3_35_3.html3.35.3 The <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenabletrigger">SQLITE_DBCONFIG_ENABLE_TRIGGER</a> and <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableview">SQLITE_DBCONFIG_ENABLE_VIEW</a>
     settings are modified so that they only control triggers and views
     in the main database schema or in attached database schemas and not in
     the TEMP schema. TEMP triggers and views are always allowed.
ƒ       ‚p9…Wreleaselog/3_35_3.html3.35.3 Add support for the <a href="../lang_with.html#mathint">MATERIALIZED</a> and <a href="../lang_with.html#mathint">NOT MATERIALIZED</a> hints when
     specifying <a href="../lang_with.html">common table expressions</a>.  The default behavior was
     formerly NOT MATERIALIZED, but is now changed to MATERIALIZED for
     CTEs that are used more than once.
‚o9ƒCreleaselog/3_35_3.html3.35.3 Use less memory when running <a href="../lang_vacuum.html">VACUUM</a> on databases containing very large
     TEXT or BLOB values.  It is no longer necessary to hold the entire TEXT
     or BLOB in memory all at once.
‚‚n9ƒMreleaselog/3_35_3.html3.35.3 Add support for the <a href="../lang_returning.html">RETURNING</a> clause on <a href="../lang_delete.html">DELETE</a>, <a href="../lang_insert.html">INSERT</a>, and
     <a href="../lang_update.html">UPDATE</a> statements.
‚7‚m9„3releaselog/3_35_3.html3.35.3 Generalize <a href="../lang_upsert.html">UPSERT</a>:
     <ol type="a">
     <li> Allow multiple ON CONFLICT clauses that are evaluated in order,
     </li><li> The final ON CONFLICT clause may omit the conflict target and
          yet still use DO UPDATE.
     </li></ol>
‚l9Qreleaselog/3_35_3.html3.35.3 Added support for <a href="../lang_altertable.html#altertabdropcol">ALTER TABLE DROP COLUMN</a>.
i‚k9        ƒreleaselog/3_35_3.html3.35.3 Added <a href="../lang_mathfunc.html">built-in SQL math functions()</a>. (Requires the
     <a href="../compile.html#enable_math_functions">-DSQLITE_ENABLE_MATH_FUNCTIONS</a> compile-time option.)

Ž
œ
û
       žVsMÀœ Žƒ‚~9…areleaselog/3_35_3.html3.35.3 Fix the <a href="../cli.html#dotmode">"box" output mode</a> in the <a href="../cli.html">CLI</a> so that it works with statements that
     returns one or more rows of zero columns (such as <a href="../pragma.html#pragma_incremental_vacuum">PRAGMA incremental_vacuum</a>).
     <a href="https://sqlite.org/forum/forumpost/afbbcb5b72">Forum post afbbcb5b72</a>.
y‚}97releaselog/3_35_3.html3.35.3 Fix a problem in the filename normalizer of the unix <a href="../vfs.html">VFS</a>.
‚ ‚|9„releaselog/3_35_3.html3.35.3 When materializing correlated <a href="../lang_with.html">common table expressions</a>, do so separately for each
     use case, as that is required for correctness.  This fixes a problem that was
     introduced by the MATERIALIZED hint enhancement.
ƒ       ‚{9  …Yreleaselog/3_35_3.html3.35.3 Enhance the OP_OpenDup opcode of the <a href="../opcode.html">bytecode engine</a> so that it works even if the
     cursor being duplicated itself came from OP_OpenDup.  Fix for
     <a href="https://www.sqlite.org/src/info/bb8a9fd4a9b7fce5">ticket bb8a9fd4a9b7fce5</a>.
     This problem only came to light due to the recent MATERIALIZED hint enhancement.
‚"‚z9„      releaselog/3_35_3.html3.35.3 Limit the new UNION ALL optimization described by item 8c in the
     3.35.0 release so that it does not try to make too many new subqueries.
     See <a href="https://sqlite.org/forum/forumpost/140a67d3d2">forum thread 140a67d3d2</a>
     for details.
_‚y9ƒreleaselog/3_35_3.html3.35.3 Fix a problem in the <a href="../sqldiff.html">sqldiff</a> utility program having to do with
     unusual whitespace characters in a <a href="../vtab.html">virtual table</a> definition.
‚D‚x9„Mreleaselog/3_35_3.html3.35.3 Ensure that date/time functions with no arguments (which generate
     responses that depend on the current time) are treated as
     <a href="../deterministic.html">non-deterministic functions</a>. Ticket
     <a href="https://sqlite.org/src/info/2c6c8689fb5f3d2f">2c6c8689fb5f3d2f</a>
E‚w9        ‚Qreleaselog/3_35_3.html3.35.3 Fix a problem in the 
     <a href="http://www.sqlite.org/src/file/ext/misc/appendvfs.c">appendvfs.c</a>
     extension that was introduced into version 3.35.0.
#‚v9‚releaselog/3_35_3.html3.35.3 Improve the built-in documentation for the <a href="../cli.html#dump">.dump</a> command in the <a href="../cli.html">CLI</a>.
i‚u9        ƒreleaselog/3_35_3.html3.35.3 Fix <a href="https://www.sqlite.org/src/info/1c24a659e6d7f3a1">a bug</a> in the new DROP COLUMN
     feature when used on columns that are indexed and that are quoted in the index
     definition.
…‚t9‰releaselog/3_35_3.html3.35.3
 Bug fixes:
     <ol type="a">
     <li> Fix a potential NULL pointer dereference when processing a
          syntactically incorrect SELECT statement with a correlated WHERE
          clause and a "HAVING 0" clause.  (Also fixed in the 3.34.1 patch release.)
     </li><li> Fix a <a href="https://www.sqlite.org/src/info/ee51301f316c09e9">bug in the IN-operator optimization</a>
          of version 3.33.0 that can cause an incorrect answer.
     </li><li> Fix incorrect answers from the <a href="../lang_expr.html#like">LIKE operator</a> if the pattern ends with "%" and there
          is an "ESCAPE '_'" clause.
     </li></ol>
„`‚s9‰releaselog/3_35_3.html3.35.3  <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> Enhance the ".stats" command to accept new arguments "stmt" and
          "vmstep", causing prepare statement statistics and only the
          virtual-machine step count to be shown, respectively.
     </li><li> Add the ".filectrl data_version" command.
     </li><li> Enhance the ".once" and ".output" commands so that if the destination argument
          begins with "|" (indicating that output is redirected into a pipe) then the
          argument does not need to be quoted.
     </li></ol>

Ï+Ü
Íð
s       ò       {@85¨σUƒ9†oreleaselog/3_35_2.html3.35.2 The <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenabletrigger">SQLITE_DBCONFIG_ENABLE_TRIGGER</a> and <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableview">SQLITE_DBCONFIG_ENABLE_VIEW</a>
     settings are modified so that they only control triggers and views
     in the main database schema or in attached database schemas and not in
     the TEMP schema. TEMP triggers and views are always allowed.
ƒ       ƒ9…Wreleaselog/3_35_2.html3.35.2 Add support for the <a href="../lang_with.html#mathint">MATERIALIZED</a> and <a href="../lang_with.html#mathint">NOT MATERIALIZED</a> hints when
     specifying <a href="../lang_with.html">common table expressions</a>.  The default behavior was
     formerly NOT MATERIALIZED, but is now changed to MATERIALIZED for
     CTEs that are used more than once.
ƒ
9ƒCreleaselog/3_35_2.html3.35.2 Use less memory when running <a href="../lang_vacuum.html">VACUUM</a> on databases containing very large
     TEXT or BLOB values.  It is no longer necessary to hold the entire TEXT
     or BLOB in memory all at once.
‚ƒ     9ƒMreleaselog/3_35_2.html3.35.2 Add support for the <a href="../lang_returning.html">RETURNING</a> clause on <a href="../lang_delete.html">DELETE</a>, <a href="../lang_insert.html">INSERT</a>, and
     <a href="../lang_update.html">UPDATE</a> statements.
‚79„3releaselog/3_35_2.html3.35.2 Generalize <a href="../lang_upsert.html">UPSERT</a>:
     <ol type="a">
     <li> Allow multiple ON CONFLICT clauses that are evaluated in order,
     </li><li> The final ON CONFLICT clause may omit the conflict target and
          yet still use DO UPDATE.
     </li></ol>
ƒ9Qreleaselog/3_35_2.html3.35.2 Added support for <a href="../lang_altertable.html#altertabdropcol">ALTER TABLE DROP COLUMN</a>.
iƒ9        ƒreleaselog/3_35_2.html3.35.2 Added <a href="../lang_mathfunc.html">built-in SQL math functions()</a>. (Requires the
     <a href="../compile.html#enable_math_functions">-DSQLITE_ENABLE_MATH_FUNCTIONS</a> compile-time option.)
~ƒ9Areleaselog/3_35_3.html3.35.3SHA3-256 for sqlite3.c: 91ca6c0a30ebfdba4420bb35f4fd9149d13e45fc853d86ad7527db363e282683

ƒ9[releaselog/3_35_3.html3.35.3
SQLITE_SOURCE_ID: 2021-03-26 12:12:52 4c5e6c200adc8afe0814936c67a971efc516d1bd739cb620235592f18f40be2a
ƒjƒ9‡releaselog/3_35_3.html3.35.3  Improvements the <a href="../vtab.html#xbestindex">xBestIndex</a> method in the implementation of the
     (unsupported) <a href="https://sqlite.org/src/file/ext/misc/wholenumber.c">wholenumber virtual table</a>
     extension so that it does a better job of convincing the query planner to
     avoid trying to materialize a table with an infinite number of rows.
     <a href="https://sqlite.org/forum/forumpost/b52a020ce4">Forum post b52a020ce4</a>.
Yƒ9‚wreleaselog/3_35_3.html3.35. Fix the EBCDIC character classifier so that it understands newlines as whitespace.
     <a href="https://sqlite.org/forum/forumpost/58540ce22dcd5fdcd">Forum post 58540ce22dcd</a>.
‚ƒ9ƒ[releaselog/3_35_3.html3.35.3 Fix to the <a href="../syntax/select-stmt.html">SELECT statement syntax diagram</a> so that the FROM clause
     syntax is shown correctly.  
     <a href="https://sqlite.org/forum/forumpost/9ed02582fe">Forum post 9ed02582fe</a>.
Lƒ9_releaselog/3_35_3.html3.35.3 Fix some incorrect assert() statements.
Q‚9‚greleaselog/3_35_3.html3.35.3 Improvements to error messages generated by faulty common table expressions.
     <a href="https://sqlite.org/forum/forumpost/aa5a0431c99e631">Forum post aa5a0431c99e</a>.

y
¢m¤\y_ƒ9ƒreleaselog/3_35_2.html3.35.2 Fix a problem in the <a href="../sqldiff.html">sqldiff</a> utility program having to do with
     unusual whitespace characters in a <a href="../vtab.html">virtual table</a> definition.
‚Dƒ9„Mreleaselog/3_35_2.html3.35.2 Ensure that date/time functions with no arguments (which generate
     responses that depend on the current time) are treated as
     <a href="../deterministic.html">non-deterministic functions</a>. Ticket
     <a href="https://sqlite.org/src/info/2c6c8689fb5f3d2f">2c6c8689fb5f3d2f</a>
Eƒ9        ‚Qreleaselog/3_35_2.html3.35.2 Fix a problem in the 
     <a href="http://www.sqlite.org/src/file/ext/misc/appendvfs.c">appendvfs.c</a>
     extension that was introduced into version 3.35.0.
#ƒ9‚releaselog/3_35_2.html3.35.2 Improve the built-in documentation for the <a href="../cli.html#dump">.dump</a> command in the <a href="../cli.html">CLI</a>.
iƒ9        ƒreleaselog/3_35_2.html3.35.2 Fix <a href="https://www.sqlite.org/src/info/1c24a659e6d7f3a1">a bug</a> in the new DROP COLUMN
     feature when used on columns that are indexed and that are quoted in the index
     definition.
…ƒ9‰releaselog/3_35_2.html3.35.2
 Bug fixes:
     <ol type="a">
     <li> Fix a potential NULL pointer dereference when processing a
          syntactically incorrect SELECT statement with a correlated WHERE
          clause and a "HAVING 0" clause.  (Also fixed in the 3.34.1 patch release.)
     </li><li> Fix a <a href="https://www.sqlite.org/src/info/ee51301f316c09e9">bug in the IN-operator optimization</a>
          of version 3.33.0 that can cause an incorrect answer.
     </li><li> Fix incorrect answers from the <a href="../lang_expr.html#like">LIKE operator</a> if the pattern ends with "%" and there
          is an "ESCAPE '_'" clause.
     </li></ol>
„`ƒ9‰releaselog/3_35_2.html3.35.2  <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> Enhance the ".stats" command to accept new arguments "stmt" and
          "vmstep", causing prepare statement statistics and only the
          virtual-machine step count to be shown, respectively.
     </li><li> Add the ".filectrl data_version" command.
     </li><li> Enhance the ".once" and ".output" commands so that if the destination argument
          begins with "|" (indicating that output is redirected into a pipe) then the
          argument does not need to be quoted.
     </li></ol>
‹vƒ
9—1releaselog/3_35_2.html3.35. Query planner/optimizer improvements:
     <ol type="a">
     <li> Enhancements to the <a href="../optoverview.html#minmax">min/max optimization</a> so that it works better
          with the IN operator and the OP_SeekScan optimization of the 
          previous release.
     </li><li> Attempt to process EXISTS operators in the WHERE clause as if
          they were IN operators, in cases where this is a valid transformation
          and seems likely to improve performance.
     </li><li> Allow UNION ALL sub-queries to be <a href="../optoverview.html#flattening">flattened</a> even if the parent query is a join.
     </li><li> Use an index, if appropriate, on IS NOT NULL expressions in the WHERE clause,
          even if STAT4 is disabled.
     </li><li> Expressions of the form "x IS NULL" or "x IS NOT NULL" might be converted to simply
          FALSE or TRUE, if "x" is a column that has a "NOT NULL" constraint and is not
          involved in an outer join.
     </li><li> Avoid checking foreign key constraints on an UPDATE statement if the UPDATE does
          not modify any columns associated with the foreign key.
     </li><li> Allow WHERE terms to be <a href="../optoverview.html#pushdown">pushed down</a> into sub-queries
          that contain window functions,
          as long as the WHERE term is made up of entirely of constants and copies of expressions
          found in the PARTITION BY clauses of all window functions in the sub-query.
     </li></ol>


§ÚK
ÊÝS
       
€§ƒUƒ9†oreleaselog/3_35_1.html3.35.1 The <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenabletrigger">SQLITE_DBCONFIG_ENABLE_TRIGGER</a> and <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableview">SQLITE_DBCONFIG_ENABLE_VIEW</a>
     settings are modified so that they only control triggers and views
     in the main database schema or in attached database schemas and not in
     the TEMP schema. TEMP triggers and views are always allowed.
ƒ       ƒ9…Wreleaselog/3_35_1.html3.35.1 Add support for the <a href="../lang_with.html#mathint">MATERIALIZED</a> and <a href="../lang_with.html#mathint">NOT MATERIALIZED</a> hints when
     specifying <a href="../lang_with.html">common table expressions</a>.  The default behavior was
     formerly NOT MATERIALIZED, but is now changed to MATERIALIZED for
     CTEs that are used more than once.
ƒ9ƒCreleaselog/3_35_1.html3.35.1 Use less memory when running <a href="../lang_vacuum.html">VACUUM</a> on databases containing very large
     TEXT or BLOB values.  It is no longer necessary to hold the entire TEXT
     or BLOB in memory all at once.
‚ƒ9ƒMreleaselog/3_35_1.html3.35.1 Add support for the <a href="../lang_returning.html">RETURNING</a> clause on <a href="../lang_delete.html">DELETE</a>, <a href="../lang_insert.html">INSERT</a>, and
     <a href="../lang_update.html">UPDATE</a> statements.
‚7ƒ9„3releaselog/3_35_1.html3.35.1 Generalize <a href="../lang_upsert.html">UPSERT</a>:
     <ol type="a">
     <li> Allow multiple ON CONFLICT clauses that are evaluated in order,
     </li><li> The final ON CONFLICT clause may omit the conflict target and
          yet still use DO UPDATE.
     </li></ol>
ƒ9Qreleaselog/3_35_1.html3.35.1 Added support for <a href="../lang_altertable.html#altertabdropcol">ALTER TABLE DROP COLUMN</a>.
iƒ9        ƒreleaselog/3_35_1.html3.35.1 Added <a href="../lang_mathfunc.html">built-in SQL math functions()</a>. (Requires the
     <a href="../compile.html#enable_math_functions">-DSQLITE_ENABLE_MATH_FUNCTIONS</a> compile-time option.)
~ƒ9Areleaselog/3_35_2.html3.35.2SHA3-256 for sqlite3.c: e8edc7b1512a2e050d548d0840bec6eef83cc297af1426c34c0ee8720f378a11

ƒ9[releaselog/3_35_2.html3.35.2SQLITE_SOURCE_ID: 2021-03-17 19:07:21 ea80f3002f4120f5dcee76e8779dfdc88e1e096c5cdd06904c20fd26d50c3827
‚"ƒ9„      releaselog/3_35_2.html3.35.2 Limit the new UNION ALL optimization described by item 8c in the
     3.35.0 release so that it does not try to make too many new subqueries.
     See <a href="https://sqlite.org/forum/forumpost/140a67d3d2">forum thread 140a67d3d2</a>
     for details.

    æ
¢mÞ]pæƒ'9Qreleaselog/3_35_0.html3.35.0 Added support for <a href="../lang_altertable.html#altertabdropcol">ALTER TABLE DROP COLUMN</a>.
iƒ&9        ƒreleaselog/3_35_0.html3.35.0 Added <a href="../lang_mathfunc.html">built-in SQL math functions()</a>. (Requires the
     <a href="../compile.html#enable_math_functions">-DSQLITE_ENABLE_MATH_FUNCTIONS</a> compile-time option.)
~ƒ%9Areleaselog/3_35_1.html3.35.1SHA3-256 for sqlite3.c: fc79e27fd030226c07691b7d7c23aa81c8d46bc3bef5af39060e1507c82b0523

ƒ$9[releaselog/3_35_1.html3.35.1SQLITE_SOURCE_ID: 2021-03-15 16:53:57 aea12399bf1fdc76af43499d4624c3afa17c3e6c2459b71c195804bb98def66a
#ƒ#9‚releaselog/3_35_1.html3.35.1 Improve the built-in documentation for the <a href="../cli.html#dump">.dump</a> command in the <a href="../cli.html">CLI</a>.
iƒ"9        ƒreleaselog/3_35_1.html3.35.1 Fix <a href="https://www.sqlite.org/src/info/1c24a659e6d7f3a1">a bug</a> in the new DROP COLUMN
     feature when used on columns that are indexed and that are quoted in the index
     definition.
…ƒ!9‰releaselog/3_35_1.html3.35.1
 Bug fixes:
     <ol type="a">
     <li> Fix a potential NULL pointer dereference when processing a
          syntactically incorrect SELECT statement with a correlated WHERE
          clause and a "HAVING 0" clause.  (Also fixed in the 3.34.1 patch release.)
     </li><li> Fix a <a href="https://www.sqlite.org/src/info/ee51301f316c09e9">bug in the IN-operator optimization</a>
          of version 3.33.0 that can cause an incorrect answer.
     </li><li> Fix incorrect answers from the <a href="../lang_expr.html#like">LIKE operator</a> if the pattern ends with "%" and there
          is an "ESCAPE '_'" clause.
     </li></ol>
„`ƒ 9‰releaselog/3_35_1.html3.35.1  <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> Enhance the ".stats" command to accept new arguments "stmt" and
          "vmstep", causing prepare statement statistics and only the
          virtual-machine step count to be shown, respectively.
     </li><li> Add the ".filectrl data_version" command.
     </li><li> Enhance the ".once" and ".output" commands so that if the destination argument
          begins with "|" (indicating that output is redirected into a pipe) then the
          argument does not need to be quoted.
     </li></ol>
‹vƒ9—1releaselog/3_35_1.html3.35. Query planner/optimizer improvements:
     <ol type="a">
     <li> Enhancements to the <a href="../optoverview.html#minmax">min/max optimization</a> so that it works better
          with the IN operator and the OP_SeekScan optimization of the 
          previous release.
     </li><li> Attempt to process EXISTS operators in the WHERE clause as if
          they were IN operators, in cases where this is a valid transformation
          and seems likely to improve performance.
     </li><li> Allow UNION ALL sub-queries to be <a href="../optoverview.html#flattening">flattened</a> even if the parent query is a join.
     </li><li> Use an index, if appropriate, on IS NOT NULL expressions in the WHERE clause,
          even if STAT4 is disabled.
     </li><li> Expressions of the form "x IS NULL" or "x IS NOT NULL" might be converted to simply
          FALSE or TRUE, if "x" is a column that has a "NOT NULL" constraint and is not
          involved in an outer join.
     </li><li> Avoid checking foreign key constraints on an UPDATE statement if the UPDATE does
          not modify any columns associated with the foreign key.
     </li><li> Allow WHERE terms to be <a href="../optoverview.html#pushdown">pushed down</a> into sub-queries
          that contain window functions,
          as long as the WHERE term is made up of entirely of constants and copies of expressions
          found in the PARTITION BY clauses of all window functions in the sub-query.
     </li></ol>

öÅ
½º-        TZö„`ƒ.9‰releaselog/3_35_0.html3.35.0     <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> Enhance the ".stats" command to accept new arguments "stmt" and
          "vmstep", causing prepare statement statistics and only the
          virtual-machine step count to be shown, respectively.
     </li><li> Add the ".filectrl data_version" command.
     </li><li> Enhance the ".once" and ".output" commands so that if the destination argument
          begins with "|" (indicating that output is redirected into a pipe) then the
          argument does not need to be quoted.
     </li></ol>
‹vƒ-9—1releaselog/3_35_0.html3.35. Query planner/optimizer improvements:
     <ol type="a">
     <li> Enhancements to the <a href="../optoverview.html#minmax">min/max optimization</a> so that it works better
          with the IN operator and the OP_SeekScan optimization of the 
          previous release.
     </li><li> Attempt to process EXISTS operators in the WHERE clause as if
          they were IN operators, in cases where this is a valid transformation
          and seems likely to improve performance.
     </li><li> Allow UNION ALL sub-queries to be <a href="../optoverview.html#flattening">flattened</a> even if the parent query is a join.
     </li><li> Use an index, if appropriate, on IS NOT NULL expressions in the WHERE clause,
          even if STAT4 is disabled.
     </li><li> Expressions of the form "x IS NULL" or "x IS NOT NULL" might be converted to simply
          FALSE or TRUE, if "x" is a column that has a "NOT NULL" constraint and is not
          involved in an outer join.
     </li><li> Avoid checking foreign key constraints on an UPDATE statement if the UPDATE does
          not modify any columns associated with the foreign key.
     </li><li> Allow WHERE terms to be <a href="../optoverview.html#pushdown">pushed down</a> into sub-queries
          that contain window functions,
          as long as the WHERE term is made up of entirely of constants and copies of expressions
          found in the PARTITION BY clauses of all window functions in the sub-query.
     </li></ol>
ƒUƒ,9†oreleaselog/3_35_0.html3.35.0 The <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenabletrigger">SQLITE_DBCONFIG_ENABLE_TRIGGER</a> and <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableview">SQLITE_DBCONFIG_ENABLE_VIEW</a>
     settings are modified so that they only control triggers and views
     in the main database schema or in attached database schemas and not in
     the TEMP schema. TEMP triggers and views are always allowed.
ƒ       ƒ+9…Wreleaselog/3_35_0.html3.35.0 Add support for the <a href="../lang_with.html#mathint">MATERIALIZED</a> and <a href="../lang_with.html#mathint">NOT MATERIALIZED</a> hints when
     specifying <a href="../lang_with.html">common table expressions</a>.  The default behavior was
     formerly NOT MATERIALIZED, but is now changed to MATERIALIZED for
     CTEs that are used more than once.
ƒ*9ƒCreleaselog/3_35_0.html3.35.0 Use less memory when running <a href="../lang_vacuum.html">VACUUM</a> on databases containing very large
     TEXT or BLOB values.  It is no longer necessary to hold the entire TEXT
     or BLOB in memory all at once.
‚ƒ)9ƒMreleaselog/3_35_0.html3.35.0 Add support for the <a href="../lang_returning.html">RETURNING</a> clause on <a href="../lang_delete.html">DELETE</a>, <a href="../lang_insert.html">INSERT</a>, and
     <a href="../lang_update.html">UPDATE</a> statements.
‚7ƒ(9„3releaselog/3_35_0.html3.35.0 Generalize <a href="../lang_upsert.html">UPSERT</a>:
     <ol type="a">
     <li> Allow multiple ON CONFLICT clauses that are evaluated in order,
     </li><li> The final ON CONFLICT clause may omit the conflict target and
          yet still use DO UPDATE.
     </li></ol>

    —
_ÐO‰
C       µ¯œ—‚ƒ79ƒGreleaselog/3_34_1.html3.34.1 The <a href="../lang_transaction.html#immediate">BEGIN IMMEDIATE</a> and <a href="../lang_transaction.html#immediate">BEGIN EXCLUSIVE</a> commands now work even
     if one or more attached database files are read-only.
†ƒ69‹creleaselog/3_34_1.html3.34.1 Query planner improvements:
     <ol type="a">
     <li> Improved estimates for the cost of running a DISTINCT operator.
     </li><li> When doing an UPDATE or DELETE using a multi-column index where 
          only a few of the earlier columns of the index are useful for the 
          index lookup, postpone doing the main table seek until after all 
          WHERE clause constraints have been evaluated, in case those 
          constraints can be covered by unused later terms of the index,
          thus avoiding unnecessary main table seeks.
     </li><li> The new OP_SeekScan opcode is used to improve performance of
          multi-column index look-ups when later columns are constrained
          by an IN operator.
     </li></ol>
Šƒ59“Ireleaselog/3_34_1.html3.34.1 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> The <a href="../cli.html#dotread">.read</a> dot-command now accepts a pipeline in addition to
          a filename.
     </li><li> Added options --data-only and --nosys to the <a href="../cli.html#dump">.dump</a> dot-command.
     </li><li> Added the --nosys option to the <a href="../cli.html#dschema">.schema</a> dot-command.
     </li><li> Table name quoting works correctly for the <a href="../cli.html#csv">.import</a> dot-command.
     </li><li> The <a href="../series.html">generate_series(START,END,STEP)</a> table-valued function
          extension is now built into the CLI.
     </li><li> The <a href="../cli.html#dotdatabases">.databases</a> dot-command now shows the status of each database
          file as determined by <a href="../c3ref/db_readonly.html">sqlite3_db_readonly()</a> and
          <a href="../c3ref/txn_state.html">sqlite3_txn_state()</a>.
     </li><li> Added the --tabs command-line option that sets
          <a href="../cli.html#dotmode">.mode tabs</a>.
     </li><li> The --init option reports an error if the file named as its argument
          cannot be opened.  The --init option also now honors the --bail option.
     </li></ol>

ƒ49Yreleaselog/3_34_1.html3.34.1 Improved error messages on <a href="../lang_createtable.html#ckconst">CHECK constraint</a> failures.
‚Bƒ39„Ireleaselog/3_34_1.html3.34.1 Enhance <a href="../lang_with.html#recursivecte">recursive common table expressions</a> to support two or more
     recursive terms as is done by SQL Server, since this helps make
     <a href="../lang_with.html#rcex3">queries against graphs</a> easier to write and faster to execute.
Bƒ29        ‚Kreleaselog/3_34_1.html3.34.1 Added the <a href="../c3ref/txn_state.html">sqlite3_txn_state()</a> interface for reporting on the current
     transaction state of the database connection.
~ƒ19Areleaselog/3_35_0.html3.35.0SHA3-256 for sqlite3.c: 73a740d881735bef9de7f7bce8c9e6b9e57fe3e77fa7d76a6e8fc5c262fbaedf

ƒ09[releaselog/3_35_0.html3.35.0SQLITE_SOURCE_ID: 2021-03-12 15:10:09 acd63062eb06748bfe9e4886639e4f2b54ea6a496a83f10716abbaba4115500b
…ƒ/9‰releaselog/3_35_0.html3.35.0
 Bug fixes:
     <ol type="a">
     <li> Fix a potential NULL pointer dereference when processing a
          syntactically incorrect SELECT statement with a correlated WHERE
          clause and a "HAVING 0" clause.  (Also fixed in the 3.34.1 patch release.)
     </li><li> Fix a <a href="https://www.sqlite.org/src/info/ee51301f316c09e9">bug in the IN-operator optimization</a>
          of version 3.33.0 that can cause an incorrect answer.
     </li><li> Fix incorrect answers from the <a href="../lang_expr.html#like">LIKE operator</a> if the pattern ends with "%" and there
          is an "ESCAPE '_'" clause.
     </li></ol>

ÅlŒ
ŒÐ×
ý
¾
u       æ       ŸYËÅŠƒE9“Ireleaselog/3_34_0.html3.34.0 <a href="../cli.html">CLI</a> enhancements:
     <ol type="a">
     <li> The <a href="../cli.html#dotread">.read</a> dot-command now accepts a pipeline in addition to
          a filename.
     </li><li> Added options --data-only and --nosys to the <a href="../cli.html#dump">.dump</a> dot-command.
     </li><li> Added the --nosys option to the <a href="../cli.html#dschema">.schema</a> dot-command.
     </li><li> Table name quoting works correctly for the <a href="../cli.html#csv">.import</a> dot-command.
     </li><li> The <a href="../series.html">generate_series(START,END,STEP)</a> table-valued function
          extension is now built into the CLI.
     </li><li> The <a href="../cli.html#dotdatabases">.databases</a> dot-command now shows the status of each database
          file as determined by <a href="../c3ref/db_readonly.html">sqlite3_db_readonly()</a> and
          <a href="../c3ref/txn_state.html">sqlite3_txn_state()</a>.
     </li><li> Added the --tabs command-line option that sets
          <a href="../cli.html#dotmode">.mode tabs</a>.
     </li><li> The --init option reports an error if the file named as its argument
          cannot be opened.  The --init option also now honors the --bail option.
     </li></ol>

ƒD9Yreleaselog/3_34_0.html3.34.0 Improved error messages on <a href="../lang_createtable.html#ckconst">CHECK constraint</a> failures.
‚BƒC9„Ireleaselog/3_34_0.html3.34.0 Enhance <a href="../lang_with.html#recursivecte">recursive common table expressions</a> to support two or more
     recursive terms as is done by SQL Server, since this helps make
     <a href="../lang_with.html#rcex3">queries against graphs</a> easier to write and faster to execute.
BƒB9        ‚Kreleaselog/3_34_0.html3.34.0 Added the <a href="../c3ref/txn_state.html">sqlite3_txn_state()</a> interface for reporting on the current
     transaction state of the database connection.
~ƒA9Areleaselog/3_34_1.html3.34.1SHA3-256 for sqlite3.c: 799a7be90651fc7296113b641a70b028c142d767b25af1d0a78f93dcf1a2bf20

ƒ@9[releaselog/3_34_1.html3.34.1SQLITE_SOURCE_ID: 2021-01-20 14:10:07 10e20c0b43500cfb9bbc0eaa061c57514f715d87238f4d835880cd846b9ebd1f
Fƒ?9Sreleaselog/3_34_1.html3.34.1 Fix minor problems in extensions.
<ƒ>9?releaselog/3_34_1.html3.34.1 Fix documentation typos
Vƒ=9        ‚sreleaselog/3_34_1.html3.34.1 Fix a potential use-after-free bug when processing a a subquery with both
     a correlated WHERE clause and a "HAVING 0" clause and where the parent
     query is an aggregate.
uƒ<9ƒ/releaselog/3_34_1.html3.34.1 The <a href="../syntaxdiagrams.html">syntax diagrams</a> are now implemented as
     <a href="https://pikchr.org/">Pikchr</a> scripts and rendered
     as SVG for improved legibility and ease of maintenance.
8ƒ;9‚5releaselog/3_34_1.html3.34.1
 The <a href="../lang_corefunc.html#substr">substr() SQL function</a> can now also be called "substring()" for
     compatibility with  SQL Server.
|ƒ:9ƒ=releaselog/3_34_1.html3.34.1  Enhanced the <a href="../carray.html">carray() table-valued function</a> to include a single-argument
     form that is bound using the auxiliary <a href="../carray.html#onearg">sqlite3_carray_bind()</a> interface.
\ƒ99‚}releaselog/3_34_1.html3.34. Improved performance of <a href="../wal.html">WAL mode</a> locking primitives in cases where
     there are hundreds of connections all accessing the same database file
     at once.
ƒ89ereleaselog/3_34_1.html3.34.1 Enhanced <a href="../fts5.html">FTS5</a> to support <a href="../fts5.html#trigramidx">trigram indexes</a>.

ÎíèT
t       ¸¿0®$Æ´hÎ…ƒT9‰qreleaselog/3_33_0.html3.33.0 <a href="../cli.html">CLI</a> enhancements:
    <ol type="a">
    <li> Added four new <a href="../cli.html#dotmode">output modes</a>: "box", "json", "markdown",
         and "table".
    </li><li> The "column" output mode automatically expands columns to
         contain the longest output row and automatically turns
         ".header" on if it has not been previously set.
    </li><li> The "quote" output mode honors ".separator"
    </li><li> The <a href="../floatingpoint.html#decext">decimal extension</a> and the <a href="../floatingpoint.html#ieee754ext">ieee754 extension</a> are built-in to the CLI
    </li></ol>
&ƒS9‚releaselog/3_33_0.html3.33.0 Enhancements to the <a href="../floatingpoint.html#ieee754ext">ieee754 extension</a> for working with IEEE 754 binary64 numbers.
ƒR9‚releaselog/3_33_0.html3.33.0 Added the <a href="../floatingpoint.html#decext">decimal extension</a> for doing arbitrary-precision decimal arithmetic.
‚ƒQ9ƒareleaselog/3_33_0.html3.33.0 Extended the <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> statement so that it can optionally be
     limited to verifying just a single table and its indexes, rather than the
     entire database file.
[ƒP9}releaselog/3_33_0.html3.33.0 Increase the maximum size of database files to 281 TB.
ƒO9        Sreleaselog/3_33_0.html3.33.0 Support for <a href="../lang_update.html#upfrom">UPDATE FROM</a> following the PostgreSQL syntax.
ƒN9Creleaselog/3_34_0.html3.34.0
SHA3-256 for sqlite3.c: fbd895b0655a337b2cd657675f314188a4e9fe614444cc63dfeb3f066f674514


ƒM9[releaselog/3_34_0.html3.34.0SQLITE_SOURCE_ID: 2020-12-01 16:14:00 a26b6597e3ae272231b96f9982c3bcc17ddec2f2b6eb4df06a224b91089fed5b
uƒL9ƒ/releaselog/3_34_0.html3.34.0 The <a href="../syntaxdiagrams.html">syntax diagrams</a> are now implemented as
     <a href="https://pikchr.org/">Pikchr</a> scripts and rendered
     as SVG for improved legibility and ease of maintenance.
8ƒK9‚5releaselog/3_34_0.html3.34.0
 The <a href="../lang_corefunc.html#substr">substr() SQL function</a> can now also be called "substring()" for
     compatibility with  SQL Server.
|ƒJ9ƒ=releaselog/3_34_0.html3.34.0  Enhanced the <a href="../carray.html">carray() table-valued function</a> to include a single-argument
     form that is bound using the auxiliary <a href="../carray.html#onearg">sqlite3_carray_bind()</a> interface.
\ƒI9‚}releaselog/3_34_0.html3.34. Improved performance of <a href="../wal.html">WAL mode</a> locking primitives in cases where
     there are hundreds of connections all accessing the same database file
     at once.
ƒH9ereleaselog/3_34_0.html3.34.0 Enhanced <a href="../fts5.html">FTS5</a> to support <a href="../fts5.html#trigramidx">trigram indexes</a>.
‚ƒG9ƒGreleaselog/3_34_0.html3.34.0 The <a href="../lang_transaction.html#immediate">BEGIN IMMEDIATE</a> and <a href="../lang_transaction.html#immediate">BEGIN EXCLUSIVE</a> commands now work even
     if one or more attached database files are read-only.
†ƒF9‹creleaselog/3_34_0.html3.34.0 Query planner improvements:
     <ol type="a">
     <li> Improved estimates for the cost of running a DISTINCT operator.
     </li><li> When doing an UPDATE or DELETE using a multi-column index where 
          only a few of the earlier columns of the index are useful for the 
          index lookup, postpone doing the main table seek until after all 
          WHERE clause constraints have been evaluated, in case those 
          constraints can be covered by unused later terms of the index,
          thus avoiding unnecessary main table seeks.
     </li><li> The new OP_SeekScan opcode is used to improve performance of
          multi-column index look-ups when later columns are constrained
          by an IN operator.
     </li></ol>


`£
“       º       0‘¹5ƒ`9‚/releaselog/3_32_3.html3.32. Added code for the <a href="../uintcseq.html">UINT collating sequence</a> as an optional
     <a href="../loadext.html">loadable extension</a>.
Tƒ_9‚mreleaselog/3_32_3.html3.32.3 Increase the <a href="../limits.html#max_variable_number">default upper bound</a>
     on the number of <a href="../lang_expr.html#varparam">parameters</a> from 999 to 32766.
‚rƒ^9…)releaselog/3_32_3.html3.32.3 Added the <a href="../c3ref/create_filename.html">sqlite3_create_filename()</a>, <a href="../c3ref/create_filename.html">sqlite3_free_filename()</a>,
     and <a href="../c3ref/database_file_object.html">sqlite3_database_file_object()</a>
     interfaces to better support of <a href="../vfs.html#shim">VFS shim</a> implementations.
„%ƒ]9ˆreleaselog/3_32_3.html3.32.3 INSERT and UPDATE statements now always apply <a href="../datatype3.html#affinity">column affinity</a>
     before computing <a href="../lang_createtable.html#ckconst">CHECK constraints</a>.  This bug fix could, in
     theory, cause problems for legacy databases with unorthodox
     CHECK constraints the require the input type for an INSERT
     is different from the declared column type. See ticket
     <a href="https://sqlite.org/src/info/86ba67afafded936">86ba67afafded936</a>
     for more information.
kƒ\9releaselog/3_32_3.html3.32.3 Added the <a href="../lang_corefunc.html#iif">iif() SQL function</a>.
+ƒ[9‚releaselog/3_32_3.html3.32.3 Add the <a href="../cksumvfs.html">checksum VFS shim</a> to the set of run-time loadable
     extensions included in the source tree.
jƒZ9releaselog/3_32_3.html3.32.3 Added the <a href="../bytecodevtab.html">bytecode virtual table</a>.
UƒY9        ‚qreleaselog/3_32_3.html3.32.3 Added support for <a href="../lang_analyze.html#approx">approximate ANALYZE</a> using the
     <a href="../pragma.html#pragma_analysis_limit">PRAGMA analysis_limit</a> command.
~ƒX9Areleaselog/3_33_0.html3.33.0
SHA3-256 for sqlite3.c: d00b7fffa6d33af2303430eaf394321da2960604d25a4471c7af566344f2abf9

ƒW9[releaselog/3_33_0.html3.33.0 SQLITE_SOURCE_ID: 2020-08-14 13:23:32 fca8dc8b578f215a969cd899336378966156154710873e68b3d9ac5881b0ff3f
ƒ9ƒV9†7releaselog/3_33_0.html3.33. In <a href="../wal.html">WAL mode</a>, if a writer crashes and leaves the <a href="../walformat.html#shm">shm file</a> in an inconsistent
     state, subsequent transactions are now able to recover the shm file even if
     there are active read transactions.  Before this enhancement, shm file recovery
     that scenario would result in an <a href="../rescode.html#protocol">SQLITE_PROTOCOL</a> error.
…ƒU9‰}releaselog/3_33_0.html3.33.0 Query planner improvements:
     <ol type="a">
     <li> Add the ability to find a
          full-index-scan query plan for queries using <a href="../lang_indexedby.html">INDEXED BY</a>
          which previously would fail with "no query solution".
     </li><li> Do a better job of
          detecting missing, incomplete, and/or dodgy <a href="../fileformat2.html#stat1tab">sqlite_stat1</a>
          data and generates good query plans in spite of the
          misinformation.
     </li><li> Improved performance of queries like "SELECT min(x) FROM t WHERE y IN (?,?,?)"
          assuming an index on t(x,y).
     </li></ol>


ÄÑ
¦
O       ±"¡È[¬>„%ƒm9ˆreleaselog/3_32_2.html3.32.2 INSERT and UPDATE statements now always apply <a href="../datatype3.html#affinity">column affinity</a>
     before computing <a href="../lang_createtable.html#ckconst">CHECK constraints</a>.  This bug fix could, in
     theory, cause problems for legacy databases with unorthodox
     CHECK constraints the require the input type for an INSERT
     is different from the declared column type. See ticket
     <a href="https://sqlite.org/src/info/86ba67afafded936">86ba67afafded936</a>
     for more information.
kƒl9releaselog/3_32_2.html3.32.2 Added the <a href="../lang_corefunc.html#iif">iif() SQL function</a>.
+ƒk9‚releaselog/3_32_2.html3.32.2 Add the <a href="../cksumvfs.html">checksum VFS shim</a> to the set of run-time loadable
     extensions included in the source tree.
jƒj9releaselog/3_32_2.html3.32.2 Added the <a href="../bytecodevtab.html">bytecode virtual table</a>.
Uƒi9        ‚qreleaselog/3_32_2.html3.32.2 Added support for <a href="../lang_analyze.html#approx">approximate ANALYZE</a> using the
     <a href="../pragma.html#pragma_analysis_limit">PRAGMA analysis_limit</a> command.
~ƒh9Areleaselog/3_32_3.html3.32.3SHA3-256 for sqlite3.c: b62b77ee1c561a69a71bb557694aaa5141f1714c1ff6cc1ba8aa8733c92d4f52

ƒg9[releaselog/3_32_3.html3.32.3SQLITE_SOURCE_ID: 2020-06-18 14:00:33 7ebdfa80be8e8e73324b8d66b3460222eb74c7e9dfd655b48d6ca7e1933cc8fd
„`ƒf9        ‰releaselog/3_32_3.html3.32.3 Various minor bug fixes including fixes for tickets
     <a href="https://www.sqlite.org/src/info/8f157e8010b22af0">8f157e8010b22af0</a>,
     <a href="https://www.sqlite.org/src/info/9fb26d37cefaba40">9fb26d37cefaba40</a>,
     <a href="https://www.sqlite.org/src/info/e367f31901ea8700">e367f31901ea8700</a>,
     <a href="https://www.sqlite.org/src/info/b706351ce2ecf59a">b706351ce2ecf59a</a>,
     <a href="https://www.sqlite.org/src/info/7c6d876f84e6e7e2">7c6d876f84e6e7e2</a>, and
     <a href="https://www.sqlite.org/src/info/c8d3b9f0a750a529">c8d3b9f0a750a529</a>.
‚6ƒe9        „3releaselog/3_32_3.html3.32.3 Fix a long-standing bug in the byte-code engine that can cause a
     <a href="../lang_transaction.html">COMMIT</a> command report as success when in fact it failed
     to commit.  Ticket
     <a href="https://www.sqlite.org/src/info/810dc8038872e212">810dc8038872e212</a>
Tƒd9oreleaselog/3_32_3.html3.32.3 Other minor compiler-warning fixes and whatnot.
‚'ƒc9        „releaselog/3_32_3.html3.32.3 Fix two long-standing bugs that allow malicious SQL statements
     to crash the process that is running SQLite.  These bugs were announced
     by a third-party approximately 24 hours after the 3.32.0 release but are
     not specific to the 3.32.0 release.
oƒb9ƒ#releaselog/3_32_3.html3.32.3
 The <a href="../lang_expr.html#like">ESCAPE</a> clause of a <a href="../lang_expr.html#like">LIKE</a> operator now overrides wildcard
     characters, so that the behavior matches what PostgreSQL does.
†8ƒa9Œ5releaselog/3_32_3.html3.32.3  Enhancements to the <a href="../cli.html">CLI</a>:
     <ol type="a">
     <li> Add options to the <a href="../cli.html#csv">.import</a> command: --csv, --ascii, --skip
     </li><li> The <a href="../cli.html#dump">.dump</a> command now accepts multiple LIKE-pattern arguments
          and outputs the union of all matching tables.
     </li><li> Add the .oom command in debugging builds
     </li><li> Add the --bom option to the <a href="../cli.html#dotexcel">.excel</a>, <a href="../cli.html#dotoutput">.output</a>, and <a href="../cli.html#dotoutput">.once</a>
          commands.
     </li><li> Enhance the .filectrl command to support the --schema option.
     </li><li> The <a href="../uintcseq.html">UINT collating sequence</a> extension is automatically loaded
     </li></ol>

rŠ
²ù  ÊŸHþ%¸        ›r„%ƒ|9ˆreleaselog/3_32_1.html3.32.1 INSERT and UPDATE statements now always apply <a href="../datatype3.html#affinity">column affinity</a>
     before computing <a href="../lang_createtable.html#ckconst">CHECK constraints</a>.  This bug fix could, in
     theory, cause problems for legacy databases with unorthodox
     CHECK constraints the require the input type for an INSERT
     is different from the declared column type. See ticket
     <a href="https://sqlite.org/src/info/86ba67afafded936">86ba67afafded936</a>
     for more information.
kƒ{9releaselog/3_32_1.html3.32.1 Added the <a href="../lang_corefunc.html#iif">iif() SQL function</a>.
+ƒz9‚releaselog/3_32_1.html3.32.1 Add the <a href="../cksumvfs.html">checksum VFS shim</a> to the set of run-time loadable
     extensions included in the source tree.
jƒy9releaselog/3_32_1.html3.32.1 Added the <a href="../bytecodevtab.html">bytecode virtual table</a>.
Uƒx9        ‚qreleaselog/3_32_1.html3.32.1 Added support for <a href="../lang_analyze.html#approx">approximate ANALYZE</a> using the
     <a href="../pragma.html#pragma_analysis_limit">PRAGMA analysis_limit</a> command.
~ƒw9Areleaselog/3_32_2.html3.32.2SHA3-256 for sqlite3.c: f17a2a57f7eebc72d405f3b640b4a49bcd02364a9c36e04feeb145eccafa3f8d

ƒv9[releaselog/3_32_2.html3.32.2SQLITE_SOURCE_ID: 2020-06-04 12:58:43 ec02243ea6ce33b090870ae55ab8aa2534b54d216d45c4aa2fdbb00e86861e8c
‚6ƒu9        „3releaselog/3_32_2.html3.32.2 Fix a long-standing bug in the byte-code engine that can cause a
     <a href="../lang_transaction.html">COMMIT</a> command report as success when in fact it failed
     to commit.  Ticket
     <a href="https://www.sqlite.org/src/info/810dc8038872e212">810dc8038872e212</a>
Tƒt9oreleaselog/3_32_2.html3.32.2 Other minor compiler-warning fixes and whatnot.
‚'ƒs9        „releaselog/3_32_2.html3.32.2 Fix two long-standing bugs that allow malicious SQL statements
     to crash the process that is running SQLite.  These bugs were announced
     by a third-party approximately 24 hours after the 3.32.0 release but are
     not specific to the 3.32.0 release.
oƒr9ƒ#releaselog/3_32_2.html3.32.2
 The <a href="../lang_expr.html#like">ESCAPE</a> clause of a <a href="../lang_expr.html#like">LIKE</a> operator now overrides wildcard
     characters, so that the behavior matches what PostgreSQL does.
†8ƒq9Œ5releaselog/3_32_2.html3.32.2  Enhancements to the <a href="../cli.html">CLI</a>:
     <ol type="a">
     <li> Add options to the <a href="../cli.html#csv">.import</a> command: --csv, --ascii, --skip
     </li><li> The <a href="../cli.html#dump">.dump</a> command now accepts multiple LIKE-pattern arguments
          and outputs the union of all matching tables.
     </li><li> Add the .oom command in debugging builds
     </li><li> Add the --bom option to the <a href="../cli.html#dotexcel">.excel</a>, <a href="../cli.html#dotoutput">.output</a>, and <a href="../cli.html#dotoutput">.once</a>
          commands.
     </li><li> Enhance the .filectrl command to support the --schema option.
     </li><li> The <a href="../uintcseq.html">UINT collating sequence</a> extension is automatically loaded
     </li></ol>
5ƒp9‚/releaselog/3_32_2.html3.32. Added code for the <a href="../uintcseq.html">UINT collating sequence</a> as an optional
     <a href="../loadext.html">loadable extension</a>.
Tƒo9‚mreleaselog/3_32_2.html3.32.2 Increase the <a href="../limits.html#max_variable_number">default upper bound</a>
     on the number of <a href="../lang_expr.html#varparam">parameters</a> from 999 to 32766.
‚rƒn9…)releaselog/3_32_2.html3.32.2 Added the <a href="../c3ref/create_filename.html">sqlite3_create_filename()</a>, <a href="../c3ref/create_filename.html">sqlite3_free_filename()</a>,
     and <a href="../c3ref/database_file_object.html">sqlite3_database_file_object()</a>
     interfaces to better support of <a href="../vfs.html#shim">VFS shim</a> implementations.

6Š
²ù  ÊŸH¹8_òCÕ¬6‚r„9…)releaselog/3_32_0.html3.32.0 Added the <a href="../c3ref/create_filename.html">sqlite3_create_filename()</a>, <a href="../c3ref/create_filename.html">sqlite3_free_filename()</a>,
     and <a href="../c3ref/database_file_object.html">sqlite3_database_file_object()</a>
     interfaces to better support of <a href="../vfs.html#shim">VFS shim</a> implementations.
„%„
9ˆreleaselog/3_32_0.html3.32.0 INSERT and UPDATE statements now always apply <a href="../datatype3.html#affinity">column affinity</a>
     before computing <a href="../lang_createtable.html#ckconst">CHECK constraints</a>.  This bug fix could, in
     theory, cause problems for legacy databases with unorthodox
     CHECK constraints the require the input type for an INSERT
     is different from the declared column type. See ticket
     <a href="https://sqlite.org/src/info/86ba67afafded936">86ba67afafded936</a>
     for more information.
k„      9releaselog/3_32_0.html3.32.0 Added the <a href="../lang_corefunc.html#iif">iif() SQL function</a>.
+9‚releaselog/3_32_0.html3.32.0 Add the <a href="../cksumvfs.html">checksum VFS shim</a> to the set of run-time loadable
     extensions included in the source tree.
j„9releaselog/3_32_0.html3.32.0 Added the <a href="../bytecodevtab.html">bytecode virtual table</a>.
U„9        ‚qreleaselog/3_32_0.html3.32.0 Added support for <a href="../lang_analyze.html#approx">approximate ANALYZE</a> using the
     <a href="../pragma.html#pragma_analysis_limit">PRAGMA analysis_limit</a> command.
~„9Areleaselog/3_32_1.html3.32.1SHA3-256 for sqlite3.c: f695ae21abf045e4ee77980a67ab2c6e03275009e593ee860a2eabf840482372

„9[releaselog/3_32_1.html3.32.1SQLITE_SOURCE_ID: 2020-05-25 16:19:56 0c1fcf4711a2e66c813aed38cf41cd3e2123ee8eb6db98118086764c4ba83350
T„9oreleaselog/3_32_1.html3.32.1 Other minor compiler-warning fixes and whatnot.
‚'„9        „releaselog/3_32_1.html3.32.1 Fix two long-standing bugs that allow malicious SQL statements
     to crash the process that is running SQLite.  These bugs were announced
     by a third-party approximately 24 hours after the 3.32.0 release but are
     not specific to the 3.32.0 release.
o„9ƒ#releaselog/3_32_1.html3.32.1
 The <a href="../lang_expr.html#like">ESCAPE</a> clause of a <a href="../lang_expr.html#like">LIKE</a> operator now overrides wildcard
     characters, so that the behavior matches what PostgreSQL does.
†8„9Œ5releaselog/3_32_1.html3.32.1  Enhancements to the <a href="../cli.html">CLI</a>:
     <ol type="a">
     <li> Add options to the <a href="../cli.html#csv">.import</a> command: --csv, --ascii, --skip
     </li><li> The <a href="../cli.html#dump">.dump</a> command now accepts multiple LIKE-pattern arguments
          and outputs the union of all matching tables.
     </li><li> Add the .oom command in debugging builds
     </li><li> Add the --bom option to the <a href="../cli.html#dotexcel">.excel</a>, <a href="../cli.html#dotoutput">.output</a>, and <a href="../cli.html#dotoutput">.once</a>
          commands.
     </li><li> Enhance the .filectrl command to support the --schema option.
     </li><li> The <a href="../uintcseq.html">UINT collating sequence</a> extension is automatically loaded
     </li></ol>
5ƒ9‚/releaselog/3_32_1.html3.32. Added code for the <a href="../uintcseq.html">UINT collating sequence</a> as an optional
     <a href="../loadext.html">loadable extension</a>.
Tƒ~9‚mreleaselog/3_32_1.html3.32.1 Increase the <a href="../limits.html#max_variable_number">default upper bound</a>
     on the number of <a href="../lang_expr.html#varparam">parameters</a> from 999 to 32766.
‚rƒ}9…)releaselog/3_32_1.html3.32.1 Added the <a href="../c3ref/create_filename.html">sqlite3_create_filename()</a>, <a href="../c3ref/create_filename.html">sqlite3_free_filename()</a>,
     and <a href="../c3ref/database_file_object.html">sqlite3_database_file_object()</a>
     interfaces to better support of <a href="../vfs.html#shim">VFS shim</a> implementations.

„(o3
@       ±       Ê؈ÛõgÆ„‚>„9„Areleaselog/3_31_1.html3.31.Added APIs <a href="../c3ref/filename_database.html">sqlite3_filename_database()</a>, <a href="../c3ref/filename_database.html">sqlite3_filename_journal()</a>, and
    <a href="../c3ref/filename_database.html">sqlite3_filename_wal()</a> which are useful for specialized extensions.
ƒ„9…releaselog/3_31_1.html3.31.1Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigtrustedschema">SQLITE_DBCONFIG_TRUSTED_SCHEMA</a> connection setting which is
    also controllable via the new <a href="../pragma.html#pragma_trusted_schema">trusted_schema pragma</a> and at compile-time
    using the <a href="../compile.html#trusted_schema">-DSQLITE_TRUSTED_SCHEMA</a> compile-time option.

„9Yreleaselog/3_31_1.html3.31.1Added the "#-N" array notation for <a href="../json1.html#jsonpath">JSON function path arguments</a>.
b„9ƒ      releaselog/3_31_1.html3.31.1Add the <a href="../c3ref/open.html#opennofollow">SQLITE_OPEN_NOFOLLOW</a> option to <a href="../c3ref/open.html">sqlite3_open_v2()</a> that
    prevents SQLite from opening symbolic links.
)„9‚releaselog/3_31_1.html3.31.1Add the <a href="../dbstat.html#dbstatagg">aggregated mode</a> feature to the
    <a href="../dbstat.html">DBSTAT virtual table</a>.
„L„9ˆ]releaselog/3_31_1.html3.31.1Enhance the <a href="../pragma.html#pragma_function_list">function_list pragma</a> to show the number of arguments on each
    function, the type of function (scalar, aggregate, window), and the function
    property flags <a href="../c3ref/c_deterministic.html#sqlitedeterministic">SQLITE_DETERMINISTIC</a>, <a href="../c3ref/c_deterministic.html#sqlitedirectonly">SQLITE_DIRECTONLY</a>,
    <a href="../c3ref/c_deterministic.html#sqliteinnocuous">SQLITE_INNOCUOUS</a>, and/or <a href="../c3ref/c_deterministic.html#sqlitesubtype">SQLITE_SUBTYPE</a>.
n„9ƒ!releaselog/3_31_1.html3.31.1Add the <a href="../c3ref/hard_heap_limit64.html">sqlite3_hard_heap_limit64()</a> interface and the corresponding
    <a href="../pragma.html#pragma_hard_heap_limit">PRAGMA hard_heap_limit</a> command.
c„9 
releaselog/3_31_1.html3.31.1Add support for <a href="../gencol.html">generated columns</a>.
~„9Areleaselog/3_32_0.html3.32.0SHA3-256 for sqlite3.c: 33ed868b21b62ce1d0352ed88bdbd9880a42f29046497a222df6459fc32a356f

„9[releaselog/3_32_0.html3.32.0SQLITE_SOURCE_ID: 2020-05-22 17:46:16 5998789c9c744bce92e4cff7636bba800a75574243d6977e1fc8281e360f8d5a
o„9ƒ#releaselog/3_32_0.html3.32.0
 The <a href="../lang_expr.html#like">ESCAPE</a> clause of a <a href="../lang_expr.html#like">LIKE</a> operator now overrides wildcard
     characters, so that the behavior matches what PostgreSQL does.
†8„9Œ5releaselog/3_32_0.html3.32.0  Enhancements to the <a href="../cli.html">CLI</a>:
     <ol type="a">
     <li> Add options to the <a href="../cli.html#csv">.import</a> command: --csv, --ascii, --skip
     </li><li> The <a href="../cli.html#dump">.dump</a> command now accepts multiple LIKE-pattern arguments
          and outputs the union of all matching tables.
     </li><li> Add the .oom command in debugging builds
     </li><li> Add the --bom option to the <a href="../cli.html#dotexcel">.excel</a>, <a href="../cli.html#dotoutput">.output</a>, and <a href="../cli.html#dotoutput">.once</a>
          commands.
     </li><li> Enhance the .filectrl command to support the --schema option.
     </li><li> The <a href="../uintcseq.html">UINT collating sequence</a> extension is automatically loaded
     </li></ol>
5„
9‚/releaselog/3_32_0.html3.32. Added code for the <a href="../uintcseq.html">UINT collating sequence</a> as an optional
     <a href="../loadext.html">loadable extension</a>.
T„9‚mreleaselog/3_32_0.html3.32.0 Increase the <a href="../limits.html#max_variable_number">default upper bound</a>
     on the number of <a href="../lang_expr.html#varparam">parameters</a> from 999 to 32766.

®Œ©
n¶A
ƒ       
@n‡ ®n„'9ƒ!releaselog/3_31_0.html3.31.0Add the <a href="../c3ref/hard_heap_limit64.html">sqlite3_hard_heap_limit64()</a> interface and the corresponding
    <a href="../pragma.html#pragma_hard_heap_limit">PRAGMA hard_heap_limit</a> command.
c„&9 
releaselog/3_31_0.html3.31.0Add support for <a href="../gencol.html">generated columns</a>.
~„%9Areleaselog/3_31_1.html3.31.1SHA3-256 for sqlite3.c: de465c64f09529429a38cbdf637acce4dfda6897f93e3db3594009e0fed56d27

„$9[releaselog/3_31_1.html3.31.1SQLITE_SOURCE_ID: 2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837bb4d6
‚T„#9„mreleaselog/3_31_1.html3.31.1 Fix a typos in the sqlite3ext.h header file that prevented the
     <a href="../c3ref/stmt_isexplain.html">sqlite3_stmt_isexplain()</a> and <a href="../c3ref/value_blob.html">sqlite3_value_frombind()</a> interfaces
     from being called from <a href="../loadext.html">run-time loadable extensions</a>.
ƒN„"9        †creleaselog/3_31_1.html3.31.1 Revert the data layout for an internal-use-only SQLite data structure.
     Applications that use SQLite should never reference internal SQLite
     data structures, but some do anyhow, and a change to one such 
     data structure in 3.30.0 broke a popular and widely-deployed
     application.  Reverting that change in SQLite, at least temporarily,
     gives developers of misbehaving applications time to fix their code.
…F„!9ŠQreleaselog/3_31_1.html3.31.1The <a href="../pragma.html#pragma_legacy_file_format">legacy_file_format pragma</a> is deactivated.  It is now a no-op.  In its place,
    the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfiglegacyfileformat">SQLITE_DBCONFIG_LEGACY_FILE_FORMAT</a> option to <a href="../c3ref/db_config.html">sqlite3_db_config()</a> is
    provided.  The legacy_file_format pragma is deactivated because (1) it is
    rarely useful and (2) it is incompatible with <a href="../lang_vacuum.html">VACUUM</a> in schemas that have
    tables with both generated columns and descending indexes.
    Ticket <a href="https://www.sqlite.org/src/info/6484e6ce678fffab">6484e6ce678fffab</a>
‚u„ 9…/releaselog/3_31_1.html3.31.1The <a href="../malloc.html#lookaside">lookaside memory allocator</a> is enhanced to support two separate memory
    pools with different sized allocations in each pool.  This allows more memory
    allocations to be covered by lookaside while at the same time reducing the
    heap memory usage to 48KB per connection, down from 120KB.
:„9‚9releaselog/3_31_1.html3.31.1Added the <a href="https://sqlite.org/src/file/ext/misc/uuid.c">uuid.c</a> extension module
    implementing functions for processing RFC-4122 UUIDs.
r„9)releaselog/3_31_1.html3.31.1
Faster response to <a href="../c3ref/interrupt.html">sqlite3_interrupt()</a>.
ƒ4„9†-releaselog/3_31_1.html3.31.1Add new verbs to <a href="../c3ref/vtab_config.html">sqlite3_vtab_config()</a> so that the <a href="../vtab.html#xconnect">xConnect</a> method
    of virtual tables can declare the virtual table as
    <a href="../c3ref/c_vtab_constraint_support.html#sqlitevtabinnocuous">SQLITE_VTAB_INNOCUOUS</a> or <a href="../c3ref/c_vtab_constraint_support.html#sqlitevtabdirectonly">SQLITE_VTAB_DIRECTONLY</a>.
‚7„9„3releaselog/3_31_1.html3.31.1Provide the ability to tag <a href="../appfunc.html">application-defined SQL functions</a> with
    new properties <a href="../c3ref/c_deterministic.html#sqliteinnocuous">SQLITE_INNOCUOUS</a> or <a href="../c3ref/c_deterministic.html#sqlitedirectonly">SQLITE_DIRECTONLY</a>.
_„9ƒreleaselog/3_31_1.html3.31.1
Upgraded the <a href="../c3ref/uri_boolean.html">sqlite3_uri_parameter()</a> function so that it works with the
    rollback journal or WAL filename in addition to the database filename.
q„9'releaselog/3_31_1.html3.31.1  Add the <a href="../c3ref/uri_boolean.html">sqlite3_uri_key()</a> interface.


¶
°
        8Ubí/¶‚u„49…/releaselog/3_31_0.html3.31.0The <a href="../malloc.html#lookaside">lookaside memory allocator</a> is enhanced to support two separate memory
    pools with different sized allocations in each pool.  This allows more memory
    allocations to be covered by lookaside while at the same time reducing the
    heap memory usage to 48KB per connection, down from 120KB.
:„39‚9releaselog/3_31_0.html3.31.0Added the <a href="https://sqlite.org/src/file/ext/misc/uuid.c">uuid.c</a> extension module
    implementing functions for processing RFC-4122 UUIDs.
r„29)releaselog/3_31_0.html3.31.0
Faster response to <a href="../c3ref/interrupt.html">sqlite3_interrupt()</a>.
ƒ4„19†-releaselog/3_31_0.html3.31.0Add new verbs to <a href="../c3ref/vtab_config.html">sqlite3_vtab_config()</a> so that the <a href="../vtab.html#xconnect">xConnect</a> method
    of virtual tables can declare the virtual table as
    <a href="../c3ref/c_vtab_constraint_support.html#sqlitevtabinnocuous">SQLITE_VTAB_INNOCUOUS</a> or <a href="../c3ref/c_vtab_constraint_support.html#sqlitevtabdirectonly">SQLITE_VTAB_DIRECTONLY</a>.
‚7„09„3releaselog/3_31_0.html3.31.0Provide the ability to tag <a href="../appfunc.html">application-defined SQL functions</a> with
    new properties <a href="../c3ref/c_deterministic.html#sqliteinnocuous">SQLITE_INNOCUOUS</a> or <a href="../c3ref/c_deterministic.html#sqlitedirectonly">SQLITE_DIRECTONLY</a>.
_„/9ƒreleaselog/3_31_0.html3.31.0
Upgraded the <a href="../c3ref/uri_boolean.html">sqlite3_uri_parameter()</a> function so that it works with the
    rollback journal or WAL filename in addition to the database filename.
q„.9'releaselog/3_31_0.html3.31.0  Add the <a href="../c3ref/uri_boolean.html">sqlite3_uri_key()</a> interface.
‚>„-9„Areleaselog/3_31_0.html3.31.Added APIs <a href="../c3ref/filename_database.html">sqlite3_filename_database()</a>, <a href="../c3ref/filename_database.html">sqlite3_filename_journal()</a>, and
    <a href="../c3ref/filename_database.html">sqlite3_filename_wal()</a> which are useful for specialized extensions.
ƒ„,9…releaselog/3_31_0.html3.31.0Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigtrustedschema">SQLITE_DBCONFIG_TRUSTED_SCHEMA</a> connection setting which is
    also controllable via the new <a href="../pragma.html#pragma_trusted_schema">trusted_schema pragma</a> and at compile-time
    using the <a href="../compile.html#trusted_schema">-DSQLITE_TRUSTED_SCHEMA</a> compile-time option.

„+9Yreleaselog/3_31_0.html3.31.0Added the "#-N" array notation for <a href="../json1.html#jsonpath">JSON function path arguments</a>.
b„*9ƒ      releaselog/3_31_0.html3.31.0Add the <a href="../c3ref/open.html#opennofollow">SQLITE_OPEN_NOFOLLOW</a> option to <a href="../c3ref/open.html">sqlite3_open_v2()</a> that
    prevents SQLite from opening symbolic links.
)„)9‚releaselog/3_31_0.html3.31.0Add the <a href="../dbstat.html#dbstatagg">aggregated mode</a> feature to the
    <a href="../dbstat.html">DBSTAT virtual table</a>.
„L„(9ˆ]releaselog/3_31_0.html3.31.0Enhance the <a href="../pragma.html#pragma_function_list">function_list pragma</a> to show the number of arguments on each
    function, the type of function (scalar, aggregate, window), and the function
    property flags <a href="../c3ref/c_deterministic.html#sqlitedeterministic">SQLITE_DETERMINISTIC</a>, <a href="../c3ref/c_deterministic.html#sqlitedirectonly">SQLITE_DIRECTONLY</a>,
    <a href="../c3ref/c_deterministic.html#sqliteinnocuous">SQLITE_INNOCUOUS</a>, and/or <a href="../c3ref/c_deterministic.html#sqlitesubtype">SQLITE_SUBTYPE</a>.

|
6§&—
¡       …©²þ!—|‚„B9ƒsreleaselog/3_30_1.html3.30.1 Added the <a href="../c3ref/c_deterministic.html#sqlitedirectonly">SQLITE_DIRECTONLY</a> flag for
     <a href="../appfunc.html">application-defined SQL functions</a> to prevent those functions from
     being used inside triggers and views.
ƒ„A9…Qreleaselog/3_30_1.html3.30.1
 Added the <a href="../tclsqlite.html">TCL Interface</a> <a href="../tclsqlite.html#config">config method</a> in order to be able to
     disable <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableview">SQLITE_DBCONFIG_ENABLE_VIEW</a> as well as control other
     <a href="../c3ref/db_config.html">sqlite3_db_config()</a> options from TCL.
Y„@9‚wreleaselog/3_30_1.html3.30.1  Add the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableview">SQLITE_DBCONFIG_ENABLE_VIEW</a> option for <a href="../c3ref/db_config.html">sqlite3_db_config()</a>.
ƒ0„?9†%releaselog/3_30_1.html3.30. The <a href="../pragma.html#pragma_function_list">PRAGMA function_list</a>, <a href="../pragma.html#pragma_module_list">PRAGMA module_list</a>, and
     <a href="../pragma.html#pragma_pragma_list">PRAGMA pragma_list</a> commands are now
     enabled in all builds by default.  Disable them using
     <a href="../compile.html#omit_introspection_pragmas">-DSQLITE_OMIT_INTROSPECTION_PRAGMAS</a>.
‚U„>9„oreleaselog/3_30_1.html3.30.1 Change the schema parser so that it will error out if any of
     the type, name, and tbl_name columns of the <a href="../schematab.html">sqlite_master table</a>
     have been corrupted and the database connection is not in
     <a href="../pragma.html#pragma_writable_schema">writable_schema</a> mode.
„=9yreleaselog/3_30_1.html3.30.1 Enhance the <a href="../rbu.html">RBU</a> extension to support <a href="../expridx.html">indexes on expressions</a>.
X„<9‚ureleaselog/3_30_1.html3.30.1 Improvements to the <a href="../cli.html#recover">.recover dot-command</a> in the <a href="../cli.html">CLI</a> so that
     it recovers more content from corrupt database files.
^„;9ƒreleaselog/3_30_1.html3.30.1 Add the <a href="../c3ref/drop_modules.html">sqlite3_drop_modules()</a> interface, allowing applications
     to disable automatically loaded virtual tables that they do not
     need.
‚6„:9„1releaselog/3_30_1.html3.30.1 The <a href="../pragma.html#pragma_index_info">index_info</a> and <a href="../pragma.html#pragma_index_xinfo">index_xinfo</a> pragmas are enhanced to provide
     information about the on-disk representation of <a href="../withoutrowid.html">WITHOUT ROWID</a>
     tables.
r„99ƒ)releaselog/3_30_1.html3.30.1 Add support for the <a href="../lang_select.html#nullslast">NULLS FIRST</a> and <a href="../lang_select.html#nullslast">NULLS LAST</a> syntax in <a href="../lang_select.html#orderby">ORDER BY</a> clauses.
„89        ]releaselog/3_30_1.html3.30.1 Add support for the <a href="../lang_aggfunc.html#aggfilter">FILTER clause on aggregate functions</a>.
~„79Areleaselog/3_31_0.html3.31.0SHA3-256 for sqlite3.c: a5fca0b9f8cbf80ac89b97193378c719d4af4b7d647729d8df9c0c0fca7b1388

„69[releaselog/3_31_0.html3.31.0SQLITE_SOURCE_ID: 2020-01-22 18:38:59 f6affdd41608946fcfcea914ece149038a8b25a62bbe719ed2561c649b86d824
…F„59ŠQreleaselog/3_31_0.html3.31.0The <a href="../pragma.html#pragma_legacy_file_format">legacy_file_format pragma</a> is deactivated.  It is now a no-op.  In its place,
    the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfiglegacyfileformat">SQLITE_DBCONFIG_LEGACY_FILE_FORMAT</a> option to <a href="../c3ref/db_config.html">sqlite3_db_config()</a> is
    provided.  The legacy_file_format pragma is deactivated because (1) it is
    rarely useful and (2) it is incompatible with <a href="../lang_vacuum.html">VACUUM</a> in schemas that have
    tables with both generated columns and descending indexes.
    Ticket <a href="https://www.sqlite.org/src/info/6484e6ce678fffab">6484e6ce678fffab</a>

?i

ۖ
û       eX{ñÖ?„S9kreleaselog/3_30_0.html3.30.0 The legacy <a href="../compile.html#enable_stat3">SQLITE_ENABLE_STAT3</a> compile-time option is now a no-op.
‚„R9ƒsreleaselog/3_30_0.html3.30.0 Added the <a href="../c3ref/c_deterministic.html#sqlitedirectonly">SQLITE_DIRECTONLY</a> flag for
     <a href="../appfunc.html">application-defined SQL functions</a> to prevent those functions from
     being used inside triggers and views.
ƒ„Q9…Qreleaselog/3_30_0.html3.30.0
 Added the <a href="../tclsqlite.html">TCL Interface</a> <a href="../tclsqlite.html#config">config method</a> in order to be able to
     disable <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableview">SQLITE_DBCONFIG_ENABLE_VIEW</a> as well as control other
     <a href="../c3ref/db_config.html">sqlite3_db_config()</a> options from TCL.
Y„P9‚wreleaselog/3_30_0.html3.30.0  Add the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableview">SQLITE_DBCONFIG_ENABLE_VIEW</a> option for <a href="../c3ref/db_config.html">sqlite3_db_config()</a>.
ƒ0„O9†%releaselog/3_30_0.html3.30. The <a href="../pragma.html#pragma_function_list">PRAGMA function_list</a>, <a href="../pragma.html#pragma_module_list">PRAGMA module_list</a>, and
     <a href="../pragma.html#pragma_pragma_list">PRAGMA pragma_list</a> commands are now
     enabled in all builds by default.  Disable them using
     <a href="../compile.html#omit_introspection_pragmas">-DSQLITE_OMIT_INTROSPECTION_PRAGMAS</a>.
‚U„N9„oreleaselog/3_30_0.html3.30.0 Change the schema parser so that it will error out if any of
     the type, name, and tbl_name columns of the <a href="../schematab.html">sqlite_master table</a>
     have been corrupted and the database connection is not in
     <a href="../pragma.html#pragma_writable_schema">writable_schema</a> mode.
„M9yreleaselog/3_30_0.html3.30.0 Enhance the <a href="../rbu.html">RBU</a> extension to support <a href="../expridx.html">indexes on expressions</a>.
X„L9‚ureleaselog/3_30_0.html3.30.0 Improvements to the <a href="../cli.html#recover">.recover dot-command</a> in the <a href="../cli.html">CLI</a> so that
     it recovers more content from corrupt database files.
^„K9ƒreleaselog/3_30_0.html3.30.0 Add the <a href="../c3ref/drop_modules.html">sqlite3_drop_modules()</a> interface, allowing applications
     to disable automatically loaded virtual tables that they do not
     need.
‚6„J9„1releaselog/3_30_0.html3.30.0 The <a href="../pragma.html#pragma_index_info">index_info</a> and <a href="../pragma.html#pragma_index_xinfo">index_xinfo</a> pragmas are enhanced to provide
     information about the on-disk representation of <a href="../withoutrowid.html">WITHOUT ROWID</a>
     tables.
r„I9ƒ)releaselog/3_30_0.html3.30.0 Add support for the <a href="../lang_select.html#nullslast">NULLS FIRST</a> and <a href="../lang_select.html#nullslast">NULLS LAST</a> syntax in <a href="../lang_select.html#orderby">ORDER BY</a> clauses.
„H9        ]releaselog/3_30_0.html3.30.0 Add support for the <a href="../lang_aggfunc.html#aggfilter">FILTER clause on aggregate functions</a>.
~„G9Areleaselog/3_30_1.html3.30.1SHA3-256 for sqlite3.c: f96fafe4c110ed7d77fc70a7d690e5edd1e64fefb84b3b5969a722d885de1f2d

„F9[releaselog/3_30_1.html3.30.1SQLITE_SOURCE_ID: 2019-10-10 20:19:45 18db032d058f1436ce3dea84081f4ee5a0f2259ad97301d43c426bc7f3df1b0b
u„E9/releaselog/3_30_1.html3.30.1 Cherrypick fixes for other obscure problems found since the 3.30.0
     release
‚]„D9        …releaselog/3_30_1.html3.30.1 Fix a bug in the <a href="../optoverview.html#flattening">query flattener</a> that might cause a segfault
for nested queries that use the new 
<a href="../lang_aggfunc.html#aggfilter">FILTER clause on aggregate functions</a>.
Ticket <a href="https://www.sqlite.org/src/info/1079ad19993d13fa">1079ad19993d13fa</a>
„C9kreleaselog/3_30_1.html3.30.1 The legacy <a href="../compile.html#enable_stat3">SQLITE_ENABLE_STAT3</a> compile-time option is now a no-op.


.qðxÑ
:       ðoÕÃ.„`9greleaselog/3_28_0.html3.28.0 Enhanced <a href="../lang_vacuum.html#vacuuminto">VACUUM INTO</a> so that it works for read-only databases.
‚„_9ƒareleaselog/3_28_0.html3.28.0 Added the new <a href="../c3ref/stmt_isexplain.html">sqlite3_stmt_isexplain(S)</a> interface for determining
     whether or not a <a href="../c3ref/stmt.html">prepared statement</a> is an <a href="../lang_explain.html">EXPLAIN</a>.
…„^9        ‰sreleaselog/3_28_0.html3.28.0 Enhanced <a href="../windowfunctions.html">window functions</a>:
<ol type="a">
  <li> Add support the <a href="../windowfunctions.html#wexcls">EXCLUDE clause</a>.
  </li><li> Add support for <a href="../windowfunctions.html#wchaining">window chaining</a>.
  </li><li> Add support for <a href="../windowfunctions.html#grouptype">GROUPS frames</a>.
  </li><li> Add support for "<a href="../windowfunctions.html#exprrange">&lt;expr&gt; PRECEDING</a>" and
       "<a href="../windowfunctions.html#exprrange">&lt;expr&gt; FOLLOWING</a>" boundaries
       in RANGE <a href="../windowfunctions.html#framespec">frames</a>.
</li></ol>
~„]9Areleaselog/3_29_0.html3.29.SHA3-256 for sqlite3.c: d9a5daf7697a827f4b2638276ce639fa04e8e8bb5fd3a6b683cfad10f1c81b12

„\9[releaselog/3_29_0.html3.29.0SQLITE_SOURCE_ID: 2019-07-10 17:32:03 fc82b73eaac8b36950e527f12c4b5dc1e147e6f4ad2217ae43ad82882a88bfa6
ƒ„[9…}releaselog/3_29_0.html3.29.0 Enhancements to the <a href="../cli.html">CLI</a>:
<ol type="a">
  <li> Add the ".recover" command which tries to recover as much content
       as possible from a corrupt database file.
  </li><li> Add the ".filectrl" command useful for testing.
  </li><li> Add the long-standing ".testctrl" command to the ".help" menu.
  </li><li> Added the ".dbconfig" command
</li></ol>
‚„Z9ƒ{releaselog/3_29_0.html3.29.0 Improvements to rounding behavior, so that the results of rounding
       binary numbers using the <a href="../lang_corefunc.html#round">round()</a> function are closer to what people
       who are used to thinking in decimal actually expect.
  x„Y9ƒ5releaselog/3_29_0.html3.29.0 Added the "<a href="https://sqlite.org/src/file/ext/misc/dbdata.c">sqlite_dbdata</a>"
       virtual table for extracting raw low-level content from an SQLite database,
       even a database that is corrupt.
  ƒ„X9…kreleaselog/3_29_0.html3.29.0 Improvements to the <a href="../optoverview.html">query planner</a>:
<ol type="a">
  <li> Improved optimization of AND and OR operators when one or the other
       operand is a constant.
  </li><li> Enhancements to the <a href="../optoverview.html#like_opt">LIKE optimization</a> for cases when the left-hand
       side column has numeric affinity.
  </li></ol>
  #„W9‚releaselog/3_29_0.html3.29.0 <a href="../compile.html#dqs">-DSQLITE_DQS=0</a> is now a <a href="../compile.html#rcmd">recommended compile-time option</a>.
„t„V9        ‰/releaselog/3_29_0.html3.29.0 Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigdqsdml">SQLITE_DBCONFIG_DQS_DML</a> and <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigdqsddl">SQLITE_DBCONFIG_DQS_DDL</a>
     actions to <a href="../c3ref/db_config.html">sqlite3_db_config()</a> for activating and deactivating
     the <a href="../quirks.html#dblquote">double-quoted string literal</a> misfeature.  Both default to "on"
     for legacy compatibility, but developers are encouraged to turn them
     "off", perhaps using the <a href="../compile.html#dqs">-DSQLITE_DQS=0</a> compile-time option.
~„U9Areleaselog/3_30_0.html3.30.0SHA3-256 for sqlite3.c: f04393dd47205a4ee2b98ff737dc51a3fdbcc14c055b88d58f5b27d0672158f5

„T9[releaselog/3_30_0.html3.30.0
SQLITE_SOURCE_ID: 2019-10-04 15:03:17 c20a35336432025445f9f7e289d0cc3e4003fb17f45a4ce74c6269c407c6e09f

p
ËºOÎÛpˆg„g9‘releaselog/3_28_0.html3.28.0
 Security and compatibilities enhancements to <a href="../fts3.html#f3tknzr">fts3_tokenizer()</a>:
<ol type="a">
  <li> The <a href="../fts3.html#f3tknzr">fts3_tokenizer()</a> function always returns NULL
       unless either the legacy application-defined FTS3 tokenizers interface
       are enabled using
       the <a href="../c3ref/db_config.html">sqlite3_db_config</a>(<a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenablefts3tokenizer">SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</a>)
       setting, or unless the first argument to fts3_tokenizer() is a <a href="../lang_expr.html#varparam">bound parameter</a>.
  </li><li> The two-argument version of <a href="../fts3.html#f3tknzr">fts3_tokenizer()</a> accepts a pointer to the
       tokenizer method object even without
       the <a href="../c3ref/db_config.html">sqlite3_db_config</a>(<a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenablefts3tokenizer">SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</a>) setting
       if the second argument is a <a href="../lang_expr.html#varparam">bound parameter</a>
</li></ol>     
o„f9ƒ#releaselog/3_28_0.html3.28.0  Added the <a href="../c3ref/value_blob.html">sqlite3_value_frombind()</a> API for determining if the argument
     to an SQL function is from a <a href="../lang_expr.html#varparam">bound parameter</a>.
‚}„e9…?releaselog/3_28_0.html3.28. Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigwritableschema">SQLITE_DBCONFIG_WRITABLE_SCHEMA</a> verb for the <a href="../c3ref/db_config.html">sqlite3_db_config()</a>
     interface, that does the same work as <a href="../pragma.html#pragma_writable_schema">PRAGMA writable_schema</a> without using the
     SQL parser.
‚g„d9…releaselog/3_28_0.html3.28.0 Added the <a href="https://sqlite.org/src/file/ext/misc/fossildelta.c">fossildelta.c</a>
     extension that can create, apply, and deconstruct the 
 <a href="https://fossil-scm.org/fossil/doc/trunk/www/delta_format.wiki">Fossil DVCS file delta format</a>
     that is used by the <a href="../rbu.html">RBU extension</a>.
‡E„c9ŽOreleaselog/3_28_0.html3.28.0 Enhancements to the <a href="../cli.html">CLI</a>:
<ol type="a">
  <li> Added support for <a href="../lang_expr.html#varparam">bound parameters</a> and the <a href="../cli.html#param">.parameter command</a>.
  </li><li> Fix the <a href="../cli.html#fileio">readfile()</a> function so that it returns
       an empty BLOB rather than throwing an out-of-memory error when
       reading an empty file.
  </li><li> Fix the <a href="../cli.html#fileio">writefile()</a> function so that when it
       creates new directories along the path of a new file, it gives them
       umask permissions rather than the same permissions as the file.
  </li><li> Change <a href="../cli.html#arinsup">--update option</a> in the <a href="../cli.html#sqlar">.archive command</a> so that it skips
       files that are already in the archive and are unchanged.  Add the
       new --insert option that works like --update used to work.
</li></ol>
‚D„b9„Mreleaselog/3_28_0.html3.28.0 Enhancements to the <a href="../tclsqlite.html">TCL Interface</a>:
<ol type="a">
  <li> Added the -returntype option to the <a href="../tclsqlite.html#function">function method</a>.
  </li><li> Added the new <a href="../tclsqlite.html#bind_fallback">bind_fallback method</a>.
</li></ol>
„1„a9ˆ'releaselog/3_28_0.html3.28.0 New query optimizations:
<ol type="a">
  <li> Enable the <a href="../optoverview.html#like_opt">LIKE optimization</a> for cases when the ESCAPE keyword
       is present and <a href="../pragma.html#pragma_case_sensitive_like">PRAGMA case_sensitive_like</a> is on.
  </li><li> In queries that are driven by a <a href="../partialindex.html">partial index</a>, avoid unnecessary
       tests of the constraint named in the WHERE clause of the partial
       index, since we know that constraint must always be true.
</li></ol>

á¥W
Ç
8·F~  ºeቄr9‘Ereleaselog/3_27_2.html3.27.2Enhancements to the <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> interface:
<ol type="a">
  <li> Add the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlsizelimit">SQLITE_FCNTL_SIZE_LIMIT</a> <a href="../c3ref/file_control.html">file-control</a> for
       setting an upper bound on the size of the in-memory database created
       by sqlite3_deserialize.  The default upper bound is 1GiB, or whatever
       alternative value is specified by
       <a href="../c3ref/config.html">sqlite3_config</a>(<a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigmemdbmaxsize">SQLITE_CONFIG_MEMDB_MAXSIZE</a>)
       and/or <a href="../compile.html#memdb_default_maxsize">SQLITE_MEMDB_DEFAULT_MAXSIZE</a>.
  </li><li> Honor the <a href="../c3ref/c_deserialize_freeonclose.html">SQLITE_DESERIALIZE_READONLY</a> flag, which was previously described
       in the documentation, but was previously a no-op.
  </li><li> Enhance the "deserialize" command of the <a href="../tclsqlite.html">TCL Interface</a> to give it
       new "--maxsize N" and "--readonly BOOLEAN" options.
</li></ol>
‚Q„q9„greleaselog/3_27_2.html3.27.2Added the <a href="../c3ref/c_prepare_normalize.html#sqlitepreparenovtab">SQLITE_PREPARE_NO_VTAB</a> option to <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a>.
Use that option to prevent circular references to <a href="../vtab.html#xshadowname">shadow tables</a> from
causing resource leaks.
„p9greleaselog/3_27_2.html3.27.2Added the remove_diacritics=2 option to <a href="../fts3.html">FTS3</a> and <a href="../fts5.html">FTS5</a>.
„+„o9ˆreleaselog/3_27_2.html3.27.2The <a href="../c3ref/expanded_sql.html">sqlite3_normalized_sql()</a> interface works on any prepared statement
created using <a href="../c3ref/prepare.html">sqlite3_prepare_v2()</a> or <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a>.  It is no
longer necessary to use <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a> with <a href="../c3ref/c_prepare_normalize.html#sqlitepreparenormalize">SQLITE_PREPARE_NORMALIZE</a>
in order to use <a href="../c3ref/expanded_sql.html">sqlite3_normalized_sql()</a>.
D„n9‚Mreleaselog/3_27_2.html3.27.2Issue an SQLITE_WARNING message on the <a href="../errlog.html">error log</a> if a 
<a href="../quirks.html#dblquote">double-quoted string literal</a> is used.
n„m9 #releaselog/3_27_2.html3.27.2Added the <a href="../lang_vacuum.html#vacuuminto">VACUUM INTO</a> command
~„l9Areleaselog/3_28_0.html3.28.0SHA3-256 for sqlite3.c: 411efca996b65448d9798eb203d6ebe9627b7161a646f5d00911e2902a57b2e9

„k9[releaselog/3_28_0.html3.28.0SQLITE_SOURCE_ID: 2019-04-16 19:49:53 884b4b7e502b4e991677b53971277adfaf0a04a284f8e483e2553d0f83156b50
ƒ„j9…]releaselog/3_28_0.html3.28.0
 Established a Git mirror of the offical SQLite source tree. 
     The canonical sources for SQLite are maintained using the
     <a href="https://fossil-scm.org/">Fossil DVCS</a> at <a href="https://sqlite.org/src">https://sqlite.org/src</a>.
     The Git mirror can be seen at <a href="https://github.com/sqlite/sqlite">https://github.com/sqlite/sqlite</a>.
K„i9]releaselog/3_28_0.html3.28.0 Miscellaneous performance enhancements
X„h9wreleaselog/3_28_0.html3.28.0 Improved robustness against corrupt database files.

Žd
Ó
3¶©TñÌŽ‚:„~9„9releaselog/3_27_2.html3.27.2Fix a bug that caused <a href="../lang_corefunc.html#zeroblob">zeroblob</a> values to be truncated when inserted into
a table that uses an <a href="../expridx.html">expression index</a>.
Ticket <a href="https://www.sqlite.org/src/info/bb4bdb9f7f654b0bb9">bb4bdb9f7f654b0bb9</a>
‚!„}9„releaselog/3_27_2.html3.27.2Fix the <a href="../lang_altertable.html#altertabmvcol">ALTER TABLE RENAME COLUMN</a> command so that it works for tables
that have redundant UNIQUE constraints.
Ticket <a href="https://www.sqlite.org/src/info/bc8d94f0fbd633fd9a">bc8d94f0fbd633fd9a</a>
‚„|9„releaselog/3_27_2.html3.27.2Fix a problem with the use of <a href="../windowfunctions.html">window functions</a> used within 
<a href="../lang_expr.html#cosub">correlated subqueries</a>.
Ticket <a href="https://www.sqlite.org/src/info/d0866b26f83e9c55e3">d0866b26f83e9c55e3</a>
‚=„{9„?releaselog/3_27_2.html3.27.2Fix the <a href="../lang_replace.html">REPLACE</a> command so that it is no longer able to sneak a
NULL value into a NOT NULL column even if the NOT NULL column has a default
value of NULL.
Ticket <a href="https://www.sqlite.org/src/info/e6f1f2e34dceeb1ed6">e6f1f2e34dceeb1ed6</a>
‚Q„z9„greleaselog/3_27_2.html3.27.2Fix a problem with the
<a href="../optoverview.html#leftjoinreduction">LEFT JOIN strength reduction optimization</a> in which the optimization
was being applied inappropriately due to an IS NOT NULL operator.
Ticket <a href="https://www.sqlite.org/src/info/5948e09b8c415bc45d">5948e09b8c415bc45d</a>.
‚       „y9ƒWreleaselog/3_27_2.html3.27.2
Fix a problem with the <a href="../optoverview.html#or_opt">OR optimization</a> on <a href="../expridx.html">indexes on expressions</a>.
Ticket <a href="https://www.sqlite.org/src/info/d96eba87698a428c1d">d96eba87698a428c1d</a>.
z„x99releaselog/3_27_2.html3.27.2Fix a parser bug that prevented the use of parentheses around table-valued
functions.
„w9yreleaselog/3_27_2.html3.27.2Ensure that ALTER TABLE modifies table and column names embedded in WITH
clauses that are part of views and triggers.
‚9„v9„7releaselog/3_27_2.html3.27.2
Fix the <a href="../optoverview.html#flattening">query flattener</a> so that it works on queries that contain
subqueries that use <a href="../windowfunctions.html">window functions</a>.
Ticket <a href="https://www.sqlite.org/src/info/f09fcd17810f65f717">709fcd17810f65f717</a>
A„u9‚Greleaselog/3_27_2.html3.27.2 Do not use a partial index to do a table scan on an IN operator.
Ticket <a href="https://www.sqlite.org/src/info/1d958d90596593a774">1d958d90596593a774</a>.

„t9_releaselog/3_27_2.html3.27. Increased robustness against malicious SQL that is run against a 
     maliciously corrupted database.
 ‰„s9‘ureleaselog/3_27_2.html3.27.2Enhancements to the <a href="../cli.html">CLI</a>, mostly to support testing and debugging
of the SQLite library itself:
<ol type="a">
  <li> Add support for ".open --hexdb". The 
       "<a href="https://sqlite.org/src/doc/trunk/tool/dbtotxt.md">dbtotxt</a>" utility 
       program used to generate the text for the "hexdb" is added to the 
       source tree.
  </li><li> Add support for the "--maxsize N" option on ".open --deserialize".
  </li><li> Add the "--memtrace" command-line option, to show all memory allocations
       and deallocations.
  </li><li> Add the ".eqp trace" option on builds with SQLITE_DEBUG, to enable
       bytecode program listing with indentation and 
       <a href="../pragma.html#pragma_vdbe_trace">PRAGMA vdbe_trace</a> all in one step.
  </li><li> Add the ".progress" command for accessing
       the <a href="../c3ref/progress_handler.html">sqlite3_progress_handler()</a> interface.
  </li><li> Add the "--async" option to the ".backup" command.
  </li><li> Add options "--expanded", "--normalized", "--plain", "--profile", "--row",
       "--stmt", and "--close" to the ".trace" command.
</li></ol>

ri
~ŠCÉH
×
àKör‰…
9‘Ereleaselog/3_27_1.html3.27.1Enhancements to the <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> interface:
<ol type="a">
  <li> Add the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlsizelimit">SQLITE_FCNTL_SIZE_LIMIT</a> <a href="../c3ref/file_control.html">file-control</a> for
       setting an upper bound on the size of the in-memory database created
       by sqlite3_deserialize.  The default upper bound is 1GiB, or whatever
       alternative value is specified by
       <a href="../c3ref/config.html">sqlite3_config</a>(<a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigmemdbmaxsize">SQLITE_CONFIG_MEMDB_MAXSIZE</a>)
       and/or <a href="../compile.html#memdb_default_maxsize">SQLITE_MEMDB_DEFAULT_MAXSIZE</a>.
  </li><li> Honor the <a href="../c3ref/c_deserialize_freeonclose.html">SQLITE_DESERIALIZE_READONLY</a> flag, which was previously described
       in the documentation, but was previously a no-op.
  </li><li> Enhance the "deserialize" command of the <a href="../tclsqlite.html">TCL Interface</a> to give it
       new "--maxsize N" and "--readonly BOOLEAN" options.
</li></ol>
‚Q…     9„greleaselog/3_27_1.html3.27.1Added the <a href="../c3ref/c_prepare_normalize.html#sqlitepreparenovtab">SQLITE_PREPARE_NO_VTAB</a> option to <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a>.
Use that option to prevent circular references to <a href="../vtab.html#xshadowname">shadow tables</a> from
causing resource leaks.
9greleaselog/3_27_1.html3.27.1Added the remove_diacritics=2 option to <a href="../fts3.html">FTS3</a> and <a href="../fts5.html">FTS5</a>.
„+…9ˆreleaselog/3_27_1.html3.27.1The <a href="../c3ref/expanded_sql.html">sqlite3_normalized_sql()</a> interface works on any prepared statement
created using <a href="../c3ref/prepare.html">sqlite3_prepare_v2()</a> or <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a>.  It is no
longer necessary to use <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a> with <a href="../c3ref/c_prepare_normalize.html#sqlitepreparenormalize">SQLITE_PREPARE_NORMALIZE</a>
in order to use <a href="../c3ref/expanded_sql.html">sqlite3_normalized_sql()</a>.
D…9‚Mreleaselog/3_27_1.html3.27.1Issue an SQLITE_WARNING message on the <a href="../errlog.html">error log</a> if a 
<a href="../quirks.html#dblquote">double-quoted string literal</a> is used.
n…9 #releaselog/3_27_1.html3.27.1Added the <a href="../lang_vacuum.html#vacuuminto">VACUUM INTO</a> command
~…9Areleaselog/3_27_2.html3.27.2SHA3-256 for sqlite3.c: 1dbae33bff261f979d0042338f72c9e734b11a80720fb32498bae9150cc576e7

w…93releaselog/3_27_2.html3.27.2SQLITE_SOURCE_ID: bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0f6d7
D…9Oreleaselog/3_27_2.html3.27.2 Fix various documentation typos
p…9ƒ%releaselog/3_27_2.html3.27.2 Fix a bug causing a crash when a <a href="../windowfunctions.html">window function</a> is misused.  Ticket
     <a href="https://www.sqlite.org/src/info/4feb3159c6bc3f7e33959">4feb3159c6bc3f7e33959</a>.
g…9        ƒreleaselog/3_27_2.html3.27.2 Fix a bug in the IN operator that was introduced by an 
     attempted optimization in version 3.27.0. Ticket
     <a href="https://www.sqlite.org/src/info/df46dfb631f75694">df46dfb631f75694</a>
ƒ„9        …mreleaselog/3_27_2.html3.27.2 Fix a bug in the query optimizer: an adverse interaction between
the <a href="../optoverview.html#or_opt">OR optimization</a> and the optimization that tries to use values
read directly from an <a href="../expridx.html">expression index</a> instead of recomputing the
expression.
Ticket <a href="https://www.sqlite.org/src/info/4e8e4857d32d401f">4e8e4857d32d401f</a>

Žd
Ó
3¶©TñÌŽ‚:…9„9releaselog/3_27_1.html3.27.1Fix a bug that caused <a href="../lang_corefunc.html#zeroblob">zeroblob</a> values to be truncated when inserted into
a table that uses an <a href="../expridx.html">expression index</a>.
Ticket <a href="https://www.sqlite.org/src/info/bb4bdb9f7f654b0bb9">bb4bdb9f7f654b0bb9</a>
‚!…9„releaselog/3_27_1.html3.27.1Fix the <a href="../lang_altertable.html#altertabmvcol">ALTER TABLE RENAME COLUMN</a> command so that it works for tables
that have redundant UNIQUE constraints.
Ticket <a href="https://www.sqlite.org/src/info/bc8d94f0fbd633fd9a">bc8d94f0fbd633fd9a</a>
‚…9„releaselog/3_27_1.html3.27.1Fix a problem with the use of <a href="../windowfunctions.html">window functions</a> used within 
<a href="../lang_expr.html#cosub">correlated subqueries</a>.
Ticket <a href="https://www.sqlite.org/src/info/d0866b26f83e9c55e3">d0866b26f83e9c55e3</a>
‚=…9„?releaselog/3_27_1.html3.27.1Fix the <a href="../lang_replace.html">REPLACE</a> command so that it is no longer able to sneak a
NULL value into a NOT NULL column even if the NOT NULL column has a default
value of NULL.
Ticket <a href="https://www.sqlite.org/src/info/e6f1f2e34dceeb1ed6">e6f1f2e34dceeb1ed6</a>
‚Q…9„greleaselog/3_27_1.html3.27.1Fix a problem with the
<a href="../optoverview.html#leftjoinreduction">LEFT JOIN strength reduction optimization</a> in which the optimization
was being applied inappropriately due to an IS NOT NULL operator.
Ticket <a href="https://www.sqlite.org/src/info/5948e09b8c415bc45d">5948e09b8c415bc45d</a>.
‚       …9ƒWreleaselog/3_27_1.html3.27.1
Fix a problem with the <a href="../optoverview.html#or_opt">OR optimization</a> on <a href="../expridx.html">indexes on expressions</a>.
Ticket <a href="https://www.sqlite.org/src/info/d96eba87698a428c1d">d96eba87698a428c1d</a>.
z…99releaselog/3_27_1.html3.27.1Fix a parser bug that prevented the use of parentheses around table-valued
functions.
…9yreleaselog/3_27_1.html3.27.1Ensure that ALTER TABLE modifies table and column names embedded in WITH
clauses that are part of views and triggers.
‚9…9„7releaselog/3_27_1.html3.27.1
Fix the <a href="../optoverview.html#flattening">query flattener</a> so that it works on queries that contain
subqueries that use <a href="../windowfunctions.html">window functions</a>.
Ticket <a href="https://www.sqlite.org/src/info/f09fcd17810f65f717">709fcd17810f65f717</a>
A…
9‚Greleaselog/3_27_1.html3.27.1 Do not use a partial index to do a table scan on an IN operator.
Ticket <a href="https://www.sqlite.org/src/info/1d958d90596593a774">1d958d90596593a774</a>.

…9_releaselog/3_27_1.html3.27. Increased robustness against malicious SQL that is run against a 
     maliciously corrupted database.
 ‰…9‘ureleaselog/3_27_1.html3.27.1Enhancements to the <a href="../cli.html">CLI</a>, mostly to support testing and debugging
of the SQLite library itself:
<ol type="a">
  <li> Add support for ".open --hexdb". The 
       "<a href="https://sqlite.org/src/doc/trunk/tool/dbtotxt.md">dbtotxt</a>" utility 
       program used to generate the text for the "hexdb" is added to the 
       source tree.
  </li><li> Add support for the "--maxsize N" option on ".open --deserialize".
  </li><li> Add the "--memtrace" command-line option, to show all memory allocations
       and deallocations.
  </li><li> Add the ".eqp trace" option on builds with SQLITE_DEBUG, to enable
       bytecode program listing with indentation and 
       <a href="../pragma.html#pragma_vdbe_trace">PRAGMA vdbe_trace</a> all in one step.
  </li><li> Add the ".progress" command for accessing
       the <a href="../c3ref/progress_handler.html">sqlite3_progress_handler()</a> interface.
  </li><li> Add the "--async" option to the ".backup" command.
  </li><li> Add options "--expanded", "--normalized", "--plain", "--profile", "--row",
       "--stmt", and "--close" to the ".trace" command.
</li></ol>

    ƒi
Ú
Yè    ñ       ƒ‰…9‘Ereleaselog/3_27_0.html3.27.0Enhancements to the <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> interface:
<ol type="a">
  <li> Add the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlsizelimit">SQLITE_FCNTL_SIZE_LIMIT</a> <a href="../c3ref/file_control.html">file-control</a> for
       setting an upper bound on the size of the in-memory database created
       by sqlite3_deserialize.  The default upper bound is 1GiB, or whatever
       alternative value is specified by
       <a href="../c3ref/config.html">sqlite3_config</a>(<a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigmemdbmaxsize">SQLITE_CONFIG_MEMDB_MAXSIZE</a>)
       and/or <a href="../compile.html#memdb_default_maxsize">SQLITE_MEMDB_DEFAULT_MAXSIZE</a>.
  </li><li> Honor the <a href="../c3ref/c_deserialize_freeonclose.html">SQLITE_DESERIALIZE_READONLY</a> flag, which was previously described
       in the documentation, but was previously a no-op.
  </li><li> Enhance the "deserialize" command of the <a href="../tclsqlite.html">TCL Interface</a> to give it
       new "--maxsize N" and "--readonly BOOLEAN" options.
</li></ol>
‚Q…9„greleaselog/3_27_0.html3.27.0Added the <a href="../c3ref/c_prepare_normalize.html#sqlitepreparenovtab">SQLITE_PREPARE_NO_VTAB</a> option to <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a>.
Use that option to prevent circular references to <a href="../vtab.html#xshadowname">shadow tables</a> from
causing resource leaks.
…9greleaselog/3_27_0.html3.27.0Added the remove_diacritics=2 option to <a href="../fts3.html">FTS3</a> and <a href="../fts5.html">FTS5</a>.
„+…9ˆreleaselog/3_27_0.html3.27.0The <a href="../c3ref/expanded_sql.html">sqlite3_normalized_sql()</a> interface works on any prepared statement
created using <a href="../c3ref/prepare.html">sqlite3_prepare_v2()</a> or <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a>.  It is no
longer necessary to use <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a> with <a href="../c3ref/c_prepare_normalize.html#sqlitepreparenormalize">SQLITE_PREPARE_NORMALIZE</a>
in order to use <a href="../c3ref/expanded_sql.html">sqlite3_normalized_sql()</a>.
D…9‚Mreleaselog/3_27_0.html3.27.0Issue an SQLITE_WARNING message on the <a href="../errlog.html">error log</a> if a 
<a href="../quirks.html#dblquote">double-quoted string literal</a> is used.
n…9 #releaselog/3_27_0.html3.27.0Added the <a href="../lang_vacuum.html#vacuuminto">VACUUM INTO</a> command
~…9Areleaselog/3_27_1.html3.27.1SHA3-256 for sqlite3.c: 11c14992660d5ac713ea8bea48dc5e6123f26bc8d3075fe5585d1a217d090233

…9[releaselog/3_27_1.html3.27.1SQLITE_SOURCE_ID: 2019-02-08 13:17:39 0eca3dd3d38b31c92b49ca2d311128b74584714d9e7de895b1a6286ef959a1dd
ƒ…9        …mreleaselog/3_27_1.html3.27.1 Fix a bug in the query optimizer: an adverse interaction between
the <a href="../optoverview.html#or_opt">OR optimization</a> and the optimization that tries to use values
read directly from an <a href="../expridx.html">expression index</a> instead of recomputing the
expression.
Ticket <a href="https://www.sqlite.org/src/info/4e8e4857d32d401f">4e8e4857d32d401f</a>

Žd
Ó
3¶©TñÌŽ‚:…+9„9releaselog/3_27_0.html3.27.0Fix a bug that caused <a href="../lang_corefunc.html#zeroblob">zeroblob</a> values to be truncated when inserted into
a table that uses an <a href="../expridx.html">expression index</a>.
Ticket <a href="https://www.sqlite.org/src/info/bb4bdb9f7f654b0bb9">bb4bdb9f7f654b0bb9</a>
‚!…*9„releaselog/3_27_0.html3.27.0Fix the <a href="../lang_altertable.html#altertabmvcol">ALTER TABLE RENAME COLUMN</a> command so that it works for tables
that have redundant UNIQUE constraints.
Ticket <a href="https://www.sqlite.org/src/info/bc8d94f0fbd633fd9a">bc8d94f0fbd633fd9a</a>
‚…)9„releaselog/3_27_0.html3.27.0Fix a problem with the use of <a href="../windowfunctions.html">window functions</a> used within 
<a href="../lang_expr.html#cosub">correlated subqueries</a>.
Ticket <a href="https://www.sqlite.org/src/info/d0866b26f83e9c55e3">d0866b26f83e9c55e3</a>
‚=…(9„?releaselog/3_27_0.html3.27.0Fix the <a href="../lang_replace.html">REPLACE</a> command so that it is no longer able to sneak a
NULL value into a NOT NULL column even if the NOT NULL column has a default
value of NULL.
Ticket <a href="https://www.sqlite.org/src/info/e6f1f2e34dceeb1ed6">e6f1f2e34dceeb1ed6</a>
‚Q…'9„greleaselog/3_27_0.html3.27.0Fix a problem with the
<a href="../optoverview.html#leftjoinreduction">LEFT JOIN strength reduction optimization</a> in which the optimization
was being applied inappropriately due to an IS NOT NULL operator.
Ticket <a href="https://www.sqlite.org/src/info/5948e09b8c415bc45d">5948e09b8c415bc45d</a>.
‚       …&9ƒWreleaselog/3_27_0.html3.27.0
Fix a problem with the <a href="../optoverview.html#or_opt">OR optimization</a> on <a href="../expridx.html">indexes on expressions</a>.
Ticket <a href="https://www.sqlite.org/src/info/d96eba87698a428c1d">d96eba87698a428c1d</a>.
z…%99releaselog/3_27_0.html3.27.0Fix a parser bug that prevented the use of parentheses around table-valued
functions.
…$9yreleaselog/3_27_0.html3.27.0Ensure that ALTER TABLE modifies table and column names embedded in WITH
clauses that are part of views and triggers.
‚9…#9„7releaselog/3_27_0.html3.27.0
Fix the <a href="../optoverview.html#flattening">query flattener</a> so that it works on queries that contain
subqueries that use <a href="../windowfunctions.html">window functions</a>.
Ticket <a href="https://www.sqlite.org/src/info/f09fcd17810f65f717">709fcd17810f65f717</a>
A…"9‚Greleaselog/3_27_0.html3.27.0 Do not use a partial index to do a table scan on an IN operator.
Ticket <a href="https://www.sqlite.org/src/info/1d958d90596593a774">1d958d90596593a774</a>.

…!9_releaselog/3_27_0.html3.27. Increased robustness against malicious SQL that is run against a 
     maliciously corrupted database.
 ‰… 9‘ureleaselog/3_27_0.html3.27.0Enhancements to the <a href="../cli.html">CLI</a>, mostly to support testing and debugging
of the SQLite library itself:
<ol type="a">
  <li> Add support for ".open --hexdb". The 
       "<a href="https://sqlite.org/src/doc/trunk/tool/dbtotxt.md">dbtotxt</a>" utility 
       program used to generate the text for the "hexdb" is added to the 
       source tree.
  </li><li> Add support for the "--maxsize N" option on ".open --deserialize".
  </li><li> Add the "--memtrace" command-line option, to show all memory allocations
       and deallocations.
  </li><li> Add the ".eqp trace" option on builds with SQLITE_DEBUG, to enable
       bytecode program listing with indentation and 
       <a href="../pragma.html#pragma_vdbe_trace">PRAGMA vdbe_trace</a> all in one step.
  </li><li> Add the ".progress" command for accessing
       the <a href="../c3ref/progress_handler.html">sqlite3_progress_handler()</a> interface.
  </li><li> Add the "--async" option to the ".backup" command.
  </li><li> Add options "--expanded", "--normalized", "--plain", "--profile", "--row",
       "--stmt", and "--close" to the ".trace" command.
</li></ol>

'ní
Çn}
       l¡å
´'ƒ       …99…Wreleaselog/3_26_0.html3.26.0Enhancements to the <a href="../geopoly.html">geopoly</a> extension:
<ol type="a">
  <li>Always stores polygons
      using the binary format, which is faster and uses less space.
  </li><li>Added the <a href="../geopoly.html#regpoly">geopoly_regular()</a> function.
  </li><li>Added the <a href="../geopoly.html#ccw">geopoly_ccw()</a> function.
</li></ol>
„U…89ˆoreleaselog/3_26_0.html3.26.0Enhancements to the <a href="../cli.html">CLI</a>:
<ol type="a">
  <li>Improvements to the ".help" command.
  </li><li>The SQLITE_HISTORY environment variable, if it exists,
      specifies the name of the command-line editing history file
  </li><li>The --deserialize option associated with opening a new database cause the
      database file to be read into memory and accessed using the
      <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> API. This simplifies running tests on a database
      without modifying the file on disk.
</li></ol>
T…79‚mreleaselog/3_26_0.html3.26.0
Enhanced triggers so that they can use <a href="../vtab.html#tabfunc2">table-valued functions</a> that
    exist in schemas other than the schema where the trigger is defined.
8…69‚5releaselog/3_26_0.html3.26.0 Added support for the <a href="../c3ref/expanded_sql.html">sqlite3_normalized_sql()</a> interface, when compiling
    with SQLITE_ENABLE_NORMALIZE.
G…59‚Sreleaselog/3_26_0.html3.26.Add a limit counter to the query planner to prevent excessive
    <a href="../c3ref/prepare.html">sqlite3_prepare()</a> times for certain pathological SQL inputs.
'…49‚releaselog/3_26_0.html3.26.0Added the <a href="https://sqlite.org/src/file/ext/misc/explain.c">explain virtual table</a>
    as a run-time loadable extension.
‚(…39„releaselog/3_26_0.html3.26.0Added <a href="../pragma.html#pragma_table_xinfo">PRAGMA table_xinfo</a> that works just like <a href="../pragma.html#pragma_table_info">PRAGMA table_info</a>
    except that it also shows <a href="../vtab.html#hiddencol">hidden columns</a> in virtual tables.
‚:…29„9releaselog/3_26_0.html3.26.0Added the <a href="../pragma.html#pragma_legacy_alter_table">PRAGMA legacy_alter_table</a> command, which if enabled causes the
    <a href="../lang_altertable.html">ALTER TABLE</a> command to behave like older version of SQLite (prior to
    version 3.25.0) for compatibility.
x…19ƒ5releaselog/3_26_0.html3.26.0Added support for read-only <a href="../vtab.html#xshadowname">shadow tables</a> when the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigdefensive">SQLITE_DBCONFIG_DEFENSIVE</a>
    option is enabled.
m…09ƒreleaselog/3_26_0.html3.26.0Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigdefensive">SQLITE_DBCONFIG_DEFENSIVE</a> option which disables the ability to 
    create corrupt database files using ordinary SQL.
‚U…/9„oreleaselog/3_26_0.html3.26.0Allow the <a href="../vtab.html#xbestindex">xBestIndex()</a> method of <a href="../vtab.html">virtual table</a> implementations to return
    <a href="../rescode.html#constraint">SQLITE_CONSTRAINT</a> to indicate that the proposed query plan is unusable and
    should not be given further consideration.
‚"….9        „releaselog/3_26_0.html3.26.0Optimization: When doing an <a href="../lang_update.html">UPDATE</a> on a table with <a href="../expridx.html">indexes on expressions</a>,
    do not update the expression indexes if they do not refer to any of the columns
    of the table being updated.
~…-9Areleaselog/3_27_0.html3.27.0SHA3-256 for sqlite3.c: ca011a10ee8515b33e5643444b98ee3d74dc45d3ac766c3700320def52bc6aba

…,9areleaselog/3_27_0.html3.27.0SQLITE_SOURCE_ID: "2019-02-07 17:02:52 97744701c3bd414e6c9d7182639d8c2ce7cf124c4fce625071ae65658ac61713
"



¡
!
<!-gÔ+ÍW‚R…F9„ireleaselog/3_25_3.html3.25.3
 On an UPSERT when the order of constraint checks is rearranged,
     ensure that the affinity transformations on the inserted content
     occur before any of the constraint checks. Fix for ticket
     <a href="https://www.sqlite.org/src/info/79cad5e4b2e219dd197242e9e">79cad5e4b2e219dd197242e9e</a>.
‚r…E9…)releaselog/3_25_3.html3.25.3  The ORDER BY LIMIT optimization might have caused an infinite loop
     in the byte code of the prepared statement under very obscure
     circumstances,
     due to a confluence of minor defects in the query optimizer.
     Fix for ticket
     <a href="https://www.sqlite.org/src/info/9936b2fa443fec03ff25">9936b2fa443fec03ff25</a>
[…D9}releaselog/3_25_3.html3.25. Added the <a href="../geopoly.html">Geopoly module</a>
%…C9‚releaselog/3_25_3.html3.25.3 Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntldataversion">SQLITE_FCNTL_DATA_VERSION</a> file-control.
…B9creleaselog/3_25_3.html3.25.3 Output infinity as 1e999 in the ".dump" command of the
     <a href="../cli.html">command-line shell</a>.
B…A9‚Ireleaselog/3_25_3.html3.25.3 Enhance the <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> command for improved detection
     of problems on the page freelist.
p…@9ƒ%releaselog/3_25_3.html3.25.3 Use a separate mutex on every inode in the unix <a href="../vfs.html">VFS</a>, rather than
     a single mutex shared among them all, for slightly better concurrency
     in multi-threaded environments.
†…?9‹sreleaselog/3_25_3.html3.25.3 Query optimizer improvements:
<ol type="a">
  <li> Avoid unnecessary loads of columns in an aggregate query that
       are not within an aggregate function and that are not part
       of the GROUP BY clause.
  </li><li> The IN-early-out optimization: When doing a look-up on a
       multi-column index and an IN operator is used on a column
       other than the left-most column, then if no rows match against
       the first IN value, check to make sure there exist rows that
       match the columns to the right before continuing with the
       next IN value.
  </li><li> Use the transitive property to try to propagate constant
       values within the WHERE clause.  For example, convert
       "a=99 AND b=a" into "a=99 AND b=99".
</li></ol>
ƒa…>9‡releaselog/3_25_3.html3.25.3 Enhancements the <a href="../lang_altertable.html">ALTER TABLE</a> command:
<ol type="a">
  <li> Add support for renaming columns within a table using
       ALTER TABLE <i>table</i> RENAME COLUMN <i>oldname</i> TO <i>newname</i>.
  </li><li> Fix table rename feature so that it also updates references
       to the renamed table in <a href="../lang_createtrigger.html">triggers</a> and <a href="../lang_createview.html">views</a>.
</li></ol>
k…=9 releaselog/3_25_3.html3.25.3 Add support for <a href="../windowfunctions.html">window functions</a>
~…<9Areleaselog/3_26_0.html3.26.0SHA3-256 for sqlite3.c: 72c08830da9b5d1cb397c612c0e870d7f5eb41a323b41aa3d8aa5ae9ccedb2c4


…;9_releaselog/3_26_0.html3.26.0SQLITE_SOURCE_ID: "2018-12-01 12:34:55 bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9"
„[…:9ˆ{releaselog/3_26_0.html3.26.0
Enhancements to the <a href="../sessionintro.html">session</a> extension:
<ol type="a">
  <li>Added the <a href="../session/c_changesetapply_invert.html">SQLITE_CHANGESETAPPLY_INVERT</a> flag
  </li><li>Added the <a href="../session/sqlite3changeset_start.html">sqlite3changeset_start_v2()</a> interface and the
      <a href="../session/c_changesetstart_invert.html">SQLITE_CHANGESETSTART_INVERT</a> flag.
  </li><li>Added the 
      <a href="https://sqlite.org/src/file/ext/session/changesetfuzz.c">changesetfuzz.c</a>
      test-case generator utility.
</li></ol>

¼É
.‘
<:§ºç|l<«*¼k…U9      releaselog/3_25_2.html3.25.2 Add support for <a href="../windowfunctions.html">window functions</a>
~…T9Areleaselog/3_25_3.html3.25.3SHA3-256 for sqlite3.c: 45586e4df74de3a43f3a1f8c7a78c3c3f02edce01af7d10cafe68bb94476a5c5


…S9_releaselog/3_25_3.html3.25.3SQLITE_SOURCE_ID: "2018-11-05 20:37:38 89e099fbe5e13c33e683bef07361231ca525b88f7907be7092058007b75036f2"
‚,…R9„releaselog/3_25_3.html3.25.3 Fix the query planner so that it works correctly for IS NOT NULL operators
     in the ON clause of a LEFT JOIN with the SQLITE_ENABLE_STAT4 compile-time option.
     <a href="https://sqlite.org/src/info/65eb38f6e46de8c75e188a17ec">65eb38f6e46de8c75e188a17ec</a>
‚…Q9ƒ]releaselog/3_25_3.html3.25.3 Fix a problem in the query planner that results when a row-value expression
     is used with a PRIMARY KEY with redundant columns.  Ticket
     <a href="https://sqlite.org/src/info/1a84668dcfdebaf12415d">1a84668dcfdebaf12415d</a>
h…P9releaselog/3_25_3.html3.25.3 Strengthen defenses against deliberately corrupted database files.
O…O9‚creleaselog/3_25_3.html3.25.3 Fix the behavior of typeof() and length() on virtual tables.  Ticket
     <a href="https://sqlite.org/src/info/69d642332d25aa3b7315a6d385">69d642332d25aa3b7315a6d385</a>
i…N9        ƒreleaselog/3_25_3.html3.25.3 Disallow the use of <a href="../windowfunctions.html">window functions</a> in the recursive part of
     a CTE. Ticket <a href="https://sqlite.org/src/info/e8275b415a2f03bee">e8275b415a2f03bee</a>
…M9creleaselog/3_25_3.html3.25.3 Fixes for various other compiler warnings and minor problems associated
     with obscure configurations.
~…L9ƒAreleaselog/3_25_3.html3.25.3 Fix a problem with the new <a href="../windowfunctions.html">window functions</a> implementation that caused
     a malfunction when complicated expressions involving window functions were used
     inside of a view.
ƒj…K9        ‡releaselog/3_25_3.html3.25.3 Add the <a href="../pragma.html#pragma_legacy_alter_table">PRAGMA legacy_alter_table=ON</a> command that causes the
     "ALTER TABLE RENAME" command to behave as it did in SQLite versions 3.24.0
     and earlier: references to the renamed table inside the bodies of triggers
     and views are not updated.  This new pragma provides a compatibility
     work around for older programs that expected the older, wonky behavior
     of ALTER TABLE RENAME.
‚c…J9…releaselog/3_25_3.html3.25.3 The fix in the 3.25.0 release for the endless-loop in the byte-code 
     associated with the ORDER BY LIMIT optimization did not work for
     some queries involving window functions.  An additional correction
     is required.  Ticket
     <a href="https://sqlite.org/src/info/510cde277783b5fb">510cde277783b5fb</a>
ƒ…I9        …yreleaselog/3_25_3.html3.25.3 Extra sanity checking added to ALTER TABLE in the 3.25.0 release
     sometimes raises a false-positive
     when the table being modified has a trigger that
     updates a virtual table.  The false-positive caused the ALTER
     TABLE to rollback, thus leaving the schema unchanged.
     Ticket <a href="https://sqlite.org/src/info/b41031ea2b537237">b41031ea2b537237</a>.
ƒ…H9…sreleaselog/3_25_3.html3.25.3 The LIKE optimization was generating incorrect byte-code and hence
     getting the wrong answer
     if the left-hand operand has numeric affinity and the right-hand-side
     pattern is '/%' or if the pattern begins with the ESCAPE character.
     Fix for ticket
     <a href="https://www.sqlite.org/src/info/c94369cae9b561b1f996d0054b">c94369cae9b561b1f996d0054b</a>
‚3…G9„+releaselog/3_25_3.html3.25.3 Avoid using a prepared statement for ".stats on" command of the
     <a href="../cli.html">CLI</a> after it has been closed by the ".eqp full" logicc. Fix for ticket
     <a href="https://www.sqlite.org/src/info/7be932dfa60a8a6b3b26bcf76">7be932dfa60a8a6b3b26bcf76</a>.

q
       
¬6à©qƒ…a9   …yreleaselog/3_25_2.html3.25.2 Extra sanity checking added to ALTER TABLE in the 3.25.0 release
     sometimes raises a false-positive
     when the table being modified has a trigger that
     updates a virtual table.  The false-positive caused the ALTER
     TABLE to rollback, thus leaving the schema unchanged.
     Ticket <a href="https://sqlite.org/src/info/b41031ea2b537237">b41031ea2b537237</a>.
ƒ…`9…sreleaselog/3_25_2.html3.25.2 The LIKE optimization was generating incorrect byte-code and hence
     getting the wrong answer
     if the left-hand operand has numeric affinity and the right-hand-side
     pattern is '/%' or if the pattern begins with the ESCAPE character.
     Fix for ticket
     <a href="https://www.sqlite.org/src/info/c94369cae9b561b1f996d0054b">c94369cae9b561b1f996d0054b</a>
‚3…_9„+releaselog/3_25_2.html3.25.2 Avoid using a prepared statement for ".stats on" command of the
     <a href="../cli.html">CLI</a> after it has been closed by the ".eqp full" logicc. Fix for ticket
     <a href="https://www.sqlite.org/src/info/7be932dfa60a8a6b3b26bcf76">7be932dfa60a8a6b3b26bcf76</a>.
‚R…^9„ireleaselog/3_25_2.html3.25.2
 On an UPSERT when the order of constraint checks is rearranged,
     ensure that the affinity transformations on the inserted content
     occur before any of the constraint checks. Fix for ticket
     <a href="https://www.sqlite.org/src/info/79cad5e4b2e219dd197242e9e">79cad5e4b2e219dd197242e9e</a>.
‚r…]9…)releaselog/3_25_2.html3.25.2  The ORDER BY LIMIT optimization might have caused an infinite loop
     in the byte code of the prepared statement under very obscure
     circumstances,
     due to a confluence of minor defects in the query optimizer.
     Fix for ticket
     <a href="https://www.sqlite.org/src/info/9936b2fa443fec03ff25">9936b2fa443fec03ff25</a>
[…\9}releaselog/3_25_2.html3.25. Added the <a href="../geopoly.html">Geopoly module</a>
%…[9‚releaselog/3_25_2.html3.25.2 Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntldataversion">SQLITE_FCNTL_DATA_VERSION</a> file-control.
…Z9creleaselog/3_25_2.html3.25.2 Output infinity as 1e999 in the ".dump" command of the
     <a href="../cli.html">command-line shell</a>.
B…Y9‚Ireleaselog/3_25_2.html3.25.2 Enhance the <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> command for improved detection
     of problems on the page freelist.
p…X9ƒ%releaselog/3_25_2.html3.25.2 Use a separate mutex on every inode in the unix <a href="../vfs.html">VFS</a>, rather than
     a single mutex shared among them all, for slightly better concurrency
     in multi-threaded environments.
†…W9‹sreleaselog/3_25_2.html3.25.2 Query optimizer improvements:
<ol type="a">
  <li> Avoid unnecessary loads of columns in an aggregate query that
       are not within an aggregate function and that are not part
       of the GROUP BY clause.
  </li><li> The IN-early-out optimization: When doing a look-up on a
       multi-column index and an IN operator is used on a column
       other than the left-most column, then if no rows match against
       the first IN value, check to make sure there exist rows that
       match the columns to the right before continuing with the
       next IN value.
  </li><li> Use the transitive property to try to propagate constant
       values within the WHERE clause.  For example, convert
       "a=99 AND b=a" into "a=99 AND b=99".
</li></ol>
ƒa…V9‡releaselog/3_25_2.html3.25.2 Enhancements the <a href="../lang_altertable.html">ALTER TABLE</a> command:
<ol type="a">
  <li> Add support for renaming columns within a table using
       ALTER TABLE <i>table</i> RENAME COLUMN <i>oldname</i> TO <i>newname</i>.
  </li><li> Fix table rename feature so that it also updates references
       to the renamed table in <a href="../lang_createtrigger.html">triggers</a> and <a href="../lang_createview.html">views</a>.
</li></ol>

B™«©
…
       –±–¢ÜI B[…o9}releaselog/3_25_1.html3.25. Added the <a href="../geopoly.html">Geopoly module</a>
%…n9‚releaselog/3_25_1.html3.25.1 Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntldataversion">SQLITE_FCNTL_DATA_VERSION</a> file-control.
…m9creleaselog/3_25_1.html3.25.1 Output infinity as 1e999 in the ".dump" command of the
     <a href="../cli.html">command-line shell</a>.
B…l9‚Ireleaselog/3_25_1.html3.25.1 Enhance the <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> command for improved detection
     of problems on the page freelist.
p…k9ƒ%releaselog/3_25_1.html3.25.1 Use a separate mutex on every inode in the unix <a href="../vfs.html">VFS</a>, rather than
     a single mutex shared among them all, for slightly better concurrency
     in multi-threaded environments.
†…j9‹sreleaselog/3_25_1.html3.25.1 Query optimizer improvements:
<ol type="a">
  <li> Avoid unnecessary loads of columns in an aggregate query that
       are not within an aggregate function and that are not part
       of the GROUP BY clause.
  </li><li> The IN-early-out optimization: When doing a look-up on a
       multi-column index and an IN operator is used on a column
       other than the left-most column, then if no rows match against
       the first IN value, check to make sure there exist rows that
       match the columns to the right before continuing with the
       next IN value.
  </li><li> Use the transitive property to try to propagate constant
       values within the WHERE clause.  For example, convert
       "a=99 AND b=a" into "a=99 AND b=99".
</li></ol>
ƒa…i9‡releaselog/3_25_1.html3.25.1 Enhancements the <a href="../lang_altertable.html">ALTER TABLE</a> command:
<ol type="a">
  <li> Add support for renaming columns within a table using
       ALTER TABLE <i>table</i> RENAME COLUMN <i>oldname</i> TO <i>newname</i>.
  </li><li> Fix table rename feature so that it also updates references
       to the renamed table in <a href="../lang_createtrigger.html">triggers</a> and <a href="../lang_createview.html">views</a>.
</li></ol>
k…h9 releaselog/3_25_1.html3.25.1 Add support for <a href="../windowfunctions.html">window functions</a>
~…g9Areleaselog/3_25_2.html3.25.2SHA3-256 for sqlite3.c: 34c23ff91631ae10354f8c9d62fd7d65732b3d7f3acfd0bbae31ff4a62fe28af


…f9_releaselog/3_25_2.html3.25.2SQLITE_SOURCE_ID: "2018-09-25 19:08:10 fb90e7189ae6d62e77ba3a308ca5d683f90bbe633cf681865365b8e92792d1c7"
…e9creleaselog/3_25_2.html3.25.2 Fixes for various other compiler warnings and minor problems associated
     with obscure configurations.
~…d9ƒAreleaselog/3_25_2.html3.25.2 Fix a problem with the new <a href="../windowfunctions.html">window functions</a> implementation that caused
     a malfunction when complicated expressions involving window functions were used
     inside of a view.
ƒj…c9        ‡releaselog/3_25_2.html3.25.2 Add the <a href="../pragma.html#pragma_legacy_alter_table">PRAGMA legacy_alter_table=ON</a> command that causes the
     "ALTER TABLE RENAME" command to behave as it did in SQLite versions 3.24.0
     and earlier: references to the renamed table inside the bodies of triggers
     and views are not updated.  This new pragma provides a compatibility
     work around for older programs that expected the older, wonky behavior
     of ALTER TABLE RENAME.
‚c…b9…releaselog/3_25_2.html3.25.2 The fix in the 3.25.0 release for the endless-loop in the byte-code 
     associated with the ORDER BY LIMIT optimization did not work for
     some queries involving window functions.  An additional correction
     is required.  Ticket
     <a href="https://sqlite.org/src/info/510cde277783b5fb">510cde277783b5fb</a>

ÞŠ
4ý
Å^ÍLÞùÞ†…z9‹sreleaselog/3_25_0.html3.25.0 Query optimizer improvements:
<ol type="a">
  <li> Avoid unnecessary loads of columns in an aggregate query that
       are not within an aggregate function and that are not part
       of the GROUP BY clause.
  </li><li> The IN-early-out optimization: When doing a look-up on a
       multi-column index and an IN operator is used on a column
       other than the left-most column, then if no rows match against
       the first IN value, check to make sure there exist rows that
       match the columns to the right before continuing with the
       next IN value.
  </li><li> Use the transitive property to try to propagate constant
       values within the WHERE clause.  For example, convert
       "a=99 AND b=a" into "a=99 AND b=99".
</li></ol>
ƒa…y9‡releaselog/3_25_0.html3.25.0 Enhancements the <a href="../lang_altertable.html">ALTER TABLE</a> command:
<ol type="a">
  <li> Add support for renaming columns within a table using
       ALTER TABLE <i>table</i> RENAME COLUMN <i>oldname</i> TO <i>newname</i>.
  </li><li> Fix table rename feature so that it also updates references
       to the renamed table in <a href="../lang_createtrigger.html">triggers</a> and <a href="../lang_createview.html">views</a>.
</li></ol>
k…x9 releaselog/3_25_0.html3.25.0 Add support for <a href="../windowfunctions.html">window functions</a>
~…w9Areleaselog/3_25_1.html3.25.1SHA3-256 for sqlite3.c: 1b2302e7a54cc99c84ff699a299f61f069a28e1ed090b89e4430ca80ae2aab06


…v9_releaselog/3_25_1.html3.25.1SQLITE_SOURCE_ID: "2018-09-18 20:20:44 2ac9003de44da7dafa3fbb1915ac5725a9275c86bf2f3b7aa19321bf1460b386"
‚c…u9…releaselog/3_25_1.html3.25.1 The fix in the 3.25.0 release for the endless-loop in the byte-code 
     associated with the ORDER BY LIMIT optimization did not work for
     some queries involving window functions.  An additional correction
     is required.  Ticket
     <a href="https://sqlite.org/src/info/510cde277783b5fb">510cde277783b5fb</a>
ƒ…t9        …yreleaselog/3_25_1.html3.25.1 Extra sanity checking added to ALTER TABLE in the 3.25.0 release
     sometimes raises a false-positive
     when the table being modified has a trigger that
     updates a virtual table.  The false-positive caused the ALTER
     TABLE to rollback, thus leaving the schema unchanged.
     Ticket <a href="https://sqlite.org/src/info/b41031ea2b537237">b41031ea2b537237</a>.
ƒ…s9…sreleaselog/3_25_1.html3.25.1 The LIKE optimization was generating incorrect byte-code and hence
     getting the wrong answer
     if the left-hand operand has numeric affinity and the right-hand-side
     pattern is '/%' or if the pattern begins with the ESCAPE character.
     Fix for ticket
     <a href="https://www.sqlite.org/src/info/c94369cae9b561b1f996d0054b">c94369cae9b561b1f996d0054b</a>
‚3…r9„+releaselog/3_25_1.html3.25.1 Avoid using a prepared statement for ".stats on" command of the
     <a href="../cli.html">CLI</a> after it has been closed by the ".eqp full" logicc. Fix for ticket
     <a href="https://www.sqlite.org/src/info/7be932dfa60a8a6b3b26bcf76">7be932dfa60a8a6b3b26bcf76</a>.
‚R…q9„ireleaselog/3_25_1.html3.25.1
 On an UPSERT when the order of constraint checks is rearranged,
     ensure that the affinity transformations on the inserted content
     occur before any of the constraint checks. Fix for ticket
     <a href="https://www.sqlite.org/src/info/79cad5e4b2e219dd197242e9e">79cad5e4b2e219dd197242e9e</a>.
‚r…p9…)releaselog/3_25_1.html3.25.1  The ORDER BY LIMIT optimization might have caused an infinite loop
     in the byte code of the prepared statement under very obscure
     circumstances,
     due to a confluence of minor defects in the query optimizer.
     Fix for ticket
     <a href="https://www.sqlite.org/src/info/9936b2fa443fec03ff25">9936b2fa443fec03ff25</a>

ÎF
³
¬6    ©}üŠË4„Õ΂†9ƒKreleaselog/3_24_0.html3.24.0 Improve the format of the <a href="../eqp.html">EXPLAIN QUERY PLAN</a> raw output, so that
     it gives better information about the query plan and about the
     relationships between the various components of the plan.
+†9‚releaselog/3_24_0.html3.24.0 Add the sorter-reference optimization as a compile-time option.
     Only available if compiled with SQLITE_ENABLE_SORTER_REFERENCES.
,†
9‚releaselog/3_24_0.html3.24.0 Enhance <a href="../lang_altertable.html">ALTER TABLE</a> so that it recognizes "true" and "false" as
     valid arguments to DEFAULT.
†     9kreleaselog/3_24_0.html3.24.0 Add C-language APIs for dynamic strings based on the
     <a href="../c3ref/str.html">sqlite3_str</a> object.
‚<9„=releaselog/3_24_0.html3.24.0 Add C-language APIs for discovering SQL keywords used by
     SQLite: <a href="../c3ref/keyword_check.html">sqlite3_keyword_count()</a>, <a href="../c3ref/keyword_check.html">sqlite3_keyword_name()</a>, and
     <a href="../c3ref/keyword_check.html">sqlite3_keyword_check()</a>.
|†9=releaselog/3_24_0.html3.24.0 Add support for <a href="../rtree.html#auxcol">auxiliary columns in r-tree tables</a>.
o†9 %releaselog/3_24_0.html3.24.0 Add support for PostgreSQL-style <a href="../lang_upsert.html">UPSERT</a>.
~†9Areleaselog/3_25_0.html3.25.0SHA3-256 for sqlite3.c: 989e3ff37f2b5eea8e42205f808ccf0ba86c6ea6aa928ad2c011f33a108ac45d


†9_releaselog/3_25_0.html3.25.0
SQLITE_SOURCE_ID: "2018-09-15 04:01:47 b63af6c3bd33152742648d5d2e8dc5d5fcbcdd27df409272b6aea00a6f761760"
ƒ†9…sreleaselog/3_25_0.html3.25.0 The LIKE optimization was generating incorrect byte-code and hence
     getting the wrong answer
     if the left-hand operand has numeric affinity and the right-hand-side
     pattern is '/%' or if the pattern begins with the ESCAPE character.
     Fix for ticket
     <a href="https://www.sqlite.org/src/info/c94369cae9b561b1f996d0054b">c94369cae9b561b1f996d0054b</a>
‚3†9„+releaselog/3_25_0.html3.25.0 Avoid using a prepared statement for ".stats on" command of the
     <a href="../cli.html">CLI</a> after it has been closed by the ".eqp full" logicc. Fix for ticket
     <a href="https://www.sqlite.org/src/info/7be932dfa60a8a6b3b26bcf76">7be932dfa60a8a6b3b26bcf76</a>.
‚R†9„ireleaselog/3_25_0.html3.25.0
 On an UPSERT when the order of constraint checks is rearranged,
     ensure that the affinity transformations on the inserted content
     occur before any of the constraint checks. Fix for ticket
     <a href="https://www.sqlite.org/src/info/79cad5e4b2e219dd197242e9e">79cad5e4b2e219dd197242e9e</a>.
‚r†9…)releaselog/3_25_0.html3.25.0  The ORDER BY LIMIT optimization might have caused an infinite loop
     in the byte code of the prepared statement under very obscure
     circumstances,
     due to a confluence of minor defects in the query optimizer.
     Fix for ticket
     <a href="https://www.sqlite.org/src/info/9936b2fa443fec03ff25">9936b2fa443fec03ff25</a>
[…9}releaselog/3_25_0.html3.25. Added the <a href="../geopoly.html">Geopoly module</a>
%…~9‚releaselog/3_25_0.html3.25.0 Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntldataversion">SQLITE_FCNTL_DATA_VERSION</a> file-control.
…}9creleaselog/3_25_0.html3.25.0 Output infinity as 1e999 in the ".dump" command of the
     <a href="../cli.html">command-line shell</a>.
B…|9‚Ireleaselog/3_25_0.html3.25.0 Enhance the <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> command for improved detection
     of problems on the page freelist.
p…{9ƒ%releaselog/3_25_0.html3.25.0 Use a separate mutex on every inode in the unix <a href="../vfs.html">VFS</a>, rather than
     a single mutex shared among them all, for slightly better concurrency
     in multi-threaded environments.

}a
É
n
(
§       f÷UöjfÂi}h†9ƒreleaselog/3_24_0.html3.24.0 Fix the <a href="../json1.html#jeach">json_each()</a> function so that it returns
     valid results on its "fullkey" column when the input is a simple value
     rather than an array or object.
‚U†9„oreleaselog/3_24_0.html3.24.0 Fix a long-standing problem wherein a corrupt schema on the
     <a href="../fileformat2.html#seqtab">sqlite_sequence</a> table used by <a href="../autoinc.html">AUTOINCREMENT</a> can lead to
     a crash. Ticket
     <a href="https://www.sqlite.org/src/info/d8dc2b3a58cd5dc29">d8dc2b3a58cd5dc2918a1</a>
 †9‚releaselog/3_24_0.html3.24.0 Fix a memory leak that can occur following a failure to open error
     in the <a href="../csv.html">CSV virtual table</a>
‚†9ƒEreleaselog/3_24_0.html3.24.0 Do not attempt to use terms from the WHERE clause to enable
     indexed lookup of the right-hand table of a LEFT JOIN.  Ticket
     <a href="https://sqlite.org/src/info/4ba5abf65c5b0f9a96a7a">4ba5abf65c5b0f9a96a7a</a>
†9…Ureleaselog/3_24_0.html3.24.0 For the right-hand table of a LEFT JOIN, compute the values
     of expressions directly rather than loading precomputed values
     out of an <a href="../expridx.html">expression index</a> as the expression index might
     not contain the correct value.  Ticket
     <a href="https://sqlite.org/src/info/7fa8049685b50b5aeb0c2">7fa8049685b50b5aeb0c2</a>
\†9releaselog/3_24_0.html3.24.0 Performance improvements in the LEMON-generated parser.
(†9‚releaselog/3_24_0.html3.24.0 Make use of the one-pass UPDATE and DELETE query plans in the
     <a href="../rtree.html">R-Tree extension</a> where appropriate.
r†9ƒ)releaselog/3_24_0.html3.24.0 The query planner is more aggressive about using
     <a href="../optoverview.html#autoindex">automatic indexes</a> for views and subqueries for which it is
     not possible to create a persistent index.
‚k†9…releaselog/3_24_0.html3.24.0 The <a href="../optoverview.html#or_opt">OR optimization</a> is allowed to proceed
     even if the OR expression has also been converted into an IN
     expression.  Uses of the OR optimization are now also 
     <a href="../eqp.html#or-opt">more clearly shown</a> in the <a href="../eqp.html">EXPLAIN QUERY PLAN</a> output.
‚=†9„?releaselog/3_24_0.html3.24.0 Queries that use ORDER BY and LIMIT now try to avoid computing
     rows that cannot possibly come in under the LIMIT. This can greatly
     improve performance of ORDER BY LIMIT queries, especially when the
     LIMIT is small relative to the number of unrestricted output rows.
„}†9‰?releaselog/3_24_0.html3.24.0
 <a href="../lang_update.html">UPDATE</a> avoids unnecessary low-level disk writes when the contents
     of the database file do not actually change.
     For example, "UPDATE t1 SET x=25 WHERE y=?" generates no extra 
     disk I/O if the value in column x is already 25.  Similarly, 
     when doing <a href="../lang_update.html">UPDATE</a> on records that span multiple pages, only
     the subset of pages that actually change are written to disk.
     This is a low-level performance optimization only and does not
     affect the behavior of TRIGGERs or other higher level SQL
     structures.
C†9Mreleaselog/3_24_0.html3.24.0 Added the ".dbconfig" command.
X†9wreleaselog/3_24_0.html3.24.0 Added the --append option to the ".backup" command.
†9mreleaselog/3_24_0.html3.24.0
 Lines that begin with "#" and that are not in the middle of an
     SQL statement are interpreted as comments.
*†9‚releaselog/3_24_0.html3.24.0  Automatically intercepts the raw <a href="../eqp.html">EXPLAIN QUERY PLAN</a> 
     output and reformats it into an ASCII-art graph.
m†
9ƒreleaselog/3_24_0.html3.24. Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigresetdatabase">SQLITE_DBCONFIG_RESET_DATABASE</a> option to the
     <a href="../c3ref/db_config.html">sqlite3_db_config()</a> API.


5oî
ÁØlO
T       ?ŠuÖ5‡†)9releaselog/3_23_1.html3.23.1 Query optimizer enhancements:
<ol type="a">
  <li> Improve the <a href="../optoverview.html#omitnoopjoin">omit-left-join optimization</a> so that it works in cases where
       the right-hand table is UNIQUE but not necessarily NOT NULL.
  </li><li> Improve the <a href="../optoverview.html#pushdown">push-down optimization</a> so that it works for many LEFT JOINs.
  </li><li> Add the <a href="../optoverview.html#leftjoinreduction">LEFT JOIN strength reduction optimization</a> that converts a LEFT
       JOIN into an ordinary JOIN if there exist terms in the WHERE clause
       that would prevent the extra all-NULL row of the LEFT JOIN from
       appearing in the output set.
  </li><li> Avoid unnecessary writes to the sqlite_sequence table when an
       <a href="../autoinc.html">AUTOINCREMENT</a> table is updated with an rowid that is less than the
       maximum.
</li></ol>
†(9{releaselog/3_23_1.html3.23.1
 Added the <a href="https://sqlite.org/src/file/ext/misc/normalize.c">sqlite3_normalize()</a>
     extension function.
‚†'9ƒgreleaselog/3_23_1.html3.23.1  Enhance the <a href="../session/sqlite3changeset_apply.html">sqlite3changeset_apply()</a> interface so that it is hardened
     against attacks from deliberately corrupted <a href="../sessionintro.html#changeset">changeset</a> objects.
1†&9‚'releaselog/3_23_1.html3.23. Add support for INSERT OR REPLACE, INSERT OR IGNORE, and UPDATE OR REPLACE
     in the <a href="../zipfile.html">Zipfile virtual table</a>.
>†%9‚Areleaselog/3_23_1.html3.23.1 Added the -A command-line option to the <a href="../cli.html">CLI</a> to make it easier to manage
     <a href="../sqlar.html">SQLite Archive files</a>.
‚O†$9„creleaselog/3_23_1.html3.23.1 If the <a href="../vtab.html#xcolumn">xColumn</a> method in a <a href="../vtab.html">virtual table</a> implementation returns
     an error message using <a href="../c3ref/result_blob.html">sqlite3_result_error()</a> then give that error
     message preference over internally-generated messages.
w†#9ƒ3releaselog/3_23_1.html3.23.1 The "alternate-form-2" flag ("!") on the <a href="../printf.html">built-in printf</a> implementation
     now causes string substitutions to measure the width and precision in
     characters instead of bytes.
‚†"9ƒwreleaselog/3_23_1.html3.23.1 Added the <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuscachespill">SQLITE_DBSTATUS_CACHE_SPILL</a> option to <a href="../c3ref/db_status.html">sqlite3_db_status()</a> for
     reporting the number of cache spills that have occurred.
i†!9releaselog/3_23_1.html3.23.1 Support operators IS TRUE, IS FALSE, IS NOT TRUE, and IS NOT FALSE.
e† 9ƒreleaselog/3_23_1.html3.23.1 Recognize TRUE and FALSE as constants.  (For compatibility, if there
     exist columns named "true" or "false", then the identifiers refer to the
     columns rather than Boolean constants.)
‚)†9        „releaselog/3_23_1.html3.23.1 Add the <a href="../c3ref/serialize.html">sqlite3_serialize()</a> and <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> interfaces when
     the <a href="../compile.html#enable_deserialize">SQLITE_ENABLE_DESERIALIZE</a> compile-time option is used.
~†9Areleaselog/3_24_0.html3.24.0SHA3-256 for sqlite3.c: 0d384704e1c66026228336d1e91771d295bf688c9c44c7a44f25a4c16c26ab3c


†9_releaselog/3_24_0.html3.24.0SQLITE_SOURCE_ID: "2018-06-04 19:24:41 c7ee0833225bfd8c5ec2f9bf62b97c4e04d03bd9566366d5221ac8fb199a87ca"

qq“†*9¥[releaselog/3_23_1.html3.23.1 Bug fixes:
<ol type="a">
  <li> Fix the parser to accept valid <a href="../rowvalue.html">row value</a> syntax.
       Ticket <a href="https://www.sqlite.org/src/info/7310e2fb3d046a5">7310e2fb3d046a5</a>
  </li><li> Fix the query planner so that it takes into account dependencies in
       the arguments to table-valued functions in subexpressions in 
       the WHERE clause.
       Ticket <a href="https://www.sqlite.org/src/info/80177f0c226ff54">80177f0c226ff54</a>
  </li><li> Fix incorrect result with complex OR-connected WHERE and STAT4.
       Ticket <a href="https://www.sqlite.org/src/info/ec32177c99ccac2">ec32177c99ccac2</a>
  </li><li> Fix potential corruption in <a href="../expridx.html">indexes on expressions</a> due to automatic
       datatype conversions.
       Ticket <a href="https://www.sqlite.org/src/info/343634942dd54ab">343634942dd54ab</a>
  </li><li> Assertion fault in FTS4.
       Ticket <a href="https://www.sqlite.org/src/info/d6ec09eccf68cfc">d6ec09eccf68cfc</a>
  </li><li> Incorrect result on the less-than operator in <a href="../rowvalue.html">row values</a>.
       Ticket <a href="https://www.sqlite.org/src/info/f484b65f3d62305">f484b65f3d62305</a>
  </li><li> Always interpret non-zero floating-point values as TRUE, even if
       the integer part is zero.
       Ticket <a href="https://www.sqlite.org/src/info/36fae083b450e3a">36fae083b450e3a</a>
  </li><li> Fix an issue in the fsdir(PATH) <a href="../vtab.html#tabfunc2">table-valued function</a> to the
       <a href="https://sqlite.org/src/file/ext/misc/fileio.c">fileio.c</a> extension,
       that caused a segfault if the fsdir() table was used as the inner table
       of a join. Problem reported on the mailing list and fixed by check-in
       <a href="https://www.sqlite.org/src/info/7ce4e71c1b7251be">7ce4e71c1b7251be</a>
  </li><li> Issue an error rather instead of an assertion-fault or null-pointer
       dereference when the sqlite_master table is corrupted so that the
       sqlite_sequence table root page is really a btree-index page. Check-in
       <a href="https://www.sqlite.org/src/info/525deb7a67fbd647">525deb7a67fbd647</a>
  </li><li> Fix the <a href="../lang_analyze.html">ANALYZE</a> command so that it computes statistics on tables
       whose names begin with "sqlite".  Check-in
       <a href="https://sqlite.org/src/info/0249d9aecf69948d">0249d9aecf69948d</a>
</li></ol>

C®\ªáhtºkÚY,Ce†69ƒreleaselog/3_23_0.html3.23.0 Recognize TRUE and FALSE as constants.  (For compatibility, if there
     exist columns named "true" or "false", then the identifiers refer to the
     columns rather than Boolean constants.)
‚)†59        „releaselog/3_23_0.html3.23.0 Add the <a href="../c3ref/serialize.html">sqlite3_serialize()</a> and <a href="../c3ref/deserialize.html">sqlite3_deserialize()</a> interfaces when
     the <a href="../compile.html#enable_deserialize">SQLITE_ENABLE_DESERIALIZE</a> compile-time option is used.
~†49Areleaselog/3_23_1.html3.23.1  SHA3-256 for sqlite3.c: 65750d1e506f416a0b0b9dd22d171379679c733e3460549754dc68c92705b5dc


†39_releaselog/3_23_1.html3.23.SQLITE_SOURCE_ID: "2018-04-10 17:39:29 4bb2294022060e61de7da5c227a69ccd846ba330e31626ebcd59a94efd148b3b"
L†29_releaselog/3_23_1.html3.23.1 Performance enhancements in the parser.
6†19‚1releaselog/3_23_1.html3.23.1 Fix the <a href="../series.html">generate_series</a> virtual table so that it correctly returns
     no rows if any of its constraints are NULL.
p†09ƒ%releaselog/3_23_1.html3.23.1 Fix the <a href="https://sqlite.org/src/file/ext/misc/eval.c">eval.c</a> extension
     so that it works with <a href="../pragma.html#pragma_empty_result_callbacks">PRAGMA empty_result_callbacks=ON</a>.
v†/91releaselog/3_23_1.html3.23.1 Fix the <a href="../cli.html">CLI</a> so that it builds with -DSQLITE_UNTESTABLE
E†.9‚Oreleaselog/3_23_1.html3.23.1 Fix a harmless reference to an uninitialized virtual machine register.
     Ticket <a href="https://sqlite.org/src/info/093420fc0eb7cba7">093420fc0eb7cba7</a>.
.†-9‚!releaselog/3_23_1.html3.23.1 Fix misbehavior of the FTS5 xBestIndex method.  Ticket
     <a href="https://sqlite.org/src/info/2b8aed9f7c9e61e8">2b8aed9f7c9e61e8</a>.
‚N†,9        „creleaselog/3_23_1.html3.23.1 Fix two problems in the new <a href="../optoverview.html#leftjoinreduction">LEFT JOIN strength reduction optimization</a>.
     Tickets <a href="https://sqlite.org/src/info/1e39b966ae9ee739">1e39b966ae9ee739</a>
     and <a href="https://sqlite.org/src/info/fac496b61722daf2">fac496b61722daf2</a>.
ŽN†+9œareleaselog/3_23_1.html3.23.1
 Additional fixes for issues detected by
     <a href="https://github.com/google/oss-fuzz">OSSFuzz</a>:
<ol type="a">
  <li> Fix a possible infinite loop on VACUUM for corrupt database files.
       Check-in <a href="https://www.sqlite.org/src/info/27754b74ddf64">27754b74ddf64</a>
  </li><li> Disallow <a href="../lang_expr.html#varparam">parameters</a> in the <a href="../lang_with.html">WITH clause</a> of triggers and views.
       Check-in <a href="https://www.sqlite.org/src/info/b918d4b4e546d">b918d4b4e546d</a>
  </li><li> Fix a potential memory leak in <a href="../rowvalue.html">row value</a> processing.
       Check-in <a href="https://www.sqlite.org/src/info/2df6bbf1b8ca8">2df6bbf1b8ca8</a>
  </li><li> Improve the performance of the <a href="../lang_corefunc.html#replace">replace() SQL function</a> for cases where
       there are many substitutions on megabyte-sized strings, in an attempt
       to avoid OSSFuzz timeouts during testing.
       Check-in <a href="https://www.sqlite.org/src/info/fab2c2b07b5d3">fab2c2b07b5d3</a>
  </li><li> Provide an appropriate error message when the sqlite_master table
       contains a CREATE TABLE AS statement. Formerly this caused either an
       assertion fault or null pointer dereference.  Problem found by OSSFuzz
       on the GDAL project. Check-in
       <a href="https://www.sqlite.org/src/info/d75e67654aa96">d75e67654aa96</a>
  </li><li> Incorrect assert() statement removed. Check-in
       <a href="https://www.sqlite.org/src/info/823779d31eb09cda">823779d31eb09cda</a>.
  </li><li> Fix a problem with using the <a href="../optoverview.html#like_opt">LIKE optimization</a> on an
       <a href="../lang_createtable.html#rowid">INTEGER PRIMARY KEY</a>.  Check-in
       <a href="https://www.sqlite.org/src/info/b850dd159918af56">b850dd159918af56</a>.
</li></ol>

    ]”w
|)g
²       þ]‡†?9releaselog/3_23_0.html3.23.0 Query optimizer enhancements:
<ol type="a">
  <li> Improve the <a href="../optoverview.html#omitnoopjoin">omit-left-join optimization</a> so that it works in cases where
       the right-hand table is UNIQUE but not necessarily NOT NULL.
  </li><li> Improve the <a href="../optoverview.html#pushdown">push-down optimization</a> so that it works for many LEFT JOINs.
  </li><li> Add the <a href="../optoverview.html#leftjoinreduction">LEFT JOIN strength reduction optimization</a> that converts a LEFT
       JOIN into an ordinary JOIN if there exist terms in the WHERE clause
       that would prevent the extra all-NULL row of the LEFT JOIN from
       appearing in the output set.
  </li><li> Avoid unnecessary writes to the sqlite_sequence table when an
       <a href="../autoinc.html">AUTOINCREMENT</a> table is updated with an rowid that is less than the
       maximum.
</li></ol>
†>9{releaselog/3_23_0.html3.23.0
 Added the <a href="https://sqlite.org/src/file/ext/misc/normalize.c">sqlite3_normalize()</a>
     extension function.
‚†=9ƒgreleaselog/3_23_0.html3.23.0  Enhance the <a href="../session/sqlite3changeset_apply.html">sqlite3changeset_apply()</a> interface so that it is hardened
     against attacks from deliberately corrupted <a href="../sessionintro.html#changeset">changeset</a> objects.
1†<9‚'releaselog/3_23_0.html3.23. Add support for INSERT OR REPLACE, INSERT OR IGNORE, and UPDATE OR REPLACE
     in the <a href="../zipfile.html">Zipfile virtual table</a>.
>†;9‚Areleaselog/3_23_0.html3.23.0 Added the -A command-line option to the <a href="../cli.html">CLI</a> to make it easier to manage
     <a href="../sqlar.html">SQLite Archive files</a>.
‚O†:9„creleaselog/3_23_0.html3.23.0 If the <a href="../vtab.html#xcolumn">xColumn</a> method in a <a href="../vtab.html">virtual table</a> implementation returns
     an error message using <a href="../c3ref/result_blob.html">sqlite3_result_error()</a> then give that error
     message preference over internally-generated messages.
w†99ƒ3releaselog/3_23_0.html3.23.0 The "alternate-form-2" flag ("!") on the <a href="../printf.html">built-in printf</a> implementation
     now causes string substitutions to measure the width and precision in
     characters instead of bytes.
‚†89ƒwreleaselog/3_23_0.html3.23.0 Added the <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuscachespill">SQLITE_DBSTATUS_CACHE_SPILL</a> option to <a href="../c3ref/db_status.html">sqlite3_db_status()</a> for
     reporting the number of cache spills that have occurred.
i†79releaselog/3_23_0.html3.23.0 Support operators IS TRUE, IS FALSE, IS NOT TRUE, and IS NOT FALSE.

qq“†@9¥[releaselog/3_23_0.html3.23.0 Bug fixes:
<ol type="a">
  <li> Fix the parser to accept valid <a href="../rowvalue.html">row value</a> syntax.
       Ticket <a href="https://www.sqlite.org/src/info/7310e2fb3d046a5">7310e2fb3d046a5</a>
  </li><li> Fix the query planner so that it takes into account dependencies in
       the arguments to table-valued functions in subexpressions in 
       the WHERE clause.
       Ticket <a href="https://www.sqlite.org/src/info/80177f0c226ff54">80177f0c226ff54</a>
  </li><li> Fix incorrect result with complex OR-connected WHERE and STAT4.
       Ticket <a href="https://www.sqlite.org/src/info/ec32177c99ccac2">ec32177c99ccac2</a>
  </li><li> Fix potential corruption in <a href="../expridx.html">indexes on expressions</a> due to automatic
       datatype conversions.
       Ticket <a href="https://www.sqlite.org/src/info/343634942dd54ab">343634942dd54ab</a>
  </li><li> Assertion fault in FTS4.
       Ticket <a href="https://www.sqlite.org/src/info/d6ec09eccf68cfc">d6ec09eccf68cfc</a>
  </li><li> Incorrect result on the less-than operator in <a href="../rowvalue.html">row values</a>.
       Ticket <a href="https://www.sqlite.org/src/info/f484b65f3d62305">f484b65f3d62305</a>
  </li><li> Always interpret non-zero floating-point values as TRUE, even if
       the integer part is zero.
       Ticket <a href="https://www.sqlite.org/src/info/36fae083b450e3a">36fae083b450e3a</a>
  </li><li> Fix an issue in the fsdir(PATH) <a href="../vtab.html#tabfunc2">table-valued function</a> to the
       <a href="https://sqlite.org/src/file/ext/misc/fileio.c">fileio.c</a> extension,
       that caused a segfault if the fsdir() table was used as the inner table
       of a join. Problem reported on the mailing list and fixed by check-in
       <a href="https://www.sqlite.org/src/info/7ce4e71c1b7251be">7ce4e71c1b7251be</a>
  </li><li> Issue an error rather instead of an assertion-fault or null-pointer
       dereference when the sqlite_master table is corrupted so that the
       sqlite_sequence table root page is really a btree-index page. Check-in
       <a href="https://www.sqlite.org/src/info/525deb7a67fbd647">525deb7a67fbd647</a>
  </li><li> Fix the <a href="../lang_analyze.html">ANALYZE</a> command so that it computes statistics on tables
       whose names begin with "sqlite".  Check-in
       <a href="https://sqlite.org/src/info/0249d9aecf69948d">0249d9aecf69948d</a>
</li></ol>

    œëÔ$˜†I9Mreleaselog/3_22_0.html3.22.0 Added support for the <a href="../fts5.html#carrotq">"&#94;" initial token syntax</a> in FTS5.
~†H9Areleaselog/3_22_0.html3.22.0 Added the <a href="../c3ref/vtab_collation.html">sqlite3_vtab_collation()</a> interface.
‚†G9ƒSreleaselog/3_22_0.html3.22.0 Added the <a href="../c3ref/vtab_nochange.html">sqlite3_vtab_nochange()</a> and <a href="../c3ref/value_blob.html">sqlite3_value_nochange()</a> interfaces
     to help virtual table implementations optimize UPDATE operations.
,†F9‚releaselog/3_22_0.html3.22.0 Added the <a href="../rtree.html#rtreecheck">rtreecheck()</a> scalar SQL function to the <a href="../rtree.html">R-Tree extension</a>.
‚†E9ƒkreleaselog/3_22_0.html3.22.0 Add the ability to read from <a href="../wal.html">WAL mode</a> databases even if the application 
     lacks write permission on the database and its containing directory, as long as
     the -shm and -wal files exist in that directory.
-†D9        ‚!releaselog/3_22_0.html3.22.0 The output of <a href="../c3ref/trace_v2.html">sqlite3_trace_v2()</a> now shows each individual SQL statement
     run within a trigger.
~†C9Areleaselog/3_23_0.html3.23.0SHA3-256 for sqlite3.c: 4bed3dc2dc905ff55e2c21fd2725551fc0ca50912a9c96c6af712a4289cb24fa


†B9_releaselog/3_23_0.html3.23.0SQLITE_SOURCE_ID: "2018-04-02 11:04:16 736b53f57f70b23172c30880186dce7ad9baa3b74e3838cae5847cffb98f5cd2"
ŽN†A9œareleaselog/3_23_0.html3.23.0
 Additional fixes for issues detected by
     <a href="https://github.com/google/oss-fuzz">OSSFuzz</a>:
<ol type="a">
  <li> Fix a possible infinite loop on VACUUM for corrupt database files.
       Check-in <a href="https://www.sqlite.org/src/info/27754b74ddf64">27754b74ddf64</a>
  </li><li> Disallow <a href="../lang_expr.html#varparam">parameters</a> in the <a href="../lang_with.html">WITH clause</a> of triggers and views.
       Check-in <a href="https://www.sqlite.org/src/info/b918d4b4e546d">b918d4b4e546d</a>
  </li><li> Fix a potential memory leak in <a href="../rowvalue.html">row value</a> processing.
       Check-in <a href="https://www.sqlite.org/src/info/2df6bbf1b8ca8">2df6bbf1b8ca8</a>
  </li><li> Improve the performance of the <a href="../lang_corefunc.html#replace">replace() SQL function</a> for cases where
       there are many substitutions on megabyte-sized strings, in an attempt
       to avoid OSSFuzz timeouts during testing.
       Check-in <a href="https://www.sqlite.org/src/info/fab2c2b07b5d3">fab2c2b07b5d3</a>
  </li><li> Provide an appropriate error message when the sqlite_master table
       contains a CREATE TABLE AS statement. Formerly this caused either an
       assertion fault or null pointer dereference.  Problem found by OSSFuzz
       on the GDAL project. Check-in
       <a href="https://www.sqlite.org/src/info/d75e67654aa96">d75e67654aa96</a>
  </li><li> Incorrect assert() statement removed. Check-in
       <a href="https://www.sqlite.org/src/info/823779d31eb09cda">823779d31eb09cda</a>.
  </li><li> Fix a problem with using the <a href="../optoverview.html#like_opt">LIKE optimization</a> on an
       <a href="../lang_createtable.html#rowid">INTEGER PRIMARY KEY</a>.  Check-in
       <a href="https://www.sqlite.org/src/info/b850dd159918af56">b850dd159918af56</a>.
</li></ol>

ê™áês†N9ƒ+releaselog/3_22_0.html3.22.0 Enhance the <a href="../compile.html#enable_update_delete_limit">SQLITE_ENABLE_UPDATE_DELETE_LIMIT</a> compile-time option so
     that it works for <a href="../withoutrowid.html">WITHOUT ROWID</a> tables.
Š#†M9”releaselog/3_22_0.html3.22.0
 Improvements to the <a href="../cli.html">command-line shell</a>:
<ol type="a">
  <li> The ".schema" command shows the structure of virtual tables.
  </li><li> Added support for reading and writing
       <a href="../sqlar.html">SQLite Archive</a> files using
       the <a href="../cli.html#sqlar">.archive command</a>.
  </li><li> Added the experimental <a href="../cli.html#expert">.expert command</a>
  </li><li> Added the ".eqp trigger" variant of the ".eqp" command
  </li><li> Enhance the ".lint fkey-indexes" command so that it works with
       <a href="../withoutrowid.html">WITHOUT ROWID</a> tables.
  </li><li> If the filename argument to the shell is a ZIP archive rather than
       an SQLite database, then the shell automatically opens that ZIP 
       archive using the <a href="../zipfile.html">Zipfile virtual table</a>.
  </li><li> Added the <a href="../cli.html#editfunc">edit() SQL function</a>.
  </li><li> Added the <a href="../cli.html#exexcel*">.excel command</a> to simplify exporting
       database content to a spreadsheet.
  </li><li> Databases are opened using 
       <a href="https://sqlite.org/src/file/ext/misc/appendvfs.c">Append VFS</a> when
       the --append flag is used on the command line or with the
       .open command.
</li></ol>
ƒ
†L9…_releaselog/3_22_0.html3.22.0  Other performance optimizations:
<ol type="a">
  <li> A smaller and faster implementation of text to floating-point
       conversion subroutine: sqlite3AtoF().
  </li><li> The <a href="../lemon.html">Lemon parser generator</a> creates a faster parser.
  </li><li> Use the strcspn() C-library routine to speed up the LIKE and
       GLOB operators.
</li></ol>
†i†K9releaselog/3_22_0.html3.22. Query planner enhancements:
<ol type="a">
  <li> The optimization that uses an index to quickly compute an
       aggregate min() or max() is extended to work with
       <a href="../expridx.html">indexes on expressions</a>.
  </li><li> The decision of whether to implement a FROM-clause subquery
       as a co-routine or using <a href="../optoverview.html#flattening">query flattening</a>
       now considers whether
       the result set of the outer query is "complex" (if it
       contains functions or expression subqueries).  A complex result
       set biases the decision toward the use of co-routines.
  </li><li> The planner avoids query plans that use indexes with unknown
       collating functions.
  </li><li> The planner omits unused LEFT JOINs even if they are not the 
       right-most joins of a query.
</li></ol>
‡v†J91releaselog/3_22_0.html3.22.0 New extensions:
<ol type="a">
  <li> The <a href="../zipfile.html">Zipfile virtual table</a> can read and write a 
       <a href="https://en.wikipedia.org/wiki/Zip_(file_format)">ZIP Archive</a>.
  </li><li> Added the fsdir(PATH) <a href="../vtab.html#tabfunc2">table-valued function</a> to the
       <a href="https://sqlite.org/src/file/ext/misc/fileio.c">fileio.c</a> extension,
       for listing the files in a directory.
  </li><li> The <a href="https://sqlite.org/src/file/ext/misc/btreeinfo.c">sqlite_btreeinfo</a>
       eponymous virtual table for introspecting and estimating the sizes of
       the btrees in a database.
  </li><li> The <a href="https://sqlite.org/src/file/ext/misc/appendvfs.c">Append VFS</a> is a
       <a href="../vfs.html#shim">VFS shim</a> that allows an SQLite database to be appended to some other
       file.  This allows (for example) a database to be appended to an
       executable that then opens and reads the database.
</li></ol>

#£      Ý       ÊU¦õÃ>ã#<†Z9‚=releaselog/3_21_0.html3.21. Enhanced the <a href="../optoverview.html#like_opt">LIKE optimization</a> so that it works with an <a href="../lang_expr.html#like">ESCAPE</a> clause.
X†Y9wreleaselog/3_21_0.html3.21.0 Fewer "stat()" system calls issued by the unix VFS.
P†X9‚ereleaselog/3_21_0.html3.21.0 Improved de-quoting of column names for <a href="../lang_createtable.html#createtabas">CREATE TABLE AS</a> statements with
     an aggregate query on the right-hand side.
ƒ-†W9†releaselog/3_21_0.html3.21.0 The <a href="../c3ref/libversion.html">sqlite3_sourceid()</a> function tries to detect if the source code has
     been modified from what is checked into version control and if there are
     modifications, the last four characters of the version hash are shown as
     "alt1" or "alt2".  The objective is to detect accidental and/or careless
     edits.  A forger can subvert this feature.
‚.†V9„!releaselog/3_21_0.html3.21.0 The "fsync()" that occurs after the header is written in a WAL reset
     now uses the sync settings for checkpoints.  This means it will use a
     "fullfsync" on macs if <a href="../pragma.html#pragma_checkpoint_fullfsync">PRAGMA checkpoint_fullfsync</a> set on.
-†U9‚releaselog/3_21_0.html3.21.0 Allow <a href="../vtab.html#worid">WITHOUT ROWID virtual tables</a> to be writable if the PRIMARY KEY
     contains exactly one column.
+†T9‚releaselog/3_21_0.html3.21.0 Allow <a href="../lang_attach.html">ATTACH</a> and <a href="../lang_detach.html">DETACH</a> commands to work inside of a transaction.
‚q†S9        …)releaselog/3_21_0.html3.21.0 Take advantage of the atomic-write capabilities in the 
     <a href="https://en.wikipedia.org/wiki/F2FS">F2FS filesystem</a> when available, for
     greatly reduced transaction overhead.  This currently requires the
     <a href="../compile.html#enable_batch_atomic_write">SQLITE_ENABLE_BATCH_ATOMIC_WRITE</a> compile-time option.
†R9Creleaselog/3_22_0.html3.22.0SHA3-256 for sqlite3.c: 206df47ebc49cd1710ac0dd716ce5de5854826536993f4feab7a49d136b85069



†Q9_releaselog/3_22_0.html3.22.0SQLITE_SOURCE_ID: "2018-01-22 18:45:57 0c55d179733b46d8d0ba4d88e01a25e10677046ee3da1d5b1581e86726f2171d"
‰B†P9’Ireleaselog/3_22_0.html3.22.0
 Bug fixes:
<ol type="a">
  <li> Infinite loop on an UPDATE that uses an OR operator in the WHERE clause.
       Problem introduced with 3.17.0 and reported on the mailing list about
       one year later.  Ticket
       <a href="https://www.sqlite.org/src/info/47b2581aa9bfecec">47b2581aa9bfecec</a>.
  </li><li> Incorrect query results when the skip-ahead-distinct optimization is
       used.
       Ticket <a href="https://sqlite.org/src/info/ef9318757b152e3a">ef9318757b152e3a</a>.
  </li><li> Incorrect query results on a join with a ORDER BY DESC.  Ticket
       <a href="https://sqlite.org/src/info/123c9ba32130a6c9">123c9ba32130a6c9</a>.
  </li><li> Inconsistent result set column names between CREATE TABLE AS
       and a simple SELECT.  Ticket
       <a href="https://sqlite.org/src/info/3b4450072511e621">3b4450072511e621</a>
  </li><li> Assertion fault when doing REPLACE on an index on an expression.
       Ticket <a href="https://sqlite.org/src/info/dc3f932f5a147771">dc3f932f5a147771</a>
  </li><li> Assertion fault when doing an IN operator on a constant index.
       Ticket <a href="https://sqlite.org/src/info/aa98619ad08ddcab">aa98619ad08ddcab</a>
</li></ol>
‚Y†O9„wreleaselog/3_22_0.html3.22.0 Provide the <a href="../lang_corefunc.html#sqlite_offset">sqlite_offset(X)</a> SQL function that returns
     the byte offset into the database file to the beginning of the record
     holding value X, when compiling with <a href="../compile.html#enable_offset_sql_func">-DSQLITE_ENABLE_OFFSET_SQL_FUNC</a>.

ž>àY
       EŸãH+ž  †e9Wreleaselog/3_21_0.html3.21.0 Miscellaneous <a href="../cpu.html#microopt">microoptimizations</a> reduce CPU usage by about 2.1%.
‚†d9ƒwreleaselog/3_21_0.html3.21.0 The <a href="https://sqlite.org/src/finfo?name=src/shell.c">src/shell.c</a> source code
     to the <a href="../cli.html">command-line shell</a> is no longer under version control.  That file
     is now generated as part of the build process.
†c9sreleaselog/3_21_0.html3.21.0 Remove a call to rand_s() in the Windows VFS since it was causing problems
     in Firefox on some older laptops.
8†b9‚5releaselog/3_21_0.html3.21.0 Add a new type of fts5vocab virtual table - "instance" - that provides
     direct access to an FTS5 full-text index at the lowest possible level.
ƒ"†a9†      releaselog/3_21_0.html3.21.0 Added the 
     <a href="https://sqlite.org/src/file/src/dbpage.c">sqlite_dbpage virtual table</a>
     for providing direct access to pages
     of the database file.  The source code is built into the <a href="../amalgamation.html">amalgamation</a> and
     is activated using the <a href="../compile.html#enable_dbpage_vtab">-DSQLITE_ENABLE_DBPAGE_VTAB</a> compile-time option.
;†`9‚;releaselog/3_21_0.html3.21.0 Added the
     <a href="https://sqlite.org/src/file/ext/misc/unionvtab.c">swarm virtual table</a>
     to the existing union virtual table extension.
‚Q†_9„greleaselog/3_21_0.html3.21.0
 Remove the rarely-used "scratch" memory allocator.  Replace it with the
     <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigsmallmalloc">SQLITE_CONFIG_SMALL_MALLOC</a> configuration setting that gives SQLite
     a hint that large memory allocations should be avoided when possible.
8†^9‚5releaselog/3_21_0.html3.21.0 Enhanced the <a href="../csv.html">CSV virtual table</a> so that it accepts the last row of
     input if the final new-line character is missing.
G†]9‚Sreleaselog/3_21_0.html3.21.0 Pass information about !=, IS, IS NOT, NOT NULL, and IS NULL constraints
     into the <a href="../vtab.html#xbestindex">xBestIndex</a> method of virtual tables.
‚Z†\9„yreleaselog/3_21_0.html3.21.0
 The query planner now prefers to implement FROM-clause subqueries using
     <a href="../optoverview.html#coroutines">co-routines</a> rather using the <a href="../optoverview.html#flattening">query flattener</a> optimization.  Support for
     the use of co-routines for subqueries may no longer be disabled.
ƒ>†[9†Areleaselog/3_21_0.html3.21.0  Enhanced <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> and <a href="../pragma.html#pragma_quick_check">PRAGMA quick_check</a> to detect obscure
     row corruption that they were formerly missing.  Also update both pragmas
     so that they return error text rather than SQLITE_CORRUPT when encountering
     corruption in <a href="../fileformat2.html#record_format">records</a>.

    Ó„]ó½KDÓn†n9!releaselog/3_20_1.html3.20.1 Added the <a href="../unionvtab.html">UNION virtual table</a> extension.
‚†m9ƒKreleaselog/3_20_1.html3.20.1 Added the <a href="../completion.html">COMPLETION extension</a> - designed to suggest
     tab-completions for interactive user interfaces.  This is a work in progress.
     Expect further enhancements in future releases.
o†l9#releaselog/3_20_1.html3.20.1 Added the <a href="../stmt.html">SQLITE_STMT virtual table</a> extension.
†2†k9Œ)releaselog/3_20_1.html3.20.1 Backwards-incompatible changes to some extensions in order to take 
     advantage of the improved security offered by the new 
     <a href="../bindptr.html">pointer passing interfaces</a>:
     <ol type="a">
     <li> <a href="../fts5.html#extending_fts5">Extending FTS5</a> &rarr; requires <a href="../c3ref/bind_blob.html">sqlite3_bind_pointer()</a> to find
          the fts5_api pointer.
     </li><li> <a href="../carray.html">carray(PTR,N)</a> &rarr; requires <a href="../c3ref/bind_blob.html">sqlite3_bind_pointer()</a> to set the PTR parameter.
     </li><li> <a href="https://www.sqlite.org/src/file/ext/misc/remember.c">remember(V,PTR)</a>
          &rarr; requires <a href="../c3ref/bind_blob.html">sqlite3_bind_pointer()</a> to set the PTR parameter.
     </li></ol>
g†j9releaselog/3_20_1.html3.20.1 Add new <a href="../bindptr.html">pointer passing interfaces</a>.
"†i9        ‚releaselog/3_20_1.html3.20.1 Update the text of error messages returned by <a href="../c3ref/errcode.html">sqlite3_errmsg()</a> for some
     error codes.
~†h9Areleaselog/3_21_0.html3.21.0SHA3-256 for sqlite3.c: 84c181c0283d0320f488357fc8aab51898370c157601459ebee49d779036fe03


†g9_releaselog/3_21_0.html3.21.0SQLITE_SOURCE_ID: "2017-10-24 18:55:49 1a584e499906b5c87ec7d43d4abce641fdf017c42125b083109bc77c4de48827"
g†f9Ÿreleaselog/3_21_0.html3.21.0 Bug fixes:
<ol type="a">
  <li> Fix a faulty assert() statement discovered by OSSFuzz.
       Ticket <a href="https://sqlite.org/src/info/cb91bf4290c211d">cb91bf4290c211d</a>
  </li><li> Fix an obscure memory leak in <a href="../c3ref/result_blob.html">sqlite3_result_pointer()</a>.
       Ticket <a href="https://sqlite.org/src/info/7486aa54b968e9b">7486aa54b968e9b</a>
  </li><li> Avoid a possible use-after-free error by deferring schema resets until
       after the query planner has finished running.
       Ticket <a href="https://sqlite.org/src/info/be436a7f4587ce5">be436a7f4587ce5</a>
  </li><li> Only use indexes-on-expressions to optimize ORDER BY or GROUP BY if
       the COLLATE is correct.
       Ticket <a href="https://sqlite.org/src/info/e20dd54ab0e4383">e20dd54ab0e4383</a>
  </li><li> Fix an assertion fault that was coming up when the expression in an
       index-on-expressions is really a constant.
       Ticket <a href="https://sqlite.org/src/info/aa98619ad08ddca">aa98619ad08ddca</a>
  </li><li> Fix an assertion fault that could occur following
       <a href="../pragma.html#pragma_reverse_unordered_selects">PRAGMA reverse_unordered_selects</a>.
       Ticket <a href="https://sqlite.org/src/info/cb91bf4290c211d">cb91bf4290c211d</a>
  </li><li> Fix a segfault that can occur for queries that use table-valued functions
       in an IN or EXISTS subquery.
       Ticket <a href="https://sqlite.org/src/info/b899b6042f97f5">b899b6042f97f5</a>
  </li><li> Fix a potential integer overflow problem when compiling a particular
       horrendous common table expression.  This was another problem discovered
       by OSSFuzz.  Check-in <a href="https://sqlite.org/src/info/6ee8cb6ae5">6ee8cb6ae5</a>.
  </li><li> Fix a potential out-of-bound read when querying a corrupt database file,
       a problem detected by Natalie Silvanovich of Google Project Zero.
       Check-in <a href="https://sqlite.org/src/info/04925dee41a21f">04925dee41a21f</a>.
</li></ol>

®
ù
f  Àý®ˆK†t9[releaselog/3_20_1.html3.20.1 Query planner enhancements:
<ol type="a">
  <li> When generating individual loops for each ORed term of an OR scan,
       move any constant WHERE expressions outside of the loop, as is 
       done for top-level loops.
  </li><li> The query planner examines the values of bound parameters to help
       determine if a partial index is usable.
  </li><li> When deciding between two plans with the same estimated cost, bias 
       the selection toward the one that does not use the sorter.
  </li><li> Evaluate WHERE clause constraints involving correlated subqueries
       last, in the hope that they never have be evaluated at all.
  </li><li> Do not use the <a href="../optoverview.html#flattening">flattening optimization</a> for a sub-query on the RHS 
       of a LEFT JOIN if that subquery reads data from a <a href="../vtab.html">virtual table</a> as
       doing so prevents the query planner from creating <a href="../optoverview.html#autoindex">automatic indexes</a>
       on the results of the sub-query, which can slow down the query.
</li></ol>
‡?†s9ŽCreleaselog/3_20_1.html3.20.1 Enhancements to the <a href="../cli.html">command-line shell</a>:
<ol type="a">
  <li> Add support for tab-completion using the <a href="../completion.html">COMPLETION extension</a>, for
       both readline and linenoise.
  </li><li> Add the ".cd" command.
  </li><li> Enhance the "<a href="../cli.html#dschema">.schema</a>" command to show the schema of all attached
       databases.
  </li><li> Enhance "<a href="../cli.html#dtables">.tables</a>" so that it shows the schema names for all attached
       if the name is anything other than "main".
  </li><li> The "<a href="../cli.html#csv">.import</a>" command ignores an initial UTF-8 BOM.
  </li><li> Added the "--newlines" option to the "<a href="../cli.html#dump">.dump</a>" command to cause U+000a and
       U+000d characters to be output literally rather than escaped using the
       <a href="../lang_corefunc.html#replace">replace()</a> function.
</li></ol>
ƒ"†r9†      releaselog/3_20_1.html3.20.1
 Added the <a href="../pragma.html#pragma_secure_delete">PRAGMA secure_delete=FAST</a> command.  When secure_delete is
     set to FAST, old content is overwritten with zeros as long as that does
     not increase the amount of I/O.  Deleted content might still persist on
     the <a href="../fileformat2.html#freelist">free-page list</a> but will be purged from all b-tree pages.
ƒ-†q9†releaselog/3_20_1.html3.20.1  Provide the <a href="../c3ref/c_prepare_normalize.html#sqlitepreparepersistent">SQLITE_PREPARE_PERSISTENT</a> flag for <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a> and
     use it to limit <a href="../malloc.html#lookaside">lookaside memory</a> misuse by <a href="../fts3.html">FTS3</a>, <a href="../fts5.html">FTS5</a>, and the
     <a href="../rtree.html">R-Tree extension</a>.
^†p9ƒreleaselog/3_20_1.html3.20. Added the <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a> and <a href="../c3ref/prepare.html">sqlite3_prepare16_v3()</a> interfaces
     with the extra "prepFlags" parameters.
„†o9‡Kreleaselog/3_20_1.html3.20.1 The built-in <a href="../lang_datefunc.html">date and time functions</a> have been enhanced so that they can be
     used in <a href="../lang_createtable.html#ckconst">CHECK constraints</a>, in <a href="../expridx.html">indexes on expressions</a>, and in the WHERE clauses
     of <a href="../partialindex.html">partial indexes</a>, provided that they do not use the 'now', 'localtime', or
     'utc' keywords.  <a href="../deterministic.html#dtexception">More information</a>.

’Dê]œ        Õ       I”0ã—˜¤’~‡9Areleaselog/3_20_1.html3.20.1SHA3-256 for sqlite3.c: 93b1a6d69b48dc39697d1d3a1e4c30b55da0bdd2cad0c054462f91081832954a


‡9_releaselog/3_20_1.html3.20.1SQLITE_SOURCE_ID: "2017-08-24 16:21:36 8d3a7ea6c5690d6b7c3767558f4f01b511c55463e3f9e64506801fe9b74dce34"
p‡9        ƒ'releaselog/3_20_1.html3.20.1 Fix a potential memory leak in the new <a href="../c3ref/result_blob.html">sqlite3_result_pointer()</a> interface.
     Ticket <a href="https://sqlite.org/src/info/7486aa54b968e9b5">7486aa54b968e9b5</a>.
{†9ƒ;releaselog/3_20_1.html3.20.1 Fix a bug (discovered by OSSFuzz) that causes an assertion fault if certain
     dodgy CREATE TABLE declarations are used.  Ticket
     <a href="https://sqlite.org/src/info/bc115541132dad136">bc115541132dad136</a>
‚H†~9„Ureleaselog/3_20_1.html3.20.1 Fix rare false-positives in <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> when run on a database connection
     with <a href="../lang_attach.html">attached databases</a>. Ticket
     <a href="https://sqlite.org/src/info/a4e06e75a9ab61a12">a4e06e75a9ab61a12</a>
‚I†}9„Wreleaselog/3_20_1.html3.20.1 Ensure that the query planner knows that any column of a 
     <a href="../optoverview.html#flattening">flattened</a> LEFT JOIN can be NULL even 
     if that column is labeled with "NOT NULL". Fix for ticket 
     <a href="https://sqlite.org/src/info/892fc34f173e99d8">892fc34f173e99d8</a>.
‚`†|9…releaselog/3_20_1.html3.20.1 Fix the query planner so that it knows not to use <a href="../optoverview.html#autoindex">automatic indexes</a>
     on the right table of LEFT JOIN if the WHERE clause uses the <a href="../lang_expr.html#isisnot">IS operator</a>.
     Fix for <a href="https://sqlite.org/src/info/ce68383bf6aba">ce68383bf6aba</a>.
ƒ1†{9†'releaselog/3_20_1.html3.20.1 Fix the behavior of <a href="../c3ref/column_name.html">sqlite3_column_name()</a> for queries that use the
     <a href="../optoverview.html#flattening">flattening optimization</a> so that the result is consistent with other
     queries that do not use that optimization, and with PostgreSQL, MySQL,
     and SQLServer.  Ticket <a href="https://sqlite.org/src/info/de3403bf5ae">de3403bf5ae</a>.
†z9Ureleaselog/3_20_1.html3.20.1 Miscellaneous optimizations result in a 2% reduction in <a href="../cpu.html">CPU cycles used</a>.
ƒC†y9†Kreleaselog/3_20_1.html3.20.1 The <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableqpsg">SQLITE_DBCONFIG_ENABLE_QPSG</a> run-time option and the
     <a href="../compile.html#enable_qpsg">SQLITE_ENABLE_QPSG</a> compile-time option enable the
     <a href="../queryplanner-ng.html#qpstab">query planner stability guarantee</a>.  See also ticket
     <a href="https://www.sqlite.org/src/info/892fc34f173e99d8">892fc34f173e99d8</a>
=†x9‚?releaselog/3_20_1.html3.20.1 Enhance the <a href="../sqlanalyze.html">sqlite3_analyzer.exe</a> utility program so that it shows
     the number of bytes of metadata on btree pages.
       †w9Wreleaselog/3_20_1.html3.20.1 Add the -withoutnulls option to the <a href="../tclsqlite.html#eval">TCL interface eval method</a>.
‚V†v9„qreleaselog/3_20_1.html3.20.1 Provide <a href="../pragma.html#pragfunc">PRAGMA functions</a> for
     <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a>, <a href="../pragma.html#pragma_quick_check">PRAGMA quick_check</a>, and
     <a href="../pragma.html#pragma_foreign_key_check">PRAGMA foreign_key_check</a>.
ƒ8†u9†5releaselog/3_20_1.html3.20.1
 Add <a href="../c3ref/c_stmtstatus_counter.html#sqlitestmtstatusreprepare">SQLITE_STMTSTATUS_REPREPARE</a>, <a href="../c3ref/c_stmtstatus_counter.html#sqlitestmtstatusrun">SQLITE_STMTSTATUS_RUN</a>, 
     and <a href="../c3ref/c_stmtstatus_counter.html#sqlitestmtstatusmemused">SQLITE_STMTSTATUS_MEMUSED</a> options for the
     <a href="../c3ref/stmt_status.html">sqlite3_stmt_status()</a> interface.


ZðºH
A       ÐÉç6ƒ"‡9†        releaselog/3_20_0.html3.20.0
 Added the <a href="../pragma.html#pragma_secure_delete">PRAGMA secure_delete=FAST</a> command.  When secure_delete is
     set to FAST, old content is overwritten with zeros as long as that does
     not increase the amount of I/O.  Deleted content might still persist on
     the <a href="../fileformat2.html#freelist">free-page list</a> but will be purged from all b-tree pages.
ƒ-‡9†releaselog/3_20_0.html3.20.0  Provide the <a href="../c3ref/c_prepare_normalize.html#sqlitepreparepersistent">SQLITE_PREPARE_PERSISTENT</a> flag for <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a> and
     use it to limit <a href="../malloc.html#lookaside">lookaside memory</a> misuse by <a href="../fts3.html">FTS3</a>, <a href="../fts5.html">FTS5</a>, and the
     <a href="../rtree.html">R-Tree extension</a>.
^‡
9ƒreleaselog/3_20_0.html3.20. Added the <a href="../c3ref/prepare.html">sqlite3_prepare_v3()</a> and <a href="../c3ref/prepare.html">sqlite3_prepare16_v3()</a> interfaces
     with the extra "prepFlags" parameters.
„‡     9‡Kreleaselog/3_20_0.html3.20.0 The built-in <a href="../lang_datefunc.html">date and time functions</a> have been enhanced so that they can be
     used in <a href="../lang_createtable.html#ckconst">CHECK constraints</a>, in <a href="../expridx.html">indexes on expressions</a>, and in the WHERE clauses
     of <a href="../partialindex.html">partial indexes</a>, provided that they do not use the 'now', 'localtime', or
     'utc' keywords.  <a href="../deterministic.html#dtexception">More information</a>.
n9!releaselog/3_20_0.html3.20.0 Added the <a href="../unionvtab.html">UNION virtual table</a> extension.
‚‡9ƒKreleaselog/3_20_0.html3.20.0 Added the <a href="../completion.html">COMPLETION extension</a> - designed to suggest
     tab-completions for interactive user interfaces.  This is a work in progress.
     Expect further enhancements in future releases.
o‡9#releaselog/3_20_0.html3.20.0 Added the <a href="../stmt.html">SQLITE_STMT virtual table</a> extension.
†2‡9Œ)releaselog/3_20_0.html3.20.0 Backwards-incompatible changes to some extensions in order to take 
     advantage of the improved security offered by the new 
     <a href="../bindptr.html">pointer passing interfaces</a>:
     <ol type="a">
     <li> <a href="../fts5.html#extending_fts5">Extending FTS5</a> &rarr; requires <a href="../c3ref/bind_blob.html">sqlite3_bind_pointer()</a> to find
          the fts5_api pointer.
     </li><li> <a href="../carray.html">carray(PTR,N)</a> &rarr; requires <a href="../c3ref/bind_blob.html">sqlite3_bind_pointer()</a> to set the PTR parameter.
     </li><li> <a href="https://www.sqlite.org/src/file/ext/misc/remember.c">remember(V,PTR)</a>
          &rarr; requires <a href="../c3ref/bind_blob.html">sqlite3_bind_pointer()</a> to set the PTR parameter.
     </li></ol>
g‡9releaselog/3_20_0.html3.20.0 Add new <a href="../bindptr.html">pointer passing interfaces</a>.
"‡9        ‚releaselog/3_20_0.html3.20.0 Update the text of error messages returned by <a href="../c3ref/errcode.html">sqlite3_errmsg()</a> for some
     error codes.

7=î2ØKŠÃ7‡9Ureleaselog/3_20_0.html3.20.0 Miscellaneous optimizations result in a 2% reduction in <a href="../cpu.html">CPU cycles used</a>.
ƒC‡9†Kreleaselog/3_20_0.html3.20.0 The <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableqpsg">SQLITE_DBCONFIG_ENABLE_QPSG</a> run-time option and the
     <a href="../compile.html#enable_qpsg">SQLITE_ENABLE_QPSG</a> compile-time option enable the
     <a href="../queryplanner-ng.html#qpstab">query planner stability guarantee</a>.  See also ticket
     <a href="https://www.sqlite.org/src/info/892fc34f173e99d8">892fc34f173e99d8</a>
=‡9‚?releaselog/3_20_0.html3.20.0 Enhance the <a href="../sqlanalyze.html">sqlite3_analyzer.exe</a> utility program so that it shows
     the number of bytes of metadata on btree pages.
       ‡9Wreleaselog/3_20_0.html3.20.0 Add the -withoutnulls option to the <a href="../tclsqlite.html#eval">TCL interface eval method</a>.
‚V‡9„qreleaselog/3_20_0.html3.20.0 Provide <a href="../pragma.html#pragfunc">PRAGMA functions</a> for
     <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a>, <a href="../pragma.html#pragma_quick_check">PRAGMA quick_check</a>, and
     <a href="../pragma.html#pragma_foreign_key_check">PRAGMA foreign_key_check</a>.
ƒ8‡9†5releaselog/3_20_0.html3.20.0
 Add <a href="../c3ref/c_stmtstatus_counter.html#sqlitestmtstatusreprepare">SQLITE_STMTSTATUS_REPREPARE</a>, <a href="../c3ref/c_stmtstatus_counter.html#sqlitestmtstatusrun">SQLITE_STMTSTATUS_RUN</a>, 
     and <a href="../c3ref/c_stmtstatus_counter.html#sqlitestmtstatusmemused">SQLITE_STMTSTATUS_MEMUSED</a> options for the
     <a href="../c3ref/stmt_status.html">sqlite3_stmt_status()</a> interface.
ˆK‡9[releaselog/3_20_0.html3.20.0 Query planner enhancements:
<ol type="a">
  <li> When generating individual loops for each ORed term of an OR scan,
       move any constant WHERE expressions outside of the loop, as is 
       done for top-level loops.
  </li><li> The query planner examines the values of bound parameters to help
       determine if a partial index is usable.
  </li><li> When deciding between two plans with the same estimated cost, bias 
       the selection toward the one that does not use the sorter.
  </li><li> Evaluate WHERE clause constraints involving correlated subqueries
       last, in the hope that they never have be evaluated at all.
  </li><li> Do not use the <a href="../optoverview.html#flattening">flattening optimization</a> for a sub-query on the RHS 
       of a LEFT JOIN if that subquery reads data from a <a href="../vtab.html">virtual table</a> as
       doing so prevents the query planner from creating <a href="../optoverview.html#autoindex">automatic indexes</a>
       on the results of the sub-query, which can slow down the query.
</li></ol>
‡?‡
9ŽCreleaselog/3_20_0.html3.20.0 Enhancements to the <a href="../cli.html">command-line shell</a>:
<ol type="a">
  <li> Add support for tab-completion using the <a href="../completion.html">COMPLETION extension</a>, for
       both readline and linenoise.
  </li><li> Add the ".cd" command.
  </li><li> Enhance the "<a href="../cli.html#dschema">.schema</a>" command to show the schema of all attached
       databases.
  </li><li> Enhance "<a href="../cli.html#dtables">.tables</a>" so that it shows the schema names for all attached
       if the name is anything other than "main".
  </li><li> The "<a href="../cli.html#csv">.import</a>" command ignores an initial UTF-8 BOM.
  </li><li> Added the "--newlines" option to the "<a href="../cli.html#dump">.dump</a>" command to cause U+000a and
       U+000d characters to be output literally rather than escaped using the
       <a href="../lang_corefunc.html#replace">replace()</a> function.
</li></ol>

œKçš
N       =-c-y–ç*œ
‡$9Yreleaselog/3_19_3.html3.19.3    Reuse the same materialization of a VIEW if that VIEW appears more than
     once in the same query.
9‡#9‚7releaselog/3_19_3.html3.19. Transfer any terms of the HAVING clause that use only columns mentioned in
     the GROUP BY clause over to the WHERE clause for faster processing.
+‡"9‚releaselog/3_19_3.html3.19.3 Avoid unnecessary invalidation of <a href="../c3ref/blob.html">sqlite3_blob</a> handles when making
     changes to unrelated tables.
_‡!9ƒreleaselog/3_19_3.html3.19.3 On a DISTINCT query that uses an index, try to skip ahead to the next distinct
     entry using the index rather than stepping through rows, when an appropriate
     index is available.
0‡ 9‚%releaselog/3_19_3.html3.19.3 Avoid unnecessary foreign key processing in UPDATE statements that do not
     touch the columns that are constrained by the foreign keys.
‚2‡9„)releaselog/3_19_3.html3.19.3 Use <a href="../lang_corefunc.html#replace">replace()</a> instead of <a href="../lang_corefunc.html#char">char()</a> for escaping newline and carriage-return
     characters embedded in strings in the .dump output from the <a href="../cli.html">command-line shell</a>.
F‡9‚Qreleaselog/3_19_3.html3.19.3 Enhance the <a href="../optoverview.html#flattening">flattening optimization</a> so that it is able to flatten views
     on the right-hand side of a LEFT JOIN.
[‡9‚{releaselog/3_19_3.html3.19.3 When using an index on an expression, try to use expression values already
     available in the index, rather than loading the original columns and recomputing
     the expression.
‚-‡9        „!releaselog/3_19_3.html3.19.3 The <a href="../c3ref/c_alter_table.html">SQLITE_READ</a> <a href="../c3ref/set_authorizer.html">authorizer callback</a> is invoked once
     with a column name that is an empty string
     for every table referenced in a query from which no columns are extracted.
~‡9Areleaselog/3_20_0.html3.20.0SHA3-256 for sqlite3.c: 79b7f3b977360456350219cba0ba0e5eb55910565eab68ea83edda2f968ebe95


‡9_releaselog/3_20_0.html3.20.0SQLITE_SOURCE_ID: "2017-08-01 13:24:15 9501e22dfeebdcefa783575e47c60b514d7c2e0cad73b2a496c0bc4b680900a8"
{‡9ƒ;releaselog/3_20_0.html3.20.0 Fix a bug (discovered by OSSFuzz) that causes an assertion fault if certain
     dodgy CREATE TABLE declarations are used.  Ticket
     <a href="https://sqlite.org/src/info/bc115541132dad136">bc115541132dad136</a>
‚H‡9„Ureleaselog/3_20_0.html3.20.0 Fix rare false-positives in <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> when run on a database connection
     with <a href="../lang_attach.html">attached databases</a>. Ticket
     <a href="https://sqlite.org/src/info/a4e06e75a9ab61a12">a4e06e75a9ab61a12</a>
‚I‡9„Wreleaselog/3_20_0.html3.20.0 Ensure that the query planner knows that any column of a 
     <a href="../optoverview.html#flattening">flattened</a> LEFT JOIN can be NULL even 
     if that column is labeled with "NOT NULL". Fix for ticket 
     <a href="https://sqlite.org/src/info/892fc34f173e99d8">892fc34f173e99d8</a>.
‚`‡9…releaselog/3_20_0.html3.20.0 Fix the query planner so that it knows not to use <a href="../optoverview.html#autoindex">automatic indexes</a>
     on the right table of LEFT JOIN if the WHERE clause uses the <a href="../lang_expr.html#isisnot">IS operator</a>.
     Fix for <a href="https://sqlite.org/src/info/ce68383bf6aba">ce68383bf6aba</a>.
ƒ1‡9†'releaselog/3_20_0.html3.20.0 Fix the behavior of <a href="../c3ref/column_name.html">sqlite3_column_name()</a> for queries that use the
     <a href="../optoverview.html#flattening">flattening optimization</a> so that the result is consistent with other
     queries that do not use that optimization, and with PostgreSQL, MySQL,
     and SQLServer.  Ticket <a href="https://sqlite.org/src/info/de3403bf5ae">de3403bf5ae</a>.

¼/

È       Bv]}Î=¼~‡59Areleaselog/3_19_3.html3.19.3SHA3-256 for sqlite3.c: 368f1d31272b1739f804bcfa5485e5de62678015c4adbe575003ded85c164bb8


‡49_releaselog/3_19_3.html3.19.3SQLITE_SOURCE_ID: "2017-06-08 14:26:16 0ee482a1e0eae22e08edc8978c9733a96603d4509645f348ebf55b579e89636b"
‚K‡39        „]releaselog/3_19_3.html3.19.3Fix a bug associated with <a href="../pragma.html#pragma_auto_vacuum">auto_vacuum</a> that can lead to database
    corruption.  The bug was introduced in <a href="../releaselog/3_16_0.html">version 3.16.0</a> (2017-01-02).
    Ticket <a href="https://sqlite.org/src/info/fda22108">fda22108</a>.
d‡29        ƒreleaselog/3_19_3.html3.19.3Fix more bugs in the LEFT JOIN <a href="../optoverview.html#flattening">flattening optimization</a>. Ticket
    <a href="https://www.sqlite.org/src/info/7fde638e94287d2c">7fde638e94287d2c</a>.
u‡19/releaselog/3_19_3.html3.19.3Remove a surplus semicolon that was causing problems for older versions of MSVC.
\‡09        ‚releaselog/3_19_3.html3.19.3Fix a bug in the LEFT JOIN <a href="../optoverview.html#flattening">flattening optimization</a>. Ticket
    <a href="https://www.sqlite.org/src/info/cad1ab4cb7b0fc">cad1ab4cb7b0fc</a>.
‚‡/9ƒoreleaselog/3_19_3.html3.19.3 Limit the depth of recursion for JSON objects and arrays in order to avoid
     excess stack usage in the recursive descent parser.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/981329adeef51011052">981329adeef51011052</a>.
H‡.9‚Ureleaselog/3_19_3.html3.19.3 Disallow control characters inside of strings in JSON.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/6c9b5514077fed34551">6c9b5514077fed34551</a>.
F‡-9‚Qreleaselog/3_19_3.html3.19.3 Disallow leading zeros in numeric constants in JSON.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/b93be8729a895a528e2">b93be8729a895a528e2</a>.
Y‡,9‚wreleaselog/3_19_3.html3.19.3 Fix a bug in the b-tree logic that can result in incorrect duplicate answers
     for IN operator queries.  Ticket
     <a href="https://sqlite.org/src/info/61fe9745">61fe9745</a>
r‡+9ƒ)releaselog/3_19_3.html3.19.3 Fix the <a href="../pragma.html#pragma_foreign_key_check">PRAGMA foreign_key_check</a> command so that it works correctly with
     foreign keys on <a href="../withoutrowid.html">WITHOUT ROWID</a> tables.
e‡*9ƒreleaselog/3_19_3.html3.19.3 Fix a problem in <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> that was causing a subsequent
     <a href="../lang_vacuum.html">VACUUM</a> to behave suboptimally.
‚P‡)9„ereleaselog/3_19_3.html3.19.3 Fix a problem in <a href="../lang_replace.html">REPLACE</a> that can result in a corrupt database containing
     two or more rows with the same <a href="../lang_createtable.html#rowid">rowid</a>.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/f68dc596c4e6018d">f68dc596c4e6018d</a>.
‚o‡(9…#releaselog/3_19_3.html3.19.3
 Added the <a href="https://sqlite.org/src/file/ext/misc/anycollseq.c">anycollseq.c</a>
     <a href="../loadext.html">loadable extension</a> that allows a generic SQLite database connection to
     read a schema that contains unknown and/or
     application-specific <a href="../datatype3.html#collation">collating sequences</a>.
‡'9}releaselog/3_19_3.html3.19.3 Enhance the <a href="../json1.html#jex">json_extract()</a> function to cache and reuse parses of JSON
     input text.
R‡&9‚ireleaselog/3_19_3.html3.19.3 Enhance the <a href="../fts5.html">FTS5</a> query syntax so that <a href="../fts5.html#fts5_column_filters">column filters</a>
     may be applied to arbitrary expressions.
w‡%9ƒ3releaselog/3_19_3.html3.19.3
 Enhance <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> so that it identifies tables that have two
     or more rows with the same <a href="../lang_createtable.html#rowid">rowid</a>.

kÏ
ð
&ð<
Y       ídŽî{'>HkY‡F9‚wreleaselog/3_19_2.html3.19.2 Fix a bug in the b-tree logic that can result in incorrect duplicate answers
     for IN operator queries.  Ticket
     <a href="https://sqlite.org/src/info/61fe9745">61fe9745</a>
r‡E9ƒ)releaselog/3_19_2.html3.19.2 Fix the <a href="../pragma.html#pragma_foreign_key_check">PRAGMA foreign_key_check</a> command so that it works correctly with
     foreign keys on <a href="../withoutrowid.html">WITHOUT ROWID</a> tables.
e‡D9ƒreleaselog/3_19_2.html3.19.2 Fix a problem in <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> that was causing a subsequent
     <a href="../lang_vacuum.html">VACUUM</a> to behave suboptimally.
‚P‡C9„ereleaselog/3_19_2.html3.19.2 Fix a problem in <a href="../lang_replace.html">REPLACE</a> that can result in a corrupt database containing
     two or more rows with the same <a href="../lang_createtable.html#rowid">rowid</a>.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/f68dc596c4e6018d">f68dc596c4e6018d</a>.
‚o‡B9…#releaselog/3_19_2.html3.19.2
 Added the <a href="https://sqlite.org/src/file/ext/misc/anycollseq.c">anycollseq.c</a>
     <a href="../loadext.html">loadable extension</a> that allows a generic SQLite database connection to
     read a schema that contains unknown and/or
     application-specific <a href="../datatype3.html#collation">collating sequences</a>.
‡A9}releaselog/3_19_2.html3.19.2 Enhance the <a href="../json1.html#jex">json_extract()</a> function to cache and reuse parses of JSON
     input text.
R‡@9‚ireleaselog/3_19_2.html3.19.2 Enhance the <a href="../fts5.html">FTS5</a> query syntax so that <a href="../fts5.html#fts5_column_filters">column filters</a>
     may be applied to arbitrary expressions.
w‡?9ƒ3releaselog/3_19_2.html3.19.2
 Enhance <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> so that it identifies tables that have two
     or more rows with the same <a href="../lang_createtable.html#rowid">rowid</a>.

‡>9Yreleaselog/3_19_2.html3.19.2    Reuse the same materialization of a VIEW if that VIEW appears more than
     once in the same query.
9‡=9‚7releaselog/3_19_2.html3.19. Transfer any terms of the HAVING clause that use only columns mentioned in
     the GROUP BY clause over to the WHERE clause for faster processing.
+‡<9‚releaselog/3_19_2.html3.19.2 Avoid unnecessary invalidation of <a href="../c3ref/blob.html">sqlite3_blob</a> handles when making
     changes to unrelated tables.
_‡;9ƒreleaselog/3_19_2.html3.19.2 On a DISTINCT query that uses an index, try to skip ahead to the next distinct
     entry using the index rather than stepping through rows, when an appropriate
     index is available.
0‡:9‚%releaselog/3_19_2.html3.19.2 Avoid unnecessary foreign key processing in UPDATE statements that do not
     touch the columns that are constrained by the foreign keys.
‚2‡99„)releaselog/3_19_2.html3.19.2 Use <a href="../lang_corefunc.html#replace">replace()</a> instead of <a href="../lang_corefunc.html#char">char()</a> for escaping newline and carriage-return
     characters embedded in strings in the .dump output from the <a href="../cli.html">command-line shell</a>.
F‡89‚Qreleaselog/3_19_2.html3.19.2 Enhance the <a href="../optoverview.html#flattening">flattening optimization</a> so that it is able to flatten views
     on the right-hand side of a LEFT JOIN.
[‡79‚{releaselog/3_19_2.html3.19.2 When using an index on an expression, try to use expression values already
     available in the index, rather than loading the original columns and recomputing
     the expression.
‚-‡69        „!releaselog/3_19_2.html3.19.2 The <a href="../c3ref/c_alter_table.html">SQLITE_READ</a> <a href="../c3ref/set_authorizer.html">authorizer callback</a> is invoked once
     with a column name that is an empty string
     for every table referenced in a query from which no columns are extracted.

6j
Qqù
€       Îï%ï;X©ì^cR‡Y9‚ireleaselog/3_19_1.html3.19.1 Enhance the <a href="../fts5.html">FTS5</a> query syntax so that <a href="../fts5.html#fts5_column_filters">column filters</a>
     may be applied to arbitrary expressions.
w‡X9ƒ3releaselog/3_19_1.html3.19.1
 Enhance <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> so that it identifies tables that have two
     or more rows with the same <a href="../lang_createtable.html#rowid">rowid</a>.

‡W9Yreleaselog/3_19_1.html3.19.1    Reuse the same materialization of a VIEW if that VIEW appears more than
     once in the same query.
9‡V9‚7releaselog/3_19_1.html3.19. Transfer any terms of the HAVING clause that use only columns mentioned in
     the GROUP BY clause over to the WHERE clause for faster processing.
+‡U9‚releaselog/3_19_1.html3.19.1 Avoid unnecessary invalidation of <a href="../c3ref/blob.html">sqlite3_blob</a> handles when making
     changes to unrelated tables.
_‡T9ƒreleaselog/3_19_1.html3.19.1 On a DISTINCT query that uses an index, try to skip ahead to the next distinct
     entry using the index rather than stepping through rows, when an appropriate
     index is available.
0‡S9‚%releaselog/3_19_1.html3.19.1 Avoid unnecessary foreign key processing in UPDATE statements that do not
     touch the columns that are constrained by the foreign keys.
‚2‡R9„)releaselog/3_19_1.html3.19.1 Use <a href="../lang_corefunc.html#replace">replace()</a> instead of <a href="../lang_corefunc.html#char">char()</a> for escaping newline and carriage-return
     characters embedded in strings in the .dump output from the <a href="../cli.html">command-line shell</a>.
F‡Q9‚Qreleaselog/3_19_1.html3.19.1 Enhance the <a href="../optoverview.html#flattening">flattening optimization</a> so that it is able to flatten views
     on the right-hand side of a LEFT JOIN.
[‡P9‚{releaselog/3_19_1.html3.19.1 When using an index on an expression, try to use expression values already
     available in the index, rather than loading the original columns and recomputing
     the expression.
‚-‡O9        „!releaselog/3_19_1.html3.19.1 The <a href="../c3ref/c_alter_table.html">SQLITE_READ</a> <a href="../c3ref/set_authorizer.html">authorizer callback</a> is invoked once
     with a column name that is an empty string
     for every table referenced in a query from which no columns are extracted.
~‡N9Areleaselog/3_19_2.html3.19.2SHA3-256 for sqlite3.c: 1be0c457869c1f7eba58c3b5097b9ec307a15be338308bee8e5be8570bcf5d1e


‡M9_releaselog/3_19_2.html3.19.2SQLITE_SOURCE_ID: "2017-05-25 16:50:27 edb4e819b0c058c7d74d27ebd14cc5ceb2bad6a6144a486a970182b7afe3f8b9"
d‡L9        ƒreleaselog/3_19_2.html3.19.2Fix more bugs in the LEFT JOIN <a href="../optoverview.html#flattening">flattening optimization</a>. Ticket
    <a href="https://www.sqlite.org/src/info/7fde638e94287d2c">7fde638e94287d2c</a>.
u‡K9/releaselog/3_19_2.html3.19.2Remove a surplus semicolon that was causing problems for older versions of MSVC.
\‡J9        ‚releaselog/3_19_2.html3.19.2Fix a bug in the LEFT JOIN <a href="../optoverview.html#flattening">flattening optimization</a>. Ticket
    <a href="https://www.sqlite.org/src/info/cad1ab4cb7b0fc">cad1ab4cb7b0fc</a>.
‚‡I9ƒoreleaselog/3_19_2.html3.19.2 Limit the depth of recursion for JSON objects and arrays in order to avoid
     excess stack usage in the recursive descent parser.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/981329adeef51011052">981329adeef51011052</a>.
H‡H9‚Ureleaselog/3_19_2.html3.19.2 Disallow control characters inside of strings in JSON.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/6c9b5514077fed34551">6c9b5514077fed34551</a>.
F‡G9‚Qreleaselog/3_19_2.html3.19.2 Disallow leading zeros in numeric constants in JSON.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/b93be8729a895a528e2">b93be8729a895a528e2</a>.

´`
í™°
º       Ý       G.NÖEÄ“´ê´‚2‡j9„)releaselog/3_19_0.html3.19.0 Use <a href="../lang_corefunc.html#replace">replace()</a> instead of <a href="../lang_corefunc.html#char">char()</a> for escaping newline and carriage-return
     characters embedded in strings in the .dump output from the <a href="../cli.html">command-line shell</a>.
F‡i9‚Qreleaselog/3_19_0.html3.19.0 Enhance the <a href="../optoverview.html#flattening">flattening optimization</a> so that it is able to flatten views
     on the right-hand side of a LEFT JOIN.
[‡h9‚{releaselog/3_19_0.html3.19.0 When using an index on an expression, try to use expression values already
     available in the index, rather than loading the original columns and recomputing
     the expression.
‚-‡g9        „!releaselog/3_19_0.html3.19.0 The <a href="../c3ref/c_alter_table.html">SQLITE_READ</a> <a href="../c3ref/set_authorizer.html">authorizer callback</a> is invoked once
     with a column name that is an empty string
     for every table referenced in a query from which no columns are extracted.
~‡f9Areleaselog/3_19_1.html3.19.1SHA3-256 for sqlite3.c: 996b2aff37b6e0c6663d0312cd921bbdf6826c989cbbb07dadde5e9672889bca


‡e9_releaselog/3_19_1.html3.19.1SQLITE_SOURCE_ID: "2017-05-24 13:08:33 f6d7b988f40217821a382bc298180e9e6794f3ed79a83c6ef5cae048989b3f86"
u‡d9/releaselog/3_19_1.html3.19.1Remove a surplus semicolon that was causing problems for older versions of MSVC.
\‡c9        ‚releaselog/3_19_1.html3.19.1Fix a bug in the LEFT JOIN <a href="../optoverview.html#flattening">flattening optimization</a>. Ticket
    <a href="https://www.sqlite.org/src/info/cad1ab4cb7b0fc">cad1ab4cb7b0fc</a>.
‚‡b9ƒoreleaselog/3_19_1.html3.19.1 Limit the depth of recursion for JSON objects and arrays in order to avoid
     excess stack usage in the recursive descent parser.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/981329adeef51011052">981329adeef51011052</a>.
H‡a9‚Ureleaselog/3_19_1.html3.19.1 Disallow control characters inside of strings in JSON.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/6c9b5514077fed34551">6c9b5514077fed34551</a>.
F‡`9‚Qreleaselog/3_19_1.html3.19.1 Disallow leading zeros in numeric constants in JSON.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/b93be8729a895a528e2">b93be8729a895a528e2</a>.
Y‡_9‚wreleaselog/3_19_1.html3.19.1 Fix a bug in the b-tree logic that can result in incorrect duplicate answers
     for IN operator queries.  Ticket
     <a href="https://sqlite.org/src/info/61fe9745">61fe9745</a>
r‡^9ƒ)releaselog/3_19_1.html3.19.1 Fix the <a href="../pragma.html#pragma_foreign_key_check">PRAGMA foreign_key_check</a> command so that it works correctly with
     foreign keys on <a href="../withoutrowid.html">WITHOUT ROWID</a> tables.
e‡]9ƒreleaselog/3_19_1.html3.19.1 Fix a problem in <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> that was causing a subsequent
     <a href="../lang_vacuum.html">VACUUM</a> to behave suboptimally.
‚P‡\9„ereleaselog/3_19_1.html3.19.1 Fix a problem in <a href="../lang_replace.html">REPLACE</a> that can result in a corrupt database containing
     two or more rows with the same <a href="../lang_createtable.html#rowid">rowid</a>.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/f68dc596c4e6018d">f68dc596c4e6018d</a>.
‚o‡[9…#releaselog/3_19_1.html3.19.1
 Added the <a href="https://sqlite.org/src/file/ext/misc/anycollseq.c">anycollseq.c</a>
     <a href="../loadext.html">loadable extension</a> that allows a generic SQLite database connection to
     read a schema that contains unknown and/or
     application-specific <a href="../datatype3.html#collation">collating sequences</a>.
‡Z9}releaselog/3_19_1.html3.19.1 Enhance the <a href="../json1.html#jex">json_extract()</a> function to cache and reuse parses of JSON
     input text.

ELi
ºýot
ž       ‹7NX{±åÌ;ºEr‡}9     +releaselog/3_18_2.html3.18.2Added the <a href="../pragma.html#pragma_optimize">PRAGMA optimize</a> command
~‡|9Areleaselog/3_19_0.html3.19.0SHA3-256 for sqlite3.c: c30326aa1a9cc342061b755725eac9270109acf878bc59200dd4b1cea6bc2908


‡{9_releaselog/3_19_0.html3.19.0SQLITE_SOURCE_ID: "2017-05-22 13:58:13 28a94eb282822cad1d1420f2dad6bf65e4b8b9062eda4a0b9ee8270b2c608e40"
‚‡z9ƒoreleaselog/3_19_0.html3.19.0 Limit the depth of recursion for JSON objects and arrays in order to avoid
     excess stack usage in the recursive descent parser.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/981329adeef51011052">981329adeef51011052</a>.
H‡y9‚Ureleaselog/3_19_0.html3.19.0 Disallow control characters inside of strings in JSON.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/6c9b5514077fed34551">6c9b5514077fed34551</a>.
F‡x9‚Qreleaselog/3_19_0.html3.19.0 Disallow leading zeros in numeric constants in JSON.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/b93be8729a895a528e2">b93be8729a895a528e2</a>.
Y‡w9‚wreleaselog/3_19_0.html3.19.0 Fix a bug in the b-tree logic that can result in incorrect duplicate answers
     for IN operator queries.  Ticket
     <a href="https://sqlite.org/src/info/61fe9745">61fe9745</a>
r‡v9ƒ)releaselog/3_19_0.html3.19.0 Fix the <a href="../pragma.html#pragma_foreign_key_check">PRAGMA foreign_key_check</a> command so that it works correctly with
     foreign keys on <a href="../withoutrowid.html">WITHOUT ROWID</a> tables.
e‡u9ƒreleaselog/3_19_0.html3.19.0 Fix a problem in <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> that was causing a subsequent
     <a href="../lang_vacuum.html">VACUUM</a> to behave suboptimally.
‚P‡t9„ereleaselog/3_19_0.html3.19.0 Fix a problem in <a href="../lang_replace.html">REPLACE</a> that can result in a corrupt database containing
     two or more rows with the same <a href="../lang_createtable.html#rowid">rowid</a>.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/f68dc596c4e6018d">f68dc596c4e6018d</a>.
‚o‡s9…#releaselog/3_19_0.html3.19.0
 Added the <a href="https://sqlite.org/src/file/ext/misc/anycollseq.c">anycollseq.c</a>
     <a href="../loadext.html">loadable extension</a> that allows a generic SQLite database connection to
     read a schema that contains unknown and/or
     application-specific <a href="../datatype3.html#collation">collating sequences</a>.
‡r9}releaselog/3_19_0.html3.19.0 Enhance the <a href="../json1.html#jex">json_extract()</a> function to cache and reuse parses of JSON
     input text.
R‡q9‚ireleaselog/3_19_0.html3.19.0 Enhance the <a href="../fts5.html">FTS5</a> query syntax so that <a href="../fts5.html#fts5_column_filters">column filters</a>
     may be applied to arbitrary expressions.
w‡p9ƒ3releaselog/3_19_0.html3.19.0
 Enhance <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> so that it identifies tables that have two
     or more rows with the same <a href="../lang_createtable.html#rowid">rowid</a>.

‡o9Yreleaselog/3_19_0.html3.19.0    Reuse the same materialization of a VIEW if that VIEW appears more than
     once in the same query.
9‡n9‚7releaselog/3_19_0.html3.19. Transfer any terms of the HAVING clause that use only columns mentioned in
     the GROUP BY clause over to the WHERE clause for faster processing.
+‡m9‚releaselog/3_19_0.html3.19.0 Avoid unnecessary invalidation of <a href="../c3ref/blob.html">sqlite3_blob</a> handles when making
     changes to unrelated tables.
_‡l9ƒreleaselog/3_19_0.html3.19.0 On a DISTINCT query that uses an index, try to skip ahead to the next distinct
     entry using the index rather than stepping through rows, when an appropriate
     index is available.
0‡k9‚%releaselog/3_19_0.html3.19.0 Avoid unnecessary foreign key processing in UPDATE statements that do not
     touch the columns that are constrained by the foreign keys.

-t
Ñ¸        å       Qòe‚dBPf-5ˆ
9‚/releaselog/3_18_2.html3.18.2The <a href="../c3ref/trace_v2.html">sqlite3_trace_v2()</a> output for nested SQL statements should always begin
    with a "--" comment marker.
4ˆ9‚-releaselog/3_18_2.html3.18.2In the <a href="../rbu.html">RBU extension</a>, add extra sync operations to avoid the possibility of
    corruption following a power failure.
‚.ˆ9„!releaselog/3_18_2.html3.18.2Fix a potential segfault in complex recursive triggers, resulting from a
    bug in the OP_Once opcode introduced as part of a performance optimization in
    version 3.15.0.
    Ticket <a href="https://www.sqlite.org/src/info/06796225f59c057c">06796225f59c057c</a>
nˆ
9ƒ!releaselog/3_18_2.html3.18.2Fix a bug in the 'start of ...' modifiers for the <a href="../lang_datefunc.html">date and time functions</a>.
    Ticket <a href="https://www.sqlite.org/src/info/6097cb92745327a1">6097cb92745327a1</a>
Vˆ     9‚qreleaselog/3_18_2.html3.18.2
Ensure that indexed expressions with collating sequences are handled correctly.
    Fix for ticket <a href="https://www.sqlite.org/src/info/eb703ba7b50c1a5">eb703ba7b50c1a5</a>.
E9Qreleaselog/3_18_2.html3.18.2Various performance improvements.
‚ˆ9ƒyreleaselog/3_18_2.html3.18.2Begin enforcing <a href="../c3ref/c_limit_attached.html#sqlitelimitvdbeop">SQLITE_LIMIT_VDBE_OP</a>. This can be used, for example, to prevent
    excessively large prepared statements in systems that accept SQL queries from
    untrusted users.
_ˆ9ƒreleaselog/3_18_2.html3.18.2
Added the <a href="../cli.html#sha3sum">.sha3sum dot-command</a> and the <a href="../cli.html#selftest">.selftest dot-command</a> 
    to the <a href="../cli.html">command-line shell</a>
       ˆ9Wreleaselog/3_18_2.html3.18.2   Added the -D<a href="../compile.html#max_memory">SQLITE_MAX_MEMORY</a>=<i>N</i> compile-time option.
‚[ˆ9„{releaselog/3_18_2.html3.18.Enhance the <a href="../c3ref/mprintf.html">sqlite3_mprintf()</a> family of interfaces and the <a href="../lang_corefunc.html#printf">printf SQL function</a>
    to put comma separators at the thousands marks for integers, if the "," format modifier
    is used in between the "%" and the "d" (example: "%,d").
ˆ9ereleaselog/3_18_2.html3.18.2Enhance the query plans for joins to detect empty tables early and
    halt without doing unnecessary work.
‚ˆ9ƒureleaselog/3_18_2.html3.18.2Enhance <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> and <a href="../pragma.html#pragma_quick_check">PRAGMA quick_check</a> so that they verify
    <a href="../lang_createtable.html#ckconst">CHECK constraints</a>.
ƒ3ˆ9†+releaselog/3_18_2.html3.18.2Added the <a href="../c3ref/set_last_insert_rowid.html">sqlite3_set_last_insert_rowid()</a> interface and use the new interface in 
    the <a href="../fts3.html">FTS3</a>, <a href="../fts3.html#fts4">FTS4</a>, and <a href="../fts5.html">FTS5</a> extensions to ensure that the <a href="../c3ref/last_insert_rowid.html">sqlite3_last_insert_rowid()</a>
    interface always returns reasonable values.
‚ˆ9ƒoreleaselog/3_18_2.html3.18.2Enhance the <a href="../optoverview.html#like_opt">LIKE optimization</a> so that it works for arbitrary expressions on 
    the left-hand side as long as the LIKE pattern on the right-hand side does not
    begin with a digit or minus sign.
‡9‚releaselog/3_18_2.html3.18.2Added the <a href="../json1.html#jpatch">json_patch()</a> SQL function to the <a href="../json1.html">JSON1 extension</a>.
‡~9…Ureleaselog/3_18_2.html3.18.2The SQLite version identifier returned by the <a href="../lang_corefunc.html#sqlite_source_id">sqlite_source_id()</a> SQL function
    and the <a href="../c3ref/libversion.html">sqlite3_sourceid()</a> C API and found in the <a href="../c3ref/c_source_id.html">SQLITE_SOURCE_ID</a> macro is
    now a 64-digit SHA3-256 hash instead of a 40-digit SHA1 hash.

—±
Ü
KÊU
É
&       
V:¦Gº×¹q—Vˆ9‚qreleaselog/3_18_1.html3.18.1
Ensure that indexed expressions with collating sequences are handled correctly.
    Fix for ticket <a href="https://www.sqlite.org/src/info/eb703ba7b50c1a5">eb703ba7b50c1a5</a>.
Eˆ9Qreleaselog/3_18_1.html3.18.1Various performance improvements.
‚ˆ9ƒyreleaselog/3_18_1.html3.18.1Begin enforcing <a href="../c3ref/c_limit_attached.html#sqlitelimitvdbeop">SQLITE_LIMIT_VDBE_OP</a>. This can be used, for example, to prevent
    excessively large prepared statements in systems that accept SQL queries from
    untrusted users.
_ˆ9ƒreleaselog/3_18_1.html3.18.1
Added the <a href="../cli.html#sha3sum">.sha3sum dot-command</a> and the <a href="../cli.html#selftest">.selftest dot-command</a> 
    to the <a href="../cli.html">command-line shell</a>
       ˆ9Wreleaselog/3_18_1.html3.18.1   Added the -D<a href="../compile.html#max_memory">SQLITE_MAX_MEMORY</a>=<i>N</i> compile-time option.
‚[ˆ9„{releaselog/3_18_1.html3.18.Enhance the <a href="../c3ref/mprintf.html">sqlite3_mprintf()</a> family of interfaces and the <a href="../lang_corefunc.html#printf">printf SQL function</a>
    to put comma separators at the thousands marks for integers, if the "," format modifier
    is used in between the "%" and the "d" (example: "%,d").
ˆ9ereleaselog/3_18_1.html3.18.1Enhance the query plans for joins to detect empty tables early and
    halt without doing unnecessary work.
‚ˆ9ƒureleaselog/3_18_1.html3.18.1Enhance <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> and <a href="../pragma.html#pragma_quick_check">PRAGMA quick_check</a> so that they verify
    <a href="../lang_createtable.html#ckconst">CHECK constraints</a>.
ƒ3ˆ9†+releaselog/3_18_1.html3.18.1Added the <a href="../c3ref/set_last_insert_rowid.html">sqlite3_set_last_insert_rowid()</a> interface and use the new interface in 
    the <a href="../fts3.html">FTS3</a>, <a href="../fts3.html#fts4">FTS4</a>, and <a href="../fts5.html">FTS5</a> extensions to ensure that the <a href="../c3ref/last_insert_rowid.html">sqlite3_last_insert_rowid()</a>
    interface always returns reasonable values.
‚ˆ9ƒoreleaselog/3_18_1.html3.18.1Enhance the <a href="../optoverview.html#like_opt">LIKE optimization</a> so that it works for arbitrary expressions on 
    the left-hand side as long as the LIKE pattern on the right-hand side does not
    begin with a digit or minus sign.
ˆ9‚releaselog/3_18_1.html3.18.1Added the <a href="../json1.html#jpatch">json_patch()</a> SQL function to the <a href="../json1.html">JSON1 extension</a>.
ˆ9…Ureleaselog/3_18_1.html3.18.1The SQLite version identifier returned by the <a href="../lang_corefunc.html#sqlite_source_id">sqlite_source_id()</a> SQL function
    and the <a href="../c3ref/libversion.html">sqlite3_sourceid()</a> C API and found in the <a href="../c3ref/c_source_id.html">SQLITE_SOURCE_ID</a> macro is
    now a 64-digit SHA3-256 hash instead of a 40-digit SHA1 hash.
rˆ9 +releaselog/3_18_1.html3.18.1Added the <a href="../pragma.html#pragma_optimize">PRAGMA optimize</a> command
~ˆ9Areleaselog/3_18_2.html3.18.2SHA3-256 for sqlite3.c: b0bd014f2776b9f9508a3fc6432f70e2436bf54475369f88f0aeef75b0eec93e


ˆ9_releaselog/3_18_2.html3.18.2SQLITE_SOURCE_ID: "2017-06-17 09:59:36 036ebf729e4b21035d7f4f8e35a6f705e6bf99887889e2dc14ebf2242e7930dd"
Qˆ9        ‚ireleaselog/3_18_2.html3.18.2Fix a bug that might cause duplicate output rows when an IN operator is
    used in the WHERE clause.
    Ticket <a href="https://sqlite.org/src/info/61fe9745">61fe9745</a>.
‚Kˆ9        „]releaselog/3_18_2.html3.18.2Fix a bug associated with <a href="../pragma.html#pragma_auto_vacuum">auto_vacuum</a> that can lead to database
    corruption.  The bug was introduced in <a href="../releaselog/3_16_0.html">version 3.16.0</a> (2017-01-02).
    Ticket <a href="https://sqlite.org/src/info/fda22108">fda22108</a>.

ú
Ü
$k
‹

                fM–zæ‡ú       ˆ.9Wreleaselog/3_18_0.html3.18.0   Added the -D<a href="../compile.html#max_memory">SQLITE_MAX_MEMORY</a>=<i>N</i> compile-time option.
‚[ˆ-9„{releaselog/3_18_0.html3.18.Enhance the <a href="../c3ref/mprintf.html">sqlite3_mprintf()</a> family of interfaces and the <a href="../lang_corefunc.html#printf">printf SQL function</a>
    to put comma separators at the thousands marks for integers, if the "," format modifier
    is used in between the "%" and the "d" (example: "%,d").
ˆ,9ereleaselog/3_18_0.html3.18.0Enhance the query plans for joins to detect empty tables early and
    halt without doing unnecessary work.
‚ˆ+9ƒureleaselog/3_18_0.html3.18.0Enhance <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> and <a href="../pragma.html#pragma_quick_check">PRAGMA quick_check</a> so that they verify
    <a href="../lang_createtable.html#ckconst">CHECK constraints</a>.
ƒ3ˆ*9†+releaselog/3_18_0.html3.18.0Added the <a href="../c3ref/set_last_insert_rowid.html">sqlite3_set_last_insert_rowid()</a> interface and use the new interface in 
    the <a href="../fts3.html">FTS3</a>, <a href="../fts3.html#fts4">FTS4</a>, and <a href="../fts5.html">FTS5</a> extensions to ensure that the <a href="../c3ref/last_insert_rowid.html">sqlite3_last_insert_rowid()</a>
    interface always returns reasonable values.
‚ˆ)9ƒoreleaselog/3_18_0.html3.18.0Enhance the <a href="../optoverview.html#like_opt">LIKE optimization</a> so that it works for arbitrary expressions on 
    the left-hand side as long as the LIKE pattern on the right-hand side does not
    begin with a digit or minus sign.
ˆ(9‚releaselog/3_18_0.html3.18.0Added the <a href="../json1.html#jpatch">json_patch()</a> SQL function to the <a href="../json1.html">JSON1 extension</a>.
ˆ'9…Ureleaselog/3_18_0.html3.18.0The SQLite version identifier returned by the <a href="../lang_corefunc.html#sqlite_source_id">sqlite_source_id()</a> SQL function
    and the <a href="../c3ref/libversion.html">sqlite3_sourceid()</a> C API and found in the <a href="../c3ref/c_source_id.html">SQLITE_SOURCE_ID</a> macro is
    now a 64-digit SHA3-256 hash instead of a 40-digit SHA1 hash.
rˆ&9 +releaselog/3_18_0.html3.18.0Added the <a href="../pragma.html#pragma_optimize">PRAGMA optimize</a> command
~ˆ%9Areleaselog/3_18_1.html3.18.1SHA3-256 for sqlite3.c: 334eaf776db9d09a4e69d6012c266bc837107edc2c981739ef82081cb11c5723


ˆ$9_releaselog/3_18_1.html3.18.1SQLITE_SOURCE_ID: "2017-06-16 13:41:15 77bb46233db03a3338bacf7e56f439be3dfd1926ea0c44d252eeafa7a7b31c06"
‚Kˆ#9        „]releaselog/3_18_1.html3.18.1Fix a bug associated with <a href="../pragma.html#pragma_auto_vacuum">auto_vacuum</a> that can lead to database
    corruption.  The bug was introduced in <a href="../releaselog/3_16_0.html">version 3.16.0</a> (2017-01-02).
    Ticket <a href="https://sqlite.org/src/info/fda22108">fda22108</a>.
5ˆ"9‚/releaselog/3_18_1.html3.18.1The <a href="../c3ref/trace_v2.html">sqlite3_trace_v2()</a> output for nested SQL statements should always begin
    with a "--" comment marker.
4ˆ!9‚-releaselog/3_18_1.html3.18.1In the <a href="../rbu.html">RBU extension</a>, add extra sync operations to avoid the possibility of
    corruption following a power failure.
‚.ˆ 9„!releaselog/3_18_1.html3.18.1Fix a potential segfault in complex recursive triggers, resulting from a
    bug in the OP_Once opcode introduced as part of a performance optimization in
    version 3.15.0.
    Ticket <a href="https://www.sqlite.org/src/info/06796225f59c057c">06796225f59c057c</a>
nˆ9ƒ!releaselog/3_18_1.html3.18.1Fix a bug in the 'start of ...' modifiers for the <a href="../lang_datefunc.html">date and time functions</a>.
    Ticket <a href="https://www.sqlite.org/src/info/6097cb92745327a1">6097cb92745327a1</a>

¯
ÿ
·Ýë
¹
       64¦CÜ.¯|ˆ?9=releaselog/3_17_0.html3.17.0Added the SQLITE_UINT64_TYPE compile-time option as an
    analog to SQLITE_INT64_TYPE.
*ˆ>9‚releaselog/3_17_0.html3.17.0Change <a href="../compile.html#default_pcache_initsz">SQLITE_DEFAULT_PCACHE_INITSZ</a> from 100 to 20, for
    improved performance.
‚'ˆ=9„releaselog/3_17_0.html3.17.0Added the <a href="../compile.html#enable_null_trim">SQLITE_ENABLE_NULL_TRIM</a> compile-time option, which
    can result in significantly smaller database files for some
    applications, at the risk of being incompatible with older
    versions of SQLite.
‚8ˆ<9„5releaselog/3_17_0.html3.17.0Use compiler built-ins __builtin_sub_overflow(), __builtin_add_overflow(),
    and __builtin_mul_overflow() when available.  (All compiler
    built-ins can be omitted with the <a href="../compile.html#disable_intrinsic">SQLITE_DISABLE_INTRINSIC</a> compile-time
    option.)
‚_ˆ;9…releaselog/3_17_0.html3.17.0Increase the default <a href="../malloc.html#lookaside">lookaside</a>
    size from 512,125 to 1200,100 
    as this provides better performance while only adding 56KB 
    of extra memory per connection.  Memory-sensitive 
    applications can restore the old
    default at compile-time, start-time, or run-time.

ˆ:9Yreleaselog/3_17_0.html3.17.0Add the <a href="../compile.html#default_lookaside">SQLITE_DEFAULT_LOOKASIDE</a> compile-time option.
ƒ~ˆ99        ‡Creleaselog/3_17_0.html3.17.0Approximately 25% better performance from the <a href="../rtree.html">R-Tree extension</a>.
    <ol type="a">
    <li> Uses compiler built-ins (ex: __builtin_bswap32() or _byteswap_ulong())
         for byteswapping when available.
    </li><li> Uses the <a href="../c3ref/blob.html">sqlite3_blob</a> key/value access object instead of SQL
         for pulling content out of R-Tree nodes
    </li><li> Other miscellaneous enhancements such as loop unrolling.
    </li></ol>
~ˆ89Areleaselog/3_18_0.html3.18.0SHA3-256 for sqlite3.c: cbf322df1f76be57fb3be84f3da1fc71d1d3dfdb7e7c2757fb0ff630b3bc2e5d


ˆ79_releaselog/3_18_0.html3.18.0SQLITE_SOURCE_ID: "2017-03-28 18:48:43 424a0d380332858ee55bdebc4af3789f74e70a2b3ba1cf29d84b9b4bcf3e2e37"
5ˆ69‚/releaselog/3_18_0.html3.18.0The <a href="../c3ref/trace_v2.html">sqlite3_trace_v2()</a> output for nested SQL statements should always begin
    with a "--" comment marker.
4ˆ59‚-releaselog/3_18_0.html3.18.0In the <a href="../rbu.html">RBU extension</a>, add extra sync operations to avoid the possibility of
    corruption following a power failure.
‚.ˆ49„!releaselog/3_18_0.html3.18.0Fix a potential segfault in complex recursive triggers, resulting from a
    bug in the OP_Once opcode introduced as part of a performance optimization in
    version 3.15.0.
    Ticket <a href="https://www.sqlite.org/src/info/06796225f59c057c">06796225f59c057c</a>
nˆ39ƒ!releaselog/3_18_0.html3.18.0Fix a bug in the 'start of ...' modifiers for the <a href="../lang_datefunc.html">date and time functions</a>.
    Ticket <a href="https://www.sqlite.org/src/info/6097cb92745327a1">6097cb92745327a1</a>
Vˆ29‚qreleaselog/3_18_0.html3.18.0
Ensure that indexed expressions with collating sequences are handled correctly.
    Fix for ticket <a href="https://www.sqlite.org/src/info/eb703ba7b50c1a5">eb703ba7b50c1a5</a>.
Eˆ19Qreleaselog/3_18_0.html3.18.0Various performance improvements.
‚ˆ09ƒyreleaselog/3_18_0.html3.18.0Begin enforcing <a href="../c3ref/c_limit_attached.html#sqlitelimitvdbeop">SQLITE_LIMIT_VDBE_OP</a>. This can be used, for example, to prevent
    excessively large prepared statements in systems that accept SQL queries from
    untrusted users.
_ˆ/9ƒreleaselog/3_18_0.html3.18.0
Added the <a href="../cli.html#sha3sum">.sha3sum dot-command</a> and the <a href="../cli.html#selftest">.selftest dot-command</a> 
    to the <a href="../cli.html">command-line shell</a>

@h·
Ò
Lac
+       Eˆ|ž×Yt³Ù@KˆS9‚[releaselog/3_16_2.html3.16.2Enhanced <a href="../c3ref/interrupt.html">sqlite3_interrupt()</a> so that it interrupts <a href="../wal.html#ckpt">checkpoint</a> operations that
    are in process.
FˆR9‚Qreleaselog/3_16_2.html3.16.2Enhanced "WHERE x NOT NULL" <a href="../partialindex.html">partial indexes</a> so that they are usable if 
    the "x" column appears in a LIKE or GLOB operator.
VˆQ9‚qreleaselog/3_16_2.html3.16.2Changed the default configuration of the <a href="../malloc.html#lookaside">lookaside memory allocator</a> from
    500 slots of 128 bytes each into 125 slots of 512 bytes each.
=ˆP9‚?releaselog/3_16_2.html3.16.2Enhance the <a href="../lang_datefunc.html">date and time functions</a> so that the 'unixepoch' modifier works
    for the full span of supported dates.
aˆO9ƒreleaselog/3_16_2.html3.16.2Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfignockptonclose">SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE</a> option to <a href="../c3ref/db_config.html">sqlite3_db_config()</a>.
{ˆN9;releaselog/3_16_2.html3.16.2Added experimental support for <a href="../pragma.html#pragfunc">PRAGMA functions</a>.
CˆM9        ‚Mreleaselog/3_16_2.html3.16.2Uses 9% fewer CPU cycles. (See the <a href="../cpu.html">CPU performance measurement</a> report for
    details on how this performance increase was computed.)
cˆL9releaselog/3_17_0.html3.17.0SHA1 for sqlite3.c: cc7d708bb073c44102a59ed63ce6142da1f174d1


uˆK9/releaselog/3_17_0.html3.17.0SQLITE_SOURCE_ID: "2017-02-13 16:02:40 ada05cfa86ad7f5645450ac7a2a21c9aa6e57d2c"
ˆJ9ƒUreleaselog/3_17_0.html3.17.0Ensure that the <a href="../c3ref/blob_reopen.html">sqlite3_blob_reopen()</a> interface can correctly
    handle short rows.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/e6e962d6b0f06f46e">e6e962d6b0f06f46e</a>.
9ˆI9‚7releaselog/3_17_0.html3.17.0Use the correct affinity for columns of automatic indexes. Ticket
    <a href="https://www.sqlite.org/src/info/7ffd1ca1d2ad4ec">7ffd1ca1d2ad4ec</a>.
‚^ˆH9…releaselog/3_17_0.html3.17.0Throw an error if the ON clause of a LEFT JOIN references tables
    to the right of the ON clause.  This is the same behavior as
    PostgreSQL.  Formerly, SQLite silently converted the LEFT JOIN
    into an INNER JOIN.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/25e335f802dd">25e335f802dd</a>.
ˆG9Ereleaselog/3_17_0.html3.17.0Other performance improvements. Uses about <a href="../cpu.html">6.5% fewer CPU cycles</a>.
‚4ˆF9„-releaselog/3_17_0.html3.17.0Enhance the 
    <a href="../lemon.html">Lemon parser generator</a>
    so that it can store the parser object as a stack variable rather than 
    allocating space from the heap and make use of that enhancement in
    the <a href="../amalgamation.html">amalgamation</a>.
zˆE9ƒ9releaselog/3_17_0.html3.17.0
Enhance the <a href="../compile.html#direct_overflow_read">SQLITE_DIRECT_OVERFLOW_READ</a> option so that it works
    in <a href="../wal.html">WAL mode</a> as long as the pages being read are not in the WAL file.
gˆD9ƒreleaselog/3_17_0.html3.17.0In the <a href="../cli.html">command-line shell</a>, enhance the ".mode" command so that it
    restores the default column and row separators for modes "line",
    "list", "column", and "tcl". 
ˆC9Ireleaselog/3_17_0.html3.17.0Added the <a href="https://www.sqlite.org/src/file/ext/misc/sha1.c">sha1.c</a>
    extension.
aˆB9ƒreleaselog/3_17_0.html3.17.0
Fixed performance problems and potential stack overflows
    when creating <a href="../lang_createview.html">views</a> from multi-row VALUES clauses with
    hundreds of thousands of rows.
-ˆA9‚releaselog/3_17_0.html3.17.0 Enhance the <a href="../sessionintro.html">session extension</a> to support <a href="../withoutrowid.html">WITHOUT ROWID</a>
    tables.
ˆ@9mreleaselog/3_17_0.html3.17.Perform some <a href="../lang_update.html">UPDATE</a> operations in a single pass instead of
    in two passes.

àa
ñ
zÒ  ³       =Ô.™½Eàbˆc9        releaselog/3_16_2.html3.16.2SHA1 for sqlite3.c: 2bebdc3f24911c0d12b6d6c0123c3f84d6946b08

uˆb9/releaselog/3_16_2.html3.16.2SQLITE_SOURCE_ID: "2017-01-06 16:32:41 a65a62893ca8319e89e48b8a38cf8a59c69a8209"
‚]ˆa9„releaselog/3_16_2.html3.16.2Adjust the <a href="../c3ref/column_count.html">sqlite3_column_count()</a> API so it more often returns the same
    values for <a href="../pragma.html#syntax">PRAGMA</a> statements as it did in prior releases, to
    minimize disruption to applications that might be using that
    interface in unexpected ways.
‚wˆ`9…3releaselog/3_16_2.html3.16.2Fix the bytecode generator to deal with a subquery in the FROM clause
    that is itself a UNION ALL where one side of the UNION ALL is a view
    that contains an ORDER BY.  This is a long-standing issue that was
    discovered after the release of 3.16.1.  See ticket
    <a href="https://www.sqlite.org/src/info/190c2507">190c2507</a>.
ƒˆ_9…greleaselog/3_16_2.html3.16.2Fix the <a href="../c3ref/value_blob.html">sqlite3_value_text()</a> interface so that it correctly
    translates content generated by <a href="../lang_corefunc.html#zeroblob">zeroblob()</a> into a string of all
    0x00 characters.  This is a long-standing issue discovered after the
    3.16.1 release by <a href="https://github.com/google/oss-fuzz">OSS-Fuzz</a>
ƒ"ˆ^9        †releaselog/3_16_2.html3.16.2Fix the <a href="../lang_replace.html">REPLACE</a> statement for 
    <a href="../withoutrowid.html">WITHOUT ROWID</a> tables that lack secondary indexes so that
    it works correctly with triggers and foreign keys.  This was a new bug
    caused by performance optimizations added in version 3.16.0.
    Ticket <a href="https://www.sqlite.org/src/info/30027b613b4">30027b613b4</a>
‚eˆ]9        …releaselog/3_16_2.html3.16.2Fix a bug concerning the use of <a href="../rowvalue.html">row values</a> within <a href="../lang_createtrigger.html">triggers</a>
    (see ticket <a href="https://www.sqlite.org/src/info/8c9458e7">8c9458e7</a>)
    that was in version 3.15.0 but was not reported until moments after the 3.16.0
    release was published.
sˆ\9+releaselog/3_16_2.html3.16.2Correctly handle the integer literal -0x8000000000000000 in the query planner.
‚Mˆ[9„_releaselog/3_16_2.html3.16.2Fix a long-standing bug in the query planner that caused incorrect results
    on a LEFT JOIN where the left-hand table is a subquery and the join constraint
    is a bare column name coming from the left-hand subquery.  Ticket
    <a href="https://www.sqlite.org/src/info/2df0107b">2df0107b</a>.
~ˆZ9ƒAreleaselog/3_16_2.html3.16.2Rename the <a href="../compile.html#omit_builtin_test">SQLITE_OMIT_BUILTIN_TEST</a> compile-time option to
    <a href="../compile.html#untestable">SQLITE_UNTESTABLE</a> to better reflect the implications of using it.
HˆY9‚Ureleaselog/3_16_2.html3.16.2
Added the <a href="https://www.sqlite.org/src/file/ext/misc/remember.c">remember(V,PTR)</a>
    SQL function as a <a href="../loadext.html">loadable extension</a>.
$ˆX9‚
releaselog/3_16_2.html3.16.2Added the <a href="../imposter.html#dotimposter">.imposter dot-command</a> to the <a href="../cli.html">command-line shell</a>.
tˆW9-releaselog/3_16_2.html3.16.2Added ".lint fkey-indexes" to the <a href="../cli.html">command-line shell</a>.
mˆV9releaselog/3_16_2.html3.16.2
Added ".mode quote" to the <a href="../cli.html">command-line shell</a>.
2ˆU9‚)releaselog/3_16_2.html3.16.2 Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlwin32gethandle">SQLITE_FCNTL_WIN32_GET_HANDLE</a> file control opcode.
eˆT9ƒreleaselog/3_16_2.html3.16.Enhanced the <a href="../lang_expr.html#like">LIKE</a> and <a href="../lang_expr.html#glob">GLOB</a> matching algorithm to be faster
    for cases when the pattern contains multiple wildcards.

T9»
Ö
;q
¢       ¹       t¨¦Ußvþ™ÒT{ˆx9;releaselog/3_16_0.html3.16.0Added experimental support for <a href="../pragma.html#pragfunc">PRAGMA functions</a>.
Cˆw9        ‚Mreleaselog/3_16_0.html3.16.0Uses 9% fewer CPU cycles. (See the <a href="../cpu.html">CPU performance measurement</a> report for
    details on how this performance increase was computed.)
bˆv9       releaselog/3_16_1.html3.16.1SHA1 for sqlite3.c: 354f6223490b30fd5320b4066b1535e4ce33988d

uˆu9/releaselog/3_16_1.html3.16.1SQLITE_SOURCE_ID: "2017-01-03 18:27:03 979f04392853b8053817a3eea2fc679947b437fd"
‚eˆt9        …releaselog/3_16_1.html3.16.1Fix a bug concerning the use of <a href="../rowvalue.html">row values</a> within <a href="../lang_createtrigger.html">triggers</a>
    (see ticket <a href="https://www.sqlite.org/src/info/8c9458e7">8c9458e7</a>)
    that was in version 3.15.0 but was not reported until moments after the 3.16.0
    release was published.
sˆs9+releaselog/3_16_1.html3.16.1Correctly handle the integer literal -0x8000000000000000 in the query planner.
‚Mˆr9„_releaselog/3_16_1.html3.16.1Fix a long-standing bug in the query planner that caused incorrect results
    on a LEFT JOIN where the left-hand table is a subquery and the join constraint
    is a bare column name coming from the left-hand subquery.  Ticket
    <a href="https://www.sqlite.org/src/info/2df0107b">2df0107b</a>.
~ˆq9ƒAreleaselog/3_16_1.html3.16.1Rename the <a href="../compile.html#omit_builtin_test">SQLITE_OMIT_BUILTIN_TEST</a> compile-time option to
    <a href="../compile.html#untestable">SQLITE_UNTESTABLE</a> to better reflect the implications of using it.
Hˆp9‚Ureleaselog/3_16_1.html3.16.1
Added the <a href="https://www.sqlite.org/src/file/ext/misc/remember.c">remember(V,PTR)</a>
    SQL function as a <a href="../loadext.html">loadable extension</a>.
$ˆo9‚
releaselog/3_16_1.html3.16.1Added the <a href="../imposter.html#dotimposter">.imposter dot-command</a> to the <a href="../cli.html">command-line shell</a>.
tˆn9-releaselog/3_16_1.html3.16.1Added ".lint fkey-indexes" to the <a href="../cli.html">command-line shell</a>.
mˆm9releaselog/3_16_1.html3.16.1
Added ".mode quote" to the <a href="../cli.html">command-line shell</a>.
2ˆl9‚)releaselog/3_16_1.html3.16.1 Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlwin32gethandle">SQLITE_FCNTL_WIN32_GET_HANDLE</a> file control opcode.
eˆk9ƒreleaselog/3_16_1.html3.16.Enhanced the <a href="../lang_expr.html#like">LIKE</a> and <a href="../lang_expr.html#glob">GLOB</a> matching algorithm to be faster
    for cases when the pattern contains multiple wildcards.
Kˆj9‚[releaselog/3_16_1.html3.16.1Enhanced <a href="../c3ref/interrupt.html">sqlite3_interrupt()</a> so that it interrupts <a href="../wal.html#ckpt">checkpoint</a> operations that
    are in process.
Fˆi9‚Qreleaselog/3_16_1.html3.16.1Enhanced "WHERE x NOT NULL" <a href="../partialindex.html">partial indexes</a> so that they are usable if 
    the "x" column appears in a LIKE or GLOB operator.
Vˆh9‚qreleaselog/3_16_1.html3.16.1Changed the default configuration of the <a href="../malloc.html#lookaside">lookaside memory allocator</a> from
    500 slots of 128 bytes each into 125 slots of 512 bytes each.
=ˆg9‚?releaselog/3_16_1.html3.16.1Enhance the <a href="../lang_datefunc.html">date and time functions</a> so that the 'unixepoch' modifier works
    for the full span of supported dates.
aˆf9ƒreleaselog/3_16_1.html3.16.1Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfignockptonclose">SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE</a> option to <a href="../c3ref/db_config.html">sqlite3_db_config()</a>.
{ˆe9;releaselog/3_16_1.html3.16.1Added experimental support for <a href="../pragma.html#pragfunc">PRAGMA functions</a>.
Cˆd9        ‚Mreleaselog/3_16_1.html3.16.1Uses 9% fewer CPU cycles. (See the <a href="../cpu.html">CPU performance measurement</a> report for
    details on how this performance increase was computed.)

ZZ
€¶ç
þ
H       Ø       ¹íëš$¬Gã)›úZ‰
9}releaselog/3_15_2.html3.15.2 Added the ability to <a href="../lang_vacuum.html">VACUUM</a> an <a href="../lang_attach.html">ATTACH-ed</a> database.
‰9releaselog/3_15_2.html3.15.2 Added support for <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigmaindbname">SQLITE_DBCONFIG_MAINDBNAME</a>.

‰9Yreleaselog/3_15_2.html3.15.2 Added the "<a href="../uri.html#urimodeof">modeof=<i>filename</i></a>" URI parameter on the unix VFS
6‰
9‚1releaselog/3_15_2.html3.15.2 Allow <a href="../deterministic.html">deterministic SQL functions</a> in the WHERE clause of a <a href="../partialindex.html">partial index</a>.
a‰      9           releaselog/3_15_2.html3.15.2 Added support for <a href="../rowvalue.html">row values</a>.
b9 releaselog/3_16_0.html3.16.0SHA1 for sqlite3.c: e2920fb885569d14197c9b7958e6f1db573ee669

u‰9/releaselog/3_16_0.html3.16.0SQLITE_SOURCE_ID: "2017-01-02 11:57:58 04ac0b75b1716541b2b97704f4809cb7ef19cccf"
s‰9+releaselog/3_16_0.html3.16.0Correctly handle the integer literal -0x8000000000000000 in the query planner.
‚M‰9„_releaselog/3_16_0.html3.16.0Fix a long-standing bug in the query planner that caused incorrect results
    on a LEFT JOIN where the left-hand table is a subquery and the join constraint
    is a bare column name coming from the left-hand subquery.  Ticket
    <a href="https://www.sqlite.org/src/info/2df0107b">2df0107b</a>.
~‰9ƒAreleaselog/3_16_0.html3.16.0Rename the <a href="../compile.html#omit_builtin_test">SQLITE_OMIT_BUILTIN_TEST</a> compile-time option to
    <a href="../compile.html#untestable">SQLITE_UNTESTABLE</a> to better reflect the implications of using it.
H‰9‚Ureleaselog/3_16_0.html3.16.0
Added the <a href="https://www.sqlite.org/src/file/ext/misc/remember.c">remember(V,PTR)</a>
    SQL function as a <a href="../loadext.html">loadable extension</a>.
$‰9‚
releaselog/3_16_0.html3.16.0Added the <a href="../imposter.html#dotimposter">.imposter dot-command</a> to the <a href="../cli.html">command-line shell</a>.
t‰9-releaselog/3_16_0.html3.16.0Added ".lint fkey-indexes" to the <a href="../cli.html">command-line shell</a>.
m‰9releaselog/3_16_0.html3.16.0
Added ".mode quote" to the <a href="../cli.html">command-line shell</a>.
2ˆ9‚)releaselog/3_16_0.html3.16.0 Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlwin32gethandle">SQLITE_FCNTL_WIN32_GET_HANDLE</a> file control opcode.
eˆ~9ƒreleaselog/3_16_0.html3.16.Enhanced the <a href="../lang_expr.html#like">LIKE</a> and <a href="../lang_expr.html#glob">GLOB</a> matching algorithm to be faster
    for cases when the pattern contains multiple wildcards.
Kˆ}9‚[releaselog/3_16_0.html3.16.0Enhanced <a href="../c3ref/interrupt.html">sqlite3_interrupt()</a> so that it interrupts <a href="../wal.html#ckpt">checkpoint</a> operations that
    are in process.
Fˆ|9‚Qreleaselog/3_16_0.html3.16.0Enhanced "WHERE x NOT NULL" <a href="../partialindex.html">partial indexes</a> so that they are usable if 
    the "x" column appears in a LIKE or GLOB operator.
Vˆ{9‚qreleaselog/3_16_0.html3.16.0Changed the default configuration of the <a href="../malloc.html#lookaside">lookaside memory allocator</a> from
    500 slots of 128 bytes each into 125 slots of 512 bytes each.
=ˆz9‚?releaselog/3_16_0.html3.16.0Enhance the <a href="../lang_datefunc.html">date and time functions</a> so that the 'unixepoch' modifier works
    for the full span of supported dates.
aˆy9ƒreleaselog/3_16_0.html3.16.0Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfignockptonclose">SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE</a> option to <a href="../c3ref/db_config.html">sqlite3_db_config()</a>.

Ày
Ç÷
•       ]f(ÿgzÀ6‰9‚1releaselog/3_15_2.html3.15.2 Fix a crash that can occur following an out-of-memory condition
     in the built-in <a href="../lang_corefunc.html#instr">instr()</a> function.
i‰9ƒreleaselog/3_15_2.html3.15.2 Fix a NULL pointer dereference in ATTACH/DETACH following a maliciously constructed
     syntax error.  Ticket 
     <a href="https://www.sqlite.org/src/info/2f1b168ab4d4844">2f1b168ab4d4844</a>.
‰9        oreleaselog/3_15_2.html3.15.2 Multiple bug fixes to the <a href="../rowvalue.html">row value</a> logic that was introduced in version 3.15.0.
‚‰9ƒcreleaselog/3_15_2.html3.15.2 Fix a case where the use of <a href="../rowvalue.html">row values</a> in the ON clause of a LEFT JOIN
     might cause incorrect results.  Ticket
     <a href="https://www.sqlite.org/src/info/fef4bb4bd9185ec8f">fef4bb4bd9185ec8f</a>.
‚‰9ƒireleaselog/3_15_2.html3.15.2 Fix a case (present since 3.8.0 - 2013-08-26) 
     where OR-connected terms in the ON clause of a LEFT JOIN
     might cause incorrect results.  Ticket
     <a href="https://www.sqlite.org/src/info/34a579141b2c5ac">34a579141b2c5ac</a>.
‚:‰9„9releaselog/3_15_2.html3.15.2 Fix the <a href="../lang_vacuum.html">VACUUM</a> command so that it spills excess content to disk rather
     than holding everything in memory, and possible causing an out-of-memory
     error for larger database files.  This fixes an issue introduced by
     version 3.15.0.
.‰9        ‚#releaselog/3_15_2.html3.15.2 Added <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlwin32gethandle">SQLITE_FCNTL_WIN32_GET_HANDLE</a> file control opcode.
‚A‰9„Greleaselog/3_15_2.html3.15.2
 Make sure the ORDER BY LIMIT optimization 
     (from check-in <a href="https://www.sqlite.org/src/info/559733b09e9630fa">559733b09e</a>)
     works with IN operators on INTEGER PRIMARY KEYs.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/96c1454cbfd9509">96c1454c</a>
‚D‰9„Mreleaselog/3_15_2.html3.15.2 Ensure that the <a href="../autoinc.html">AUTOINCREMENT</a> counters in the sqlite_sequence
     table are initialized doing "Xfer Optimization" on "INSERT ... SELECT"
     statements.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/7b3328086a5c116c">7b3328086a5c116c</a>.
l‰9ƒreleaselog/3_15_2.html3.15.2 Skip NULL entries on range queries in <a href="../expridx.html">indexes on expressions</a>.
     Fix for ticket
     <a href="https://www.sqlite.org/src/tktview/4baa46491212947">4baa46491212947</a>.
‚‰9„releaselog/3_15_2.html3.15.2
 Correct handling of columns with redundant unique indexes when those
     columns are used on the LHS of an <a href="../lang_expr.html#in_op">IN operator</a>.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/0eab1ac759">0eab1ac759</a>.
‰9ƒUreleaselog/3_15_2.html3.15.2    The multiply operator now correctly detects 64-bit integer overflow
     and promotes to floating point in all corner-cases.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/1ec41379c9c1e400">1ec41379c9c1e400</a>.
‚‰9ƒEreleaselog/3_15_2.html3.15. Miscellaneous micro-optimizations reduce CPU usage by more than 7%
     on common workloads.  Most optimization in this release has been on the
     front-end (<a href="../c3ref/prepare.html">sqlite3_prepare_v2()</a>).
.‰9‚!releaselog/3_15_2.html3.15.2 Enhance the <a href="../fts5.html#the_fts5vocab_virtual_table_module">fts5vocab</a> virtual table to handle "ORDER BY term" efficiently.
ƒ‰9…Kreleaselog/3_15_2.html3.15.2 Enhancements to the <a href="../cli.html">command-line shell</a>:
     <ol type="a">
     <li> Add the ".testcase" and ".check" <a href="../cli.html#dotcmd">dot-commands</a>.
     </li><li> Added the --new option to the ".open" dot-command, causing
          any prior content in the database to be purged prior to
          opening.
     </li></ol>

ŸAÉd
F¸w        ð       :.ÔÝŸ‚:‰.9„9releaselog/3_15_1.html3.15.1 Fix the <a href="../lang_vacuum.html">VACUUM</a> command so that it spills excess content to disk rather
     than holding everything in memory, and possible causing an out-of-memory
     error for larger database files.  This fixes an issue introduced by
     version 3.15.0.
.‰-9        ‚#releaselog/3_15_1.html3.15.1 Added <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlwin32gethandle">SQLITE_FCNTL_WIN32_GET_HANDLE</a> file control opcode.
‚A‰,9„Greleaselog/3_15_1.html3.15.1
 Make sure the ORDER BY LIMIT optimization 
     (from check-in <a href="https://www.sqlite.org/src/info/559733b09e9630fa">559733b09e</a>)
     works with IN operators on INTEGER PRIMARY KEYs.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/96c1454cbfd9509">96c1454c</a>
‚D‰+9„Mreleaselog/3_15_1.html3.15.1 Ensure that the <a href="../autoinc.html">AUTOINCREMENT</a> counters in the sqlite_sequence
     table are initialized doing "Xfer Optimization" on "INSERT ... SELECT"
     statements.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/7b3328086a5c116c">7b3328086a5c116c</a>.
l‰*9ƒreleaselog/3_15_1.html3.15.1 Skip NULL entries on range queries in <a href="../expridx.html">indexes on expressions</a>.
     Fix for ticket
     <a href="https://www.sqlite.org/src/tktview/4baa46491212947">4baa46491212947</a>.
‚‰)9„releaselog/3_15_1.html3.15.1
 Correct handling of columns with redundant unique indexes when those
     columns are used on the LHS of an <a href="../lang_expr.html#in_op">IN operator</a>.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/0eab1ac759">0eab1ac759</a>.
‰(9ƒUreleaselog/3_15_1.html3.15.1    The multiply operator now correctly detects 64-bit integer overflow
     and promotes to floating point in all corner-cases.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/1ec41379c9c1e400">1ec41379c9c1e400</a>.
‚‰'9ƒEreleaselog/3_15_1.html3.15. Miscellaneous micro-optimizations reduce CPU usage by more than 7%
     on common workloads.  Most optimization in this release has been on the
     front-end (<a href="../c3ref/prepare.html">sqlite3_prepare_v2()</a>).
.‰&9‚!releaselog/3_15_1.html3.15.1 Enhance the <a href="../fts5.html#the_fts5vocab_virtual_table_module">fts5vocab</a> virtual table to handle "ORDER BY term" efficiently.
ƒ‰%9…Kreleaselog/3_15_1.html3.15.1 Enhancements to the <a href="../cli.html">command-line shell</a>:
     <ol type="a">
     <li> Add the ".testcase" and ".check" <a href="../cli.html#dotcmd">dot-commands</a>.
     </li><li> Added the --new option to the ".open" dot-command, causing
          any prior content in the database to be purged prior to
          opening.
     </li></ol>
‰$9}releaselog/3_15_1.html3.15.1 Added the ability to <a href="../lang_vacuum.html">VACUUM</a> an <a href="../lang_attach.html">ATTACH-ed</a> database.
‰#9releaselog/3_15_1.html3.15.1 Added support for <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigmaindbname">SQLITE_DBCONFIG_MAINDBNAME</a>.

‰"9Yreleaselog/3_15_1.html3.15.1 Added the "<a href="../uri.html#urimodeof">modeof=<i>filename</i></a>" URI parameter on the unix VFS
6‰!9‚1releaselog/3_15_1.html3.15.1 Allow <a href="../deterministic.html">deterministic SQL functions</a> in the WHERE clause of a <a href="../partialindex.html">partial index</a>.
a‰ 9        releaselog/3_15_1.html3.15.1 Added support for <a href="../rowvalue.html">row values</a>.
b‰9       releaselog/3_15_2.html3.15.2SHA1 for sqlite3.c: 06d77b42a3e70609f8d4bbb97caf53652f1082cb

u‰9/releaselog/3_15_2.html3.15.2SQLITE_SOURCE_ID: "2016-11-28 19:13:37 bbd85d235f7037c6a033a9690534391ffeacecc8"
;‰9‚;releaselog/3_15_2.html3.15.2 In the <a href="../json1.html">JSON extension</a>, fix the JSON validator so that it correctly rejects
     invalid backslash escapes within strings.

Hê
×
_ú–ÜN
-
†ÔÐÄ¢²j%-Hb‰A9  releaselog/3_15_0.html3.15.0SHA1 for sqlite3.c: fba106f8f6493c66eeed08a2dfff0907de54ae76

u‰@9/releaselog/3_15_0.html3.15.0SQLITE_SOURCE_ID: "2016-10-14 10:20:30 707875582fcba352b4906a595ad89198d84711d8"
‚A‰?9„Greleaselog/3_15_0.html3.15.0
 Make sure the ORDER BY LIMIT optimization 
     (from check-in <a href="https://www.sqlite.org/src/info/559733b09e9630fa">559733b09e</a>)
     works with IN operators on INTEGER PRIMARY KEYs.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/96c1454cbfd9509">96c1454c</a>
‚D‰>9„Mreleaselog/3_15_0.html3.15.0 Ensure that the <a href="../autoinc.html">AUTOINCREMENT</a> counters in the sqlite_sequence
     table are initialized doing "Xfer Optimization" on "INSERT ... SELECT"
     statements.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/7b3328086a5c116c">7b3328086a5c116c</a>.
l‰=9ƒreleaselog/3_15_0.html3.15.0 Skip NULL entries on range queries in <a href="../expridx.html">indexes on expressions</a>.
     Fix for ticket
     <a href="https://www.sqlite.org/src/tktview/4baa46491212947">4baa46491212947</a>.
‚‰<9„releaselog/3_15_0.html3.15.0
 Correct handling of columns with redundant unique indexes when those
     columns are used on the LHS of an <a href="../lang_expr.html#in_op">IN operator</a>.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/0eab1ac759">0eab1ac759</a>.
‰;9ƒUreleaselog/3_15_0.html3.15.0    The multiply operator now correctly detects 64-bit integer overflow
     and promotes to floating point in all corner-cases.  Fix for ticket
     <a href="https://www.sqlite.org/src/info/1ec41379c9c1e400">1ec41379c9c1e400</a>.
‚‰:9ƒEreleaselog/3_15_0.html3.15. Miscellaneous micro-optimizations reduce CPU usage by more than 7%
     on common workloads.  Most optimization in this release has been on the
     front-end (<a href="../c3ref/prepare.html">sqlite3_prepare_v2()</a>).
.‰99‚!releaselog/3_15_0.html3.15.0 Enhance the <a href="../fts5.html#the_fts5vocab_virtual_table_module">fts5vocab</a> virtual table to handle "ORDER BY term" efficiently.
ƒ‰89…Kreleaselog/3_15_0.html3.15.0 Enhancements to the <a href="../cli.html">command-line shell</a>:
     <ol type="a">
     <li> Add the ".testcase" and ".check" <a href="../cli.html#dotcmd">dot-commands</a>.
     </li><li> Added the --new option to the ".open" dot-command, causing
          any prior content in the database to be purged prior to
          opening.
     </li></ol>
‰79}releaselog/3_15_0.html3.15.0 Added the ability to <a href="../lang_vacuum.html">VACUUM</a> an <a href="../lang_attach.html">ATTACH-ed</a> database.
‰69releaselog/3_15_0.html3.15.0 Added support for <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigmaindbname">SQLITE_DBCONFIG_MAINDBNAME</a>.

‰59Yreleaselog/3_15_0.html3.15.0 Added the "<a href="../uri.html#urimodeof">modeof=<i>filename</i></a>" URI parameter on the unix VFS
6‰49‚1releaselog/3_15_0.html3.15.0 Allow <a href="../deterministic.html">deterministic SQL functions</a> in the WHERE clause of a <a href="../partialindex.html">partial index</a>.
a‰39        releaselog/3_15_0.html3.15.0 Added support for <a href="../rowvalue.html">row values</a>.
b‰29       releaselog/3_15_1.html3.15.1SHA1 for sqlite3.c: e7c26a7be3e431dd06898f8d262c4ef240c07366

u‰19/releaselog/3_15_1.html3.15.1SQLITE_SOURCE_ID: "2016-11-04 12:08:49 1136863c76576110e710dd5d69ab6bf347c65e36"
‚‰09ƒcreleaselog/3_15_1.html3.15.1 Fix a case where the use of <a href="../rowvalue.html">row values</a> in the ON clause of a LEFT JOIN
     might cause incorrect results.  Ticket
     <a href="https://www.sqlite.org/src/info/fef4bb4bd9185ec8f">fef4bb4bd9185ec8f</a>.
‚‰/9ƒireleaselog/3_15_1.html3.15.1 Fix a case (present since 3.8.0 - 2013-08-26) 
     where OR-connected terms in the ON clause of a LEFT JOIN
     might cause incorrect results.  Ticket
     <a href="https://www.sqlite.org/src/info/34a579141b2c5ac">34a579141b2c5ac</a>.

Ù‰
×
Š†
        *R™È”hÙ‰S9[releaselog/3_14_2.html3.14.2Disable the <a href="../c3ref/set_authorizer.html">authorizer callback</a> while reparsing the schema.
‰R9‚releaselog/3_14_2.html3.14.2Added the <a href="../json1.html#jquote">json_quote()</a> SQL function to <a href="../json1.html">the json1 extension</a>.
ƒ‰Q9…Oreleaselog/3_14_2.html3.14.2Added two new C-language interfaces: <a href="../c3ref/expanded_sql.html">sqlite3_expanded_sql()</a> and
    <a href="../c3ref/trace_v2.html">sqlite3_trace_v2()</a>.  These new interfaces subsume the functions of
    <a href="../c3ref/profile.html">sqlite3_trace()</a> and <a href="../c3ref/profile.html">sqlite3_profile()</a> which are now deprecated.
n‰P9!releaselog/3_14_2.html3.14.2Created the <a href="../dbhash.html">dbhash.exe</a> command-line utility.
?‰O9‚Creleaselog/3_14_2.html3.14.2Allow <a href="../vtab.html#tabfunc2">table-valued functions</a> to appear on the right-hand side of an <a href="../lang_expr.html#in_op">IN operator</a>.
M‰N9‚_releaselog/3_14_2.html3.14.2
The query planner uses a full scan of a <a href="../partialindex.html">partial index</a> instead of a 
    full scan of the main table, in cases where that makes sense.
5‰M9‚/releaselog/3_14_2.html3.14.2Added the "win32-none" VFS, analogous to the "unix-none" VFS, that works like
    the default "win32" VFS except that it ignores all file locks.
T‰L9‚mreleaselog/3_14_2.html3.14.2Enhance <a href="../pragma.html#pragma_table_info">PRAGMA table_info</a> so that it provides information about
    <a href="../vtab.html#epovtab">eponymous virtual tables</a>.
S‰K9‚kreleaselog/3_14_2.html3.14.2
The <a href="../pragma.html#pragma_compile_options">PRAGMA compile_options</a> command now attempts to show the version number
    of the compiler that generated the library.
‰J9ireleaselog/3_14_2.html3.14.2 Enhancements to <a href="../lemon.html">Lemon parser generator</a>, so that it generates a
    faster parser.
?‰I9‚Creleaselog/3_14_2.html3.14.Improved algorithm for running queries with both an ORDER BY and a LIMIT where
    only the inner-most loop naturally generates rows in the correct order.
‚B‰H9„Ireleaselog/3_14_2.html3.14.2Add the 
    <a href="https://www.sqlite.org/src/artifact?ci=trunk&filename=ext/misc/vfsstat.c">vfsstat.c</a>
    loadable extension - a VFS shim that measures I/O
    together with an <a href="../vtab.html#epovtab">eponymous virtual table</a> that provides access to the measurements.
b‰G9ƒ      releaselog/3_14_2.html3.14.2Added the <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuscacheusedshared">SQLITE_DBSTATUS_CACHE_USED_SHARED</a> option to <a href="../c3ref/db_status.html">sqlite3_db_status()</a>.
‚‰F9ƒEreleaselog/3_14_2.html3.14.2Enabled <a href="../loadext.html#persist">persistent loadable extensions</a> using the new
    <a href="../rescode.html#ok_load_permanently">SQLITE_OK_LOAD_PERMANENTLY</a> return code from the extension
    entry point.
u‰E9/releaselog/3_14_2.html3.14.2Added the <a href="../carray.html">carray() table-valued function</a> extension.
Q‰D9‚greleaselog/3_14_2.html3.14.2Added the <a href="../csv.html">CSV virtual table</a> for reading
    <a href="https://www.ietf.org/rfc/rfc4180.txt">RFC 4180</a> formatted comma-separated
    value files.
ƒ.‰C9†!releaselog/3_14_2.html3.14.2Improved the query planner so that the <a href="../optoverview.html#or_opt">OR optimization</a> can
    be used on <a href="../vtab.html">virtual tables</a> even if one or more of the disjuncts
    use the <a href="../lang_expr.html#like">LIKE</a>, <a href="../lang_expr.html#glob">GLOB</a>, <a href="../lang_expr.html#regexp">REGEXP</a>, <a href="../lang_expr.html#match">MATCH</a> operators.
t‰B9 /releaselog/3_14_2.html3.14.2Added support for <a href="../vtab.html#worid">WITHOUT ROWID virtual tables</a>.

Tô
^Q
£       ‹       ®Ç±@BZâ}Tƒ.‰d9†!releaselog/3_14_1.html3.14.1Improved the query planner so that the <a href="../optoverview.html#or_opt">OR optimization</a> can
    be used on <a href="../vtab.html">virtual tables</a> even if one or more of the disjuncts
    use the <a href="../lang_expr.html#like">LIKE</a>, <a href="../lang_expr.html#glob">GLOB</a>, <a href="../lang_expr.html#regexp">REGEXP</a>, <a href="../lang_expr.html#match">MATCH</a> operators.
t‰c9 /releaselog/3_14_1.html3.14.1Added support for <a href="../vtab.html#worid">WITHOUT ROWID virtual tables</a>.
b‰b9       releaselog/3_14_2.html3.14.2    SHA1 for sqlite3.c: bcc4a1989db45e7f223191f2d0f66c1c28946383

u‰a9/releaselog/3_14_2.html3.14.SQLITE_SOURCE_ID: "2016-09-12 18:50:49 29dbef4b8585f753861a36d6dd102ca634197bd6"
d‰`9ƒ
releaselog/3_14_2.html3.14.2 Fix an internal code generator problem that was causing some <a href="../lang_delete.html">DELETE</a> operations
to no-op.  Ticket <a href="https://sqlite.org/src/info/ef360601">ef360601</a>
z‰_9ƒ9releaselog/3_14_2.html3.14.2 The ORDER BY LIMIT optimization is not valid unless the inner-most IN operator 
loop is actually used by the query plan. Fix for
ticket <a href="https://sqlite.org/src/info/0c4df46116e90f92">0c4df46116e90f92</a>.
>‰^9‚Areleaselog/3_14_2.html3.14.2 Correct affinity computations for a SELECT on the RHS of an IN operator.
Fix for ticket <a href="https://sqlite.org/src/info/199df4168c">199df4168c</a>.
+‰]9‚releaselog/3_14_2.html3.14.2 Fix the ".read" command in the <a href="../cli.html">command-line shell</a> so that it understands
that its input is not interactive.
‚‰\9ƒireleaselog/3_14_2.html3.14.2 Fix commenting errors and improve the comments generated on <a href="../lang_explain.html">EXPLAIN</a> listings
when the <a href="../compile.html#enable_explain_comments">-DSQLITE_ENABLE_EXPLAIN_COMMENTS</a> compile-time option is used.
c‰[9ƒreleaselog/3_14_2.html3.14.2 Fix the <a href="../c3ref/trace_v2.html">sqlite3_trace_v2()</a> interface so that it is disabled if either the
callback or the mask arguments are zero, in accordance with the documentation.
q‰Z9 )releaselog/3_14_2.html3.14.2 Improved support for using the STDCALL calling convention in winsqlite3.dll.
f‰Y9releaselog/3_14_2.html3.14.2Fix to the --rbu option of <a href="../sqldiff.html">sqldiff</a>.
‚‰X9        ƒoreleaselog/3_14_2.html3.14.2A performance enhancement to the page-cache "truncate" operation
    reduces <a href="../lang_transaction.html">COMMIT</a> time by dozens of milliseconds on systems with a
    large <a href="../pragma.html#pragma_cache_size">page cache</a>.
ƒ*‰W9†releaselog/3_14_2.html3.14.2Improved the cost estimation for an index scan which includes a WHERE clause
    that can be partially or fully evaluated using columns in the index and without
    having to do a table lookup.  This fixes a performance regression that occurred
    for some obscure queries following the ORDER BY LIMIT optimization introduced
    in <a href="../releaselog/3_12_0.html">version 3.12.0</a>.
‚       ‰V9ƒWreleaselog/3_14_2.html3.14.2Fix a NULL-pointer dereference/crash that could occurs when a transitive WHERE
    clause references a non-existent collating sequence.  Ticket
    <a href="https://www.sqlite.org/src/info/e8d439c77685eca6">e8d439c77685eca6</a>.
ƒ‰U9…ireleaselog/3_14_2.html3.14.2Fix the <a href="../lang_altertable.html">ALTER TABLE</a> command so that it does not corrupt <a href="../lang_createindex.html#descidx">descending indexes</a>
    when adding a column to a <a href="../pragma.html#pragma_legacy_file_format">legacy file format</a> database.  Ticket
    <a href="https://www.sqlite.org/src/info/f68bf68513a1c15f">f68bf68513a1c15f</a>
‰T9ƒUreleaselog/3_14_2.html3.14.2Added the <a href="../compile.html#enable_unknown_sql_function">SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION</a> compile-time option and turned that
    option on by default when building the <a href="../cli.html">command-line shell</a>.

`+³
¯Ƀ
À
*       {Âñ.½4‘ö`ƒ‰v9…ireleaselog/3_14_1.html3.14.1Fix the <a href="../lang_altertable.html">ALTER TABLE</a> command so that it does not corrupt <a href="../lang_createindex.html#descidx">descending indexes</a>
    when adding a column to a <a href="../pragma.html#pragma_legacy_file_format">legacy file format</a> database.  Ticket
    <a href="https://www.sqlite.org/src/info/f68bf68513a1c15f">f68bf68513a1c15f</a>
‰u9ƒUreleaselog/3_14_1.html3.14.1Added the <a href="../compile.html#enable_unknown_sql_function">SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION</a> compile-time option and turned that
    option on by default when building the <a href="../cli.html">command-line shell</a>.
‰t9[releaselog/3_14_1.html3.14.1Disable the <a href="../c3ref/set_authorizer.html">authorizer callback</a> while reparsing the schema.
‰s9‚releaselog/3_14_1.html3.14.1Added the <a href="../json1.html#jquote">json_quote()</a> SQL function to <a href="../json1.html">the json1 extension</a>.
ƒ‰r9…Oreleaselog/3_14_1.html3.14.1Added two new C-language interfaces: <a href="../c3ref/expanded_sql.html">sqlite3_expanded_sql()</a> and
    <a href="../c3ref/trace_v2.html">sqlite3_trace_v2()</a>.  These new interfaces subsume the functions of
    <a href="../c3ref/profile.html">sqlite3_trace()</a> and <a href="../c3ref/profile.html">sqlite3_profile()</a> which are now deprecated.
n‰q9!releaselog/3_14_1.html3.14.1Created the <a href="../dbhash.html">dbhash.exe</a> command-line utility.
?‰p9‚Creleaselog/3_14_1.html3.14.1Allow <a href="../vtab.html#tabfunc2">table-valued functions</a> to appear on the right-hand side of an <a href="../lang_expr.html#in_op">IN operator</a>.
M‰o9‚_releaselog/3_14_1.html3.14.1
The query planner uses a full scan of a <a href="../partialindex.html">partial index</a> instead of a 
    full scan of the main table, in cases where that makes sense.
5‰n9‚/releaselog/3_14_1.html3.14.1Added the "win32-none" VFS, analogous to the "unix-none" VFS, that works like
    the default "win32" VFS except that it ignores all file locks.
T‰m9‚mreleaselog/3_14_1.html3.14.1Enhance <a href="../pragma.html#pragma_table_info">PRAGMA table_info</a> so that it provides information about
    <a href="../vtab.html#epovtab">eponymous virtual tables</a>.
S‰l9‚kreleaselog/3_14_1.html3.14.1
The <a href="../pragma.html#pragma_compile_options">PRAGMA compile_options</a> command now attempts to show the version number
    of the compiler that generated the library.
‰k9ireleaselog/3_14_1.html3.14.1 Enhancements to <a href="../lemon.html">Lemon parser generator</a>, so that it generates a
    faster parser.
?‰j9‚Creleaselog/3_14_1.html3.14.Improved algorithm for running queries with both an ORDER BY and a LIMIT where
    only the inner-most loop naturally generates rows in the correct order.
‚B‰i9„Ireleaselog/3_14_1.html3.14.1Add the 
    <a href="https://www.sqlite.org/src/artifact?ci=trunk&filename=ext/misc/vfsstat.c">vfsstat.c</a>
    loadable extension - a VFS shim that measures I/O
    together with an <a href="../vtab.html#epovtab">eponymous virtual table</a> that provides access to the measurements.
b‰h9ƒ      releaselog/3_14_1.html3.14.1Added the <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuscacheusedshared">SQLITE_DBSTATUS_CACHE_USED_SHARED</a> option to <a href="../c3ref/db_status.html">sqlite3_db_status()</a>.
‚‰g9ƒEreleaselog/3_14_1.html3.14.1Enabled <a href="../loadext.html#persist">persistent loadable extensions</a> using the new
    <a href="../rescode.html#ok_load_permanently">SQLITE_OK_LOAD_PERMANENTLY</a> return code from the extension
    entry point.
u‰f9/releaselog/3_14_1.html3.14.1Added the <a href="../carray.html">carray() table-valued function</a> extension.
Q‰e9‚greleaselog/3_14_1.html3.14.1Added the <a href="../csv.html">CSV virtual table</a> for reading
    <a href="https://www.ietf.org/rfc/rfc4180.txt">RFC 4180</a> formatted comma-separated
    value files.

°ó
E-ÄL
ç
ÆõŸ]ž9e°15‚/releaselog/3_14.html3.14Added the "win32-none" VFS, analogous to the "unix-none" VFS, that works like
    the default "win32" VFS except that it ignores all file locks.
PŠ5‚mreleaselog/3_14.html3.14Enhance <a href="../pragma.html#pragma_table_info">PRAGMA table_info</a> so that it provides information about
    <a href="../vtab.html#epovtab">eponymous virtual tables</a>.
OŠ5‚kreleaselog/3_14.html3.14
The <a href="../pragma.html#pragma_compile_options">PRAGMA compile_options</a> command now attempts to show the version number
    of the compiler that generated the library.
Š5ireleaselog/3_14.html3.14     Enhancements to <a href="../lemon.html">Lemon parser generator</a>, so that it generates a
    faster parser.
;Š5‚Creleaselog/3_14.html3.1Improved algorithm for running queries with both an ORDER BY and a LIMIT where
    only the inner-most loop naturally generates rows in the correct order.
‚>Š5„Ireleaselog/3_14.html3.14Add the 
    <a href="https://www.sqlite.org/src/artifact?ci=trunk&filename=ext/misc/vfsstat.c">vfsstat.c</a>
    loadable extension - a VFS shim that measures I/O
    together with an <a href="../vtab.html#epovtab">eponymous virtual table</a> that provides access to the measurements.
^Š5ƒ      releaselog/3_14.html3.14Added the <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuscacheusedshared">SQLITE_DBSTATUS_CACHE_USED_SHARED</a> option to <a href="../c3ref/db_status.html">sqlite3_db_status()</a>.
|Š5ƒEreleaselog/3_14.html3.14Enabled <a href="../loadext.html#persist">persistent loadable extensions</a> using the new
    <a href="../rescode.html#ok_load_permanently">SQLITE_OK_LOAD_PERMANENTLY</a> return code from the extension
    entry point.
qŠ5/releaselog/3_14.html3.14Added the <a href="../carray.html">carray() table-valued function</a> extension.
M‰5‚greleaselog/3_14.html3.14Added the <a href="../csv.html">CSV virtual table</a> for reading
    <a href="https://www.ietf.org/rfc/rfc4180.txt">RFC 4180</a> formatted comma-separated
    value files.
ƒ*‰~5†!releaselog/3_14.html3.14Improved the query planner so that the <a href="../optoverview.html#or_opt">OR optimization</a> can
    be used on <a href="../vtab.html">virtual tables</a> even if one or more of the disjuncts
    use the <a href="../lang_expr.html#like">LIKE</a>, <a href="../lang_expr.html#glob">GLOB</a>, <a href="../lang_expr.html#regexp">REGEXP</a>, <a href="../lang_expr.html#match">MATCH</a> operators.
p‰}5 /releaselog/3_14.html3.14Added support for <a href="../vtab.html#worid">WITHOUT ROWID virtual tables</a>.
b‰|9       releaselog/3_14_1.html3.14.1SHA1 for sqlite3.c: d545b24892278272ce4e40e0567d69c8babf12ea

u‰{9/releaselog/3_14_1.html3.14.1SQLITE_SOURCE_ID: "2016-08-11 18:53:32 a12d8059770df4bca59e321c266410344242bf7b"
f‰z9releaselog/3_14_1.html3.14.1Fix to the --rbu option of <a href="../sqldiff.html">sqldiff</a>.
‚‰y9        ƒoreleaselog/3_14_1.html3.14.1A performance enhancement to the page-cache "truncate" operation
    reduces <a href="../lang_transaction.html">COMMIT</a> time by dozens of milliseconds on systems with a
    large <a href="../pragma.html#pragma_cache_size">page cache</a>.
ƒ*‰x9†releaselog/3_14_1.html3.14.1Improved the cost estimation for an index scan which includes a WHERE clause
    that can be partially or fully evaluated using columns in the index and without
    having to do a table lookup.  This fixes a performance regression that occurred
    for some obscure queries following the ORDER BY LIMIT optimization introduced
    in <a href="../releaselog/3_12_0.html">version 3.12.0</a>.
‚       ‰w9ƒWreleaselog/3_14_1.html3.14.1Fix a NULL-pointer dereference/crash that could occurs when a transitive WHERE
    clause references a non-existent collating sequence.  Ticket
    <a href="https://www.sqlite.org/src/info/e8d439c77685eca6">e8d439c77685eca6</a>.

G3t‚ãX
¾µ—6‰™ÔÆ;GpŠ9ƒ%releaselog/3_13_0.html3.13.0Improved resistance against goofy query planner decisions caused by
    incomplete or incorrect modifications to the <a href="../fileformat2.html#stat1tab">sqlite_stat1</a> 
    table by the application.
Š9Sreleaselog/3_13_0.html3.13.0Improved unicode filename handling in the <a href="../cli.html">command-line shell</a> on Windows.
‚
Š9ƒYreleaselog/3_13_0.html3.13.0Added the ".eqp full" option to the <a href="../cli.html">command-line shell</a>, that does both <a href="../lang_explain.html">EXPLAIN</a>
    and <a href="../eqp.html">EXPLAIN QUERY PLAN</a> on each statement that is evaluated.
AŠ9‚Greleaselog/3_13_0.html3.13.0Added the "--indent" option to the ".schema" and ".fullschema" commands of
    the <a href="../cli.html">command-line shell</a>, to turn on pretty-printing.
zŠ99releaselog/3_13_0.html3.13.0Added the ".auth ON|OFF" command to the <a href="../cli.html">command-line shell</a>.
pŠ9%releaselog/3_13_0.html3.13.0Merged the <a href="../sessionintro.html">session</a> extension into trunk.
)Š9        ‚releaselog/3_13_0.html3.13.0Postpone I/O associated with TEMP files for as long as possible, with the hope
    that the I/O can ultimately be avoided completely.
^Š5       releaselog/3_14.html3.14SHA1 for sqlite3.c: 234a3275d03a287434ace3ccdf1afb208e6b0e92

qŠ5/releaselog/3_14.html3.14SQLITE_SOURCE_ID: "2016-08-08 13:40:27 d5e98057028abcf7217d0d2b2e29bbbcdf09d6de"
ƒ&Š5†releaselog/3_14.html3.14Improved the cost estimation for an index scan which includes a WHERE clause
    that can be partially or fully evaluated using columns in the index and without
    having to do a table lookup.  This fixes a performance regression that occurred
    for some obscure queries following the ORDER BY LIMIT optimization introduced
    in <a href="../releaselog/3_12_0.html">version 3.12.0</a>.
‚Š5ƒWreleaselog/3_14.html3.14Fix a NULL-pointer dereference/crash that could occurs when a transitive WHERE
    clause references a non-existent collating sequence.  Ticket
    <a href="https://www.sqlite.org/src/info/e8d439c77685eca6">e8d439c77685eca6</a>.
ƒŠ5…ireleaselog/3_14.html3.14Fix the <a href="../lang_altertable.html">ALTER TABLE</a> command so that it does not corrupt <a href="../lang_createindex.html#descidx">descending indexes</a>
    when adding a column to a <a href="../pragma.html#pragma_legacy_file_format">legacy file format</a> database.  Ticket
    <a href="https://www.sqlite.org/src/info/f68bf68513a1c15f">f68bf68513a1c15f</a>
‚Š5ƒUreleaselog/3_14.html3.14Added the <a href="../compile.html#enable_unknown_sql_function">SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION</a> compile-time option and turned that
    option on by default when building the <a href="../cli.html">command-line shell</a>.
Š5[releaselog/3_14.html3.14Disable the <a href="../c3ref/set_authorizer.html">authorizer callback</a> while reparsing the schema.
Š
5‚releaselog/3_14.html3.14Added the <a href="../json1.html#jquote">json_quote()</a> SQL function to <a href="../json1.html">the json1 extension</a>.
ƒŠ5…Oreleaselog/3_14.html3.14Added two new C-language interfaces: <a href="../c3ref/expanded_sql.html">sqlite3_expanded_sql()</a> and
    <a href="../c3ref/trace_v2.html">sqlite3_trace_v2()</a>.  These new interfaces subsume the functions of
    <a href="../c3ref/profile.html">sqlite3_trace()</a> and <a href="../c3ref/profile.html">sqlite3_profile()</a> which are now deprecated.
jŠ5!releaselog/3_14.html3.14Created the <a href="../dbhash.html">dbhash.exe</a> command-line utility.
;Š
5‚Creleaselog/3_14.html3.14Allow <a href="../vtab.html#tabfunc2">table-valued functions</a> to appear on the right-hand side of an <a href="../lang_expr.html#in_op">IN operator</a>.
IŠ     5‚_releaselog/3_14.html3.14
The query planner uses a full scan of a <a href="../partialindex.html">partial index</a> instead of a 
    full scan of the main table, in cases where that makes sense.


t$㬠 …£+Än?t‚Š(9ƒureleaselog/3_13_0.html3.13.0Fix a boundary condition error introduced by version 3.12.0
    that can result in a crash during heavy <a href="../lang_savepoint.html">SAVEPOINT</a> usage.
    Ticket <a href="https://www.sqlite.org/src/info/7f7f8026eda38">7f7f8026eda38</a>.
+Š'9‚releaselog/3_13_0.html3.13.0Correctly interpret negative "PRAGMA cache_size" values when determining
    the cache size used for sorting large amounts of data.



‚+Š&9„releaselog/3_13_0.html3.13.0Fix a bug in the code generator that can cause incorrect results if
    two or more <a href="../vtab.html">virtual tables</a> are joined and the virtual table used in
    outer loop of the join has an <a href="../lang_expr.html#in_op">IN operator</a> constraint.
ƒŠ%9…oreleaselog/3_13_0.html3.13.0Fix a bug (present since <a href="../releaselog/3_9_0.html">version 3.9.0</a>) that can cause the <a href="../lang_delete.html">DELETE</a>
    operation to miss rows if <a href="../pragma.html#pragma_reverse_unordered_selects">PRAGMA reverse_unordered_selects</a> is turned on.
    Ticket <a href="https://www.sqlite.org/src/info/a306e56ff68b8fa5">a306e56ff68b8fa5</a>
ƒ9Š$9†7releaselog/3_13_0.html3.13.0Fix a backwards compatibility problem in version 3.12.0 and 3.12.1:
    Columns declared as <tt>"INTEGER" PRIMARY KEY</tt> (with quotes around
    the datatype keyword) were not being recognized as an
    <a href="../lang_createtable.html#rowid">INTEGER PRIMARY KEY</a>, which resulted in an incompatible database file.
    Ticket <a href="https://www.sqlite.org/src/info/7d7525cb01b68">7d7525cb01b68</a>
dŠ#9
releaselog/3_13_0.html3.13.0SHA1 for sqlite3.c: 9b9171b1e6ce7a980e6b714e9c0d9112657ad552



uŠ"9/releaselog/3_13_0.html3.13.0SQLITE_SOURCE_ID: "2016-05-18 10:57:30 fc49f556e48970561d7ab6a2f24fdd7d9eb81ff2"
^Š!9ƒreleaselog/3_13_0.html3.13.0
Fix a locking race condition in Windows that can occur when two or more processes
    attempt to recover the same <a href="../fileformat2.html#hotjrnl">hot journal</a> at the same time.
‚Š 9„releaselog/3_13_0.html3.13.0When checking for the WHERE-clause push-down optimization, verify that all terms
    of the compound inner SELECT are non-aggregate, not just the last term. Fix for ticket
    <a href="https://www.sqlite.org/src/info/f7f8c97e97597">f7f8c97e97597</a>.
„Š9‡Ereleaselog/3_13_0.html3.13.0Fix a possible segfault with DELETE when table is a <a href="../rowidtable.html">rowid table</a> with an 
    <a href="../lang_createtable.html#rowid">INTEGER PRIMARY KEY</a> and the WHERE clause contains a OR and
    the table has one or more indexes that are able to trigger the OR optimization,
    but none of the indexes reference any table columns other than the INTEGER PRIMARY KEY.
    Ticket <a href="https://www.sqlite.org/src/info/16c9801ceba49">16c9801ceba49</a>.
‚3Š9„+releaselog/3_13_0.html3.13.0
Fix a problem with the multi-row one-pass DELETE optimization that was
    causing it to compute incorrect answers with a self-referential subquery in
    the WHERE clause.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/dc6ebeda9396087">dc6ebeda9396087</a>
‚=Š9„?releaselog/3_13_0.html3.13.0 Change the <a href="../tempfiles.html#tempdir">temporary directory search algorithm</a> on Unix to allow directories with
    write and execute permission, but without read permission, to serve as temporary
    directories.  Apply this same standard to the "." fallback directory.
ƒXŠ9†ureleaselog/3_13_0.html3.13.Added the <a href="../c3ref/db_config.html">sqlite3_db_config</a>(db,<a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenableloadextension">SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION</a>) interface
    which allows the <a href="../c3ref/load_extension.html">sqlite3_load_extension()</a> C-API to be enabled while keeping the
    <a href="../lang_corefunc.html#load_extension">load_extension()</a> SQL function disabled for security.

ß@«ä=
¯aQgéÂ;¯ßLŠ79‚]releaselog/3_12_2.html3.12.2
Added the <a href="https://www.sqlite.org/src/artifact/d7cc99350?ln=403-443">sqlite3rbu_bp_progress()</a>
    interface to the <a href="../rbu.html">RBU</a> extension.
Š69…Ureleaselog/3_12_2.html3.12.2Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenablefts3tokenizer">SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</a> option to <a href="../c3ref/db_config.html">sqlite3_db_config()</a>
    which allows the two-argument version of the <a href="../fts3.html#f3tknzr">fts3_tokenizer()</a> SQL function to
    be enabled or disabled at run-time.
Š59Kreleaselog/3_12_2.html3.12.2Other miscellaneous micro-optimizations for improved performance and reduced
    memory usage.
ZŠ49{releaselog/3_12_2.html3.12.2
Reduce the amount of memory needed to hold the schema.
FŠ39‚Qreleaselog/3_12_2.html3.12.2 The configure script (on unix) automatically detects
    pread() and pwrite() and sets compile-time options to use those OS
    interfaces if they are available.
{Š29;releaselog/3_12_2.html3.12.The query planner considers the LIMIT clause when estimating the cost
    of ORDER BY.
fŠ19ƒreleaselog/3_12_2.html3.12.2More efficient handling of <a href="../appfunc.html">application-defined SQL functions</a>, especially
    in cases where the application defines hundreds or thousands of 
    custom functions.
‚Š09ƒ]releaselog/3_12_2.html3.12.2The query planner now does a better job of optimizing <a href="../vtab.html">virtual table</a>
    accesses in a 3-way or higher join where constraints on the virtual
    table are split across two or more other tables of the join.
‚JŠ/9„Yreleaselog/3_12_2.html3.12.2The query planner is able to optimize IN operators on <a href="../vtab.html">virtual tables</a>
    even if the <a href="../vtab.html#xbestindex">xBestIndex</a> method does not set the
    sqlite3_index_constraint_usage.omit flag of the
    virtual table column to the left of the IN operator.
„Š.9‡ireleaselog/3_12_2.html3.12.2Only create <a href="../tempfiles.html#stmtjrnl">statement journal</a> files when their size exceeds a threshold.
    Otherwise the journal is held in memory and no I/O occurs.  The threshold
    can be configured at compile-time using <a href="../compile.html#stmtjrnl_spill">SQLITE_STMTJRNL_SPILL</a> or at
    start-time using <a href="../c3ref/config.html">sqlite3_config</a>(<a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigstmtjrnlspill">SQLITE_CONFIG_STMTJRNL_SPILL</a>).
‚tŠ-9…-releaselog/3_12_2.html3.12.2Only create <a href="../tempfiles.html#superjrnl">master journal</a> files if two or more attached databases are all
    modified, do not have <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous</a> set to OFF, and
    do not have the <a href="../pragma.html#pragma_journal_mode">journal_mode</a> set to OFF, MEMORY, or WAL.
#Š,9‚releaselog/3_12_2.html3.12.2Enhancements to the <a href="../lemon.html">Lemon parser generator</a>
    so that it creates a smaller and faster SQL parser.
ƒCŠ+9        †Mreleaselog/3_12_2.html3.12.2The <a href="../compile.html#default_page_size">SQLITE_DEFAULT_PAGE_SIZE</a> is increased from 1024 to 4096.  
    The <a href="../compile.html#default_cache_size">SQLITE_DEFAULT_CACHE_SIZE</a> is changed from 2000 to -2000 so 
    the same amount of cache memory is used by default.
    See the application note on the
    <a href="../pgszchng2016.html">version 3.12.0 page size change</a> for further information.
Š*9greleaselog/3_13_0.html3.13.0Fix the query planner so that IS and IS NULL operators are able
    to drive an index on a LEFT OUTER JOIN.

<Š)9‚=releaselog/3_13_0.html3.13.0Fix <a href="../lang_createview.html">views</a> so that they inherit column datatypes from the 
    table that they are defined against, when possible.

©•Åó
Ô       Æ       
J¶úa2†©bŠG9      releaselog/3_12_2.html3.12.2SHA1 for sqlite3.c: de5a5898ebd3a3477d4652db143746d008b24c83

uŠF9/releaselog/3_12_2.html3.12.2SQLITE_SOURCE_ID: "2016-04-18 17:30:31 92dc59fd5ad66f646666042eb04195e3a61a9e8e"
(ŠE9‚releaselog/3_12_2.html3.12.2Correctly interpret negative "PRAGMA cache_size" values when determining
    the cache size used for sorting large amounts of data.
‚+ŠD9„releaselog/3_12_2.html3.12.2Fix a bug in the code generator that can cause incorrect results if
    two or more <a href="../vtab.html">virtual tables</a> are joined and the virtual table used in
    outer loop of the join has an <a href="../lang_expr.html#in_op">IN operator</a> constraint.
ƒŠC9…oreleaselog/3_12_2.html3.12.2Fix a bug (present since <a href="../releaselog/3_9_0.html">version 3.9.0</a>) that can cause the <a href="../lang_delete.html">DELETE</a>
    operation to miss rows if <a href="../pragma.html#pragma_reverse_unordered_selects">PRAGMA reverse_unordered_selects</a> is turned on.
    Ticket <a href="https://www.sqlite.org/src/info/a306e56ff68b8fa5">a306e56ff68b8fa5</a>
ƒ8ŠB9        †7releaselog/3_12_2.html3.12.2Fix a backwards compatibility problem in version 3.12.0 and 3.12.1:
    Columns declared as <tt>"INTEGER" PRIMARY KEY</tt> (with quotes around
    the datatype keyword) were not being recognized as an
    <a href="../lang_createtable.html#rowid">INTEGER PRIMARY KEY</a>, which resulted in an incompatible database file.
    Ticket <a href="https://www.sqlite.org/src/info/7d7525cb01b68">7d7525cb01b68</a>
ŠA9ereleaselog/3_12_2.html3.12.2Fix the query planner so that IS and IS NULL operators are able
    to drive an index on a LEFT OUTER JOIN.
<Š@9‚=releaselog/3_12_2.html3.12.2Fix <a href="../lang_createview.html">views</a> so that they inherit column datatypes from the 
    table that they are defined against, when possible.
‚Š?9        ƒureleaselog/3_12_2.html3.12.2Fix a boundary condition error introduced by version 3.12.0
    that can result in a crash during heavy <a href="../lang_savepoint.html">SAVEPOINT</a> usage.
    Ticket <a href="https://www.sqlite.org/src/info/7f7f8026eda38">7f7f8026eda38</a>.
Š>9releaselog/3_12_2.html3.12.2Fix a harmless TSAN warning associated with the <a href="../c3ref/db_readonly.html">sqlite3_db_readonly()</a> interface.
‚
Š=9ƒYreleaselog/3_12_2.html3.12.2Fix the code generator for expressions of the form "x IN (SELECT...)" where
    the SELECT statement on the RHS is a correlated subquery.
    Ticket <a href="https://www.sqlite.org/src/info/5e3c886796e5512e">5e3c886796e5512e</a>.
‚Š<9ƒ{releaselog/3_12_2.html3.12.2Make sure the <a href="../c3ref/get_auxdata.html">sqlite3_set_auxdata()</a> values from multiple triggers
    within a single statement do not interfere with one another.
    Ticket <a href="https://www.sqlite.org/src/info/dc9b1c91">dc9b1c91</a>.
NŠ;9‚areleaselog/3_12_2.html3.12.2Enhanced the ".stats" command in the <a href="../cli.html">command-line shell</a> to show more
    information about I/O performance obtained from /proc, when available.
ƒLŠ:9†]releaselog/3_12_2.html3.12.2Added the <a href="../compile.html#default_synchronous">SQLITE_DEFAULT_SYNCHRONOUS</a> and <a href="../compile.html#default_wal_synchronous">SQLITE_DEFAULT_WAL_SYNCHRONOUS</a>
    compile-time options.  The <a href="../compile.html#default_synchronous">SQLITE_DEFAULT_SYNCHRONOUS</a> compile-time option
    replaces the <a href="../compile.html#extra_durable">SQLITE_EXTRA_DURABLE</a> option, which is no longer supported.
yŠ997releaselog/3_12_2.html3.12.2Added the <a href="../c3ref/system_errno.html">sqlite3_system_errno()</a> interface.
kŠ89ƒreleaselog/3_12_2.html3.12.2The <a href="../pragma.html#pragma_defer_foreign_keys">PRAGMA defer_foreign_keys=ON</a> statement now also disables 
    <a href="../foreignkeys.html#fk_actions">RESTRICT actions</a> on foreign key.

É9
’
¶¦¼>t4EÉyŠV97releaselog/3_12_1.html3.12.1Added the <a href="../c3ref/system_errno.html">sqlite3_system_errno()</a> interface.
kŠU9ƒreleaselog/3_12_1.html3.12.1The <a href="../pragma.html#pragma_defer_foreign_keys">PRAGMA defer_foreign_keys=ON</a> statement now also disables 
    <a href="../foreignkeys.html#fk_actions">RESTRICT actions</a> on foreign key.
LŠT9‚]releaselog/3_12_1.html3.12.1
Added the <a href="https://www.sqlite.org/src/artifact/d7cc99350?ln=403-443">sqlite3rbu_bp_progress()</a>
    interface to the <a href="../rbu.html">RBU</a> extension.
ŠS9…Ureleaselog/3_12_1.html3.12.1Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenablefts3tokenizer">SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</a> option to <a href="../c3ref/db_config.html">sqlite3_db_config()</a>
    which allows the two-argument version of the <a href="../fts3.html#f3tknzr">fts3_tokenizer()</a> SQL function to
    be enabled or disabled at run-time.
ŠR9Kreleaselog/3_12_1.html3.12.1Other miscellaneous micro-optimizations for improved performance and reduced
    memory usage.
ZŠQ9{releaselog/3_12_1.html3.12.1
Reduce the amount of memory needed to hold the schema.
FŠP9‚Qreleaselog/3_12_1.html3.12.1 The configure script (on unix) automatically detects
    pread() and pwrite() and sets compile-time options to use those OS
    interfaces if they are available.
{ŠO9;releaselog/3_12_1.html3.12.The query planner considers the LIMIT clause when estimating the cost
    of ORDER BY.
fŠN9ƒreleaselog/3_12_1.html3.12.1More efficient handling of <a href="../appfunc.html">application-defined SQL functions</a>, especially
    in cases where the application defines hundreds or thousands of 
    custom functions.
‚ŠM9ƒ]releaselog/3_12_1.html3.12.1The query planner now does a better job of optimizing <a href="../vtab.html">virtual table</a>
    accesses in a 3-way or higher join where constraints on the virtual
    table are split across two or more other tables of the join.
‚JŠL9„Yreleaselog/3_12_1.html3.12.1The query planner is able to optimize IN operators on <a href="../vtab.html">virtual tables</a>
    even if the <a href="../vtab.html#xbestindex">xBestIndex</a> method does not set the
    sqlite3_index_constraint_usage.omit flag of the
    virtual table column to the left of the IN operator.
„ŠK9‡ireleaselog/3_12_1.html3.12.1Only create <a href="../tempfiles.html#stmtjrnl">statement journal</a> files when their size exceeds a threshold.
    Otherwise the journal is held in memory and no I/O occurs.  The threshold
    can be configured at compile-time using <a href="../compile.html#stmtjrnl_spill">SQLITE_STMTJRNL_SPILL</a> or at
    start-time using <a href="../c3ref/config.html">sqlite3_config</a>(<a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigstmtjrnlspill">SQLITE_CONFIG_STMTJRNL_SPILL</a>).
‚tŠJ9…-releaselog/3_12_1.html3.12.1Only create <a href="../tempfiles.html#superjrnl">master journal</a> files if two or more attached databases are all
    modified, do not have <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous</a> set to OFF, and
    do not have the <a href="../pragma.html#pragma_journal_mode">journal_mode</a> set to OFF, MEMORY, or WAL.
#ŠI9‚releaselog/3_12_1.html3.12.1Enhancements to the <a href="../lemon.html">Lemon parser generator</a>
    so that it creates a smaller and faster SQL parser.
ƒCŠH9        †Mreleaselog/3_12_1.html3.12.1The <a href="../compile.html#default_page_size">SQLITE_DEFAULT_PAGE_SIZE</a> is increased from 1024 to 4096.  
    The <a href="../compile.html#default_cache_size">SQLITE_DEFAULT_CACHE_SIZE</a> is changed from 2000 to -2000 so 
    the same amount of cache memory is used by default.
    See the application note on the
    <a href="../pgszchng2016.html">version 3.12.0 page size change</a> for further information.

H0
^?1
       !©D}Ö^H„Šd9‡ireleaselog/3_12_0.html3.12.0Only create <a href="../tempfiles.html#stmtjrnl">statement journal</a> files when their size exceeds a threshold.
    Otherwise the journal is held in memory and no I/O occurs.  The threshold
    can be configured at compile-time using <a href="../compile.html#stmtjrnl_spill">SQLITE_STMTJRNL_SPILL</a> or at
    start-time using <a href="../c3ref/config.html">sqlite3_config</a>(<a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigstmtjrnlspill">SQLITE_CONFIG_STMTJRNL_SPILL</a>).
‚tŠc9…-releaselog/3_12_0.html3.12.0Only create <a href="../tempfiles.html#superjrnl">master journal</a> files if two or more attached databases are all
    modified, do not have <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous</a> set to OFF, and
    do not have the <a href="../pragma.html#pragma_journal_mode">journal_mode</a> set to OFF, MEMORY, or WAL.
#Šb9‚releaselog/3_12_0.html3.12.0Enhancements to the <a href="../lemon.html">Lemon parser generator</a>
    so that it creates a smaller and faster SQL parser.
ƒCŠa9        †Mreleaselog/3_12_0.html3.12.0The <a href="../compile.html#default_page_size">SQLITE_DEFAULT_PAGE_SIZE</a> is increased from 1024 to 4096.  
    The <a href="../compile.html#default_cache_size">SQLITE_DEFAULT_CACHE_SIZE</a> is changed from 2000 to -2000 so 
    the same amount of cache memory is used by default.
    See the application note on the
    <a href="../pgszchng2016.html">version 3.12.0 page size change</a> for further information.
bŠ`9       releaselog/3_12_1.html3.12.1SHA1 for sqlite3.c: ebb18593350779850e3e1a930eb84a70fca8c1d1

uŠ_9/releaselog/3_12_1.html3.12.1SQLITE_SOURCE_ID: "2016-04-08 15:09:49 fe7d3b75fe1bde41511b323925af8ae1b910bc4d"
Š^9ereleaselog/3_12_1.html3.12.1Fix the query planner so that IS and IS NULL operators are able
    to drive an index on a LEFT OUTER JOIN.
<Š]9‚=releaselog/3_12_1.html3.12.1Fix <a href="../lang_createview.html">views</a> so that they inherit column datatypes from the 
    table that they are defined against, when possible.
‚Š\9        ƒureleaselog/3_12_1.html3.12.1Fix a boundary condition error introduced by version 3.12.0
    that can result in a crash during heavy <a href="../lang_savepoint.html">SAVEPOINT</a> usage.
    Ticket <a href="https://www.sqlite.org/src/info/7f7f8026eda38">7f7f8026eda38</a>.
Š[9releaselog/3_12_1.html3.12.1Fix a harmless TSAN warning associated with the <a href="../c3ref/db_readonly.html">sqlite3_db_readonly()</a> interface.
‚
ŠZ9ƒYreleaselog/3_12_1.html3.12.1Fix the code generator for expressions of the form "x IN (SELECT...)" where
    the SELECT statement on the RHS is a correlated subquery.
    Ticket <a href="https://www.sqlite.org/src/info/5e3c886796e5512e">5e3c886796e5512e</a>.
‚ŠY9ƒ{releaselog/3_12_1.html3.12.1Make sure the <a href="../c3ref/get_auxdata.html">sqlite3_set_auxdata()</a> values from multiple triggers
    within a single statement do not interfere with one another.
    Ticket <a href="https://www.sqlite.org/src/info/dc9b1c91">dc9b1c91</a>.
NŠX9‚areleaselog/3_12_1.html3.12.1Enhanced the ".stats" command in the <a href="../cli.html">command-line shell</a> to show more
    information about I/O performance obtained from /proc, when available.
ƒLŠW9†]releaselog/3_12_1.html3.12.1Added the <a href="../compile.html#default_synchronous">SQLITE_DEFAULT_SYNCHRONOUS</a> and <a href="../compile.html#default_wal_synchronous">SQLITE_DEFAULT_WAL_SYNCHRONOUS</a>
    compile-time options.  The <a href="../compile.html#default_synchronous">SQLITE_DEFAULT_SYNCHRONOUS</a> compile-time option
    replaces the <a href="../compile.html#extra_durable">SQLITE_EXTRA_DURABLE</a> option, which is no longer supported.

x²
¢¸:p
Œ       0AÅõ#öUÝxbŠv9        releaselog/3_12_0.html3.12.0SHA1 for sqlite3.c: cba2be96d27cb51978cd4a200397a4ad178986eb

uŠu9/releaselog/3_12_0.html3.12.0SQLITE_SOURCE_ID: "2016-03-29 10:14:15 e9bb4cf40f4971974a74468ef922bdee481c988b"
Št9releaselog/3_12_0.html3.12.0Fix a harmless TSAN warning associated with the <a href="../c3ref/db_readonly.html">sqlite3_db_readonly()</a> interface.
‚
Šs9ƒYreleaselog/3_12_0.html3.12.0Fix the code generator for expressions of the form "x IN (SELECT...)" where
    the SELECT statement on the RHS is a correlated subquery.
    Ticket <a href="https://www.sqlite.org/src/info/5e3c886796e5512e">5e3c886796e5512e</a>.
‚Šr9ƒ{releaselog/3_12_0.html3.12.0Make sure the <a href="../c3ref/get_auxdata.html">sqlite3_set_auxdata()</a> values from multiple triggers
    within a single statement do not interfere with one another.
    Ticket <a href="https://www.sqlite.org/src/info/dc9b1c91">dc9b1c91</a>.
NŠq9‚areleaselog/3_12_0.html3.12.0Enhanced the ".stats" command in the <a href="../cli.html">command-line shell</a> to show more
    information about I/O performance obtained from /proc, when available.
ƒLŠp9†]releaselog/3_12_0.html3.12.0Added the <a href="../compile.html#default_synchronous">SQLITE_DEFAULT_SYNCHRONOUS</a> and <a href="../compile.html#default_wal_synchronous">SQLITE_DEFAULT_WAL_SYNCHRONOUS</a>
    compile-time options.  The <a href="../compile.html#default_synchronous">SQLITE_DEFAULT_SYNCHRONOUS</a> compile-time option
    replaces the <a href="../compile.html#extra_durable">SQLITE_EXTRA_DURABLE</a> option, which is no longer supported.
yŠo97releaselog/3_12_0.html3.12.0Added the <a href="../c3ref/system_errno.html">sqlite3_system_errno()</a> interface.
kŠn9ƒreleaselog/3_12_0.html3.12.0The <a href="../pragma.html#pragma_defer_foreign_keys">PRAGMA defer_foreign_keys=ON</a> statement now also disables 
    <a href="../foreignkeys.html#fk_actions">RESTRICT actions</a> on foreign key.
LŠm9‚]releaselog/3_12_0.html3.12.0
Added the <a href="https://www.sqlite.org/src/artifact/d7cc99350?ln=403-443">sqlite3rbu_bp_progress()</a>
    interface to the <a href="../rbu.html">RBU</a> extension.
Šl9…Ureleaselog/3_12_0.html3.12.0Added the <a href="../c3ref/c_dbconfig_defensive.html#sqlitedbconfigenablefts3tokenizer">SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER</a> option to <a href="../c3ref/db_config.html">sqlite3_db_config()</a>
    which allows the two-argument version of the <a href="../fts3.html#f3tknzr">fts3_tokenizer()</a> SQL function to
    be enabled or disabled at run-time.
Šk9Kreleaselog/3_12_0.html3.12.0Other miscellaneous micro-optimizations for improved performance and reduced
    memory usage.
ZŠj9{releaselog/3_12_0.html3.12.0
Reduce the amount of memory needed to hold the schema.
FŠi9‚Qreleaselog/3_12_0.html3.12.0 The configure script (on unix) automatically detects
    pread() and pwrite() and sets compile-time options to use those OS
    interfaces if they are available.
{Šh9;releaselog/3_12_0.html3.12.The query planner considers the LIMIT clause when estimating the cost
    of ORDER BY.
fŠg9ƒreleaselog/3_12_0.html3.12.0More efficient handling of <a href="../appfunc.html">application-defined SQL functions</a>, especially
    in cases where the application defines hundreds or thousands of 
    custom functions.
‚Šf9ƒ]releaselog/3_12_0.html3.12.0The query planner now does a better job of optimizing <a href="../vtab.html">virtual table</a>
    accesses in a 3-way or higher join where constraints on the virtual
    table are split across two or more other tables of the join.
‚JŠe9„Yreleaselog/3_12_0.html3.12.0The query planner is able to optimize IN operators on <a href="../vtab.html">virtual tables</a>
    even if the <a href="../vtab.html#xbestindex">xBestIndex</a> method does not set the
    sqlite3_index_constraint_usage.omit flag of the
    virtual table column to the left of the IN operator.

v&´òë
ß
W       —       `–9áQ?á+6âvi‹ 9    releaselog/3_11_1.html3.11.1Improvements to the Makefiles and build scripts used by VisualStudio.
‚P9„ereleaselog/3_11_1.html3.11.1Because of continuing security concerns, the two-argument version
    of the seldom-used and little-known <a href="../fts3.html#f3tknzr">fts3_tokenizer()</a> function is
    disabled unless SQLite is compiled with the <a href="../compile.html#enable_fts3_tokenizer">SQLITE_ENABLE_FTS3_TOKENIZER</a>.
q‹9ƒ'releaselog/3_11_1.html3.11.1Reenable the xCurrentTime and xGetLastError methods in the built-in
    unix <a href="../vfs.html">VFSes</a> as long as <a href="../compile.html#omit_deprecated">SQLITE_OMIT_DEPRECATED</a> is not defined.
2‹9‚)releaselog/3_11_1.html3.11.1Escape control characters in JSON strings.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/ad2559db380abf8">ad2559db380abf8</a>.
‚Z‹9„yreleaselog/3_11_1.html3.11.1Fix a problem in the <a href="../c3ref/result_subtype.html">sqlite3_result_subtype()</a> interface that could
    cause problems for the <a href="../json1.html">json1</a> extension under obscure circumstances.
    Fix for ticket
    <a href="https://www.sqlite.org/src/info/f45ac567eaa9f9">f45ac567eaa9f9</a>.
‚‹9ƒareleaselog/3_11_1.html3.11.1Fix an issue with incorrect sharing of VDBE temporary registers between
    co-routines that could cause incorrect query results in obscure cases.  Ticket
    <a href="https://www.sqlite.org/src/info/d06a25c84454a">d06a25c84454a</a>.
‹9]releaselog/3_11_1.html3.11.1
Add the ability to do MSVC Windows builds from the <a href="../download.html">amalgamation tarball</a>.
U‹9qreleaselog/3_11_1.html3.11.1Improved pthreads detection in configure scripts.
Z‹9{releaselog/3_11_1.html3.11.1Added the "-sourceid" option to the "sqlite3" command.
F‹9‚Qreleaselog/3_11_1.html3.11.1
If a database connection is opened with the "-uri 1" option, then
    <a href="../uri.html">URI filenames</a> are honored by the "backup" and "restore" commands.
IŠ9‚Wreleaselog/3_11_1.html3.11.1 The <a href="../compile.html#enable_explain_comments">SQLITE_ENABLE_EXPLAIN_COMMENTS</a> compile-time option is now turned
    on by default in the standard builds.
gŠ~9releaselog/3_11_1.html3.11.Added the ".vfslist" <a href="../cli.html#dotcmd">dot-command</a>.
<Š}9‚=releaselog/3_11_1.html3.11.1By default, the shell is now in "auto-explain" mode.  The output of
    <a href="../lang_explain.html">EXPLAIN</a> commands is automatically formatted.
Š|9Mreleaselog/3_11_1.html3.11.1Many micro-optimizations, resulting in a library that is 
    faster than the previous release.
Š{9ƒUreleaselog/3_11_1.html3.11.1Avoid recomputing <a href="../lang_createtable.html#notnullconst">NOT NULL</a> and <a href="../lang_createtable.html#ckconst">CHECK constraints</a> on unchanged
    columns in <a href="../lang_update.html">UPDATE</a> statement.
‚Šz9ƒKreleaselog/3_11_1.html3.11.1Enhanced the <a href="../optoverview.html">query planner</a> so that it is able to use
    a <a href="../queryplanner.html#covidx">covering index</a> as part of the <a href="../optoverview.html#or_opt">OR optimization</a>.
ƒ>Šy9†Areleaselog/3_11_1.html3.11.1Added the "EXTRA" option to <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous</a> that does a sync of the
    containing directory when a rollback journal is unlinked in DELETE mode,
    for better durability.  The <a href="../compile.html#extra_durable">SQLITE_EXTRA_DURABLE</a> compile-time option enables
    <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous=EXTRA</a> by default.
oŠx9#releaselog/3_11_1.html3.11.1Added the <a href="../fts5.html#the_detail_option">FTS5 detail option</a>.
VŠw9        ‚sreleaselog/3_11_1.html3.11.1Enhanced <a href="../wal.html">WAL mode</a> so that it works efficiently with transactions that are
    larger than the <a href="../pragma.html#pragma_cache_size">cache_size</a>.

†mÍ8
À
[
M       :²òˆ»ñ”<¬š<†2‹9‚)releaselog/3_11_0.html3.11.0Escape control characters in JSON strings.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/ad2559db380abf8">ad2559db380abf8</a>.
‚Z‹9„yreleaselog/3_11_0.html3.11.0Fix a problem in the <a href="../c3ref/result_subtype.html">sqlite3_result_subtype()</a> interface that could
    cause problems for the <a href="../json1.html">json1</a> extension under obscure circumstances.
    Fix for ticket
    <a href="https://www.sqlite.org/src/info/f45ac567eaa9f9">f45ac567eaa9f9</a>.
‚‹9ƒareleaselog/3_11_0.html3.11.0Fix an issue with incorrect sharing of VDBE temporary registers between
    co-routines that could cause incorrect query results in obscure cases.  Ticket
    <a href="https://www.sqlite.org/src/info/d06a25c84454a">d06a25c84454a</a>.
‹9]releaselog/3_11_0.html3.11.0
Add the ability to do MSVC Windows builds from the <a href="../download.html">amalgamation tarball</a>.
U‹9qreleaselog/3_11_0.html3.11.0Improved pthreads detection in configure scripts.
Z‹9{releaselog/3_11_0.html3.11.0Added the "-sourceid" option to the "sqlite3" command.
F‹9‚Qreleaselog/3_11_0.html3.11.0
If a database connection is opened with the "-uri 1" option, then
    <a href="../uri.html">URI filenames</a> are honored by the "backup" and "restore" commands.
I‹9‚Wreleaselog/3_11_0.html3.11.0 The <a href="../compile.html#enable_explain_comments">SQLITE_ENABLE_EXPLAIN_COMMENTS</a> compile-time option is now turned
    on by default in the standard builds.
g‹9releaselog/3_11_0.html3.11.Added the ".vfslist" <a href="../cli.html#dotcmd">dot-command</a>.
<‹9‚=releaselog/3_11_0.html3.11.0By default, the shell is now in "auto-explain" mode.  The output of
    <a href="../lang_explain.html">EXPLAIN</a> commands is automatically formatted.
‹9Mreleaselog/3_11_0.html3.11.0Many micro-optimizations, resulting in a library that is 
    faster than the previous release.
‹9ƒUreleaselog/3_11_0.html3.11.0Avoid recomputing <a href="../lang_createtable.html#notnullconst">NOT NULL</a> and <a href="../lang_createtable.html#ckconst">CHECK constraints</a> on unchanged
    columns in <a href="../lang_update.html">UPDATE</a> statement.
‚‹9ƒKreleaselog/3_11_0.html3.11.0Enhanced the <a href="../optoverview.html">query planner</a> so that it is able to use
    a <a href="../queryplanner.html#covidx">covering index</a> as part of the <a href="../optoverview.html#or_opt">OR optimization</a>.
ƒ>‹9†Areleaselog/3_11_0.html3.11.0Added the "EXTRA" option to <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous</a> that does a sync of the
    containing directory when a rollback journal is unlinked in DELETE mode,
    for better durability.  The <a href="../compile.html#extra_durable">SQLITE_EXTRA_DURABLE</a> compile-time option enables
    <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous=EXTRA</a> by default.
o‹9#releaselog/3_11_0.html3.11.0Added the <a href="../fts5.html#the_detail_option">FTS5 detail option</a>.
V‹9        ‚sreleaselog/3_11_0.html3.11.0Enhanced <a href="../wal.html">WAL mode</a> so that it works efficiently with transactions that are
    larger than the <a href="../pragma.html#pragma_cache_size">cache_size</a>.
b‹9       releaselog/3_11_1.html3.11.1SHA1 for sqlite3.c: 3da832fd2af36eaedb05d61a8f4c2bb9f3d54265

u‹
9/releaselog/3_11_1.html3.11.1SQLITE_SOURCE_ID: "2016-03-03 16:17:53 f047920ce16971e573bc6ec9a48b118c9de2b3a7"
‹9greleaselog/3_11_1.html3.11.1Increase the maximum "scope" value for the <a href="../spellfix1.html">spellfix1</a> extension from 6 to 30.
‹9}releaselog/3_11_1.html3.11.1Fix a buffer overread that might occur if <a href="../fts5.html">FTS5</a> is used to query a corrupt
    database file.
‹
9creleaselog/3_11_1.html3.11.1Fix an <a href="../fts5.html">FTS5</a> issue in which the 'optimize' command could cause index corruption.

Ì
·
?Ùà
å       ú       MÛé‚}1MÌ~‹19Areleaselog/3_10_2.html3.10.2Added the ".changes ON|OFF" and ".vfsinfo" <a href="../cli.html#dotcmd">dot-commands</a>.
`‹09ƒreleaselog/3_10_2.html3.10.2Work around a sign-extension bug in the optimizer of the HP C compiler on HP/UX.
    <a href="https://www.sqlite.org/src/fdiff?sbs=1&v1=869c95b0fc73026d&v2=232c242a0ccb3d67">(details)</a>
I‹/9Yreleaselog/3_10_2.html3.10.2
Many small performance optimizations.
‹.9ureleaselog/3_10_2.html3.10.2Added the <a href="../compile.html#like_doesnt_match_blobs">SQLITE_LIKE_DOESNT_MATCH_BLOBS</a> compile-time option.
u‹-9ƒ/releaselog/3_10_2.html3.10.2Added the <a href="../json1.html#jgrouparray">json_group_array()</a> and <a href="../json1.html#jgroupobject">json_group_object()</a> SQL functions in the
    <a href="../json1.html#jmini">json</a> extension.
‚l‹,9…releaselog/3_10_2.html3.10.2
Enhance the <a href="../lang_datefunc.html#localtime">'utc' modifier</a> in the <a href="../lang_datefunc.html">date and time functions</a> so that it is a no-op if
    the date/time is known to already be in UTC.  (This is not a compatibility break since
    the behavior has long been documented as "undefined" in that case.)
‚c‹+9…releaselog/3_10_2.html3.10.2 Added the <em>experimental</em> <a href="../c3ref/snapshot_get.html">sqlite3_snapshot_get()</a>, <a href="../c3ref/snapshot_open.html">sqlite3_snapshot_open()</a>,
    and <a href="../c3ref/snapshot_free.html">sqlite3_snapshot_free()</a> interfaces.  These are subject to change or removal in
    a subsequent release.
n‹*9ƒ!releaselog/3_10_2.html3.10.When using <a href="../mmap.html">memory-mapped I/O</a> map the database file read-only so that stray pointers
    and/or array overruns in the application cannot accidentally modify the database file.
o‹)9#releaselog/3_10_2.html3.10.2Added the <a href="../c3ref/strlike.html">sqlite3_strlike()</a> interface.
{‹(9;releaselog/3_10_2.html3.10.2Added the <a href="../c3ref/db_cacheflush.html">sqlite3_db_cacheflush()</a> interface.
o‹'9#releaselog/3_10_2.html3.10.2Added the "--transaction" option to <a href="../sqldiff.html">sqldiff</a>.
9‹&9‚7releaselog/3_10_2.html3.10.2On unix, if a symlink to a database file is opened, then the corresponding
    journal files are based on the actual filename, not the symlink name.
g‹%9ƒreleaselog/3_10_2.html3.10.2Enhance the <a href="../pragma.html#pragma_cache_spill">PRAGMA cache_spill</a> statement to accept a 32-bit integer
    parameter which is the threshold below which cache spilling is prohibited.
w‹$9ƒ3releaselog/3_10_2.html3.10.2Added the <a href="../vtab.html#colUsed">colUsed field</a> to <a href="../c3ref/index_info.html">sqlite3_index_info</a> for use by
    the <a href="../vtab.html#xbestindex">sqlite3_module.xBestIndex</a> method.
u‹#9        ƒ1releaselog/3_10_2.html3.10.2Added support for <a href="../lang_expr.html#like">LIKE</a>, <a href="../lang_expr.html#glob">GLOB</a>, and <a href="../lang_expr.html#regexp">REGEXP</a> operators on <a href="../vtab.html">virtual tables</a>.
c‹"9releaselog/3_11_0.html3.11.0SHA1 for sqlite3.c: df01436c5fcfe72d1a95bc172158219796e1a90b


u‹!9/releaselog/3_11_0.html3.11.0SQLITE_SOURCE_ID: "2016-02-15 17:29:24 3d862f207e3adc00f78066799ac5a8c282430a5f"
‚P‹ 9„ereleaselog/3_11_0.html3.11.0Because of continuing security concerns, the two-argument version
    of the seldom-used and little-known <a href="../fts3.html#f3tknzr">fts3_tokenizer()</a> function is
    disabled unless SQLite is compiled with the <a href="../compile.html#enable_fts3_tokenizer">SQLITE_ENABLE_FTS3_TOKENIZER</a>.
q‹9ƒ'releaselog/3_11_0.html3.11.0Reenable the xCurrentTime and xGetLastError methods in the built-in
    unix <a href="../vfs.html">VFSes</a> as long as <a href="../compile.html#omit_deprecated">SQLITE_OMIT_DEPRECATED</a> is not defined.

z\½FÖ(¼  :ÝGÏjqv‹Î\Þlzn‹G9ƒ!releaselog/3_10_1.html3.10.When using <a href="../mmap.html">memory-mapped I/O</a> map the database file read-only so that stray pointers
    and/or array overruns in the application cannot accidentally modify the database file.
o‹F9#releaselog/3_10_1.html3.10.1Added the <a href="../c3ref/strlike.html">sqlite3_strlike()</a> interface.
{‹E9;releaselog/3_10_1.html3.10.1Added the <a href="../c3ref/db_cacheflush.html">sqlite3_db_cacheflush()</a> interface.
o‹D9#releaselog/3_10_1.html3.10.1Added the "--transaction" option to <a href="../sqldiff.html">sqldiff</a>.
9‹C9‚7releaselog/3_10_1.html3.10.1On unix, if a symlink to a database file is opened, then the corresponding
    journal files are based on the actual filename, not the symlink name.
g‹B9ƒreleaselog/3_10_1.html3.10.1Enhance the <a href="../pragma.html#pragma_cache_spill">PRAGMA cache_spill</a> statement to accept a 32-bit integer
    parameter which is the threshold below which cache spilling is prohibited.
w‹A9ƒ3releaselog/3_10_1.html3.10.1Added the <a href="../vtab.html#colUsed">colUsed field</a> to <a href="../c3ref/index_info.html">sqlite3_index_info</a> for use by
    the <a href="../vtab.html#xbestindex">sqlite3_module.xBestIndex</a> method.
u‹@9        ƒ1releaselog/3_10_1.html3.10.1Added support for <a href="../lang_expr.html#like">LIKE</a>, <a href="../lang_expr.html#glob">GLOB</a>, and <a href="../lang_expr.html#regexp">REGEXP</a> operators on <a href="../vtab.html">virtual tables</a>.
b‹?9       releaselog/3_10_2.html3.10.2SHA1 for sqlite3.c: f7088b19d97cd7a1c805ee95c696abd54f01de4f

u‹>9/releaselog/3_10_2.html3.10.2SQLITE_SOURCE_ID: "2016-01-20 15:27:19 17efb4209f97fb4971656086b138599a91a75ff9"
‹=9ireleaselog/3_10_2.html3.10.2Fix the configure script for the amalgamation so that the --readline option works again
    on Raspberry PIs.
Z‹<9{releaselog/3_10_2.html3.10.2Fix the build so that it works with -DSQLITE_OMIT_WAL.
y‹;97releaselog/3_10_2.html3.10.2Fix a use-after-free that can occur when SQLite is compiled with -DSQLITE_HAS_CODEC.
‚‹:9        ƒ_releaselog/3_10_2.html3.10.2Version 3.10.0 introduced a case-folding bug in the <a href="../lang_expr.html#like">LIKE</a> operator which is fixed
    by this patch release.  Ticket 
    <a href="https://www.sqlite.org/src/info/80369eddd5c94">80369eddd5c94</a>.
‚G‹99„Sreleaselog/3_10_2.html3.10.2Fix a 16-month-old bug in the query planner that could generate incorrect results
    when a scalar subquery attempts to use the <a href="../queryplanner.html#partialsort">block sorting</a> optimization.  Ticket
    <a href="https://www.sqlite.org/src/info/cb3aa0641d9a4">cb3aa0641d9a4</a>.
'‹89        ‚releaselog/3_10_2.html3.10.2Add the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntljournalpointer">SQLITE_FCNTL_JOURNAL_POINTER</a> file control.
i‹79releaselog/3_10_2.html3.10.2Various bug fixes in the <a href="../sqldiff.html">sqldiff</a> tool.
*‹69‚releaselog/3_10_2.html3.10.2Fix an infinite-loop in the query planner that could occur on
    malformed <a href="../lang_with.html">common table expressions</a>.
‚l‹59…releaselog/3_10_2.html3.10.2Fix inconsistent integer to floating-point comparison operations that
    could result in a corrupt index if the index is created on a table
    column that contains both large integers and floating point values
    of similar magnitude.  Ticket 
    <a href="https://www.sqlite.org/src/tktview?name=38a97a87a6">38a97a87a6</a>.
t‹49-releaselog/3_10_2.html3.10.2Omit all use of "awk" in the makefiles, to make building easier for MSVC users.
‹39{releaselog/3_10_2.html3.10.2Added the --enable-editline and --enable-static-shell options
    to the various autoconf-generated configure scripts.
 ‹29‚releaselog/3_10_2.html3.10.2Translate between MBCS and UTF8 when
    running in <a href="https://en.wikipedia.org/wiki/Cmd.exe">cmd.exe</a> on Windows.

Ø™
)0”H
d       ã       )¹Ÿô©1ÌÓØw‹Z9ƒ3releaselog/3_10_0.html3.10.0Added the <a href="../vtab.html#colUsed">colUsed field</a> to <a href="../c3ref/index_info.html">sqlite3_index_info</a> for use by
    the <a href="../vtab.html#xbestindex">sqlite3_module.xBestIndex</a> method.
u‹Y9        ƒ1releaselog/3_10_0.html3.10.0Added support for <a href="../lang_expr.html#like">LIKE</a>, <a href="../lang_expr.html#glob">GLOB</a>, and <a href="../lang_expr.html#regexp">REGEXP</a> operators on <a href="../vtab.html">virtual tables</a>.
b‹X9       releaselog/3_10_1.html3.10.1SHA1 for sqlite3.c: 1398ba8e4043550a533cdd0834bfdad1c9eab0f4

u‹W9/releaselog/3_10_1.html3.10.1SQLITE_SOURCE_ID: "2016-01-13 21:41:56 254419c36766225ca542ae873ed38255e3fb8588"
‚G‹V9„Sreleaselog/3_10_1.html3.10.1Fix a 16-month-old bug in the query planner that could generate incorrect results
    when a scalar subquery attempts to use the <a href="../queryplanner.html#partialsort">block sorting</a> optimization.  Ticket
    <a href="https://www.sqlite.org/src/info/cb3aa0641d9a4">cb3aa0641d9a4</a>.
'‹U9        ‚releaselog/3_10_1.html3.10.1Add the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntljournalpointer">SQLITE_FCNTL_JOURNAL_POINTER</a> file control.
i‹T9releaselog/3_10_1.html3.10.1Various bug fixes in the <a href="../sqldiff.html">sqldiff</a> tool.
*‹S9‚releaselog/3_10_1.html3.10.1Fix an infinite-loop in the query planner that could occur on
    malformed <a href="../lang_with.html">common table expressions</a>.
‚l‹R9…releaselog/3_10_1.html3.10.1Fix inconsistent integer to floating-point comparison operations that
    could result in a corrupt index if the index is created on a table
    column that contains both large integers and floating point values
    of similar magnitude.  Ticket 
    <a href="https://www.sqlite.org/src/tktview?name=38a97a87a6">38a97a87a6</a>.
t‹Q9-releaselog/3_10_1.html3.10.1Omit all use of "awk" in the makefiles, to make building easier for MSVC users.
‹P9{releaselog/3_10_1.html3.10.1Added the --enable-editline and --enable-static-shell options
    to the various autoconf-generated configure scripts.
 ‹O9‚releaselog/3_10_1.html3.10.1Translate between MBCS and UTF8 when
    running in <a href="https://en.wikipedia.org/wiki/Cmd.exe">cmd.exe</a> on Windows.
~‹N9Areleaselog/3_10_1.html3.10.1Added the ".changes ON|OFF" and ".vfsinfo" <a href="../cli.html#dotcmd">dot-commands</a>.
`‹M9ƒreleaselog/3_10_1.html3.10.1Work around a sign-extension bug in the optimizer of the HP C compiler on HP/UX.
    <a href="https://www.sqlite.org/src/fdiff?sbs=1&v1=869c95b0fc73026d&v2=232c242a0ccb3d67">(details)</a>
I‹L9Yreleaselog/3_10_1.html3.10.1
Many small performance optimizations.
‹K9ureleaselog/3_10_1.html3.10.1Added the <a href="../compile.html#like_doesnt_match_blobs">SQLITE_LIKE_DOESNT_MATCH_BLOBS</a> compile-time option.
u‹J9ƒ/releaselog/3_10_1.html3.10.1Added the <a href="../json1.html#jgrouparray">json_group_array()</a> and <a href="../json1.html#jgroupobject">json_group_object()</a> SQL functions in the
    <a href="../json1.html#jmini">json</a> extension.
‚l‹I9…releaselog/3_10_1.html3.10.1
Enhance the <a href="../lang_datefunc.html#localtime">'utc' modifier</a> in the <a href="../lang_datefunc.html">date and time functions</a> so that it is a no-op if
    the date/time is known to already be in UTC.  (This is not a compatibility break since
    the behavior has long been documented as "undefined" in that case.)
‚c‹H9…releaselog/3_10_1.html3.10.1 Added the <em>experimental</em> <a href="../c3ref/snapshot_get.html">sqlite3_snapshot_get()</a>, <a href="../c3ref/snapshot_open.html">sqlite3_snapshot_open()</a>,
    and <a href="../c3ref/snapshot_free.html">sqlite3_snapshot_free()</a> interfaces.  These are subject to change or removal in
    a subsequent release.

ÅX
æ
hö
       4˜LhçC¤-½£+Åc‹o9releaselog/3_10_0.html3.10.0SHA1 for sqlite3.c: b92ca988ebb6df02ac0c8f866dbf3256740408ac


u‹n9/releaselog/3_10_0.html3.10.0SQLITE_SOURCE_ID: "2016-01-06 11:01:07 fd0a50f0797d154fefff724624f00548b5320566"
i‹m9releaselog/3_10_0.html3.10.0Various bug fixes in the <a href="../sqldiff.html">sqldiff</a> tool.
*‹l9‚releaselog/3_10_0.html3.10.0Fix an infinite-loop in the query planner that could occur on
    malformed <a href="../lang_with.html">common table expressions</a>.
‚l‹k9…releaselog/3_10_0.html3.10.0Fix inconsistent integer to floating-point comparison operations that
    could result in a corrupt index if the index is created on a table
    column that contains both large integers and floating point values
    of similar magnitude.  Ticket 
    <a href="https://www.sqlite.org/src/tktview?name=38a97a87a6">38a97a87a6</a>.
t‹j9-releaselog/3_10_0.html3.10.0Omit all use of "awk" in the makefiles, to make building easier for MSVC users.
‹i9{releaselog/3_10_0.html3.10.0Added the --enable-editline and --enable-static-shell options
    to the various autoconf-generated configure scripts.
 ‹h9‚releaselog/3_10_0.html3.10.0Translate between MBCS and UTF8 when
    running in <a href="https://en.wikipedia.org/wiki/Cmd.exe">cmd.exe</a> on Windows.
~‹g9Areleaselog/3_10_0.html3.10.0Added the ".changes ON|OFF" and ".vfsinfo" <a href="../cli.html#dotcmd">dot-commands</a>.
`‹f9ƒreleaselog/3_10_0.html3.10.0Work around a sign-extension bug in the optimizer of the HP C compiler on HP/UX.
    <a href="https://www.sqlite.org/src/fdiff?sbs=1&v1=869c95b0fc73026d&v2=232c242a0ccb3d67">(details)</a>
I‹e9Yreleaselog/3_10_0.html3.10.0
Many small performance optimizations.
‹d9ureleaselog/3_10_0.html3.10.0Added the <a href="../compile.html#like_doesnt_match_blobs">SQLITE_LIKE_DOESNT_MATCH_BLOBS</a> compile-time option.
u‹c9ƒ/releaselog/3_10_0.html3.10.0Added the <a href="../json1.html#jgrouparray">json_group_array()</a> and <a href="../json1.html#jgroupobject">json_group_object()</a> SQL functions in the
    <a href="../json1.html#jmini">json</a> extension.
‚l‹b9…releaselog/3_10_0.html3.10.0
Enhance the <a href="../lang_datefunc.html#localtime">'utc' modifier</a> in the <a href="../lang_datefunc.html">date and time functions</a> so that it is a no-op if
    the date/time is known to already be in UTC.  (This is not a compatibility break since
    the behavior has long been documented as "undefined" in that case.)
‚c‹a9…releaselog/3_10_0.html3.10.0 Added the <em>experimental</em> <a href="../c3ref/snapshot_get.html">sqlite3_snapshot_get()</a>, <a href="../c3ref/snapshot_open.html">sqlite3_snapshot_open()</a>,
    and <a href="../c3ref/snapshot_free.html">sqlite3_snapshot_free()</a> interfaces.  These are subject to change or removal in
    a subsequent release.
n‹`9ƒ!releaselog/3_10_0.html3.10.When using <a href="../mmap.html">memory-mapped I/O</a> map the database file read-only so that stray pointers
    and/or array overruns in the application cannot accidentally modify the database file.
o‹_9#releaselog/3_10_0.html3.10.0Added the <a href="../c3ref/strlike.html">sqlite3_strlike()</a> interface.
{‹^9;releaselog/3_10_0.html3.10.0Added the <a href="../c3ref/db_cacheflush.html">sqlite3_db_cacheflush()</a> interface.
o‹]9#releaselog/3_10_0.html3.10.0Added the "--transaction" option to <a href="../sqldiff.html">sqldiff</a>.
9‹\9‚7releaselog/3_10_0.html3.10.0On unix, if a symlink to a database file is opened, then the corresponding
    journal files are based on the actual filename, not the symlink name.
g‹[9ƒreleaselog/3_10_0.html3.10.0Enhance the <a href="../pragma.html#pragma_cache_spill">PRAGMA cache_spill</a> statement to accept a 32-bit integer
    parameter which is the threshold below which cache spilling is prohibited.

T#
ÿ›ë~
»
G       RšØäÃ^T‚Œ7ƒUreleaselog/3_9_3.html3.9.3Do not apply the WHERE-clause pushdown optimization on terms that originate
    in the ON or USING clause of a LEFT JOIN.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/c2a19d81652f40568c">c2a19d81652f40568c</a>.

$‹7‚releaselog/3_9_3.html3.9.3Fix the <a href="../optoverview.html#or_opt">OR optimization</a> so that it always ignores subplans that
    do not use an index.
9‹~7‚;releaselog/3_9_3.html3.9.3Added a memory barrier in the implementation of
    <a href="../c3ref/initialize.html">sqlite3_initialize()</a> to help ensure that it is thread-safe.
‚P‹}7„ireleaselog/3_9_3.html3.9.3Fixed a critical bug in the 
    <a href="https://www.sqlite.org/see/doc/trunk/www/readme.wiki">SQLite Encryption Extension</a> that
    could cause the database to become unreadable and unrecoverable if a <a href="../lang_vacuum.html">VACUUM</a> command 
    changed the size of the encryption nonce.
I‹|7‚[releaselog/3_9_3.html3.9.3
The <a href="../c3ref/aggregate_count.html">sqlite3_memory_alarm()</a> interface, which has been deprecated and
    undocumented for 8 years, is changed into a no-op.
p‹{7ƒ)releaselog/3_9_3.html3.9.3Enhanced the <a href="../dbstat.html">dbstat virtual table</a> so that it can be used as a
    <a href="../vtab.html#tabfunc2">table-valued function</a> where the argument is the schema to be
    analyzed.
>‹z7‚Ereleaselog/3_9_3.html3.9.3The sqlite3_analyzer.exe utility is updated to report the depth of
    each btree and to show the average fanout for indexes and 
    WITHOUT ROWID tables.
4‹y7‚1releaselog/3_9_3.html3.9.3
The query planner is now able to use <a href="../partialindex.html">partial indexes</a> that contain
    AND-connected terms in the WHERE clause.
‚‹x7ƒIreleaselog/3_9_3.html3.9.3   Added the <a href="../c3ref/value_subtype.html">sqlite3_value_subtype()</a> and <a href="../c3ref/result_subtype.html">sqlite3_result_subtype()</a>
    interfaced (used by <a href="../json1.html">the json1 extension</a>).
m‹w7ƒ#releaselog/3_9_3.html3.9.A <a href="../lang_createview.html">VIEW</a> may now reference undefined tables and functions when
    initially created.  Missing tables and functions are reported when
    the VIEW is used in a query.
q‹v7+releaselog/3_9_3.html3.9.3Added support for <a href="../vtab.html#epovtab">eponymous virtual tables</a>.
?‹u7‚Greleaselog/3_9_3.html3.9.3Added support for <a href="../vtab.html#tabfunc2">table-valued functions</a> in the FROM clause of a
    <a href="../lang_select.html">SELECT</a> statement.
j‹t7releaselog/3_9_3.html3.9.3Added support for <a href="../expridx.html">indexes on expressions</a>.
,‹s7‚!releaselog/3_9_3.html3.9.3The <a href="../lang_createview.html">CREATE VIEW</a> statement now accepts an optional list of
    column names following the view name.
‚`‹r7…      releaselog/3_9_3.html3.9.3Added <a href="../fts5.html">Full Text Search version 5 (FTS5)</a> to the <a href="../amalgamation.html">amalgamation</a>, enabled
    using <a href="../compile.html#enable_fts5">SQLITE_ENABLE_FTS5</a>.  FTS5 will be considered "experimental" (subject
    to incompatible changes) for at least one more release cycle.
‚ ‹q7„      releaselog/3_9_3.html3.9.3Added <a href="../json1.html">the json1 extension</a> module in the source tree, and in the <a href="../amalgamation.html">amalgamation</a>.
    Enable support using the <a href="../compile.html#enable_json1">SQLITE_ENABLE_JSON1</a> compile-time option.
Y‹p7        ‚}releaselog/3_9_3.html3.9.3The <a href="../versionnumbers.html">version numbering conventions</a> for SQLite are revised to use the
    emerging standard of <a href="http://semver.org/">semantic versioning</a>.

hÍ3
"Ä
„       ƒo?ËÚÖ\hpŒ7ƒ)releaselog/3_9_2.html3.9.2Enhanced the <a href="../dbstat.html">dbstat virtual table</a> so that it can be used as a
    <a href="../vtab.html#tabfunc2">table-valued function</a> where the argument is the schema to be
    analyzed.
>Œ7‚Ereleaselog/3_9_2.html3.9.2The sqlite3_analyzer.exe utility is updated to report the depth of
    each btree and to show the average fanout for indexes and 
    WITHOUT ROWID tables.
4Œ7‚1releaselog/3_9_2.html3.9.2
The query planner is now able to use <a href="../partialindex.html">partial indexes</a> that contain
    AND-connected terms in the WHERE clause.
‚Œ7ƒIreleaselog/3_9_2.html3.9.2   Added the <a href="../c3ref/value_subtype.html">sqlite3_value_subtype()</a> and <a href="../c3ref/result_subtype.html">sqlite3_result_subtype()</a>
    interfaced (used by <a href="../json1.html">the json1 extension</a>).
mŒ
7ƒ#releaselog/3_9_2.html3.9.A <a href="../lang_createview.html">VIEW</a> may now reference undefined tables and functions when
    initially created.  Missing tables and functions are reported when
    the VIEW is used in a query.
qŒ7+releaselog/3_9_2.html3.9.2Added support for <a href="../vtab.html#epovtab">eponymous virtual tables</a>.
?Œ7‚Greleaselog/3_9_2.html3.9.2Added support for <a href="../vtab.html#tabfunc2">table-valued functions</a> in the FROM clause of a
    <a href="../lang_select.html">SELECT</a> statement.
jŒ
7releaselog/3_9_2.html3.9.2Added support for <a href="../expridx.html">indexes on expressions</a>.
,Œ     7‚!releaselog/3_9_2.html3.9.2The <a href="../lang_createview.html">CREATE VIEW</a> statement now accepts an optional list of
    column names following the view name.
‚`7…        releaselog/3_9_2.html3.9.2Added <a href="../fts5.html">Full Text Search version 5 (FTS5)</a> to the <a href="../amalgamation.html">amalgamation</a>, enabled
    using <a href="../compile.html#enable_fts5">SQLITE_ENABLE_FTS5</a>.  FTS5 will be considered "experimental" (subject
    to incompatible changes) for at least one more release cycle.
‚ Œ7„      releaselog/3_9_2.html3.9.2Added <a href="../json1.html">the json1 extension</a> module in the source tree, and in the <a href="../amalgamation.html">amalgamation</a>.
    Enable support using the <a href="../compile.html#enable_json1">SQLITE_ENABLE_JSON1</a> compile-time option.
YŒ7        ‚}releaselog/3_9_2.html3.9.2The <a href="../versionnumbers.html">version numbering conventions</a> for SQLite are revised to use the
    emerging standard of <a href="http://semver.org/">semantic versioning</a>.
‚<Œ7        „Creleaselog/3_9_3.html3.9.3Backport a
    <a href="https://www.sqlite.org/src/info/c648539b52ca28c0">simple query planner optimization</a>
    that allows the IS operator
    to drive an index on a LEFT OUTER JOIN.  No other changes from the
    <a href="../releaselog/3_9_2.html">version 3.9.2</a> baseline.

‚ZŒ7„}releaselog/3_9_3.html3.9.3Fix a query planner problem that could result in an incorrect
    answer due to the use of <a href="../optoverview.html#autoindex">automatic indexing</a> in subqueries in
    the FROM clause of a correlated scalar subqueries.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/8a2adec1">8a2adec1</a>.

‚
Œ7        ƒereleaselog/3_9_3.html3.9.3Fix the schema parser so that it interprets certain 
    (obscure and ill-formed)
    CREATE TABLE statements the same as legacy.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/ac661962a2aeab3c331">ac661962a2aeab3c331</a>
Œ7ureleaselog/3_9_3.html3.9.3Add a few #ifdef and build script changes to address compilation issues that
    appeared after the 3.9.0 release.

‚/Œ7        „)releaselog/3_9_3.html3.9.3Fix <a href="../json1.html">the json1 extension</a> so that it does <u>not</u> recognize ASCII form-feed as a
    whitespace character, in order to comply with RFC-7159.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/57eec374ae1d0a1d">57eec374ae1d0a1d</a>

¢3
ß
"zp
=       ’4¾[~ZöFÙ¢qŒ#7+releaselog/3_9_1.html3.9.1Added support for <a href="../vtab.html#epovtab">eponymous virtual tables</a>.
?Œ"7‚Greleaselog/3_9_1.html3.9.1Added support for <a href="../vtab.html#tabfunc2">table-valued functions</a> in the FROM clause of a
    <a href="../lang_select.html">SELECT</a> statement.
jŒ!7releaselog/3_9_1.html3.9.1Added support for <a href="../expridx.html">indexes on expressions</a>.
,Œ 7‚!releaselog/3_9_1.html3.9.1The <a href="../lang_createview.html">CREATE VIEW</a> statement now accepts an optional list of
    column names following the view name.
‚`Œ7…      releaselog/3_9_1.html3.9.1Added <a href="../fts5.html">Full Text Search version 5 (FTS5)</a> to the <a href="../amalgamation.html">amalgamation</a>, enabled
    using <a href="../compile.html#enable_fts5">SQLITE_ENABLE_FTS5</a>.  FTS5 will be considered "experimental" (subject
    to incompatible changes) for at least one more release cycle.
‚ Œ7„      releaselog/3_9_1.html3.9.1Added <a href="../json1.html">the json1 extension</a> module in the source tree, and in the <a href="../amalgamation.html">amalgamation</a>.
    Enable support using the <a href="../compile.html#enable_json1">SQLITE_ENABLE_JSON1</a> compile-time option.
YŒ7        ‚}releaselog/3_9_1.html3.9.1The <a href="../versionnumbers.html">version numbering conventions</a> for SQLite are revised to use the
    emerging standard of <a href="http://semver.org/">semantic versioning</a>.
`Œ7       releaselog/3_9_2.html3.9.2SHA1 for sqlite3.c: 1c4013876f50bbaa3e6f0f98e0147c76287684c1

sŒ7/releaselog/3_9_2.html3.9.2SQLITE_SOURCE_ID: "2015-11-02 18:31:45 bda77dda9697c463c3d0704014d51627fceee328"
‚ZŒ7„}releaselog/3_9_2.html3.9.2Fix a query planner problem that could result in an incorrect
    answer due to the use of <a href="../optoverview.html#autoindex">automatic indexing</a> in subqueries in
    the FROM clause of a correlated scalar subqueries.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/8a2adec1">8a2adec1</a>.

‚
Œ7        ƒereleaselog/3_9_2.html3.9.2Fix the schema parser so that it interprets certain 
    (obscure and ill-formed)
    CREATE TABLE statements the same as legacy.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/ac661962a2aeab3c331">ac661962a2aeab3c331</a>
Œ7ureleaselog/3_9_2.html3.9.2Add a few #ifdef and build script changes to address compilation issues that
    appeared after the 3.9.0 release.

‚/Œ7        „)releaselog/3_9_2.html3.9.2Fix <a href="../json1.html">the json1 extension</a> so that it does <u>not</u> recognize ASCII form-feed as a
    whitespace character, in order to comply with RFC-7159.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/57eec374ae1d0a1d">57eec374ae1d0a1d</a>
‚Œ7ƒUreleaselog/3_9_2.html3.9.2Do not apply the WHERE-clause pushdown optimization on terms that originate
    in the ON or USING clause of a LEFT JOIN.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/c2a19d81652f40568c">c2a19d81652f40568c</a>.

$Œ7‚releaselog/3_9_2.html3.9.2Fix the <a href="../optoverview.html#or_opt">OR optimization</a> so that it always ignores subplans that
    do not use an index.
9Œ7‚;releaselog/3_9_2.html3.9.2Added a memory barrier in the implementation of
    <a href="../c3ref/initialize.html">sqlite3_initialize()</a> to help ensure that it is thread-safe.
‚PŒ7„ireleaselog/3_9_2.html3.9.2Fixed a critical bug in the 
    <a href="https://www.sqlite.org/see/doc/trunk/www/readme.wiki">SQLite Encryption Extension</a> that
    could cause the database to become unreadable and unrecoverable if a <a href="../lang_vacuum.html">VACUUM</a> command 
    changed the size of the encryption nonce.
IŒ7‚[releaselog/3_9_2.html3.9.2
The <a href="../c3ref/aggregate_count.html">sqlite3_memory_alarm()</a> interface, which has been deprecated and
    undocumented for 8 years, is changed into a no-op.

Q
S‘
Ð       
Ú@Éf‰eQ,Œ57‚!releaselog/3_9_0.html3.9.0The <a href="../lang_createview.html">CREATE VIEW</a> statement now accepts an optional list of
    column names following the view name.
‚`Œ47…      releaselog/3_9_0.html3.9.0Added <a href="../fts5.html">Full Text Search version 5 (FTS5)</a> to the <a href="../amalgamation.html">amalgamation</a>, enabled
    using <a href="../compile.html#enable_fts5">SQLITE_ENABLE_FTS5</a>.  FTS5 will be considered "experimental" (subject
    to incompatible changes) for at least one more release cycle.
‚ Œ37„      releaselog/3_9_0.html3.9.0Added <a href="../json1.html">the json1 extension</a> module in the source tree, and in the <a href="../amalgamation.html">amalgamation</a>.
    Enable support using the <a href="../compile.html#enable_json1">SQLITE_ENABLE_JSON1</a> compile-time option.
YŒ27        ‚}releaselog/3_9_0.html3.9.0The <a href="../versionnumbers.html">version numbering conventions</a> for SQLite are revised to use the
    emerging standard of <a href="http://semver.org/">semantic versioning</a>.
`Œ17       releaselog/3_9_1.html3.9.1SHA1 for sqlite3.c: 5e6d1873a32d82c2cf8581f143649940cac8ae49

tŒ071releaselog/3_9_1.html3.9.1SQLITE_SOURCE_ID: ""2015-10-16 17:31:12 767c1727fec4ce11b83f25b3f1bfcfe68a2c8b02"
Œ/7ureleaselog/3_9_1.html3.9.1Add a few #ifdef and build script changes to address compilation issues that
    appeared after the 3.9.0 release.

‚/Œ.7        „)releaselog/3_9_1.html3.9.1Fix <a href="../json1.html">the json1 extension</a> so that it does <u>not</u> recognize ASCII form-feed as a
    whitespace character, in order to comply with RFC-7159.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/57eec374ae1d0a1d">57eec374ae1d0a1d</a>
‚Œ-7ƒUreleaselog/3_9_1.html3.9.1Do not apply the WHERE-clause pushdown optimization on terms that originate
    in the ON or USING clause of a LEFT JOIN.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/c2a19d81652f40568c">c2a19d81652f40568c</a>.

$Œ,7‚releaselog/3_9_1.html3.9.1Fix the <a href="../optoverview.html#or_opt">OR optimization</a> so that it always ignores subplans that
    do not use an index.
9Œ+7‚;releaselog/3_9_1.html3.9.1Added a memory barrier in the implementation of
    <a href="../c3ref/initialize.html">sqlite3_initialize()</a> to help ensure that it is thread-safe.
‚PŒ*7„ireleaselog/3_9_1.html3.9.1Fixed a critical bug in the 
    <a href="https://www.sqlite.org/see/doc/trunk/www/readme.wiki">SQLite Encryption Extension</a> that
    could cause the database to become unreadable and unrecoverable if a <a href="../lang_vacuum.html">VACUUM</a> command 
    changed the size of the encryption nonce.
IŒ)7‚[releaselog/3_9_1.html3.9.1
The <a href="../c3ref/aggregate_count.html">sqlite3_memory_alarm()</a> interface, which has been deprecated and
    undocumented for 8 years, is changed into a no-op.
pŒ(7ƒ)releaselog/3_9_1.html3.9.1Enhanced the <a href="../dbstat.html">dbstat virtual table</a> so that it can be used as a
    <a href="../vtab.html#tabfunc2">table-valued function</a> where the argument is the schema to be
    analyzed.
>Œ'7‚Ereleaselog/3_9_1.html3.9.1The sqlite3_analyzer.exe utility is updated to report the depth of
    each btree and to show the average fanout for indexes and 
    WITHOUT ROWID tables.
4Œ&7‚1releaselog/3_9_1.html3.9.1
The query planner is now able to use <a href="../partialindex.html">partial indexes</a> that contain
    AND-connected terms in the WHERE clause.
‚Œ%7ƒIreleaselog/3_9_1.html3.9.1   Added the <a href="../c3ref/value_subtype.html">sqlite3_value_subtype()</a> and <a href="../c3ref/result_subtype.html">sqlite3_result_subtype()</a>
    interfaced (used by <a href="../json1.html">the json1 extension</a>).
mŒ$7ƒ#releaselog/3_9_1.html3.9.A <a href="../lang_createview.html">VIEW</a> may now reference undefined tables and functions when
    initially created.  Missing tables and functions are reported when
    the VIEW is used in a query.

F“Ð\
kg¯
í       ù       ,ØsióËH˜FMŒJ=‚Wreleaselog/3_8_11_1.html3.8.11.1Enhance the query planner to permit <a href="../optoverview.html#autoindex">automatic indexing</a> on FROM-clause
    subqueries that are implemented by co-routine.
~ŒI=9releaselog/3_8_11_1.html3.8.11.1The <a href="../lang_expr.html#isisnot">IS operator</a> is now able to drive indexes.
,ŒH=‚releaselog/3_8_11_1.html3.8.11.1Enhance the <a href="../spellfix1.html">spellfix1</a> extension to support <a href="../lang_conflict.html">ON CONFLICT</a> clauses.
7ŒG=‚+releaselog/3_8_11_1.html3.8.11.1Added the <a href="../c3ref/value_dup.html">sqlite3_value_dup()</a> and <a href="../c3ref/value_dup.html">sqlite3_value_free()</a> interfaces.
DŒF=‚Ereleaselog/3_8_11_1.html3.8.11.1Added the experimental <a href="../fts5.html">FTS5</a> extension.  Note that this extension is experimental
    and subject to change in incompatible ways.
AŒE=        ‚Areleaselog/3_8_11_1.html3.8.11.1Added the experimental <a href="../rbu.html">RBU</a> extension.  Note that this extension is experimental
    and subject to change in incompatible ways.
`ŒD7       releaselog/3_9_0.html3.9.0SHA1 for sqlite3.c: c03e47e152ddb9c342b84ffb39448bf4a2bd4288

sŒC7/releaselog/3_9_0.html3.9.0SQLITE_SOURCE_ID: "2015-10-14 12:29:53 a721fc0d89495518fe5612e2e3bbc60befd2e90d"
‚ŒB7ƒUreleaselog/3_9_0.html3.9.0Do not apply the WHERE-clause pushdown optimization on terms that originate
    in the ON or USING clause of a LEFT JOIN.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/c2a19d81652f40568c">c2a19d81652f40568c</a>.

$ŒA7‚releaselog/3_9_0.html3.9.0Fix the <a href="../optoverview.html#or_opt">OR optimization</a> so that it always ignores subplans that
    do not use an index.
9Œ@7‚;releaselog/3_9_0.html3.9.0Added a memory barrier in the implementation of
    <a href="../c3ref/initialize.html">sqlite3_initialize()</a> to help ensure that it is thread-safe.
‚PŒ?7„ireleaselog/3_9_0.html3.9.0Fixed a critical bug in the 
    <a href="https://www.sqlite.org/see/doc/trunk/www/readme.wiki">SQLite Encryption Extension</a> that
    could cause the database to become unreadable and unrecoverable if a <a href="../lang_vacuum.html">VACUUM</a> command 
    changed the size of the encryption nonce.
IŒ>7‚[releaselog/3_9_0.html3.9.0
The <a href="../c3ref/aggregate_count.html">sqlite3_memory_alarm()</a> interface, which has been deprecated and
    undocumented for 8 years, is changed into a no-op.
pŒ=7ƒ)releaselog/3_9_0.html3.9.0Enhanced the <a href="../dbstat.html">dbstat virtual table</a> so that it can be used as a
    <a href="../vtab.html#tabfunc2">table-valued function</a> where the argument is the schema to be
    analyzed.
>Œ<7‚Ereleaselog/3_9_0.html3.9.0The sqlite3_analyzer.exe utility is updated to report the depth of
    each btree and to show the average fanout for indexes and 
    WITHOUT ROWID tables.
4Œ;7‚1releaselog/3_9_0.html3.9.0
The query planner is now able to use <a href="../partialindex.html">partial indexes</a> that contain
    AND-connected terms in the WHERE clause.
‚Œ:7ƒIreleaselog/3_9_0.html3.9.0   Added the <a href="../c3ref/value_subtype.html">sqlite3_value_subtype()</a> and <a href="../c3ref/result_subtype.html">sqlite3_result_subtype()</a>
    interfaced (used by <a href="../json1.html">the json1 extension</a>).
mŒ97ƒ#releaselog/3_9_0.html3.9.A <a href="../lang_createview.html">VIEW</a> may now reference undefined tables and functions when
    initially created.  Missing tables and functions are reported when
    the VIEW is used in a query.
qŒ87+releaselog/3_9_0.html3.9.0Added support for <a href="../vtab.html#epovtab">eponymous virtual tables</a>.
?Œ77‚Greleaselog/3_9_0.html3.9.0Added support for <a href="../vtab.html#tabfunc2">table-valued functions</a> in the FROM clause of a
    <a href="../lang_select.html">SELECT</a> statement.
jŒ67releaselog/3_9_0.html3.9.0Added support for <a href="../expridx.html">indexes on expressions</a>.

œ{°
Û
h¿ý
Þ       Ïb”{’œmŒY=   ƒreleaselog/3_8_11_1.html3.8.11.1Restore an undocumented side-effect of <a href="../pragma.html#pragma_cache_size">PRAGMA cache_size</a>: force
    the database schema to be parsed if the database has not been previously accessed.
‚ŒX=ƒ?releaselog/3_8_11_1.html3.8.11.1Fix the <a href="../c3ref/memory_highwater.html">sqlite3_memory_used()</a> and <a href="../c3ref/memory_highwater.html">sqlite3_memory_highwater()</a> interfaces
    so that they actually do provide a 64-bit answer.

‚mŒW=…releaselog/3_8_11_1.html3.8.11.1Fix the <a href="../optoverview.html#skipscan">skip-scan optimization</a> so that it works correctly when
    the <a href="../optoverview.html#or_opt">OR optimization</a> is used on <a href="../withoutrowid.html">WITHOUT ROWID</a> tables.  Ticket
    <a href="https://www.sqlite.org/src/info/8fd39115d8f46">8fd39115d8f46</a>
‚tŒV=…%releaselog/3_8_11_1.html3.8.11.1Fix <a href="../lang_createtable.html#createtabas">CREATE TABLE AS</a> so that it does not leave NULL entries in the
    <a href="../schematab.html">sqlite_master table</a> if the SELECT statement on the right-hand side
    aborts with an error.  Ticket
    <a href="https://www.sqlite.org/src/info/873cae2b6e25b">873cae2b6e25b</a>
‚ŒU=ƒgreleaselog/3_8_11_1.html3.8.11.1Fix <a href="../lang_createtable.html#createtabas">CREATE TABLE AS</a> so that columns of type TEXT never end up
    holding an INT value.  Ticket
    <a href="https://www.sqlite.org/src/info/f2ad7de056ab1dc9200">f2ad7de056ab1dc9200</a>
JŒT=‚Qreleaselog/3_8_11_1.html3.8.11.1Added the <a href="../c3ref/result_blob.html">sqlite3_result_zeroblob64()</a> and <a href="../c3ref/bind_blob.html">sqlite3_bind_zeroblob64()</a>
    interfaces.
„iŒS=‰releaselog/3_8_11_1.html3.8.11.1Miscellaneous micro-optimizations result in 22.3% more work for the same
    number of CPU cycles relative to the previous release. 
    SQLite now runs twice as fast as <a href="../releaselog/3_8_0.html">version 3.8.0</a> and three times as
    fast as <a href="../releaselog/3_3_9.html">version 3.3.9</a>.
    (Measured using 
    <a href="http://valgrind.org/docs/manual/cg-manual.html">cachegrind</a> on the
    <a href="http://www.sqlite.org/src/artifact/83f6b3318f7ee">speedtest1.c</a> workload on
    Ubuntu 14.04 x64 with gcc 4.8.2 and -Os. Your performance may vary.)
‚ŒR=ƒSreleaselog/3_8_11_1.html3.8.11.1Enhance the page cache so that it can preallocate a block of memory to
    use for the initial set page cache lines.  Set the default preallocation
    to 100 pages.  Yields about a 5% performance increase on common workloads.
‚ŒQ=ƒsreleaselog/3_8_11_1.html3.8.11.1
The <a href="../c3ref/profile.html">sqlite3_profile()</a> callback is invoked (by <a href="../c3ref/reset.html">sqlite3_reset()</a> or
    <a href="../c3ref/finalize.html">sqlite3_finalize()</a>) for statements that did not run to completion.
>ŒP=‚9releaselog/3_8_11_1.html3.8.11.1Added the <a href="../c3ref/c_mutex_fast.html">SQLITE_MUTEX_STATIC_VFS1</a> static mutex and use it in the
    Windows <a href="../vfs.html">VFS</a>.
%ŒO=‚releaselog/3_8_11_1.html3.8.11.1Add the fuzzcheck test program and automatically run this program
    using both SQL and database test cases on "make test".
pŒN=releaselog/3_8_11_1.html3.8.11.1
Improved fuzz-testing of database files, with fixes for problems found.
QŒM=‚_releaselog/3_8_11_1.html3.8.11.1     Added the <a href="../fts3.html#matchinfo-b">matchinfo 'b' flag</a> to the <a href="../fts3.html#matchinfo">matchinfo()</a> function in <a href="../fts3.html">FTS3</a>.
GŒL=‚Kreleaselog/3_8_11_1.html3.8.11.Added the <a href="../pragma.html#pragma_cell_size_check">PRAGMA cell_size_check</a> command for better and earlier
    detection of database file corruption.
ŒK=?releaselog/3_8_11_1.html3.8.11.1Disallow the use of "rowid" in <a href="../lang_with.html">common table expressions</a>.

-‹"
aæ:
½       ð       ©ØiÄëàw-FŒl9‚Qreleaselog/3_8_11.html3.8.11Added the <a href="../c3ref/result_blob.html">sqlite3_result_zeroblob64()</a> and <a href="../c3ref/bind_blob.html">sqlite3_bind_zeroblob64()</a>
    interfaces.
„eŒk9‰releaselog/3_8_11.html3.8.11Miscellaneous micro-optimizations result in 22.3% more work for the same
    number of CPU cycles relative to the previous release. 
    SQLite now runs twice as fast as <a href="../releaselog/3_8_0.html">version 3.8.0</a> and three times as
    fast as <a href="../releaselog/3_3_9.html">version 3.3.9</a>.
    (Measured using 
    <a href="http://valgrind.org/docs/manual/cg-manual.html">cachegrind</a> on the
    <a href="http://www.sqlite.org/src/artifact/83f6b3318f7ee">speedtest1.c</a> workload on
    Ubuntu 14.04 x64 with gcc 4.8.2 and -Os. Your performance may vary.)
‚Œj9ƒSreleaselog/3_8_11.html3.8.11Enhance the page cache so that it can preallocate a block of memory to
    use for the initial set page cache lines.  Set the default preallocation
    to 100 pages.  Yields about a 5% performance increase on common workloads.
‚Œi9ƒsreleaselog/3_8_11.html3.8.11
The <a href="../c3ref/profile.html">sqlite3_profile()</a> callback is invoked (by <a href="../c3ref/reset.html">sqlite3_reset()</a> or
    <a href="../c3ref/finalize.html">sqlite3_finalize()</a>) for statements that did not run to completion.
:Œh9‚9releaselog/3_8_11.html3.8.11Added the <a href="../c3ref/c_mutex_fast.html">SQLITE_MUTEX_STATIC_VFS1</a> static mutex and use it in the
    Windows <a href="../vfs.html">VFS</a>.
!Œg9‚releaselog/3_8_11.html3.8.11Add the fuzzcheck test program and automatically run this program
    using both SQL and database test cases on "make test".
lŒf9releaselog/3_8_11.html3.8.11
Improved fuzz-testing of database files, with fixes for problems found.
MŒe9‚_releaselog/3_8_11.html3.8.11 Added the <a href="../fts3.html#matchinfo-b">matchinfo 'b' flag</a> to the <a href="../fts3.html#matchinfo">matchinfo()</a> function in <a href="../fts3.html">FTS3</a>.
CŒd9‚Kreleaselog/3_8_11.html3.8.1Added the <a href="../pragma.html#pragma_cell_size_check">PRAGMA cell_size_check</a> command for better and earlier
    detection of database file corruption.
}Œc9?releaselog/3_8_11.html3.8.11Disallow the use of "rowid" in <a href="../lang_with.html">common table expressions</a>.
IŒb9‚Wreleaselog/3_8_11.html3.8.11Enhance the query planner to permit <a href="../optoverview.html#autoindex">automatic indexing</a> on FROM-clause
    subqueries that are implemented by co-routine.
zŒa99releaselog/3_8_11.html3.8.11The <a href="../lang_expr.html#isisnot">IS operator</a> is now able to drive indexes.
(Œ`9‚releaselog/3_8_11.html3.8.11Enhance the <a href="../spellfix1.html">spellfix1</a> extension to support <a href="../lang_conflict.html">ON CONFLICT</a> clauses.
3Œ_9‚+releaselog/3_8_11.html3.8.11Added the <a href="../c3ref/value_dup.html">sqlite3_value_dup()</a> and <a href="../c3ref/value_dup.html">sqlite3_value_free()</a> interfaces.
@Œ^9‚Ereleaselog/3_8_11.html3.8.11Added the experimental <a href="../fts5.html">FTS5</a> extension.  Note that this extension is experimental
    and subject to change in incompatible ways.
=Œ]9        ‚Areleaselog/3_8_11.html3.8.11Added the experimental <a href="../rbu.html">RBU</a> extension.  Note that this extension is experimental
    and subject to change in incompatible ways.
fŒ\=       releaselog/3_8_11_1.html3.8.11.1SHA1 for sqlite3.c: 3be71d99121fe5b17f057011025bcf84e7cc6c84

yŒ[=/releaselog/3_8_11_1.html3.8.11.1SQLITE_SOURCE_ID: "2015-07-29 20:00:57 cf538e2783e468bbc25e7cb2a9ee64d3e0e80b2f"
uŒZ=ƒ'releaselog/3_8_11_1.html3.8.11.1Fix a long-standing problem in <a href="../c3ref/changes.html">sqlite3_changes()</a> for <a href="../withoutrowid.html">WITHOUT ROWID</a>
    tables that was reported a few hours after the 3.8.11 release.

½ë
w
       
‘
,        ,žõ0¦¸Ç6½vŒ}=)releaselog/3_8_10_2.html3.8.10.2Fix minor issues with the <a href="../dbstat.html">dbstat virtual table</a>.


Œ|=Wreleaselog/3_8_10_2.html3.8.10.2Fix a harmless warning in the <a href="../cli.html">command-line shell</a> on some versions of MSVC.
mŒ{=        ƒreleaselog/3_8_10_2.html3.8.10.2Make <a href="../c3ref/compileoption_get.html">sqlite3_compileoption_used()</a> responsive to the <a href="../compile.html#enable_dbstat_vtab">SQLITE_ENABLE_DBSTAT_VTAB</a>
    compile-time option.
jŒz=ƒreleaselog/3_8_10_2.html3.8.10.Make the <a href="../dbstat.html">dbstat virtual table</a> part of standard builds when
    compiled with the <a href="../compile.html#enable_dbstat_vtab">SQLITE_ENABLE_DBSTAT_VTAB</a> option.

Œy=Ireleaselog/3_8_10_2.html3.8.10.2Add the ".binary" and ".limits" commands to the <a href="../cli.html">command-line shell</a>.
AŒx=‚?releaselog/3_8_10_2.html3.8.10.2Made the <a href="../testing.html#aflfuzz">American Fuzzy Lop fuzzer</a>
    a standard part of SQLite's <a href="../testing.html">testing strategy</a>.
%Œw=‚releaselog/3_8_10_2.html3.8.10.2Identify all methods for important objects in the interface documentation.
    (<a href="../c3ref/context.html">example</a>)

Œv=Qreleaselog/3_8_10_2.html3.8.10.2Fix many obscure problems discovered while <a href="../testing.html#fuzztesting">SQL fuzzing</a>.
‚pŒu=…releaselog/3_8_10_2.html3.8.10.2Performance improvements for <a href="../lang_select.html#orderby">ORDER BY</a>, <a href="../lang_vacuum.html">VACUUM</a>, <a href="../lang_createindex.html">CREATE INDEX</a>,
    <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a>, and <a href="../pragma.html#pragma_quick_check">PRAGMA quick_check</a>.
TŒt=‚ereleaselog/3_8_10_2.html3.8.10.2Added the <a href="../fts3.html#matchinfo-y">matchinfo y flag</a> to the 
    <a href="../fts3.html#matchinfo">matchinfo()</a> function of <a href="../fts3.html">FTS3</a>.
0Œs=        ‚releaselog/3_8_10_2.html3.8.10.2Added the <a href="../sqldiff.html">sqldiff.exe</a> utility program for computing the differences between two
    SQLite database files.
bŒr9       releaselog/3_8_11.html3.8.11SHA1 for sqlite3.c: 719f6891abcd9c459b5460b191d731cd12a3643e

uŒq9/releaselog/3_8_11.html3.8.11SQLITE_SOURCE_ID: "2015-07-27 13:49:41 b8e92227a469de677a66da62e4361f099c0b79d0"
}Œp9ƒ?releaselog/3_8_11.html3.8.11Fix the <a href="../c3ref/memory_highwater.html">sqlite3_memory_used()</a> and <a href="../c3ref/memory_highwater.html">sqlite3_memory_highwater()</a> interfaces
    so that they actually do provide a 64-bit answer.

‚iŒo9…releaselog/3_8_11.html3.8.11Fix the <a href="../optoverview.html#skipscan">skip-scan optimization</a> so that it works correctly when
    the <a href="../optoverview.html#or_opt">OR optimization</a> is used on <a href="../withoutrowid.html">WITHOUT ROWID</a> tables.  Ticket
    <a href="https://www.sqlite.org/src/info/8fd39115d8f46">8fd39115d8f46</a>
‚pŒn9…%releaselog/3_8_11.html3.8.11Fix <a href="../lang_createtable.html#createtabas">CREATE TABLE AS</a> so that it does not leave NULL entries in the
    <a href="../schematab.html">sqlite_master table</a> if the SELECT statement on the right-hand side
    aborts with an error.  Ticket
    <a href="https://www.sqlite.org/src/info/873cae2b6e25b">873cae2b6e25b</a>
‚Œm9ƒgreleaselog/3_8_11.html3.8.11Fix <a href="../lang_createtable.html#createtabas">CREATE TABLE AS</a> so that columns of type TEXT never end up
    holding an INT value.  Ticket
    <a href="https://www.sqlite.org/src/info/f2ad7de056ab1dc9200">f2ad7de056ab1dc9200</a>

f
¡
8„¬
8       ª       <²ÄÓBÉMä4`ðf9Qreleaselog/3_8_10.html3.8.10Fix many obscure problems discovered while <a href="../testing.html#fuzztesting">SQL fuzzing</a>.
‚l9…releaselog/3_8_10.html3.8.10Performance improvements for <a href="../lang_select.html#orderby">ORDER BY</a>, <a href="../lang_vacuum.html">VACUUM</a>, <a href="../lang_createindex.html">CREATE INDEX</a>,
    <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a>, and <a href="../pragma.html#pragma_quick_check">PRAGMA quick_check</a>.
P9‚ereleaselog/3_8_10.html3.8.10Added the <a href="../fts3.html#matchinfo-y">matchinfo y flag</a> to the 
    <a href="../fts3.html#matchinfo">matchinfo()</a> function of <a href="../fts3.html">FTS3</a>.
,9        ‚releaselog/3_8_10.html3.8.10Added the <a href="../sqldiff.html">sqldiff.exe</a> utility program for computing the differences between two
    SQLite database files.
f
=       releaselog/3_8_10_1.html3.8.10.1SHA1 for sqlite3.c: 85e4e1c08c7df28ef61bb9759a0d466e0eefbaa2

y=/releaselog/3_8_10_1.html3.8.10.1SQLITE_SOURCE_ID: "2015-05-09 12:14:55 05b4b1f2a937c06c90db70c09890038f6c98ec40"
v=)releaselog/3_8_10_1.html3.8.10.1Fix minor issues with the <a href="../dbstat.html">dbstat virtual table</a>.


=Wreleaselog/3_8_10_1.html3.8.10.1Fix a harmless warning in the <a href="../cli.html">command-line shell</a> on some versions of MSVC.
m     =    ƒreleaselog/3_8_10_1.html3.8.10.1Make <a href="../c3ref/compileoption_get.html">sqlite3_compileoption_used()</a> responsive to the <a href="../compile.html#enable_dbstat_vtab">SQLITE_ENABLE_DBSTAT_VTAB</a>
    compile-time option.
j=ƒreleaselog/3_8_10_1.html3.8.10.Make the <a href="../dbstat.html">dbstat virtual table</a> part of standard builds when
    compiled with the <a href="../compile.html#enable_dbstat_vtab">SQLITE_ENABLE_DBSTAT_VTAB</a> option.

=Ireleaselog/3_8_10_1.html3.8.10.1Add the ".binary" and ".limits" commands to the <a href="../cli.html">command-line shell</a>.
A=‚?releaselog/3_8_10_1.html3.8.10.1Made the <a href="../testing.html#aflfuzz">American Fuzzy Lop fuzzer</a>
    a standard part of SQLite's <a href="../testing.html">testing strategy</a>.
%=‚releaselog/3_8_10_1.html3.8.10.1Identify all methods for important objects in the interface documentation.
    (<a href="../c3ref/context.html">example</a>)

=Qreleaselog/3_8_10_1.html3.8.10.1Fix many obscure problems discovered while <a href="../testing.html#fuzztesting">SQL fuzzing</a>.
‚p=…releaselog/3_8_10_1.html3.8.10.1Performance improvements for <a href="../lang_select.html#orderby">ORDER BY</a>, <a href="../lang_vacuum.html">VACUUM</a>, <a href="../lang_createindex.html">CREATE INDEX</a>,
    <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a>, and <a href="../pragma.html#pragma_quick_check">PRAGMA quick_check</a>.
T=‚ereleaselog/3_8_10_1.html3.8.10.1Added the <a href="../fts3.html#matchinfo-y">matchinfo y flag</a> to the 
    <a href="../fts3.html#matchinfo">matchinfo()</a> function of <a href="../fts3.html">FTS3</a>.
0=        ‚releaselog/3_8_10_1.html3.8.10.1Added the <a href="../sqldiff.html">sqldiff.exe</a> utility program for computing the differences between two
    SQLite database files.
f=       releaselog/3_8_10_2.html3.8.10.2SHA1 for sqlite3.c: 638abb77965332c956dbbd2c8e4248e84da4eb63

yŒ=/releaselog/3_8_10_2.html3.8.10.2SQLITE_SOURCE_ID: "2015-05-20 18:17:19 2ef4f3a5b1d1d0c4338f8243d40a2452cc1f7fe4"
ƒ_Œ~=        †}releaselog/3_8_10_2.html3.8.10.2Fix an index corruption issue introduced by <a href="../releaselog/3_8_7.html">version 3.8.7</a>.  An index
    with a TEXT key can be corrupted by an <a href="../lang_insert.html">INSERT</a> into the corresponding 
    table if the table has two nested triggers that convert the key value to INTEGER
    and back to TEXT again.
    Ticket <a href="https://www.sqlite.org/src/info/34cd55d68e0e6e7c9a0711aab81a2ee3c354b4c0">34cd55d68e0</a>


S[š
*²Më{
ú
        ªQÛxHISƒr';‡%releaselog/3_8_8_3.html3.8.8.3The <a href="../c3ref/table_column_metadata.html">sqlite3_table_column_metadata()</a> is enhanced to work correctly on
    <a href="../withoutrowid.html">WITHOUT ROWID</a> tables and to check for the existence of a
    a table if the column name parameter is NULL.  The interface is now
    also included in the build by default, without requiring
    the <a href="../compile.html#enable_column_metadata">SQLITE_ENABLE_COLUMN_METADATA</a> compile-time option.
{&;ƒ7releaselog/3_8_8_3.html3.8.8.3Added the <a href="../c3ref/stmt_scanstatus.html">sqlite3_stmt_scanstatus()</a> interface, available only when
    compiled with <a href="../compile.html#enable_stmt_scanstatus">SQLITE_ENABLE_STMT_SCANSTATUS</a>.
‚Q%;„creleaselog/3_8_8_3.html3.8.8.3Added the <a href="../c3ref/c_checkpoint_full.html">SQLITE_CHECKPOINT_TRUNCATE</a> option to the
    <a href="../c3ref/wal_checkpoint_v2.html">sqlite3_wal_checkpoint_v2()</a> interface, with corresponding enhancements
    to <a href="../pragma.html#pragma_wal_checkpoint">PRAGMA wal_checkpoint</a>.
W$;        ‚qreleaselog/3_8_8_3.html3.8.8.3Added the <a href="../pragma.html#pragma_data_version">PRAGMA data_version</a> command that can be used to determine if
    a database file has been modified by another process.
`#7       releaselog/3_8_9.html3.8.9SHA1 for sqlite3.c: 49f1c3ae347e1327b5aaa6c7f76126bdf09c6f42

s"7/releaselog/3_8_9.html3.8.9SQLITE_SOURCE_ID: "2015-04-08 12:16:33 8a8ffc862e96f57aa698f93de10dee28e69f6e09"
>!7‚Ereleaselog/3_8_9.html3.8.9
Fix a bug in the fts3 snippet() function causing it to omit
    leading separator characters from snippets that begin with the
    first token in a column.
 7oreleaselog/3_8_9.html3.8.9   Improve the performance of fts3/4 queries that use the OR operator 
    and at least one auxiliary fts function.
s7/releaselog/3_8_9.html3.8.Added the ".dbinfo" command to the <a href="../cli.html">command-line shell</a>.
}7Creleaselog/3_8_9.html3.8.9Correct miscounts in the sqlite3_analyzer.exe utility related
    to WITHOUT ROWID tables.
t7ƒ1releaselog/3_8_9.html3.8.9Ensure that prepared statements automatically reset on extended
    error codes of SQLITE_BUSY and SQLITE_LOCKED even when compiled
    using <a href="../compile.html#omit_autoreset">SQLITE_OMIT_AUTORESET</a>.
c7ƒreleaselog/3_8_9.html3.8.9Fix a potential 32-bit integer overflow problem in the
    <a href="../c3ref/blob_read.html">sqlite3_blob_read()</a> and <a href="../c3ref/blob_write.html">sqlite3_blob_write()</a> interfaces.
x79releaselog/3_8_9.html3.8.9Added the <a href="../pragma.html#pragma_index_xinfo">PRAGMA index_xinfo</a> command.
~7Ereleaselog/3_8_9.html3.8.9Fix memory size tracking so that it works even if SQLite uses more
    than 2GiB of memory.
m7#releaselog/3_8_9.html3.8.9Added the <a href="../c3ref/status.html">sqlite3_status64()</a> interface.
_7        releaselog/3_8_9.html3.8.9Add VxWorks-7 as an officially supported and tested platform.
b9       releaselog/3_8_10.html3.8.10
SHA1 for sqlite3.c: 0b34f0de356a3f21b9dfc761f3b7821b6353c570

u9/releaselog/3_8_10.html3.8.10  SQLITE_SOURCE_ID: "2015-05-07 11:53:08 cf975957b9ae671f34bb65f049acf351e650d437"
f9ƒreleaselog/3_8_10.html3.8.1Make the <a href="../dbstat.html">dbstat virtual table</a> part of standard builds when
    compiled with the <a href="../compile.html#enable_dbstat_vtab">SQLITE_ENABLE_DBSTAT_VTAB</a> option.

9Ireleaselog/3_8_10.html3.8.10Add the ".binary" and ".limits" commands to the <a href="../cli.html">command-line shell</a>.
=9‚?releaselog/3_8_10.html3.8.10Made the <a href="../testing.html#aflfuzz">American Fuzzy Lop fuzzer</a>
    a standard part of SQLite's <a href="../testing.html">testing strategy</a>.
!9‚releaselog/3_8_10.html3.8.10Identify all methods for important objects in the interface documentation.
    (<a href="../c3ref/context.html">example</a>)

0pÎ
Í#
!       QäË×ì
W0‚#8;„releaselog/3_8_8_3.html3.8.8.3Improvements to the effectiveness and accuracy of the
    <a href="../lang_corefunc.html#likelihood">likelihood()</a>, <a href="../lang_corefunc.html#likely">likely()</a>, and <a href="../lang_corefunc.html#unlikely">unlikely()</a> SQL hint functions.

27;‚%releaselog/3_8_8_3.html3.8.8.3Disable the use of the strchrnul() C-library routine unless it is
    specifically enabled using the -DHAVE_STRCHRNULL compile-time option.
[6;‚wreleaselog/3_8_8_3.html3.8.8.3Work around a GCC optimizer bug (for gcc 4.2.1 on MacOS 10.7) that caused the 
    <a href="../rtree.html">R-Tree extension</a> to compute incorrect results when compiled with -O3.
g5;ƒreleaselog/3_8_8_3.html3.8.8.3Fix obscure crash bugs found by
    <a href="http://lcamtuf.coredump.cx/afl/">american fuzzy lop</a>.  Ticket
    <a href="https://www.sqlite.org/src/info/a59ae93ee990a55">a59ae93ee990a55</a>.
p4;ƒ!releaselog/3_8_8_3.html3.8.8.3Fix data races that might occur under stress when running with many threads
    in <a href="../sharedcache.html">shared cache mode</a> where some of the threads are opening and
    closing connections.
‚3;ƒkreleaselog/3_8_8_3.html3.8.8.3Make sure ORDER BY puts rows in ascending order even if the DISTINCT
    operator  is implemented using a descending index.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/c5ea805691bfc4204b1cb9e">c5ea805691bfc4204b1cb9e</a>.
‚i2;…releaselog/3_8_8_3.html3.8.8.3The query planner now recognizes that any column in the right-hand
    table of a LEFT JOIN can be NULL, even if that column has a NOT NULL
    constraint.  Avoid trying to optimize out NULL tests in those cases.
    Fix for ticket
    <a href="https://www.sqlite.org/src/info/6f2222d550f5b0ee7ed">6f2222d550f5b0ee7ed</a>.
71;‚/releaselog/3_8_8_3.html3.8.8.3Ensure durability following a power loss with
    "PRAGMA journal_mode=TRUNCATE" by calling fsync() right after truncating
    the journal file.
b0;ƒreleaselog/3_8_8_3.html3.8.8.3
The <a href="../optoverview.html#autoindex">automatic indexing</a> optimization is now capable of generating
    a <a href="../partialindex.html">partial index</a> if that is appropriate.
/;areleaselog/3_8_8_3.html3.8.8.3Improvements to cost estimates for the <a href="../optoverview.html#skipscan">skip-scan optimization</a>.
.;oreleaselog/3_8_8_3.html3.8.8.3Reduce the number of memcpy() operations involved in balancing a b-tree,
    for 3.2% overall performance boost.
~-;ƒ=releaselog/3_8_8_3.html3.8.8.3
Added the <a href="https://www.sqlite.org/src/artifact/f971962e92ebb8b0">eval.c</a>
    <a href="../loadext.html">loadable extension</a> that implements an eval() SQL function that will recursively
    evaluate SQL.
v,;ƒ-releaselog/3_8_8_3.html3.8.8.3       The number of rows in a <a href="../lang_select.html#values">VALUES clause</a> is no longer limited by
    <a href="../c3ref/c_limit_attached.html#sqlitelimitcompoundselect">SQLITE_LIMIT_COMPOUND_SELECT</a>.
ƒ,+;†releaselog/3_8_8_3.html3.8.8.Added the <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpcachehdrsz">SQLITE_CONFIG_PCACHE_HDRSZ</a> option to <a href="../c3ref/config.html">sqlite3_config()</a>
    which makes it easier for applications to determine the appropriate
    amount of memory for use with <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpagecache">SQLITE_CONFIG_PAGECACHE</a>.
}*;ƒ;releaselog/3_8_8_3.html3.8.8.3Added the <a href="../compile.html#sorter_pmasz">SQLITE_SORTER_PMASZ</a> compile-time option and <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpmasz">SQLITE_CONFIG_PMASZ</a>
    start-time option.
);}releaselog/3_8_8_3.html3.8.8.3Added the <a href="../compile.html#reverse_unordered_selects">SQLITE_REVERSE_UNORDERED_SELECTS</a> compile-time option.
(;Yreleaselog/3_8_8_3.html3.8.8.3Added the <a href="../compile.html#enable_api_armor">SQLITE_ENABLE_API_ARMOR</a> compile-time option.

{s
X^
ä
}       MNXÈ&%u{vG;ƒ-releaselog/3_8_8_2.html3.8.8.2   The number of rows in a <a href="../lang_select.html#values">VALUES clause</a> is no longer limited by
    <a href="../c3ref/c_limit_attached.html#sqlitelimitcompoundselect">SQLITE_LIMIT_COMPOUND_SELECT</a>.
ƒ,F;†releaselog/3_8_8_2.html3.8.8.Added the <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpcachehdrsz">SQLITE_CONFIG_PCACHE_HDRSZ</a> option to <a href="../c3ref/config.html">sqlite3_config()</a>
    which makes it easier for applications to determine the appropriate
    amount of memory for use with <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpagecache">SQLITE_CONFIG_PAGECACHE</a>.
}E;ƒ;releaselog/3_8_8_2.html3.8.8.2Added the <a href="../compile.html#sorter_pmasz">SQLITE_SORTER_PMASZ</a> compile-time option and <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpmasz">SQLITE_CONFIG_PMASZ</a>
    start-time option.
D;}releaselog/3_8_8_2.html3.8.8.2Added the <a href="../compile.html#reverse_unordered_selects">SQLITE_REVERSE_UNORDERED_SELECTS</a> compile-time option.
C;Yreleaselog/3_8_8_2.html3.8.8.2Added the <a href="../compile.html#enable_api_armor">SQLITE_ENABLE_API_ARMOR</a> compile-time option.
ƒrB;‡%releaselog/3_8_8_2.html3.8.8.2The <a href="../c3ref/table_column_metadata.html">sqlite3_table_column_metadata()</a> is enhanced to work correctly on
    <a href="../withoutrowid.html">WITHOUT ROWID</a> tables and to check for the existence of a
    a table if the column name parameter is NULL.  The interface is now
    also included in the build by default, without requiring
    the <a href="../compile.html#enable_column_metadata">SQLITE_ENABLE_COLUMN_METADATA</a> compile-time option.
{A;ƒ7releaselog/3_8_8_2.html3.8.8.2Added the <a href="../c3ref/stmt_scanstatus.html">sqlite3_stmt_scanstatus()</a> interface, available only when
    compiled with <a href="../compile.html#enable_stmt_scanstatus">SQLITE_ENABLE_STMT_SCANSTATUS</a>.
‚Q@;„creleaselog/3_8_8_2.html3.8.8.2Added the <a href="../c3ref/c_checkpoint_full.html">SQLITE_CHECKPOINT_TRUNCATE</a> option to the
    <a href="../c3ref/wal_checkpoint_v2.html">sqlite3_wal_checkpoint_v2()</a> interface, with corresponding enhancements
    to <a href="../pragma.html#pragma_wal_checkpoint">PRAGMA wal_checkpoint</a>.
W?;        ‚qreleaselog/3_8_8_2.html3.8.8.2Added the <a href="../pragma.html#pragma_data_version">PRAGMA data_version</a> command that can be used to determine if
    a database file has been modified by another process.
d>;       releaselog/3_8_8_3.html3.8.8.3SHA1 for sqlite3.c: 74ee38c8c6fd175ec85a47276dfcefe8a262827a

w=;/releaselog/3_8_8_3.html3.8.8.3SQLITE_SOURCE_ID: "2015-02-25 13:29:11 9d6c1880fb75660bbabd693175579529785f8a6b"
v<;ƒ-releaselog/3_8_8_3.html3.8.8.3Added the ability to link against the 
    "<a href="https://github.com/antirez/linenoise">linenoise</a>"
    command-line editing library in unix builds of the <a href="../cli.html">command-line shell</a>.

‚3;;        „)releaselog/3_8_8_3.html3.8.8.3Fix a bug (ticket
    <a href="https://www.sqlite.org/src/info/2326c258d02ead33">2326c258d02ead33</a>) that can lead
    to incorrect results if the qualifying constraint of a <a href="../partialindex.html">partial index</a> appears in the
    ON clause of a LEFT JOIN.
`:;        ƒreleaselog/3_8_8_3.html3.8.8.3Enhance <a href="../c3ref/wal_checkpoint_v2.html">sqlite3_wal_checkpoint_v2(TRUNCATE)</a> interface so that it truncates the
    WAL file even if there is no checkpoint work to be done.

ƒ       9;  …Ureleaselog/3_8_8_3.html3.8.8.3Fix a bug in the sorting logic, present since version 3.8.4, that can cause
    output to appear in the wrong order on queries that contains an ORDER BY clause,
    a LIMIT clause, and that have approximately 60 or more columns in the result set.
    Ticket <a href="https://www.sqlite.org/src/tktview?name=f97c4637102a3ae72b79">f97c4637102a3ae72b79</a>.


ßþc
Ïé.
Á       ´Éê4
€œ"ºßWX;        ‚qreleaselog/3_8_8_1.html3.8.8.1Added the <a href="../pragma.html#pragma_data_version">PRAGMA data_version</a> command that can be used to determine if
    a database file has been modified by another process.
eW;releaselog/3_8_8_2.html3.8.8.2SHA1 for sqlite3.c: 85ce79948116aa9a087ec345c9d2ce2c1d3cd8af


wV;/releaselog/3_8_8_2.html3.8.8.2SQLITE_SOURCE_ID: "2015-01-30 14:30:45 7757fc721220e136620a89c9d28247f28bbbc098"
`U;        ƒreleaselog/3_8_8_2.html3.8.8.2Enhance <a href="../c3ref/wal_checkpoint_v2.html">sqlite3_wal_checkpoint_v2(TRUNCATE)</a> interface so that it truncates the
    WAL file even if there is no checkpoint work to be done.

ƒ       T;  …Ureleaselog/3_8_8_2.html3.8.8.2Fix a bug in the sorting logic, present since version 3.8.4, that can cause
    output to appear in the wrong order on queries that contains an ORDER BY clause,
    a LIMIT clause, and that have approximately 60 or more columns in the result set.
    Ticket <a href="https://www.sqlite.org/src/tktview?name=f97c4637102a3ae72b79">f97c4637102a3ae72b79</a>.

‚#S;„releaselog/3_8_8_2.html3.8.8.2Improvements to the effectiveness and accuracy of the
    <a href="../lang_corefunc.html#likelihood">likelihood()</a>, <a href="../lang_corefunc.html#likely">likely()</a>, and <a href="../lang_corefunc.html#unlikely">unlikely()</a> SQL hint functions.

2R;‚%releaselog/3_8_8_2.html3.8.8.2Disable the use of the strchrnul() C-library routine unless it is
    specifically enabled using the -DHAVE_STRCHRNULL compile-time option.
[Q;‚wreleaselog/3_8_8_2.html3.8.8.2Work around a GCC optimizer bug (for gcc 4.2.1 on MacOS 10.7) that caused the 
    <a href="../rtree.html">R-Tree extension</a> to compute incorrect results when compiled with -O3.
gP;ƒreleaselog/3_8_8_2.html3.8.8.2Fix obscure crash bugs found by
    <a href="http://lcamtuf.coredump.cx/afl/">american fuzzy lop</a>.  Ticket
    <a href="https://www.sqlite.org/src/info/a59ae93ee990a55">a59ae93ee990a55</a>.
pO;ƒ!releaselog/3_8_8_2.html3.8.8.2Fix data races that might occur under stress when running with many threads
    in <a href="../sharedcache.html">shared cache mode</a> where some of the threads are opening and
    closing connections.
‚N;ƒkreleaselog/3_8_8_2.html3.8.8.2Make sure ORDER BY puts rows in ascending order even if the DISTINCT
    operator  is implemented using a descending index.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/c5ea805691bfc4204b1cb9e">c5ea805691bfc4204b1cb9e</a>.
‚iM;…releaselog/3_8_8_2.html3.8.8.2The query planner now recognizes that any column in the right-hand
    table of a LEFT JOIN can be NULL, even if that column has a NOT NULL
    constraint.  Avoid trying to optimize out NULL tests in those cases.
    Fix for ticket
    <a href="https://www.sqlite.org/src/info/6f2222d550f5b0ee7ed">6f2222d550f5b0ee7ed</a>.
7L;‚/releaselog/3_8_8_2.html3.8.8.2Ensure durability following a power loss with
    "PRAGMA journal_mode=TRUNCATE" by calling fsync() right after truncating
    the journal file.
bK;ƒreleaselog/3_8_8_2.html3.8.8.2
The <a href="../optoverview.html#autoindex">automatic indexing</a> optimization is now capable of generating
    a <a href="../partialindex.html">partial index</a> if that is appropriate.
J;areleaselog/3_8_8_2.html3.8.8.2Improvements to cost estimates for the <a href="../optoverview.html#skipscan">skip-scan optimization</a>.
I;oreleaselog/3_8_8_2.html3.8.8.2Reduce the number of memcpy() operations involved in balancing a b-tree,
    for 3.2% overall performance boost.
~H;ƒ=releaselog/3_8_8_2.html3.8.8.2
Added the <a href="https://www.sqlite.org/src/artifact/f971962e92ebb8b0">eval.c</a>
    <a href="../loadext.html">loadable extension</a> that implements an eval() SQL function that will recursively
    evaluate SQL.

«
¦&
„       ƒÓÙ×<¨Âš‚g;ƒkreleaselog/3_8_8_1.html3.8.8.1Make sure ORDER BY puts rows in ascending order even if the DISTINCT
    operator  is implemented using a descending index.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/c5ea805691bfc4204b1cb9e">c5ea805691bfc4204b1cb9e</a>.
‚if;…releaselog/3_8_8_1.html3.8.8.1The query planner now recognizes that any column in the right-hand
    table of a LEFT JOIN can be NULL, even if that column has a NOT NULL
    constraint.  Avoid trying to optimize out NULL tests in those cases.
    Fix for ticket
    <a href="https://www.sqlite.org/src/info/6f2222d550f5b0ee7ed">6f2222d550f5b0ee7ed</a>.
7e;‚/releaselog/3_8_8_1.html3.8.8.1Ensure durability following a power loss with
    "PRAGMA journal_mode=TRUNCATE" by calling fsync() right after truncating
    the journal file.
bd;ƒreleaselog/3_8_8_1.html3.8.8.1
The <a href="../optoverview.html#autoindex">automatic indexing</a> optimization is now capable of generating
    a <a href="../partialindex.html">partial index</a> if that is appropriate.
c;areleaselog/3_8_8_1.html3.8.8.1Improvements to cost estimates for the <a href="../optoverview.html#skipscan">skip-scan optimization</a>.
b;oreleaselog/3_8_8_1.html3.8.8.1Reduce the number of memcpy() operations involved in balancing a b-tree,
    for 3.2% overall performance boost.
~a;ƒ=releaselog/3_8_8_1.html3.8.8.1
Added the <a href="https://www.sqlite.org/src/artifact/f971962e92ebb8b0">eval.c</a>
    <a href="../loadext.html">loadable extension</a> that implements an eval() SQL function that will recursively
    evaluate SQL.
v`;ƒ-releaselog/3_8_8_1.html3.8.8.1       The number of rows in a <a href="../lang_select.html#values">VALUES clause</a> is no longer limited by
    <a href="../c3ref/c_limit_attached.html#sqlitelimitcompoundselect">SQLITE_LIMIT_COMPOUND_SELECT</a>.
ƒ,_;†releaselog/3_8_8_1.html3.8.8.Added the <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpcachehdrsz">SQLITE_CONFIG_PCACHE_HDRSZ</a> option to <a href="../c3ref/config.html">sqlite3_config()</a>
    which makes it easier for applications to determine the appropriate
    amount of memory for use with <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpagecache">SQLITE_CONFIG_PAGECACHE</a>.
}^;ƒ;releaselog/3_8_8_1.html3.8.8.1Added the <a href="../compile.html#sorter_pmasz">SQLITE_SORTER_PMASZ</a> compile-time option and <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpmasz">SQLITE_CONFIG_PMASZ</a>
    start-time option.
];}releaselog/3_8_8_1.html3.8.8.1Added the <a href="../compile.html#reverse_unordered_selects">SQLITE_REVERSE_UNORDERED_SELECTS</a> compile-time option.
\;Yreleaselog/3_8_8_1.html3.8.8.1Added the <a href="../compile.html#enable_api_armor">SQLITE_ENABLE_API_ARMOR</a> compile-time option.
ƒr[;‡%releaselog/3_8_8_1.html3.8.8.1The <a href="../c3ref/table_column_metadata.html">sqlite3_table_column_metadata()</a> is enhanced to work correctly on
    <a href="../withoutrowid.html">WITHOUT ROWID</a> tables and to check for the existence of a
    a table if the column name parameter is NULL.  The interface is now
    also included in the build by default, without requiring
    the <a href="../compile.html#enable_column_metadata">SQLITE_ENABLE_COLUMN_METADATA</a> compile-time option.
{Z;ƒ7releaselog/3_8_8_1.html3.8.8.1Added the <a href="../c3ref/stmt_scanstatus.html">sqlite3_stmt_scanstatus()</a> interface, available only when
    compiled with <a href="../compile.html#enable_stmt_scanstatus">SQLITE_ENABLE_STMT_SCANSTATUS</a>.
‚QY;„creleaselog/3_8_8_1.html3.8.8.1Added the <a href="../c3ref/c_checkpoint_full.html">SQLITE_CHECKPOINT_TRUNCATE</a> option to the
    <a href="../c3ref/wal_checkpoint_v2.html">sqlite3_wal_checkpoint_v2()</a> interface, with corresponding enhancements
    to <a href="../pragma.html#pragma_wal_checkpoint">PRAGMA wal_checkpoint</a>.

»!
BŒe      Ø        ÏÔâV¸»yv7ƒ;releaselog/3_8_8.html3.8.8Added the <a href="../compile.html#sorter_pmasz">SQLITE_SORTER_PMASZ</a> compile-time option and <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpmasz">SQLITE_CONFIG_PMASZ</a>
    start-time option.
u7}releaselog/3_8_8.html3.8.8Added the <a href="../compile.html#reverse_unordered_selects">SQLITE_REVERSE_UNORDERED_SELECTS</a> compile-time option.
t7Yreleaselog/3_8_8.html3.8.8Added the <a href="../compile.html#enable_api_armor">SQLITE_ENABLE_API_ARMOR</a> compile-time option.
ƒns7‡%releaselog/3_8_8.html3.8.8The <a href="../c3ref/table_column_metadata.html">sqlite3_table_column_metadata()</a> is enhanced to work correctly on
    <a href="../withoutrowid.html">WITHOUT ROWID</a> tables and to check for the existence of a
    a table if the column name parameter is NULL.  The interface is now
    also included in the build by default, without requiring
    the <a href="../compile.html#enable_column_metadata">SQLITE_ENABLE_COLUMN_METADATA</a> compile-time option.
wr7ƒ7releaselog/3_8_8.html3.8.8Added the <a href="../c3ref/stmt_scanstatus.html">sqlite3_stmt_scanstatus()</a> interface, available only when
    compiled with <a href="../compile.html#enable_stmt_scanstatus">SQLITE_ENABLE_STMT_SCANSTATUS</a>.
‚Mq7„creleaselog/3_8_8.html3.8.8Added the <a href="../c3ref/c_checkpoint_full.html">SQLITE_CHECKPOINT_TRUNCATE</a> option to the
    <a href="../c3ref/wal_checkpoint_v2.html">sqlite3_wal_checkpoint_v2()</a> interface, with corresponding enhancements
    to <a href="../pragma.html#pragma_wal_checkpoint">PRAGMA wal_checkpoint</a>.
Sp7        ‚qreleaselog/3_8_8.html3.8.8Added the <a href="../pragma.html#pragma_data_version">PRAGMA data_version</a> command that can be used to determine if
    a database file has been modified by another process.
do;       releaselog/3_8_8_1.html3.8.8.1SHA1 for sqlite3.c: 33987fb50dcc09f1429a653d6b47672f5a96f19e

wn;/releaselog/3_8_8_1.html3.8.8.1SQLITE_SOURCE_ID: "2015-01-20 16:51:25 f73337e3e289915a76ca96e7a05a1a8d4e890d55"
ƒ       m;  …Ureleaselog/3_8_8_1.html3.8.8.1Fix a bug in the sorting logic, present since version 3.8.4, that can cause
    output to appear in the wrong order on queries that contains an ORDER BY clause,
    a LIMIT clause, and that have approximately 60 or more columns in the result set.
    Ticket <a href="https://www.sqlite.org/src/tktview?name=f97c4637102a3ae72b79">f97c4637102a3ae72b79</a>.

‚#l;„releaselog/3_8_8_1.html3.8.8.1Improvements to the effectiveness and accuracy of the
    <a href="../lang_corefunc.html#likelihood">likelihood()</a>, <a href="../lang_corefunc.html#likely">likely()</a>, and <a href="../lang_corefunc.html#unlikely">unlikely()</a> SQL hint functions.

2k;‚%releaselog/3_8_8_1.html3.8.8.1Disable the use of the strchrnul() C-library routine unless it is
    specifically enabled using the -DHAVE_STRCHRNULL compile-time option.
[j;‚wreleaselog/3_8_8_1.html3.8.8.1Work around a GCC optimizer bug (for gcc 4.2.1 on MacOS 10.7) that caused the 
    <a href="../rtree.html">R-Tree extension</a> to compute incorrect results when compiled with -O3.
gi;ƒreleaselog/3_8_8_1.html3.8.8.1Fix obscure crash bugs found by
    <a href="http://lcamtuf.coredump.cx/afl/">american fuzzy lop</a>.  Ticket
    <a href="https://www.sqlite.org/src/info/a59ae93ee990a55">a59ae93ee990a55</a>.
ph;ƒ!releaselog/3_8_8_1.html3.8.8.1Fix data races that might occur under stress when running with many threads
    in <a href="../sharedcache.html">shared cache mode</a> where some of the threads are opening and
    closing connections.

uT
^`É9
W       7"2Kp¾›%ÂVÜudŽ        ;  releaselog/3_8_7_4.html3.8.7.4SHA1 for sqlite3.c: 0a56693a3c24aa3217098afab1b6fecccdedfd23

w;/releaselog/3_8_7_4.html3.8.7.4SQLITE_SOURCE_ID: "2014-12-09 01:34:36 f66f7a17b78ba617acde90fc810107f34f1a1f2e"
iŽ; releaselog/3_8_7_4.html3.8.7.4Bug fix: Add in a mutex that was omitted from the previous release.
`Ž7       releaselog/3_8_8.html3.8.8SHA1 for sqlite3.c: 91aea4cc722371d58aae3d22e94d2a4165276905

sŽ7/releaselog/3_8_8.html3.8.8SQLITE_SOURCE_ID: "2015-01-16 12:08:06 7d68a42face3ab14ed88407d4331872f5b243fdf"
‚Ž7„releaselog/3_8_8.html3.8.8Improvements to the effectiveness and accuracy of the
    <a href="../lang_corefunc.html#likelihood">likelihood()</a>, <a href="../lang_corefunc.html#likely">likely()</a>, and <a href="../lang_corefunc.html#unlikely">unlikely()</a> SQL hint functions.

.Ž7‚%releaselog/3_8_8.html3.8.8Disable the use of the strchrnul() C-library routine unless it is
    specifically enabled using the -DHAVE_STRCHRNULL compile-time option.
WŽ7‚wreleaselog/3_8_8.html3.8.8Work around a GCC optimizer bug (for gcc 4.2.1 on MacOS 10.7) that caused the 
    <a href="../rtree.html">R-Tree extension</a> to compute incorrect results when compiled with -O3.
cŽ7ƒreleaselog/3_8_8.html3.8.8Fix obscure crash bugs found by
    <a href="http://lcamtuf.coredump.cx/afl/">american fuzzy lop</a>.  Ticket
    <a href="https://www.sqlite.org/src/info/a59ae93ee990a55">a59ae93ee990a55</a>.
lŽ7ƒ!releaselog/3_8_8.html3.8.8Fix data races that might occur under stress when running with many threads
    in <a href="../sharedcache.html">shared cache mode</a> where some of the threads are opening and
    closing connections.
‚7ƒkreleaselog/3_8_8.html3.8.8Make sure ORDER BY puts rows in ascending order even if the DISTINCT
    operator  is implemented using a descending index.  Fix for ticket
    <a href="https://www.sqlite.org/src/info/c5ea805691bfc4204b1cb9e">c5ea805691bfc4204b1cb9e</a>.
‚e~7…releaselog/3_8_8.html3.8.8The query planner now recognizes that any column in the right-hand
    table of a LEFT JOIN can be NULL, even if that column has a NOT NULL
    constraint.  Avoid trying to optimize out NULL tests in those cases.
    Fix for ticket
    <a href="https://www.sqlite.org/src/info/6f2222d550f5b0ee7ed">6f2222d550f5b0ee7ed</a>.
3}7‚/releaselog/3_8_8.html3.8.8Ensure durability following a power loss with
    "PRAGMA journal_mode=TRUNCATE" by calling fsync() right after truncating
    the journal file.
^|7ƒreleaselog/3_8_8.html3.8.8
The <a href="../optoverview.html#autoindex">automatic indexing</a> optimization is now capable of generating
    a <a href="../partialindex.html">partial index</a> if that is appropriate.
{7areleaselog/3_8_8.html3.8.8Improvements to cost estimates for the <a href="../optoverview.html#skipscan">skip-scan optimization</a>.
z7oreleaselog/3_8_8.html3.8.8Reduce the number of memcpy() operations involved in balancing a b-tree,
    for 3.2% overall performance boost.
zy7ƒ=releaselog/3_8_8.html3.8.8
Added the <a href="https://www.sqlite.org/src/artifact/f971962e92ebb8b0">eval.c</a>
    <a href="../loadext.html">loadable extension</a> that implements an eval() SQL function that will recursively
    evaluate SQL.
rx7ƒ-releaselog/3_8_8.html3.8.8   The number of rows in a <a href="../lang_select.html#values">VALUES clause</a> is no longer limited by
    <a href="../c3ref/c_limit_attached.html#sqlitelimitcompoundselect">SQLITE_LIMIT_COMPOUND_SELECT</a>.
ƒ(w7†releaselog/3_8_8.html3.8.Added the <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpcachehdrsz">SQLITE_CONFIG_PCACHE_HDRSZ</a> option to <a href="../c3ref/config.html">sqlite3_config()</a>
    which makes it easier for applications to determine the appropriate
    amount of memory for use with <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpagecache">SQLITE_CONFIG_PAGECACHE</a>.

»AÚ
     ƒKÑjl‡×äjdŽ;   releaselog/3_8_7_1.html3.8.7.1SHA1 for sqlite3.c: 2d25bd1a73dc40f538f3a81c28e6efa5999bdf0c

wŽ;/releaselog/3_8_7_1.html3.8.7.1SQLITE_SOURCE_ID: "2014-10-29 13:59:56 3b7b72c4685aa5cf5e675c2c47ebec10d9704221"
oŽ;ƒreleaselog/3_8_7_1.html3.8.7.1Fix a couple of problems associated with running an UPDATE or DELETE on a
    <a href="../lang_createview.html">VIEW</a> with a <a href="../lang_createtable.html#rowid">rowid</a> in the WHERE clause.

,Ž;‚releaselog/3_8_7_1.html3.8.7.1Do not attempt to use the strchrnul() function from the standard C library unless
    the HAVE_STRCHRNULL compile-time option is set.
aŽ;ƒreleaselog/3_8_7_1.html3.8.7.1Fix an assertion fault that can occur when updating the NULL value of a field
    at the end of a table that was added using <a href="../lang_altertable.html">ALTER TABLE ADD COLUMN</a>.
zŽ;        ƒ7releaselog/3_8_7_1.html3.8.7.1In <a href="../pragma.html#pragma_journal_mode">PRAGMA journal_mode=TRUNCATE</a> mode, call fsync() immediately after truncating
    the journal file to ensure that the transaction is durable across a power loss.
dŽ;       releaselog/3_8_7_2.html3.8.7.2SHA1 for sqlite3.c: b2a68d5783f48dba6a8cb50d8bf69b238c5ec53a

wŽ;/releaselog/3_8_7_2.html3.8.7.2SQLITE_SOURCE_ID: "2014-11-18 20:57:56 2ab564bf9655b7c7b97ab85cafc8a48329b27f93"
‚4Ž;„)releaselog/3_8_7_2.html3.8.7.2Bug fix:  Do not automatically remove the DISTINCT keyword from a SELECT that forms
    the right-hand side of an IN operator since it is necessary if the SELECT also 
    contains a LIMIT.
    Ticket <a href="http://www.sqlite.org/src/info/db87229497">db87229497</a>.

Ž;Creleaselog/3_8_7_2.html3.8.7.2Bug fix:  The %c format in sqlite3_mprintf() is able to handle precisions greater than 70.
zŽ;ƒ5releaselog/3_8_7_2.html3.8.7.2Bug fix: Make sure that NULL results from OP_Column are fully and completely NULL and
    do not have the MEM_Ephem bit set.
    Ticket <a href="http://www.sqlite.org/src/info/094d39a4c95ee4">094d39a4c95ee4</a>.
ƒPŽ;        †creleaselog/3_8_7_2.html3.8.7.2Enhance the <a href="../lang_transaction.html">ROLLBACK</a> command so that pending queries are allowed to continue as long
    as the schema is unchanged.  Formerly, a ROLLBACK would cause all pending queries to
    fail with an <a href="../rescode.html#abort">SQLITE_ABORT</a> or <a href="../rescode.html#abort_rollback">SQLITE_ABORT_ROLLBACK</a> error.  That error is still returned
    if the ROLLBACK modifies the schema.
dŽ
;       releaselog/3_8_7_3.html3.8.7.3SHA1 for sqlite3.c: 3ad2f5ba3a4a3e3e51a1dac9fda9224b359f0261

wŽ;/releaselog/3_8_7_3.html3.8.7.3SQLITE_SOURCE_ID: "2014-12-05 22:29:24 647e77e853e81a5effeb4c33477910400a67ba86"
‚XŽ;„qreleaselog/3_8_7_3.html3.8.7.3Bug fix: Recognize that any column in the right-hand table of a LEFT JOIN can be
    NULL even if the column has a NOT NULL constraint.  Do not apply optimizations that
    assume the column is never NULL.  Ticket
    <a href="https://www.sqlite.org/src/info/6f2222d550f5b0ee7ed">6f2222d550f5b0ee7ed</a>.

ƒeŽ
;    ‡
releaselog/3_8_7_3.html3.8.7.3Bug fix: Ensure the cached KeyInfo objects (an internal abstraction not visible to the
    application) do not go stale when operating in <a href="../sharedcache.html">shared cache mode</a> and frequently closing
    and reopening some database connections while leaving other database connections on the
    same shared cache open continuously.  Ticket 
    <a href="https://www.sqlite.org/src/info/e4a18565a36884b00edf">e4a18565a36884b00edf</a>.

I
ç{ˆ
{‡6Œìœ1òI%Ž'7‚releaselog/3_8_7.html3.8.7Fix a faulty assert() statement.
    Ticket <a href="http://www.sqlite.org/src/info/369d57fb8e5ccdff06f1">369d57fb8e5ccdff06f1</a>
‚;Ž&7„?releaselog/3_8_7.html3.8.7
Fix a bug in <a href="../c3ref/profile.html">sqlite3_trace()</a> that was causing it to sometimes fail to print
    an SQL statement if that statement needed to be re-prepared.
    Ticket <a href="http://www.sqlite.org/src/info/11d5aa455e0d98f3c1e6a08">11d5aa455e0d98f3c1e6a08</a>
‚gŽ%7…releaselog/3_8_7.html3.8.7Fix a query planner bug that might cause a table to be scanned in the wrong direction
    (thus reversing the order of output) when a DESC index is used to implement the ORDER BY
    clause on a query that has an identical GROUP BY clause.
    Ticket <a href="http://www.sqlite.org/src/info/ba7cbfaedc7e6">ba7cbfaedc7e6</a>.
‚LŽ$7„areleaselog/3_8_7.html3.8.7Fix a bug in the <a href="../partialindex.html">partial index</a> implementation that might result in an incorrect
    answer if a partial index is used in a subquery or in a <a href="../lang_createview.html">view</a>.
    Ticket <a href="http://www.sqlite.org/src/info/98d973b8f5">98d973b8f5</a>.
Ž#7‚releaselog/3_8_7.html3.8.7
Added the <a href="http://www.sqlite.org/src/doc/trunk/ext/userauth/user-auth.txt">User Authentication</a>
    extension.
&Ž"7‚releaselog/3_8_7.html3.8.7   The <a href="../spellfix1.html">spellfix1</a> extension allows the application to optionally specify the rowid for
    each INSERT.
‚MŽ!7„creleaselog/3_8_7.html3.8.Added the <a href="../c3ref/c_limit_attached.html#sqlitelimitworkerthreads">SQLITE_LIMIT_WORKER_THREADS</a> option to <a href="../c3ref/limit.html">sqlite3_limit()</a> and
    <a href="../pragma.html#pragma_threads">PRAGMA threads</a> command for configuring the number of available worker threads.
pŽ 7ƒ)releaselog/3_8_7.html3.8.7Added the new interface <a href="../c3ref/free.html">sqlite3_msize()</a> that returns the size of a memory allocation
    obtained from <a href="../c3ref/free.html">sqlite3_malloc64()</a> and its variants.
ƒYŽ7†{releaselog/3_8_7.html3.8.7Added new interfaces with 64-bit length parameters:
    <a href="../c3ref/free.html">sqlite3_malloc64()</a>,
    <a href="../c3ref/free.html">sqlite3_realloc64()</a>,
    <a href="../c3ref/bind_blob.html">sqlite3_bind_blob64()</a>,
    <a href="../c3ref/result_blob.html">sqlite3_result_blob64()</a>,
    <a href="../c3ref/bind_blob.html">sqlite3_bind_text64()</a>, and
    <a href="../c3ref/result_blob.html">sqlite3_result_text64()</a>.
5Ž7‚3releaselog/3_8_7.html3.8.7Various improvements in how the query planner uses <a href="../fileformat2.html#stat4tab">sqlite_stat4</a>
    information to estimate plan costs.
tŽ71releaselog/3_8_7.html3.8.7Improved optimization of <a href="../lang_expr.html#castexpr">CAST</a> operators.
oŽ7ƒ'releaselog/3_8_7.html3.8.7Enhance the <a href="../optoverview.html#skipscan">skip-scan</a> optimization so that it is able to skip index terms that
    occur in the middle of the index, not just as the left-hand side of the index.
‚hŽ7…releaselog/3_8_7.html3.8.7The sorter can use auxiliary helper threads to increase real-time response.
    This feature is off by default and may be
    enabled using the <a href="../pragma.html#pragma_threads">PRAGMA threads</a> command or the <a href="../compile.html#default_worker_threads">SQLITE_DEFAULT_WORKER_THREADS</a>
    compile-time option.
„Ž7        ‡ureleaselog/3_8_7.html3.8.7Many micro-optimizations result in 20.3% more work for the same number
    of CPU cycles relative to the previous release. 
    The cumulative performance increase since <a href="../releaselog/3_8_0.html">version 3.8.0</a> is 61%.
    (Measured using 
    <a href="http://valgrind.org/docs/manual/cg-manual.html">cachegrind</a> on the
    <a href="http://www.sqlite.org/src/artifact/83f6b3318f7ee">speedtest1.c</a> workload on
    Ubuntu 13.10 x64 with gcc 4.8.1 and -Os. Your performance may vary.)

M
a¦0Ì+
       0‰ïv¢èMŽ:7wreleaselog/3_8_6.html3.8.6Ensure that the query planner never tries to use a self-made transient
    index in place of a schema-defined index.
‚(Ž97„releaselog/3_8_6.html3.8.6
The query planner now uses <a href="../fileformat2.html#stat4tab">sqlite_stat4</a> information (created by <a href="../lang_analyze.html">ANALYZE</a>)
    to help determine if the <a href="../optoverview.html#skipscan">skip-scan optimization</a> is appropriate.
ƒ
Ž87…]releaselog/3_8_6.html3.8.6Add the capability of evaluating an <a href="../lang_expr.html#in_op">IN operator</a> as a sequence
    of comparisons as an alternative to using a table lookup.  Use the sequence
    of comparisons implementation in circumstances where it is likely to be
    faster, such as when the right-hand side of the IN operator
    is small and/or changes frequently.
PŽ77‚ireleaselog/3_8_6.html3.8.6Deactivate the <a href="../lang_select.html#distinct">DISTINCT</a> keyword on subqueries on the
    right-hand side of the <a href="../lang_expr.html#in_op">IN operator</a>.
Ž67‚releaselog/3_8_6.html3.8.6
Added the <a href="../cli.html#fullschema">.fullschema</a> dot-command to the <a href="../cli.html">command-line shell</a>.
uŽ57ƒ3releaselog/3_8_6.html3.8.6   Add extension functions <a href="../cli.html#fileio">readfile(X) and writefile(X,Y)</a>
    (using code copy/pasted from fileio.c in the previous bullet) to the
    <a href="../cli.html">command-line shell</a>.
ZŽ47‚}releaselog/3_8_6.html3.8.Added a new
    <a href="../loadext.html">loadable extension</a> source code file to the source tree:
    <a href="http://www.sqlite.org/src/finfo?name=ext/misc/fileio.c">fileio.c</a>
Ž37ureleaselog/3_8_6.html3.8.6Trigger automatic reprepares on all prepared statements when <a href="../lang_analyze.html">ANALYZE</a> is
    run.
#Ž27‚releaselog/3_8_6.html3.8.6The <a href="../fts3.html#unicode61">unicode61</a> tokenizer is now included in <a href="../fts3.html#fts4">FTS4</a> by default.
oŽ17'releaselog/3_8_6.html3.8.6Added the <a href="../lang_corefunc.html#likely">likely(X)</a> SQL function.
MŽ07‚creleaselog/3_8_6.html3.8.6Increase the timeout in <a href="../wal.html">WAL mode</a> before issuing an <a href="../rescode.html#protocol">SQLITE_PROTOCOL</a>
    error from 1 second to 10 seconds.
Ž/7ereleaselog/3_8_6.html3.8.6Increase the maximum value of <a href="../limits.html#max_attached">SQLITE_MAX_ATTACHED</a> from 62 to 125.
‚"Ž.7„
releaselog/3_8_6.html3.8.6Enhanced the <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> command to detect <a href="../lang_createtable.html#uniqueconst">UNIQUE</a> and
    <a href="../lang_createtable.html#notnullconst">NOT NULL</a> constraint violations.
Ž-7        ‚releaselog/3_8_6.html3.8.6Added support for <a href="../lang_expr.html#hexint">hexadecimal integer literals</a> in the SQL parser.
    (Ex: 0x123abc)
aŽ,7releaselog/3_8_7.html3.8.7SHA1 for sqlite3.c: 56dcf5e931a9e1fa12fc2d600cd91d3bf9b639cd


sŽ+7/releaselog/3_8_7.html3.8.7SQLITE_SOURCE_ID: "2014-10-17 11:24:17 e4ab094f8afce0817f4074e823fabe59fc29ebb4"
7Ž*7‚7releaselog/3_8_7.html3.8.7New options to the <a href="../cli.html">command-line shell</a> for configuring auxiliary
    memory usage: --pagecache, --lookaside, and --scratch.
Ž)7‚releaselog/3_8_7.html3.8.7Drop support for SQLITE_ENABLE_TREE_EXPLAIN.  The SELECTTRACE mechanism provides
    more useful diagnostics information.
ƒ{Ž(7‡?releaselog/3_8_7.html3.8.7Show ASCII-art abstract syntax tree diagrams using the ".selecttrace"
    and ".wheretrace" commands in the 
    <a href="../cli.html">command-line shell</a> when compiled with <a href="../compile.html#debug">SQLITE_DEBUG</a>, SQLITE_ENABLE_SELECTTRACE,
    and SQLITE_ENABLE_WHERETRACE.  Also provide the sqlite3TreeViewExpr() and
    sqlite3TreeViewSelect() entry points that can be invoked from with the
    debugger to show the parse tree when stopped at a breakpoint.

e†~
^       ‘0ºWØ(rórÅæe~ŽM7Ereleaselog/3_8_5.html3.8.5    Add the ".system" and ".once" commands to the <a href="../cli.html">command-line shell</a>.
[ŽL7‚releaselog/3_8_5.html3.8.Render expressions of the form "x IN (?)" (with a single value in
    the list on the right-hand side of the IN operator) as if they where "x==?",
    Similarly optimize "x NOT IN (?)"
)ŽK7‚releaselog/3_8_5.html3.8.5Enable the <a href="../queryplanner.html#or_in_where">OR optimization</a> for <a href="../withoutrowid.html">WITHOUT ROWID</a> tables.
~ŽJ7Ereleaselog/3_8_5.html3.8.5Use less memory by not remembering CHECK constraints on read-only
    database connections.
|ŽI7Areleaselog/3_8_5.html3.8.5Added new <a href="../uri.html#coreqp">URI query parameters</a> "nolock" and "immutable".
(ŽH7‚releaselog/3_8_5.html3.8.5Added the <a href="../rtree.html#xquery">sqlite3_rtree_query_callback()</a> interface to <a href="../rtree.html">R-Tree extension</a>
‚ŽG7ƒUreleaselog/3_8_5.html3.8.5Improvements to the <a href="../fts3.html#*fts4automergecmd">automerge command</a> of <a href="../fts3.html#fts4">FTS4</a> to better control the index size
    for a full-text index that is subject to a large number of updates.
,ŽF7‚!releaselog/3_8_5.html3.8.5Enhance the query planner so that it always prefers an index that uses a superset of
    WHERE clause terms relative to some other index.
|ŽE7 Creleaselog/3_8_5.html3.8.5Added support for <a href="../queryplanner.html#partialsort">partial sorting by index</a>.
`ŽD7       releaselog/3_8_6.html3.8.6SHA1 for sqlite3.c: 72c64f05cd9babb9c0f9b3c82536d83be7804b1c

sŽC7/releaselog/3_8_6.html3.8.6SQLITE_SOURCE_ID: "2014-08-15 11:46:33 9491ba7d738528f168657adb43a198238abde19e"
‚]ŽB7…releaselog/3_8_6.html3.8.6Fix the <a href="../lang_analyze.html">ANALYZE</a> command so that it adds correct samples for
    <a href="../withoutrowid.html">WITHOUT ROWID</a> tables in the <a href="../fileformat2.html#stat4tab">sqlite_stat4</a> table.
    Ticket <a href="http://www.sqlite.org/src/info/b2fa5424e6fcb15">b2fa5424e6fcb15</a>.

tŽA7ƒ1releaselog/3_8_6.html3.8.6Fix a <a href="../datatype3.html#affinity">column affinity</a> problem with the <a href="../lang_expr.html#in_op">IN operator</a>.
    Ticket <a href="http://www.sqlite.org/src/info/9a8b09f8e6">9a8b09f8e6</a>.
QŽ@7‚kreleaselog/3_8_6.html3.8.6CSV output from the <a href="../cli.html">command-line shell</a> now always uses CRNL for the
    row separator and avoids inserting CR in front of NLs contained in
    data.
‚Ž?7„releaselog/3_8_6.html3.8.6Fix a bug in that would cause a null pointer to be dereferenced
    if a column with a DEFAULT that is an aggregate function tried to usee its
    DEFAULT.
    Ticket <a href="http://www.sqlite.org/src/info/3a88d85f36704eebe1">3a88d85f36704eebe1</a>
}Ž>7ƒCreleaselog/3_8_6.html3.8.6Fix the <a href="../c3ref/stmt_busy.html">sqlite3_stmt_busy()</a> interface so that it gives the correct answer
    for <a href="../lang_transaction.html">ROLLBACK</a> statements that have been stepped but never reset.
Ž=7…Yreleaselog/3_8_6.html3.8.6Fix a bug in <a href="../rtree.html">R-Tree extension</a>, introduced in the previous release,
    that can cause an
    incorrect results for queries that use the rowid of the R-Tree on the
    left-hand side of an <a href="../lang_expr.html#in_op">IN operator</a>.
    Ticket <a href="http://www.sqlite.org/src/info/d2889096e7bdeac6">d2889096e7bdeac6</a>.
‚wŽ<7…7releaselog/3_8_6.html3.8.6Fix a bug in <a href="../lang_createindex.html">CREATE UNIQUE INDEX</a>, introduced when <a href="../withoutrowid.html">WITHOUT ROWID</a>
    support added in version 3.8.2, that allows a non-unique NOT NULL column to be
    given a UNIQUE index.
    Ticket <a href="http://www.sqlite.org/src/info/9a6daf340df99ba93c">9a6daf340df99ba93c</a>
wŽ;77releaselog/3_8_6.html3.8.6Other minor tweaks to improve the quality of <a href="../opcode.html">VDBE</a> code.

q
ã
$Œ
Ò       ü       `
ž;×mÈpq{Žb;ƒ7releaselog/3_8_4_3.html3.8.4.3Add support for coverage testing of VDBE programs using the
    <a href="../c3ref/c_testctrl_always.html">SQLITE_TESTCTRL_VDBE_COVERAGE</a> verb of <a href="../c3ref/test_control.html">sqlite3_test_control()</a>.
UŽa;mreleaselog/3_8_4_3.html3.8.4.3Fix editline support in the command-line shell.
!Ž`;‚releaselog/3_8_4_3.html3.8.4.3Update the banner on the command-line shell to alert novice users when they
    are using an ephemeral in-memory database.
gŽ_;releaselog/3_8_4_3.html3.8.4.3Add the ".clone" and ".save" commands to the command-line shell.
aŽ^; releaselog/3_8_4_3.html3.8.4.3Code optimization and refactoring for improved performance.
`Ž]7       releaselog/3_8_5.html3.8.5SHA1 for sqlite3.c: 7bc194957238c61b1a47f301270286be5bc5208c

sŽ\7/releaselog/3_8_5.html3.8.5SQLITE_SOURCE_ID: "2014-06-04 14:06:34 b1ed4f2a34ba66c29b130f8d13e9092758019212"
mŽ[7ƒ#releaselog/3_8_5.html3.8.5Fix the <a href="../c3ref/db_readonly.html">sqlite3_db_readonly()</a> interface so that it returns true if
    the database is read-only due to the file format write version number
    being too large.

~ŽZ7ƒEreleaselog/3_8_5.html3.8.5Fix a problem in FTS4 where the left-most column that contained
    the <a href="../fts3.html#fts4notindexed">notindexed column</a> name as a prefix
    was not indexed rather than the column whose name matched exactly.
ŽY7ƒGreleaselog/3_8_5.html3.8.5Fix a problem in CSV import in the <a href="../cli.html">command-line shell</a>
    where if the leftmost field of the first row
    in the CSV file was both zero bytes in size and unquoted no data would
    be imported.
‚RŽX7„mreleaselog/3_8_5.html3.8.5Fix a bug in the VDBE code generator that caused crashes when
    doing an INSERT INTO ... SELECT statement where the number of columns
    being inserted is larger than the number of columns in the destination
    table.
    Ticket <a href="http://www.sqlite.org/src/info/e9654505cfda9">e9654505cfd</a>
hŽW7ƒreleaselog/3_8_5.html3.8.5The group_concat(x,'') SQL function returns NULL instead of an empty string
    when all inputs are empty strings.  
    Ticket <a href="http://www.sqlite.org/src/info/55746f9e65f85">55746f9e65</a>
,ŽV7‚!releaselog/3_8_5.html3.8.5ORDER BY ignored if the query has an identical GROUP BY.
    Ticket <a href="http://www.sqlite.org/src/info/b75a9ca6b0499">b75a9ca6b0</a>
RŽU7‚mreleaselog/3_8_5.html3.8.5Crash when calling undocumented SQL function sqlite_rename_parent()
    with NULL parameters.
    Ticket <a href="http://www.sqlite.org/src/info/264b970c4379fd">264b970c43</a>
+ŽT7‚releaselog/3_8_5.html3.8.5Partial index causes assertion fault on UPDATE OR REPLACE.
    Ticket <a href="http://www.sqlite.org/src/info/2ea3e9fe63">2ea3e9fe63</a>
‚ŽS7ƒWreleaselog/3_8_5.html3.8.5Duplicate row returned on a query against a table with more than
    16 indices, each on a separate column, and all used via OR-connected constraints.
    Ticket <a href="http://www.sqlite.org/src/info/10fb063b11">10fb063b11</a>
ŽR7qreleaselog/3_8_5.html3.8.5Incorrect column datatype reported.
    Ticket <a href="http://www.sqlite.org/src/info/a8a0d2996a">a8a0d2996a</a>
;ŽQ7‚?releaselog/3_8_5.html3.8.5
Assertion fault on queries involving expressions of the form
    "x IN (?)".  Ticket <a href="http://www.sqlite.org/src/info/e39d032577">e39d032577</a>.
(ŽP7‚releaselog/3_8_5.html3.8.5OFFSET clause ignored on queries without a FROM clause.
    Ticket <a href="http://www.sqlite.org/src/info/07d6a0453d">07d6a0453d</a>
ŽO7Mreleaselog/3_8_5.html3.8.5Added the <a href="../c3ref/c_testctrl_always.html">SQLITE_TESTCTRL_BYTEORDER</a> test control.
gŽN7ƒreleaselog/3_8_5.html3.8.5
Added the <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_IMMUTABLE</a> bit to the set of bits that can be returned by
    the xDeviceCharacteristics method of a <a href="../vfs.html">VFS</a>.

A’ô£
½§2
$m •´PæA!Žv;‚releaselog/3_8_4_2.html3.8.4.2Update the banner on the command-line shell to alert novice users when they
    are using an ephemeral in-memory database.
gŽu;releaselog/3_8_4_2.html3.8.4.2Add the ".clone" and ".save" commands to the command-line shell.
aŽt; releaselog/3_8_4_2.html3.8.4.2Code optimization and refactoring for improved performance.
dŽs;       releaselog/3_8_4_3.html3.8.4.3SHA1 for sqlite3.c: 310a1faeb9332a3cd8d1f53b4a2e055abf537bdc

wŽr;/releaselog/3_8_4_3.html3.8.4.3SQLITE_SOURCE_ID: "2014-04-03 16:53:12 a611fa96c4a848614efe899130359c9f6fb889c3"
‚yŽq;        …5releaselog/3_8_4_3.html3.8.4.3Add a 
    <a href="http://www.sqlite.org/src/fdiff?sbs=1&v1=7d539cedb1c&v2=ebad891b7494d&smhdr">one-character fix</a>
    for a problem that might cause incorrect query results on a query that mixes
    DISTINCT, GROUP BY in a subquery, and ORDER BY.
    <a href="http://www.sqlite.org/src/info/98825a79ce1456863">Ticket 98825a79ce14</a>.

Žp;  Wreleaselog/3_8_4_3.html3.8.4.3Fix a potential buffer overread that could result when trying to search a
    corrupt database file.
IŽo;‚Sreleaselog/3_8_4_3.html3.8.4.3When computing the cost of the <a href="../optoverview.html#skipscan">skip-scan optimization</a>, take into account the
    fact that multiple seeks are required.
!Žn;        ‚releaselog/3_8_4_3.html3.8.4.3Work around a C-preprocessor macro conflict that breaks the build for some
    configurations with Microsoft Visual Studio.
‚Žm;ƒ]releaselog/3_8_4_3.html3.8.4.3Bug fix: Fix column default values expressions of the form
    "DEFAULT(-(-9223372036854775808))" so that they work correctly, initializing
    the column to a floating point value approximately equal to
    +9223372036854775808.0.
nŽl;ƒreleaselog/3_8_4_3.html3.8.4.3Bug fix: Repair a name-resolution error that can occur in sub-select statements
    contained within a TRIGGER.
    <a href="http://www.sqlite.org/src/info/4ef7e3cfca">Ticket &#91;4ef7e3cfca&#93;</a>
IŽk;‚Sreleaselog/3_8_4_3.html3.8.4.3Bug fix: Ensure that "ORDER BY random()" clauses do not get optimized out.
    <a href="http://www.sqlite.org/src/info/65bdeb9739">Ticket &#91;65bdeb9739&#93;</a>
‚RŽj;„ereleaselog/3_8_4_3.html3.8.4.3
Bug fix: Make sure the same temporary registers are not used in concurrent
    co-routines used to implement compound SELECT statements containing ORDER
    BY clauses, as such use can lead to incorrect answers.
    <a href="http://www.sqlite.org/src/info/8c63ff0eca">Ticket &#91;8c63ff0eca&#93;</a>
uŽi;ƒ+releaselog/3_8_4_3.html3.8.4.3Bug fix: Make sure "rowid" columns are correctly resolved in joins between
    normal tables and WITHOUT ROWID tables.
    <a href="http://www.sqlite.org/src/info/c34d0557f7">Ticket &#91;c34d0557f7&#93;</a>
‚qŽh;…#releaselog/3_8_4_3.html3.8.4.3Bug fix: Compute the correct answer for queries that contain an IS NOT NULL
    term in the WHERE clause and also contain an OR term in the WHERE clause and
    are compiled with <a href="../compile.html#enable_stat4">SQLITE_ENABLE_STAT4</a>.
    <a href="http://www.sqlite.org/src/info/4c86b126f2">Ticket &#91;4c86b126f2&#93;</a>
‚Žg;ƒereleaselog/3_8_4_3.html3.8.4.3
Bug fix: DISTINCT now recognizes that a <a href="../lang_corefunc.html#zeroblob">zeroblob</a> and a blob of all
    0x00 bytes are the same thing. 
    <a href="http://www.sqlite.org/src/info/fccbde530a">Ticket &#91;fccbde530a&#93;</a>
bŽf;ƒreleaselog/3_8_4_3.html3.8.4.3       Bug fix: Fix the <a href="../lang_corefunc.html#char">char()</a> SQL function so that it returns an empty string
    rather than an "out of memory" error when called with zero arguments. 
NŽe;_releaselog/3_8_4_3.html3.8.4.Get extension loading working on Cygwin.
Žd;ureleaselog/3_8_4_3.html3.8.4.3Change the datatype of SrcList.nSrc from type u8 to type int to work around 
    an issue in the C compiler on AIX.
kŽc;releaselog/3_8_4_3.html3.8.4.3Update the _FILE_OFFSET_BITS macro so that builds work again on QNX.

g¨©;

LfP  ⌿ͻI»AÚvg!;‚releaselog/3_8_4_1.html3.8.4.1Update the banner on the command-line shell to alert novice users when they
    are using an ephemeral in-memory database.
g
;releaselog/3_8_4_1.html3.8.4.1Add the ".clone" and ".save" commands to the command-line shell.
a      ;    releaselog/3_8_4_1.html3.8.4.1Code optimization and refactoring for improved performance.
d; releaselog/3_8_4_2.html3.8.4.2SHA1 for sqlite3.c: 4685ca86c2ea0649ed9f59a500013e90b3fe6d03

w;/releaselog/3_8_4_2.html3.8.4.2SQLITE_SOURCE_ID: "2014-03-26 18:51:19 02ea166372bdb2ef9d8dfbb05e78a97609673a8e"

;  Wreleaselog/3_8_4_2.html3.8.4.2Fix a potential buffer overread that could result when trying to search a
    corrupt database file.
I;‚Sreleaselog/3_8_4_2.html3.8.4.2When computing the cost of the <a href="../optoverview.html#skipscan">skip-scan optimization</a>, take into account the
    fact that multiple seeks are required.
!;        ‚releaselog/3_8_4_2.html3.8.4.2Work around a C-preprocessor macro conflict that breaks the build for some
    configurations with Microsoft Visual Studio.
‚;ƒ]releaselog/3_8_4_2.html3.8.4.2Bug fix: Fix column default values expressions of the form
    "DEFAULT(-(-9223372036854775808))" so that they work correctly, initializing
    the column to a floating point value approximately equal to
    +9223372036854775808.0.
n;ƒreleaselog/3_8_4_2.html3.8.4.2Bug fix: Repair a name-resolution error that can occur in sub-select statements
    contained within a TRIGGER.
    <a href="http://www.sqlite.org/src/info/4ef7e3cfca">Ticket &#91;4ef7e3cfca&#93;</a>
I;‚Sreleaselog/3_8_4_2.html3.8.4.2Bug fix: Ensure that "ORDER BY random()" clauses do not get optimized out.
    <a href="http://www.sqlite.org/src/info/65bdeb9739">Ticket &#91;65bdeb9739&#93;</a>
‚R;„ereleaselog/3_8_4_2.html3.8.4.2
Bug fix: Make sure the same temporary registers are not used in concurrent
    co-routines used to implement compound SELECT statements containing ORDER
    BY clauses, as such use can lead to incorrect answers.
    <a href="http://www.sqlite.org/src/info/8c63ff0eca">Ticket &#91;8c63ff0eca&#93;</a>
uŽ;ƒ+releaselog/3_8_4_2.html3.8.4.2Bug fix: Make sure "rowid" columns are correctly resolved in joins between
    normal tables and WITHOUT ROWID tables.
    <a href="http://www.sqlite.org/src/info/c34d0557f7">Ticket &#91;c34d0557f7&#93;</a>
‚qŽ~;…#releaselog/3_8_4_2.html3.8.4.2Bug fix: Compute the correct answer for queries that contain an IS NOT NULL
    term in the WHERE clause and also contain an OR term in the WHERE clause and
    are compiled with <a href="../compile.html#enable_stat4">SQLITE_ENABLE_STAT4</a>.
    <a href="http://www.sqlite.org/src/info/4c86b126f2">Ticket &#91;4c86b126f2&#93;</a>
‚Ž};ƒereleaselog/3_8_4_2.html3.8.4.2
Bug fix: DISTINCT now recognizes that a <a href="../lang_corefunc.html#zeroblob">zeroblob</a> and a blob of all
    0x00 bytes are the same thing. 
    <a href="http://www.sqlite.org/src/info/fccbde530a">Ticket &#91;fccbde530a&#93;</a>
bŽ|;ƒreleaselog/3_8_4_2.html3.8.4.2       Bug fix: Fix the <a href="../lang_corefunc.html#char">char()</a> SQL function so that it returns an empty string
    rather than an "out of memory" error when called with zero arguments. 
NŽ{;_releaselog/3_8_4_2.html3.8.4.Get extension loading working on Cygwin.
Žz;ureleaselog/3_8_4_2.html3.8.4.2Change the datatype of SrcList.nSrc from type u8 to type int to work around 
    an issue in the C compiler on AIX.
kŽy;releaselog/3_8_4_2.html3.8.4.2Update the _FILE_OFFSET_BITS macro so that builds work again on QNX.
{Žx;ƒ7releaselog/3_8_4_2.html3.8.4.2Add support for coverage testing of VDBE programs using the
    <a href="../c3ref/c_testctrl_always.html">SQLITE_TESTCTRL_VDBE_COVERAGE</a> verb of <a href="../c3ref/test_control.html">sqlite3_test_control()</a>.
UŽw;mreleaselog/3_8_4_2.html3.8.4.2Fix editline support in the command-line shell.

-¨©;

LfP  ⌿ͻIÏh¢-Q 7mreleaselog/3_8_4.html3.8.4Fix editline support in the command-line shell.
7‚releaselog/3_8_4.html3.8.4Update the banner on the command-line shell to alert novice users when they
    are using an ephemeral in-memory database.
c7releaselog/3_8_4.html3.8.4Add the ".clone" and ".save" commands to the command-line shell.
]7 releaselog/3_8_4.html3.8.4Code optimization and refactoring for improved performance.
d;       releaselog/3_8_4_1.html3.8.4.1SHA1 for sqlite3.c: d5cd1535053a50aa8633725e3595740b33709ac5

w;/releaselog/3_8_4_1.html3.8.4.1SQLITE_SOURCE_ID: "2014-03-11 15:27:36 018d317b1257ce68a92908b05c9c7cf1494050d0"
I;‚Sreleaselog/3_8_4_1.html3.8.4.1When computing the cost of the <a href="../optoverview.html#skipscan">skip-scan optimization</a>, take into account the
    fact that multiple seeks are required.
!;        ‚releaselog/3_8_4_1.html3.8.4.1Work around a C-preprocessor macro conflict that breaks the build for some
    configurations with Microsoft Visual Studio.
‚;ƒ]releaselog/3_8_4_1.html3.8.4.1Bug fix: Fix column default values expressions of the form
    "DEFAULT(-(-9223372036854775808))" so that they work correctly, initializing
    the column to a floating point value approximately equal to
    +9223372036854775808.0.
n;ƒreleaselog/3_8_4_1.html3.8.4.1Bug fix: Repair a name-resolution error that can occur in sub-select statements
    contained within a TRIGGER.
    <a href="http://www.sqlite.org/src/info/4ef7e3cfca">Ticket &#91;4ef7e3cfca&#93;</a>
I;‚Sreleaselog/3_8_4_1.html3.8.4.1Bug fix: Ensure that "ORDER BY random()" clauses do not get optimized out.
    <a href="http://www.sqlite.org/src/info/65bdeb9739">Ticket &#91;65bdeb9739&#93;</a>
‚R;„ereleaselog/3_8_4_1.html3.8.4.1
Bug fix: Make sure the same temporary registers are not used in concurrent
    co-routines used to implement compound SELECT statements containing ORDER
    BY clauses, as such use can lead to incorrect answers.
    <a href="http://www.sqlite.org/src/info/8c63ff0eca">Ticket &#91;8c63ff0eca&#93;</a>
u;ƒ+releaselog/3_8_4_1.html3.8.4.1Bug fix: Make sure "rowid" columns are correctly resolved in joins between
    normal tables and WITHOUT ROWID tables.
    <a href="http://www.sqlite.org/src/info/c34d0557f7">Ticket &#91;c34d0557f7&#93;</a>
‚q;…#releaselog/3_8_4_1.html3.8.4.1Bug fix: Compute the correct answer for queries that contain an IS NOT NULL
    term in the WHERE clause and also contain an OR term in the WHERE clause and
    are compiled with <a href="../compile.html#enable_stat4">SQLITE_ENABLE_STAT4</a>.
    <a href="http://www.sqlite.org/src/info/4c86b126f2">Ticket &#91;4c86b126f2&#93;</a>
‚;ƒereleaselog/3_8_4_1.html3.8.4.1
Bug fix: DISTINCT now recognizes that a <a href="../lang_corefunc.html#zeroblob">zeroblob</a> and a blob of all
    0x00 bytes are the same thing. 
    <a href="http://www.sqlite.org/src/info/fccbde530a">Ticket &#91;fccbde530a&#93;</a>
b;ƒreleaselog/3_8_4_1.html3.8.4.1       Bug fix: Fix the <a href="../lang_corefunc.html#char">char()</a> SQL function so that it returns an empty string
    rather than an "out of memory" error when called with zero arguments. 
N;_releaselog/3_8_4_1.html3.8.4.Get extension loading working on Cygwin.
;ureleaselog/3_8_4_1.html3.8.4.1Change the datatype of SrcList.nSrc from type u8 to type int to work around 
    an issue in the C compiler on AIX.
k;releaselog/3_8_4_1.html3.8.4.1Update the _FILE_OFFSET_BITS macro so that builds work again on QNX.
{
;ƒ7releaselog/3_8_4_1.html3.8.4.1Add support for coverage testing of VDBE programs using the
    <a href="../c3ref/c_testctrl_always.html">SQLITE_TESTCTRL_VDBE_COVERAGE</a> verb of <a href="../c3ref/test_control.html">sqlite3_test_control()</a>.
U;mreleaselog/3_8_4_1.html3.8.4.1Fix editline support in the command-line shell.

b›
´ÒÀ
O      ?QCÍjÈYßxÓbn47%releaselog/3_8_3.html3.8.3Added the <a href="../lang_corefunc.html#printf">printf()</a> SQL function.
!37        ‚
releaselog/3_8_3.html3.8.3Added support for <a href="../lang_with.html">common table expressions</a> and the <a href="../lang_with.html">WITH clause</a>.
d2;       releaselog/3_8_3_1.html3.8.3.1SHA1 for sqlite3.c: 990004ef2d0eec6a339e4caa562423897fe02bf0

w1;/releaselog/3_8_3_1.html3.8.3.1SQLITE_SOURCE_ID: "2014-02-11 14:52:19 ea3317a4803d71d88183b29f1d3086f46d68a00e"
l0;releaselog/3_8_3_1.html3.8.3.1Fix a harmless compiler warning that was causing problems for VS2013.
ƒ/;        …releaselog/3_8_3_1.html3.8.3.1Fix a bug (ticket <a href="http://www.sqlite.org/src/info/4c86b126f2">4c86b126f2</a>)
    that causes rows to go missing on some queries with OR clauses and
    IS NOT NULL operators in the WHERE clause, when the <a href="../compile.html#enable_stat3">SQLITE_ENABLE_STAT3</a>
    or <a href="../compile.html#enable_stat4">SQLITE_ENABLE_STAT4</a> compile-time options are used.
`.7       releaselog/3_8_4.html3.8.4SHA1 for sqlite3.c: b0c22e5f15f5ba2afd017ecd990ea507918afe1c

s-7/releaselog/3_8_4.html3.8.4SQLITE_SOURCE_ID: "2014-03-10 12:20:37 530a1ee7dc2435f80960ce4710a3c2d2bfaaccc5"
‚
,7ƒ]releaselog/3_8_4.html3.8.4Bug fix: Fix column default values expressions of the form
    "DEFAULT(-(-9223372036854775808))" so that they work correctly, initializing
    the column to a floating point value approximately equal to
    +9223372036854775808.0.
j+7ƒreleaselog/3_8_4.html3.8.4Bug fix: Repair a name-resolution error that can occur in sub-select statements
    contained within a TRIGGER.
    <a href="http://www.sqlite.org/src/info/4ef7e3cfca">Ticket &#91;4ef7e3cfca&#93;</a>
E*7‚Sreleaselog/3_8_4.html3.8.4Bug fix: Ensure that "ORDER BY random()" clauses do not get optimized out.
    <a href="http://www.sqlite.org/src/info/65bdeb9739">Ticket &#91;65bdeb9739&#93;</a>
‚N)7„ereleaselog/3_8_4.html3.8.4
Bug fix: Make sure the same temporary registers are not used in concurrent
    co-routines used to implement compound SELECT statements containing ORDER
    BY clauses, as such use can lead to incorrect answers.
    <a href="http://www.sqlite.org/src/info/8c63ff0eca">Ticket &#91;8c63ff0eca&#93;</a>
q(7ƒ+releaselog/3_8_4.html3.8.4Bug fix: Make sure "rowid" columns are correctly resolved in joins between
    normal tables and WITHOUT ROWID tables.
    <a href="http://www.sqlite.org/src/info/c34d0557f7">Ticket &#91;c34d0557f7&#93;</a>
‚m'7…#releaselog/3_8_4.html3.8.4Bug fix: Compute the correct answer for queries that contain an IS NOT NULL
    term in the WHERE clause and also contain an OR term in the WHERE clause and
    are compiled with <a href="../compile.html#enable_stat4">SQLITE_ENABLE_STAT4</a>.
    <a href="http://www.sqlite.org/src/info/4c86b126f2">Ticket &#91;4c86b126f2&#93;</a>
‚&7ƒereleaselog/3_8_4.html3.8.4
Bug fix: DISTINCT now recognizes that a <a href="../lang_corefunc.html#zeroblob">zeroblob</a> and a blob of all
    0x00 bytes are the same thing. 
    <a href="http://www.sqlite.org/src/info/fccbde530a">Ticket &#91;fccbde530a&#93;</a>
^%7ƒreleaselog/3_8_4.html3.8.4   Bug fix: Fix the <a href="../lang_corefunc.html#char">char()</a> SQL function so that it returns an empty string
    rather than an "out of memory" error when called with zero arguments. 
J$7_releaselog/3_8_4.html3.8.Get extension loading working on Cygwin.
#7ureleaselog/3_8_4.html3.8.4Change the datatype of SrcList.nSrc from type u8 to type int to work around 
    an issue in the C compiler on AIX.
g"7releaselog/3_8_4.html3.8.4Update the _FILE_OFFSET_BITS macro so that builds work again on QNX.
w!7ƒ7releaselog/3_8_4.html3.8.4Add support for coverage testing of VDBE programs using the
    <a href="../c3ref/c_testctrl_always.html">SQLITE_TESTCTRL_VDBE_COVERAGE</a> verb of <a href="../c3ref/test_control.html">sqlite3_test_control()</a>.

\
L–Þ
‚
D       ª       K~ rzLµG7qreleaselog/3_8_2.html3.8.2Add the <a href="../compile.html#enable_explain_comments">SQLITE_ENABLE_EXPLAIN_COMMENTS</a> compile-time option.
F7oreleaselog/3_8_2.html3.8.2Update the <a href="../rtree.html">R-Tree extension</a> to make use of the enhanced virtual table
    interface.
‚*E7„releaselog/3_8_2.html3.8.2Extended the <a href="../vtab.html">virtual table</a> interface, and in particular the
    <a href="../c3ref/index_info.html">sqlite3_index_info</a> object to allow a virtual table to report its estimate
    on the number of rows that will be returned by a query.
D7Qreleaselog/3_8_2.html3.8.2Added the <a href="../optoverview.html#skipscan">skip-scan optimization</a> to the query planner.
mC7#releaselog/3_8_2.html3.8.2Added support for <a href="../withoutrowid.html">WITHOUT ROWID</a> tables.
„*B7        ˆreleaselog/3_8_2.html3.8.2Changed the defined behavior for the <a href="../lang_expr.html#castexpr">CAST expression</a> when floating point values
    greater than  +9223372036854775807 are cast into integers so that the
    result is the largest possible integer, +9223372036854775807, instead of
    the smallest possible integer, -9223372036854775808.  After this change, 
    CAST(9223372036854775809.0 as INT) yields +9223372036854775807 instead
    of -9223372036854775808.
    <b><big>&larr;</big>&nbsp;Potentially Incompatible Change!</b>
`A7       releaselog/3_8_3.html3.8.3SHA1 for sqlite3.c: 98a07da78f71b0275e8d9c510486877adc31dbee

x@79releaselog/3_8_3.html3.8.3SQLITE_SOURCE_ID: 
    "2014-02-03 13:52:03 e816dd924619db5f766de6df74ea2194f3e3b538"
I?7‚[releaselog/3_8_3.html3.8.3
Bug fix: In the <a href="../cli.html">command-line shell</a> CSV import feature, do not end a field
    when an escaped double-quote occurs at the end of a CRLN line.
6>7‚5releaselog/3_8_3.html3.8.3Change the <a href="../lemon.html">Lemon</a> source code to avoid calling C-library functions that OpenBSD
    considers dangerous.  (Ex: sprintf).
!=7‚releaselog/3_8_3.html3.8.3Add the "%token_class" directive to <a href="../lemon.html">Lemon parser generator</a> and use it to simplify
    the grammar.
<7ureleaselog/3_8_3.html3.8.3
Improvements to the comments in the VDBE byte-code display when running <a href="../lang_explain.html">EXPLAIN</a>.
;;7Areleaselog/3_8_3.html3.8.3     Performance enhancements.
:7mreleaselog/3_8_3.html3.8.Enhance the <a href="../spellfix1.html">spellfix1</a> virtual table so that it can search efficiently by rowid.
B97‚Mreleaselog/3_8_3.html3.8.3Reseed the PRNG used by <a href="../c3ref/randomness.html">sqlite3_randomness(N,P)</a> when invoked with N==0.
    Automatically reseed after a fork() on unix.
487‚1releaselog/3_8_3.html3.8.3Allow a <a href="../lang_select.html#values">VALUES clause</a> to be used anywhere a <a href="../lang_select.html">SELECT</a> statement is valid.
277‚-releaselog/3_8_3.html3.8.3Allow arbitrary expressions, including function calls and subqueries, in
    the filename argument to <a href="../lang_attach.html">ATTACH</a>.
‚67ƒareleaselog/3_8_3.html3.8.3Add <a href="../rescode.html#readonly_dbmoved">SQLITE_READONLY_DBMOVED</a> error code, returned at the beginning of a
    transaction, to indicate that the underlying database file has been renamed
    or moved out from under SQLite.
ƒ 57†      releaselog/3_8_3.html3.8.3Added <a href="../c3ref/c_deterministic.html#sqlitedeterministic">SQLITE_DETERMINISTIC</a> as an optional bit in the 4th argument to the
    <a href="../c3ref/create_function.html">sqlite3_create_function()</a> and related interfaces, providing applications with
    the ability to create new functions that can be factored out of inner loops when
    they have constant arguments.

ÁùŠ
û
+gì‰
¦       :M¨‡aáró7Ás\7/releaselog/3_8_1.html3.8.1Refactor the implementation of PRAGMA statements to improve parsing performance.
8[7‚9releaselog/3_8_1.html3.8.1
The sqlite3_analyzer utility program is updated to provide better descriptions
    and to compute a more accurate estimate for "Non-sequential pages"
|Z7Areleaselog/3_8_1.html3.8.1The <a href="../lang_vacuum.html">VACUUM</a> command packs the database about 1% tighter.
‚kY7…releaselog/3_8_1.html3.8.1<a href="../fts3.html#fts4">FTS4</a> queries are better able to make use of docid<$limit constraints="1" to="1" limit="1" the="1" amount="1" of="1" I/O="1" required.="1" <li="1">Added the hidden <a href="../fts3.html#f4alid">fts4aux languageid column</a> to the <a href="../fts3.html#fts4aux">fts4aux</a> virtual table.
</$limit>}X7Creleaselog/3_8_1.html3.8.1
Add the "totype.c" extension, implementing the tointeger() and toreal()
    SQL functions.
‚"W7„
releaselog/3_8_1.html3.8.1   The <a href="../lang_datefunc.html">Date And Time Functions</a> are enhanced so that the current time
    (ex: julianday('now')) is always the same for multiple function invocations
    within the same <a href="../c3ref/step.html">sqlite3_step()</a> call.
V7Qreleaselog/3_8_1.html3.8.Added the win32-longpath VFS on windows, permitting filenames up to 32K
    characters in length.
U7sreleaselog/3_8_1.html3.8.1Added the <a href="../compile.html#minimum_file_descriptor">SQLITE_MINIMUM_FILE_DESCRIPTOR</a> compile-time option
!T7‚releaselog/3_8_1.html3.8.1Avoid running foreign-key constraint checks on an UPDATE if none of the
    modified columns are associated with foreign keys.
iS7ƒreleaselog/3_8_1.html3.8.1Added support for "sz=NNN" parameters at the end of 
    <a href="../fileformat2.html#stat1tab">sqlite_stat1.stat</a> fields
    used to specify the average length in bytes for table and index rows.
sR7/releaselog/3_8_1.html3.8.1Added support for <a href="../compile.html#enable_stat4">SQLITE_ENABLE_STAT4</a>
xQ79releaselog/3_8_1.html3.8.1Added the <a href="../pragma.html#pragma_soft_heap_limit">soft_heap_limit pragma</a>.
‚wP7…7releaselog/3_8_1.html3.8.1Enhancements to the query planner:
<ol type="a">
  <li>Take into account the fact WHERE clause terms that cannot be used with indices
      still probably reduce the number of output rows.
  </li><li>Estimate the sizes of table and index rows and use the smallest applicable B-Tree
      for full scans and "count(*)" operations.
</li></ol>
_O7        ƒ       releaselog/3_8_1.html3.8.1Added the <a href="../lang_corefunc.html#unlikely">unlikely()</a> and <a href="../lang_corefunc.html#likelihood">likelihood()</a> SQL functions to be used
    as hints to the query planner.
`N7       releaselog/3_8_2.html3.8.2
SHA1 for sqlite3.c: 6422c7d69866f5ea3db0968f67ee596e7114544e

xM79releaselog/3_8_2.html3.8.2SQLITE_SOURCE_ID: 
    "2013-12-06 14:53:30 27392118af4c38c5203a04b8013e1afdb1cebd0d"
@L7‚Ireleaselog/3_8_2.html3.8.2Enhanced the ".timer" feature of the <a href="../cli.html">command-line shell</a> so that it
    shows wall-clock time in addition to system and user times.

LK7‚areleaselog/3_8_2.html3.8.2
Enhanced the ".explain" output formatting of the <a href="../cli.html">command-line shell</a>
    so that loops are indented to better show the structure of the program.
J7_releaselog/3_8_2.html3.8.2   Factor constant subexpressions in inner loops out to the initialization code
    in prepared statements.
lI7!releaselog/3_8_2.html3.8.Performance enhancements in the VDBE, especially to the OP_Column opcode.
‚H7ƒOreleaselog/3_8_2.html3.8.2Enhanced the comments that are inserted into <a href="../lang_explain.html">EXPLAIN</a> output when the
    <a href="../compile.html#enable_explain_comments">SQLITE_ENABLE_EXPLAIN_COMMENTS</a> compile-time option is enabled.

ªƒû€³
W       \ç™âL¼ÙøÚDªq;mreleaselog/3_8_0_2.html3.8.0.2Added an optional 5th parameter defining the collating sequence to the 
    next_char() extension SQL function.
p;ereleaselog/3_8_0_2.html3.8.0.2Added the <a href="../compile.html#fts3_max_expr_depth">SQLITE_FTS3_MAX_EXPR_DEPTH</a> compile-time option.
‚o;ƒureleaselog/3_8_0_2.html3.8.0.2Issue an <a href="../rescode.html#warning_autoindex">SQLITE_WARNING_AUTOINDEX</a> warning on the <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfiglog">SQLITE_CONFIG_LOG</a> whenever
    the query planner uses an automatic index.
]n;‚{releaselog/3_8_0_2.html3.8.0.2
Add the <a href="../compile.html#default_automatic_index">SQLITE_DEFAULT_AUTOMATIC_INDEX</a> compile-time option.  Setting this option
    to 0 disables automatic indices by default.
_m;‚releaselog/3_8_0_2.html3.8.0.2A running SELECT statement that lacks a FROM clause (or any other statement that
    never reads or writes from any database file) will not prevent a read
    transaction from closing.
l;Yreleaselog/3_8_0_2.html3.8.0.2Add the <a href="../c3ref/cancel_auto_extension.html">sqlite3_cancel_auto_extension(X)</a> interface.
k;ereleaselog/3_8_0_2.html3.8.0.2
Added the <a href="../compile.html#allow_uri_authority">SQLITE_ALLOW_URI_AUTHORITY</a> compile-time option.
3j;‚'releaselog/3_8_0_2.html3.8.0.2       Added the "percentile()" function as a <a href="../loadext.html">loadable extension</a> in the ext/misc
    subdirectory of the source tree.
‚Ji;„Ureleaselog/3_8_0_2.html3.8.0.Added the <a href="../pragma.html#pragma_defer_foreign_keys">defer_foreign_keys pragma</a> and the
    <a href="../c3ref/db_status.html">sqlite3_db_status</a>(db, <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatusdeferredfks">SQLITE_DBSTATUS_DEFERRED_FKS</a>,...) C-language interface.
rh;%releaselog/3_8_0_2.html3.8.0.2Added the <a href="../pragma.html#pragma_query_only">query_only pragma</a>.
tg;)releaselog/3_8_0_2.html3.8.0.2Added the <a href="../pragma.html#pragma_cache_spill">cache_spill pragma</a>.
[f;‚wreleaselog/3_8_0_2.html3.8.0.2Added the <a href="../c3ref/c_stmtstatus_counter.html#sqlitestmtstatusvmstep">SQLITE_STMTSTATUS_VM_STEP</a> option to <a href="../c3ref/stmt_status.html">sqlite3_stmt_status()</a>.
!e;‚releaselog/3_8_0_2.html3.8.0.2Added the <a href="../fts3.html#fts4notindexed">FTS4 notindexed option</a>, allowing non-indexed columns in an FTS4 table.
7d;‚/releaselog/3_8_0_2.html3.8.0.2The <a href="../eqp.html">EXPLAIN QUERY PLAN</a> output no longer shows an estimate of the number of 
    rows generated by each loop in a join.
c;{releaselog/3_8_0_2.html3.8.0.2Cut-over to the <a href="../queryplanner-ng.html">next generation query planner</a> for faster and better query plans.
gb; releaselog/3_8_0_2.html3.8.0.2Add support for <a href="../partialindex.html">partial indexes</a>`a7     releaselog/3_8_1.html3.8.1SHA1 for sqlite3.c: 0a54d76566728c2ba96292a49b138e4f69a7c391

x`79releaselog/3_8_1.html3.8.1SQLITE_SOURCE_ID: 
    "2013-10-17 12:57:35 c78be6d786c19073b3a6730dfe3fb1be54f5657a"
‚_7ƒoreleaselog/3_8_1.html3.8.1<b>Bug fix:</b> Return the correct answer for "SELECT count(*) FROM table" even if
    there is a <a href="../partialindex.html">partial index</a> on the table. Ticket
    <a href="http://www.sqlite.org/src/info/a5c8ed66ca">a5c8ed66ca</a>.

n^7%releaselog/3_8_1.html3.8.1Added the <a href="../pragma.html#pragma_stats">PRAGMA stats</a> statement.
‚y]7…;releaselog/3_8_1.html3.8.1The directory used to hold temporary files on unix can now be set using
    the SQLITE_TMPDIR environment variable,  which takes precedence over the
    TMPDIR environment variable.  The <a href="../c3ref/temp_directory.html">sqlite3_temp_directory</a> global variable
    still has higher precedence than both environment variables, however.

ªñß9
F       wºò5ÆGàvÕu–ªr;%releaselog/3_8_0_1.html3.8.0.1Added the <a href="../pragma.html#pragma_query_only">query_only pragma</a>.
t;)releaselog/3_8_0_1.html3.8.0.1Added the <a href="../pragma.html#pragma_cache_spill">cache_spill pragma</a>.
[;‚wreleaselog/3_8_0_1.html3.8.0.1Added the <a href="../c3ref/c_stmtstatus_counter.html#sqlitestmtstatusvmstep">SQLITE_STMTSTATUS_VM_STEP</a> option to <a href="../c3ref/stmt_status.html">sqlite3_stmt_status()</a>.
!;‚releaselog/3_8_0_1.html3.8.0.1Added the <a href="../fts3.html#fts4notindexed">FTS4 notindexed option</a>, allowing non-indexed columns in an FTS4 table.
7;‚/releaselog/3_8_0_1.html3.8.0.1The <a href="../eqp.html">EXPLAIN QUERY PLAN</a> output no longer shows an estimate of the number of 
    rows generated by each loop in a join.
;{releaselog/3_8_0_1.html3.8.0.1Cut-over to the <a href="../queryplanner-ng.html">next generation query planner</a> for faster and better query plans.
g; releaselog/3_8_0_1.html3.8.0.1Add support for <a href="../partialindex.html">partial indexes</a>d;     releaselog/3_8_0_2.html3.8.0.2SHA1 for sqlite3.c: 6cf0c7b46975a87a0dc3fba69c229a7de61b0c21

|~;9releaselog/3_8_0_2.html3.8.0.2SQLITE_SOURCE_ID: 
    "2013-09-03 17:11:13 7dd4968f235d6e1ca9547cda9cf3bd570e1609ef"
l}; releaselog/3_8_0_2.html3.8.0.2Fix a bug in the optimization that attempts to omit unused LEFT JOINs

9|;‚3releaselog/3_8_0_2.html3.8.0.2Fix a query planner bug that could result in a segfault when querying tables
with a UNIQUE or PRIMARY KEY constraint with more than four columns.

D{;‚Ireleaselog/3_8_0_2.html3.8.0.2Fix a query planner bug involving a LEFT JOIN with a BETWEEN or LIKE/GLOB
constraint and then another INNER JOIN to the right that involves an OR constraint.
9z;        ‚5releaselog/3_8_0_2.html3.8.0.2Fix an off-by-one error that caused quoted empty string at the end of a 
CRNL-terminated line of CSV input to be misread by the command-line shell.
-y;‚releaselog/3_8_0_2.html3.8.0.2Bug fixes: Multiple problems in the legacy query optimizer were fixed by the 
    move to <a href="../queryplanner-ng.html">NGQP</a>.

‚x;ƒureleaselog/3_8_0_2.html3.8.0.2Bug fix: Bare identifiers in ORDER BY clauses bind more tightly to output column
    names, but identifiers in expressions bind more tightly to input column names.
    Identifiers in GROUP BY clauses always prefer output column names, however.
Qw;‚creleaselog/3_8_0_2.html3.8.0.2Bug fix: In the <a href="../fts3.html#unicode61">unicode61</a> tokenizer of <a href="../fts3.html#fts4">FTS4</a>, treat all private code points
    as identifier symbols.
‚v;ƒureleaselog/3_8_0_2.html3.8.0.2Update the ".import" command in the <a href="../cli.html">command-line shell</a> to support multi-line
    fields and correct RFC-4180 quoting and to issue warning and/or error messages
    if the input text is not strictly RFC-4180 compliant.
"u;‚releaselog/3_8_0_2.html3.8.0.2Disable the use of posix_fallocate() on all (unix) systems unless the
    HAVE_POSIX_FALLOCATE compile-time option is used.
‚7t;„/releaselog/3_8_0_2.html3.8.0.2Allow read transactions to be freely opened and closed by SQL statements run 
    from within the implementation of <a href="../appfunc.html">application-defined SQL functions</a> if the
    function is called by a SELECT statement that does not access any database table.
Ss;‚greleaselog/3_8_0_2.html3.8.0.2Enhancements to the sqlite3_analyzer utility program to provide size
    information separately for each individual index of a table, in addition to
    the aggregate size.
‚r;ƒWreleaselog/3_8_0_2.html3.8.0.2The <a href="../rescode.html#busy_snapshot">SQLITE_BUSY_SNAPSHOT</a> extended error code is returned in WAL mode when
    a read transaction cannot be upgraded to a write transaction because the read is
    on an older snapshot.

}²
û
eÕò    ó       ôݢüÞ    ë:}9; ‚5releaselog/3_8_0_1.html3.8.0.1Fix an off-by-one error that caused quoted empty string at the end of a 
CRNL-terminated line of CSV input to be misread by the command-line shell.
-;‚releaselog/3_8_0_1.html3.8.0.1Bug fixes: Multiple problems in the legacy query optimizer were fixed by the 
    move to <a href="../queryplanner-ng.html">NGQP</a>.

‚;ƒureleaselog/3_8_0_1.html3.8.0.1Bug fix: Bare identifiers in ORDER BY clauses bind more tightly to output column
    names, but identifiers in expressions bind more tightly to input column names.
    Identifiers in GROUP BY clauses always prefer output column names, however.
Q;‚creleaselog/3_8_0_1.html3.8.0.1Bug fix: In the <a href="../fts3.html#unicode61">unicode61</a> tokenizer of <a href="../fts3.html#fts4">FTS4</a>, treat all private code points
    as identifier symbols.
‚;ƒureleaselog/3_8_0_1.html3.8.0.1Update the ".import" command in the <a href="../cli.html">command-line shell</a> to support multi-line
    fields and correct RFC-4180 quoting and to issue warning and/or error messages
    if the input text is not strictly RFC-4180 compliant.
";‚releaselog/3_8_0_1.html3.8.0.1Disable the use of posix_fallocate() on all (unix) systems unless the
    HAVE_POSIX_FALLOCATE compile-time option is used.
‚7;„/releaselog/3_8_0_1.html3.8.0.1Allow read transactions to be freely opened and closed by SQL statements run 
    from within the implementation of <a href="../appfunc.html">application-defined SQL functions</a> if the
    function is called by a SELECT statement that does not access any database table.
S;‚greleaselog/3_8_0_1.html3.8.0.1Enhancements to the sqlite3_analyzer utility program to provide size
    information separately for each individual index of a table, in addition to
    the aggregate size.
‚;ƒWreleaselog/3_8_0_1.html3.8.0.1The <a href="../rescode.html#busy_snapshot">SQLITE_BUSY_SNAPSHOT</a> extended error code is returned in WAL mode when
    a read transaction cannot be upgraded to a write transaction because the read is
    on an older snapshot.
;mreleaselog/3_8_0_1.html3.8.0.1Added an optional 5th parameter defining the collating sequence to the 
    next_char() extension SQL function.
;ereleaselog/3_8_0_1.html3.8.0.1Added the <a href="../compile.html#fts3_max_expr_depth">SQLITE_FTS3_MAX_EXPR_DEPTH</a> compile-time option.
‚
;ƒureleaselog/3_8_0_1.html3.8.0.1Issue an <a href="../rescode.html#warning_autoindex">SQLITE_WARNING_AUTOINDEX</a> warning on the <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfiglog">SQLITE_CONFIG_LOG</a> whenever
    the query planner uses an automatic index.
];‚{releaselog/3_8_0_1.html3.8.0.1
Add the <a href="../compile.html#default_automatic_index">SQLITE_DEFAULT_AUTOMATIC_INDEX</a> compile-time option.  Setting this option
    to 0 disables automatic indices by default.
_;‚releaselog/3_8_0_1.html3.8.0.1A running SELECT statement that lacks a FROM clause (or any other statement that
    never reads or writes from any database file) will not prevent a read
    transaction from closing.

;Yreleaselog/3_8_0_1.html3.8.0.1Add the <a href="../c3ref/cancel_auto_extension.html">sqlite3_cancel_auto_extension(X)</a> interface.
     ;ereleaselog/3_8_0_1.html3.8.0.1
Added the <a href="../compile.html#allow_uri_authority">SQLITE_ALLOW_URI_AUTHORITY</a> compile-time option.
3;‚'releaselog/3_8_0_1.html3.8.0.1 Added the "percentile()" function as a <a href="../loadext.html">loadable extension</a> in the ext/misc
    subdirectory of the source tree.
‚J;„Ureleaselog/3_8_0_1.html3.8.0.Added the <a href="../pragma.html#pragma_defer_foreign_keys">defer_foreign_keys pragma</a> and the
    <a href="../c3ref/db_status.html">sqlite3_db_status</a>(db, <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatusdeferredfks">SQLITE_DBSTATUS_DEFERRED_FKS</a>,...) C-language interface.

„8{
ü
•
/’Û:
_       ì       1~ì`¤ŠøbW„O.7‚greleaselog/3_8_0.html3.8.0Enhancements to the sqlite3_analyzer utility program to provide size
    information separately for each individual index of a table, in addition to
    the aggregate size.
‚-7ƒWreleaselog/3_8_0.html3.8.0The <a href="../rescode.html#busy_snapshot">SQLITE_BUSY_SNAPSHOT</a> extended error code is returned in WAL mode when
    a read transaction cannot be upgraded to a write transaction because the read is
    on an older snapshot.
,7mreleaselog/3_8_0.html3.8.0Added an optional 5th parameter defining the collating sequence to the 
    next_char() extension SQL function.
+7ereleaselog/3_8_0.html3.8.0Added the <a href="../compile.html#fts3_max_expr_depth">SQLITE_FTS3_MAX_EXPR_DEPTH</a> compile-time option.
‚*7ƒureleaselog/3_8_0.html3.8.0Issue an <a href="../rescode.html#warning_autoindex">SQLITE_WARNING_AUTOINDEX</a> warning on the <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfiglog">SQLITE_CONFIG_LOG</a> whenever
    the query planner uses an automatic index.
Y)7‚{releaselog/3_8_0.html3.8.0
Add the <a href="../compile.html#default_automatic_index">SQLITE_DEFAULT_AUTOMATIC_INDEX</a> compile-time option.  Setting this option
    to 0 disables automatic indices by default.
[(7‚releaselog/3_8_0.html3.8.0A running SELECT statement that lacks a FROM clause (or any other statement that
    never reads or writes from any database file) will not prevent a read
    transaction from closing.
'7Yreleaselog/3_8_0.html3.8.0Add the <a href="../c3ref/cancel_auto_extension.html">sqlite3_cancel_auto_extension(X)</a> interface.
&7ereleaselog/3_8_0.html3.8.0
Added the <a href="../compile.html#allow_uri_authority">SQLITE_ALLOW_URI_AUTHORITY</a> compile-time option.
/%7‚'releaselog/3_8_0.html3.8.0   Added the "percentile()" function as a <a href="../loadext.html">loadable extension</a> in the ext/misc
    subdirectory of the source tree.
‚F$7„Ureleaselog/3_8_0.html3.8.Added the <a href="../pragma.html#pragma_defer_foreign_keys">defer_foreign_keys pragma</a> and the
    <a href="../c3ref/db_status.html">sqlite3_db_status</a>(db, <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatusdeferredfks">SQLITE_DBSTATUS_DEFERRED_FKS</a>,...) C-language interface.
n#7%releaselog/3_8_0.html3.8.0Added the <a href="../pragma.html#pragma_query_only">query_only pragma</a>.
p"7)releaselog/3_8_0.html3.8.0Added the <a href="../pragma.html#pragma_cache_spill">cache_spill pragma</a>.
W!7‚wreleaselog/3_8_0.html3.8.0Added the <a href="../c3ref/c_stmtstatus_counter.html#sqlitestmtstatusvmstep">SQLITE_STMTSTATUS_VM_STEP</a> option to <a href="../c3ref/stmt_status.html">sqlite3_stmt_status()</a>.
 7‚releaselog/3_8_0.html3.8.0Added the <a href="../fts3.html#fts4notindexed">FTS4 notindexed option</a>, allowing non-indexed columns in an FTS4 table.
37‚/releaselog/3_8_0.html3.8.0The <a href="../eqp.html">EXPLAIN QUERY PLAN</a> output no longer shows an estimate of the number of 
    rows generated by each loop in a join.
7{releaselog/3_8_0.html3.8.0Cut-over to the <a href="../queryplanner-ng.html">next generation query planner</a> for faster and better query plans.
c7 releaselog/3_8_0.html3.8.0Add support for <a href="../partialindex.html">partial indexes</a>d; releaselog/3_8_0_1.html3.8.0.1SHA1 for sqlite3.c: 99906bf63e6cef63d6f3d7f8526ac4a70e76559e

|;9releaselog/3_8_0_1.html3.8.0.1SQLITE_SOURCE_ID: 
    "2013-08-29 17:35:01 352362bc01660edfbda08179d60f09e2038a2f49"
9;‚3releaselog/3_8_0_1.html3.8.0.1Fix a query planner bug that could result in a segfault when querying tables
with a UNIQUE or PRIMARY KEY constraint with more than four columns.

D;‚Ireleaselog/3_8_0_1.html3.8.0.1Fix a query planner bug involving a LEFT JOIN with a BETWEEN or LIKE/GLOB
constraint and then another INNER JOIN to the right that involves an OR constraint.

ªÉ'

<"
u       ú       —       ·øjkª=>9‚?releaselog/3_7_17.html3.7.1Add a new test harness called "mptester" used to verify correct operation
    when multiple processes are using the same database file at the same time.
{=9ƒ;releaselog/3_7_17.html3.7.17Increase the default value of <a href="../compile.html#max_schema_retry">SQLITE_MAX_SCHEMA_RETRY</a> to 50 and make sure
    that it is honored in every place that a schema change might force a statement
    retry.

<9Yreleaselog/3_7_17.html3.7.17Added the <a href="../compile.html#trace_size_limit">SQLITE_TRACE_SIZE_LIMIT</a> compile-time option.
‚;9ƒoreleaselog/3_7_17.html3.7.17Report the risky uses of <a href="../howtocorrupt.html#unlink">unlinked database files</a> and 
   <a href="../howtocorrupt.html#alias">database filename aliasing</a> as SQLITE_WARNING messages in the <a href="../errlog.html">error log</a>.
n:9ƒ!releaselog/3_7_17.html3.7.17Report rollback recovery in the <a href="../errlog.html">error log</a> as SQLITE_NOTICE_RECOVER_ROLLBACK.
    Change the error log code for WAL recover from 
    SQLITE_OK to SQLITE_NOTICE_RECOVER_WAL.
ƒ099†%releaselog/3_7_17.html3.7.17Assigned the integer at offset 68 in the <a href="../fileformat2.html#database_header">database header</a> as the
    <a href="../fileformat2.html#appid">Application ID</a> for when SQLite is used as an <a href="../appfileformat.html">application file-format</a>.
    Added the <a href="../pragma.html#pragma_application_id">PRAGMA application_id</a> command to query and set the Application ID.
y897releaselog/3_7_17.html3.7.17Add the <a href="../c3ref/strglob.html">sqlite3_strglob()</a> convenience interface.
a79        releaselog/3_7_17.html3.7.17Add support for <a href="../mmap.html">memory-mapped I/O</a>.
`67       releaselog/3_8_0.html3.8.0SHA1 for sqlite3.c: b7347f4b4c2a840e6ba12040093d606bd16ea21e

x579releaselog/3_8_0.html3.8.0SQLITE_SOURCE_ID: 
    "2013-08-26 04:50:08 f64cd21e2e23ed7cff48f7dafa5e76adde9321c2"
)47‚releaselog/3_8_0.html3.8.0Bug fixes: Multiple problems in the legacy query optimizer were fixed by the 
    move to <a href="../queryplanner-ng.html">NGQP</a>.

‚37ƒureleaselog/3_8_0.html3.8.0Bug fix: Bare identifiers in ORDER BY clauses bind more tightly to output column
    names, but identifiers in expressions bind more tightly to input column names.
    Identifiers in GROUP BY clauses always prefer output column names, however.
M27‚creleaselog/3_8_0.html3.8.0Bug fix: In the <a href="../fts3.html#unicode61">unicode61</a> tokenizer of <a href="../fts3.html#fts4">FTS4</a>, treat all private code points
    as identifier symbols.
‚17ƒureleaselog/3_8_0.html3.8.0Update the ".import" command in the <a href="../cli.html">command-line shell</a> to support multi-line
    fields and correct RFC-4180 quoting and to issue warning and/or error messages
    if the input text is not strictly RFC-4180 compliant.
07‚releaselog/3_8_0.html3.8.0Disable the use of posix_fallocate() on all (unix) systems unless the
    HAVE_POSIX_FALLOCATE compile-time option is used.
‚3/7„/releaselog/3_8_0.html3.8.0Allow read transactions to be freely opened and closed by SQL statements run 
    from within the implementation of <a href="../appfunc.html">application-defined SQL functions</a> if the
    function is called by a SELECT statement that does not access any database table.

â³ƒ
F       ¹       …“7$B™â3L9‚+releaselog/3_7_17.html3.7.17Bug fix: Make sure <a href="../pragma.html#syntax">PRAGMA</a> statements appear in <a href="../c3ref/profile.html">sqlite3_trace()</a> output.
%K9‚releaselog/3_7_17.html3.7.17Bug fix: The <a href="../cli.html">command-line shell</a> gives an exit code of 0 when terminated
    using the ".quit" command.
^J9ƒreleaselog/3_7_17.html3.7.17Bug fix: Do not suppress the ORDER BY clause on a virtual table query if
    an IN constraint is used.
    Ticket <a href="http://www.sqlite.org/src/info/f69b96e3076e">f69b96e3076e</a>.
‚I9ƒcreleaselog/3_7_17.html3.7.17Bug fix: Do not allow a virtual table to cancel the ORDER BY clause unless 
    all outer loops are guaranteed to return no more than one row result.
    Ticket <a href="http://www.sqlite.org/src/info/ba82a4a41eac1">ba82a4a41eac1</a>.
‚XH9„ureleaselog/3_7_17.html3.7.17Bug fix:
    Only consider AS names from the result set as candidates for resolving
    identifiers in the WHERE clause if there are no other matches. In the 
    ORDER BY clause, AS names take priority over any column names.
    Ticket <a href="http://www.sqlite.org/src/info/2500cdb9be05">2500cdb9be05</a>
‚oG9…#releaselog/3_7_17.html3.7.17Bug fix: Fix a potential <b>database corruption bug</b>
    in <a href="../sharedcache.html">shared cache mode</a> when one
    <a href="../c3ref/sqlite3.html">database connection</a> is closed while another is in the middle of a write
    transaction.
    Ticket <a href="http://www.sqlite.org/src/info/e636a050b7">e636a050b7</a>
|F9=releaselog/3_7_17.html3.7.17Improved tracing and debugging facilities in the Windows <a href="../vfs.html">VFS</a>.
E9Ireleaselog/3_7_17.html3.7.17Discontinue the use of posix_fallocate() on unix, as it does not work on all
    filesystems.
‚D9ƒEreleaselog/3_7_17.html3.7.17Query planner enhancement: Use the transitive property of constraints
    to move constraints into the outer loops of a join whenever possible,
    thereby reducing the amount of work that needs to occur in inner loops.
&C9‚releaselog/3_7_17.html3.7.17
Added the <a href="../fts3.html#fts3tok">fts3tokenize virtual table</a> to the <a href="../fts3.html">full-text search</a> logic.
       B9Wreleaselog/3_7_17.html3.7.17Enhance the <a href="../fts3.html#fts4aux">fts4aux</a> virtual table so that it can be a TEMP table.
‚9A9„7releaselog/3_7_17.html3.7.17Enhance <a href="../fts3.html">FTS3</a> to avoid using excess stack space when there are a huge
    number of terms on the right-hand side of the MATCH operator.  A side-effect
    of this change is that the MATCH operator can only accommodate 12 NEAR
    operators at a time.
‚,@9„releaselog/3_7_17.html3.7.17
Added many new loadable extensions to the source tree, including
    amatch, closure, fuzzer, ieee754, nextchar, regexp, spellfix,
    and wholenumber.  See header comments on each extension source file 
    for further information about what that extension does.
†I?9ŒWreleaselog/3_7_17.html3.7.17 Enhance the <a href="../loadext.html">extension loading</a> mechanism to be more flexible (while
    still maintaining backwards compatibility) in two ways:
    <ol>
    <li>If the default entry point "sqlite3_extension_init" is not present in
        the loadable extension, also try an entry point "sqlite3_X_init" where
        "X" is based on the shared library filename.  This allows every extension
        to have a different entry point, which allows them to be statically linked
        with no code changes.
    </li><li>The shared library filename passed to <a href="../c3ref/load_extension.html">sqlite3_load_extension()</a> may
        omit the filename suffix, and an appropriate architecture-dependent
        suffix (".so", ".dylib", or ".dll") will be added automatically.
    </li></ol>

Ÿ0²Á
‘
       ¯       ·öA$³g€¶ÿ¡Ÿta=%releaselog/3_7_16_2.html3.7.16.2Improved error messages in the <a href="../rtree.html">RTREE</a> extension.
`=Kreleaselog/3_7_16_2.html3.7.16.2Added the test_regexp.c module as a demonstration of how to implement
    the REGEXP operator.
[_=ureleaselog/3_7_16_2.html3.7.16.2
Improved name resolution for deeply nested queries.
3^=‚#releaselog/3_7_16_2.html3.7.16.2Allow the error message from <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> to be longer than
    20000 bytes.
X]=oreleaselog/3_7_16_2.html3.7.16.2Performance improvements in the query optimizer.
l\=releaselog/3_7_16_2.html3.7.16.2
Enhance the query optimizer to exploit transitive join constraints.
c[=ƒreleaselog/3_7_16_2.html3.7.16.2     Enhance the <a href="../pragma.html#pragma_table_info">PRAGMA table_info</a> command so that the "pk" column is an
    increasing integer to show the order of columns in the primary key.
'Z=‚releaselog/3_7_16_2.html3.7.16.Allow indices to be used for sorting even if prior terms of the index
    are constrained by IN operators in the WHERE clause.
Y=wreleaselog/3_7_16_2.html3.7.16.2Enhance virtual tables so that they can potentially use an index when
    the WHERE clause contains the IN operator.
nX=releaselog/3_7_16_2.html3.7.16.2Improved optimization of queries containing aggregate min() or max().
‚W=ƒoreleaselog/3_7_16_2.html3.7.16.2Performance improvements for <a href="../pragma.html#pragma_incremental_vacuum">PRAGMA incremental_vacuum</a>, especially in
    cases where the number of free pages is greater than what will fit on a 
    single trunk page of the freelist.
1V=‚releaselog/3_7_16_2.html3.7.16.2Added SQL functions <a href="../lang_corefunc.html#unicode">unicode(A)</a> and <a href="../lang_corefunc.html#char">char(X1,...,XN)</a>.
=U=‚7releaselog/3_7_16_2.html3.7.16.2Added the SQLITE_READONLY_ROLLBACK extended error code for when a database
    cannot be opened because it needs rollback recovery but is read-only.
hT=
releaselog/3_7_16_2.html3.7.16.2Added new extended error codes for all SQLITE_CONSTRAINT errors
       S=  Qreleaselog/3_7_16_2.html3.7.16.2Added the <a href="../pragma.html#pragma_foreign_key_check">PRAGMA foreign_key_check</a> command.
bR9       releaselog/3_7_17.html3.7.17SHA1 for sqlite3.c: 246987605d0503c700a08b9ee99a6b5d67454aab

zQ99releaselog/3_7_17.html3.7.17SQLITE_SOURCE_ID: 
    "2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668"
‚,P9„releaselog/3_7_17.html3.7.17Bug fix: Make sure an error is always reported when attempting to preform
    an operation that requires a <a href="../datatype3.html#collation">collating sequence</a> that is missing.
    Ticket <a href="http://www.sqlite.org/src/info/0fc59f908b">0fc59f908b</a>

mO9ƒreleaselog/3_7_17.html3.7.17Bug fix: Do not move WHERE clause terms inside OR expressions that are
    contained within an ON clause of a LEFT JOIN.  Ticket 
    <a href="http://www.sqlite.org/src/info/f2369304e4">f2369304e4</a>
‚zN9…9releaselog/3_7_17.html3.7.17Bug fix: Makes sure the <a href="../c3ref/set_authorizer.html">authorizer</a> callback gets
    a valid pointer to the string "ROWID" for the column-name parameter when
    doing an <a href="../lang_update.html">UPDATE</a> that changes the rowid.  Ticket
    <a href="http://www.sqlite.org/src/info/0eb70d77cb05bb2272">0eb70d77cb05bb2272</a>
ƒLM9†]releaselog/3_7_17.html3.7.17Bug fix: When a <a href="../lang_select.html#compound">compound query</a> that uses an ORDER BY clause
    with a <a href="../lang_expr.html#collateop">COLLATE operator</a>, make sure that the sorting occurs
    according to the specified collation and that the comparisons associate with
    the compound query use the native collation.  Ticket
    <a href="http://www.sqlite.org/src/info/6709574d2a8d8">6709574d2a8d8</a>.

RY
È
r¢¦
¤       =>ý%gRƒ,t=   †releaselog/3_7_16_2.html3.7.16.2Fix a bug (present since version 3.7.13) that could result in database corruption
    on windows if two or more processes try to access the same database file at the
    same time and immediately after third process crashed in the middle of committing
    to that same file.  See ticket 
    <a href="http://www.sqlite.org/src/info/7ff3120e4f">7ff3120e4f</a> for further
    information.

bs=releaselog/3_7_16_2.html3.7.16.2Fixed lots of spelling errors in the source-code comments
r=oreleaselog/3_7_16_2.html3.7.16.2The SQLITE_OMIT_MERGE_SORT option has been removed.  The merge sorter is
    now a required component of SQLite.
‚q=ƒwreleaselog/3_7_16_2.html3.7.16.2Fix a long-standing bug in the storage engine that would (very rarely)
    cause a spurious report of an SQLITE_CORRUPT error but which was otherwise
    harmless.
    Ticket <a href="http://www.sqlite.org/src/info/6bfb98dfc0c">6bfb98dfc0c</a>.
Tp=‚ereleaselog/3_7_16_2.html3.7.16.2Fix a bug in the NEAR operator of <a href="../fts3.html">FTS3</a> when applied to subfields.
    Ticket <a href="http://www.sqlite.org/src/info/38b1ae018f">38b1ae018f</a>.
‚=o=„7releaselog/3_7_16_2.html3.7.16.2Fix a long-standing bug in the <a href="../lang_expr.html#castexpr">CAST expression</a> that would recognize UTF16
    characters as digits even if their most-significant-byte was not zero.
    Ticket <a href="http://www.sqlite.org/src/info/689137afb6da41">689137afb6da41</a>.
‚Kn=        „Ureleaselog/3_7_16_2.html3.7.16.2Fix for a bug in the ORDER BY optimizer that was introduced in
    <a href="../releaselog/3_7_15.html">version 3.7.15</a> which would sometimes optimize out the sorting step
    when in fact the sort was required.
    Ticket <a href="http://www.sqlite.org/src/info/a179fe7465">a179fe7465</a>
,m=‚releaselog/3_7_16_2.html3.7.16.2Bug fix: Make sure the schema is up-to-date prior to running pragmas
    table_info, index_list, index_info, and foreign_key_list.


l=Qreleaselog/3_7_16_2.html3.7.16.2Bug fix: Avoid leaking memory on LIMIT and OFFSET clauses in deeply
    nested UNION ALL queries.
 k=}releaselog/3_7_16_2.html3.7.16.2Bug fix: Issue an error message if the 16-bit reference counter on a
    view overflows due to an overly complex query.
‚1j=„releaselog/3_7_16_2.html3.7.16.2Bug fix: repair a long-standing problem that could cause incorrect query
    results in a 3-way or larger join that compared INTEGER fields against TEXT
    fields in two or more places.
    Ticket <a href="http://www.sqlite.org/src/info/fc7bd6358f">fc7bd6358f</a>
~i=ƒ9releaselog/3_7_16_2.html3.7.16.2Enhance the <a href="../spellfix1.html">spellfix1</a> extension so that the edit distance cost table can
    be changed at runtime by inserting a string like 'edit_cost_table=TABLE' 
    into the "command" field.

^h={releaselog/3_7_16_2.html3.7.16.2Update cygwin interfaces to omit deprecated API calls.
g=kreleaselog/3_7_16_2.html3.7.16.2Change to use strncmp() or the equivalent instead of memcmp() when 
    comparing non-zero-terminated strings.
Lf=‚Ureleaselog/3_7_16_2.html3.7.16.2Added the <a href="../pragma.html#pragma_vdbe_addoptrace">PRAGMA vdbe_addoptrace</a> and <a href="../pragma.html#pragma_vdbe_debug">PRAGMA vdbe_debug</a> commands.
Se=ereleaselog/3_7_16_2.html3.7.16.2Remove all uses of umask() in the unix VFS.

d=Wreleaselog/3_7_16_2.html3.7.16.2Improved error messages for "foreign key mismatch" showing the names of
    the two tables involved.
'c=‚releaselog/3_7_16_2.html3.7.16.2Improved error messages for invalid boolean arguments to dot-commands
    in the <a href="../cli.html">command-line shell</a>.
xb=ƒ-releaselog/3_7_16_2.html3.7.16.2Enhance the <a href="../cli.html">command-line shell</a> so that a non-zero argument to the
    ".exit" command causes the shell to exit immediately without cleanly
    shutting down the database connection.

ª‰
]¨‹
y       f}
_Îx¨
¬ª~‘
=ƒ9releaselog/3_7_16_1.html3.7.16.1Enhance the <a href="../spellfix1.html">spellfix1</a> extension so that the edit distance cost table can
    be changed at runtime by inserting a string like 'edit_cost_table=TABLE' 
    into the "command" field.

^‘={releaselog/3_7_16_1.html3.7.16.1Update cygwin interfaces to omit deprecated API calls.
‘=kreleaselog/3_7_16_1.html3.7.16.1Change to use strncmp() or the equivalent instead of memcmp() when 
    comparing non-zero-terminated strings.
L‘
=‚Ureleaselog/3_7_16_1.html3.7.16.1Added the <a href="../pragma.html#pragma_vdbe_addoptrace">PRAGMA vdbe_addoptrace</a> and <a href="../pragma.html#pragma_vdbe_debug">PRAGMA vdbe_debug</a> commands.
S‘      =ereleaselog/3_7_16_1.html3.7.16.1Remove all uses of umask() in the unix VFS.

=Wreleaselog/3_7_16_1.html3.7.16.1Improved error messages for "foreign key mismatch" showing the names of
    the two tables involved.
'‘=‚releaselog/3_7_16_1.html3.7.16.1Improved error messages for invalid boolean arguments to dot-commands
    in the <a href="../cli.html">command-line shell</a>.
x‘=ƒ-releaselog/3_7_16_1.html3.7.16.1Enhance the <a href="../cli.html">command-line shell</a> so that a non-zero argument to the
    ".exit" command causes the shell to exit immediately without cleanly
    shutting down the database connection.
t‘=%releaselog/3_7_16_1.html3.7.16.1Improved error messages in the <a href="../rtree.html">RTREE</a> extension.
‘=Kreleaselog/3_7_16_1.html3.7.16.1Added the test_regexp.c module as a demonstration of how to implement
    the REGEXP operator.
[‘=ureleaselog/3_7_16_1.html3.7.16.1
Improved name resolution for deeply nested queries.
3‘=‚#releaselog/3_7_16_1.html3.7.16.1Allow the error message from <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> to be longer than
    20000 bytes.
X‘=oreleaselog/3_7_16_1.html3.7.16.1Performance improvements in the query optimizer.
l‘=releaselog/3_7_16_1.html3.7.16.1
Enhance the query optimizer to exploit transitive join constraints.
c=ƒreleaselog/3_7_16_1.html3.7.16.1     Enhance the <a href="../pragma.html#pragma_table_info">PRAGMA table_info</a> command so that the "pk" column is an
    increasing integer to show the order of columns in the primary key.
'~=‚releaselog/3_7_16_1.html3.7.16.Allow indices to be used for sorting even if prior terms of the index
    are constrained by IN operators in the WHERE clause.
}=wreleaselog/3_7_16_1.html3.7.16.1Enhance virtual tables so that they can potentially use an index when
    the WHERE clause contains the IN operator.
n|=releaselog/3_7_16_1.html3.7.16.1Improved optimization of queries containing aggregate min() or max().
‚{=ƒoreleaselog/3_7_16_1.html3.7.16.1Performance improvements for <a href="../pragma.html#pragma_incremental_vacuum">PRAGMA incremental_vacuum</a>, especially in
    cases where the number of free pages is greater than what will fit on a 
    single trunk page of the freelist.
1z=‚releaselog/3_7_16_1.html3.7.16.1Added SQL functions <a href="../lang_corefunc.html#unicode">unicode(A)</a> and <a href="../lang_corefunc.html#char">char(X1,...,XN)</a>.
=y=‚7releaselog/3_7_16_1.html3.7.16.1Added the SQLITE_READONLY_ROLLBACK extended error code for when a database
    cannot be opened because it needs rollback recovery but is read-only.
hx=
releaselog/3_7_16_1.html3.7.16.1Added new extended error codes for all SQLITE_CONSTRAINT errors
       w=  Qreleaselog/3_7_16_1.html3.7.16.1Added the <a href="../pragma.html#pragma_foreign_key_check">PRAGMA foreign_key_check</a> command.
fv=       releaselog/3_7_16_2.html3.7.16.2SHA1 for sqlite3.c: d466b54789dff4fb0238b9232e74896deaefab94

~u=9releaselog/3_7_16_2.html3.7.16.2SQLITE_SOURCE_ID: 
    "2013-04-12 11:52:43 cbea02d93865ce0e06789db95fd9168ebac970c7"

iË'
™éš
Y       `Ã^Ýtë„ÇýóLi_‘"9ƒreleaselog/3_7_16.html3.7.16       Enhance the <a href="../pragma.html#pragma_table_info">PRAGMA table_info</a> command so that the "pk" column is an
    increasing integer to show the order of columns in the primary key.
#‘!9‚releaselog/3_7_16.html3.7.1Allow indices to be used for sorting even if prior terms of the index
    are constrained by IN operators in the WHERE clause.
‘ 9wreleaselog/3_7_16.html3.7.16Enhance virtual tables so that they can potentially use an index when
    the WHERE clause contains the IN operator.
j‘9releaselog/3_7_16.html3.7.16Improved optimization of queries containing aggregate min() or max().
‚‘9ƒoreleaselog/3_7_16.html3.7.16Performance improvements for <a href="../pragma.html#pragma_incremental_vacuum">PRAGMA incremental_vacuum</a>, especially in
    cases where the number of free pages is greater than what will fit on a 
    single trunk page of the freelist.
-‘9‚releaselog/3_7_16.html3.7.16Added SQL functions <a href="../lang_corefunc.html#unicode">unicode(A)</a> and <a href="../lang_corefunc.html#char">char(X1,...,XN)</a>.
9‘9‚7releaselog/3_7_16.html3.7.16Added the SQLITE_READONLY_ROLLBACK extended error code for when a database
    cannot be opened because it needs rollback recovery but is read-only.
d‘9
releaselog/3_7_16.html3.7.16Added new extended error codes for all SQLITE_CONSTRAINT errors
‘9        Qreleaselog/3_7_16.html3.7.16Added the <a href="../pragma.html#pragma_foreign_key_check">PRAGMA foreign_key_check</a> command.
f‘=       releaselog/3_7_16_1.html3.7.16.SHA1 for sqlite3.c: 7a91ceceac9bcf47ceb8219126276e5518f7ff5a

~‘=9releaselog/3_7_16_1.html3.7.16.1SQLITE_SOURCE_ID: 
    "2013-03-29 13:44:34 527231bc67285f01fb18d4451b28f61da3c4e39d"
b‘=releaselog/3_7_16_1.html3.7.16.1Fixed lots of spelling errors in the source-code comments
‘=oreleaselog/3_7_16_1.html3.7.16.1The SQLITE_OMIT_MERGE_SORT option has been removed.  The merge sorter is
    now a required component of SQLite.
‚‘=ƒwreleaselog/3_7_16_1.html3.7.16.1Fix a long-standing bug in the storage engine that would (very rarely)
    cause a spurious report of an SQLITE_CORRUPT error but which was otherwise
    harmless.
    Ticket <a href="http://www.sqlite.org/src/info/6bfb98dfc0c">6bfb98dfc0c</a>.
T‘=‚ereleaselog/3_7_16_1.html3.7.16.1Fix a bug in the NEAR operator of <a href="../fts3.html">FTS3</a> when applied to subfields.
    Ticket <a href="http://www.sqlite.org/src/info/38b1ae018f">38b1ae018f</a>.
‚=‘=„7releaselog/3_7_16_1.html3.7.16.1Fix a long-standing bug in the <a href="../lang_expr.html#castexpr">CAST expression</a> that would recognize UTF16
    characters as digits even if their most-significant-byte was not zero.
    Ticket <a href="http://www.sqlite.org/src/info/689137afb6da41">689137afb6da41</a>.
‚K‘=        „Ureleaselog/3_7_16_1.html3.7.16.1Fix for a bug in the ORDER BY optimizer that was introduced in
    <a href="../releaselog/3_7_15.html">version 3.7.15</a> which would sometimes optimize out the sorting step
    when in fact the sort was required.
    Ticket <a href="http://www.sqlite.org/src/info/a179fe7465">a179fe7465</a>
,‘=‚releaselog/3_7_16_1.html3.7.16.1Bug fix: Make sure the schema is up-to-date prior to running pragmas
    table_info, index_list, index_info, and foreign_key_list.


‘=Qreleaselog/3_7_16_1.html3.7.16.1Bug fix: Avoid leaking memory on LIMIT and OFFSET clauses in deeply
    nested UNION ALL queries.
 ‘=}releaselog/3_7_16_1.html3.7.16.1Bug fix: Issue an error message if the 16-bit reference counter on a
    view overflows due to an overly complex query.
‚1‘=„releaselog/3_7_16_1.html3.7.16.1Bug fix: repair a long-standing problem that could cause incorrect query
    results in a 3-way or larger join that compared INTEGER fields against TEXT
    fields in two or more places.
    Ticket <a href="http://www.sqlite.org/src/info/fc7bd6358f">fc7bd6358f</a>

•>‹1
ª
7?˜
¹       í       ùûÊ* ôwÇFÝ‚Z‘:=  „sreleaselog/3_7_15_1.html3.7.15.1Fix a bug, introduced in <a href="../releaselog/3_7_15.html">version 3.7.15</a>, that causes a segfault if
    the AS name of a result column of a SELECT statement is used as a logical
    term in the WHERE clause.  Ticket 
    <a href="http://www.sqlite.org/src/info/a7b7803e8d1e869">a7b7803e8d1e869</a>.

f‘9=       releaselog/3_7_15_2.html3.7.15.2SHA1 for sqlite3.c: 5741f47d1bc38aa0a8c38f09e60a5fe0031f272d

~‘8=9releaselog/3_7_15_2.html3.7.15.2SQLITE_SOURCE_ID: 
    "2013-01-09 11:53:05 c0e09560d26f0a6456be9dd3447f5311eb4f238f"
‚G‘7=        „Mreleaselog/3_7_15_2.html3.7.15.2Fix a bug, introduced in <a href="../releaselog/3_7_15.html">version 3.7.15</a>, that causes an ORDER BY clause
    to be optimized out of a three-way join when the ORDER BY is actually
    required.   
    Ticket <a href="http://www.sqlite.org/src/info/598f5f7596b055">598f5f7596b055</a>

b‘69       releaselog/3_7_16.html3.7.16SHA1 for sqlite3.c: 7308ab891ca1b2ebc596025cfe4dc36f1ee89cf6

z‘599releaselog/3_7_16.html3.7.16SQLITE_SOURCE_ID: 
    "2013-03-18 11:39:23 66d5f2b76750f3520eb7a495f6247206758f5b90"
(‘49‚releaselog/3_7_16.html3.7.16Bug fix: Make sure the schema is up-to-date prior to running pragmas
    table_info, index_list, index_info, and foreign_key_list.

‘39Qreleaselog/3_7_16.html3.7.16Bug fix: Avoid leaking memory on LIMIT and OFFSET clauses in deeply
    nested UNION ALL queries.
‘29}releaselog/3_7_16.html3.7.16Bug fix: Issue an error message if the 16-bit reference counter on a
    view overflows due to an overly complex query.
‚-‘19„releaselog/3_7_16.html3.7.16Bug fix: repair a long-standing problem that could cause incorrect query
    results in a 3-way or larger join that compared INTEGER fields against TEXT
    fields in two or more places.
    Ticket <a href="http://www.sqlite.org/src/info/fc7bd6358f">fc7bd6358f</a>
z‘09ƒ9releaselog/3_7_16.html3.7.16Enhance the <a href="../spellfix1.html">spellfix1</a> extension so that the edit distance cost table can
    be changed at runtime by inserting a string like 'edit_cost_table=TABLE' 
    into the "command" field.

Z‘/9{releaselog/3_7_16.html3.7.16Update cygwin interfaces to omit deprecated API calls.
‘.9kreleaselog/3_7_16.html3.7.16Change to use strncmp() or the equivalent instead of memcmp() when 
    comparing non-zero-terminated strings.
H‘-9‚Ureleaselog/3_7_16.html3.7.16Added the <a href="../pragma.html#pragma_vdbe_addoptrace">PRAGMA vdbe_addoptrace</a> and <a href="../pragma.html#pragma_vdbe_debug">PRAGMA vdbe_debug</a> commands.
O‘,9ereleaselog/3_7_16.html3.7.16Remove all uses of umask() in the unix VFS.
       ‘+9Wreleaselog/3_7_16.html3.7.16Improved error messages for "foreign key mismatch" showing the names of
    the two tables involved.
#‘*9‚releaselog/3_7_16.html3.7.16Improved error messages for invalid boolean arguments to dot-commands
    in the <a href="../cli.html">command-line shell</a>.
t‘)9ƒ-releaselog/3_7_16.html3.7.16Enhance the <a href="../cli.html">command-line shell</a> so that a non-zero argument to the
    ".exit" command causes the shell to exit immediately without cleanly
    shutting down the database connection.
p‘(9%releaselog/3_7_16.html3.7.16Improved error messages in the <a href="../rtree.html">RTREE</a> extension.
‘'9Kreleaselog/3_7_16.html3.7.16Added the test_regexp.c module as a demonstration of how to implement
    the REGEXP operator.
W‘&9ureleaselog/3_7_16.html3.7.16
Improved name resolution for deeply nested queries.
/‘%9‚#releaselog/3_7_16.html3.7.16Allow the error message from <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> to be longer than
    20000 bytes.
T‘$9oreleaselog/3_7_16.html3.7.16Performance improvements in the query optimizer.
h‘#9releaselog/3_7_16.html3.7.16
Enhance the query optimizer to exploit transitive join constraints.

”¦
¬
Zà3
ˆ       xÁˆŸœ[Þx”`‘R=   ‚releaselog/3_7_14_1.html3.7.14.1Fix a bug (ticket 
<a href="../www.sqlite.org/src/tktview/d02e1406a58ea02d">&#91;d02e1406a58ea02d]&#93;</a>)
that causes a segfault on a LEFT JOIN that includes an OR in the ON clause.
c‘Q9releaselog/3_7_15.html3.7.15SHA1 for sqlite3.c: 2b413611f5e3e3b6ef5f618f2a9209cdf25cbcff"

z‘P99releaselog/3_7_15.html3.7.15SQLITE_SOURCE_ID: 
    "2012-12-12 13:36:53 cd0b37c52658bfdf992b1e3dc467bae1835a94ae"
‚=‘O9„?releaselog/3_7_15.html3.7.15Bug fix: Avoid segfault when using the <a href="../lang_expr.html#collateop">COLLATE operator</a> inside of a
    <a href="../lang_createtable.html#ckconst">CHECK constraint</a> or <a href="../lang_createview.html">view</a> in <a href="../sharedcache.html">shared cache mode</a>.

‘N9Creleaselog/3_7_15.html3.7.15Bug fix: Fix a 32-bit overflow problem on CREATE INDEX for databases
    larger than 16GB.
~‘M9Areleaselog/3_7_15.html3.7.15Bug fix: SQL functions created using the TCL interface honor the
    "nullvalue" setting.
e‘L9ƒreleaselog/3_7_15.html3.7.15Bug fix: Avoid a deadlock or crash if the <a href="../backup.html">backup API</a>, <a href="../sharedcache.html">shared cache</a>,
    and the SQLite Encryption Extension are all used at once.
‘K9Ureleaselog/3_7_15.html3.7.15Bug fix: Avoid various concurrency problems in <a href="../sharedcache.html">shared cache mode</a>.
j‘J9releaselog/3_7_15.html3.7.15Work around an optimizer bug in the MSVC compiler when targeting ARM.
=‘I9Areleaselog/3_7_15.html3.7.15
Enhanced support for QNX.
:‘H9‚9releaselog/3_7_15.html3.7.15The xDelete method in the built-in <a href="../vfs.html">VFSes</a> now return
    SQLITE_IOERR_DELETE_NOENT if the file to be deleted does not exist.
u‘G9ƒ/releaselog/3_7_15.html3.7.15Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlbusyhandler">SQLITE_FCNTL_BUSYHANDLER</a> file control, used to allow VFS
    implementations to get access to the busy handler callback.
n‘F9!releaselog/3_7_15.html3.7.15
Added the <a href="../lang_corefunc.html#instr">instr()</a> SQL function.
t‘E9-releaselog/3_7_15.html3.7.15  Added the <a href="../pragma.html#pragma_busy_timeout">busy_timeout pragma</a>.
‚$‘D9„
releaselog/3_7_15.html3.7.1Enhancements the command-line shell:
    <ol type="a">
    <li>Added the ".print" command
    </li><li>Negative numbers in the ".width" command cause right-alignment
    </li><li>Add the ".wheretrace" command when compiled with SQLITE_DEBUG
    </li></ol>
'‘C9‚releaselog/3_7_15.html3.7.15Add the ability to implement FROM clause subqueries as coroutines rather
    that manifesting the subquery into a temporary table.
h‘B9ƒreleaselog/3_7_15.html3.7.15Enhance the query optimizer so that ORDER BY clauses are more aggressively
    optimized, especially in joins where various terms of the ORDER BY clause
    come from separate tables of the join.
=‘A9‚?releaselog/3_7_15.html3.7.15Do full-table scans using covering indices when possible, under the
    theory that an index will be smaller and hence can be scanned with
    less I/O.
w‘@93releaselog/3_7_15.html3.7.15Enhance IN operator processing to make use of indices with numeric
    affinities.
O‘?9ereleaselog/3_7_15.html3.7.15Added support for Windows Phone 8 platforms
v‘>9ƒ1releaselog/3_7_15.html3.7.15Avoid invoking the <a href="../c3ref/profile.html">sqlite3_trace()</a> callback multiple times when a
    statement is automatically reprepared due to <a href="../rescode.html#schema">SQLITE_SCHEMA</a> errors.
m‘=9 !releaselog/3_7_15.html3.7.15Added the <a href="../c3ref/errcode.html">sqlite3_errstr()</a> interface.
f‘<=       releaselog/3_7_15_1.html3.7.15.1SHA1 for sqlite3.c: bbbaa68061e925bd4d7d18d7e1270935c5f7e39a

~‘;=9releaselog/3_7_15_1.html3.7.15.1SQLITE_SOURCE_ID: 
    "2012-12-19 20:39:10 6b85b767d0ff7975146156a99ad673f2c1a23318"

ÙH±0
Ç1M
Ü       Æ       -<Ë3£±4ÏzÏÙr‘f9ƒ)releaselog/3_7_13.html3.7.13Avoid resetting the schema of <a href="../sharedcache.html">shared cache</a> connections when any one
    connection closes.  Instead, wait for the last connection to close before
    resetting the schema.
'‘e9‚releaselog/3_7_13.html3.7.13Recognize and use the <a href="../uri.html#coreqp">mode=memory</a> query parameter in
    <a href="../uri.html">URI filenames</a>.
‚Q‘d9        „ireleaselog/3_7_13.html3.7.13<a href="../inmemorydb.html">In-memory databases</a> that are specified using
    <a href="../uri.html">URI filenames</a> are allowed to use <a href="../sharedcache.html#inmemsharedcache">shared cache</a>,
    so that the same
    in-memory database can be accessed from multiple database connections.
b‘c9       releaselog/3_7_14.html3.7.14
SHA1 for sqlite3.c: 5fdf596b29bb426001f28b488ff356ae14d5a5a6

z‘b99releaselog/3_7_14.html3.7.14SQLITE_SOURCE_ID: 
    "2012-09-03 15:42:36 c0d89d4a9752922f9e367362366efde4f1b06f2a"
n‘a9ƒ!releaselog/3_7_14.html3.7.14Enhance the query planner so that it will try to use a <a href="../queryplanner.html#covidx">covering index</a>
    on queries that make use of <a href="../optoverview.html#or_opt">or optimization</a>.
‘`9]releaselog/3_7_14.html3.7.14
Better handling of aggregate queries where the aggregate functions are
    contained within subqueries.
‘_9mreleaselog/3_7_14.html3.7.14 Added the <a href="../compile.html#disable_fts4_deferred">SQLITE_DISABLE_FTS4_DEFERRED</a> compile-time option.
n‘^9!releaselog/3_7_14.html3.7.1Performance enhancements in the sorter used by ORDER BY and CREATE INDEX.
m‘]9ƒreleaselog/3_7_14.html3.7.14Enhancements to <a href="../wal.html">WAL mode</a> processing that ensure that at least one
    valid read-mark is available at all times, so that read-only processes
    can always read the database.
‚3‘\9„+releaselog/3_7_14.html3.7.14Enhancements to <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> and <a href="../pragma.html#pragma_quick_check">PRAGMA quick_check</a> so that
    they can optionally check just a single attached database instead of all
    attached databases.
_‘[9releaselog/3_7_14.html3.7.14Improvements to the windows makefiles and build processes.
‚‘Z9ƒireleaselog/3_7_14.html3.7.14Updated the <a href="../cli.html">command-line shell</a> so that it can be built using
    <a href="../compile.html#omit_floating_point">SQLITE_OMIT_FLOATING_POINT</a> and <a href="../compile.html#omit_autoinit">SQLITE_OMIT_AUTOINIT</a>.
n‘Y9!releaselog/3_7_14.html3.7.14Added the <a href="../c3ref/close.html">sqlite3_close_v2()</a> interface.
`‘X9ƒreleaselog/3_7_14.html3.7.14Ensure that floating point values are preserved exactly when reconstructing
    a database from the output of the ".dump" command of the 
    <a href="../cli.html">command-line shell</a>.
ƒ‘W9        …kreleaselog/3_7_14.html3.7.14Drop built-in support for OS/2. If you need to upgrade an OS/2
    application to use this or a later version of SQLite,
    then add an application-defined <a href="../vfs.html">VFS</a> using the
    <a href="../c3ref/vfs_find.html">sqlite3_vfs_register()</a> interface.  The code removed in this release can
    serve as a baseline for the application-defined VFS.
f‘V=       releaselog/3_7_14_1.html3.7.14.1SHA1 for sqlite3.c: 62aaecaacab3a4bf4a8fe4aec1cfdc1571fe9a44

~‘U=9releaselog/3_7_14_1.html3.7.14.1SQLITE_SOURCE_ID: 
    "2012-10-04 19:37:12 091570e46d04e84b67228e0bdbcd6e1fb60c6bdb"
‘T=creleaselog/3_7_14_1.html3.7.14.1Fix the TCL interface so that the "nullvalue" setting is honored for
TCL implementations of SQL functions.
4‘S=‚%releaselog/3_7_14_1.html3.7.14.1Work around a bug in the optimizer in the VisualStudio-2012 compiler that
causes invalid code to be generated when compiling SQLite on ARM.

\«vù”
¤
L       Ë       ‰ƒóEŒmK~ ¿\`‘}9releaselog/3_7_12.html3.7.12
Allow virtual table constructors to be invoked recursively.
^‘|9releaselog/3_7_12.html3.7.12Added the ".trace" dot-command to the command-line shell.
[‘{9}releaselog/3_7_12.html3.7.12New interfaces added to the test_quota.c add-on module.
I‘z9‚Wreleaselog/3_7_12.html3.7.12
Enhance the <a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a> command to use much less memory when
    processing multi-gigabyte databases.
‚‘y9„releaselog/3_7_12.html3.7.12 Add the <a href="../compile.html#rtree_int_only">SQLITE_RTREE_INT_ONLY</a> compile-time option to force the
    <a href="../rtree.html">R*Tree Extension Module</a> to use integer instead of
    floating point values for both storage and computation.
‘x9ireleaselog/3_7_12.html3.7.1Improved performance of queries with many OR-connected terms in the
    WHERE clause that can all be indexed.
‘w9Oreleaselog/3_7_12.html3.7.12More aggressive optimization of the AND operator when one side or the
    other is always false.
5‘v9‚/releaselog/3_7_12.html3.7.12Make use of OVERLAPPED in the windows <a href="../vfs.html">VFS</a> to avoid some system calls
    and thereby obtain a performance improvement.
*‘u9‚releaselog/3_7_12.html3.7.12In the command-line shell, use popen() instead of fopen() if the first
    character of the argument to the ".output" command is "|".
‘t9]releaselog/3_7_12.html3.7.12Report the name of specific <a href="../lang_createtable.html#ckconst">CHECK</a> constraints that fail.
‚       ‘s9ƒWreleaselog/3_7_12.html3.7.12Add the <a href="../fts3.html#*fts4mergecmd">FTS4 "merge" command</a>, the <a href="../fts3.html#*fts4automergecmd">FTS4 "automerge" command</a>, and
    the <a href="../fts3.html#*fts4ickcmd">FTS4 "integrity-check" command</a>.
u‘r9ƒ/releaselog/3_7_12.html3.7.12Optimize the <a href="../lang_corefunc.html#typeof">typeof()</a> and <a href="../lang_corefunc.html#length">length()</a> SQL functions so that they avoid
    unnecessary reading of database content from disk.
U‘q9        ‚qreleaselog/3_7_12.html3.7.12Add the <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuscachewrite">SQLITE_DBSTATUS_CACHE_WRITE</a> option for <a href="../c3ref/db_status.html">sqlite3_db_status()</a>.
f‘p=       releaselog/3_7_12_1.html3.7.12.1SHA1 for sqlite3.c: d494e8d81607f0515d4f386156fb0fd86d5ba7df

~‘o=9releaselog/3_7_12_1.html3.7.12.1SQLITE_SOURCE_ID: 
    "2012-05-22 02:45:53 6d326d44fd1d626aae0e8456e5fa2049f1ce0789"
U‘n=ireleaselog/3_7_12_1.html3.7.12.1Fix various other minor test script problems.
l‘m=        ƒreleaselog/3_7_12_1.html3.7.12.1Fix a bug 
    <a href="http://www.sqlite.org/src/info/c2ad16f997ee9c">(ticket c2ad16f997)</a>
    in the 3.7.12 release that can cause a segfault for certain
    obscure nested aggregate queries.
b‘l9       releaselog/3_7_13.html3.7.13    SHA1 for sqlite3.c: ff0a771d6252545740ba9685e312b0e3bb6a641b

z‘k99releaselog/3_7_13.html3.7.1SQLITE_SOURCE_ID: 
    "2012-06-11 02:05:22 f5b5a13f7394dc143aa136f1d4faba6839eaa6dc"
ƒ ‘j9†releaselog/3_7_13.html3.7.13The <a href="../c3ref/create_module.html">sqlite3_create_module()</a> and <a href="../c3ref/create_module.html">sqlite3_create_module_v2()</a> interfaces
    return SQLITE_MISUSE on any attempt to overload or replace a <a href="../vtab.html">virtual table</a>
    module.  The destructor is always called in this case, in accordance with
    historical and current documentation.

‘i9_releaselog/3_7_13.html3.7.13Add interfaces sqlite3_quota_ferror() and sqlite3_quota_file_available()
    to the test_quota.c module.
c‘h9releaselog/3_7_13.html3.7.13Adjust the unix driver to avoid unnecessary calls to fchown().
k‘g9ƒreleaselog/3_7_13.html3.7.13In the <a href="../rtree.html">RTREE</a> extension, when rounding 64-bit floating point numbers
    to 32-bit for storage, always round in a direction that causes the
    bounding box to get larger.

ššP
 :
–       ö       ºrÇEAº|ÿšb’9  releaselog/3_7_11.html3.7.11
SHA1 for sqlite3.c: d460d7eda3a9dccd291aed2a9fda868b9b120a10

z’99releaselog/3_7_11.html3.7.11SQLITE_SOURCE_ID: 
    "2012-03-20 11:35:50 00bb9c9ce4f465e6ac321ced2a9d0062dc364669"
‚:’9„9releaselog/3_7_11.html3.7.11Fix a <a href="http://www.sqlite.org/src/info/b7c8682cc1">bug</a> introduced 
    in <a href="../releaselog/3_7_10.html">version 3.7.10</a> that might cause a LEFT JOIN
    to be incorrectly converted into an INNER JOIN if the WHERE clause
    indexable terms connected by OR.

’9Kreleaselog/3_7_11.html3.7.11
Improvements to the handling of CSV inputs in the <a href="../cli.html">command-line shell</a>
Z’
9‚yreleaselog/3_7_11.html3.7.11 Pending statements no longer block <a href="../lang_transaction.html">ROLLBACK</a>.  Instead, the pending
    statement will return SQLITE_ABORT upon next access after the ROLLBACK.
‚"’9„      releaselog/3_7_11.html3.7.1Documented support for the <a href="../fts3.html#*fts4content">FTS4 content option</a>.  This feature has
    actually been in the code since <a href="../releaselog/3_7_9.html">version 3.7.9</a> but is only now considered
    to be officially supported.
’9Creleaselog/3_7_11.html3.7.11Added support for the <a href="../fts3.html#*fts4languageid">FTS4 languageid option</a>.  
'’
9‚releaselog/3_7_11.html3.7.11Queries of the form:  "SELECT max(x), y FROM table" returns the 
    value of y on the same row that contains the maximum x value.
‚D’     9„Mreleaselog/3_7_11.html3.7.11Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpragma">SQLITE_FCNTL_PRAGMA</a> file control, giving <a href="../vfs.html">VFS</a> implementations
    the ability to add new <a href="../pragma.html#syntax">PRAGMA</a> statements or to override built-in
    PRAGMAs.
w93releaselog/3_7_11.html3.7.11Added the <a href="../c3ref/db_readonly.html">sqlite3_db_readonly()</a> interface.
>’9‚Areleaselog/3_7_11.html3.7.11Added the <a href="../c3ref/stricmp.html">sqlite3_stricmp()</a> interface as a counterpart to
    <a href="../c3ref/stricmp.html">sqlite3_strnicmp()</a>.
’9}releaselog/3_7_11.html3.7.11Enhance the <a href="../lang_createvtab.html">CREATE VIRTUAL TABLE</a> command to support the
    IF NOT EXISTS clause.
 ’9        ‚releaselog/3_7_11.html3.7.11Enhance the <a href="../lang_insert.html">INSERT</a> syntax to allow multiple rows to be inserted
    via the VALUES clause.
c’9releaselog/3_7_12.html3.7.12SHA1 for sqlite3.c: 57e2104a0f7b3f528e7f6b7a8e553e2357ccd2e1


z’99releaselog/3_7_12.html3.7.12SQLITE_SOURCE_ID: 
    "2012-05-14 01:41:23 8654aa9540fe9fd210899d83d17f3f407096c004"
x’9ƒ5releaselog/3_7_12.html3.7.12Bug fix: Do not optimize away an ORDER BY clause that has the same terms
    as a UNIQUE index unless those terms are also NOT NULL.
    Ticket <a href="http://www.sqlite.org/src/info/2a5629202f">2a5629202f</a>.
‚3’9„+releaselog/3_7_12.html3.7.12Bug fix: Do not discard the DISTINCT as superfluous unless a subset of
    the result set is subject to a UNIQUE constraint <em>and</em> it none
    of the columns in that subset can be NULL.
    Ticket <a href="http://www.sqlite.org/src/info/385a5b56b9">385a5b56b9</a>.
H’9‚Ureleaselog/3_7_12.html3.7.12Bug fix: Fix the <a href="../lang_savepoint.html">RELEASE</a> command so that it does not cancel pending
    queries.  This repairs a problem introduced in 3.7.11.
{‘9;releaselog/3_7_12.html3.7.12Improved optimization of aggregate subqueries contained within an
    aggregate query.
c‘~9releaselog/3_7_12.html3.7.12Improved optimization of ORDER BY clauses on compound queries.

•V    SÝ!&wòO¡ÕP•7’!9‚3releaselog/3_7_10.html3.7.10Change the unix <a href="../vfs.html">VFS</a> to be tolerant of read() system calls that return 
    less then the full number of requested bytes.
’ 9Greleaselog/3_7_10.html3.7.10Enhancements to the test_quota.c extension to support stdio-like interfaces
    with quotas.
H’9‚Ureleaselog/3_7_10.html3.7.10Updated the "unix-dotfile" <a href="../vfs.html">VFS</a> to use locking directories with mkdir()
    and rmdir() instead of locking files with open() and unlink().
*’9‚releaselog/3_7_10.html3.7.10
Enhanced the windows <a href="../vfs.html">VFS</a> so that all system calls can be overridden
    using the xSetSystemCall interface.
K’9‚[releaselog/3_7_10.html3.7.10Enhanced the query planner so that the xfer optimization can be used with
    INTEGER PRIMARY KEY ON CONFLICT as long as the destination table is
    initially empty.
P’9‚ereleaselog/3_7_10.html3.7.10Enhanced the query planner flattening logic to allow UNION ALL compounds
    to be promoted upwards to replace a simple wrapper SELECT even if the
    compounds are joins.
’9Greleaselog/3_7_10.html3.7.10
Enhanced the query planner to support index queries with range constraints
    on the rowid.
+’9‚releaselog/3_7_10.html3.7.10 Enhanced the default memory allocator to make use of _msize() on windows,
    malloc_size() on Mac, and malloc_usable_size() on Linux.
w’9ƒ3releaselog/3_7_10.html3.7.1If the argument to <a href="../pragma.html#pragma_cache_size">PRAGMA cache_size</a> is negative N, that means to use
    approximately -1024*N bytes of memory for the page cache regardless of
    the page size.
8’9‚5releaselog/3_7_10.html3.7.10Added the <a href="../c3ref/uri_boolean.html">sqlite3_uri_boolean()</a> and <a href="../c3ref/uri_boolean.html">sqlite3_uri_int64()</a> interfaces.
s’9+releaselog/3_7_10.html3.7.10Added the <a href="../c3ref/stmt_busy.html">sqlite3_stmt_busy()</a> interface.
w’93releaselog/3_7_10.html3.7.10Added the <a href="../c3ref/db_filename.html">sqlite3_db_filename()</a> interface.
V’9‚qreleaselog/3_7_10.html3.7.10Added the <a href="../c3ref/db_release_memory.html">sqlite3_db_release_memory()</a> interface and the
    <a href="../pragma.html#pragma_shrink_memory">shrink_memory pragma</a>.
ƒ+’9†releaselog/3_7_10.html3.7.10Added the <a href="../psow.html">powersafe overwrite</a> property to the VFS interface.  Provide
    the <a href="../c3ref/c_iocap_atomic.html">SQLITE_IOCAP_POWERSAFE_OVERWRITE</a> I/O capability, the
    <a href="../compile.html#powersafe_overwrite">SQLITE_POWERSAFE_OVERWRITE</a> compile-time option, and the
    "psow=BOOLEAN" query parameter for <a href="../uri.html">URI filenames</a>.
…-’9Šreleaselog/3_7_10.html3.7.10The sqlite3_pcache_methods structure and the <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpcache">SQLITE_CONFIG_PCACHE</a>
    and <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfiggetpcache">SQLITE_CONFIG_GETPCACHE</a> configuration parameters are deprecated.
    They are replaced by a new <a href="../c3ref/pcache_methods2.html">sqlite3_pcache_methods2</a> structure and
    <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpcache2">SQLITE_CONFIG_PCACHE2</a> and <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfiggetpcache2">SQLITE_CONFIG_GETPCACHE2</a> configuration
    parameters.
ƒu’9        ‡1releaselog/3_7_10.html3.7.10The default <a href="../fileformat2.html#schemaformat">schema format number</a> is changed from 1 to 4.
    This means that, unless
    the <a href="../pragma.html#pragma_legacy_file_format">PRAGMA legacy_file_format=ON</a> statement is
    run, newly created database files will be unreadable by version of SQLite
    prior to 3.3.0 (2006-01-10).  It also means that the <a href="../lang_createindex.html#descidx">descending indices</a>
    are enabled by default.

‡TŽê¸
Ø
       ’       ËÞ*R6Žׇ‚L’27„areleaselog/3_7_9.html3.7.9     Added the <a href="../compile.html#direct_overflow_read">SQLITE_DIRECT_OVERFLOW_READ</a> compile-time option, causing
    <a href="../fileformat2.html#ovflpgs">overflow pages</a> to be read directly from the database file, 
    bypassing the <a href="../c3ref/pcache_methods2.html">page cache</a>.
3’17‚/releaselog/3_7_9.html3.7.Enhanced the query planner so that it can factor terms in and out of
    OR expressions in the WHERE clause in an effort to find better indices.
$’07‚releaselog/3_7_9.html3.7.9Increase the default <a href="../malloc.html#lookaside">lookaside memory allocator</a> allocation size from
    100 to 128 bytes.
‚’/7ƒyreleaselog/3_7_9.html3.7.9Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntloverwrite">SQLITE_FCNTL_OVERWRITE</a> file-control by which the SQLite core
    indicates to the VFS that the current transaction will overwrite the
    entire database file.
T’.7‚qreleaselog/3_7_9.html3.7.9Enhance the <a href="../c3ref/data_count.html">sqlite3_data_count()</a> interface so that it can be used to
    determine if SQLITE_DONE has been seen on the prepared statement.
0’-7‚)releaselog/3_7_9.html3.7.9Enhancements to the sqlite3_analyzer utility program, including the
    --pageinfo and --stats options and support for multiplexed databases.
i’,7ƒreleaselog/3_7_9.html3.7.9Removed support for <a href="../compile.html#enable_stat2">SQLITE_ENABLE_STAT2</a>, replacing it with the much
    more capable <a href="../compile.html#enable_stat3">SQLITE_ENABLE_STAT3</a> option.
‚F’+7„Ureleaselog/3_7_9.html3.7.9Added options <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuscachehit">SQLITE_DBSTATUS_CACHE_HIT</a> and <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuscachemiss">SQLITE_DBSTATUS_CACHE_MISS</a>
    to the <a href="../c3ref/db_status.html">sqlite3_db_status()</a> interface.
‚’*7        ƒsreleaselog/3_7_9.html3.7.9If a search token (on the right-hand side of the MATCH operator) in
    <a href="../fts3.html#fts4">FTS4</a> begins with "&#94;" then that token must be the first in its field
    of the document.  <b>** Potentially Incompatible Change **</b>
b’)9       releaselog/3_7_10.html3.7.10SHA1 for sqlite3.c: 6497cbbaad47220bd41e2e4216c54706e7ae95d4

z’(99releaselog/3_7_10.html3.7.10SQLITE_SOURCE_ID: 
    "2012-01-16 13:28:40 ebd01a8deffb5024a5d7494eef800d2366d97204"
E’'9‚Oreleaselog/3_7_10.html3.7.10<b>Bug fix:</b>
    Fix problems that can result from 32-bit integer overflow.
    Ticket <a href="http://www.sqlite.org/src/info/ac0ff496b7e2">ac00f496b7e2</a>
\’&9‚}releaselog/3_7_10.html3.7.10<b>Bug fix:</b>
    Change the VDBE so that all registers are initialized to Invalid
    instead of NULL.
    Ticket <a href="http://www.sqlite.org/src/info/7bbfb7d442">7bbfb7d442</a>
‚.’%9„!releaselog/3_7_10.html3.7.10<b>Bug fix:</b>
    Add an additional xSync when restarting a WAL in order to prevent an
    exceedingly unlikely but theoretically possible
    database corruption following power-loss.
    Ticket <a href="http://www.sqlite.org/src/info/ff5be73dee">ff5be73dee</a>.
ƒ ’$9†releaselog/3_7_10.html3.7.10Added the <a href="../c3ref/c_testctrl_always.html">SQLITE_TESTCTRL_EXPLAIN_STMT</a> test-control option with the
    <a href="../compile.html#enable_tree_explain">SQLITE_ENABLE_TREE_EXPLAIN</a> compile-time option to enable the
    <a href="../cli.html">command-line shell</a> to display ASCII-art parse trees of SQL statements
    that it processes, for debugging and analysis.
B’#9‚Ireleaselog/3_7_10.html3.7.10In the <a href="../tclsqlite.html">TCL Interface</a>, add the -uri option to the "sqlite3" TCL command
    used for creating new database connection objects.
(’"9‚releaselog/3_7_10.html3.7.10Change both unix and windows <a href="../vfs.html">VFSes</a> to report a sector size of 4096
    instead of the old default of 512.

T
•|{
¯       Œçbõ\ëoyþšRÓkY’I7   releaselog/3_7_7.html3.7.7 Add support for <a href="../uri.html">URI filenames</a>
e’H;releaselog/3_7_7_1.html3.7.7.1 SHA1 for sqlite3.c: d47594b8a02f6cf58e91fb673e96cb1b397aace0

|’G;9releaselog/3_7_7_1.html3.7.7.1 SQLITE_SOURCE_ID:
    "2011-06-28 17:39:05 af0d91adf497f5f36ec3813f04235a6e195a605f"
‚D’F;        „Kreleaselog/3_7_7_1.html3.7.7.1 Fix <a href="http://www.sqlite.org/src/info/25ee812710">a bug</a> causing 
     <a href="../pragma.html#pragma_case_sensitive_like">PRAGMA case_sensitive_like</a> statements compiled using sqlite3_prepare()
     to fail with an <a href="../rescode.html#schema">SQLITE_SCHEMA</a> error.
a’E7releaselog/3_7_8.html3.7.8
 SHA1 for sqlite3.c: bfcd74a655636b592c5dba6d0d5729c0f8e3b4de

x’D79releaselog/3_7_8.html3.7.8     SQLITE_SOURCE_ID:
    "2011-09-19 14:49:19 3e0da808d2f5b4d12046e05980ca04578f581177"
’C7Ureleaselog/3_7_8.html3.7. Bug fixes: Correctly handle nested correlated subqueries used with
     indices in a WHERE clause.
i’B7releaselog/3_7_8.html3.7.8 Bug fix: Virtual tables now handle IS NOT NULL constraints correctly.
y’A7;releaselog/3_7_8.html3.7.8 Enhancements to the test_quota.c module so that it can track 
     preexisting files.
n’@7%releaselog/3_7_8.html3.7.8 Increase the default size of a lookahead cache line from 100 to 128 bytes.
’?7sreleaselog/3_7_8.html3.7.8 Allow more system calls to be overridden in the unix VFS - to provide
     better support for chromium sandboxes.
j’>7releaselog/3_7_8.html3.7.8 Improved query plan optimization when the DISTINCT keyword is present.
’=7Kreleaselog/3_7_8.html3.7.8 Improved the windows VFS to better defend against interference
     from anti-virus software.
!’<7        ‚
releaselog/3_7_8.html3.7.8 Orders of magnitude performance improvement for <a href="../lang_createindex.html">CREATE INDEX</a> on
     very large tables.
`’;7       releaselog/3_7_9.html3.7.9SHA1 for sqlite3.c: becd16877f4f9b281b91c97e106089497d71bb47

x’:79releaselog/3_7_9.html3.7.9SQLITE_SOURCE_ID: 
    "2011-11-01 00:52:41 c7c6050ef060877ebe77b41d959e9df13f8c9b5e"
‚A’97„Kreleaselog/3_7_9.html3.7.9Fix a bug in <a href="../vtab.html">virtual table</a> implementation that causes a crash if
    an <a href="../fts3.html#fts4">FTS4</a> table is <a href="../lang_droptable.html">dropped</a> inside a transaction and
    a <a href="../lang_savepoint.html">SAVEPOINT</a> occurs afterwards.
H’87‚Yreleaselog/3_7_9.html3.7.9Fix a bug that caused <a href="../lang_vacuum.html">VACUUM</a> to fail if the <a href="../pragma.html#pragma_count_changes">count_changes pragma</a> was
    engaged.
}’77ƒCreleaselog/3_7_9.html3.7.9Fix a bug that prevented the <a href="../pragma.html#pragma_page_count">page_count</a> and <a href="../pragma.html#pragma_quick_check">quick_check</a> pragmas from
    working correctly if their names were capitalized.
‚’67ƒsreleaselog/3_7_9.html3.7.9
Fix a bug that causes incorrect results in aggregate queries that use
    multiple aggregate functions whose arguments contain complicated expressions
    that differ only in the case of string literals contained within those
    expressions.
;’57‚?releaselog/3_7_9.html3.7.9Fix a bug in ASCII-to-float conversion that causes slow performance and
    incorrect results when converting numbers with ridiculously large exponents.
C’47‚Oreleaselog/3_7_9.html3.7.9Fix a bug that prevent <a href="../lang_altertable.html">ALTER TABLE ... RENAME</a> from working
    on some virtual tables in a database with a UTF16 encoding.
a’37ƒreleaselog/3_7_9.html3.7.9
Remove limits on the magnitude of precision and width value in the
    format specifiers of the <a href="../c3ref/mprintf.html">sqlite3_mprintf()</a> family of string rendering
    routines.

‘
½°W¡
ô
Š
       ÇGÞw÷‹x0‘’]7releaselog/3_7_6.html3.7.6 Integer arithmetic operations that would have resulted in overflow
     are now performed using floating-point instead.
‚D’\7„Qreleaselog/3_7_6.html3.7.6 Fix a bug which prevented deferred foreign key constraints from being
     enforced when <a href="../c3ref/finalize.html">sqlite3_finalize()</a> was not
     called by one statement with a failed foreign key constraint prior to
     another statement with foreign key constraints running.
‚’[7ƒgreleaselog/3_7_6.html3.7.6 Improvements to the query planner so that it makes better estimates of
     plan costs and hence does a better job of choosing the right plan,
     especially when <a href="../compile.html#enable_stat2">SQLITE_ENABLE_STAT2</a> is used.
‚’Z7        ƒKreleaselog/3_7_6.html3.7.6 Added the <a href="../c3ref/wal_checkpoint_v2.html">sqlite3_wal_checkpoint_v2()</a> interface and enhanced the
     <a href="../pragma.html#pragma_wal_checkpoint">wal_checkpoint pragma</a> to support blocking checkpoints.
e’Y;releaselog/3_7_6_1.html3.7.6.1 SHA1 for sqlite3.c: b81bfa27d3e09caf3251475863b1ce6dd9f6ab66

}’X;;releaselog/3_7_6_1.html3.7.6.1 SQLITE_SOURCE_ID:
     "2011-04-13 14:40:25 a35e83eac7b185f4d363d7fa51677f2fdfa27695"
‚c’W;        …       releaselog/3_7_6_1.html3.7.6.1 Fix a bug in 3.7.6 that only appears if the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlsizehint">SQLITE_FCNTL_SIZE_HINT</a>
     file control is used with a build of SQLite that makes use of the
     HAVE_POSIX_FALLOCATE compile-time option and which has
     SQLITE_ENABLE_LOCKING_MODE turned off.
f’V;
releaselog/3_7_6_2.html3.7.6.2 SHA1 for sqlite3.c: 806577fd524dd5f3bfd8d4d27392ed2752bc9701


}’U;;releaselog/3_7_6_2.html3.7.6.2 SQLITE_SOURCE_ID:
     "2011-04-17 17:25:17 154ddbc17120be2915eb03edc52af1225eb7cb5e"
6’T;        ‚/releaselog/3_7_6_2.html3.7.6.2 Fix the function prototype for the open(2) system call to agree with
     POSIX.  Without this fix, pthreads does not work correctly on NetBSD.
‚%’S;        „
releaselog/3_7_6_3.html3.7.6.3 Fix a problem with <a href="../wal.html">WAL mode</a> which could cause transactions to
     silently rollback if the <a href="../pragma.html#pragma_cache_size">cache_size</a> is set very small (less than 10)
     and SQLite comes under memory pressure.

a’R7releaselog/3_7_7.html3.7.7
 SHA1 for sqlite3.c: 5bbe79e206ae5ffeeca760dbd0d66862228db551

y’Q7;releaselog/3_7_7.html3.7.7     SQLITE_SOURCE_ID:
     "2011-06-23 19:49:22 4374b7e83ea0a3fbc3691f9c0c936272862f32f2"
g’P7releaselog/3_7_7.html3.7. Added support for <a href="../shortnames.html">short filenames</a>.
)’O7‚releaselog/3_7_7.html3.7.7 Allow <a href="../wal.html">WAL-mode</a> databases to be opened read-only as long as
     there is an existing read/write connection.
2’N7‚-releaselog/3_7_7.html3.7.7 Added support for the <a href="../fts3.html#fts4prefix">FTS4 prefix option</a> and the <a href="../fts3.html#fts4order">FTS4 order option</a>.
V’M7wreleaselog/3_7_7.html3.7.7 Avoid unnecessary reparsing of the database schema.
‚       ’L7ƒ[releaselog/3_7_7.html3.7.7 Update the built-in <a href="../fts3.html">FTS3/FTS4</a> and <a href="../rtree.html">RTREE</a> virtual tables to support
     <a href="../lang_conflict.html">ON CONFLICT</a> clauses and <a href="../lang_replace.html">REPLACE</a>.
‚M’K7„creleaselog/3_7_7.html3.7.7 Add the <a href="../vtab.html#xsavepoint">xSavepoint</a>, <a href="../vtab.html#xsavepoint">xRelease</a> and <a href="../vtab.html#xsavepoint">xRollbackTo</a> methods in
     <a href="../vtab.html">virtual tables</a> in support of <a href="../lang_savepoint.html">SAVEPOINT</a> for virtual tables.
n’J7ƒ%releaselog/3_7_7.html3.7.7 Add the <a href="../c3ref/vtab_config.html">sqlite3_vtab_config()</a> interface in
     support of <a href="../lang_conflict.html">ON CONFLICT</a> clauses with <a href="../vtab.html">virtual tables</a>.

™T
J…Ÿ;
WÂÆSqø|™_’o7  ƒ       releaselog/3_7_4.html3.7.4 Added the <a href="../c3ref/blob_reopen.html">sqlite3_blob_reopen()</a> interface to allow an existing
     <a href="../c3ref/blob.html">sqlite3_blob</a> object to be rebound to a new row.
‚x’n7…9releaselog/3_7_5.html3.7.5
 The SQLite core invokes the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlsyncomitted">SQLITE_FCNTL_SYNC_OMITTED</a> 
     <a href="../c3ref/file_control.html">file control</a>
     to the VFS in place of a call to xSync if the database has
     <a href="../pragma.html#pragma_synchronous">PRAGMA synchronous</a> set to OFF.

‚’m7ƒUreleaselog/3_7_5.html3.7.5    Change the xFileControl() methods on all built-in VFSes to return
     <a href="../rescode.html#notfound">SQLITE_NOTFOUND</a> instead of <a href="../rescode.html#error">SQLITE_ERROR</a> for an unrecognized
     operation code.
‚k’l7…releaselog/3_7_5.html3.7. Enhance the <a href="../c3ref/profile.html">sqlite3_trace()</a> mechanism so that nested SQL statements
     such as might be generated by virtual tables are shown but are shown
     in comments and without parameter expansion.  This 
     greatly improves tracing output when using the FTS3/4 and/or RTREE
     virtual tables.
^’k7ƒreleaselog/3_7_5.html3.7.5 Fix <a href="http://www.sqlite.org/src/info/5d863f876e">a bug</a> involving
     frequent changes in and out of WAL mode and
     VACUUM that could (in theory) cause database corruption.
p’j7)releaselog/3_7_5.html3.7.5 Added the "-heap" option to the <a href="../cli.html">command-line shell</a>
x’i7ƒ9releaselog/3_7_5.html3.7.5 Updates to <a href="../c3ref/stmt_readonly.html">sqlite3_stmt_readonly()</a> so that its result is well-defined
     for all prepared statements and so that it works with <a href="../lang_vacuum.html">VACUUM</a>.
’h7kreleaselog/3_7_5.html3.7.5 Added the <a href="../compile.html#default_foreign_keys">SQLITE_DEFAULT_FOREIGN_KEYS</a> compile-time option.
’g7Sreleaselog/3_7_5.html3.7.5 Added the <a href="../compile.html#omit_autoreset">SQLITE_OMIT_AUTORESET</a> compile-time option.
ƒe’f7‡releaselog/3_7_5.html3.7.5 Added the <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuslookasidehit">SQLITE_DBSTATUS_LOOKASIDE_HIT</a>,
     <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuslookasidemisssize">SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE</a>, and
     <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuslookasidemissfull">SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL</a> options for the
     <a href="../c3ref/db_status.html">sqlite3_db_status()</a> interface.
o’e7 )releaselog/3_7_5.html3.7.5 Added the <a href="../c3ref/mprintf.html">sqlite3_vsnprintf()</a> interface.
a’d7releaselog/3_7_6.html3.7.6 SHA1 for sqlite3.c: f38df08547efae0ff4343da607b723f588bbd66b

y’c7;releaselog/3_7_6.html3.7.6
 SQLITE_SOURCE_ID:
     "2011-04-12 01:58:40 f9d43fa363d54beab6f45db005abac0a7c0c47a7"
g’b7releaselog/3_7_6.html3.7.6     Added the "unix-excl" built-in VFS on unix and unix-like platforms.
A’a7‚Kreleaselog/3_7_6.html3.7. Enhance the <a href="../lang_analyze.html">ANALYZE</a> command to support the name of an index
     as its argument, in order to analyze just that one index.
‚’`7ƒUreleaselog/3_7_6.html3.7.6 Enhancements to FTS4:
     <ol type="a">
     <li> Added the <a href="../fts3.html#fts4aux">fts4aux</a> table
     </li><li> Added support for <a href="../fts3.html#*fts4compression">compressed FTS4 content</a>
     </li></ol>
<’_7‚Areleaselog/3_7_6.html3.7.6 Increase the maximum value of <a href="../limits.html#max_attached">SQLITE_MAX_ATTACHED</a> from 30 to 62
     (though the default value remains at 10).
h’^7ƒreleaselog/3_7_6.html3.7.6 Increased the version number on the <a href="../c3ref/vfs.html">VFS object</a> to
     3 and added new methods xSetSysCall, xGetSysCall, and xNextSysCall
     used for doing full-coverage testing.

l]N
ê
mëG
—       Ju]wÔ8qʼlM“7ereleaselog/3_7_3.html3.7.3
 Miscellaneous documentation enhancements.

‚
“7ƒ]releaselog/3_7_3.html3.7.3      The interface between the VDBE and B-Tree layer is enhanced such that
     the VDBE provides hints to the B-Tree layer letting the B-Tree layer
     know when it is safe to use hashing instead of B-Trees for transient
     tables.
#“7‚releaselog/3_7_3.html3.7. Fix a problem that was causing excess memory usage with large <a href="../wal.html">WAL</a>
     transactions in win32 systems.
C“7‚Oreleaselog/3_7_3.html3.7.3 Enhanced the internal text-to-numeric conversion routines so that they
     work with UTF8 or UTF16, thereby avoiding some UTF16-to-UTF8 text
     conversions.
’7yreleaselog/3_7_3.html3.7.3 Tweaks to the query planner to help it do a better job of finding the
     most efficient query plan for each query.
’~7‚releaselog/3_7_3.html3.7.3 The <a href="../lang_analyze.html">ANALYZE</a> command now gathers statistics on tables even if they 
     have no indices.
b’}7ƒ
releaselog/3_7_3.html3.7.3 Added the <a href="../c3ref/hard_heap_limit64.html">sqlite3_soft_heap_limit64()</a> interface as a replacement for
     <a href="../c3ref/soft_heap_limit.html">sqlite3_soft_heap_limit()</a>.
„’|7‡qreleaselog/3_7_3.html3.7.3 The default page cache strives more diligently to avoid using memory
     beyond what is allocated to it by <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpagecache">SQLITE_CONFIG_PAGECACHE</a>.  Or if
     using page cache is allocating from the heap, it strives to avoid
     going over the <a href="../c3ref/hard_heap_limit64.html">sqlite3_soft_heap_limit64()</a>, even if
     <a href="../compile.html#enable_memory_management">SQLITE_ENABLE_MEMORY_MANAGEMENT</a> is not set.
Q’{7‚kreleaselog/3_7_3.html3.7.3 Added support for <a href="../rtree.html#customquery">custom r-tree queries</a> using application-supplied
     callback routines to define the boundary of the query region.
)’z7        ‚releaselog/3_7_3.html3.7.3 Added the <a href="../c3ref/create_function.html">sqlite3_create_function_v2()</a> interface that includes a
     destructor callback.
L’y7‚areleaselog/3_7_4.html3.7.4 A <a href="http://www.sqlite.org/src/info/80ba201079">very obscure bug</a>
     associated with the <a href="../optoverview.html#or_opt">or optimization</a> was fixed.

L’x7‚areleaselog/3_7_4.html3.7.4
 Added the test_multiplex.c module which provides
     an example VFS that provides multiplexing (sharding)
     of a DB, splitting it over multiple files of fixed size.
,’w7‚!releaselog/3_7_4.html3.7.4    Added the test_superlock.c module which provides example
     code for obtaining an exclusive lock to a rollback
     or WAL database.  
7’v7‚7releaselog/3_7_4.html3.7. Added support for <a href="../fts3.html#fts4">FTS4</a> and enhancements 
     to the FTS <a href="../fts3.html#matchinfo">matchinfo()</a> function.
e’u7ƒreleaselog/3_7_4.html3.7.4 Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlfilepointer">SQLITE_FCNTL_FILE_POINTER</a> option
     to <a href="../c3ref/file_control.html">sqlite3_file_control()</a>.
’t7Greleaselog/3_7_4.html3.7.4 Added <a href="../pragma.html#pragma_checkpoint_fullfsync">PRAGMA checkpoint_fullfsync</a>.
z’s7=releaselog/3_7_4.html3.7.4 Added the <a href="../c3ref/stmt_readonly.html">sqlite3_stmt_readonly()</a> interface.
a’r7releaselog/3_7_4.html3.7.4 Enhancements to <a href="../eqp.html">EXPLAIN QUERY PLAN</a>.
‚’q7ƒ_releaselog/3_7_4.html3.7.4 <a href="../c3ref/vfs.html">VFSes</a> that do not support shared memory are allowed
     to access <a href="../wal.html">WAL</a> databases if <a href="../pragma.html#pragma_locking_mode">PRAGMA locking_mode</a> is set to EXCLUSIVE.
’p7‚releaselog/3_7_4.html3.7.4 Use the new <a href="../c3ref/blob_reopen.html">sqlite3_blob_reopen()</a> interface to improve the performance
     of FTS.

¸ï†Û
t       ×              §‰ÿ™ùAlMÛv“9     3releaselog/3_6_23.html3.6.23 Added the <a href="../pragma.html#pragma_secure_delete">secure_delete pragma</a>.
Q“=‚_releaselog/3_6_23_1.html3.6.23.1 Fix a missing "sync" that when omitted could lead to database
     corruption if a power failure or OS crash occurred just as a
     ROLLBACK operation was finishing.

o“= releaselog/3_6_23_1.html3.6.23.1 Fix a bug in the offsets() function of <a href="../fts3.html">FTS3</a>
‚“7ƒreleaselog/3_7_0.html3.7.0 The logical database size is now stored in the database header so that
     bytes can be appended to the end of the database file without corrupting
     it and so that SQLite will work correctly on systems that lack support
     for ftruncate().

Q“7‚kreleaselog/3_7_0.html3.7.0 Add the <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatuscacheused">SQLITE_DBSTATUS_CACHE_USED</a> verb for <a href="../c3ref/db_status.html">sqlite3_db_status()</a>.
4“7‚1releaselog/3_7_0.html3.7.0 Query planner enhancement - the ORDER BY becomes a no-op if the query
     also contains a GROUP BY clause that forces the correct output order.
“7‚releaselog/3_7_0.html3.7.0 Query planner enhancement - automatic transient indices are created
     when doing so reduces the estimated query time.
c“7 releaselog/3_7_0.html3.7.0 Added support for <a href="../wal.html">write-ahead logging</a>.
“;Mreleaselog/3_7_0_1.html3.7.0.1 Fix a performance regression related to the query planner enhancements
     of version 3.7.0.

‚“
;        ƒwreleaselog/3_7_0_1.html3.7.0.1 Fix a potential database corruption bug that can occur if version 3.7.0
     and version 3.6.23.1 alternately write to the same database file.
     <a href="http://www.sqlite.org/src/info/51ae9cad317a1">
     Ticket &#91;51ae9cad317a1&#93;</a>
#“7‚releaselog/3_7_1.html3.7. The SQLITE_MAX_PAGE_SIZE compile-time option is now silently ignored.
     The maximum page size is hard-coded at 65536 bytes.

?“7Ireleaselog/3_7_1.html3.7.1 Refactored the pager module.
D“
7Sreleaselog/3_7_1.html3.7.1 Fixed a typo in the OS/2 backend.
“     7{releaselog/3_7_1.html3.7.1 Fixed a bug in the query planner that caused performance regressions
     relative to 3.6.23.1 on some complex joins.
‚c7…releaselog/3_7_1.html3.7.1 Added the <a href="../c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlchunksize">SQLITE_FCNTL_CHUNK_SIZE</a> verb to the <a href="../c3ref/file_control.html">sqlite3_file_control()</a>
     interface for both unix and windows, to cause database files to grow in
     large chunks in order to reduce disk fragmentation.
'“7‚releaselog/3_7_1.html3.7.1 Use the <a href="../optoverview.html#like_opt">LIKE optimization</a> even if the right-hand side string contains
     no wildcards.
f“7releaselog/3_7_1.html3.7.1 Increase the maximum size of a database pages from 32KiB to 64KiB.
ƒE“7        †Ureleaselog/3_7_1.html3.7.1 Added new commands <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatusschemaused">SQLITE_DBSTATUS_SCHEMA_USED</a> and
     <a href="../c3ref/c_dbstatus_options.html#sqlitedbstatusstmtused">SQLITE_DBSTATUS_STMT_USED</a> to the <a href="../c3ref/db_status.html">sqlite3_db_status()</a> interface, in
     order to report out the amount of memory used to hold the schema and
     prepared statements of a connection.
‚D“7        „Sreleaselog/3_7_2.html3.7.2 Fix an <a href="http://www.sqlite.org/src/info/5e10420e8d">
     old and very obscure bug</a> that can lead to corruption of the
     database <a href="../fileformat2.html#freelist">free-page list</a> when <a href="../pragma.html#pragma_incremental_vacuum">incremental_vacuum</a> is used.


º
ó~&…
â
P       ¦       'áO¦ŸºZ“'9{releaselog/3_6_21.html3.6.21Other minor bug fixes and documentation enhancements.

“&9Mreleaselog/3_6_21.html3.6.21Improvements to "dot-command" handling in the
<a href="../cli.html">Command Line Interface</a>.
‚“%9ƒKreleaselog/3_6_21.html3.6.21The <a href="../compile.html#secure_delete">SQLITE_SECURE_DELETE</a> compile-time option fixed to make sure that
content is deleted even when the <a href="../lang_delete.html#truncateopt">truncate optimization</a> applies.
%“$9‚releaselog/3_6_21.html3.6.21The FTS3 extension has undergone a major rework and cleanup.
New <a href="../fts3.html">FTS3 documentation</a> is now available.
‡1“#9Ž'releaselog/3_6_21.html3.6.21Performance optimizations targeting a specific use case from
a single high-profile user of SQLite.  A 12% reduction in the number of
CPU operations is achieved (as measured by Valgrind).  Actual performance
improvements in practice may vary depending on workload.  Changes
include:
<ol type="a">
  <li>The <a href="../lang_corefunc.html#ifnull">ifnull()</a> and <a href="../lang_corefunc.html#coalesce">coalesce()</a> SQL functions are now implemented
  using in-line VDBE code rather than calling external functions, so that
  unused arguments need never be evaluated.
  </li><li>The <a href="../lang_corefunc.html#substr">substr()</a> SQL function does not bother to measure the length
  its entire input string if it is only computing a prefix
  </li><li>Unnecessary OP_IsNull, OP_Affinity, and OP_MustBeInt VDBE opcodes
  are suppressed
  </li><li>Various code refactorizations for performance
</li></ol>
Y“"9        ‚yreleaselog/3_6_21.html3.6.21The SQL output resulting from <a href="../c3ref/profile.html">sqlite3_trace()</a> is now modified to include
the values of <a href="../lang_expr.html#varparam">bound parameters</a>.
C“!9Mreleaselog/3_6_22.html3.6.22Other miscellaneous bug fixes.

q“ 9'releaselog/3_6_22.html3.6.22Continuing enhancements and improvements to <a href="../fts3.html">FTS3</a>.
)“9        ‚releaselog/3_6_22.html3.6.22Fix bugs that can (rarely) lead to incorrect query results when
    the CAST or OR operators are used in the WHERE clause of a query.
[“9}releaselog/3_6_23.html3.6.23    Various minor bug fixes and performance enhancements.

&“9‚releaselog/3_6_23.html3.6.2 Updates to the co-hosted <a href="../lemon.html">Lemon LALR(1) parser generator</a>. (These
     updates did not affect SQLite.)
“9areleaselog/3_6_23.html3.6.23 The ".genfkey" operator has been removed from the
     <a href="../cli.html">Command Line Interface</a>.
“9‚releaselog/3_6_23.html3.6.23 The <a href="../pragma.html#pragma_integrity_check">integrity_check pragma</a> is enhanced to detect out-of-order rowids.
“9releaselog/3_6_23.html3.6.23 Improvements and bug-fixes in support for <a href="../compile.html#omit_floating_point">SQLITE_OMIT_FLOATING_POINT</a>.
U“9qreleaselog/3_6_23.html3.6.23 Improvements to <a href="../fts3.html">FTS3</a>.
‚q“9…'releaselog/3_6_23.html3.6.23 Added the <a href="../c3ref/log.html">sqlite3_log()</a> interface together with the
     <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfiglog">SQLITE_CONFIG_LOG</a> verb to <a href="../c3ref/config.html">sqlite3_config()</a>.  The ".log" command
     is added to the <a href="../cli.html">Command Line Interface</a>.
„       “9‡Wreleaselog/3_6_23.html3.6.23 Added the <a href="../c3ref/compileoption_get.html">sqlite3_compileoption_used()</a> and
     <a href="../c3ref/compileoption_get.html">sqlite3_compileoption_get()</a> interfaces as well as the
     <a href="../pragma.html#pragma_compile_options">compile_options pragma</a> and the <a href="../lang_corefunc.html#sqlite_compileoption_used">sqlite_compileoption_used()</a> and
     <a href="../lang_corefunc.html#sqlite_compileoption_get">sqlite_compileoption_get()</a> SQL functions.

dÎo
fÚº
z
8       NeáøYn·d4“:9       ‚/releaselog/3_6_16.html3.6.16Fix a bug (ticket #3929) that occasionally causes INSERT or UPDATE
    operations to fail on an indexed table that has a self-modifying trigger.
“9=        mreleaselog/3_6_16_1.html3.6.16.1A small patch to version 3.6.16 to fix 
<a href="http://www.sqlite.org/src/info/6b00e0a34c">the OP_If bug</a>.

3“89‚+releaselog/3_6_17.html3.6.17Many code simplifications and obscure bug fixes in support of
    providing <a href="../testing.html#coverage">100% branch test coverage</a>.

g“79ƒreleaselog/3_6_17.html3.6.17Remove the restriction on <a href="../vtab.html">virtual tables</a> and <a href="../sharedcache.html">shared cache mode</a>.
    Virtual tables and shared cache can now be used at the same time.
“69        }releaselog/3_6_17.html3.6.17Expose the <a href="../c3ref/stricmp.html">sqlite3_strnicmp()</a> interface for use by extensions and
    applications.
“59greleaselog/3_6_18.html3.6.1Obscure bug fix on triggers
(<a href="http://www.sqlite.org/src/info/efc02f9779">&#91;efc02f9779&#93;</a>).

‚P“49„ereleaselog/3_6_18.html3.6.18Added improved version identification features:
    C-Preprocessor macro <a href="../c3ref/c_source_id.html">SQLITE_SOURCE_ID</a>,
    C/C++ interface <a href="../c3ref/libversion.html">sqlite3_sourceid()</a>, and SQL function <a href="../lang_corefunc.html#sqlite_source_id">sqlite_source_id()</a>.
ƒ“39…Ereleaselog/3_6_18.html3.6.18Added the <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_SHAREDCACHE</a> and <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_PRIVATECACHE</a>
    flags for <a href="../c3ref/open.html">sqlite3_open_v2()</a> used to override the global
    <a href="../sharedcache.html">shared cache mode</a> settings for individual database connections.
e“29ƒreleaselog/3_6_18.html3.6.18Delete triggers fire when rows are removed due to a 
    <a href="../lang_conflict.html">REPLACE conflict resolution</a>.  This feature is only
    enabled when recursive triggers are enabled.
2“19‚)releaselog/3_6_18.html3.6.18Recursive triggers can be enabled using the <a href="../pragma.html#pragma_recursive_triggers">PRAGMA recursive_triggers</a>
    statement.  
‚0“09„%releaselog/3_6_18.html3.6.18The <a href="../compile.html#enable_stat2">SQLITE_ENABLE_STAT2</a> compile-time option causes the <a href="../lang_analyze.html">ANALYZE</a> 
    command to collect a small histogram of each index, to help SQLite better
    select among competing range query indices.
?“/9Ereleaselog/3_6_18.html3.6.18Query planner enhancements.
“.9        {releaselog/3_6_18.html3.6.18Versioning of the SQLite source code has transitioned from CVS to
    <a href="http://www.fossil-scm.org/">Fossil</a>.
“-9‚releaselog/3_6_19.html3.6.19Fix a bug introduced in 3.6.18 that can lead to a segfault when an
    attempt is made to write on a read-only database.

‚“,9ƒ}releaselog/3_6_19.html3.6.19The <a href="../tclsqlite.html">TCL Interface</a> has been enhanced to use the
    <a href="http://www.tcl-lang.org/cgi-bin/tct/tip/322.html">Non-Recursive Engine (NRE)</a>
    interface to the TCL interpreter when linked against TCL 8.6 or later.
“+9Ureleaselog/3_6_19.html3.6.19Generalized the IS and IS NOT operators to take arbitrary expressions
    on their right-hand side.
‚“*9        ƒQreleaselog/3_6_19.html3.6.19Added support for <a href="../foreignkeys.html">foreign key constraints</a>.  Foreign key constraints
    are disabled by default.  Use the <a href="../pragma.html#pragma_foreign_keys">foreign_keys pragma</a> to turn them on.
\“)9releaselog/3_6_20.html3.6.20Various minor bug fixes and documentation enhancements.

‚.“(9        „#releaselog/3_6_20.html3.6.20Optimizer enhancement: <a href="../c3ref/stmt.html">prepared statements</a> are automatically 
re-compiled when a binding on the RHS of a LIKE operator changes or
when any range constraint changes under <a href="../compile.html#enable_stat2">SQLITE_ENABLE_STAT2</a>.

Z¤
Ál
7µ$
Ë

       =TýöNq[÷¹ØZ{“S9;releaselog/3_6_12.html3.6.12Added the <a href="../c3ref/unlock_notify.html">sqlite3_unlock_notify()</a> interface.
]“R9        ƒreleaselog/3_6_12.html3.6.12Fixed a bug that caused database corruption when an <a href="../pragma.html#pragma_incremental_vacuum">incremental_vacuum</a> is
    rolled back in an in-memory database.  Ticket #3761.
;“Q9=releaselog/3_6_13.html3.6.13Other minor bug fixes.

a“P9releaselog/3_6_13.html3.6.13Fix data structure alignment issues on Sparc.  Ticket #3777.
‚“O9ƒireleaselog/3_6_13.html3.6.13Fix a bug in <a href="../releaselog/3_6_12.html">version 3.6.12</a> that causes a segfault that when 
    inserting into a table using a DEFAULT value where there is a 
    function as part of the DEFAULT value expression.  Ticket #3791.
Y“N9        ‚yreleaselog/3_6_13.html3.6.13Fix a bug in <a href="../releaselog/3_6_12.html">version 3.6.12</a> that causes a segfault when running
    a count(*) on the sqlite_master table of an empty database. Ticket #3774.
$“M9‚
releaselog/3_6_14.html3.6.14Countless minor bug fixes, documentation improvements, new and
    improved test cases, and code simplifications and cleanups.

‚“L9ƒKreleaselog/3_6_14.html3.6.14Added the <a href="../compile.html#have_isnan">SQLITE_HAVE_ISNAN</a> compile-time option which will cause
    the isnan() function from the standard math library to be used instead
    of SQLite's own home-brew NaN checker.T“K9oreleaselog/3_6_14.html3.6.14Speed improvements in the btree and pager layers.7“J9‚3releaselog/3_6_14.html3.6.14Enhanced the query optimizer so that <a href="../vtab.html">virtual tables</a> are able to
    make use of OR and IN operators in the WHERE clause.m“I9 !releaselog/3_6_14.html3.6.14Added the optional <a href="../asyncvfs.html">asynchronous VFS</a> module.:“H=‚1releaselog/3_6_14_1.html3.6.14.1Fix a bug in the <a href="../c3ref/backup.html">sqlite3_backup</a> implementation that can lead
    to a corrupt backup database.  Ticket #3858.

^“G={releaselog/3_6_14_1.html3.6.14.1Fix a performance bug in the pager cache, ticket #3844
“F=        Areleaselog/3_6_14_1.html3.6.14.1Fix a bug in <a href="../lang_aggfunc.html#group_concat">group_concat()</a>, ticket #3841
f“E=        ƒreleaselog/3_6_14_2.html3.6.14.2Fix a code generator bug introduced in <a href="../releaselog/3_6_14.html">version 3.6.14</a>.  This bug
    can cause incorrect query results under obscure circumstances.
    Ticket #3879.

:“D9‚9releaselog/3_6_15.html3.6.15 Continuing improvements to the test suite and fixes to obscure
    bugs and inconsistencies that the test suite improvements are
    uncovering.
   

V“C9sreleaselog/3_6_15.html3.6.1Enhanced robustness against corrupt database files

“B9_releaselog/3_6_15.html3.6.15The <a href="../c3ref/initialize.html">sqlite3_shutdown()</a> interface frees all mutexes under windows.
f“A9releaselog/3_6_15.html3.6.15Resolve race conditions when checking for a hot rollback journal.
‚“@9ƒoreleaselog/3_6_15.html3.6.15When new tables are created using CREATE TABLE ... AS SELECT ... the
    datatype of the columns is the simplified SQLite datatype (TEXT, INT,
    REAL, NUMERIC, or BLOB) instead of a copy of the original datatype from
    the source table.
‚1“?9„'releaselog/3_6_15.html3.6.15The <a href="../c3ref/create_function.html">sqlite3_create_function()</a> family of interfaces now return
    <a href="../rescode.html#misuse">SQLITE_MISUSE</a> instead of <a href="../rescode.html#error">SQLITE_ERROR</a> when passed invalid
    parameter combinations.
R“>9kreleaselog/3_6_15.html3.6.15Fix an 64-bit alignment bug on HP/UX and Sparc
I“=9Yreleaselog/3_6_15.html3.6.15Reduce the amount of stack space used
“<9        mreleaselog/3_6_15.html3.6.15Refactor the internal representation of SQL expressions so that they
    use less memory on embedded platforms.
Y“;9yreleaselog/3_6_16.html3.6.16Other minor bug fixes and performance optimizations.


DnÏ!
Ê
d
<ºA‹
Ñ
R       s       M®š¹*éÑl”NÒD
“o7]releaselog/3_6_6.html3.6.6Fix a problem in the virtual table commit mechanism that was causing
    a crash in FTS3.  Ticket #3497.y“n7      =releaselog/3_6_6.html3.6.6Fix a #define that prevented <a href="../malloc.html#memsys5">memsys5</a> from compilingC“m;Ireleaselog/3_6_6_1.html3.6.6.1Two other very minor bug fixesT“l;      ‚kreleaselog/3_6_6_1.html3.6.6.1Fix a bug in the page cache that can lead database corruption following
    a rollback.  This bug was first introduced in <a href="../releaselog/3_6_4.html">version 3.6.4</a>.b“k;releaselog/3_6_6_2.html3.6.6.2Fix a memory leak that can occur following a disk I/O error.‚“j;    ƒkreleaselog/3_6_6_2.html3.6.6.2Fix a bug in the b-tree delete algorithm that seems like it might be
    able to cause database corruption.  The bug was first introduced in
    <a href="../releaselog/3_6_6.html">version 3.6.6</a> by check-in &#91;5899&#93; on 2008-11-13.>“i7Greleaselog/3_6_7.html3.6.7Fixes for various minor bugs.“h7_releaselog/3_6_7.html3.6.7Added superfluous casts and variable initializations in order
    to suppress nuisance compiler warnings.]“g7ƒreleaselog/3_6_7.html3.6.7Changed the signature of the xDlSym method of the <a href="../c3ref/vfs.html">sqlite3_vfs</a> object
    in a way that is backwards compatible but which might cause
    compiler warnings.‚“f7ƒireleaselog/3_6_7.html3.6.7Changed the prototype of the <a href="../c3ref/auto_extension.html">sqlite3_auto_extension()</a> interface in a
    way that is backwards compatible but which might cause warnings in new
    builds of applications that use that interface.O“e7ireleaselog/3_6_7.html3.6.7Added support for "Proxy Locking" on Mac OS X.J“d7    areleaselog/3_6_7.html3.6.7Reorganize the Unix interface in os_unix.cN“c7‚ereleaselog/3_6_8.html3.6.8Added support for parentheses in FTS3 query patterns using the
    <a href="../compile.html#enable_fts3_parenthesis">SQLITE_ENABLE_FTS3_PARENTHESIS</a> compile-time option.b“b7ƒ
releaselog/3_6_8.html3.6.8Enhanced the query optimizer so that it is able to use
    multiple indices to efficiently process 
    <a href="../optoverview.html#or_opt">OR-connected constraints</a>
    in a WHERE clause.k“a7   !releaselog/3_6_8.html3.6.8Added support for <a href="../lang_savepoint.html">nested transactions</a>[“`7  ƒreleaselog/3_6_9.html3.6.9Fix two bugs, which when combined might result in incorrect
    query results.  Both bugs were harmless by themselves; only when
    they team up do they cause problems.  Ticket #3581.

|“_9 ?releaselog/3_6_10.html3.6.10Fix a cache coherency problem that could lead to database corruption.
    Ticket #3584.

<“^9?releaselog/3_6_11.html3.6.11Various minor bug fixes

x“]95releaselog/3_6_11.html3.6.11Improvements to the <a href="../syntaxdiagrams.html">syntax bubble
    diagrams</a>
2“\9‚)releaselog/3_6_11.html3.6.11Added new methods <a href="../tclsqlite.html#backup">backup</a> and
    <a href="../tclsqlite.html#restore">restore</a> to the TCL interface.
v“[91releaselog/3_6_11.html3.6.11Added new commands ".backup" and ".restore" to the <a href="../cli.html">CLI</a>.
“Z9 Ereleaselog/3_6_11.html3.6.11Added the <a href="../c3ref/backup_finish.html#sqlite3backupinit">hot-backup interface</a>.
%“Y9releaselog/3_6_12.html3.6.1

c“X9releaselog/3_6_12.html3.6.12Reduce the amount of heap memory used, especially by TRIGGERs.
T“W9oreleaselog/3_6_12.html3.6.12Performance improvements for "count(*)" queries.
*“V9‚releaselog/3_6_12.html3.6.12Add the new ".genfkey" command in the <a href="../cli.html">CLI</a> for generating triggers to
    implement foreign key constraints.
“U9{releaselog/3_6_12.html3.6.12The default page size on windows is automatically adjusted to match the
    capabilities of the underlying filesystem.
“T9areleaselog/3_6_12.html3.6.12Added the <a href="../pragma.html#pragma_reverse_unordered_selects">reverse_unordered_selects pragma</a>.

T‰C¼K
¬8À
¾       t-š6ÐIß”õ<‡NæT*”       7releaselog/3_6_2.html3.6.2Bug fixesb7
releaselog/3_6_2.html3.6.2Factor out identifier resolution procedures into separate files.e”7    releaselog/3_6_2.html3.6.2Split the pager subsystem into separate pager and pcache subsystems.6”77releaselog/3_6_3.html3.6.3Other minor bug fixesy”7        =releaselog/3_6_3.html3.6.3Fix for a bug in the SELECT DISTINCT logic that was introduced by the
    prior version.6”77releaselog/3_6_4.html3.6.4
Other minor bug fixes5”7‚3releaselog/3_6_4.html3.6.4      The <a href="../lang.html">SQL language documentation</a> is converted to use 
<a href="../syntaxdiagrams.html">syntax diagrams</a> instead of BNF.”7releaselog/3_6_4.html3.6.Added the <a href="../compile.html#omit_truncate_optimization">SQLITE_OMIT_TRUNCATE_OPTIMIZATION</a> compile-time option.‚G”7„Wreleaselog/3_6_4.html3.6.4Added the
  <a href="http://www.sqlite.org/src/finfo?name=tool/genfkey.c">
  source code</a> and
  <a href="http://www.sqlite.org/src/finfo?name=tool/genfkey.README">
  documentation</a> for the <b>genfkey</b> program for automatically generating
  triggers to enforce foreign key constraints.g”7releaselog/3_6_4.html3.6.4Performance enhancements to tree balancing logic in the B-Tree layer.“7Oreleaselog/3_6_4.html3.6.4Added the TRUNCATE option to <a href="../pragma.html#pragma_journal_mode">PRAGMA journal_mode</a>c“~7releaselog/3_6_4.html3.6.4The LOCKING_STYLE extension is now enabled by default on Mac OS Xa“}7releaselog/3_6_4.html3.6.4Add the <a href="../lang_indexedby.html">INDEXED BY</a> clause.“|7greleaselog/3_6_4.html3.6.4Added the <a href="../c3ref/stmt_status.html">sqlite3_stmt_status()</a> interface for performance monitoring.‚C“{7   „Qreleaselog/3_6_4.html3.6.4Add option support for LIMIT and ORDER BY clauses on <a href="../lang_delete.html">DELETE</a> and
    <a href="../lang_update.html">UPDATE</a> statements.  Only works if SQLite is compiled with
    <a href="../compile.html#enable_update_delete_limit">SQLITE_ENABLE_UPDATE_DELETE_LIMIT</a>.
}“z7Creleaselog/3_6_5.html3.6.5    Added the <a href="../compile.html#zero_malloc">SQLITE_ZERO_MALLOC</a> compile-time option.“y7wreleaselog/3_6_5.html3.6.Drop all support for the <a href="../malloc.html#memsysx">experimental memory allocators</a> memsys4 and
    memsys6.‚+“x7„releaselog/3_6_5.html3.6.5The error code is changed to <a href="../rescode.html#busy">SQLITE_BUSY</a> (instead of <a href="../rescode.html#error">SQLITE_ERROR</a>)
    when an attempt is made to <a href="../lang_transaction.html">ROLLBACK</a> while one or more queries are
    still pending.~“w7ƒEreleaselog/3_6_5.html3.6.5The <a href="../lang_transaction.html">COMMIT</a> command now succeeds even if there are pending queries.
    It returns <a href="../rescode.html#busy">SQLITE_BUSY</a> if there are pending incremental BLOB I/O requests.
u“v73releaselog/3_6_5.html3.6.5Added the <a href="../c3ref/errcode.html">sqlite3_extended_errcode()</a> interface.‚p“u7…)releaselog/3_6_5.html3.6.5Fixed the <a href="../lang_delete.html#truncateopt">truncate optimization</a> so that <a href="../c3ref/changes.html">sqlite3_changes()</a> and
    <a href="../c3ref/total_changes.html">sqlite3_total_changes()</a> interfaces and the <a href="../pragma.html#pragma_count_changes">count_changes pragma</a>
    return the correct values.“t7releaselog/3_6_5.html3.6.5Added the <a href="../compile.html#omit_truncate_optimization">SQLITE_OMIT_TRUNCATE_OPTIMIZATION</a> compile-time option.n“s7%releaselog/3_6_5.html3.6.5Added the <a href="../c3ref/db_mutex.html">sqlite3_db_mutex()</a> interface.“r7  Qreleaselog/3_6_5.html3.6.5Add the MEMORY option to the <a href="../pragma.html#pragma_journal_mode">journal_mode pragma</a>.C“q7Qreleaselog/3_6_6.html3.6.6Added built-in support for VxWorkst“p71releaselog/3_6_6.html3.6.6Add the <a href="../c3ref/pcache_methods2.html">application-defined page cache</a>
|60â¡
d
       -‚ʵ1|1”7‚+releaselog/3_6_0.html3.6.Added the <a href="../c3ref/initialize.html">sqlite3_initialize()</a> and <a href="../c3ref/initialize.html">sqlite3_shutdown()</a> interfaces.P”7‚ireleaselog/3_6_0.html3.6.0Added the <a href="../c3ref/status.html">sqlite3_status()</a> interface used for querying run-time status
    information about the overall SQLite library and its subsystems.,”7‚!releaselog/3_6_0.html3.6.0Added the <a href="../c3ref/config.html">sqlite3_config()</a> interface for doing run-time configuration
    of the entire SQLite library.‚”7ƒkreleaselog/3_6_0.html3.6.0The result column names generated for compound subqueries have been 
    simplified to show only the name of the column of the original table and
    omit the table name.  This makes SQLite operate more like other SQL
    database engines.ƒ4”7†1releaselog/3_6_0.html3.6.0The handling of IN and NOT IN operators that contain a NULL on their
    right-hand side expression is brought into compliance with the SQL
    standard and with other SQL database engines.  This is a bug fix,
    but as it has the potential to break legacy applications that depend
    on the older buggy behavior, we mark that as a
    <font color="red">*** Potentially incompatible change ***</font>ƒ'”7†releaselog/3_6_0.html3.6.0The SQLITE_MUTEX_APPDEF compile-time option is no longer supported.
    Alternative mutex implementations can now be added at run-time using
    the <a href="../c3ref/config.html">sqlite3_config()</a> interface with the <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigmutex">SQLITE_CONFIG_MUTEX</a> verb.
    <font color="red">*** Potentially incompatible change ***</font>‚l”7…!releaselog/3_6_0.html3.6.0All C-preprocessor macros used to control compile-time options
    now begin with the prefix "SQLITE_".  This may require changes to
    applications that compile SQLite using their own makefiles and with
    custom compile-time options, hence we mark this as a
    <font color="red">*** Potentially incompatible change ***</font>‚7”7    „9releaselog/3_6_0.html3.6.0Modifications to the <a href="../c3ref/vfs.html">virtual file system</a> interface
    to support a wider range of embedded systems.
    See <a href="../35to36.html">35to36.html</a> for additional information.
    <font color="red">*** Potentially incompatible change ***</font>>”7Greleaselog/3_6_1.html3.6.1Miscellaneous minor bug fixesH”7[releaselog/3_6_1.html3.6.1Numerous other performance enhancements‚9”7„;releaselog/3_6_1.html3.6.1Added the <a href="../c3ref/db_config.html">sqlite3_db_config()</a> and <a href="../c3ref/db_status.html">sqlite3_db_status()</a> interfaces for
    controlling and monitoring the lookaside allocator separately on each
    <a href="../c3ref/sqlite3.html">database connection</a>.‚=”
7„Creleaselog/3_6_1.html3.6.1Modified <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigpagecache">SQLITE_CONFIG_PAGECACHE</a> and <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfigscratch">SQLITE_CONFIG_SCRATCH</a> to remove
    the "+4" magic number in the buffer size computation.
‚J”7„]releaselog/3_6_1.html3.6.1Added verbs <a href="../c3ref/c_status_malloc_count.html#sqlitestatuspagecachesize">SQLITE_STATUS_PAGECACHE_SIZE</a> and
    <a href="../c3ref/c_status_malloc_count.html#sqlitestatusscratchsize">SQLITE_STATUS_SCRATCH_SIZE</a> to the <a href="../c3ref/status.html">sqlite3_status()</a> interface.
‚”7ƒMreleaselog/3_6_1.html3.6.1Added the <a href="../c3ref/c_config_covering_index_scan.html#sqliteconfiglookaside">SQLITE_CONFIG_LOOKASIDE</a> verb to <a href="../c3ref/config.html">sqlite3_config()</a> to control
    the default lookaside configuration.F”
7    ‚Wreleaselog/3_6_1.html3.6.1Added the <a href="../malloc.html#lookaside">lookaside memory allocator</a> for a speed improvement in excess
    of 15% on some workloads.  (Your mileage may vary.)
†NÖc
Q~À&
]       Ù       >á}Ƚóm¤0žP†F”17‚Ureleaselog/3_5_8.html3.5.8Fix a bug in the SQLITE_SECURE_DELETE option that was causing
    Firefox crashes.  Make arrangements to always test SQLITE_SECURE_DELETE
    prior to each release.K”07areleaselog/3_5_8.html3.5.8
Fix a bug in the RTRIM collating sequence.”/7ereleaselog/3_5_8.html3.5.8 Performance improvement: Results of OP_Column are reused rather than
    issuing multiple OP_Column opcodes.q”.7+releaselog/3_5_8.html3.5.Performance improvement: Constant subexpressions are factored out of
    loops.E”-7‚Sreleaselog/3_5_8.html3.5.8Performance improvement: The OP_IdxDelete opcode uses unpacked records,
    obviating the need for one OP_MakeRecord opcode call for each index
    record deleted.”,7Mreleaselog/3_5_8.html3.5.8The xAccess() method of the VFS is allowed to return -1 to signal
    a memory allocation error.”+7Yreleaselog/3_5_8.html3.5.8Allow the <a href="../lang_vacuum.html">VACUUM</a> command to change the page size of a database file.”*7Greleaselog/3_5_8.html3.5.8Improved crash-robustness: write the database page size into the rollback
    journal header.8”)7‚9releaselog/3_5_8.html3.5.8New interface <a href="../c3ref/limit.html">sqlite3_limit()</a> allows size and length limits to be
    set on a per-connection basis and at run-time.‚”(7ƒWreleaselog/3_5_8.html3.5.8New interface <a href="../c3ref/context_db_handle.html">sqlite3_context_db_handle()</a> that returns the
    <a href="../c3ref/sqlite3.html">database connection</a> handle that has invoked an application-defined
    SQL function.1”'7       ‚-releaselog/3_5_8.html3.5.8Expose SQLite's internal pseudo-random number generator (PRNG)
    via the <a href="../c3ref/randomness.html">sqlite3_randomness()</a> interfacea”&7releaselog/3_5_9.html3.5.9
And, many more minor bug fixes and performance enhancements....Z”%7releaselog/3_5_9.html3.5.9      Avoid cache pages leaks following disk-full or I/O errorsk”$7ƒreleaselog/3_5_9.html3.5.The "configure" scripts should now automatically configure Unix
    systems for large file support.  Improved error messages for
    when large files are encountered and large file support is disabled.(”#7‚releaselog/3_5_9.html3.5.9Make sure that when a connection blocks on a RESERVED lock that
    it is able to continue after the lock is released.  (Ticket #3093)”"7Ireleaselog/3_5_9.html3.5.9Always convert IEEE floating point NaN values into NULL during
    processing.  (Ticket #3060)E”!7‚Sreleaselog/3_5_9.html3.5.9Fix a buffer-overrun problem in <a href="../c3ref/mprintf.html">sqlite3_mprintf()</a> which occurs
    when a string without a zero-terminator is passed to "%.*s".” 7ureleaselog/3_5_9.html3.5.9Performance enhancement: Reengineer the internal routines used
    to interpret and render variable-length integers.:”7‚=releaselog/3_5_9.html3.5.9Fix a performance regression on LEFT JOIN (see ticket #3015)
    that was mistakenly introduced in <a href="../releaselog/3_5_8.html">version 3.5.8</a>.O”7‚greleaselog/3_5_9.html3.5.9<a href="../pragma.html#pragma_journal_mode">Journal mode PERSIST</a> is the default behavior in
    <a href="../pragma.html#pragma_locking_mode">exclusive locking mode</a>.-”7    ‚%releaselog/3_5_9.html3.5.9Added <em>experimental</em>
    support for the <a href="../pragma.html#pragma_journal_mode">journal_mode</a> PRAGMA and persistent journal.^”7releaselog/3_6_0.html3.6.0Added a new <a href="../rtree.html">R*Tree virtual table</a>p”7)releaselog/3_6_0.html3.6.0Added the <a href="../c3ref/next_stmt.html">sqlite3_next_stmt()</a> interface.u”73releaselog/3_6_0.html3.6.0
Added the <a href="../pragma.html#pragma_page_count">PRAGMA page_count</a> command..”7‚%releaselog/3_6_0.html3.6.0        The <a href="../c3ref/c_open_autoproxy.html">SQLITE_OPEN_NOMUTEX</a> option was added to <a href="../c3ref/open.html">sqlite3_open_v2()</a>.
¢¯gÈU
À
Ýy&Ç/
d       û       l       æЖ_…Æó¢N”L7greleaselog/3_5_4.html3.5.4Prefix search in FTS3 is much more efficient.O”K7‚greleaselog/3_5_4.html3.5.4Add the ability to change the 
<a href="../pragma.html#pragma_auto_vacuum">auto_vacuum</a> status of a
database by setting the auto_vaccum pragma and VACUUMing the database.U”J7ureleaselog/3_5_4.html3.5.4Better optimization of some IN operator expressions.d”I7releaselog/3_5_4.html3.5.4Productize and officially support the group_concat() SQL function.V”H7‚ureleaselog/3_5_4.html3.5.4The <a href="../lang_vacuum.html">VACUUM</a> command preserves
the setting of the 
<a href="../pragma.html#pragma_legacy_file_format">legacy_file_format pragma</a>.
(Ticket #2804.)‚3”G7„/releaselog/3_5_4.html3.5.4Bring the processing of ORDER BY into compliance with the 
SQL standard for case where a result alias and a table column name
are in conflict.  Correct behavior is to prefer the result alias.
Older versions of SQLite incorrectly picked the table column.
(See ticket #2822.)‚6”F7     „7releaselog/3_5_4.html3.5.4Fix a critical bug in UPDATE or DELETE that occurs when an
OR REPLACE clause or a trigger causes rows in the same table to
be deleted as side effects.  (See ticket #2832.)  The most likely
result of this bug is a segmentation fault, though database
corruption is a possibility.K”E7areleaselog/3_5_5.html3.5.5Add the build-in RTRIM collating sequence.D”D7      ‚Sreleaselog/3_5_5.html3.5.5Convert the underlying virtual machine to be a register-based machine
rather than a stack-based machine.  The only user-visible change
is in the output of EXPLAIN.‚"”C7„
releaselog/3_5_6.html3.5.6Add the new <a href="../c3ref/result_blob.html">sqlite3_result_error_code()</a> API and use it in the
implementation of <a href="../lang_attach.html">ATTACH</a> so that proper error codes are returned
when an <a href="../lang_attach.html">ATTACH</a> fails.I”B7]releaselog/3_5_6.html3.5.6Bring the OS/2 porting layer up-to-date.6”A7     ‚7releaselog/3_5_6.html3.5.6Fix a bug (ticket #2913)
that prevented virtual tables from working in a LEFT JOIN.
The problem was introduced into shortly before the 3.5.5 release.W”@7yreleaselog/3_5_7.html3.5.7
Many improvements and cleanups to the configure script”?7_releaselog/3_5_7.html3.5.7Store the statement journal in the temporary file directory instead of
collocated with the database file.f”>7releaselog/3_5_7.html3.5.7Get the SQLITE_ENABLE_LOCKING_STYLE macro working again on Mac OS X.G”=7‚Wreleaselog/3_5_7.html3.5.7
Added the "bitvec" object for keeping track of which pages have
been journalled.  Improves speed and reduces memory consumption, especially
for large database files.”<7qreleaselog/3_5_7.html3.5.7  Fix a bug in the LIKE optimizer that occurs when the last character
before the first wildcard is an upper-case "Z"\”;7releaselog/3_5_7.html3.5.Accept "Z" as the zulu timezone at the end of date stringsP”:7kreleaselog/3_5_7.html3.5.7Remove all instances of sprintf() from the codea”97releaselog/3_5_7.html3.5.7Added an experimental power-of-two, first-fit memory allocator.8”87;releaselog/3_5_7.html3.5.7Additional OS/2 updates$”77‚releaselog/3_5_7.html3.5.7Do not apply the flattening optimization if the outer query is an
aggregate and the inner query contains ORDER BY.  (Ticket #2943)”67kreleaselog/3_5_7.html3.5.7Use the WHERE clause to reduce the size of a materialized VIEW in
an UPDATE or DELETE statement. (Optimization)p”57)releaselog/3_5_7.html3.5.7ALTER TABLE uses double-quotes instead of single-quotes for quoting
filenames.”47      ‚releaselog/3_5_7.html3.5.7Fix a bug (ticket #2927) in the register allocation for
compound selects - introduced by the new VM code in version 3.5.5.E”37Ureleaselog/3_5_8.html3.5.8
Other miscellaneous minor bug fixes.N”27greleaselog/3_5_8.html3.5.8Other miscellaneous performance enhancements.
À.â:
µ
Kõy(©E
}       Tð†
¦
Àu1}È_Ç>À{”h7?releaselog/3_5_1.html3.5.1Added an output buffer size parameter to the xGetTempname() method
    of the VFS layer.
”g7Sreleaselog/3_5_1.html3.5.1Add demonstration code showing how to build a VFS for a raw
    mass storage without a filesystem.
”f7qreleaselog/3_5_1.html3.5.1Make sure the query optimizer checks dependencies on all terms of
    a compound SELECT statement.  Ticket #2640.
f”e7releaselog/3_5_1.html3.5.1The CLI ignores whitespace (including comments) at the end of lines
1”d7‚+releaselog/3_5_1.html3.5.1The test_async.c drive now does full file locking and works correctly
    when used simultaneously by multiple processes on the same database.
0”c7‚)releaselog/3_5_1.html3.5.1Fix a bug in the handling of <a href="../rescode.html#full">SQLITE_FULL</a> errors that could lead
    to database corruption.  Ticket #2686.
‚@”b7        „Kreleaselog/3_5_1.html3.5.1<i><b>Nota Bene:</b> We are not using terms "alpha" or "beta" on this
    release because the code is stable and because if we use those terms,
    nobody will upgrade.  However, we still reserve the right to make
    incompatible changes to the new VFS interface in future releases.</i>H”a7[releaselog/3_5_2.html3.5.Added the ".timer" command to the CLI

G”`7Yreleaselog/3_5_2.html3.5.2Fix a race condition in test_async.c.
”_7yreleaselog/3_5_2.html3.5.2Virtual machine stores 64-bit integer and floating point constants
in binary instead of text for a performance boost.
a”^7releaselog/3_5_2.html3.5.2Added the experimental malloc-free memory allocator in mem3.c.
y”]7;releaselog/3_5_2.html3.5.2Bug fix: do not invoke the authorizer when reparsing the schema after
a schema change.
g”\7releaselog/3_5_2.html3.5.2The 3rd parameter of the built-in SUBSTR() function is now optional.
a”[7releaselog/3_5_2.html3.5.2Always open files using FILE_FLAG_RANDOM_ACCESS under Windows.
”Z7        yreleaselog/3_5_2.html3.5.2Dropped support for the <a href="../compile.html#omitfeatures">SQLITE_OMIT_MEMORY_ALLOCATION</a> compile-time
option.
5”Y7‚3releaselog/3_5_3.html3.5.3The DISTINCT keyword now will sometimes use an INDEX if an
appropriate index is available and the optimizer thinks its use
might be advantageous.

Q”X7‚kreleaselog/3_5_3.html3.5.3
FTS3 now uses the SQLite memory allocator exclusively.  The
FTS3 amalgamation can now be appended to the SQLite amalgamation to
generate a super-amalgamation containing both.
D”W7‚Qreleaselog/3_5_3.html3.5.3   <a href="../c3ref/step.html">sqlite3_step()</a> returns <a href="../rescode.html#misuse">SQLITE_MISUSE</a> instead of crashing when
called with a NULL parameter.
a”V7releaselog/3_5_3.html3.5.Fix multiple bugs that can occur following a malloc() failure.
|”U7Areleaselog/3_5_3.html3.5.3Modify the TCL interface to use <a href="../c3ref/prepare.html">sqlite3_prepare_v2()</a>.
N”T7greleaselog/3_5_3.html3.5.3Allow collating sequence names to be quoted.
y”S7;releaselog/3_5_3.html3.5.3On Win32, do not return an error when attempting to delete a file
that does not exist.
S”R7qreleaselog/3_5_3.html3.5.3Fixed the operator precedence for the ~ operator.
g”Q7releaselog/3_5_3.html3.5.3Fix a long-standing bug in RAISE(IGNORE) as used in BEFORE triggers.
”P7Kreleaselog/3_5_3.html3.5.3Fix a long-standing bug in INSERT INTO ... SELECT ... statements
where the SELECT is compound.
$”O7        ‚releaselog/3_5_3.html3.5.3Move website and documentation files out of the source tree into
a <a href="http://www.sqlite.org/docsrc/">separate CM system</a>.
I”N7]releaselog/3_5_4.html3.5.4     Other small bug fixes and optimizations.N”M7‚ereleaselog/3_5_4.html3.5.Relax the SQL statement length restriction in the CLI so that
the ".dump" output of databases with very large BLOBs and strings can
be played back to recreate the database.
˜*`›,«<
Á       
«Y·
u%€ùƒ&˜
•7]releaselog/3_4_1.html3.4.1Use the macro SQLITE_PRIVATE (defaulting to "static") on all
    internal functions in the amalgamation.Z”7releaselog/3_4_1.html3.4.1
Add the capability of "hidden" columns in virtual tables.s”~7/releaselog/3_4_1.html3.4.1   Allow the value -9223372036854775808 as an integer literal in SQL
    statements.”}7Oreleaselog/3_4_1.html3.4.Make sure the TCL language interface works correctly with 64-bit
    integers on 64-bit machines.!”|7‚releaselog/3_4_1.html3.4.1Fix a bug in the <a href="../optoverview.html#minmax">
    min()/max() optimization</a> when applied to
    descending indices.M”{7ereleaselog/3_4_1.html3.4.1Add FD_CLOEXEC to all open files under Unix.”z7qreleaselog/3_4_1.html3.4.1The <a href="../pragma.html#pragma_auto_vacuum">
    PRAGMA auto_vacuum=incremental</a> setting is now persistent.&”y7‚releaselog/3_4_1.html3.4.1Added <a href="../pragma.html#pragma_freelist_count">PRAGMA freelist_count</a>
    for determining the current size of the freelist.”x7‚releaselog/3_4_1.html3.4.1In the <a href="../tclsqlite.html">TCL language interface</a>,
   "@variable" instead of "$variable" always binds as a blob.%”w7‚releaselog/3_4_1.html3.4.1The expression "+column" is now considered the same as "column"
    when computing the collating sequence to use on the expression.‚”v7     ƒMreleaselog/3_4_1.html3.4.1Fix a bug in <a href="../lang_vacuum.html">VACUUM</a> that can lead to
    database corruptio if two
    processes are connected to the database at the same time and one
    VACUUMs then the other then modifies the database. ”u7‚        releaselog/3_4_2.html3.4.2Improvements to the amalgamation generator script so that all symbols
are prefixed with either SQLITE_PRIVATE or SQLITE_API.

\”t7releaselog/3_4_2.html3.4.2Improved error detection of misused aggregate functions.

”s7Oreleaselog/3_4_2.html3.4.2Work-around for 
<a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32575">GCC bug 32575</a>.

_”r7releaselog/3_4_2.html3.4.2Fix other minor problems with using small soft heap limits.

#”q7‚releaselog/3_4_2.html3.4.2Add the ability to run a full regression test with a small
<a href="../c3ref/soft_heap_limit.html">sqlite3_soft_heap_limit</a>.

‚#”p7        „releaselog/3_4_2.html3.4.2Fix a database corruption bug that might occur if a ROLLBACK command
is executed in <a href="../pragma.html#pragma_auto_vacuum">auto-vacuum mode</a>
and a very small <a href="../c3ref/soft_heap_limit.html">sqlite3_soft_heap_limit</a> is set. 
Ticket #2565.

x”o79releaselog/3_5_0.html3.5.0The same database connection may now be used simultaneously by
    separate threads.

l”n7!releaselog/3_5_0.html3.5.0Created a new mutex subsystem and made it replicable at
    compile-time.
~”m7Ereleaselog/3_5_0.html3.5.0Reimplemented the memory allocation subsystem and made it 
    replaceable at compile-time.
l”l7!releaselog/3_5_0.html3.5.0Added the <a href="../c3ref/open.html">sqlite3_open_v2()</a> interface.  
ƒA”k7†Kreleaselog/3_5_0.html3.5.0The <a href="../c3ref/release_memory.html">sqlite3_release_memory()</a>, <a href="../c3ref/soft_heap_limit.html">sqlite3_soft_heap_limit()</a>,
    and <a href="../c3ref/enable_shared_cache.html">sqlite3_enable_shared_cache()</a> interfaces now work cross all
    threads in the process, not just the single thread in which they
    are invoked.
    <font color="red">*** Potentially incompatible change ***</font>
F”j7        ‚Wreleaselog/3_5_0.html3.5.0Redesign the OS interface layer.  See
    <a href="../34to35.html">34to35.html</a> for details.
    <font color="red">*** Potentially incompatible change ***</font>
R”i7‚mreleaselog/3_5_1.html3.5.Sticky <a href="../rescode.html#full">SQLITE_FULL</a> or <a href="../rescode.html#ioerr">SQLITE_IOERR</a> errors in the pager are reset
    when a new transaction is started.


=o
¼J
‹
       k       G¬;ÜL§×GÈGðTº=z•7=releaselog/3_4_0.html3.4.0Fix the query optimizer to handle rowid comparisons to NULL
    correctly.  Ticket #2404•7ureleaselog/3_4_0.html3.4.0Fix the query optimizer to correctly handle constant expressions in 
    the ON clause of a LEFT JOIN.  Ticket #2403•7yreleaselog/3_4_0.html3.4.0Consider explicit collate clauses when matching WHERE constraints
    to indices in the query optimizer.  Ticket #2391T•7sreleaselog/3_4_0.html3.4.0Fix a bug in the handling of UTF16 codepoint 0xE000~•7Ereleaselog/3_4_0.html3.4.0Keep the full precision of integers (if possible) when casting to
    NUMERIC.  Ticket #2364|•7Areleaselog/3_4_0.html3.4.0When converting BLOB to TEXT, use the text encoding of the main database.
    Ticket #2349•7areleaselog/3_4_0.html3.4.0Fix the built-in printf logic so that it prints "NaN" not "Inf" for
    floating-point NaNs.  Ticket #2345L•7‚areleaselog/3_4_0.html3.4.0Make sure the <a href="../c3ref/mprintf.html">sqlite3_snprintf()</a>
    interface does not zero-terminate the buffer if the buffer size is
    less than 1.  Ticket #2341!•7‚releaselog/3_4_0.html3.4.0Fix an optimizer bug involving subqueries in a compound SELECT that has
    both an ORDER BY and a LIMIT clause.  Ticket #2339.•7areleaselog/3_4_0.html3.4.0Use memmove() instead of memcpy() when moving between memory regions
    that might overlap.  Ticket #2334\•7releaselog/3_4_0.html3.4.0
Internationalization of the TRIM() function.  Ticket #2323W•7‚wreleaselog/3_4_0.html3.4.0Document the hazards of type conversions in
    <a href="../c3ref/column_blob.html">sqlite3_column_blob()</a>
    and related APIs.  Fix unnecessary type conversions.  Ticket #2321.•
7mreleaselog/3_4_0.html3.4.0Fix the REPLACE() function so that it returns NULL if the second argument
    is an empty string.  Ticket #2324.•7wreleaselog/3_4_0.html3.4.0
In the Windows OS driver, reacquire a SHARED lock if an attempt to
    acquire an EXCLUSIVE lock fails.  Ticket #23545•7‚3releaselog/3_4_0.html3.4.0 Added support for
    <a href="http://www.icu-project.org/">International Components for Unicode (ICU)</a>
    to the full-text search extensions.
h•
7releaselog/3_4_0.html3.4.Removed all instances of sprintf() and strcpy() from the core library.•       7sreleaselog/3_4_0.html3.4.0Added the SQLITE_MIXED_ENDIAN_64BIT_FLOAT compile-time option to support
    ARM7 processors with goofy endianness.7Oreleaselog/3_4_0.html3.4.0Added support for <a href="../pragma.html#pragma_incremental_vacuum">
    Incremental Vacuum</a>.;•7‚?releaselog/3_4_0.html3.4.0Added the <a href="../c3ref/bind_blob.html">sqlite3_bind_zeroblob()</a> API
    and the <a href="../lang_expr.html#zeroblob">zeroblob()</a> SQL function.o•7'releaselog/3_4_0.html3.4.0Added support for <a href="../c3ref/blob_open.html">Incremental BLOB I/O</a>.‚B•7„Mreleaselog/3_4_0.html3.4.0Added explicit <a href="../limits.html">upper bounds</a> on the sizes and
    quantities of things SQLite can process.  This change might cause
    compatibility problems for
    applications that use SQLite in the extreme, which is why the current
    release is 3.4.0 instead of 3.3.18.‚•7ƒmreleaselog/3_4_0.html3.4.0Fix a bug that can lead to database corruption if autovacuum mode is
    on and a malloc() failure follows a CREATE TABLE or CREATE INDEX statement
    which itself follows a cache overflow inside a transaction.  See
    ticket #2418. 
    {•7    ƒAreleaselog/3_4_0.html3.4.0Fix a bug that can lead to database corruption if an <a href="../rescode.html#busy">SQLITE_BUSY</a> error
    occurs in the middle of an explicit transaction and that transaction
    is later committed.  Ticket #2409.
U•7ureleaselog/3_4_1.html3.4.1
Other minor bug fixes and documentation enhancements
•7creleaselog/3_4_1.html3.4.1Add pluggable tokenizers and <a href="http://www.icu-project.org/">ICU</a>
    tokenization support to FTS2
ىŊ
1¢âD

       r       (…°Oª*ÙN•/9creleaselog/3_3_14.html3.3.14     Removed the vestigal SQLITE_PROTOCOL error.}•.9?releaselog/3_3_14.html3.3.1Get the library working correctly when compiled 
    with GCC option "-fstrict-aliasing".!•-9‚releaselog/3_3_14.html3.3.14Add a makefile target "sqlite3.c" that builds an amalgamation containing
    the core SQLite library C code in a single file..•,9‚!releaselog/3_3_14.html3.3.14Use heap space instead of stack space for large buffers in the
    pager - useful on embedded platforms with  stack-space
    limitations.+•+9‚releaselog/3_3_14.html3.3.14Added support for exclusive access mode using
    <a href="../pragma.html#pragma_locking_mode">
    "PRAGMA locking_mode=EXCLUSIVE"</a>…Q•*9Šgreleaselog/3_3_14.html3.3.14Performance enhancements through reductions in disk I/O:
<ol type="a">
  <li>Do not read the last page of an overflow chain when
      deleting the row - just add that page to the freelist.</li>
  <li>Do not store pages being deleted in the 
      rollback journal.</li>
  <li>Do not read in the (meaningless) content of
      pages extracted from the freelist.</li>
  <li>Do not flush the page cache (and thus avoiding
      a cache refill) unless another process changes the underlying
      database file.</li>
  <li>Truncate rather than delete the rollback journal when committing
      a transaction in exclusive access mode, or when committing the TEMP
      database.</li>
</ol>‚•)9ƒSreleaselog/3_3_14.html3.3.14A new algorithm for statements of the form
    INSERT INTO <i>table1</i> SELECT * FROM <i>table2</i>
    is faster and reduces fragmentation.  VACUUM uses statements of
    this form and thus runs faster and defragments better.•(9mreleaselog/3_3_14.html3.3.14Added a new OS interface method for determining the sector size
    of underlying media:  sqlite3OsSectorSize().[•'9        ‚}releaselog/3_3_14.html3.3.14Fix a bug (ticket #2273)
    that could cause a segfault when the IN operator
    is used one term of a two-column index and the right-hand side of
    the IN operator contains a NULL.h•&9releaselog/3_3_15.html3.3.15Many improvements to the test suite.  Test coverage now exceeded 98%•%9oreleaselog/3_3_15.html3.3.15Fix an obscure and relatively harmless problem that might have caused
    a resource leak following an I/O error.•$9areleaselog/3_3_15.html3.3.15The FOR EACH STATEMENT clause on a trigger now causes a syntax
    error.  It used to be silently ignored.#•#9‚releaselog/3_3_15.html3.3.15Fix a bug that caused an extra NULL row to be returned when
    a descending query was interrupted by a change to the database.•"9     {releaselog/3_3_15.html3.3.15Fix a bug introduced in 3.3.14 that caused a rollback of
    CREATE TEMP TABLE to leave the database connection wedged.9•!99releaselog/3_3_16.html3.3.16Documentation updates.• 9Ereleaselog/3_3_16.html3.3.16Fix a potential segfault when destroying locks on WinCE in
    a multi-threaded environment.•9[releaselog/3_3_16.html3.3.16Fix problems with the handling of ORDER BY expressions on
    compound SELECT statements in subqueries.a•9ƒreleaselog/3_3_16.html3.3.16Reinstate performance improvements that were added in
    <a href="../releaselog/3_3_14.html">Version 3.3.14</a>
    but regressed in <a href="../releaselog/3_3_15.html">Version 3.3.15</a>.q•9     )releaselog/3_3_16.html3.3.16Fix a bug that caused VACUUM to fail if NULLs appeared in a
    UNIQUE column.8•97releaselog/3_3_17.html3.3.17Other minor bug fixes@•9   ‚Greleaselog/3_3_17.html3.3.17When the "write_version" value of the database header is larger than
    what the library understands, make the database read-only instead of
    unreadable.t•71releaselog/3_4_0.html3.4.0Fix many potential segfaults that could be caused by malicious SQL
    statements.
ÞCÙ
²ŽÊ&
Ê

       ¬       ¨ñèh¾_ü~“X²FÂ5ÞT•J7sreleaselog/3_3_9.html3.3.9Support for non-ASCII characters in win95 filenames   •I7[releaselog/3_3_9.html3.3.9Change the table_info pragma so that it returns NULL for the default
value if there is no default value•H7Ireleaselog/3_3_9.html3.3.9Fixed the ".dump" command in the command-line shell to show
indices, triggers and views again.i•G7releaselog/3_3_9.html3.3.9Added the <a href="../c3ref/prepare.html">sqlite3_prepare_v2()</a>
API."•F7    ‚releaselog/3_3_9.html3.3.9Fix bugs in pager.c that could lead to database corruption if two
processes both try to recover a hot journal at the same instant8•E97releaselog/3_3_10.html3.3.10Documentation updatesg•D9ƒreleaselog/3_3_10.html3.3.10The
<a href="../pragma.html#pragma_user_version">user_version</a> and
<a href="../pragma.html#pragma_schema_version">schema_version</a> pragmas 
correctly set their column names in the result set{•C9;releaselog/3_3_10.html3.3.10Work around a win2k problem so that SQLite can use single-character
database file names`•B9releaselog/3_3_10.html3.3.10Enhance the Windows OS layer to provide detailed error codes\•A9releaselog/3_3_10.html3.3.10Fix 1-second round-off errors in the 
strftime() function&•@9     ‚releaselog/3_3_10.html3.3.10Fix bugs in the implementation of the new 
<a href="../c3ref/prepare.html">sqlite3_prepare_v2()</a> API
that can lead to segfaults.}•?9?releaselog/3_3_11.html3.3.11Make AreFileApisANSI() a no-op macro in WinCE since WinCE does not
support this function.‚•>9ƒOreleaselog/3_3_11.html3.3.11Fix a bug in the IS NULL optimization that was added in version 3.3.9 -
the bug was causing incorrect results on certain LEFT JOINs that included
in the WHERE clause an IS NULL constraint for the right table of the
LEFT JOIN.3•=9      ‚-releaselog/3_3_11.html3.3.11Fix another bug in the implementation of the new 
<a href="../c3ref/prepare.html">sqlite3_prepare_v2()</a> API.
We'll get it right eventually...d•<9
releaselog/3_3_12.html3.3.12Minor syntactic changes to support a wider variety of compilers.•;9wreleaselog/3_3_12.html3.3.12Limit the amount of output that
<a href="../pragma.html#pragma_integrity_check">PRAGMA integrity_check</a>
generates.`•:9releaselog/3_3_12.html3.3.12Fix an assertion fault that occurred on deeply nested views.o•99    %releaselog/3_3_12.html3.3.12Fix another bug in the IS NULL optimization that was added in
version 3.3.9.F•89Sreleaselog/3_3_13.html3.3.1Bug fixes in fts1 and fts2 modules.Y•79yreleaselog/3_3_13.html3.3.13Fixed a bug in the "copy" method of the TCL interface. •69‚releaselog/3_3_13.html3.3.13Fix a bug in the ORDER BY clause optimizer for joins where the
left-most table in the join is constrained by a UNIQUE index.@•59‚Ereleaselog/3_3_13.html3.3.13Fix a problem where
<a href="../pragma.html#pragma_count_changes">PRAGMA count_changes</a> was
causing incorrect results for updates on tables with triggers‚ •49„releaselog/3_3_13.html3.3.13Added two new experimental functions:
<a href="../lang_expr.html#randomblobFunc">randomBlob()</a> and
<a href="../lang_expr.html#hexFunc">hex()</a>.
Their intended use is to facilitate generating 
<a href="http://en.wikipedia.org/wiki/UUID">UUIDs</a>.
Z•39{releaselog/3_3_13.html3.3.13Allow up to 64 tables in a join - the old limit was 32.F•29‚Qreleaselog/3_3_13.html3.3.13Add the COLLATE operator used to explicitly set the collating sequence
used by an expression.  This feature is considered experimental pending
additional testing.g•19      releaselog/3_3_13.html3.3.13Add a "fragmentation" measurement in the output of sqlite3_analyzer.9•09‚7releaselog/3_3_14.html3.3.14
Improvements to test coverage, other minor bugs fixed,
    memory leaks plugged,
    code refactored and/or recommended in places for easier reading.
%Â
È
a
x6Í;
Ä
h
               Ê€&•1èš]ÊgÙwÏ€Â8Âs•o7/releaselog/3_3_5.html3.3.5The sqlite3_create_collation() function
    honors the SQLITE_UTF16_ALIGNED flag.•n7Ureleaselog/3_3_5.html3.3.5Choose the column names in a compound query from the left-most SELECT
    instead of the right-most.X•m7{releaselog/3_3_5.html3.3.5The SUM() function throws an error on integer overflow.`•l7        releaselog/3_3_5.html3.3.5CHECK constraints use conflict resolution algorithms correctly.L•k7creleaselog/3_3_6.html3.3.6Fix type coercion rules for the IN operatorM•j7ereleaselog/3_3_6.html3.3.6
Improved syntax error messages in the parserU•i7ureleaselog/3_3_6.html3.3.6 Correctly handle NULL filenames in ATTACH and DETACH_•h7releaselog/3_3_6.html3.3.Bug fixes and performance enhancements in the query optimizer@•g7Kreleaselog/3_3_6.html3.3.6LIMIT 0 now works on subqueriesH•f7[releaselog/3_3_6.html3.3.6Enhanced output from EXPLAIN QUERY PLAN`•e7     releaselog/3_3_6.html3.3.6Correct column meta-information returned for aggregate queries6•d77releaselog/3_3_6.html3.3.6Added driver for OS/2W•c7yreleaselog/3_3_6.html3.3.6Fix an obscure segfault in UTF-8 to UTF-16 conversions:•b7?releaselog/3_3_6.html3.3.6Faster :memory: databasesK•a7       creleaselog/3_3_6.html3.3.6Plays better with virus scanners on WindowsF•`7Wreleaselog/3_3_7.html3.3.7The default file format is now 1.  

a•_7releaselog/3_3_7.html3.3.7Added the <a href="../lang_expr.html#match">MATCH</a> operator.
•^7creleaselog/3_3_7.html3.3.7The 
<a href="../c3ref/interrupt.html">sqlite3_interrupt()</a>
routine can be called for a different threadW•]7yreleaselog/3_3_7.html3.3.7Added support for dynamically loaded extensions (beta)G•\7   [releaselog/3_3_7.html3.3.7Added support for virtual tables (beta)8•[7;releaselog/3_3_8.html3.3.Various minor bug fixesR•Z7oreleaselog/3_3_8.html3.3.8Added experimental API:  sqlite3_auto_extension()y•Y7;releaselog/3_3_8.html3.3.8Enhance sqlite3_set_authorizer() to provide notification of calls to
    SQL functions.\•X7releaselog/3_3_8.html3.3.8Fix the regression test suite so that it works with Tcl8.5X•W7{releaselog/3_3_8.html3.3.8Added support for IF EXISTS on CREATE/DROP TRIGGER/VIEWu•V73releaselog/3_3_8.html3.3.8Introduce extended error codes and add error codes for various
kinds of I/O errors.]•U7releaselog/3_3_8.html3.3.8Added Mac OS X locking patches (beta - disabled by default)Y•T7     releaselog/3_3_8.html3.3.8Support for full text search using the FTS1 module (beta)t•S71releaselog/3_3_9.html3.3.9The prefix on temporary filenames on Windows is changed from "sqlite"
to "etilqs".•R7ereleaselog/3_3_9.html3.3.9
VACUUM uses a temporary file in the official TEMP folder, not in the
same directory as the original databasef•Q7releaselog/3_3_9.html3.3.9Use sqlite3_mprintf() instead of strdup() to avoid libc dependencies?•P7Ireleaselog/3_3_9.html3.3.9Experimental FTS2 module added•O7ereleaselog/3_3_9.html3.3.9
Make CSV (comma separate value) output from the command-line shell
more closely aligned to accepted practiceT•N7sreleaselog/3_3_9.html3.3.9    Added the ".bail" command to the command-line shelld•M7releaselog/3_3_9.html3.3.Allow constraint names on the DEFAULT clause in a table definitionK•L7areleaselog/3_3_9.html3.3.9Extension loading supported added to WinCEƒf•K7‡releaselog/3_3_9.html3.3.9Query optimizer enhancements:
<ol type="a">
  <li>Optimizer does a better job of using indices to satisfy ORDER BY
  clauses that sort on the integer primary key</li>
  <li>Use an index to satisfy an IS NULL operator in the WHERE clause</li>
  <li>Fix a bug that was causing the optimizer to miss an OR optimization
  opportunity</li>
  <li>The optimizer has more freedom to reorder tables in the FROM clause
  even in there are LEFT joins.</li>
</ol>

$~9Ãk

%°)Ú›
r
       Á       Ÿçr®9Í>
¦vƒ=æ˜KØF–7‚Ureleaselog/3_3_0.html3.3.0Optional READ UNCOMMITTED isolation (instead of the default
isolation level of SERIALIZABLE) and table level locking when
database connections share a common cache.p–7)releaselog/3_3_0.html3.3.0
Database cache can be optionally shared between connections
in the same threadJ–7_releaselog/3_3_0.html3.3.0   Improved response to out-of-memory errorsK–7areleaselog/3_3_0.html3.3."exists" method added to the TCL interfaceT–7sreleaselog/3_3_0.html3.3.0Added a virtual function layer for the OS interfaceC–7Qreleaselog/3_3_0.html3.3.0Separate INTEGER and REAL affinity~–
7Ereleaselog/3_3_0.html3.3.0More aggressive <a href="../compile.html#omit_floating_point">SQLITE_OMIT_FLOATING_POINT</a>o–7'releaselog/3_3_0.html3.3.0More efficient encoding of boolean values resulting in smaller database
files-–7%releaselog/3_3_0.html3.3.0DESC indicesa–
7releaselog/3_3_0.html3.3.0IF EXISTS and IF NOT EXISTS clauses on CREATE/DROP TABLE/INDEX.1–     7    /releaselog/3_3_0.html3.3.0CHECK constraints7_releaselog/3_3_1.html3.3.1Database connections can now be used by multiple threads, not just
the thread in which they were created.3–71releaselog/3_3_1.html3.3.1Speed improvements3–7     3releaselog/3_3_1.html3.3.1Countless bug fixesr–7-releaselog/3_3_2.html3.3.2Discontinue the use of thread-specific data for out-of-memory
exception handlingc–7releaselog/3_3_2.html3.3.2Changes to the OS-layer interface: mutexes must now be recursive.[–7 releaselog/3_3_2.html3.3.2Bug fixes and speed improvements.  Improved test coverage.r–7-releaselog/3_3_3.html3.3.3Other minor bug fixes in preparation for the first stable release
of version 3.34–7‚1releaselog/3_3_3.html3.3.3After any changes to the TEMP database schema, all prepared statements
are invalidated and must be recreated using a new call to
sqlite3_prepare()e–7releaselog/3_3_3.html3.3.3Authorizer callback now notified of ALTER TABLE ADD COLUMN commands6•7       ‚7releaselog/3_3_3.html3.3.3Removed support for an ON CONFLICT clause on CREATE INDEX - it never
worked correctly so this should not present any backward compatibility
problems.>•~7Greleaselog/3_3_4.html3.3.4Other miscellaneous bug fixesm•}7#releaselog/3_3_4.html3.3.4Host parameter names can begin with '@' for compatibility with SQL Server.
•|7releaselog/3_3_4.html3.3.4The SUM function detects integer overflow and converts to accumulating
an approximate result using floating point numbers•{7Ureleaselog/3_3_4.html3.3.4Fix an optimizer bug that could have caused some unusual LEFT OUTER JOINs
to give incorrect results.<•z7Creleaselog/3_3_4.html3.3.4Added the fullfsync pragma.L•y7creleaselog/3_3_4.html3.3.4Fix an alignment problem on 64-bit machines•x7        Qreleaselog/3_3_4.html3.3.4Fix a blunder in the Unix mutex implementation that can lead to
deadlock on multithreaded systems.r•w7-releaselog/3_3_5.html3.3.5Various minor bug and documentation typo fixes and
    performance enhancements.Y•v7}releaselog/3_3_5.html3.3.5Skip over leading spaces in text to numeric conversions.•u7Ureleaselog/3_3_5.html3.3.5
Allow WHERE clause terms on the left table of a LEFT OUTER JOIN to
    contain aggregate subqueries.]•t7releaselog/3_3_5.html3.3.5   Change the round() function to return REAL instead of TEXT.U•s7ureleaselog/3_3_5.html3.3.Parser detects and reports automaton stack overflow.s•r7/releaselog/3_3_5.html3.3.5The random() function provides 64 bits of randomness instead of
    only 32 bits.B•q7Oreleaselog/3_3_5.html3.3.5Detect integer overflow in abs().•p7Greleaselog/3_3_5.html3.3.5SQLITE_SECURE_DELETE compile-time option causes deletes to overwrite
    old data with zeros.
 Þ}
ù
¸
GÓ¾n$
ª
*       ³       I       'ÈtØp*¹bìGØGÝcP–37‚ireleaselog/3_2_3.html3.2.3
The IN operator is now a candidate for optimization even if the left-hand
side is not the left-most term of the index.  Multiple IN operators can be
used with the same index.w–277releaselog/3_2_3.html3.2.3   The order of tables in a join is adjusted automatically to make
better use of indicesg–17releaselog/3_2_3.html3.2.Rework the optimizer so that it is able to make better use of indices
–07creleaselog/3_2_3.html3.2.3The right-hand side of the IN operator can now be a list of expressions
instead of just a list of constantsl–/7!releaselog/3_2_3.html3.2.3Remove the limit (formerly 100) on the number of terms in the
WHERE clause!–.7‚releaselog/3_2_3.html3.2.3Added the ANALYZE command for gathering statistics on indices and
using those statistics when picking an index in the optimizers–-7/releaselog/3_2_3.html3.2.3Allow the DEFAULT value of a column to call functions that have constant
operandsT–,7sreleaselog/3_2_3.html3.2.3Added the "transaction" method to the Tcl interfacen–+7%releaselog/3_2_3.html3.2.3Tcl interface allows BLOB values to be transferred to user-defined
functionsC–*7        Sreleaselog/3_2_3.html3.2.3Added support for the CAST operatore–)7releaselog/3_2_4.html3.2.4Allow floating point literals to begin or end with a decimal point.–(7  {releaselog/3_2_4.html3.2.4Fix a bug introduced in the previous release
that can cause a segfault while generating code
for complex WHERE clauses."–'7‚
releaselog/3_2_5.html3.2.5The PRAGMA synchronous=off statement now disables syncing of the
master journal file in addition to the normal rollback journals*–&7‚releaselog/3_2_5.html3.2.5Fix a code generator bug that occurs when the left-hand side of an IN
operator is constant and the right-hand side is a SELECT statement\–%7releaselog/3_2_5.html3.2.5Fix the --enable-threadsafe option on the configure scriptf–$7releaselog/3_2_5.html3.2.5Change the makefile so that it no longer requires GNUmake extensionst–#7       3releaselog/3_2_5.html3.2.5Fix a bug effecting DELETE and UPDATE statements that changed
more than 40960 rows.?–"7Ireleaselog/3_2_6.html3.2.6        Use the unicode API in Windowsg–!7releaselog/3_2_6.html3.2.Added the experimental and undocumented EXPLAIN QUERY PLAN capabilityt– 71releaselog/3_2_6.html3.2.6Use of the CROSS keyword in a join turns off the table reordering
    optimization}–7Creleaselog/3_2_6.html3.2.6Use fdatasync() instead of fsync() where possible in order to speed
    up commits slightlyw–77releaselog/3_2_6.html3.2.6Change the way SUM() handles NULL values in order to comply with
    the SQL standardG–7Yreleaselog/3_2_6.html3.2.6Added support for COUNT(DISTINCT expr)M–7ereleaselog/3_2_6.html3.2.6ORDER BY and GROUP BY now use bounded memory]–7releaselog/3_2_6.html3.2.6LIKE optimization now works for columns with COLLATE NOCASE1–7  ‚-releaselog/3_2_6.html3.2.6Fix a bug that can cause database corruption if a VACUUM (or
    autovacuum) fails and is rolled back on a database that is
    larger than 1GiBq–7+releaselog/3_2_7.html3.2.7Correctly compute a LEFT OUTER JOINs that is constrained on the
left table onlyn–7%releaselog/3_2_7.html3.2.7Fix uninitialized variables causing malfunctions for various obscure
queries>–7Greleaselog/3_2_7.html3.2.7Now compiles on MSVC++6 again–7Ireleaselog/3_2_7.html3.2.7Now compiles on Solaris and OpenBSD and other Unix variants
that lack the fdatasync() function^–7       releaselog/3_2_7.html3.2.7GROUP BY now considers NULLs to be equal again, as it should
‚–7        „releaselog/3_2_8.html3.2.8Fix an obscure bug that can cause database corruption under the
following unusual circumstances: A large INSERT or UPDATE statement which 
is part of an even larger transaction fails due to a uniqueness constraint
but the containing transaction commits.
$cŠåN
æ
¬
o
+á¼d
«
r
&       ¿              
¨   [áyûÀo‡à¶cP–W7kreleaselog/3_1_2.html3.1.2Fix VACUUM so that it works with AUTOINCREMENT.J–V7_releaselog/3_1_2.html3.1.2Allow "?" parameters in the LIMIT clause.Y–U7   ‚}releaselog/3_1_2.html3.1.2Fix a bug that can lead to database corruption if there are two
open connections to the same database and one connection does a VACUUM
and the second makes some change to the database.6–T77releaselog/3_1_3.html3.1.3Documentation updatesk–S7releaselog/3_1_3.html3.1.3Add forward compatibility to the future version 3.2 database file
format.–R7 Ureleaselog/3_1_3.html3.1.3Fix a problem with VACUUM on databases from which tables containing
AUTOINCREMENT have been dropped.\–Q7releaselog/3_1_4.html3.1.Windows DLL exports symbols Tclsqlite_Init and Sqlite_InitN–P7greleaselog/3_1_4.html3.1.4Remove the use of strcasecmp() from the shell8–O7;releaselog/3_1_4.html3.1.4Updates to the man page{–N7?releaselog/3_1_4.html3.1.4New <a href="../compile.html#omitfeatures">SQLITE_OMIT_...</a> compile-time options addede–M7releaselog/3_1_4.html3.1.4Fix a bug in WHERE clauses of the form (rowid<'2')</li>
</'2')</li>w–L77releaselog/3_1_4.html3.1.4Add additional forward compatibility to the future version 3.2 database 
file format.*–K7‚releaselog/3_1_4.html3.1.4The F_FULLSYNC ioctl (currently only supported on Mac OS X) is disabled
if the synchronous pragma is set to something other than "full".~–J7        ƒGreleaselog/3_1_4.html3.1.4Fix a bug in autovacuum that could cause database corruption if
a CREATE UNIQUE INDEX fails because of a constraint violation.
This problem only occurs if the new autovacuum feature introduced in
version 3.1 is turned on.–I7       }releaselog/3_1_5.html3.1.5The ioctl on Mac OS X to control syncing to disk is F_FULLFSYNC,
    not F_FULLSYNC.  The previous release had it wrong._–H7releaselog/3_1_6.html3.1.6Fix memory leaks that used to occur after a malloc() failure.–G7ereleaselog/3_1_6.html3.1.6sqlite3_step() is now much more likely to invoke the busy handler
    and less likely to return SQLITE_BUSY.–F7      greleaselog/3_1_6.html3.1.6Fix a bug that could cause database corruption when inserting
    record into tables with around 125 columns.N–E7greleaselog/3_2_0.html3.2.0Numerous bug fixes and documentation updates.=–D7Ereleaselog/3_2_0.html3.2.0Improved support for Cygwin.d–C7releaselog/3_2_0.html3.2.0Added support for the "T" separator in ISO-8601 date/time strings.I–B7  _releaselog/3_2_0.html3.2.0Added support for ALTER TABLE ADD COLUMN.6–A77releaselog/3_2_1.html3.2.1Documentation updates]–@7    releaselog/3_2_1.html3.2.1Fix a memory allocation error in the new ADD COLUMN comment.V–?7wreleaselog/3_2_2.html3.2.2Many, many minor bug fixes and documentation updates.U–>7ureleaselog/3_2_2.html3.2.2Fix byte alignment problems on 64-bit architectures.U–=7ureleaselog/3_2_2.html3.2.2Speed improvements and library footprint reductions.I–<7‚[releaselog/3_2_2.html3.2.2Added a REGEXP operator to the parser.  There is no function to back
up this operator in the standard build but users can add their own using
sqlite3_create_function()G–;7Yreleaselog/3_2_2.html3.2.2Added the sqlite3_get_autocommit() APIA–:7      Oreleaselog/3_2_2.html3.2.2Added the sqlite3_db_handle() API:–97?releaselog/3_2_3.html3.2.3Dozens of minor bug fixes7–879releaselog/3_2_3.html3.2.3Improved test coveragee–77releaselog/3_2_3.html3.2.3Added support for grave-accent quoting for compatibility with MySQL–67oreleaselog/3_2_3.html3.2.3
Use indices to help with GLOB expressions and LIKE expressions too
when the case_sensitive_like pragma is enabled!–57‚releaselog/3_2_3.html3.2.3Added the "case_sensitive_like" pragma and the SQLITE_CASE_SENSITIVE_LIKE
compile-time option to set its default value to "on".s–47/releaselog/3_2_3.html3.2.3WHERE clause expressions using BETWEEN and OR are now candidates
for optimization
([–6ß~
ô
¸
}
"ÚŽ=ç
¾
.       ñ       /®D¨!bÅtÐR¾mƒ¬[N–7 ireleaselog/3_0_5.html3.0.5Support for ":AAA" style bind parameter names.T–~7sreleaselog/3_0_6.html3.0.6Miscellaneous code size optimizations and bug fixes}–}7Creleaselog/3_0_6.html3.0.6Combine the implementations of LIKE and GLOB into a single
    pattern-matching subroutine.–|7_releaselog/3_0_6.html3.0.6The sqlite3_step() interface returns SQLITE_BUSY if it is unable
    to commit a change because of a lockX–{7 }releaselog/3_0_6.html3.0.6Better detection and handling of corrupt database files.N–z7greleaselog/3_0_7.html3.0.Makefile updates and miscellaneous bug fixes.–y7ireleaselog/3_0_7.html3.0.7The sqlite3_trace() callbacks occur before each statement
    is executed, not when the statement is compiled.{–x7?releaselog/3_0_7.html3.0.7Removed encode.c file (containing unused routines) from the 
    version 3.0 source tree.F–w7Wreleaselog/3_0_7.html3.0.7Fix problems found on 64-bit systems.X–v7{releaselog/3_0_7.html3.0.7Add support for wildcard parameters of the form: "?nnn"N–u7greleaselog/3_0_7.html3.0.7New interface: sqlite3_bind_parameter_index()–t7{releaselog/3_0_7.html3.0.7Fixed naming conflicts so that versions 2.8 and 3.0 can be
    linked and used together in the same ANSI-C source file.;–s7    ‚Areleaselog/3_0_7.html3.0.7The BTree module allocates large buffers using malloc() instead of
    off of the stack, in order to play better on machines with limited
    stack space.–r7Oreleaselog/3_0_8.html3.0.8
Numerous code optimizations, specially optimizations designed to
make the code footprint smaller.Z–q7releaselog/3_0_8.html3.0.8     Convert array constants in the code to have type "const".<–p7Creleaselog/3_0_8.html3.0.Fix typos in documentation.g–o7releaselog/3_0_8.html3.0.8The "csv" mode option in the shell puts strings inside double-quotes.~–n7Ereleaselog/3_0_8.html3.0.8Fix the ".import" command of the shell so that it ignores \r
characters at the end of lines.W–m7yreleaselog/3_0_8.html3.0.8Fix a byte alignment problem on 64-bit Sparc machines.I–l7]releaselog/3_0_8.html3.0.8Fix portability problems for MinGW/MSYS."–k7releaselog/3_0_8.html3.0.8
–j7greleaselog/3_0_8.html3.0.8Allow new user-defined functions to be created when there are
already one or more precompiled SQL statements.a–i7  
releaselog/3_0_8.html3.0.8Add support for DEFERRED, IMMEDIATE, and EXCLUSIVE transactions.:–h7?releaselog/3_1_0.html3.1.0Many nuisance bugs fixed.–g7areleaselog/3_1_0.html3.1.0
The engine no longer consults the main table if it can get
    all the information it needs from an index.?–f7Ireleaselog/3_1_0.html3.1.0      The REINDEX command was added. –e7[releaselog/3_1_0.html3.1.Many SQLITE_OMIT_ macros inserts to omit features at compile-time
    and reduce the library footprint.W–d7yreleaselog/3_1_0.html3.1.0AUTOINCREMENT keyword supported on INTEGER PRIMARY KEYS–c7qreleaselog/3_1_0.html3.1.0Support for ALTER TABLE ... RENAME TABLE ... addedN–b7greleaselog/3_1_0.html3.1.0Added the ESCAPE clause on the LIKE operator.I–a7]releaselog/3_1_0.html3.1.0Support for correlated subqueries added.E–`7Ureleaselog/3_1_0.html3.1.0Support for the EXISTS clause added.X–_7{releaselog/3_1_0.html3.1.0CURRENT_TIME, CURRENT_DATE, and CURRENT_TIMESTAMP added8–^7   =releaselog/3_1_0.html3.1.0Autovacuum support added9–]7=releaselog/3_1_1.html3.1.1Numerous minor bug fixes–\7Ureleaselog/3_1_1.html3.1.1ATTACH and DETACH as well as some other operations cause existing
    prepared statements to expire.^–[7       releaselog/3_1_1.html3.1.1Automatic caching of prepared statements in the TCL interfaceT–Z7sreleaselog/3_1_2.html3.1.2Other minor bug fixes and performance enhancements.]–Y7releaselog/3_1_2.html3.1.2Add a numeric version number to the sqlite3.h include file.g–X7releaselog/3_1_2.html3.1.2Fix a race condition in AUTOVACUUM that can lead to corrupt databases
-¦/´P
±
¼R¯
Ò
˜
N       Þ       Ž       ˆ(ï¥f5-S—7qreleaselog/3_0_0.html3.0.0     <a href="../version3.html">More information</a>.

/—7)releaselog/3_0_0.html3.0.64-bit rowids..—7'releaselog/3_0_0.html3.0.0BLOB support.<—7Creleaselog/3_0_0.html3.0.0Remove cruft from the APIs.G—7Yreleaselog/3_0_0.html3.0.0Atomic commits for ATTACHed databases.6—77releaselog/3_0_0.html3.0.0Improved concurrency.]—7releaselog/3_0_0.html3.0.0New file format that is 25% to 35% smaller for typical use.—7Sreleaselog/3_0_0.html3.0.0Support for internationalization including UTF-8, UTF-16, and
    user defined collating sequences.|—7    Creleaselog/3_0_0.html3.0.0<font color="red"><b>
    *** Alpha Release - Research And Testing Use Only ***</b></font>
3—71releaselog/3_0_1.html3.0.1Lots of bug fixes.|—7   Creleaselog/3_0_1.html3.0.1<font color="red"><b>
    *** Alpha Release - Research And Testing Use Only ***</b></font>
F—7 Yreleaselog/3_0_2.html3.0.2The first beta release for SQLite 3.0.M—7ereleaselog/3_0_3.html3.0.3Various bug fixes and documentation updates.m—7#releaselog/3_0_3.html3.0.3Add support for "PRAGMA page_size" to adjust the page size of
the database.G—
7    [releaselog/3_0_3.html3.0.3The second beta release for SQLite 3.0.7—79releaselog/3_0_4.html3.0.4Other minor bug fixes.<—7Creleaselog/3_0_4.html3.0.4Library size optimizations.—
7}releaselog/3_0_4.html3.0.4Fix a bug that could cause index corruption when an attempt to
    delete rows of a table is blocked by a pending query.U—     7ureleaselog/3_0_4.html3.0.4Add the ".import" command to the command-line shell.H7[releaselog/3_0_4.html3.0.4Fix a bug in VACUUM and UNIQUE indices.g—7   releaselog/3_0_4.html3.0.4CREATE TABLE and DROP TABLE now work correctly as prepared statements.D—7Sreleaselog/3_0_5.html3.0.Various bug fixes and optimizations*—7‚releaselog/3_0_5.html3.0.5A compile-time option (SQLITE_BUSY_RESERVED_LOCK) causes the busy
    handler to be called when there is contention for a RESERVED lock.—7releaselog/3_0_5.html3.0.5Add the ability to specify an alternative temporary file directory
    using the "sqlite_temp_directory" global variable.a—7releaselog/3_0_5.html3.0.5The database for TEMP tables is not created until it is needed.x—79releaselog/3_0_5.html3.0.5The TCL bindings transfer data without necessarily doing a conversion
    to a string.t—71releaselog/3_0_5.html3.0.5Support for TCL variable names embedded in SQL statements in the
    TCL bindings.W—7yreleaselog/3_0_5.html3.0.5Added the new sqlite3_bind_parameter_name() interface.
_Ç÷îåÜÓÊÁ¸¯¦”‹‚ypg^ULC:1(
ûòéà×Îż³ª¡˜†}tkbYPG>5,#
ÿ
ö
í
ä
Û
Ò
É
À
·
®
¥
œ
“
Š

x
o
f
]
T
K
B
9
0
'



úñèßÖÍÄ»²© —Ž…|sjaXOF=4+"þõìãÚÑÈ¿¶-¤›’‰ukaWMC9/%
ý
ó
é
ß
Õ
Ë
Á
·
-
£
™

…
{
q
g
]
S
I
?
5
+
!


       ù       ï       å       Û       Ñ       Ç       ½       ³       ©       Ÿ       •       ‹              w       m       c       Y       O       E       ;       1       '                            ûñçÝÓÉ¿µ«¡—ƒyoe[QG=3)÷íãÙÏÅ»±§“‰ukaWMC9/%ýóéßÕËÁ·-£™…{qg]SI?5+!
ùïåÛÑǽ³©Ÿ•Š€vlbXND:0&þôêàÖ̸®¤š†|rh^TJ?5+!
ùïåÛÑÇ‚_‚^‚]‚\'‚["‚Z‚Y‚X‚W‚V‚UH‚T‚SE‚R&‚Q#‚P ‚O‚N‚M‚L‚K‚J‚I
‚H‚G‚F‚E
‚D‚C*‚B‚A‚@‚?
‚>‚=‚<‚;'‚:"‚9‚8‚7‚6‚5‚4H‚3‚2E‚1&‚0#‚/ ‚.‚-‚,‚+‚*‚)‚(  ‚'
‚&‚%‚$ ‚#/‚"‚!
‚ ‚‚‚‚‚-‚‚‚‚;‚‚)‚‚‚‚ ‚      ‚‚#‚
‚‚‚
-‚       ‚‚;‚‚)‚‚‚‚    &~+}   |       {z#yxwv-utsr;qp)onmlk!j4i9hgfe'dcba` _^]\[!Z4Y9XWVU'TSRQP0ON MLKJI!H4G9FEDC'BA@?>-=<0;: 98765!4439210/'.-,+*0)(-'&0%$ #"! !49'0-0
 
       !49'~
}|{0zyxw
vut
srqpon.m
lkj0ihgf
edcba
`_^]\[.Z
YXW0VUTS
RQP
ONMLK
JIHGFE.D
CBA0@?>=
<;:98765
43210
/.-,+*.)
('&0%$#"
! 
41q*

        
41q*
T´öìâØÎĺ°¦œ’ˆ~tj`VLA7-#ûñçÝÓÉ¿µ«¡—ƒyoe[QG=2(

ö
ì
â
Ø
Î
Ä
º
°
¦
œ
’
ˆ
}
s
i
_
U
K
A
7
-
#


ûðæÜÒÈ¾´ª –Œ‚xndZPF<2(
öìâØÎĺ°¦œ’ˆ~tj`VLB8.$
ü
ò
è
Þ
Ô
Ê
À
¶
¬
¢
˜
Ž
„
z
p
f
\
R
H
>
4
*
 


       ø       î       ä       Ú       Ð       Æ       ¼       ²       ¨       ž       ”       Š       €       v       l       b       X       N       D       :       0       &                   úðæÜÒȾ´ª –Œ‚xndZPF<2(
öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* øîäÚÐƼ²¨ž”Š€vlbXND:0&þôêàÖ̸®¤š†|rh^TJ@6,"úðæÜÒȾ´…3…2…1
…0…/….!…-…,…+…*…)…(#…'…&
…%…$…#…"…!
… s…O……     ………………#…………#……
…………
…
…s…
O…         ……………………„#„~„}„|„{#„z„y
„x„w„v„u„t
„ss„rO„q„p „o„n„m„l„k„j&„i„h„gC„f„e„d„ce„b„a5„`„_„^"„]„\„[+„Z„Y„X%„W  „V)„U„T„S„R„Q„P„O„N#„M       „L„K„J„I„H       „G„F„E
„D„C„B„A„@„?„>#„=     „<„;„:„9„8       „7„6„55„4.„3
„2„1„0„/„.„-„,„+
„*
„)
„(„'
„&„%„$„#„"@„!5„ .„
„„„„„„„„
„
„
„„
„„„„„A„
„„„
1„       „„
„„„„-„„Aƒƒ~ƒ}ƒ|1ƒ{ƒzƒyƒx
ƒwƒvƒuƒtƒs-ƒrƒqAƒpƒoƒnƒm1ƒlƒkƒjƒi
ƒhƒgƒfƒeƒdƒc-ƒbƒaAƒ`ƒ_ƒ^ƒ]1ƒ\ƒ[ƒZƒY
ƒXƒWƒV/ƒUFƒT8ƒSƒR
ƒQƒP
ƒOƒNƒMƒLƒKƒJƒIƒHƒGƒFdƒEqƒDƒC ƒBƒAƒ@ƒ?ƒ>ƒ=ƒ<ƒ;ƒ:ƒ9ƒ8ƒ7ƒ6dƒ5qƒ4ƒ3 ƒ2ƒ1ƒ0ƒ/Hƒ.ƒ-Eƒ,&ƒ+#ƒ* ƒ)ƒ(ƒ'ƒ&ƒ%ƒ$ƒ#ƒ"ƒ!Hƒ ƒEƒ&ƒ#ƒ ƒƒƒƒƒƒƒ"ƒƒƒƒƒƒHƒƒ
Eƒ&ƒ#ƒ
 ƒ       ƒƒƒƒƒ*ƒƒƒ‚
‚~‚}‚|‚{'‚z"‚y‚x‚w‚v‚u‚tH‚s‚rE‚q&‚p#‚o ‚n‚m‚l‚k‚j‚i‚h‚g‚f
‚e‚d*‚c‚b‚a‚`

T±öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* 
ø
î
ä
Ú
Ð
Æ
¼
²
¨
ž
”
Š
€
v
l
b
X
N
D
:
0
&

þôêàÖÌÂ¸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndYND:0&
þ
ô
ê
à
Ö
Ì
Â
¸
®
¤
š

†
{
p
f
\
R
H
>
4
*
 


       ø       î       ä       Ú       Ð       Æ       ¼       ²       ¨       ž       ”       Š       €       v       l       b       X       N       D       :       0       &                   øîäÚÐƼ²¨ž”Š€vkaWMC9/%ýóéßÕËÁ·-£™…{qg]SI?5+!
ùïåÛÑǽ³©Ÿ•‹wmcYOE;1'  ÿõëá×Íù¯¥›‘‡}si_UKA7-#ûñçÝÓÉ¿µ«¡—ƒyoe[QG=3)÷íãÙÏÅ»±ˆˆˆˆ#ˆˆˆˆ$‡       ‡~$‡}‡|‡{‡z‡y‡x‡w‡v‡u‡t‡s‡r
‡q‡p‡o‡n‡m‡l‡k‡j‡i‡h‡g‡f‡e‡d
‡c‡b‡a‡`‡_‡^‡]‡\‡[‡Z
‡Y‡X‡W‡V‡U‡T‡S‡R‡Q‡P‡O‡N‡M‡L‡K
‡J‡I‡H‡G‡F‡E‡D‡C‡B‡A
‡@‡?‡>‡=‡<‡;‡:‡9‡8‡7‡6‡5‡4‡3‡2‡1
‡0‡/‡.‡-‡,‡+‡*‡)‡(‡'
‡&‡%‡$‡#‡"‡!‡ ‡‡‡‡‡‡‡‡‡‡‡#‡‡‡‡
‡‡
‡‡
\‡1‡‡
‡       -‡‡‡6‡‡
‡‡‡††~†}†|†{#†z†y†x†w
†v†u
†t†s\†r1†q†p†o-†n†m†l†k6†j†i
†h†g†f&†e    †d†c†b†a †`†_†^†]†\!†["†Z†Y †X†W7†V"†U†T†S†R†Q†Pe†O†N†M{†L&†Ki†JW†I
†H†G†F†E#†D†C†B†A   †@G†?h†>†=†<†;†:†9†8†7
†6†5†4†3†2†1†0
†/        †.†-     †,†+     †*G†)h†(†'†&†%†$†#†"†!
† ††††††††%††††%†-†V†††††
†††
†       †        ††††*†††&……~…}
…|…{…zv…y(…x…w…v…u'…t/…s*…r…q…p&…o…n…m
…l…k…jv…i(…h…g…f…e
…d…c>…b'…a/…`*…_…^…]&…\…[…Z
…Y…X…Wv…V(…U…T…S…R…Q…P…O…N…M
…L…K>…J'…I/…H*…G…F…E&…D…C…B
…A…@…?v…>(…=…<…;…:…9…8?…7…6
…5…4
T¸öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* 
ø
î
ä
Ú
Ð
Æ
¼
²
¨
ž
”
Š
€
v
l
b
X
N
D
:
0
&

þôêàÖÌÂ¸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(

ö
ì
â
Ø
Î
Ä
º
°
¦
œ
’
ˆ
~
t
j
`
V
L
B
8
.
$


       ü       ò       è       Þ       Ô       Ê       À       ¶       ¬       ¢       ˜       Ž       „       z       p       f       \       R       H       >       4       *                            þôêàÖ̸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(
öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* øîäÚÐƼ²¨ž”Š€vlbXND:0&þôêàÖ̸Š[
ŠZŠYŠXŠWŠVŠU
ŠTŠSŠRŠQ
ŠPŠOŠNŠM%ŠL$ŠK(ŠJ"ŠIŠH+ŠGŠFŠEŠD$ŠCŠB,ŠAŠ@Š?Š>
Š=Š<Š;Š:Š9Š8
Š7Š6Š5Š4
Š3Š2Š1Š0%Š/$Š.(Š-"Š,Š++Š*Š)Š(Š'Š&$Š%Š$,Š#Š"Š!Š Š9Š Š!ŠŠŠŠŠŠŠŠŠŠŠ8ŠŠŠŠŠ
 ŠŠŠ
Š       ŠŠŠŠŠŠŠŠ‰‰~‰}‰|‰{‰z‰y‰x8‰w‰v‰u‰t‰s    ‰r‰q‰p‰o‰n‰m‰l‰k‰j‰i‰h‰g‰f‰e‰d‰c‰b‰a‰`‰_‰^‰]‰\‰[‰Z‰Y‰X‰W8‰V‰U‰T‰S‰R  ‰Q‰P‰O‰N‰M‰L‰K‰J‰I‰H‰G‰F‰E‰D‰C‰B‰A‰@‰?‰>‰=‰<‰;‰:‰9‰8#‰7     ‰6‰5
‰4‰3‰2‰1‰0‰/‰.(‰-‰,‰+‰*‰)‰(‰'‰&‰%#‰$ ‰#‰"
‰!‰ ‰‰‰‰‰‰‰‰‰(‰‰‰‰‰‰‰‰‰#‰
 ‰‰
‰
‰       ‰‰
‰*‰‰‰
‰       ‰ˆˆ~ˆ}ˆ|ˆ{ˆzˆyˆxˆwˆvˆuˆt#ˆs
ˆr*ˆqˆpˆo
ˆn       ˆmˆlˆkˆjˆiˆhˆgˆfˆeˆdˆcˆbˆa#ˆ`5ˆ_$ˆ^'ˆ]#ˆ\
ˆ[*ˆZˆYˆX
ˆW       ˆVˆUˆTˆSˆRˆQˆPˆOˆNˆMˆLˆKˆJˆIˆH*ˆG
ˆF!ˆEˆDˆCˆBˆA     ˆ@
ˆ?ˆ>   ˆ=ˆ<ˆ;)ˆ:ˆ9.ˆ8ˆ7ˆ6ˆ5ˆ4ˆ3ˆ2ˆ1ˆ0ˆ/ˆ.ˆ-#ˆ,ˆ+ˆ*ˆ)$ˆ( ˆ'$ˆ&ˆ%ˆ$ˆ#ˆ"ˆ!ˆ ˆˆˆˆˆˆˆ#ˆˆˆˆ$ˆ     ˆ$ˆˆˆˆˆˆ
ˆˆˆ
ˆ       
T¸öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* 
ø
î
ä
Ú
Ð
Æ
¼
²
¨
ž
”
Š
€
v
l
b
X
N
D
:
0
&

þôêàÖÌÂ¸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(

ö
ì
â
Ø
Î
Ä
º
°
¦
œ
’
ˆ
~
t
j
`
V
L
B
8
.
$


       ü       ò       è       Þ       Ô       Ê       À       ¶       ¬       ¢       ˜       Ž       „       z       p       f       \       R       H       >       4       *                            þôêàÖ̸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(
öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* øîäÚÐƼ²¨ž”Š€vlbXND:0&þôêàÖ̸/       .-,+*)('.&
%$#"!      



         
ŒŒ~0Œ}Œ|Œ{     ŒzŒyŒxŒwŒvŒu
ŒtŒsŒrŒqŒpŒoŒnŒmŒlŒkBŒj&ŒiŒhŒgŒfŒeŒdŒc     ŒbŒa     Œ`       Œ_Œ^Œ]Œ\Œ[ŒZŒYŒXŒWŒVŒUŒTŒSBŒR&ŒQŒPŒOŒNŒMŒLŒK        ŒJŒI     ŒH       ŒGŒFŒEŒDŒCŒBŒAŒ@Œ?Œ>Œ=Œ<Œ;Œ:Œ9Œ8Œ7Œ6Œ5Œ4Œ3Œ2Œ1Œ0Œ/Œ.Œ-Œ,Œ+Œ*Œ)Œ(Œ'Œ&Œ%Œ$Œ#Œ"Œ!Œ ŒŒŒŒŒŒ"ŒŒŒŒŒŒŒŒŒŒŒŒŒ
ŒŒŒ
Œ       ŒŒŒŒ"ŒŒŒŒ‹‹~‹}‹|‹{‹z‹y‹x‹w‹v‹u‹t‹s‹r‹q‹p‹o‹n‹m‹l‹k&‹j‹i‹h‹g  ‹f‹e‹d‹c‹b.‹a‹`‹_‹^‹]‹\‹[‹Z
‹Y‹X‹W‹V‹U‹T‹S‹R&‹Q‹P‹O‹N        ‹M‹L‹K‹J‹I.‹H‹G‹F‹E‹D‹C‹B‹A
‹@‹?‹>‹=‹<       ‹;‹:‹9‹8‹7‹6‹5&‹4‹3‹2‹1   ‹0‹/‹.‹-‹,.‹+‹*‹)‹(‹'‹&‹%‹$
‹#‹"‹!‹ ‹‹
‹‹‹‹‹‹‹‹‹‹‹
‹‹&‹‹‹‹
‹
‹‹

‹       
‹‹
‹‹‹‹‹‹ŠŠ~Š}Š|Š{
ŠzŠy&ŠxŠwŠvŠuŠt
ŠsŠrŠqŠpŠoŠn
ŠmŠlŠkŠj
ŠiŠhŠgŠf%Še$Šd(Šc"ŠbŠa+Š`Š_Š^Š]Š\
T¸öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* 
ø
î
ä
Ú
Ð
Æ
¼
²
¨
ž
”
Š
€
v
l
b
X
N
D
:
0
&

þôêàÖÌÂ¸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(

ö
ì
â
Ø
Î
Ä
º
°
¦
œ
’
ˆ
~
t
j
`
V
L
B
8
.
$


       ü       ò       è       Þ       Ô       Ê       À       ¶       ¬       ¢       ˜       Ž       „       z       p       f       \       R       H       >       4       *                            þôêàÖ̸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(
öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* øîäÚÐƼ²¨ž”Š€vlbXND:0&þôêàÖ̸
~}
|{zyx%wv%ut&srqponmlkjihgfe
dcba`_^]'\
[Z     YXWVUTSRQP0ONMLKJI
HGFE D       CB6A@?>=<
;:
98
765&43
210/$.-,+*)%('&&%$#"! %&

       %ŽŽ~&Ž}Ž|Ž{ŽzŽyŽxŽwŽvŽuŽtŽsŽrŽqŽpŽoŽnŽmŽlŽkŽj%ŽiŽh&ŽgŽfŽeŽdŽcŽbŽaŽ`Ž_Ž^Ž]Ž\Ž[ŽZŽY%ŽX&ŽWŽV
ŽUŽTŽSŽRŽQ
ŽPŽOŽNŽMŽL!ŽKŽJ
ŽIŽHŽGŽFŽEŽDŽCŽBŽAŽ@Ž?Ž>Ž='Ž<"Ž;
Ž:Ž9Ž85Ž7Ž6
Ž5Ž4Ž3Ž2
Ž1Ž0Ž/
Ž.
Ž-Ž,Ž+Ž*Ž)Ž(3Ž'Ž&Ž%/Ž$Ž#Ž"Ž!Ž ŽŽŽŽ Ž!Ž8ŽŽŽŽŽŽŽŽŽ#ŽŽŽ.Ž
ŽŽ(Ž
/Ž       Ž
ŽŽŽŽŽŽŽ~+}|{    zyxwvuts.r
qponm0lkjihgf+edc     ba`_^]\[.Z
YXWVUT0SRQPONM+LKJ   IHGFEDCB.A
@?>=<;:908765432+10
T¸öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* 
ø
î
ä
Ú
Ð
Æ
¼
²
¨
ž
”
Š
€
v
l
b
X
N
D
:
0
&

þôêàÖÌÂ¸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(

ö
ì
â
Ø
Î
Ä
º
°
¦
œ
’
ˆ
~
t
j
`
V
L
B
8
.
$


       ü       ò       è       Þ       Ô       Ê       À       ¶       ¬       ¢       ˜       Ž       „       z       p       f       \       R       H       >       4       *                            þôêàÖ̸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(
öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* øîäÚÐƼ²¨ž”Š€vlbXND:0&þôêàÖ̸’W%’V’U’T’S’R’Q’P’O’N’M’L’K’J
’I’H’G’F’E’D’C’B’A
’@’?’>
’=
’<’;’:’9’8’7’6!’5’4’3’2’1’0
’/’.’-’,
’+     ’*"’)’(’'’&’%’$"’#’"’!’ 
’’’’’’’’’’’’’’4’’’ ’’
’’’
’       ’        ’
’’’’’$’‘
‘~       ‘}‘|
‘{
‘z‘y‘x‘w‘v‘u‘t   ‘s‘r‘q‘p‘o‘n‘m‘l‘k‘j!‘i
‘h
‘g‘f‘e‘d‘c‘b‘a‘`
‘_‘^‘]‘\‘[‘Z‘Y‘X‘W3‘V‘U‘T‘S‘R‘Q‘P‘O‘N‘M
‘L‘K
‘J‘I‘H‘G‘F‘E‘D‘C‘B‘A‘@‘?‘>‘=‘<‘;‘:%‘9‘8‘7!‘6‘5‘4‘3‘2‘1"‘0‘/‘.‘-‘,     ‘+‘*‘)‘(‘'‘&‘%
‘$‘#       ‘"‘!‘ ‘ ‘‘     ‘‘     ‘‘‘‘
‘‘‘‘‘"‘‘‘‘"‘
‘‘‘
‘   ‘‘‘‘‘‘
‘‘ ~}| {z     yx     wvut6s
rqpon"mlkj"ihgfe dcba`_^
]\       [ZYX WV     UT     SRQPONM*L
KJIH(GF     ED"CB
A-@#?\>=<;:9$876543%21%0/&.-,+*)('&%$#"! 
%%&

       
T¸öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* 
ø
î
ä
Ú
Ð
Æ
¼
²
¨
ž
”
Š
€
v
l
b
X
N
D
:
0
&

þôêàÖÌÂ¸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(

ö
ì
â
Ø
Î
Ä
º
°
¦
œ
’
ˆ
~
t
j
`
V
L
B
8
.
$


       ü       ò       è       Þ       Ô       Ê       À       ¶       ¬       ¢       ˜       Ž       „       z       p       f       \       R       H       >       4       *                            þôêàÖ̸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(
öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* øîäÚÐƼ²¨ž”Š€vlbXND:0&þôêàÖ̸•+
•*]•) •(•'#•&•%•$•#•"•!• •••••••
•••
•••••••••
•••
•       
•        ••+•&•••     •”     ”~”}”|
”{”z”y”x”w”v!”u”t”s”r
”q
”p”o”n”m”l”k”j
”i”h”g”f”e”d”c”b.”a”`”_”^
”]”\”[”Z”Y”X”W”V
”U”T”S”R”Q
”P”O”N”M”L”K”J”I”H”G.”F2”E”D”C”B     ”A”@”?”>
”=”<”;”:”9
”8”7”6”5”4”3”2”1”0”/
”.     ”-”,”+
”*
”)”(”'
”& ”%”$”#”"
”!” ”””
””””””””&”>””,”””””
”       ””
”       ”
””””
”””““~“}“|“{“z“y“x“w“v“u“t“s“r“q“p“o“n“m“l“k
“j(“i“h
“g“f“e “d“c“b“a“`“_
“^“]“\
“[       “Z“Y“X
“W“V“U“T“S“R“Q“P “O$“N“M“L“K“J“I“H“G
“F“E“D“C“B“A
“@&“?“>“=“<“;“:“9
“8“7“6
“5“4“3“2“1
“0“/“.“-“,“+“*“)“(“'“&
“%“$“#i“"“!“ ““““““““““““       “)““““““
“““
“ ““““““*““’’~’}    ’|+’{’z   ’y’x’w’v’u’t’s’r’q’p’o’n’m’l+’k’j ’i’h’g’f’e’d’c’b
’a’`
’_’^’]’\#’[’Z
’Y’X
ð öìâØÎĺ°¦œ’ˆ~tj`VLB8.$üòèÞÔÊÀ¶¬¢˜Ž„zpf\RH>4* 
ø
î
ä
Ú
Ð
Æ
¼
²
¨
ž
”
Š
€
v
l
b
X
N
D
:
0
&

þôêàÖÌÂ¸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª –Œ‚xndZPF<2(

ö
ì
â
Ø
Î
Ä
º
°
¦
œ
’
ˆ
~
t
j
`
V
L
B
8
.
$


       ü       ò       è       Þ       Ô       Ê       À       ¶       ¬       ¢       ˜       Ž       „       z       p       f       \       R       H       >       4       *                            þôêàÖ̸®¤š†|rh^TJ@6,"úðæÜÒȾ´ª ————————
——————
—
———
—         ——————
—
—––~–}
–|–{–z–y–x–w–v –u–t–s–r–q
–p–o–n–m
–l–k–j–i–h–g–f–e–d–c–b–a–`–_–^–]–\–[ –Z–Y–X–W–V–U"–T–S–R–Q–P–O–N–M
–L
–K–J&–I–H–G–F–E–D–C–B–A–@–?–>–=–<–;–:–9–8–7
–6–5–4–3"–2–1–0–/–.–-–,–+–*–)–(–'–&–%       –$–#–"–! – ––––       –       –––   ––––'–––––       ––
–––
–       –––
–––––
••~•}•|•{•z•y•x•w
•v       •u•t
•s•r
•q•p•o•n•m   •l•k•j•i•h   •g•f•e•d•c•b•a•`•_•^
•]•\•[•Z•Y
•X•W
•V•U
•T
•S
•R•Q   •P•O•N   •M•L•KD•J•I•H•G•F•E•D•C•B
•A
•@•?•>,•=•<
•;       •:
•9•8•7•6•5•4•3
•2•1       •0•/•.•-•,

Generated by dwww version 1.15 on Wed Jun 26 02:57:55 CEST 2024.